@@ -7,7 +7,7 @@ + (instancetype)bridgeForWebView:(WebView *)webView handler:(WVJBHandler)handler
77}
88
99+ (instancetype )bridgeForWebView : (WebView *)webView webViewDelegate : (id )webViewDelegate handler : (WVJBHandler)messageHandler {
10- WebViewJavascriptBridge* bridge = [[WebViewJavascriptBridge alloc ] init ];
10+ WebViewJavascriptBridge* bridge = [[[ self class ] alloc ] init ];
1111 bridge.messageHandler = messageHandler;
1212 bridge.webView = webView;
1313 bridge.webViewDelegate = webViewDelegate;
@@ -21,14 +21,21 @@ + (instancetype)bridgeForWebView:(WebView *)webView webViewDelegate:(id)webViewD
2121 return bridge;
2222}
2323
24+ - (void )dealloc ;
25+ {
26+ self.webView .frameLoadDelegate = nil ;
27+ self.webView .resourceLoadDelegate = nil ;
28+ self.webView .policyDelegate = nil ;
29+ }
30+
2431- (void )webView : (WebView *)webView didFinishLoadForFrame : (WebFrame *)frame
2532{
2633 if (webView != self.webView ) { return ; }
2734
28- if (![[self . webView stringByEvaluatingJavaScriptFromString: @" typeof WebViewJavascriptBridge == 'object'" ] isEqualToString: @" true" ]) {
35+ if (![[webView stringByEvaluatingJavaScriptFromString: @" typeof WebViewJavascriptBridge == 'object'" ] isEqualToString: @" true" ]) {
2936 NSString *filePath = [[NSBundle mainBundle ] pathForResource: @" WebViewJavascriptBridge.js" ofType: @" txt" ];
3037 NSString *js = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil ];
31- [self . webView stringByEvaluatingJavaScriptFromString: js];
38+ [webView stringByEvaluatingJavaScriptFromString: js];
3239 }
3340
3441 if (self.startupMessageQueue ) {
@@ -38,48 +45,53 @@ - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame
3845 self.startupMessageQueue = nil ;
3946 }
4047
41- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:didFinishLoadForFrame: )]) {
42- [self .webViewDelegate webView: webView didFinishLoadForFrame: frame];
48+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
49+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:didFinishLoadForFrame: )]) {
50+ [strongDelegate webView: webView didFinishLoadForFrame: frame];
4351 }
4452}
4553
4654- (void )webView : (WebView *)webView didFailLoadWithError : (NSError *)error forFrame : (WebFrame *)frame {
4755 if (webView != self.webView ) { return ; }
48- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:didFailLoadWithError:forFrame: )]) {
49- [self .webViewDelegate webView: self .webView didFailLoadWithError: error forFrame: frame];
56+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
57+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:didFailLoadWithError:forFrame: )]) {
58+ [strongDelegate webView: strongDelegate didFailLoadWithError: error forFrame: frame];
5059 }
5160}
5261
5362- (void )webView : (WebView *)webView decidePolicyForNavigationAction : (NSDictionary *)actionInformation request : (NSURLRequest *)request frame : (WebFrame *)frame decisionListener : (id <WebPolicyDecisionListener >)listener
5463{
5564 if (webView != self.webView ) { [listener use ]; }
5665 NSURL *url = [request URL ];
66+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
5767 if ([[url scheme ] isEqualToString: kCustomProtocolScheme ]) {
5868 if ([[url host ] isEqualToString: kQueueHasMessage ]) {
5969 [self _flushMessageQueue ];
6070 } else {
6171 NSLog (@" WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@ ://%@ " , kCustomProtocolScheme , [url path ]);
6272 }
6373 [listener ignore ];
64- } else if ([self . webView resourceLoadDelegate ]
65- && [self .webViewDelegate respondsToSelector: @selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener: )]) {
66- [self .webViewDelegate webView: webView decidePolicyForNavigationAction: actionInformation request: request frame: frame decisionListener: listener];
74+ } else if ([webView resourceLoadDelegate ]
75+ && [strongDelegate respondsToSelector: @selector (webView:decidePolicyForNavigationAction:request:frame:decisionListener: )]) {
76+ [strongDelegate webView: webView decidePolicyForNavigationAction: actionInformation request: request frame: frame decisionListener: listener];
6777 } else {
6878 [listener use ];
6979 }
7080}
7181
7282- (void )webView : (WebView *)webView didCommitLoadForFrame : (WebFrame *)frame {
7383 if (webView != self.webView ) { return ; }
74- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:didCommitLoadForFrame: )]) {
75- [self .webViewDelegate webView: webView didCommitLoadForFrame: frame];
84+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
85+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:didCommitLoadForFrame: )]) {
86+ [strongDelegate webView: webView didCommitLoadForFrame: frame];
7687 }
7788}
7889
7990- (NSURLRequest *)webView : (WebView *)webView resource : (id )identifier willSendRequest : (NSURLRequest *)request redirectResponse : (NSURLResponse *)redirectResponse fromDataSource : (WebDataSource *)dataSource {
8091 if (webView != self.webView ) { return request; }
81- if (self.webViewDelegate && [self .webViewDelegate respondsToSelector: @selector (webView:resource:willSendRequest:redirectResponse:fromDataSource: )]) {
82- return [self .webViewDelegate webView: webView resource: identifier willSendRequest: request redirectResponse: redirectResponse fromDataSource: dataSource];
92+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
93+ if (strongDelegate && [strongDelegate respondsToSelector: @selector (webView:resource:willSendRequest:redirectResponse:fromDataSource: )]) {
94+ return [strongDelegate webView: webView resource: identifier willSendRequest: request redirectResponse: redirectResponse fromDataSource: dataSource];
8395 }
8496
8597 return request;
0 commit comments