Changeset 173019 in webkit


Ignore:
Timestamp:
Aug 27, 2014, 2:48:02 PM (11 years ago)
Author:
benjamin@webkit.org
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 <bpoulain@apple.com> 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.

Location:
trunk/Source/WebKit2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r173014 r173019  
     12014-08-27  Benjamin Poulain  <bpoulain@apple.com>
     2
     3        [iOS WK2] Provide a delegate callback to skip Geolocation authorization per page for WebApp
     4        https://bugs.webkit.org/show_bug.cgi?id=136243
     5
     6        Reviewed by Sam Weinig.
     7
     8        Just ask the UI if the authorization dialog needs to be skipped.
     9
     10        * UIProcess/API/Cocoa/WKUIDelegate.h:
     11        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
     12        * UIProcess/ios/PageClientImplIOS.mm:
     13        (WebKit::PageClientImpl::decidePolicyForGeolocationPermissionRequest):
     14
     15        * UIProcess/ios/WKContentView.h:
     16        * UIProcess/ios/WKContentView.mm:
     17        (-[WKContentView _decidePolicyForGeolocationRequestFromOrigin:frame:request:]): Deleted.
     18        The code in WKContentView only exists due to legacy. Instead, the PageClient dispatch the request
     19        to the GeolocationProvider directly.
     20
     21        * UIProcess/ios/WKGeolocationProviderIOS.h:
     22        * UIProcess/ios/WKGeolocationProviderIOS.mm:
     23        (-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:view:]):
     24        (-[WKGeolocationProviderIOS geolocationAuthorizationGranted]):
     25        (-[WKGeolocationProviderIOS positionChanged:]):
     26        (-[WKGeolocationProviderIOS decidePolicyForGeolocationRequestFromOrigin:frame:request:window:]): Deleted.
     27
    1282014-08-27  Beth Dakin  <bdakin@apple.com>
    229
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h

    r170214 r173019  
    3131
    3232@class WKFrameInfo;
     33@class WKNavigationAction;
    3334@class WKWebViewConfiguration;
    3435@class WKWindowFeatures;
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h

    r170320 r173019  
    4949- (void)_webView:(WKWebView *)webView didNotHandleTapAsClickAtPoint:(CGPoint)point;
    5050- (void)_webView:(WKWebView *)webView usesMinimalUI:(BOOL)wantMinimalUI;
     51- (bool)_webView:(WKWebView *)webView shouldRequestGeolocationAuthorizationForURL:(NSURL *)url isMainFrame:(BOOL)isMainFrame mainFrameURL:(NSURL *)mainFrameURL;
    5152#endif
    5253
  • trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm

    r172966 r173019  
    3939#import "WKContentView.h"
    4040#import "WKContentViewInteraction.h"
     41#import "WKGeolocationProviderIOS.h"
     42#import "WKProcessPoolInternal.h"
    4143#import "WKWebViewConfigurationInternal.h"
    4244#import "WKWebViewContentProviderRegistry.h"
     
    229231bool PageClientImpl::decidePolicyForGeolocationPermissionRequest(WebFrameProxy& frame, WebSecurityOrigin& origin, GeolocationPermissionRequestProxy& request)
    230232{
    231     [m_contentView _decidePolicyForGeolocationRequestFromOrigin:origin frame:frame request:request];
     233    [[wrapper(m_webView->_page->process().context()) _geolocationProvider] decidePolicyForGeolocationRequestFromOrigin:origin.securityOrigin() frame:frame request:request view:m_webView];
    232234    return true;
    233235}
  • trunk/Source/WebKit2/UIProcess/ios/WKContentView.h

    r171663 r173019  
    8686- (void)_didCommitLayerTree:(const WebKit::RemoteLayerTreeTransaction&)layerTreeTransaction;
    8787
    88 - (void)_decidePolicyForGeolocationRequestFromOrigin:(WebKit::WebSecurityOrigin&)origin frame:(WebKit::WebFrameProxy&)frame request:(WebKit::GeolocationPermissionRequestProxy&)permissionRequest;
    89 
    9088- (void)_setAccessibilityWebProcessToken:(NSData *)data;
    9189
  • trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm

    r171663 r173019  
    3535#import "WKBrowsingContextControllerInternal.h"
    3636#import "WKBrowsingContextGroupPrivate.h"
    37 #import "WKGeolocationProviderIOS.h"
    3837#import "WKInspectorHighlightView.h"
    3938#import "WKPreferencesInternal.h"
    4039#import "WKProcessGroupPrivate.h"
    41 #import "WKProcessPoolInternal.h"
    4240#import "WKWebViewConfiguration.h"
    4341#import "WKWebViewInternal.h"
     
    474472}
    475473
    476 - (void)_decidePolicyForGeolocationRequestFromOrigin:(WebSecurityOrigin&)origin frame:(WebFrameProxy&)frame request:(GeolocationPermissionRequestProxy&)permissionRequest
    477 {
    478     [[wrapper(_page->process().context()) _geolocationProvider] decidePolicyForGeolocationRequestFromOrigin:toAPI(&origin) frame:toAPI(&frame) request:toAPI(&permissionRequest) window:[self window]];
    479 }
    480 
    481474- (BOOL)_scrollToRect:(CGRect)targetRect withOrigin:(CGPoint)origin minimumScrollDistance:(CGFloat)minimumScrollDistance
    482475{
  • trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.h

    r168541 r173019  
    11/*
    2  * Copyright (C) 2012 Apple Inc. All rights reserved.
     2 * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3030
    3131namespace WebKit {
     32class GeolocationPermissionRequestProxy;
    3233class WebContext;
     34class WebFrameProxy;
    3335}
    3436
    35 @class UIWindow;
     37namespace WebCore {
     38class SecurityOrigin;
     39}
     40
     41@class WKWebView;
    3642
    3743@interface WKGeolocationProviderIOS : NSObject
    3844-(id)initWithContext:(WebKit::WebContext*)context;
    39 -(void)decidePolicyForGeolocationRequestFromOrigin:(WKSecurityOriginRef)origin frame:(WKFrameRef)frame request:(WKGeolocationPermissionRequestRef)permissionRequest window:(UIWindow*)window;
     45-(void)decidePolicyForGeolocationRequestFromOrigin:(WebCore::SecurityOrigin&)origin frame:(WebKit::WebFrameProxy&)frame request:(WebKit::GeolocationPermissionRequestProxy&)permissionRequest view:(WKWebView*)view;
    4046@end
    4147
  • trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm

    r170774 r173019  
    11/*
    2  * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3030
    3131#import "GeolocationPermissionRequestProxy.h"
     32#import "WKUIDelegatePrivate.h"
     33#import "WKWebView.h"
    3234#import "WebContext.h"
    3335#import "WebGeolocationManagerProxy.h"
     
    3537#import <WebGeolocationPosition.h>
    3638#import <WebCore/GeolocationPosition.h>
    37 #import <WebKit/WKGeolocationPermissionRequest.h>
     39#import <WebCore/URL.h>
    3840#import <wtf/Assertions.h>
    3941#import <wtf/PassRefPtr.h>
     
    4648#import <WebKit/WebAllowDenyPolicyListener.h>
    4749
     50using namespace WebCore;
    4851using namespace WebKit;
    4952
     
    6063
    6164namespace WebKit {
    62 void decidePolicyForGeolocationRequestFromOrigin(WebCore::SecurityOrigin*, const String& urlString, id<WebAllowDenyPolicyListener>, UIWindow*);
     65void decidePolicyForGeolocationRequestFromOrigin(SecurityOrigin*, const String& urlString, id<WebAllowDenyPolicyListener>, UIWindow*);
    6366};
    6467
    6568struct GeolocationRequestData {
    66     RefPtr<WebCore::SecurityOrigin> origin;
     69    RefPtr<SecurityOrigin> origin;
    6770    RefPtr<WebFrameProxy> frame;
    6871    RefPtr<GeolocationPermissionRequestProxy> permissionRequest;
    69     RetainPtr<UIWindow> window;
     72    RetainPtr<WKWebView> view;
    7073};
    7174
     
    151154}
    152155
    153 -(void)decidePolicyForGeolocationRequestFromOrigin:(WKSecurityOriginRef)origin frame:(WKFrameRef)frame request:(WKGeolocationPermissionRequestRef)permissionRequest window:(UIWindow*)window
     156-(void)decidePolicyForGeolocationRequestFromOrigin:(SecurityOrigin&)origin frame:(WebFrameProxy&)frame request:(GeolocationPermissionRequestProxy&)permissionRequest view:(WKWebView*)contentView
    154157{
    155158    // Step 1: ask the user if the app can use Geolocation.
    156159    GeolocationRequestData geolocationRequestData;
    157     geolocationRequestData.origin = const_cast<WebCore::SecurityOrigin*>(&toImpl(origin)->securityOrigin());
    158     geolocationRequestData.frame = toImpl(frame);
    159     geolocationRequestData.permissionRequest = toImpl(permissionRequest);
    160     geolocationRequestData.window = window;
     160    geolocationRequestData.origin = &origin;
     161    geolocationRequestData.frame = &frame;
     162    geolocationRequestData.permissionRequest = &permissionRequest;
     163    geolocationRequestData.view = contentView;
    161164    _requestsWaitingForCoreLocationAuthorization.append(geolocationRequestData);
    162165    [_coreLocationProvider requestGeolocationAuthorization];
     
    173176    Vector<GeolocationRequestData> requests = WTF::move(_requestsWaitingForCoreLocationAuthorization);
    174177    for (const auto& request : requests) {
    175         RetainPtr<WKWebAllowDenyPolicyListener> policyListener = adoptNS([[WKWebAllowDenyPolicyListener alloc] initWithPermissionRequestProxy:request.permissionRequest.get()]);
    176         decidePolicyForGeolocationRequestFromOrigin(request.origin.get(), request.frame->url(), policyListener.get(), request.window.get());
     178        bool requiresUserAuthorization = true;
     179
     180        id<WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([request.view UIDelegate]);
     181        if ([uiDelegate respondsToSelector:@selector(_webView:shouldRequestGeolocationAuthorizationForURL:isMainFrame:mainFrameURL:)]) {
     182            const WebFrameProxy* mainFrame = request.frame->page()->mainFrame();
     183            bool isMainFrame = request.frame == mainFrame;
     184            URL requestFrameURL(URL(), request.frame->url());
     185            URL mainFrameURL(URL(), mainFrame->url());
     186            requiresUserAuthorization = [uiDelegate _webView:request.view.get()
     187                 shouldRequestGeolocationAuthorizationForURL:requestFrameURL
     188                                                 isMainFrame:isMainFrame
     189                                                mainFrameURL:mainFrameURL];
     190        }
     191
     192        if (requiresUserAuthorization) {
     193            RetainPtr<WKWebAllowDenyPolicyListener> policyListener = adoptNS([[WKWebAllowDenyPolicyListener alloc] initWithPermissionRequestProxy:request.permissionRequest.get()]);
     194            decidePolicyForGeolocationRequestFromOrigin(request.origin.get(), request.frame->url(), policyListener.get(), [request.view window]);
     195        } else
     196            request.permissionRequest->allow();
    177197    }
    178198}
     
    185205}
    186206
    187 - (void)positionChanged:(WebCore::GeolocationPosition*)position
     207- (void)positionChanged:(GeolocationPosition*)position
    188208{
    189209    _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());
Note: See TracChangeset for help on using the changeset viewer.