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());