Changeset 253343 in webkit


Ignore:
Timestamp:
Dec 10, 2019 1:27:22 PM (4 years ago)
Author:
Chris Dumez
Message:

Gyroscope (DeviceMotion related) permission cannot be requested in WKWebView unless the client app sets a WKUIDelegate
https://bugs.webkit.org/show_bug.cgi?id=203287

Reviewed by Alex Christensen.

Source/WebKit:

Device orientation / motion events permission dialog would not be shown unless the client app
set a WKUIDelegate on the WKWebView, even though we do not need this WKUIDelegate to show the
prompt.

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _deviceOrientationUserPermissionHandler]):
(-[WKWebView _setDeviceOrientationUserPermissionHandler:]):

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::UIDelegate::UIClient::shouldAllowDeviceOrientationAndMotionAccess):

  • UIProcess/Cocoa/WKOrientationAccessAlert.mm:

(WebKit::presentOrientationAccessAlert):

Tools:

Add layout test coverage.

  • TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm:

(runDeviceOrientationTest):
(TEST):

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r253342 r253343  
     12019-12-10  Chris Dumez  <cdumez@apple.com>
     2
     3        Gyroscope (DeviceMotion related) permission cannot be requested in WKWebView unless the client app sets a WKUIDelegate
     4        https://bugs.webkit.org/show_bug.cgi?id=203287
     5
     6        Reviewed by Alex Christensen.
     7
     8        Device orientation / motion events permission dialog would not be shown unless the client app
     9        set a WKUIDelegate on the WKWebView, even though we do not need this WKUIDelegate to show the
     10        prompt.
     11
     12        * UIProcess/API/Cocoa/WKWebView.mm:
     13        (-[WKWebView _deviceOrientationUserPermissionHandler]):
     14        (-[WKWebView _setDeviceOrientationUserPermissionHandler:]):
     15        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     16        * UIProcess/Cocoa/UIDelegate.mm:
     17        (WebKit::UIDelegate::UIClient::shouldAllowDeviceOrientationAndMotionAccess):
     18        * UIProcess/Cocoa/WKOrientationAccessAlert.mm:
     19        (WebKit::presentOrientationAccessAlert):
     20
    1212019-12-10  Chris Dumez  <cdumez@apple.com>
    222
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r253216 r253343  
    69746974}
    69756975
     6976- (void)_setDeviceOrientationUserPermissionHandlerForTesting:(BOOL (^)())handler
     6977{
     6978    Function<bool()> handlerWrapper;
     6979    if (handler)
     6980        handlerWrapper = [handler = makeBlockPtr(handler)] { return handler(); };
     6981    _page->setDeviceOrientationUserPermissionHandlerForTesting(WTFMove(handlerWrapper));
     6982}
     6983
    69766984- (void)_accessibilityStoreSelection
    69776985{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r253037 r253343  
    508508
    509509- (void)_triggerSystemPreviewActionOnElement:(uint64_t)elementID document:(uint64_t)documentID page:(uint64_t)pageID WK_API_AVAILABLE(ios(WK_IOS_TBA));
     510
     511- (void)_setDeviceOrientationUserPermissionHandlerForTesting:(BOOL (^)())handler WK_API_AVAILABLE(ios(WK_IOS_TBA));
    510512
    511513@property (nonatomic, readonly) BOOL _contentViewIsFirstResponder WK_API_AVAILABLE(ios(12.2));
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm

    r252634 r253343  
    866866void UIDelegate::UIClient::shouldAllowDeviceOrientationAndMotionAccess(WebKit::WebPageProxy&, WebFrameProxy& webFrameProxy, WebCore::SecurityOriginData&& securityOriginData, CompletionHandler<void(bool)>&& completionHandler)
    867867{
    868     auto delegate = m_uiDelegate.m_delegate.get();
    869     if (!delegate)
    870         return completionHandler(false);
    871 
    872868    if (!m_uiDelegate.m_delegateMethods.webViewShouldAllowDeviceOrientationAndMotionAccessRequestedByFrameDecisionHandler) {
    873869        presentOrientationAccessAlert(m_uiDelegate.m_webView, securityOriginData.host, WTFMove(completionHandler));
    874870        return;
    875871    }
     872
     873    auto delegate = m_uiDelegate.m_delegate.get();
     874    if (!delegate)
     875        return completionHandler(false);
    876876
    877877    auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:shouldAllowDeviceOrientationAndMotionAccessRequestedByFrame:decisionHandler:));
  • trunk/Source/WebKit/UIProcess/Cocoa/WKOrientationAccessAlert.mm

    r244742 r253343  
    3030
    3131#import "WKWebViewInternal.h"
     32#import "WKWebViewPrivate.h"
     33#import "WebPageProxy.h"
    3234#import <WebCore/LocalizedStrings.h>
    3335#import <wtf/text/WTFString.h>
     
    3739void presentOrientationAccessAlert(WKWebView *view, const String& host, CompletionHandler<void(bool)>&& completionHandler)
    3840{
     41    if (auto& userPermissionHandler = view._page->deviceOrientationUserPermissionHandlerForTesting())
     42        return completionHandler(userPermissionHandler());
     43
    3944    NSString *alertText = [NSString stringWithFormat:WEB_UI_NSSTRING(@"“%@” Would Like to Access Motion and Orientation", @"Message for requesting access to the device motion and orientation"), (NSString *)host];
    4045    UIAlertController* alert = [UIAlertController alertControllerWithTitle:alertText message:nil preferredStyle:UIAlertControllerStyleAlert];
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r253337 r253343  
    14221422    void setIsKeyboardAnimatingIn(bool isKeyboardAnimatingIn) { m_isKeyboardAnimatingIn = isKeyboardAnimatingIn; }
    14231423    bool waitingForPostLayoutEditorStateUpdateAfterFocusingElement() const { return m_waitingForPostLayoutEditorStateUpdateAfterFocusingElement; }
     1424    const Function<bool()>& deviceOrientationUserPermissionHandlerForTesting() const { return m_deviceOrientationUserPermissionHandlerForTesting; };
     1425    void setDeviceOrientationUserPermissionHandlerForTesting(Function<bool()>&& handler) { m_deviceOrientationUserPermissionHandlerForTesting = WTFMove(handler); }
    14241426#endif
    14251427
     
    25572559
    25582560#if PLATFORM(IOS_FAMILY)
     2561    Function<bool()> m_deviceOrientationUserPermissionHandlerForTesting;
    25592562    std::unique_ptr<ElementDidFocusArguments> m_deferredElementDidFocusArguments;
    25602563    bool m_waitingForPostLayoutEditorStateUpdateAfterFocusingElement { false };
  • trunk/Tools/ChangeLog

    r253331 r253343  
     12019-12-10  Chris Dumez  <cdumez@apple.com>
     2
     3        Gyroscope (DeviceMotion related) permission cannot be requested in WKWebView unless the client app sets a WKUIDelegate
     4        https://bugs.webkit.org/show_bug.cgi?id=203287
     5
     6        Reviewed by Alex Christensen.
     7
     8        Add layout test coverage.
     9
     10        * TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm:
     11        (runDeviceOrientationTest):
     12        (TEST):
     13
    1142019-12-10  youenn fablet  <youenn@apple.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm

    r248957 r253343  
    8383@end
    8484
    85 enum class DeviceOrientationPermission { Granted, Denied, Default };
     85enum class DeviceOrientationPermission { GrantedByClient, DeniedByClient, GrantedByUser, DeniedByUser };
    8686static void runDeviceOrientationTest(DeviceOrientationPermission deviceOrientationPermission)
    8787{
     
    9595    RetainPtr<DeviceOrientationPermissionUIDelegate> uiDelegate;
    9696    switch (deviceOrientationPermission) {
    97     case DeviceOrientationPermission::Granted:
     97    case DeviceOrientationPermission::GrantedByClient:
    9898        uiDelegate = adoptNS([[DeviceOrientationPermissionUIDelegate alloc] initWithHandler:[] { return true; }]);
    9999        break;
    100     case DeviceOrientationPermission::Denied:
     100    case DeviceOrientationPermission::DeniedByClient:
    101101        uiDelegate = adoptNS([[DeviceOrientationPermissionUIDelegate alloc] initWithHandler:[] { return false; }]);
    102102        break;
    103     case DeviceOrientationPermission::Default:
     103    case DeviceOrientationPermission::GrantedByUser:
     104        [webView _setDeviceOrientationUserPermissionHandlerForTesting:^{ return YES; }];
     105        break;
     106    case DeviceOrientationPermission::DeniedByUser:
     107        [webView _setDeviceOrientationUserPermissionHandlerForTesting:^{ return NO; }];
    104108        break;
    105109    }
     
    117121
    118122    switch (deviceOrientationPermission) {
    119     case DeviceOrientationPermission::Granted:
     123    case DeviceOrientationPermission::GrantedByClient:
     124    case DeviceOrientationPermission::GrantedByUser:
    120125        EXPECT_WK_STREQ(@"granted", receivedMessages.get()[0]);
    121126        break;
    122     case DeviceOrientationPermission::Denied:
    123     case DeviceOrientationPermission::Default:
     127    case DeviceOrientationPermission::DeniedByClient:
     128    case DeviceOrientationPermission::DeniedByUser:
    124129        EXPECT_WK_STREQ(@"denied", receivedMessages.get()[0]);
    125130        break;
     
    136141    [webView _simulateDeviceOrientationChangeWithAlpha:1.0 beta:2.0 gamma:3.0];
    137142
    138     if (deviceOrientationPermission == DeviceOrientationPermission::Granted) {
     143    if (deviceOrientationPermission == DeviceOrientationPermission::GrantedByClient || deviceOrientationPermission == DeviceOrientationPermission::GrantedByUser) {
    139144        TestWebKitAPI::Util::run(&didReceiveMessage);
    140145        EXPECT_WK_STREQ(@"received-event", receivedMessages.get()[1]);
     
    146151}
    147152
    148 TEST(DeviceOrientation, PermissionDeniedByDefault)
    149 {
    150     runDeviceOrientationTest(DeviceOrientationPermission::Default);
    151 }
    152 
    153 TEST(DeviceOrientation, PermissionGranted)
    154 {
    155     runDeviceOrientationTest(DeviceOrientationPermission::Granted);
    156 }
    157 
    158 TEST(DeviceOrientation, PermissionDenied)
    159 {
    160     runDeviceOrientationTest(DeviceOrientationPermission::Denied);
     153TEST(DeviceOrientation, PermissionGrantedByUser)
     154{
     155    runDeviceOrientationTest(DeviceOrientationPermission::GrantedByUser);
     156}
     157
     158TEST(DeviceOrientation, PermissionDeniedByUser)
     159{
     160    runDeviceOrientationTest(DeviceOrientationPermission::DeniedByUser);
     161}
     162
     163TEST(DeviceOrientation, PermissionGrantedByClient)
     164{
     165    runDeviceOrientationTest(DeviceOrientationPermission::GrantedByClient);
     166}
     167
     168TEST(DeviceOrientation, PermissionDeniedByClient)
     169{
     170    runDeviceOrientationTest(DeviceOrientationPermission::DeniedByClient);
    161171}
    162172
Note: See TracChangeset for help on using the changeset viewer.