Title: [173019] trunk/Source/WebKit2
Revision
173019
Author
[email protected]
Date
2014-08-27 14:48:02 -0700 (Wed, 27 Aug 2014)

Log Message

[iOS WK2] Provide a delegate callback to skip Geolocation authorization per page for WebApp
https://bugs.webkit.org/show_bug.cgi?id=136243

Patch by Benjamin Poulain <[email protected]> on 2014-08-27
Reviewed by Sam Weinig.

Just ask the UI if the authorization dialog needs to be skipped.

* UIProcess/API/Cocoa/WKUIDelegate.h:
* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::decidePolicyForGeolocationPermissionRequest):

* UIProcess/ios/WKContentView.h:
* UIProcess/ios/WKContentView.mm:
(-[WKContentView _decidePolicyForGeolocationRequestFromOrigin:frame:request:]): Deleted.
The code in WKContentView only exists due to legacy. Instead, the PageClient dispatch the request
to the GeolocationProvider directly.

* UIProcess/ios/WKGeolocationProviderIOS.h:
* UIProcess/ios/WKGeolocationProviderIOS.mm:
(-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:view:]):
(-[WKGeolocationProviderIOS geolocationAuthorizationGranted]):
(-[WKGeolocationProviderIOS positionChanged:]):
(-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:window:]): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (173018 => 173019)


--- trunk/Source/WebKit2/ChangeLog	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/ChangeLog	2014-08-27 21:48:02 UTC (rev 173019)
@@ -1,3 +1,30 @@
+2014-08-27  Benjamin Poulain  <[email protected]>
+
+        [iOS WK2] Provide a delegate callback to skip Geolocation authorization per page for WebApp
+        https://bugs.webkit.org/show_bug.cgi?id=136243
+
+        Reviewed by Sam Weinig.
+
+        Just ask the UI if the authorization dialog needs to be skipped.
+
+        * UIProcess/API/Cocoa/WKUIDelegate.h:
+        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::decidePolicyForGeolocationPermissionRequest):
+
+        * UIProcess/ios/WKContentView.h:
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView _decidePolicyForGeolocationRequestFromOrigin:frame:request:]): Deleted.
+        The code in WKContentView only exists due to legacy. Instead, the PageClient dispatch the request
+        to the GeolocationProvider directly.
+
+        * UIProcess/ios/WKGeolocationProviderIOS.h:
+        * UIProcess/ios/WKGeolocationProviderIOS.mm:
+        (-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:view:]):
+        (-[WKGeolocationProviderIOS geolocationAuthorizationGranted]):
+        (-[WKGeolocationProviderIOS positionChanged:]):
+        (-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:window:]): Deleted.
+
 2014-08-27  Beth Dakin  <[email protected]>
 
         overflow:scroll elements should not latch to the body if the body is 

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h	2014-08-27 21:48:02 UTC (rev 173019)
@@ -30,6 +30,7 @@
 #import <Foundation/Foundation.h>
 
 @class WKFrameInfo;
+@class WKNavigationAction;
 @class WKWebViewConfiguration;
 @class WKWindowFeatures;
 

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2014-08-27 21:48:02 UTC (rev 173019)
@@ -48,6 +48,7 @@
 - (NSArray *)_webView:(WKWebView *)webView actionsForElement:(_WKActivatedElementInfo *)element defaultActions:(NSArray *)defaultActions;
 - (void)_webView:(WKWebView *)webView didNotHandleTapAsClickAtPoint:(CGPoint)point;
 - (void)_webView:(WKWebView *)webView usesMinimalUI:(BOOL)wantMinimalUI;
+- (bool)_webView:(WKWebView *)webView shouldRequestGeolocationAuthorizationForURL:(NSURL *)url isMainFrame:(BOOL)isMainFrame mainFrameURL:(NSURL *)mainFrameURL;
 #endif
 
 @end

Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm	2014-08-27 21:48:02 UTC (rev 173019)
@@ -38,6 +38,8 @@
 #import "ViewSnapshotStore.h"
 #import "WKContentView.h"
 #import "WKContentViewInteraction.h"
+#import "WKGeolocationProviderIOS.h"
+#import "WKProcessPoolInternal.h"
 #import "WKWebViewConfigurationInternal.h"
 #import "WKWebViewContentProviderRegistry.h"
 #import "WKWebViewInternal.h"
@@ -228,7 +230,7 @@
 
 bool PageClientImpl::decidePolicyForGeolocationPermissionRequest(WebFrameProxy& frame, WebSecurityOrigin& origin, GeolocationPermissionRequestProxy& request)
 {
-    [m_contentView _decidePolicyForGeolocationRequestFromOrigin:origin frame:frame request:request];
+    [[wrapper(m_webView->_page->process().context()) _geolocationProvider] decidePolicyForGeolocationRequestFromOrigin:origin.securityOrigin() frame:frame request:request view:m_webView];
     return true;
 }
 

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.h (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.h	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.h	2014-08-27 21:48:02 UTC (rev 173019)
@@ -85,8 +85,6 @@
 - (void)_didCommitLoadForMainFrame;
 - (void)_didCommitLayerTree:(const WebKit::RemoteLayerTreeTransaction&)layerTreeTransaction;
 
-- (void)_decidePolicyForGeolocationRequestFromOrigin:(WebKit::WebSecurityOrigin&)origin frame:(WebKit::WebFrameProxy&)frame request:(WebKit::GeolocationPermissionRequestProxy&)permissionRequest;
-
 - (void)_setAccessibilityWebProcessToken:(NSData *)data;
 
 - (BOOL)_scrollToRect:(CGRect)targetRect withOrigin:(CGPoint)origin minimumScrollDistance:(CGFloat)minimumScrollDistance;

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm	2014-08-27 21:48:02 UTC (rev 173019)
@@ -34,11 +34,9 @@
 #import "SmartMagnificationController.h"
 #import "WKBrowsingContextControllerInternal.h"
 #import "WKBrowsingContextGroupPrivate.h"
-#import "WKGeolocationProviderIOS.h"
 #import "WKInspectorHighlightView.h"
 #import "WKPreferencesInternal.h"
 #import "WKProcessGroupPrivate.h"
-#import "WKProcessPoolInternal.h"
 #import "WKWebViewConfiguration.h"
 #import "WKWebViewInternal.h"
 #import "WebContext.h"
@@ -473,11 +471,6 @@
     [_rootContentView addSubview:rootView];
 }
 
-- (void)_decidePolicyForGeolocationRequestFromOrigin:(WebSecurityOrigin&)origin frame:(WebFrameProxy&)frame request:(GeolocationPermissionRequestProxy&)permissionRequest
-{
-    [[wrapper(_page->process().context()) _geolocationProvider] decidePolicyForGeolocationRequestFromOrigin:toAPI(&origin) frame:toAPI(&frame) request:toAPI(&permissionRequest) window:[self window]];
-}
-
 - (BOOL)_scrollToRect:(CGRect)targetRect withOrigin:(CGPoint)origin minimumScrollDistance:(CGFloat)minimumScrollDistance
 {
     return [_webView _scrollToRect:targetRect origin:origin minimumScrollDistance:minimumScrollDistance];

Modified: trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.h (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.h	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.h	2014-08-27 21:48:02 UTC (rev 173019)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,14 +29,20 @@
 #import <WebKit/WKBase.h>
 
 namespace WebKit {
+class GeolocationPermissionRequestProxy;
 class WebContext;
+class WebFrameProxy;
 }
 
-@class UIWindow;
+namespace WebCore {
+class SecurityOrigin;
+}
 
+@class WKWebView;
+
 @interface WKGeolocationProviderIOS : NSObject
 -(id)initWithContext:(WebKit::WebContext*)context;
--(void)decidePolicyForGeolocationRequestFromOrigin:(WKSecurityOriginRef)origin frame:(WKFrameRef)frame request:(WKGeolocationPermissionRequestRef)permissionRequest window:(UIWindow*)window;
+-(void)decidePolicyForGeolocationRequestFromOrigin:(WebCore::SecurityOrigin&)origin frame:(WebKit::WebFrameProxy&)frame request:(WebKit::GeolocationPermissionRequestProxy&)permissionRequest view:(WKWebView*)view;
 @end
 
 #endif // PLATFORM(IOS)

Modified: trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm (173018 => 173019)


--- trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm	2014-08-27 21:30:55 UTC (rev 173018)
+++ trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm	2014-08-27 21:48:02 UTC (rev 173019)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,12 +29,14 @@
 #if PLATFORM(IOS)
 
 #import "GeolocationPermissionRequestProxy.h"
+#import "WKUIDelegatePrivate.h"
+#import "WKWebView.h"
 #import "WebContext.h"
 #import "WebGeolocationManagerProxy.h"
 #import "WebSecurityOrigin.h"
 #import <WebGeolocationPosition.h>
 #import <WebCore/GeolocationPosition.h>
-#import <WebKit/WKGeolocationPermissionRequest.h>
+#import <WebCore/URL.h>
 #import <wtf/Assertions.h>
 #import <wtf/PassRefPtr.h>
 #import <wtf/RefPtr.h>
@@ -45,6 +47,7 @@
 #import <WebKit/WebGeolocationCoreLocationProvider.h>
 #import <WebKit/WebAllowDenyPolicyListener.h>
 
+using namespace WebCore;
 using namespace WebKit;
 
 #pragma clang diagnostic push
@@ -59,14 +62,14 @@
 @end
 
 namespace WebKit {
-void decidePolicyForGeolocationRequestFromOrigin(WebCore::SecurityOrigin*, const String& urlString, id<WebAllowDenyPolicyListener>, UIWindow*);
+void decidePolicyForGeolocationRequestFromOrigin(SecurityOrigin*, const String& urlString, id<WebAllowDenyPolicyListener>, UIWindow*);
 };
 
 struct GeolocationRequestData {
-    RefPtr<WebCore::SecurityOrigin> origin;
+    RefPtr<SecurityOrigin> origin;
     RefPtr<WebFrameProxy> frame;
     RefPtr<GeolocationPermissionRequestProxy> permissionRequest;
-    RetainPtr<UIWindow> window;
+    RetainPtr<WKWebView> view;
 };
 
 @implementation WKGeolocationProviderIOS {
@@ -150,14 +153,14 @@
     return self;
 }
 
--(void)decidePolicyForGeolocationRequestFromOrigin:(WKSecurityOriginRef)origin frame:(WKFrameRef)frame request:(WKGeolocationPermissionRequestRef)permissionRequest window:(UIWindow*)window
+-(void)decidePolicyForGeolocationRequestFromOrigin:(SecurityOrigin&)origin frame:(WebFrameProxy&)frame request:(GeolocationPermissionRequestProxy&)permissionRequest view:(WKWebView*)contentView
 {
     // Step 1: ask the user if the app can use Geolocation.
     GeolocationRequestData geolocationRequestData;
-    geolocationRequestData.origin = const_cast<WebCore::SecurityOrigin*>(&toImpl(origin)->securityOrigin());
-    geolocationRequestData.frame = toImpl(frame);
-    geolocationRequestData.permissionRequest = toImpl(permissionRequest);
-    geolocationRequestData.window = window;
+    geolocationRequestData.origin = &origin;
+    geolocationRequestData.frame = &frame;
+    geolocationRequestData.permissionRequest = &permissionRequest;
+    geolocationRequestData.view = contentView;
     _requestsWaitingForCoreLocationAuthorization.append(geolocationRequestData);
     [_coreLocationProvider requestGeolocationAuthorization];
 }
@@ -172,8 +175,25 @@
     // Step 2: ask the user if the this particular page can use gelocation.
     Vector<GeolocationRequestData> requests = WTF::move(_requestsWaitingForCoreLocationAuthorization);
     for (const auto& request : requests) {
-        RetainPtr<WKWebAllowDenyPolicyListener> policyListener = adoptNS([[WKWebAllowDenyPolicyListener alloc] initWithPermissionRequestProxy:request.permissionRequest.get()]);
-        decidePolicyForGeolocationRequestFromOrigin(request.origin.get(), request.frame->url(), policyListener.get(), request.window.get());
+        bool requiresUserAuthorization = true;
+
+        id<WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([request.view UIDelegate]);
+        if ([uiDelegate respondsToSelector:@selector(_webView:shouldRequestGeolocationAuthorizationForURL:isMainFrame:mainFrameURL:)]) {
+            const WebFrameProxy* mainFrame = request.frame->page()->mainFrame();
+            bool isMainFrame = request.frame == mainFrame;
+            URL requestFrameURL(URL(), request.frame->url());
+            URL mainFrameURL(URL(), mainFrame->url());
+            requiresUserAuthorization = [uiDelegate _webView:request.view.get()
+                 shouldRequestGeolocationAuthorizationForURL:requestFrameURL
+                                                 isMainFrame:isMainFrame
+                                                mainFrameURL:mainFrameURL];
+        }
+
+        if (requiresUserAuthorization) {
+            RetainPtr<WKWebAllowDenyPolicyListener> policyListener = adoptNS([[WKWebAllowDenyPolicyListener alloc] initWithPermissionRequestProxy:request.permissionRequest.get()]);
+            decidePolicyForGeolocationRequestFromOrigin(request.origin.get(), request.frame->url(), policyListener.get(), [request.view window]);
+        } else
+            request.permissionRequest->allow();
     }
 }
 
@@ -184,7 +204,7 @@
         requestData.permissionRequest->deny();
 }
 
-- (void)positionChanged:(WebCore::GeolocationPosition*)position
+- (void)positionChanged:(GeolocationPosition*)position
 {
     _lastActivePosition = WebGeolocationPosition::create(position->timestamp(), position->latitude(), position->longitude(), position->accuracy(), position->canProvideAltitude(), position->altitude(), position->canProvideAltitudeAccuracy(), position->altitudeAccuracy(), position->canProvideHeading(), position->heading(), position->canProvideSpeed(), position->speed());
     _geolocationManager->providerDidChangePosition(_lastActivePosition.get());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to