From 343355f47b46276dfe6aab91e97a06e48358cfa1 Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 23 Apr 2015 10:50:31 -0400 Subject: [PATCH 1/8] The Javascript source string constant is now always built into the .m file. --- .../ExampleApp-OSX.xcodeproj/project.pbxproj | 8 +- .../ExampleApp-iOS.xcodeproj/project.pbxproj | 8 +- .../WebViewJavascriptBridge.h | 2 +- .../WebViewJavascriptBridge.js.h | 124 ++++++++++++++++++ .../WebViewJavascriptBridge.js.txt | 117 ----------------- .../WebViewJavascriptBridge.m | 33 ++--- 6 files changed, 146 insertions(+), 146 deletions(-) create mode 100644 WebViewJavascriptBridge/WebViewJavascriptBridge.js.h delete mode 100644 WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt diff --git a/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj b/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj index 0e947166..d35d1ee7 100644 --- a/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj +++ b/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj @@ -14,7 +14,7 @@ 2C136A3817641106004C7401 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C136A3717641106004C7401 /* AppDelegate.m */; }; 2C136A4217641236004C7401 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C136A4117641236004C7401 /* WebKit.framework */; }; 2C136A5A17642704004C7401 /* ExampleApp.html in Resources */ = {isa = PBXBuildFile; fileRef = 2C136A5917642704004C7401 /* ExampleApp.html */; }; - 2C1562C5176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.txt in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.txt */; }; + 2C1562C5176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h */; }; 2C1562C6176BA9FF00B4AE50 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C1562C4176BA9FF00B4AE50 /* WebViewJavascriptBridge.m */; }; 2CF17F5317D8AACF006E828B /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2CF17F5217D8AACF006E828B /* MainMenu.xib */; }; /* End PBXBuildFile section */ @@ -35,7 +35,7 @@ 2C136A4117641236004C7401 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 2C136A5917642704004C7401 /* ExampleApp.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = ExampleApp.html; sourceTree = SOURCE_ROOT; }; 2C1562C2176BA9FF00B4AE50 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; - 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebViewJavascriptBridge.js.txt; sourceTree = ""; }; + 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.js.h; sourceTree = ""; }; 2C1562C4176BA9FF00B4AE50 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; 2CF17F5217D8AACF006E828B /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; /* End PBXFileReference section */ @@ -119,7 +119,7 @@ isa = PBXGroup; children = ( 2C1562C2176BA9FF00B4AE50 /* WebViewJavascriptBridge.h */, - 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.txt */, + 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h */, 2C1562C4176BA9FF00B4AE50 /* WebViewJavascriptBridge.m */, ); name = WebViewJavascriptBridge; @@ -177,7 +177,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C1562C5176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.txt in Resources */, + 2C1562C5176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h in Resources */, 2C136A2F17641106004C7401 /* InfoPlist.strings in Resources */, 2C136A3517641106004C7401 /* Credits.rtf in Resources */, 2C136A5A17642704004C7401 /* ExampleApp.html in Resources */, diff --git a/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj b/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj index 4834adaf..1e33172d 100644 --- a/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj +++ b/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt */; }; + 2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h */; }; 2C1562C0176BA63500B4AE50 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */; }; 2C45CA2C1884AD520002A4E2 /* ExampleAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */; }; 2CA045BF17117439006DEE8B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2CA045B717117439006DEE8B /* InfoPlist.strings */; }; @@ -23,7 +23,7 @@ /* Begin PBXFileReference section */ 2C1562A8176B9F6200B4AE50 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; - 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebViewJavascriptBridge.js.txt; sourceTree = ""; }; + 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.js.h; sourceTree = ""; }; 2C45CA2A1884AD520002A4E2 /* ExampleAppViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExampleAppViewController.h; sourceTree = ""; }; 2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExampleAppViewController.m; sourceTree = ""; }; 2CA045B817117439006DEE8B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -57,7 +57,7 @@ 2C1562A7176B9F5400B4AE50 /* WebViewJavascriptBridge */ = { isa = PBXGroup; children = ( - 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt */, + 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h */, 2C1562A8176B9F6200B4AE50 /* WebViewJavascriptBridge.h */, 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */, ); @@ -169,7 +169,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt in Resources */, + 2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h in Resources */, 2CA045BF17117439006DEE8B /* InfoPlist.strings in Resources */, 2CA0465C1711AC8E006DEE8B /* ExampleApp.html in Resources */, 2CAB869B1727684300BD9ED1 /* Default-568h@2x.png in Resources */, diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/WebViewJavascriptBridge/WebViewJavascriptBridge.h index 9e90829f..a80c2b14 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.h +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.h @@ -30,7 +30,6 @@ typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback); + (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView handler:(WVJBHandler)handler; + (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)handler; -+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)handler resourceBundle:(NSBundle*)bundle; + (void)enableLogging; - (void)send:(id)message; @@ -40,4 +39,5 @@ typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback); - (void)callHandler:(NSString*)handlerName data:(id)data; - (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback; ++ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)handler resourceBundle:(NSBundle*)bundle __attribute__((deprecated)); @end diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h new file mode 100644 index 00000000..0cfad707 --- /dev/null +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h @@ -0,0 +1,124 @@ +#ifdef _______STRINGIFY +#error _______STRINGIFY already defined! +#endif +#define _______STRINGIFY(x) #x +_______STRINGIFY( +;(function() { + if (window.WebViewJavascriptBridge) { return; } + var messagingIframe; + var sendMessageQueue = []; + var receiveMessageQueue = []; + var messageHandlers = {}; + + var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme'; + var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__'; + + var responseCallbacks = {}; + var uniqueId = 1; + + function _createQueueReadyIframe(doc) { + messagingIframe = doc.createElement('iframe'); + messagingIframe.style.display = 'none'; + messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE; + doc.documentElement.appendChild(messagingIframe); + } + + function init(messageHandler) { + if (WebViewJavascriptBridge._messageHandler) { throw new Error('WebViewJavascriptBridge.init called twice'); } + WebViewJavascriptBridge._messageHandler = messageHandler; + var receivedMessages = receiveMessageQueue; + receiveMessageQueue = null; + for (var i=0; i)webViewDelegate handler:(WVJBHandler)messageHandler resourceBundle:(NSBundle*)bundle{ +- (void) _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(id)webViewDelegate handler:(WVJBHandler)messageHandler{ _messageHandler = messageHandler; _webView = webView; _webViewDelegate = webViewDelegate; _messageHandlers = [NSMutableDictionary dictionary]; _webView.delegate = self; - _resourceBundle = bundle; } - (void) _platformSpecificDealloc { @@ -343,10 +339,7 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView { _numRequestsLoading--; if (_numRequestsLoading == 0 && ![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) { - NSBundle *bundle = _resourceBundle ? _resourceBundle : [NSBundle mainBundle]; - NSString *filePath = [bundle pathForResource:@"WebViewJavascriptBridge.js" ofType:@"txt"]; - NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; - [webView stringByEvaluatingJavaScriptFromString:js]; + NSLog(@"%@", [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]); } if (_startupMessageQueue) { From b3c4689aca1caf5de8ed165dbea86a9c8912c56b Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 23 Apr 2015 10:54:26 -0400 Subject: [PATCH 2/8] Added pragma to suppress warning. --- WebViewJavascriptBridge/WebViewJavascriptBridge.m | 1 + 1 file changed, 1 insertion(+) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/WebViewJavascriptBridge/WebViewJavascriptBridge.m index 32aac54f..e94a06af 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.m +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.m @@ -53,6 +53,7 @@ + (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WV + (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)messageHandler resourceBundle:(NSBundle*)_ { + #pragma unused(_) return [self bridgeForWebView:webView webViewDelegate:webViewDelegate handler:messageHandler]; } From 676f783b24f0416dfa83c8c3e9c65a5cf36cfe7c Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 23 Apr 2015 10:57:48 -0400 Subject: [PATCH 3/8] Fixed tabbing. --- .../WebViewJavascriptBridge.js.h | 122 +++++++++--------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h index 0cfad707..8efffafe 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h @@ -9,108 +9,108 @@ _______STRINGIFY( var sendMessageQueue = []; var receiveMessageQueue = []; var messageHandlers = {}; - - var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme'; - var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__'; - + + var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme'; + var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__'; + var responseCallbacks = {}; var uniqueId = 1; - - function _createQueueReadyIframe(doc) { + + function _createQueueReadyIframe(doc) { messagingIframe = doc.createElement('iframe'); - messagingIframe.style.display = 'none'; + messagingIframe.style.display = 'none'; messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE; doc.documentElement.appendChild(messagingIframe); - } + } - function init(messageHandler) { + function init(messageHandler) { if (WebViewJavascriptBridge._messageHandler) { throw new Error('WebViewJavascriptBridge.init called twice'); } WebViewJavascriptBridge._messageHandler = messageHandler; var receivedMessages = receiveMessageQueue; receiveMessageQueue = null; - for (var i=0; i Date: Thu, 23 Apr 2015 11:33:36 -0400 Subject: [PATCH 4/8] Removed accidental logs --- WebViewJavascriptBridge/WebViewJavascriptBridge.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/WebViewJavascriptBridge/WebViewJavascriptBridge.m index e94a06af..927203d4 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.m +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.m @@ -256,7 +256,7 @@ - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame if (webView != _webView) { return; } if (![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) { - NSLog(@"%@", [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]); + [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]; } if (_startupMessageQueue) { @@ -340,7 +340,7 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView { _numRequestsLoading--; if (_numRequestsLoading == 0 && ![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) { - NSLog(@"%@", [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]); + [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]; } if (_startupMessageQueue) { From 09e8e28a090647f07254e672f81cdf2695ac9fb8 Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 23 Apr 2015 11:33:56 -0400 Subject: [PATCH 5/8] Added note about the importance of ending lines with semicolons. --- WebViewJavascriptBridge/WebViewJavascriptBridge.js.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h index 8efffafe..63594a28 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h @@ -1,6 +1,9 @@ #ifdef _______STRINGIFY #error _______STRINGIFY already defined! #endif + +// The preprocessor will remove line-endings so you MUST use semi-colons to denote the end of a line. + #define _______STRINGIFY(x) #x _______STRINGIFY( ;(function() { From e57ae96b5a6be7e19aef3ab4f288ebb5a334e7e4 Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 23 Apr 2015 14:26:22 -0400 Subject: [PATCH 6/8] Removed resource from pod spec. Made private header more explicit. --- WebViewJavascriptBridge.podspec | 2 +- .../{ => Private}/WebViewJavascriptBridge.js.h | 0 WebViewJavascriptBridge/WebViewJavascriptBridge.m | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename WebViewJavascriptBridge/{ => Private}/WebViewJavascriptBridge.js.h (100%) diff --git a/WebViewJavascriptBridge.podspec b/WebViewJavascriptBridge.podspec index fbb16a8b..2c1d962f 100644 --- a/WebViewJavascriptBridge.podspec +++ b/WebViewJavascriptBridge.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.osx.platform = :osx s.ios.source_files = 'WebViewJavascriptBridge/*.{h,m}' s.osx.source_files = 'WebViewJavascriptBridge/*.{h,m}' - s.resource = 'WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt' + s.private_header_files = "WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h" s.ios.framework = 'UIKit' s.osx.framework = 'WebKit' end diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.h b/WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h similarity index 100% rename from WebViewJavascriptBridge/WebViewJavascriptBridge.js.h rename to WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/WebViewJavascriptBridge/WebViewJavascriptBridge.m index 927203d4..167b66d2 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.m +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.m @@ -9,7 +9,7 @@ #import "WebViewJavascriptBridge.h" static NSString * WebViewJavascriptBridge_js = @ -#include "WebViewJavascriptBridge.js.h" +#include "Private/WebViewJavascriptBridge.js.h" ; #if __has_feature(objc_arc_weak) From d3341c7b931b01ea385f992fd54266004deb838f Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 23 Apr 2015 15:09:20 -0400 Subject: [PATCH 7/8] Tightened up the Javascript Source String Generation. --- .../ExampleApp-OSX.xcodeproj/project.pbxproj | 10 +++++---- .../ExampleApp-iOS.xcodeproj/project.pbxproj | 10 +++++---- WebViewJavascriptBridge.podspec | 2 +- .../WebViewJavascriptBridge.m | 9 +++----- .../WebViewJavascriptBridge_Private.h | 3 +++ ...js.h => WebViewJavascriptBridge_Private.m} | 22 +++++++++++++------ 6 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 WebViewJavascriptBridge/WebViewJavascriptBridge_Private.h rename WebViewJavascriptBridge/{Private/WebViewJavascriptBridge.js.h => WebViewJavascriptBridge_Private.m} (93%) diff --git a/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj b/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj index d35d1ee7..c25aa4e6 100644 --- a/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj +++ b/Example Apps/ExampleApp-OSX.xcodeproj/project.pbxproj @@ -14,9 +14,9 @@ 2C136A3817641106004C7401 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C136A3717641106004C7401 /* AppDelegate.m */; }; 2C136A4217641236004C7401 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C136A4117641236004C7401 /* WebKit.framework */; }; 2C136A5A17642704004C7401 /* ExampleApp.html in Resources */ = {isa = PBXBuildFile; fileRef = 2C136A5917642704004C7401 /* ExampleApp.html */; }; - 2C1562C5176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h */; }; 2C1562C6176BA9FF00B4AE50 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C1562C4176BA9FF00B4AE50 /* WebViewJavascriptBridge.m */; }; 2CF17F5317D8AACF006E828B /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2CF17F5217D8AACF006E828B /* MainMenu.xib */; }; + AA9B44271AE979A800E48BA0 /* WebViewJavascriptBridge_Private.m in Sources */ = {isa = PBXBuildFile; fileRef = AA9B44261AE979A800E48BA0 /* WebViewJavascriptBridge_Private.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -35,9 +35,10 @@ 2C136A4117641236004C7401 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 2C136A5917642704004C7401 /* ExampleApp.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = ExampleApp.html; sourceTree = SOURCE_ROOT; }; 2C1562C2176BA9FF00B4AE50 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; - 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.js.h; sourceTree = ""; }; 2C1562C4176BA9FF00B4AE50 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; 2CF17F5217D8AACF006E828B /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; + AA9B44251AE979A800E48BA0 /* WebViewJavascriptBridge_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge_Private.h; sourceTree = ""; }; + AA9B44261AE979A800E48BA0 /* WebViewJavascriptBridge_Private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge_Private.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -119,8 +120,9 @@ isa = PBXGroup; children = ( 2C1562C2176BA9FF00B4AE50 /* WebViewJavascriptBridge.h */, - 2C1562C3176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h */, 2C1562C4176BA9FF00B4AE50 /* WebViewJavascriptBridge.m */, + AA9B44251AE979A800E48BA0 /* WebViewJavascriptBridge_Private.h */, + AA9B44261AE979A800E48BA0 /* WebViewJavascriptBridge_Private.m */, ); name = WebViewJavascriptBridge; path = ../../WebViewJavascriptBridge; @@ -177,7 +179,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C1562C5176BA9FF00B4AE50 /* WebViewJavascriptBridge.js.h in Resources */, 2C136A2F17641106004C7401 /* InfoPlist.strings in Resources */, 2C136A3517641106004C7401 /* Credits.rtf in Resources */, 2C136A5A17642704004C7401 /* ExampleApp.html in Resources */, @@ -193,6 +194,7 @@ buildActionMask = 2147483647; files = ( 2C136A3117641106004C7401 /* main.m in Sources */, + AA9B44271AE979A800E48BA0 /* WebViewJavascriptBridge_Private.m in Sources */, 2C1562C6176BA9FF00B4AE50 /* WebViewJavascriptBridge.m in Sources */, 2C136A3817641106004C7401 /* AppDelegate.m in Sources */, ); diff --git a/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj b/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj index 1e33172d..0bda1cb7 100644 --- a/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj +++ b/Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h */; }; 2C1562C0176BA63500B4AE50 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */; }; 2C45CA2C1884AD520002A4E2 /* ExampleAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */; }; 2CA045BF17117439006DEE8B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2CA045B717117439006DEE8B /* InfoPlist.strings */; }; @@ -18,12 +17,12 @@ 2CEB3EC01602563600548120 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CEB3EBF1602563600548120 /* UIKit.framework */; }; 2CEB3EC21602563600548120 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CEB3EC11602563600548120 /* Foundation.framework */; }; 2CEB3EC41602563600548120 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CEB3EC31602563600548120 /* CoreGraphics.framework */; }; + AA9B44241AE9761700E48BA0 /* WebViewJavascriptBridge_Private.m in Sources */ = {isa = PBXBuildFile; fileRef = AA9B44221AE9761700E48BA0 /* WebViewJavascriptBridge_Private.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 2C1562A8176B9F6200B4AE50 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; - 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.js.h; sourceTree = ""; }; 2C45CA2A1884AD520002A4E2 /* ExampleAppViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExampleAppViewController.h; sourceTree = ""; }; 2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExampleAppViewController.m; sourceTree = ""; }; 2CA045B817117439006DEE8B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -38,6 +37,8 @@ 2CEB3EBF1602563600548120 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 2CEB3EC11602563600548120 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 2CEB3EC31602563600548120 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + AA9B44221AE9761700E48BA0 /* WebViewJavascriptBridge_Private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge_Private.m; sourceTree = ""; }; + AA9B44231AE9761700E48BA0 /* WebViewJavascriptBridge_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge_Private.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -57,9 +58,10 @@ 2C1562A7176B9F5400B4AE50 /* WebViewJavascriptBridge */ = { isa = PBXGroup; children = ( - 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h */, 2C1562A8176B9F6200B4AE50 /* WebViewJavascriptBridge.h */, 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */, + AA9B44221AE9761700E48BA0 /* WebViewJavascriptBridge_Private.m */, + AA9B44231AE9761700E48BA0 /* WebViewJavascriptBridge_Private.h */, ); name = WebViewJavascriptBridge; path = ../../WebViewJavascriptBridge; @@ -169,7 +171,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.h in Resources */, 2CA045BF17117439006DEE8B /* InfoPlist.strings in Resources */, 2CA0465C1711AC8E006DEE8B /* ExampleApp.html in Resources */, 2CAB869B1727684300BD9ED1 /* Default-568h@2x.png in Resources */, @@ -183,6 +184,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + AA9B44241AE9761700E48BA0 /* WebViewJavascriptBridge_Private.m in Sources */, 2C1562C0176BA63500B4AE50 /* WebViewJavascriptBridge.m in Sources */, 2C45CA2C1884AD520002A4E2 /* ExampleAppViewController.m in Sources */, 2CA045C217117439006DEE8B /* ExampleAppDelegate.m in Sources */, diff --git a/WebViewJavascriptBridge.podspec b/WebViewJavascriptBridge.podspec index 2c1d962f..ec9f6650 100644 --- a/WebViewJavascriptBridge.podspec +++ b/WebViewJavascriptBridge.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.osx.platform = :osx s.ios.source_files = 'WebViewJavascriptBridge/*.{h,m}' s.osx.source_files = 'WebViewJavascriptBridge/*.{h,m}' - s.private_header_files = "WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h" + s.private_header_files = 'WebViewJavascriptBridge/*_Private.h' s.ios.framework = 'UIKit' s.osx.framework = 'WebKit' end diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/WebViewJavascriptBridge/WebViewJavascriptBridge.m index 167b66d2..1d864f3c 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.m +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.m @@ -7,10 +7,7 @@ // #import "WebViewJavascriptBridge.h" - -static NSString * WebViewJavascriptBridge_js = @ -#include "Private/WebViewJavascriptBridge.js.h" -; +#import "WebViewJavascriptBridge_Private.h" #if __has_feature(objc_arc_weak) #define WVJB_WEAK __weak @@ -256,7 +253,7 @@ - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame if (webView != _webView) { return; } if (![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) { - [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]; + [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js()]; } if (_startupMessageQueue) { @@ -340,7 +337,7 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView { _numRequestsLoading--; if (_numRequestsLoading == 0 && ![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) { - [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js]; + [webView stringByEvaluatingJavaScriptFromString:WebViewJavascriptBridge_js()]; } if (_startupMessageQueue) { diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.h b/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.h new file mode 100644 index 00000000..1d9577fd --- /dev/null +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.h @@ -0,0 +1,3 @@ +#import + +NSString * WebViewJavascriptBridge_js(); diff --git a/WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h b/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.m similarity index 93% rename from WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h rename to WebViewJavascriptBridge/WebViewJavascriptBridge_Private.m index 63594a28..3d84737d 100644 --- a/WebViewJavascriptBridge/Private/WebViewJavascriptBridge.js.h +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.m @@ -1,11 +1,14 @@ -#ifdef _______STRINGIFY -#error _______STRINGIFY already defined! -#endif + +#import "WebViewJavascriptBridge_Private.h" + +NSString * WebViewJavascriptBridge_js() { +// Create a unique preprocessor symbol that last only the duration of this function +#define __func__(x) #x // The preprocessor will remove line-endings so you MUST use semi-colons to denote the end of a line. + +static NSString * source = @__func__( -#define _______STRINGIFY(x) #x -_______STRINGIFY( ;(function() { if (window.WebViewJavascriptBridge) { return; } var messagingIframe; @@ -123,5 +126,10 @@ _______STRINGIFY( readyEvent.bridge = WebViewJavascriptBridge; doc.dispatchEvent(readyEvent); })(); -) -#undef _______STRINGIFY + +); + +#undef __func__ + + return source; +}; From 71649ae32ec60812f2e810bdf2ba584004fcbe86 Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Thu, 6 Aug 2015 09:04:22 -0400 Subject: [PATCH 8/8] Moved the Javascript implementation to a file ending in "_JS.(h/m). Added explanation to _JS.m file. --- WebViewJavascriptBridge.podspec | 2 +- WebViewJavascriptBridge/WebViewJavascriptBridge.m | 2 +- ...tBridge_Private.h => WebViewJavascriptBridge_JS.h} | 0 ...tBridge_Private.m => WebViewJavascriptBridge_JS.m} | 11 ++++++++++- 4 files changed, 12 insertions(+), 3 deletions(-) rename WebViewJavascriptBridge/{WebViewJavascriptBridge_Private.h => WebViewJavascriptBridge_JS.h} (100%) rename WebViewJavascriptBridge/{WebViewJavascriptBridge_Private.m => WebViewJavascriptBridge_JS.m} (86%) diff --git a/WebViewJavascriptBridge.podspec b/WebViewJavascriptBridge.podspec index ec9f6650..919c9c81 100644 --- a/WebViewJavascriptBridge.podspec +++ b/WebViewJavascriptBridge.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.osx.platform = :osx s.ios.source_files = 'WebViewJavascriptBridge/*.{h,m}' s.osx.source_files = 'WebViewJavascriptBridge/*.{h,m}' - s.private_header_files = 'WebViewJavascriptBridge/*_Private.h' + s.private_header_files = 'WebViewJavascriptBridge/*_JS.h' s.ios.framework = 'UIKit' s.osx.framework = 'WebKit' end diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.m b/WebViewJavascriptBridge/WebViewJavascriptBridge.m index 1d864f3c..4779eb3e 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.m +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.m @@ -7,7 +7,7 @@ // #import "WebViewJavascriptBridge.h" -#import "WebViewJavascriptBridge_Private.h" +#import "WebViewJavascriptBridge_JS.h" #if __has_feature(objc_arc_weak) #define WVJB_WEAK __weak diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.h b/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h similarity index 100% rename from WebViewJavascriptBridge/WebViewJavascriptBridge_Private.h rename to WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.m b/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m similarity index 86% rename from WebViewJavascriptBridge/WebViewJavascriptBridge_Private.m rename to WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m index 3d84737d..a3e1c733 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge_Private.m +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m @@ -1,5 +1,14 @@ +// This file contains the source for the Javascript side of the +// WebViewJavascriptBridge. It is plaintext, but converted to an NSString +// via some preprocessor tricks. +// +// Previous implementations of WebViewJavascriptBridge loaded the javascript source +// from a resource. This worked fine for app developers, but library developers who +// included the bridge into their library, awkwardly had to ask consumers of their +// library to include the resource, violating their encapsulation. By including the +// Javascript as a string resource, the encapsulation of the library is maintained. -#import "WebViewJavascriptBridge_Private.h" +#import "WebViewJavascriptBridge_JS.h" NSString * WebViewJavascriptBridge_js() { // Create a unique preprocessor symbol that last only the duration of this function