Changeset 253343 in webkit
- Timestamp:
- Dec 10, 2019 1:27:22 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r253342 r253343 1 2019-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 1 21 2019-12-10 Chris Dumez <cdumez@apple.com> 2 22 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r253216 r253343 6974 6974 } 6975 6975 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 6976 6984 - (void)_accessibilityStoreSelection 6977 6985 { -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
r253037 r253343 508 508 509 509 - (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)); 510 512 511 513 @property (nonatomic, readonly) BOOL _contentViewIsFirstResponder WK_API_AVAILABLE(ios(12.2)); -
trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm
r252634 r253343 866 866 void UIDelegate::UIClient::shouldAllowDeviceOrientationAndMotionAccess(WebKit::WebPageProxy&, WebFrameProxy& webFrameProxy, WebCore::SecurityOriginData&& securityOriginData, CompletionHandler<void(bool)>&& completionHandler) 867 867 { 868 auto delegate = m_uiDelegate.m_delegate.get();869 if (!delegate)870 return completionHandler(false);871 872 868 if (!m_uiDelegate.m_delegateMethods.webViewShouldAllowDeviceOrientationAndMotionAccessRequestedByFrameDecisionHandler) { 873 869 presentOrientationAccessAlert(m_uiDelegate.m_webView, securityOriginData.host, WTFMove(completionHandler)); 874 870 return; 875 871 } 872 873 auto delegate = m_uiDelegate.m_delegate.get(); 874 if (!delegate) 875 return completionHandler(false); 876 876 877 877 auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:shouldAllowDeviceOrientationAndMotionAccessRequestedByFrame:decisionHandler:)); -
trunk/Source/WebKit/UIProcess/Cocoa/WKOrientationAccessAlert.mm
r244742 r253343 30 30 31 31 #import "WKWebViewInternal.h" 32 #import "WKWebViewPrivate.h" 33 #import "WebPageProxy.h" 32 34 #import <WebCore/LocalizedStrings.h> 33 35 #import <wtf/text/WTFString.h> … … 37 39 void presentOrientationAccessAlert(WKWebView *view, const String& host, CompletionHandler<void(bool)>&& completionHandler) 38 40 { 41 if (auto& userPermissionHandler = view._page->deviceOrientationUserPermissionHandlerForTesting()) 42 return completionHandler(userPermissionHandler()); 43 39 44 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]; 40 45 UIAlertController* alert = [UIAlertController alertControllerWithTitle:alertText message:nil preferredStyle:UIAlertControllerStyleAlert]; -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r253337 r253343 1422 1422 void setIsKeyboardAnimatingIn(bool isKeyboardAnimatingIn) { m_isKeyboardAnimatingIn = isKeyboardAnimatingIn; } 1423 1423 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); } 1424 1426 #endif 1425 1427 … … 2557 2559 2558 2560 #if PLATFORM(IOS_FAMILY) 2561 Function<bool()> m_deviceOrientationUserPermissionHandlerForTesting; 2559 2562 std::unique_ptr<ElementDidFocusArguments> m_deferredElementDidFocusArguments; 2560 2563 bool m_waitingForPostLayoutEditorStateUpdateAfterFocusingElement { false }; -
trunk/Tools/ChangeLog
r253331 r253343 1 2019-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 1 14 2019-12-10 youenn fablet <youenn@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm
r248957 r253343 83 83 @end 84 84 85 enum class DeviceOrientationPermission { Granted , Denied, Default};85 enum class DeviceOrientationPermission { GrantedByClient, DeniedByClient, GrantedByUser, DeniedByUser }; 86 86 static void runDeviceOrientationTest(DeviceOrientationPermission deviceOrientationPermission) 87 87 { … … 95 95 RetainPtr<DeviceOrientationPermissionUIDelegate> uiDelegate; 96 96 switch (deviceOrientationPermission) { 97 case DeviceOrientationPermission::Granted :97 case DeviceOrientationPermission::GrantedByClient: 98 98 uiDelegate = adoptNS([[DeviceOrientationPermissionUIDelegate alloc] initWithHandler:[] { return true; }]); 99 99 break; 100 case DeviceOrientationPermission::Denied :100 case DeviceOrientationPermission::DeniedByClient: 101 101 uiDelegate = adoptNS([[DeviceOrientationPermissionUIDelegate alloc] initWithHandler:[] { return false; }]); 102 102 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; }]; 104 108 break; 105 109 } … … 117 121 118 122 switch (deviceOrientationPermission) { 119 case DeviceOrientationPermission::Granted: 123 case DeviceOrientationPermission::GrantedByClient: 124 case DeviceOrientationPermission::GrantedByUser: 120 125 EXPECT_WK_STREQ(@"granted", receivedMessages.get()[0]); 121 126 break; 122 case DeviceOrientationPermission::Denied :123 case DeviceOrientationPermission::De fault:127 case DeviceOrientationPermission::DeniedByClient: 128 case DeviceOrientationPermission::DeniedByUser: 124 129 EXPECT_WK_STREQ(@"denied", receivedMessages.get()[0]); 125 130 break; … … 136 141 [webView _simulateDeviceOrientationChangeWithAlpha:1.0 beta:2.0 gamma:3.0]; 137 142 138 if (deviceOrientationPermission == DeviceOrientationPermission::Granted ) {143 if (deviceOrientationPermission == DeviceOrientationPermission::GrantedByClient || deviceOrientationPermission == DeviceOrientationPermission::GrantedByUser) { 139 144 TestWebKitAPI::Util::run(&didReceiveMessage); 140 145 EXPECT_WK_STREQ(@"received-event", receivedMessages.get()[1]); … … 146 151 } 147 152 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); 153 TEST(DeviceOrientation, PermissionGrantedByUser) 154 { 155 runDeviceOrientationTest(DeviceOrientationPermission::GrantedByUser); 156 } 157 158 TEST(DeviceOrientation, PermissionDeniedByUser) 159 { 160 runDeviceOrientationTest(DeviceOrientationPermission::DeniedByUser); 161 } 162 163 TEST(DeviceOrientation, PermissionGrantedByClient) 164 { 165 runDeviceOrientationTest(DeviceOrientationPermission::GrantedByClient); 166 } 167 168 TEST(DeviceOrientation, PermissionDeniedByClient) 169 { 170 runDeviceOrientationTest(DeviceOrientationPermission::DeniedByClient); 161 171 } 162 172
Note: See TracChangeset
for help on using the changeset viewer.