@@ -13,7 +13,7 @@ + (instancetype)bridgeForWebView:(WebView *)webView handler:(WVJBHandler)handler
1313}
1414
1515+ (instancetype )bridgeForWebView : (WebView *)webView webViewDelegate : (id )webViewDelegate handler : (WVJBHandler)messageHandler {
16- WebViewJavascriptBridge* bridge = [[WebViewJavascriptBridge alloc ] init ];
16+ WebViewJavascriptBridge* bridge = [[[ self class ] alloc ] init ];
1717 bridge.messageHandler = messageHandler;
1818 bridge.webView = webView;
1919 bridge.webViewDelegate = webViewDelegate;
@@ -27,16 +27,23 @@ + (instancetype)bridgeForWebView:(WebView *)webView webViewDelegate:(id)webViewD
2727 return bridge;
2828}
2929
30+ - (void )dealloc ;
31+ {
32+ self.webView .frameLoadDelegate = nil ;
33+ self.webView .resourceLoadDelegate = nil ;
34+ self.webView .policyDelegate = nil ;
35+ }
36+
3037- (void )webView : (WebView *)webView didFinishLoadForFrame : (WebFrame *)frame
3138{
3239 if (webView != self.webView ) { return ; }
3340
3441 self.numRequestsLoading --;
3542
36- if (self.numRequestsLoading == 0 && ![[self . webView stringByEvaluatingJavaScriptFromString: @" typeof WebViewJavascriptBridge == 'object'" ] isEqualToString: @" true" ]) {
43+ if (self.numRequestsLoading == 0 && ![[webView stringByEvaluatingJavaScriptFromString: @" typeof WebViewJavascriptBridge == 'object'" ] isEqualToString: @" true" ]) {
3744 NSString *filePath = [[NSBundle mainBundle ] pathForResource: @" WebViewJavascriptBridge.js" ofType: @" txt" ];
3845 NSString *js = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil ];
39- [self . webView stringByEvaluatingJavaScriptFromString: js];
46+ [webView stringByEvaluatingJavaScriptFromString: js];
4047 }
4148
4249 if (self.startupMessageQueue ) {
@@ -46,8 +53,9 @@ - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame
4653 self.startupMessageQueue = nil ;
4754 }
4855
49- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:didFinishLoadForFrame: )]) {
50- [self .webViewDelegate webView: webView didFinishLoadForFrame: frame];
56+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
57+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:didFinishLoadForFrame: )]) {
58+ [strongDelegate webView: webView didFinishLoadForFrame: frame];
5159 }
5260}
5361
@@ -56,34 +64,37 @@ - (void)webView:(WebView *)webView didFailLoadWithError:(NSError *)error forFram
5664
5765 self.numRequestsLoading --;
5866
59- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:didFailLoadWithError:forFrame: )]) {
60- [self .webViewDelegate webView: self .webView didFailLoadWithError: error forFrame: frame];
67+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
68+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:didFailLoadWithError:forFrame: )]) {
69+ [strongDelegate webView: strongDelegate didFailLoadWithError: error forFrame: frame];
6170 }
6271}
6372
6473- (void )webView : (WebView *)webView decidePolicyForNavigationAction : (NSDictionary *)actionInformation request : (NSURLRequest *)request frame : (WebFrame *)frame decisionListener : (id <WebPolicyDecisionListener >)listener
6574{
6675 if (webView != self.webView ) { [listener use ]; }
6776 NSURL *url = [request URL ];
77+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
6878 if ([[url scheme ] isEqualToString: kCustomProtocolScheme ]) {
6979 if ([[url host ] isEqualToString: kQueueHasMessage ]) {
7080 [self _flushMessageQueue ];
7181 } else {
7282 NSLog (@" WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@ ://%@ " , kCustomProtocolScheme , [url path ]);
7383 }
7484 [listener ignore ];
75- } else if ([self . webView resourceLoadDelegate ]
76- && [self .webViewDelegate respondsToSelector: @selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener: )]) {
77- [self .webViewDelegate webView: webView decidePolicyForNavigationAction: actionInformation request: request frame: frame decisionListener: listener];
85+ } else if ([webView resourceLoadDelegate ]
86+ && [strongDelegate respondsToSelector: @selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener: )]) {
87+ [strongDelegate webView: webView decidePolicyForNavigationAction: actionInformation request: request frame: frame decisionListener: listener];
7888 } else {
7989 [listener use ];
8090 }
8191}
8292
8393- (void )webView : (WebView *)webView didCommitLoadForFrame : (WebFrame *)frame {
8494 if (webView != self.webView ) { return ; }
85- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:didCommitLoadForFrame: )]) {
86- [self .webViewDelegate webView: webView didCommitLoadForFrame: frame];
95+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
96+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:didCommitLoadForFrame: )]) {
97+ [strongDelegate webView: webView didCommitLoadForFrame: frame];
8798 }
8899}
89100
@@ -92,8 +103,9 @@ - (NSURLRequest *)webView:(WebView *)webView resource:(id)identifier willSendReq
92103
93104 self.numRequestsLoading ++;
94105
95- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:resource:willSendRequest:redirectResponse:fromDataSource: )]) {
96- return [self .webViewDelegate webView: webView resource: identifier willSendRequest: request redirectResponse: redirectResponse fromDataSource: dataSource];
106+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
107+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:resource:willSendRequest:redirectResponse:fromDataSource: )]) {
108+ return [strongDelegate webView: webView resource: identifier willSendRequest: request redirectResponse: redirectResponse fromDataSource: dataSource];
97109 }
98110
99111 return request;
0 commit comments