Changeset 221764 in webkit
- Timestamp:
- Sep 7, 2017, 3:20:39 PM (8 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r221760 r221764 1 2017-09-07 Alex Christensen <achristensen@webkit.org> 2 3 Clean up Geolocation request handling 4 https://bugs.webkit.org/show_bug.cgi?id=176562 5 6 Reviewed by Tim Horton. 7 8 Instead of passing a GeolocationPermissionRequestProxy& to each client and returning a bool if the request will be handled, 9 pass a Function<void(bool)>&& completionHandler and return the function if it won't be handled. 10 This allows to temporarily support our UIClient/PageClient hybrid design while moving towards a sane design. 11 12 * UIProcess/API/APIUIClient.h: 13 (API::UIClient::Function<void): 14 (API::UIClient::decidePolicyForGeolocationPermissionRequest): Deleted. 15 * UIProcess/API/C/WKAPICast.h: 16 * UIProcess/API/C/WKGeolocationPermissionRequest.cpp: 17 (WKGeolocationPermissionRequestGetTypeID): 18 * UIProcess/API/C/WKPage.cpp: 19 (WKPageSetPageUIClient): 20 * UIProcess/GeolocationPermissionRequestProxy.cpp: 21 (WebKit::GeolocationPermissionRequestProxy::allow): 22 (WebKit::GeolocationPermissionRequestProxy::deny): 23 (WebKit::GeolocationPermissionRequestProxy::invalidate): 24 * UIProcess/GeolocationPermissionRequestProxy.h: 25 (WebKit::GeolocationPermissionRequest::create): 26 (WebKit::GeolocationPermissionRequest::allow): 27 (WebKit::GeolocationPermissionRequest::deny): 28 (WebKit::GeolocationPermissionRequest::GeolocationPermissionRequest): 29 * UIProcess/PageClient.h: 30 (WebKit::PageClient::decidePolicyForGeolocationPermissionRequest): Deleted. 31 * UIProcess/WebPageProxy.cpp: 32 (WebKit::WebPageProxy::requestGeolocationPermissionForFrame): 33 * UIProcess/ios/PageClientImplIOS.h: 34 * UIProcess/ios/PageClientImplIOS.mm: 35 (WebKit::Function<void): 36 (WebKit::PageClientImpl::decidePolicyForGeolocationPermissionRequest): Deleted. 37 * UIProcess/ios/WKContentView.h: 38 * UIProcess/ios/WKGeolocationProviderIOS.h: 39 * UIProcess/ios/WKGeolocationProviderIOS.mm: 40 (-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:completionHandler:view:]): 41 (-[WKGeolocationProviderIOS geolocationAuthorizationGranted]): 42 (-[WKGeolocationProviderIOS geolocationAuthorizationDenied]): 43 (-[WKWebAllowDenyPolicyListener initWithCompletionHandler:]): 44 (-[WKWebAllowDenyPolicyListener allow]): 45 (-[WKWebAllowDenyPolicyListener deny]): 46 (-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:view:]): Deleted. 47 (-[WKWebAllowDenyPolicyListener initWithPermissionRequestProxy:]): Deleted. 48 1 49 2017-09-07 Alex Christensen <achristensen@webkit.org> 2 50 -
trunk/Source/WebKit/UIProcess/API/APIUIClient.h
r221743 r221764 45 45 46 46 namespace WebKit { 47 class GeolocationPermissionRequestProxy;48 47 class NativeWebKeyboardEvent; 49 48 class NativeWebWheelEvent; … … 128 127 129 128 virtual bool runOpenPanel(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, OpenPanelParameters*, WebKit::WebOpenPanelResultListenerProxy*) { return false; } 130 virtual bool decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, WebKit::GeolocationPermissionRequestProxy&) { return false; }129 virtual Function<void(bool)> decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, Function<void(bool)>&& completionHandler) { return WTFMove(completionHandler); } 131 130 virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; } 132 131 virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; } -
trunk/Source/WebKit/UIProcess/API/C/WKAPICast.h
r217531 r221764 78 78 class AuthenticationDecisionListener; 79 79 class DownloadProxy; 80 class GeolocationPermissionRequest Proxy;80 class GeolocationPermissionRequest; 81 81 class NotificationPermissionRequest; 82 82 class UserMediaPermissionCheckProxy; … … 132 132 WK_ADD_API_MAPPING(WKFrameRef, WebFrameProxy) 133 133 WK_ADD_API_MAPPING(WKGeolocationManagerRef, WebGeolocationManagerProxy) 134 WK_ADD_API_MAPPING(WKGeolocationPermissionRequestRef, GeolocationPermissionRequest Proxy)134 WK_ADD_API_MAPPING(WKGeolocationPermissionRequestRef, GeolocationPermissionRequest) 135 135 WK_ADD_API_MAPPING(WKGeolocationPositionRef, WebGeolocationPosition) 136 136 WK_ADD_API_MAPPING(WKHitTestResultRef, API::HitTestResult) -
trunk/Source/WebKit/UIProcess/API/C/WKGeolocationPermissionRequest.cpp
r95901 r221764 34 34 WKTypeID WKGeolocationPermissionRequestGetTypeID() 35 35 { 36 return toAPI(GeolocationPermissionRequest Proxy::APIType);36 return toAPI(GeolocationPermissionRequest::APIType); 37 37 } 38 38 -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r221743 r221764 1954 1954 } 1955 1955 1956 bool decidePolicyForGeolocationPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& origin, GeolocationPermissionRequestProxy& permissionRequest) final1956 Function<void(bool)> decidePolicyForGeolocationPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& origin, Function<void(bool)>&& completionHandler) final 1957 1957 { 1958 1958 if (!m_client.decidePolicyForGeolocationPermissionRequest) 1959 return false;1960 1961 m_client.decidePolicyForGeolocationPermissionRequest(toAPI(&page), toAPI(&frame), toAPI(&origin), toAPI( &permissionRequest), m_client.base.clientInfo);1962 return true;1959 return WTFMove(completionHandler); 1960 1961 m_client.decidePolicyForGeolocationPermissionRequest(toAPI(&page), toAPI(&frame), toAPI(&origin), toAPI(GeolocationPermissionRequest::create(WTFMove(completionHandler)).ptr()), m_client.base.clientInfo); 1962 return nullptr; 1963 1963 } 1964 1964 -
trunk/Source/WebKit/UIProcess/API/glib/WebKitGeolocationPermissionRequest.cpp
r221132 r221764 61 61 62 62 struct _WebKitGeolocationPermissionRequestPrivate { 63 RefPtr<GeolocationPermissionRequest Proxy> request;63 RefPtr<GeolocationPermissionRequest> request; 64 64 bool madeDecision; 65 65 }; … … 116 116 } 117 117 118 WebKitGeolocationPermissionRequest* webkitGeolocationPermissionRequestCreate(GeolocationPermissionRequest Proxy* request)118 WebKitGeolocationPermissionRequest* webkitGeolocationPermissionRequestCreate(GeolocationPermissionRequest* request) 119 119 { 120 120 WebKitGeolocationPermissionRequest* geolocationPermissionRequest = WEBKIT_GEOLOCATION_PERMISSION_REQUEST(g_object_new(WEBKIT_TYPE_GEOLOCATION_PERMISSION_REQUEST, NULL)); -
trunk/Source/WebKit/UIProcess/API/glib/WebKitGeolocationPermissionRequestPrivate.h
r218487 r221764 22 22 #include "WebKitGeolocationPermissionRequest.h" 23 23 24 WebKitGeolocationPermissionRequest* webkitGeolocationPermissionRequestCreate(WebKit::GeolocationPermissionRequest Proxy*);24 WebKitGeolocationPermissionRequest* webkitGeolocationPermissionRequestCreate(WebKit::GeolocationPermissionRequest*); -
trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp
r221743 r221764 183 183 } 184 184 185 bool decidePolicyForGeolocationPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, GeolocationPermissionRequestProxy& permissionRequest) final186 { 187 GRefPtr<WebKitGeolocationPermissionRequest> geolocationPermissionRequest = adoptGRef(webkitGeolocationPermissionRequestCreate( &permissionRequest));185 Function<void(bool)> decidePolicyForGeolocationPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, Function<void(bool)>&& completionHandler) final 186 { 187 GRefPtr<WebKitGeolocationPermissionRequest> geolocationPermissionRequest = adoptGRef(webkitGeolocationPermissionRequestCreate(GeolocationPermissionRequest::create(WTFMove(completionHandler)).ptr())); 188 188 webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(geolocationPermissionRequest.get())); 189 return true;189 return nullptr; 190 190 } 191 191 -
trunk/Source/WebKit/UIProcess/GeolocationPermissionRequestProxy.cpp
r95901 r221764 43 43 44 44 m_manager->didReceiveGeolocationPermissionDecision(m_geolocationID, true); 45 m_manager = 0;45 m_manager = nullptr; 46 46 } 47 47 … … 52 52 53 53 m_manager->didReceiveGeolocationPermissionDecision(m_geolocationID, false); 54 m_manager = 0;54 m_manager = nullptr; 55 55 } 56 56 57 57 void GeolocationPermissionRequestProxy::invalidate() 58 58 { 59 m_manager = 0;59 m_manager = nullptr; 60 60 } 61 61 -
trunk/Source/WebKit/UIProcess/GeolocationPermissionRequestProxy.h
r204466 r221764 24 24 */ 25 25 26 #ifndef GeolocationPermissionRequestProxy_h 27 #define GeolocationPermissionRequestProxy_h 26 #pragma once 28 27 29 28 #include "APIObject.h" 29 #include <wtf/Function.h> 30 30 31 31 namespace WebKit { … … 33 33 class GeolocationPermissionRequestManagerProxy; 34 34 35 class GeolocationPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::GeolocationPermissionRequest> {35 class GeolocationPermissionRequestProxy : public RefCounted<GeolocationPermissionRequestProxy> { 36 36 public: 37 37 static Ref<GeolocationPermissionRequestProxy> create(GeolocationPermissionRequestManagerProxy* manager, uint64_t geolocationID) … … 52 52 }; 53 53 54 class GeolocationPermissionRequest : public API::ObjectImpl<API::Object::Type::GeolocationPermissionRequest> { 55 public: 56 static Ref<GeolocationPermissionRequest> create(Function<void(bool)>&& completionHandler) 57 { 58 return adoptRef(*new GeolocationPermissionRequest(WTFMove(completionHandler))); 59 } 60 61 void allow() { m_completionHandler(true); } 62 void deny() { m_completionHandler(false); } 63 64 private: 65 GeolocationPermissionRequest(Function<void(bool)>&& completionHandler) 66 : m_completionHandler(WTFMove(completionHandler)) 67 { } 68 69 Function<void(bool)> m_completionHandler; 70 }; 71 54 72 } // namespace WebKit 55 56 #endif // GeolocationPermissionRequestProxy_h -
trunk/Source/WebKit/UIProcess/PageClient.h
r221707 r221764 142 142 virtual void toolTipChanged(const String&, const String&) = 0; 143 143 144 virtual bool decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, API::SecurityOrigin&, GeolocationPermissionRequestProxy&)145 {146 return false;147 } 144 #if PLATFORM(IOS) 145 // FIXME: Adopt the WKUIDelegatePrivate callback on iOS and remove this. 146 virtual Function<void(bool)> decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, API::SecurityOrigin&, Function<void(bool)>&&) = 0; 147 #endif 148 148 149 149 virtual void didStartProvisionalLoadForMainFrame() { }; -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r221743 r221764 5812 5812 auto origin = API::SecurityOrigin::create(SecurityOriginData::fromDatabaseIdentifier(originIdentifier)->securityOrigin()); 5813 5813 auto request = m_geolocationPermissionRequestManager.createRequest(geolocationID); 5814 5815 if (m_uiClient->decidePolicyForGeolocationPermissionRequest(*this, *frame, origin.get(), request.get())) 5816 return; 5817 5818 if (m_pageClient.decidePolicyForGeolocationPermissionRequest(*frame, origin.get(), request.get())) 5819 return; 5820 5821 request->deny(); 5814 Function<void(bool)> completionHandler = [request = WTFMove(request)](bool allowed) { 5815 if (allowed) 5816 request->allow(); 5817 else 5818 request->deny(); 5819 }; 5820 5821 // FIXME: Once iOS migrates to the new WKUIDelegate SPI, clean this up 5822 // and make it one UIClient call that calls the completionHandler with false 5823 // if there is no delegate instead of returning the completionHandler 5824 // for other code paths to try. 5825 completionHandler = m_uiClient->decidePolicyForGeolocationPermissionRequest(*this, *frame, origin.get(), WTFMove(completionHandler)); 5826 #if PLATFORM(IOS) 5827 if (completionHandler) 5828 completionHandler = m_pageClient.decidePolicyForGeolocationPermissionRequest(*frame, origin.get(), WTFMove(completionHandler)); 5829 #endif 5830 if (completionHandler) 5831 completionHandler(false); 5822 5832 } 5823 5833 -
trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h
r221660 r221764 64 64 void preferencesDidChange() override; 65 65 void toolTipChanged(const String&, const String&) override; 66 bool decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, API::SecurityOrigin&, GeolocationPermissionRequestProxy&) override;66 Function<void(bool)> decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, API::SecurityOrigin&, Function<void(bool)>&&) override; 67 67 void didStartProvisionalLoadForMainFrame() override; 68 68 void didFailProvisionalLoadForMainFrame() override; -
trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm
r221660 r221764 238 238 } 239 239 240 bool PageClientImpl::decidePolicyForGeolocationPermissionRequest(WebFrameProxy& frame, API::SecurityOrigin& origin, GeolocationPermissionRequestProxy& request)241 { 242 [[wrapper(m_webView->_page->process().processPool()) _geolocationProvider] decidePolicyForGeolocationRequestFromOrigin:origin.securityOrigin() frame:frame request:requestview:m_webView];243 return true;240 Function<void(bool)> PageClientImpl::decidePolicyForGeolocationPermissionRequest(WebFrameProxy& frame, API::SecurityOrigin& origin, Function<void(bool)>&& completionHandler) 241 { 242 [[wrapper(m_webView->_page->process().processPool()) _geolocationProvider] decidePolicyForGeolocationRequestFromOrigin:origin.securityOrigin() frame:frame completionHandler:WTFMove(completionHandler) view:m_webView]; 243 return nullptr; 244 244 } 245 245 -
trunk/Source/WebKit/UIProcess/ios/WKContentView.h
r216047 r221764 44 44 namespace WebKit { 45 45 class DrawingAreaProxy; 46 class GeolocationPermissionRequestProxy;47 46 class RemoteLayerTreeTransaction; 48 47 class WebFrameProxy; -
trunk/Source/WebKit/UIProcess/ios/WKGeolocationProviderIOS.h
r180441 r221764 28 28 #import <Foundation/NSObject.h> 29 29 #import <WebKit/WKBase.h> 30 #import <wtf/Function.h> 30 31 31 32 namespace WebKit { 32 class GeolocationPermissionRequestProxy;33 33 class WebFrameProxy; 34 34 class WebProcessPool; … … 43 43 @interface WKGeolocationProviderIOS : NSObject 44 44 -(id)initWithProcessPool:(WebKit::WebProcessPool&)processPool; 45 -(void)decidePolicyForGeolocationRequestFromOrigin:(WebCore::SecurityOrigin&)origin frame:(WebKit::WebFrameProxy&)frame request:(WebKit::GeolocationPermissionRequestProxy&)permissionRequestview:(WKWebView*)view;45 -(void)decidePolicyForGeolocationRequestFromOrigin:(WebCore::SecurityOrigin&)origin frame:(WebKit::WebFrameProxy&)frame completionHandler:(Function<void(bool)>&&)completionHandler view:(WKWebView*)view; 46 46 @end 47 47 -
trunk/Source/WebKit/UIProcess/ios/WKGeolocationProviderIOS.mm
r218165 r221764 32 32 #import "APISecurityOrigin.h" 33 33 #import "CompletionHandlerCallChecker.h" 34 #import "GeolocationPermissionRequestProxy.h"35 34 #import "WKFrameInfoInternal.h" 36 35 #import "WKGeolocationManager.h" … … 68 67 69 68 @interface WKWebAllowDenyPolicyListener : NSObject<WebAllowDenyPolicyListener> 70 - (id)initWith PermissionRequestProxy:(RefPtr<GeolocationPermissionRequestProxy>&&)permissionRequestProxy;69 - (id)initWithCompletionHandler:(Function<void(bool)>&&)completionHandler; 71 70 - (void)denyOnlyThisRequest NO_RETURN_DUE_TO_ASSERT; 72 71 @end … … 84 83 RefPtr<SecurityOrigin> origin; 85 84 RefPtr<WebFrameProxy> frame; 86 RefPtr<GeolocationPermissionRequestProxy> permissionRequest;85 Function<void(bool)> completionHandler; 87 86 RetainPtr<WKWebView> view; 88 87 }; … … 169 168 } 170 169 171 -(void)decidePolicyForGeolocationRequestFromOrigin:(SecurityOrigin&)origin frame:(WebFrameProxy&)frame request:(GeolocationPermissionRequestProxy&)permissionRequestview:(WKWebView*)contentView170 -(void)decidePolicyForGeolocationRequestFromOrigin:(SecurityOrigin&)origin frame:(WebFrameProxy&)frame completionHandler:(Function<void(bool)>&&)completionHandler view:(WKWebView*)contentView 172 171 { 173 172 // Step 1: ask the user if the app can use Geolocation. … … 175 174 geolocationRequestData.origin = &origin; 176 175 geolocationRequestData.frame = &frame; 177 geolocationRequestData. permissionRequest = &permissionRequest;176 geolocationRequestData.completionHandler = WTFMove(completionHandler); 178 177 geolocationRequestData.view = contentView; 179 _requestsWaitingForCoreLocationAuthorization.append( geolocationRequestData);178 _requestsWaitingForCoreLocationAuthorization.append(WTFMove(geolocationRequestData)); 180 179 [_coreLocationProvider requestGeolocationAuthorization]; 181 180 } … … 190 189 // Step 2: ask the user if the this particular page can use gelocation. 191 190 Vector<GeolocationRequestData> requests = WTFMove(_requestsWaitingForCoreLocationAuthorization); 192 for ( constauto& request : requests) {191 for (auto& request : requests) { 193 192 bool requiresUserAuthorization = true; 194 193 … … 198 197 RetainPtr<WKFrameInfo> frameInfo = wrapper(API::FrameInfo::create(*request.frame.get(), *request.origin.get())); 199 198 RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(uiDelegate, @selector(_webView:requestGeolocationAuthorizationForURL:frame:decisionHandler:)); 200 [uiDelegate _webView:request.view.get() requestGeolocationAuthorizationForURL:requestFrameURL frame:frameInfo.get() decisionHandler:BlockPtr<void(BOOL)>::fromCallable([request, checker = WTFMove(checker)](BOOL authorized) { 199 WKWebView *viewFromRequest = request.view.get(); 200 [uiDelegate _webView:viewFromRequest requestGeolocationAuthorizationForURL:requestFrameURL frame:frameInfo.get() decisionHandler:BlockPtr<void(BOOL)>::fromCallable([request = WTFMove(request), checker = WTFMove(checker)](BOOL authorized) { 201 201 if (checker->completionHandlerHasBeenCalled()) 202 202 return; 203 if (authorized)204 request.permissionRequest->allow();205 else206 request.permissionRequest->deny();207 203 checker->didCallCompletionHandler(); 204 request.completionHandler(authorized); 208 205 }).get()]; 209 206 return; … … 222 219 223 220 if (requiresUserAuthorization) { 224 RetainPtr<WKWebAllowDenyPolicyListener> policyListener = adoptNS([[WKWebAllowDenyPolicyListener alloc] initWith PermissionRequestProxy:request.permissionRequest.get()]);221 RetainPtr<WKWebAllowDenyPolicyListener> policyListener = adoptNS([[WKWebAllowDenyPolicyListener alloc] initWithCompletionHandler:WTFMove(request.completionHandler)]); 225 222 decidePolicyForGeolocationRequestFromOrigin(request.origin.get(), request.frame->url(), policyListener.get(), [request.view window]); 226 223 } else 227 request. permissionRequest->allow();224 request.completionHandler(true); 228 225 } 229 226 } … … 233 230 Vector<GeolocationRequestData> requests = WTFMove(_requestsWaitingForCoreLocationAuthorization); 234 231 for (const auto& requestData : requests) 235 requestData. permissionRequest->deny();232 requestData.completionHandler(false); 236 233 } 237 234 … … 331 328 # pragma mark - Implementation of WKWebAllowDenyPolicyListener 332 329 @implementation WKWebAllowDenyPolicyListener { 333 RefPtr<GeolocationPermissionRequestProxy> _permissionRequestProxy;334 } 335 336 - (id)initWith PermissionRequestProxy:(RefPtr<GeolocationPermissionRequestProxy>&&)permissionRequestProxy330 Function<void(bool)> _completionHandler; 331 } 332 333 - (id)initWithCompletionHandler:(Function<void(bool)>&&)completionHandler 337 334 { 338 335 self = [super init]; … … 340 337 return nil; 341 338 342 _ permissionRequestProxy = WTFMove(permissionRequestProxy);339 _completionHandler = WTFMove(completionHandler); 343 340 return self; 344 341 } … … 346 343 - (void)allow 347 344 { 348 _ permissionRequestProxy->allow();345 _completionHandler(true); 349 346 } 350 347 351 348 - (void)deny 352 349 { 353 _ permissionRequestProxy->deny();350 _completionHandler(false); 354 351 } 355 352
Note:
See TracChangeset
for help on using the changeset viewer.