You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2014/08/12 10:04:38 UTC

git commit: CB-7179 - Update InAppBrowser to support WKWebView (in-progress)

Repository: cordova-plugin-inappbrowser
Updated Branches:
  refs/heads/wkwebview [created] ab5046823


CB-7179 - Update InAppBrowser to support WKWebView (in-progress)

WKNavigationDelegate is not set. Cordova bridge binding is not set.


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/ab504682
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/ab504682
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/ab504682

Branch: refs/heads/wkwebview
Commit: ab504682393e68a0de0d33db7fb4fcbfd5777193
Parents: 79f73fb
Author: Shazron Abdullah <sh...@apache.org>
Authored: Tue Aug 12 01:04:25 2014 -0700
Committer: Shazron Abdullah <sh...@apache.org>
Committed: Tue Aug 12 01:04:25 2014 -0700

----------------------------------------------------------------------
 src/ios/CDVInAppBrowser.h |  5 ++-
 src/ios/CDVInAppBrowser.m | 76 +++++++++++++++++++++++++++++-------------
 2 files changed, 57 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/ab504682/src/ios/CDVInAppBrowser.h
----------------------------------------------------------------------
diff --git a/src/ios/CDVInAppBrowser.h b/src/ios/CDVInAppBrowser.h
index c92d9b7..e66a130 100644
--- a/src/ios/CDVInAppBrowser.h
+++ b/src/ios/CDVInAppBrowser.h
@@ -21,6 +21,7 @@
 #import <Cordova/CDVInvokedUrlCommand.h>
 #import <Cordova/CDVScreenOrientationDelegate.h>
 #import <Cordova/CDVWebViewDelegate.h>
+#import <Cordova/CDVWebViewOperationsDelegate.h>
 
 @class CDVInAppBrowserViewController;
 
@@ -58,6 +59,7 @@
 @property (nonatomic, assign) BOOL suppressesincrementalrendering;
 @property (nonatomic, assign) BOOL hidden;
 @property (nonatomic, assign) BOOL disallowoverscroll;
+@property (nonatomic, assign) BOOL usewkwebview;
 
 + (CDVInAppBrowserOptions*)parseOptions:(NSString*)options;
 
@@ -72,7 +74,7 @@
     CDVWebViewDelegate* _webViewDelegate;
 }
 
-@property (nonatomic, strong) IBOutlet UIWebView* webView;
+@property (nonatomic, strong) IBOutlet UIView* webView;
 @property (nonatomic, strong) IBOutlet UIBarButtonItem* closeButton;
 @property (nonatomic, strong) IBOutlet UILabel* addressLabel;
 @property (nonatomic, strong) IBOutlet UIBarButtonItem* backButton;
@@ -80,6 +82,7 @@
 @property (nonatomic, strong) IBOutlet UIActivityIndicatorView* spinner;
 @property (nonatomic, strong) IBOutlet UIToolbar* toolbar;
 
+@property (nonatomic, strong) CDVWebViewOperationsDelegate* operationsDelegate;
 @property (nonatomic, weak) id <CDVScreenOrientationDelegate> orientationDelegate;
 @property (nonatomic, weak) CDVInAppBrowser* navigationDelegate;
 @property (nonatomic) NSURL* currentURL;

http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/ab504682/src/ios/CDVInAppBrowser.m
----------------------------------------------------------------------
diff --git a/src/ios/CDVInAppBrowser.m b/src/ios/CDVInAppBrowser.m
index 4169b6e..8a180ab 100644
--- a/src/ios/CDVInAppBrowser.m
+++ b/src/ios/CDVInAppBrowser.m
@@ -21,6 +21,8 @@
 #import <Cordova/CDVPluginResult.h>
 #import <Cordova/CDVUserAgentUtil.h>
 #import <Cordova/CDVJSON.h>
+#import <Cordova/CDVWebViewUIDelegate.h>
+#import <Cordova/CDVWebViewPreferences.h>
 
 #define    kInAppBrowserTargetSelf @"_self"
 #define    kInAppBrowserTargetSystem @"_system"
@@ -88,7 +90,8 @@
     self.callbackId = command.callbackId;
 
     if (url != nil) {
-        NSURL* baseUrl = [self.webView.request URL];
+        CDVWebViewOperationsDelegate* opDelegate = [[CDVWebViewOperationsDelegate alloc] initWithWebView:self.webView];
+        NSURL* baseUrl = [opDelegate requestURL];
         NSURL* absoluteUrl = [[NSURL URLWithString:url relativeToURL:baseUrl] absoluteURL];
 
         if ([self isSystemUrl:absoluteUrl]) {
@@ -178,7 +181,7 @@
     // prevent webView from bouncing
     if (browserOptions.disallowoverscroll) {
         if ([self.inAppBrowserViewController.webView respondsToSelector:@selector(scrollView)]) {
-            ((UIScrollView*)[self.inAppBrowserViewController.webView scrollView]).bounces = NO;
+            ((UIScrollView*)[self.inAppBrowserViewController.operationsDelegate scrollView]).bounces = NO;
         } else {
             for (id subview in self.inAppBrowserViewController.webView.subviews) {
                 if ([[subview class] isSubclassOfClass:[UIScrollView class]]) {
@@ -187,15 +190,15 @@
             }
         }
     }
-
-    // UIWebView options
-    self.inAppBrowserViewController.webView.scalesPageToFit = browserOptions.enableviewportscale;
-    self.inAppBrowserViewController.webView.mediaPlaybackRequiresUserAction = browserOptions.mediaplaybackrequiresuseraction;
-    self.inAppBrowserViewController.webView.allowsInlineMediaPlayback = browserOptions.allowinlinemediaplayback;
-    if (IsAtLeastiOSVersion(@"6.0")) {
-        self.inAppBrowserViewController.webView.keyboardDisplayRequiresUserAction = browserOptions.keyboarddisplayrequiresuseraction;
-        self.inAppBrowserViewController.webView.suppressesIncrementalRendering = browserOptions.suppressesincrementalrendering;
-    }
+    
+    CDVWebViewPreferences* prefs = [[CDVWebViewPreferences alloc] initWithWebView:self.inAppBrowserViewController.webView];
+    [prefs updateSettings: @{
+        @"EnableViewportScale" : @(browserOptions.enableviewportscale),
+        @"MediaPlaybackRequiresUserAction" : @(browserOptions.mediaplaybackrequiresuseraction),
+        @"AllowInlineMediaPlayback" : @(browserOptions.allowinlinemediaplayback),
+        @"KeyboardDisplayRequiresUserAction" : @(browserOptions.keyboarddisplayrequiresuseraction),
+        @"SuppressesIncrementalRendering" : @(browserOptions.suppressesincrementalrendering)
+    }];
 
     [self.inAppBrowserViewController navigateTo:url];
     if (!browserOptions.hidden) {
@@ -232,7 +235,8 @@
 {
     if ([self.commandDelegate URLIsWhitelisted:url]) {
         NSURLRequest* request = [NSURLRequest requestWithURL:url];
-        [self.webView loadRequest:request];
+        CDVWebViewOperationsDelegate* opDelegate = [[CDVWebViewOperationsDelegate alloc] initWithWebView:self.webView];
+        [opDelegate loadRequest:request];
     } else { // this assumes the InAppBrowser can be excepted from the white-list
         [self openInInAppBrowser:url withOptions:options];
     }
@@ -261,7 +265,7 @@
     if (!_injectedIframeBridge) {
         _injectedIframeBridge = YES;
         // Create an iframe bridge in the new document to communicate with the CDVInAppBrowserViewController
-        [self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:@"(function(d){var e = _cdvIframeBridge = d.createElement('iframe');e.style.display='none';d.body.appendChild(e);})(document)"];
+        [self.inAppBrowserViewController.operationsDelegate evaluateJavaScript:@"(function(d){var e = _cdvIframeBridge = d.createElement('iframe');e.style.display='none';d.body.appendChild(e);})(document)" completionHandler:nil];
     }
 
     if (jsWrapper != nil) {
@@ -269,10 +273,10 @@
         if (sourceArrayString) {
             NSString* sourceString = [sourceArrayString substringWithRange:NSMakeRange(1, [sourceArrayString length] - 2)];
             NSString* jsToInject = [NSString stringWithFormat:jsWrapper, sourceString];
-            [self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:jsToInject];
+            [self.inAppBrowserViewController.operationsDelegate evaluateJavaScript:jsToInject completionHandler:nil];
         }
     } else {
-        [self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:source];
+        [self.inAppBrowserViewController.operationsDelegate evaluateJavaScript:source completionHandler:nil];
     }
 }
 
@@ -476,22 +480,47 @@
     CGRect webViewBounds = self.view.bounds;
     BOOL toolbarIsAtBottom = ![_browserOptions.toolbarposition isEqualToString:kInAppBrowserToolbarBarPositionTop];
     webViewBounds.size.height -= _browserOptions.location ? FOOTER_HEIGHT : TOOLBAR_HEIGHT;
-    self.webView = [[UIWebView alloc] initWithFrame:webViewBounds];
+    
+    if (NSClassFromString(@"WKWebView") && _browserOptions.usewkwebview) {
+#ifdef __IPHONE_8_0
+        WKUserContentController* userContentController = [[WKUserContentController alloc] init];
+        
+        // scriptMessageHandler is the object that conforms to the WKScriptMessageHandler protocol
+        // see https://developer.apple.com/library/prerelease/ios/documentation/WebKit/Reference/WKScriptMessageHandler_Ref/index.html#//apple_ref/swift/intf/WKScriptMessageHandler
+//        if ([_commandDelegate conformsToProtocol:@protocol(WKScriptMessageHandler)]) {
+//            [userContentController addScriptMessageHandler:self name:@"cordova"];
+//        }
+        
+        WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];
+        configuration.userContentController = userContentController;
+        
+        self.webView = [[WKWebView alloc] initWithFrame:webViewBounds configuration:configuration];
+        CDVWebViewUIDelegate* webViewUIDelegate = [[CDVWebViewUIDelegate alloc] initWithTitle:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]];
+        ((WKWebView*)self.webView).UIDelegate = webViewUIDelegate;
+#endif
+    } else {
+        self.webView = [[UIWebView alloc] initWithFrame:webViewBounds];
+    }
+    
+    self.operationsDelegate = [[CDVWebViewOperationsDelegate alloc] initWithWebView:self.webView];
 
     self.webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
 
     [self.view addSubview:self.webView];
     [self.view sendSubviewToBack:self.webView];
 
-    self.webView.delegate = _webViewDelegate;
+    [self.operationsDelegate setNavigationDelegate:_webViewDelegate]; // TODO: WKWebView navigationDelegate here as well
     self.webView.backgroundColor = [UIColor whiteColor];
+    
+    
+    CDVWebViewPreferences* prefs = [[CDVWebViewPreferences alloc] initWithWebView:self.webView];
+    [prefs updateSettings:@{ @"EnableViewportScale" : @NO }];
 
     self.webView.clearsContextBeforeDrawing = YES;
     self.webView.clipsToBounds = YES;
     self.webView.contentMode = UIViewContentModeScaleToFill;
     self.webView.multipleTouchEnabled = YES;
     self.webView.opaque = YES;
-    self.webView.scalesPageToFit = NO;
     self.webView.userInteractionEnabled = YES;
 
     self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
@@ -721,7 +750,7 @@
 
 - (void)viewDidUnload
 {
-    [self.webView loadHTMLString:nil baseURL:nil];
+    [self.operationsDelegate loadHTMLString:nil baseURL:nil];
     [CDVUserAgentUtil releaseLock:&_userAgentLockToken];
     [super viewDidUnload];
 }
@@ -755,24 +784,24 @@
     NSURLRequest* request = [NSURLRequest requestWithURL:url];
 
     if (_userAgentLockToken != 0) {
-        [self.webView loadRequest:request];
+        [self.operationsDelegate loadRequest:request];
     } else {
         [CDVUserAgentUtil acquireLock:^(NSInteger lockToken) {
             _userAgentLockToken = lockToken;
             [CDVUserAgentUtil setUserAgent:_userAgent lockToken:lockToken];
-            [self.webView loadRequest:request];
+            [self.operationsDelegate loadRequest:request];
         }];
     }
 }
 
 - (void)goBack:(id)sender
 {
-    [self.webView goBack];
+    [self.operationsDelegate goBack];
 }
 
 - (void)goForward:(id)sender
 {
-    [self.webView goForward];
+    [self.operationsDelegate goForward];
 }
 
 - (void)viewWillAppear:(BOOL)animated
@@ -921,6 +950,7 @@
         self.suppressesincrementalrendering = NO;
         self.hidden = NO;
         self.disallowoverscroll = NO;
+        self.usewkwebview = NO;
     }
 
     return self;