@@ -7,7 +7,7 @@ + (instancetype)bridgeForWebView:(WebView *)webView handler:(WVJBHandler)handler
7
7
}
8
8
9
9
+ (instancetype )bridgeForWebView : (WebView *)webView webViewDelegate : (id )webViewDelegate handler : (WVJBHandler)messageHandler {
10
- WebViewJavascriptBridge* bridge = [[WebViewJavascriptBridge alloc ] init ];
10
+ WebViewJavascriptBridge* bridge = [[[ self class ] alloc ] init ];
11
11
bridge.messageHandler = messageHandler;
12
12
bridge.webView = webView;
13
13
bridge.webViewDelegate = webViewDelegate;
@@ -21,14 +21,21 @@ + (instancetype)bridgeForWebView:(WebView *)webView webViewDelegate:(id)webViewD
21
21
return bridge;
22
22
}
23
23
24
+ - (void )dealloc ;
25
+ {
26
+ self.webView .frameLoadDelegate = nil ;
27
+ self.webView .resourceLoadDelegate = nil ;
28
+ self.webView .policyDelegate = nil ;
29
+ }
30
+
24
31
- (void )webView : (WebView *)webView didFinishLoadForFrame : (WebFrame *)frame
25
32
{
26
33
if (webView != self.webView ) { return ; }
27
34
28
- if (![[self . webView stringByEvaluatingJavaScriptFromString: @" typeof WebViewJavascriptBridge == 'object'" ] isEqualToString: @" true" ]) {
35
+ if (![[webView stringByEvaluatingJavaScriptFromString: @" typeof WebViewJavascriptBridge == 'object'" ] isEqualToString: @" true" ]) {
29
36
NSString *filePath = [[NSBundle mainBundle ] pathForResource: @" WebViewJavascriptBridge.js" ofType: @" txt" ];
30
37
NSString *js = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil ];
31
- [self . webView stringByEvaluatingJavaScriptFromString: js];
38
+ [webView stringByEvaluatingJavaScriptFromString: js];
32
39
}
33
40
34
41
if (self.startupMessageQueue ) {
@@ -38,48 +45,53 @@ - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame
38
45
self.startupMessageQueue = nil ;
39
46
}
40
47
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];
43
51
}
44
52
}
45
53
46
54
- (void )webView : (WebView *)webView didFailLoadWithError : (NSError *)error forFrame : (WebFrame *)frame {
47
55
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];
50
59
}
51
60
}
52
61
53
62
- (void )webView : (WebView *)webView decidePolicyForNavigationAction : (NSDictionary *)actionInformation request : (NSURLRequest *)request frame : (WebFrame *)frame decisionListener : (id <WebPolicyDecisionListener >)listener
54
63
{
55
64
if (webView != self.webView ) { [listener use ]; }
56
65
NSURL *url = [request URL ];
66
+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
57
67
if ([[url scheme ] isEqualToString: kCustomProtocolScheme ]) {
58
68
if ([[url host ] isEqualToString: kQueueHasMessage ]) {
59
69
[self _flushMessageQueue ];
60
70
} else {
61
71
NSLog (@" WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@ ://%@ " , kCustomProtocolScheme , [url path ]);
62
72
}
63
73
[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];
67
77
} else {
68
78
[listener use ];
69
79
}
70
80
}
71
81
72
82
- (void )webView : (WebView *)webView didCommitLoadForFrame : (WebFrame *)frame {
73
83
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];
76
87
}
77
88
}
78
89
79
90
- (NSURLRequest *)webView : (WebView *)webView resource : (id )identifier willSendRequest : (NSURLRequest *)request redirectResponse : (NSURLResponse *)redirectResponse fromDataSource : (WebDataSource *)dataSource {
80
91
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];
83
95
}
84
96
85
97
return request;
0 commit comments