Skip to content

Commit 04e123e

Browse files
author
Peyton Randolph
committed
fix merge conflicts
2 parents 7da8103 + 20ce1b0 commit 04e123e

File tree

6 files changed

+71
-35
lines changed

6 files changed

+71
-35
lines changed

WebViewJavascriptBridgeAbstract/WebViewJavascriptBridgeAbstract.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,21 @@
22
#define kCustomProtocolScheme @"wvjbscheme"
33
#define kQueueHasMessage @"__WVJB_QUEUE_MESSAGE__"
44

5+
#if TARGET_OS_IPHONE && defined(__IPHONE_5_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0)
6+
#define WEAK_FALLBACK weak
7+
#elif TARGET_OS_MAC && defined(__MAC_10_7) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_10_7)
8+
#define WEAK_FALLBACK weak
9+
#else
10+
#define WEAK_FALLBACK unsafe_unretained
11+
#endif
12+
513
typedef void (^WVJBResponseCallback)(id responseData);
614
typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback);
715

816
@interface WebViewJavascriptBridgeAbstract : NSObject
917

10-
@property (nonatomic, strong) id webView;
11-
@property (nonatomic, strong) id webViewDelegate;
18+
@property (nonatomic, WEAK_FALLBACK) id webView;
19+
@property (nonatomic, WEAK_FALLBACK) id webViewDelegate;
1220
@property (nonatomic, strong) NSMutableArray *startupMessageQueue;
1321
@property (nonatomic, strong) NSMutableDictionary *responseCallbacks;
1422
@property (nonatomic, strong) NSMutableDictionary *messageHandlers;

WebViewJavascriptBridgeAbstract/WebViewJavascriptBridgeAbstract.m

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,23 @@ - (void)_dispatchMessage:(NSDictionary *)message {
7979
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
8080
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
8181
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"];
82+
__strong typeof(self.webView) strongWebView = self.webView;
8283
if ([[NSThread currentThread] isMainThread]) {
83-
[self.webView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
84+
[strongWebView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
8485
withObject:[NSString stringWithFormat:
8586
@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON]];
8687
} else {
8788
dispatch_sync(dispatch_get_main_queue(), ^{
88-
[self.webView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
89+
[strongWebView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
8990
withObject:[NSString stringWithFormat:
9091
@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON]];
9192
});
9293
}
9394
}
9495

9596
- (void)_flushMessageQueue {
96-
NSString *messageQueueString = [self.webView performSelector:
97+
__strong typeof(self.webView) strongWebView = self.webView;
98+
NSString *messageQueueString = [strongWebView performSelector:
9799
@selector(stringByEvaluatingJavaScriptFromString:) withObject:@"WebViewJavascriptBridge._fetchQueue();"];
98100

99101
NSArray* messages = [messageQueueString componentsSeparatedByString:kMessageSeparator];
@@ -112,8 +114,8 @@ - (void)_flushMessageQueue {
112114
__block NSString* callbackId = message[@"callbackId"];
113115
if (callbackId) {
114116
responseCallback = ^(id responseData) {
115-
NSDictionary* message = @{ @"responseId":callbackId, @"responseData":responseData };
116-
[self _queueMessage:message];
117+
NSDictionary* msg = @{ @"responseId":callbackId, @"responseData":responseData };
118+
[self _queueMessage:msg];
117119
};
118120
} else {
119121
responseCallback = ^(id ignoreResponseData) {

WebViewJavascriptBridge_OSX/WebViewJavascriptBridge_OSX.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
@interface WebViewJavascriptBridge : WebViewJavascriptBridgeAbstract
55

6-
@property (nonatomic, strong) WebView *webView;
7-
@property (nonatomic, strong) id webViewDelegate;
6+
@property (nonatomic, WEAK_FALLBACK) WebView *webView;
7+
@property (nonatomic, WEAK_FALLBACK) id webViewDelegate;
88

99
+ (instancetype)bridgeForWebView:(WebView*)webView handler:(WVJBHandler)handler;
1010
+ (instancetype)bridgeForWebView:(WebView*)webView webViewDelegate:(id)webViewDelegate handler:(WVJBHandler)handler;

WebViewJavascriptBridge_OSX/WebViewJavascriptBridge_OSX.m

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

WebViewJavascriptBridge_iOS/WebViewJavascriptBridge_iOS.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
@interface WebViewJavascriptBridge : WebViewJavascriptBridgeAbstract <UIWebViewDelegate>
55

6-
@property (nonatomic, strong) UIWebView *webView;
7-
@property (nonatomic, strong) id <UIWebViewDelegate> webViewDelegate;
6+
@property (nonatomic, WEAK_FALLBACK) UIWebView *webView;
7+
@property (nonatomic, WEAK_FALLBACK) id <UIWebViewDelegate> webViewDelegate;
88

99
+ (instancetype)bridgeForWebView:(UIWebView*)webView handler:(WVJBHandler)handler;
1010
+ (instancetype)bridgeForWebView:(UIWebView*)webView webViewDelegate:(id <UIWebViewDelegate>)webViewDelegate handler:(WVJBHandler)handler;

WebViewJavascriptBridge_iOS/WebViewJavascriptBridge_iOS.m

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,21 @@ + (instancetype)bridgeForWebView:(UIWebView *)webView webViewDelegate:(id<UIWebV
2727
return bridge;
2828
}
2929

30+
- (void)dealloc;
31+
{
32+
self.webView.delegate = nil;
33+
}
34+
3035
- (void)webViewDidFinishLoad:(UIWebView *)webView {
3136
if (webView != self.webView) { return; }
3237

3338
self.numRequestsLoading--;
3439

35-
if (self.numRequestsLoading == 0 && ![[self.webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) {
40+
if (self.numRequestsLoading == 0 && ![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) {
41+
if (![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) {
3642
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"WebViewJavascriptBridge.js" ofType:@"txt"];
3743
NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
38-
[self.webView stringByEvaluatingJavaScriptFromString:js];
44+
[webView stringByEvaluatingJavaScriptFromString:js];
3945
}
4046

4147
if (self.startupMessageQueue) {
@@ -45,41 +51,49 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView {
4551
self.startupMessageQueue = nil;
4652
}
4753

48-
if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
49-
[self.webViewDelegate webViewDidFinishLoad:webView];
54+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
55+
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
56+
[strongDelegate webViewDidFinishLoad:webView];
5057
}
5158
}
5259

5360
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
5461
if (webView != self.webView) { return; }
62+
5563
self.numRequestsLoading--;
56-
if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
57-
[self.webViewDelegate webView:self.webView didFailLoadWithError:error];
64+
65+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
66+
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
67+
[strongDelegate webView:webView didFailLoadWithError:error];
5868
}
5969
}
6070

6171
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
6272
if (webView != self.webView) { return YES; }
6373
NSURL *url = [request URL];
74+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
6475
if ([[url scheme] isEqualToString:kCustomProtocolScheme]) {
6576
if ([[url host] isEqualToString:kQueueHasMessage]) {
6677
[self _flushMessageQueue];
6778
} else {
6879
NSLog(@"WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@://%@", kCustomProtocolScheme, [url path]);
6980
}
7081
return NO;
71-
} else if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
72-
return [self.webViewDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
82+
} else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
83+
return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
7384
} else {
7485
return YES;
7586
}
7687
}
7788

7889
- (void)webViewDidStartLoad:(UIWebView *)webView {
7990
if (webView != self.webView) { return; }
91+
8092
self.numRequestsLoading++;
81-
if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
82-
[self.webViewDelegate webViewDidStartLoad:webView];
93+
94+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
95+
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
96+
[strongDelegate webViewDidStartLoad:webView];
8397
}
8498
}
8599

0 commit comments

Comments
 (0)