Skip to content

Commit 63d55ef

Browse files
authored
Thirdiron feature/unsafe for alert speedup (marcuswestin#215)
Add `disableJavscriptAlertBoxSafetyTimeout` feature by @jordanpwood.
1 parent f8640a0 commit 63d55ef

File tree

10 files changed

+85
-5
lines changed

10 files changed

+85
-5
lines changed

Example Apps/ExampleApp-iOS/ExampleUIWebViewController.m

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,32 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView {
4646
}
4747

4848
- (void)renderButtons:(UIWebView*)webView {
49-
UIFont* font = [UIFont fontWithName:@"HelveticaNeue" size:12.0];
49+
UIFont* font = [UIFont fontWithName:@"HelveticaNeue" size:11.0];
5050

5151
UIButton *callbackButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
5252
[callbackButton setTitle:@"Call handler" forState:UIControlStateNormal];
5353
[callbackButton addTarget:self action:@selector(callHandler:) forControlEvents:UIControlEventTouchUpInside];
5454
[self.view insertSubview:callbackButton aboveSubview:webView];
55-
callbackButton.frame = CGRectMake(10, 400, 100, 35);
55+
callbackButton.frame = CGRectMake(0, 400, 100, 35);
5656
callbackButton.titleLabel.font = font;
5757

5858
UIButton* reloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
5959
[reloadButton setTitle:@"Reload webview" forState:UIControlStateNormal];
6060
[reloadButton addTarget:webView action:@selector(reload) forControlEvents:UIControlEventTouchUpInside];
6161
[self.view insertSubview:reloadButton aboveSubview:webView];
62-
reloadButton.frame = CGRectMake(110, 400, 100, 35);
62+
reloadButton.frame = CGRectMake(90, 400, 100, 35);
6363
reloadButton.titleLabel.font = font;
64+
65+
UIButton* safetyTimeoutButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
66+
[safetyTimeoutButton setTitle:@"Disable safety timeout" forState:UIControlStateNormal];
67+
[safetyTimeoutButton addTarget:self action:@selector(disableSafetyTimeout) forControlEvents:UIControlEventTouchUpInside];
68+
[self.view insertSubview:safetyTimeoutButton aboveSubview:webView];
69+
safetyTimeoutButton.frame = CGRectMake(190, 400, 120, 35);
70+
safetyTimeoutButton.titleLabel.font = font;
71+
}
72+
73+
- (void)disableSafetyTimeout {
74+
[self.bridge disableJavscriptAlertBoxSafetyTimeout];
6475
}
6576

6677
- (void)callHandler:(id)sender {

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ WebViewJavascriptBridge is used by a range of companies and projects. This is a
2222
- [鼎盛中华](https://itunes.apple.com/us/app/ding-sheng-zhong-hua/id537273940?mt=8)
2323
- [FRIL](https://fril.jp)
2424
- [留白·WHITE](http://liubaiapp.com)
25+
- [BrowZine](http://thirdiron.com/browzine/)
2526

2627
Installation (iOS & OSX)
2728
------------------------
@@ -198,6 +199,13 @@ Example:
198199

199200
Optionally, set a `UIWebViewDelegate` if you need to respond to the [web view's lifecycle events](http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html).
200201

202+
##### `[bridge disableJavscriptAlertBoxSafetyTimeout]`
203+
204+
UNSAFE. Speed up bridge message passing by disabling the setTimeout safety check. It is only safe to disable this safety check if you do not call any of the javascript popup box functions (alert, confirm, and prompt). If you call any of these functions from the bridged javascript code, the app will hang.
205+
206+
Example:
207+
208+
[self.bridge disableJavscriptAlertBoxSafetyTimeout];
201209

202210

203211

@@ -230,3 +238,14 @@ bridge.callHandler("getScreenHeight", null, function(response) {
230238
alert('Screen height:' + response)
231239
})
232240
```
241+
242+
243+
##### `bridge.disableJavscriptAlertBoxSafetyTimeout()`
244+
245+
Calling `bridge.disableJavscriptAlertBoxSafetyTimeout()` has the same effect as calling `[bridge disableJavscriptAlertBoxSafetyTimeout];` in ObjC.
246+
247+
Example:
248+
249+
```javascript
250+
bridge.disableJavscriptAlertBoxSafetyTimeout()
251+
```

Tests/WebViewJavascriptBridgeTests/BridgeTests.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,26 @@ - (void)classSpecificTestJavascriptReceiveResponse:(Class)cls webView:(id)webVie
139139
}];
140140
}
141141

142+
- (void)testJavascriptReceiveResponseWithoutSafetyTimeout {
143+
[self classSpecificTestJavascriptReceiveResponseWithoutSafetyTimeout:[WebViewJavascriptBridge class] webView:_uiWebView];
144+
[self classSpecificTestJavascriptReceiveResponseWithoutSafetyTimeout:[WKWebViewJavascriptBridge class] webView:_wkWebView];
145+
[self waitForExpectationsWithTimeout:3 handler:NULL];
146+
}
147+
- (void)classSpecificTestJavascriptReceiveResponseWithoutSafetyTimeout:(Class)cls webView:(id)webView {
148+
WebViewJavascriptBridge *bridge = [self bridgeForCls:cls webView:webView];
149+
[bridge disableJavscriptAlertBoxSafetyTimeout];
150+
loadEchoSample(webView);
151+
XCTestExpectation *callbackInvocked = [self expectationWithDescription:@"Callback invoked"];
152+
[bridge registerHandler:@"objcEchoToJs" handler:^(id data, WVJBResponseCallback responseCallback) {
153+
responseCallback(data);
154+
}];
155+
[bridge callHandler:@"jsRcvResponseTest" data:nil responseCallback:^(id responseData) {
156+
XCTAssertEqualObjects(responseData, @"Response from JS");
157+
[callbackInvocked fulfill];
158+
}];
159+
}
160+
161+
142162
- (WebViewJavascriptBridge*)bridgeForCls:(Class)cls webView:(id)webView {
143163
if (cls == [WebViewJavascriptBridge class]) {
144164
return [WebViewJavascriptBridge bridgeForWebView:webView];

WebViewJavascriptBridge/WKWebViewJavascriptBridge.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
2727
- (void)reset;
2828
- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate;
29+
- (void)disableJavscriptAlertBoxSafetyTimeout;
2930

3031
@end
3132

WebViewJavascriptBridge/WKWebViewJavascriptBridge.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ - (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate {
6161
_webViewDelegate = webViewDelegate;
6262
}
6363

64+
- (void)disableJavscriptAlertBoxSafetyTimeout {
65+
[_base disableJavscriptAlertBoxSafetyTimeout];
66+
}
67+
6468
/* Internals
6569
***********/
6670

WebViewJavascriptBridge/WebViewJavascriptBridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@
3434
- (void)callHandler:(NSString*)handlerName data:(id)data;
3535
- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
3636
- (void)setWebViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate;
37+
- (void)disableJavscriptAlertBoxSafetyTimeout;
38+
3739
@end

WebViewJavascriptBridge/WebViewJavascriptBridge.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ - (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
6161
_base.messageHandlers[handlerName] = [handler copy];
6262
}
6363

64+
- (void)disableJavscriptAlertBoxSafetyTimeout {
65+
[_base disableJavscriptAlertBoxSafetyTimeout];
66+
}
67+
68+
6469
/* Platform agnostic internals
6570
*****************************/
6671

WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@ typedef NSDictionary WVJBMessage;
4040
- (void)logUnkownMessage:(NSURL*)url;
4141
- (NSString *)webViewJavascriptCheckCommand;
4242
- (NSString *)webViewJavascriptFetchQueyCommand;
43+
- (void)disableJavscriptAlertBoxSafetyTimeout;
4344

4445
@end

WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ -(NSString *)webViewJavascriptFetchQueyCommand {
153153
return @"WebViewJavascriptBridge._fetchQueue();";
154154
}
155155

156+
- (void)disableJavscriptAlertBoxSafetyTimeout {
157+
[self sendData:nil responseCallback:nil handlerName:@"_disableJavascriptAlertBoxSafetyTimeout"];
158+
}
159+
156160
// Private
157161
// -------------------------------------------
158162

WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
window.WebViewJavascriptBridge = {
2929
registerHandler: registerHandler,
3030
callHandler: callHandler,
31+
disableJavscriptAlertBoxSafetyTimeout: disableJavscriptAlertBoxSafetyTimeout,
3132
_fetchQueue: _fetchQueue,
3233
_handleMessageFromObjC: _handleMessageFromObjC
3334
};
@@ -41,6 +42,7 @@
4142

4243
var responseCallbacks = {};
4344
var uniqueId = 1;
45+
var dispatchMessagesWithTimeoutSafety = true;
4446

4547
function registerHandler(handlerName, handler) {
4648
messageHandlers[handlerName] = handler;
@@ -53,6 +55,9 @@ function callHandler(handlerName, data, responseCallback) {
5355
}
5456
_doSend({ handlerName:handlerName, data:data }, responseCallback);
5557
}
58+
function disableJavscriptAlertBoxSafetyTimeout() {
59+
dispatchMessagesWithTimeoutSafety = false;
60+
}
5661

5762
function _doSend(message, responseCallback) {
5863
if (responseCallback) {
@@ -71,7 +76,13 @@ function _fetchQueue() {
7176
}
7277

7378
function _dispatchMessageFromObjC(messageJSON) {
74-
setTimeout(function _timeoutDispatchMessageFromObjC() {
79+
if (dispatchMessagesWithTimeoutSafety) {
80+
setTimeout(_doDispatchMessageFromObjC);
81+
} else {
82+
_doDispatchMessageFromObjC();
83+
}
84+
85+
function _doDispatchMessageFromObjC() {
7586
var message = JSON.parse(messageJSON);
7687
var messageHandler;
7788
var responseCallback;
@@ -98,7 +109,7 @@ function _dispatchMessageFromObjC(messageJSON) {
98109
handler(message.data, responseCallback);
99110
}
100111
}
101-
});
112+
}
102113
}
103114

104115
function _handleMessageFromObjC(messageJSON) {
@@ -110,6 +121,8 @@ function _handleMessageFromObjC(messageJSON) {
110121
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
111122
document.documentElement.appendChild(messagingIframe);
112123

124+
registerHandler("_disableJavascriptAlertBoxSafetyTimeout", disableJavscriptAlertBoxSafetyTimeout);
125+
113126
setTimeout(_callWVJBCallbacks, 0);
114127
function _callWVJBCallbacks() {
115128
var callbacks = window.WVJBCallbacks;

0 commit comments

Comments
 (0)