FLTWKNavigationDelegate.m 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #import "FLTWKNavigationDelegate.h"
  5. @implementation FLTWKNavigationDelegate {
  6. FlutterMethodChannel* _methodChannel;
  7. }
  8. - (instancetype)initWithChannel:(FlutterMethodChannel*)channel {
  9. self = [super init];
  10. if (self) {
  11. _methodChannel = channel;
  12. }
  13. return self;
  14. }
  15. #pragma mark - WKNavigationDelegate conformance
  16. - (void)webView:(WKWebView*)webView didStartProvisionalNavigation:(WKNavigation*)navigation {
  17. [_methodChannel invokeMethod:@"onPageStarted" arguments:@{@"url" : webView.URL.absoluteString}];
  18. }
  19. - (void)webView:(WKWebView*)webView
  20. decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction
  21. decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
  22. if (!self.hasDartNavigationDelegate) {
  23. decisionHandler(WKNavigationActionPolicyAllow);
  24. return;
  25. }
  26. NSDictionary* arguments = @{
  27. @"url" : navigationAction.request.URL.absoluteString,
  28. @"isForMainFrame" : @(navigationAction.targetFrame.isMainFrame)
  29. };
  30. [_methodChannel invokeMethod:@"navigationRequest"
  31. arguments:arguments
  32. result:^(id _Nullable result) {
  33. if ([result isKindOfClass:[FlutterError class]]) {
  34. NSLog(@"navigationRequest has unexpectedly completed with an error, "
  35. @"allowing navigation.");
  36. decisionHandler(WKNavigationActionPolicyAllow);
  37. return;
  38. }
  39. if (result == FlutterMethodNotImplemented) {
  40. NSLog(@"navigationRequest was unexepectedly not implemented: %@, "
  41. @"allowing navigation.",
  42. result);
  43. decisionHandler(WKNavigationActionPolicyAllow);
  44. return;
  45. }
  46. if (![result isKindOfClass:[NSNumber class]]) {
  47. NSLog(@"navigationRequest unexpectedly returned a non boolean value: "
  48. @"%@, allowing navigation.",
  49. result);
  50. decisionHandler(WKNavigationActionPolicyAllow);
  51. return;
  52. }
  53. NSNumber* typedResult = result;
  54. decisionHandler([typedResult boolValue] ? WKNavigationActionPolicyAllow
  55. : WKNavigationActionPolicyCancel);
  56. }];
  57. }
  58. - (void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation {
  59. [_methodChannel invokeMethod:@"onPageFinished" arguments:@{@"url" : webView.URL.absoluteString}];
  60. }
  61. @end