@@ -13,7 +13,7 @@ + (instancetype)bridgeForWebView:(WebView *)webView handler:(WVJBHandler)handler
13
13
}
14
14
15
15
+ (instancetype )bridgeForWebView : (WebView *)webView webViewDelegate : (id )webViewDelegate handler : (WVJBHandler)messageHandler {
16
- WebViewJavascriptBridge* bridge = [[WebViewJavascriptBridge alloc ] init ];
16
+ WebViewJavascriptBridge* bridge = [[[ self class ] alloc ] init ];
17
17
bridge.messageHandler = messageHandler;
18
18
bridge.webView = webView;
19
19
bridge.webViewDelegate = webViewDelegate;
@@ -27,16 +27,23 @@ + (instancetype)bridgeForWebView:(WebView *)webView webViewDelegate:(id)webViewD
27
27
return bridge;
28
28
}
29
29
30
+ - (void )dealloc ;
31
+ {
32
+ self.webView .frameLoadDelegate = nil ;
33
+ self.webView .resourceLoadDelegate = nil ;
34
+ self.webView .policyDelegate = nil ;
35
+ }
36
+
30
37
- (void )webView : (WebView *)webView didFinishLoadForFrame : (WebFrame *)frame
31
38
{
32
39
if (webView != self.webView ) { return ; }
33
40
34
41
self.numRequestsLoading --;
35
42
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" ]) {
37
44
NSString *filePath = [[NSBundle mainBundle ] pathForResource: @" WebViewJavascriptBridge.js" ofType: @" txt" ];
38
45
NSString *js = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil ];
39
- [self . webView stringByEvaluatingJavaScriptFromString: js];
46
+ [webView stringByEvaluatingJavaScriptFromString: js];
40
47
}
41
48
42
49
if (self.startupMessageQueue ) {
@@ -46,8 +53,9 @@ - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame
46
53
self.startupMessageQueue = nil ;
47
54
}
48
55
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];
51
59
}
52
60
}
53
61
@@ -56,34 +64,37 @@ - (void)webView:(WebView *)webView didFailLoadWithError:(NSError *)error forFram
56
64
57
65
self.numRequestsLoading --;
58
66
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];
61
70
}
62
71
}
63
72
64
73
- (void )webView : (WebView *)webView decidePolicyForNavigationAction : (NSDictionary *)actionInformation request : (NSURLRequest *)request frame : (WebFrame *)frame decisionListener : (id <WebPolicyDecisionListener >)listener
65
74
{
66
75
if (webView != self.webView ) { [listener use ]; }
67
76
NSURL *url = [request URL ];
77
+ __strong typeof (self.webViewDelegate ) strongDelegate = self.webViewDelegate ;
68
78
if ([[url scheme ] isEqualToString: kCustomProtocolScheme ]) {
69
79
if ([[url host ] isEqualToString: kQueueHasMessage ]) {
70
80
[self _flushMessageQueue ];
71
81
} else {
72
82
NSLog (@" WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@ ://%@ " , kCustomProtocolScheme , [url path ]);
73
83
}
74
84
[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];
78
88
} else {
79
89
[listener use ];
80
90
}
81
91
}
82
92
83
93
- (void )webView : (WebView *)webView didCommitLoadForFrame : (WebFrame *)frame {
84
94
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];
87
98
}
88
99
}
89
100
@@ -92,8 +103,9 @@ - (NSURLRequest *)webView:(WebView *)webView resource:(id)identifier willSendReq
92
103
93
104
self.numRequestsLoading ++;
94
105
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];
97
109
}
98
110
99
111
return request;
0 commit comments