WebKit Bugzilla
Attachment 369517 Details for
Bug 197750
: Do not wait until requestPermission() is called to fire deviceorientation events if permission was already granted
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-197750-20190509125228.patch (text/plain), 9.52 KB, created by
Chris Dumez
on 2019-05-09 12:52:31 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2019-05-09 12:52:31 PDT
Size:
9.52 KB
patch
obsolete
>Subversion Revision: 245136 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 6aff2f494543e2c69a47658fc587dd2393b7c72b..daba07bf3d0816c5616f9de0ebaa8c638fa7a1ba 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,23 @@ >+2019-05-09 Chris Dumez <cdumez@apple.com> >+ >+ Do not wait until requestPermission() is called to fire deviceorientation events if permission was already granted >+ https://bugs.webkit.org/show_bug.cgi?id=197750 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ The UIProcess remembers previous device orientation permission decisions per origin for the duration of the browsing >+ session. However, the WebContent process was not aware of previous decisions and would therefore not fire any >+ deviceorientation / devicemotion events until the JS has called requestPermission(). This patches addresses this >+ problem by having the UIProcess communicate any previous permission decision for the origin via WebSitePolicies. >+ >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::WebPageProxy::receivedNavigationPolicyDecision): >+ * UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp: >+ (WebKit::WebDeviceOrientationAndMotionAccessController::shouldAllowAccess): >+ (WebKit::WebDeviceOrientationAndMotionAccessController::cachedDeviceOrientationPermission const): >+ (WebKit::WebDeviceOrientationAndMotionAccessController::deviceOrientationPermission const): Deleted. >+ * UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.h: >+ > 2019-05-09 Antoine Quint <graouts@apple.com> > > pointerevents/ios/touch-action-none-in-overflow-scrolling-touch.html is a timeout >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index a8ab15e7550c4eb095b254b16094edd45f32d570..5cce4eb88a2c6b743ceb5e6a8c8541513a706042 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -2780,6 +2780,17 @@ void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, A > data->contentBlockersEnabled = false; > } > >+#if ENABLE(DEVICE_ORIENTATION) >+ if (navigation && (!data || data->deviceOrientationAndMotionAccessState == WebCore::DeviceOrientationOrMotionPermissionState::Prompt)) { >+ auto deviceOrientationPermission = websiteDataStore->deviceOrientationAndMotionAccessController().cachedDeviceOrientationPermission(SecurityOriginData::fromURL(navigation->currentRequest().url())); >+ if (deviceOrientationPermission != WebCore::DeviceOrientationOrMotionPermissionState::Prompt) { >+ if (!data) >+ data = WebsitePoliciesData { }; >+ data->deviceOrientationAndMotionAccessState = deviceOrientationPermission; >+ } >+ } >+#endif >+ > #if PLATFORM(COCOA) > static const bool forceDownloadFromDownloadAttribute = false; > #else >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp b/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp >index 3ffec9362dae538a64670cf278213952c2eef311..f85dd57670fde9d3391e1bf6d17de02a541b4493 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp >+++ b/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp >@@ -37,7 +37,7 @@ using namespace WebCore; > > void WebDeviceOrientationAndMotionAccessController::shouldAllowAccess(WebPageProxy& page, WebFrameProxy& frame, WebCore::SecurityOriginData&& originData, bool mayPrompt, CompletionHandler<void(DeviceOrientationOrMotionPermissionState)>&& completionHandler) > { >- auto currentPermission = deviceOrientationPermission(originData); >+ auto currentPermission = cachedDeviceOrientationPermission(originData); > if (currentPermission != DeviceOrientationOrMotionPermissionState::Prompt || !mayPrompt) > return completionHandler(currentPermission); > >@@ -58,7 +58,7 @@ void WebDeviceOrientationAndMotionAccessController::shouldAllowAccess(WebPagePro > }); > } > >-DeviceOrientationOrMotionPermissionState WebDeviceOrientationAndMotionAccessController::deviceOrientationPermission(const SecurityOriginData& origin) const >+DeviceOrientationOrMotionPermissionState WebDeviceOrientationAndMotionAccessController::cachedDeviceOrientationPermission(const SecurityOriginData& origin) const > { > auto it = m_deviceOrientationPermissionDecisions.find(origin); > if (it == m_deviceOrientationPermissionDecisions.end()) >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.h b/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.h >index fa185312149cbb6222439888876a1a670f04bc2f..b62277c1203f00af0359c2a190166609f988933a 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.h >+++ b/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.h >@@ -44,9 +44,9 @@ public: > void shouldAllowAccess(WebPageProxy&, WebFrameProxy&, WebCore::SecurityOriginData&&, bool mayPrompt, CompletionHandler<void(WebCore::DeviceOrientationOrMotionPermissionState)>&&); > void clearPermissions(); > >-private: >- WebCore::DeviceOrientationOrMotionPermissionState deviceOrientationPermission(const WebCore::SecurityOriginData&) const; >+ WebCore::DeviceOrientationOrMotionPermissionState cachedDeviceOrientationPermission(const WebCore::SecurityOriginData&) const; > >+private: > HashMap<WebCore::SecurityOriginData, bool> m_deviceOrientationPermissionDecisions; > HashMap<WebCore::SecurityOriginData, Vector<CompletionHandler<void(WebCore::DeviceOrientationOrMotionPermissionState)>>> m_pendingRequests; > }; >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index b177ae8d39c38e034c85133bfcd97fb5dbaf8878..c14901f6852e17a25f0f7e2825991063e8526003 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,15 @@ >+2019-05-09 Chris Dumez <cdumez@apple.com> >+ >+ Do not wait until requestPermission() is called to fire deviceorientation events if permission was already granted >+ https://bugs.webkit.org/show_bug.cgi?id=197750 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add API test coverage. >+ >+ * TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm: >+ (TEST): >+ > 2019-05-09 Aakash Jain <aakash_jain@apple.com> > > [ews-app] Production and Development env should configure DEBUG appropriately >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm >index 59b1f17cda9ce9ec0cd0d3d368e5f14f0d185349..863e7cc83a1018c5e7c9fc05202ece401ffabf76 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm >@@ -250,4 +250,54 @@ TEST(DeviceOrientation, RememberPermissionForSession) > askedClientForPermission = false; > } > >+TEST(DeviceOrientation, FireOrientationEventsRightAwayIfPermissionAlreadyGranted) >+{ >+ auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); >+ configuration.get().websiteDataStore = [WKWebsiteDataStore defaultDataStore]; >+ >+ auto messageHandler = adoptNS([[DeviceOrientationMessageHandler alloc] init]); >+ [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"testHandler"]; >+ >+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); >+ RetainPtr<DeviceOrientationPermissionUIDelegate> uiDelegate = adoptNS([[DeviceOrientationPermissionUIDelegate alloc] initWithHandler:[] { return true; }]); >+ [webView setUIDelegate:uiDelegate.get()]; >+ >+ NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]; >+ [webView loadRequest:request]; >+ [webView _test_waitForDidFinishNavigation]; >+ >+ // Request permission. >+ [webView evaluateJavaScript:@"DeviceOrientationEvent.requestPermission().then((granted) => { webkit.messageHandlers.testHandler.postMessage(granted) });" completionHandler: [&] (id result, NSError *error) { }]; >+ >+ TestWebKitAPI::Util::run(&didReceiveMessage); >+ didReceiveMessage = false; >+ >+ EXPECT_TRUE(askedClientForPermission); >+ askedClientForPermission = false; >+ EXPECT_WK_STREQ(@"granted", receivedMessages.get()[0]); >+ >+ // Go to the same origin again in a new view. >+ webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); >+ [webView setUIDelegate:uiDelegate.get()]; >+ >+ [webView loadRequest:request]; >+ [webView _test_waitForDidFinishNavigation]; >+ >+ // This time, we do not request permission but set our event listener. >+ bool addedEventListener = false; >+ [webView evaluateJavaScript:@"addEventListener('deviceorientation', (e) => { webkit.messageHandlers.testHandler.postMessage('received-event') });" completionHandler: [&] (id result, NSError *error) { >+ addedEventListener = true; >+ }]; >+ >+ TestWebKitAPI::Util::run(&addedEventListener); >+ addedEventListener = false; >+ >+ // Simulate a device orientation event. The page's event listener should get called even though it did not request permission, >+ // because it was previously granted permission during this browsing session. >+ [webView _simulateDeviceOrientationChangeWithAlpha:1.0 beta:2.0 gamma:3.0]; >+ >+ TestWebKitAPI::Util::run(&didReceiveMessage); >+ EXPECT_WK_STREQ(@"received-event", receivedMessages.get()[1]); >+} >+ > #endif // PLATFORM(IOS_FAMILY)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 197750
:
369513
| 369517