|
@@ -14,6 +14,7 @@
|
14
|
14
|
#import "objc/runtime.h"
|
15
|
15
|
|
16
|
16
|
static NSTimer *keyboardTimer;
|
|
17
|
+static NSString *const HistoryShimName = @"ReactNativeHistoryShim";
|
17
|
18
|
static NSString *const MessageHandlerName = @"ReactNativeWebView";
|
18
|
19
|
static NSURLCredential* clientAuthenticationCredential;
|
19
|
20
|
static NSDictionary* customCertificatesForHost;
|
|
@@ -160,6 +161,31 @@ static NSDictionary* customCertificatesForHost;
|
160
|
161
|
}
|
161
|
162
|
wkWebViewConfig.userContentController = [WKUserContentController new];
|
162
|
163
|
|
|
164
|
+ // Shim the HTML5 history API:
|
|
165
|
+ [wkWebViewConfig.userContentController addScriptMessageHandler:self name:HistoryShimName];
|
|
166
|
+ NSString *source = [NSString stringWithFormat:
|
|
167
|
+ @"(function(history) {\n"
|
|
168
|
+ " function notify(type) {\n"
|
|
169
|
+ " setTimeout(function() {\n"
|
|
170
|
+ " window.webkit.messageHandlers.%@.postMessage(type)\n"
|
|
171
|
+ " }, 0)\n"
|
|
172
|
+ " }\n"
|
|
173
|
+ " function shim(f) {\n"
|
|
174
|
+ " return function pushState() {\n"
|
|
175
|
+ " notify('other')\n"
|
|
176
|
+ " return f.apply(history, arguments)\n"
|
|
177
|
+ " }\n"
|
|
178
|
+ " }\n"
|
|
179
|
+ " history.pushState = shim(history.pushState)\n"
|
|
180
|
+ " history.replaceState = shim(history.replaceState)\n"
|
|
181
|
+ " window.addEventListener('popstate', function() {\n"
|
|
182
|
+ " notify('backforward')\n"
|
|
183
|
+ " })\n"
|
|
184
|
+ "})(window.history)\n", HistoryShimName
|
|
185
|
+ ];
|
|
186
|
+ WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
|
|
187
|
+ [wkWebViewConfig.userContentController addUserScript:script];
|
|
188
|
+
|
163
|
189
|
if (_messagingEnabled) {
|
164
|
190
|
[wkWebViewConfig.userContentController addScriptMessageHandler:self name:MessageHandlerName];
|
165
|
191
|
|
|
@@ -404,10 +430,18 @@ static NSDictionary* customCertificatesForHost;
|
404
|
430
|
- (void)userContentController:(WKUserContentController *)userContentController
|
405
|
431
|
didReceiveScriptMessage:(WKScriptMessage *)message
|
406
|
432
|
{
|
407
|
|
- if (_onMessage != nil) {
|
408
|
|
- NSMutableDictionary<NSString *, id> *event = [self baseEvent];
|
409
|
|
- [event addEntriesFromDictionary: @{@"data": message.body}];
|
410
|
|
- _onMessage(event);
|
|
433
|
+ if ([message.name isEqualToString:HistoryShimName]) {
|
|
434
|
+ if (_onLoadingFinish) {
|
|
435
|
+ NSMutableDictionary<NSString *, id> *event = [self baseEvent];
|
|
436
|
+ [event addEntriesFromDictionary: @{@"navigationType": message.body}];
|
|
437
|
+ _onLoadingFinish(event);
|
|
438
|
+ }
|
|
439
|
+ } else if ([message.name isEqualToString:MessageHandlerName]) {
|
|
440
|
+ if (_onMessage) {
|
|
441
|
+ NSMutableDictionary<NSString *, id> *event = [self baseEvent];
|
|
442
|
+ [event addEntriesFromDictionary: @{@"data": message.body}];
|
|
443
|
+ _onMessage(event);
|
|
444
|
+ }
|
411
|
445
|
}
|
412
|
446
|
}
|
413
|
447
|
|