RESOLVED FIXED 185335
Add experimental feature to prompt for Storage Access API use
https://bugs.webkit.org/show_bug.cgi?id=185335
Summary Add experimental feature to prompt for Storage Access API use
Brent Fulgham
Reported 2018-05-04 16:59:12 PDT
Create an experimental feature that allows a client to check for user agreement to allow Storage Access API use.
Attachments
Patch (41.82 KB, patch)
2018-05-04 17:16 PDT, Brent Fulgham
no flags
Patch (44.13 KB, patch)
2018-05-05 11:24 PDT, Brent Fulgham
no flags
Patch (44.09 KB, patch)
2018-05-05 11:27 PDT, Brent Fulgham
no flags
Patch (44.05 KB, patch)
2018-05-05 14:25 PDT, Brent Fulgham
no flags
Patch (40.77 KB, patch)
2018-05-05 17:39 PDT, Brent Fulgham
no flags
Patch (47.52 KB, patch)
2018-05-06 15:47 PDT, Brent Fulgham
no flags
Patch (47.50 KB, patch)
2018-05-06 17:25 PDT, Brent Fulgham
no flags
Archive of layout-test-results from ews204 for win-future (12.73 MB, application/zip)
2018-05-06 19:15 PDT, EWS Watchlist
no flags
Patch (47.62 KB, patch)
2018-05-07 11:34 PDT, Brent Fulgham
no flags
Patch (44.85 KB, patch)
2018-05-07 13:03 PDT, Alex Christensen
no flags
Patch (46.96 KB, patch)
2018-05-07 13:14 PDT, Alex Christensen
no flags
Patch (43.80 KB, patch)
2018-05-07 14:43 PDT, Alex Christensen
no flags
Patch (2.59 KB, patch)
2018-05-07 16:36 PDT, Brent Fulgham
achristensen: review-
Brent Fulgham
Comment 1 2018-05-04 16:59:55 PDT
Note: This should default to an off state. We don't want this active for most uses.
Radar WebKit Bug Importer
Comment 2 2018-05-04 17:03:56 PDT
Brent Fulgham
Comment 3 2018-05-04 17:16:14 PDT
EWS Watchlist
Comment 4 2018-05-04 17:18:36 PDT
Attachment 339616 [details] did not pass style-queue: ERROR: Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:349: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/APIUIClient.h:131: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/C/WKPage.cpp:1535: Extra space before ( in function call [whitespace/parens] [4] Total errors found: 3 in 23 files If any of these errors are false positives, please file a bug against check-webkit-style.
Brent Fulgham
Comment 5 2018-05-05 11:24:57 PDT
Brent Fulgham
Comment 6 2018-05-05 11:27:11 PDT
EWS Watchlist
Comment 7 2018-05-05 11:30:22 PDT
Attachment 339652 [details] did not pass style-queue: ERROR: Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:349: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/APIUIClient.h:131: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/C/WKPage.cpp:1535: Extra space before ( in function call [whitespace/parens] [4] Total errors found: 3 in 24 files If any of these errors are false positives, please file a bug against check-webkit-style.
Brent Fulgham
Comment 8 2018-05-05 14:25:24 PDT
EWS Watchlist
Comment 9 2018-05-05 14:26:57 PDT
Attachment 339655 [details] did not pass style-queue: ERROR: Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:349: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/APIUIClient.h:131: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/C/WKPage.cpp:1535: Extra space before ( in function call [whitespace/parens] [4] Total errors found: 3 in 24 files If any of these errors are false positives, please file a bug against check-webkit-style.
Dean Jackson
Comment 10 2018-05-05 15:39:22 PDT
Comment on attachment 339655 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339655&action=review > Source/WebCore/testing/InternalSettings.cpp:786 > +#if ENABLE(MEDIA_STREAM) > + RuntimeEnabledFeatures::sharedFeatures().setStorageAccessPromptsEnabled(enabled); > +#else Why is this restricted to media streams? The runtime feature isn't. > Source/WebKit/UIProcess/API/C/WKPreferences.cpp:1995 > +void WKPreferencesSetPromptForStorageAccessAPIEnabled(WKPreferencesRef preferencesRef, bool enabled) > +{ > + toImpl(preferencesRef)->setStorageAccessPromptsEnabled(enabled); > +} > + > +bool WKPreferencesGetPromptForStorageAccessAPIEnabled(WKPreferencesRef preferencesRef) > +{ > + return toImpl(preferencesRef)->storageAccessPromptsEnabled(); > +} Do you need these versions for the legacy C API? I don't think so. > Source/WebKit/UIProcess/API/C/WKPreferencesRef.h:324 > +// Defaults to false. > +WK_EXPORT void WKPreferencesSetPromptForStorageAccessAPIEnabled(WKPreferencesRef preferences, bool enabled); > +WK_EXPORT bool WKPreferencesGetPromptForStorageAccessAPIEnabled(WKPreferencesRef preferences); Do you need these versions for the legacy C API? I don't think so. > Source/WebKit/UIProcess/API/Cocoa/WKPreferences.h:2 > - * Copyright (C) 2014-2017 Apple Inc. All rights reserved. > + * Copyright (C) 2014-2018 Apple Inc. All rights reserved. You didn't change anything else in this file. > Source/WebKit/UIProcess/API/Cocoa/WKUIDelegate.h:130 > +/*! @abstract Displays a non-partitioned storage access panel. > + @param webView The web view invoking the delegate method. > + @param topPrivatelyControlledDomain The eTLD+1 of the domain requesting > + access to its non-partitioned website data. > + @param underFirstPartyTopPrivatelyControlledDomain The eTLD+1 of the > + first-party domain under which the request for website data access is > + being made. > + @param completionHandler The completion handler to call after the confirm > + panel has been dismissed. Pass YES if the user chose OK, NO if the user > + chose Don't Allow. Seeing as this will be public, do we expect people to know what an eTLD is? And an eTLD+1? I also note that your parameter is called topPrivatelyControlledDomainUnderWhichStorageAccessWillBeProvided > Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:334 > + WTFLogAlways("ResourceLoadLog | UIClient::requestStorageAccessConfirm() 1."); Why LogAlways instead of a dedicated log channel? Also, this seems like printf debugging during development. Same for the other two in this function. > Source/WebKit/UIProcess/WebPageProxy.cpp:3288 > + WebCore::RuntimeEnabledFeatures::sharedFeatures().setStorageAccessPromptsEnabled(m_preferences->storageAccessPromptsEnabled()); I *think* this is done automatically in generated code. > Source/WebKit/UIProcess/WebPageProxy.cpp:4286 > + // Since runJavaScriptConfirm() can spin a nested run loop we need to turn off the responsiveness timer. Where is runJavaScriptConfirm called? And when do you turn the timer back on? > Source/WebKit/UIProcess/WebPageProxy.cpp:4294 > + WTFLogAlways("ResourceLoadLog | WebPageProxy::requestStorageAccessConfirm()."); Another log always that doesn't seem useful as a global message. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1300 > + WTFLogAlways("ResourceLoadLog | The user granted storage access to %s on page from %s.", subFrameHost.utf8().data(), topFrameHost.utf8().data()); And again.
Brent Fulgham
Comment 11 2018-05-05 16:33:10 PDT
Comment on attachment 339655 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339655&action=review >> Source/WebCore/testing/InternalSettings.cpp:786 >> +#else > > Why is this restricted to media streams? The runtime feature isn't. Because I am an idiot! I was duplicating code for another feature to do this, and did a poor job of it! >> Source/WebKit/UIProcess/API/C/WKPreferences.cpp:1995 >> +} > > Do you need these versions for the legacy C API? I don't think so. You are right. I'll remove them. >> Source/WebKit/UIProcess/API/C/WKPreferencesRef.h:324 >> +WK_EXPORT bool WKPreferencesGetPromptForStorageAccessAPIEnabled(WKPreferencesRef preferences); > > Do you need these versions for the legacy C API? I don't think so. You are correct. >> Source/WebKit/UIProcess/API/Cocoa/WKPreferences.h:2 >> + * Copyright (C) 2014-2018 Apple Inc. All rights reserved. > > You didn't change anything else in this file. Why don't you like 2018, Dean? >> Source/WebKit/UIProcess/API/Cocoa/WKUIDelegate.h:130 >> + chose Don't Allow. > > Seeing as this will be public, do we expect people to know what an eTLD is? And an eTLD+1? I also note that your parameter is called topPrivatelyControlledDomainUnderWhichStorageAccessWillBeProvided I'll adjust the verbosity. This should also be under WKUIDelegatePrivate (as Alex suggested separately), so I'll fix that. >> Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:334 >> + WTFLogAlways("ResourceLoadLog | UIClient::requestStorageAccessConfirm() 1."); > > Why LogAlways instead of a dedicated log channel? Also, this seems like printf debugging during development. Same for the other two in this function. Yeah, they are. I'll remove them. >> Source/WebKit/UIProcess/WebPageProxy.cpp:3288 >> + WebCore::RuntimeEnabledFeatures::sharedFeatures().setStorageAccessPromptsEnabled(m_preferences->storageAccessPromptsEnabled()); > > I *think* this is done automatically in generated code. Testing indicates that it doesn't seem to happen on the UIProcess side of things (maybe until after you restart). WebProcess picks changes up immediately. >> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1300 >> + WTFLogAlways("ResourceLoadLog | The user granted storage access to %s on page from %s.", subFrameHost.utf8().data(), topFrameHost.utf8().data()); > > And again. OK.
Brent Fulgham
Comment 12 2018-05-05 17:39:03 PDT
EWS Watchlist
Comment 13 2018-05-05 17:41:57 PDT
Attachment 339659 [details] did not pass style-queue: ERROR: Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:346: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/APIUIClient.h:131: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/C/WKPage.cpp:1535: Extra space before ( in function call [whitespace/parens] [4] Total errors found: 3 in 22 files If any of these errors are false positives, please file a bug against check-webkit-style.
Alex Christensen
Comment 14 2018-05-05 21:04:04 PDT
Comment on attachment 339659 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339659&action=review > Source/WebKit/UIProcess/API/APIUIClient.h:131 > + virtual void requestStorageAccessConfirm(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WTF::String& requestingDomain, const WTF::String& currentDomain, Function<void (bool)>&& completionHandler) { completionHandler(true); } I think we should make the parameters a WebPageProxy& and a WebFrameProxy& > Source/WebKit/UIProcess/API/C/WKPage.cpp:1535 > + Function<void (bool)> m_completionHandler; This and all uses of Function in this patch could be a CompletionHandler. I also think we don't have a space between void and (bool) in our style. > Source/WebKit/UIProcess/API/C/WKPage.cpp:2028 > + RefPtr<RequestStorageAccessConfirmResultListener> listener = RequestStorageAccessConfirmResultListener::create(WTFMove(completionHandler)); auto listener > Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h:119 > +- (void)webView:(WKWebView *)webView requestStorageAccessPanelForDomain:(NSString *)requestingDomain underCurrentDomain:(NSString *)currentDomain completionHandler:(void (^)(BOOL result))completionHandler; webView should be _webView because this is SPI > Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:345 > + RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(webView:requestStorageAccessPanelForDomain:underCurrentDomain:completionHandler:)); auto checker > Source/WebKit/UIProcess/WebPageProxy.cpp:4292 > + WTFLogAlways("ResourceLoadLog | WebPageProxy::requestStorageAccessConfirm()."); Please remove > Source/WebKit/UIProcess/WebPreferences.cpp:137 > + if (key == WebPreferencesKey::storageAccessPromptsEnabledKey()) This feels out of place because it's the only such thing here. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1292 > void WebChromeClient::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback) We can remove WTF:: here > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1295 > + if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPageProxy::RequestStorageAccessConfirm(frameID, subFrameHost, topFrameHost), Messages::WebPageProxy::RequestStorageAccessConfirm::Reply(result), pageID, Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend) || !result) { I don't think we should add synchronous IPC for this. I think we should have a different message type for the reply, and store the CompletionHandler in a HashMap with an identifier so we don't hang the WebProcess during this.
Alex Christensen
Comment 15 2018-05-05 21:19:41 PDT
Comment on attachment 339659 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339659&action=review >> Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h:119 >> +- (void)webView:(WKWebView *)webView requestStorageAccessPanelForDomain:(NSString *)requestingDomain underCurrentDomain:(NSString *)currentDomain completionHandler:(void (^)(BOOL result))completionHandler; > > webView should be _webView because this is SPI And this needs an availability macro.
Brent Fulgham
Comment 16 2018-05-06 11:12:57 PDT
Comment on attachment 339659 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339659&action=review >> Source/WebKit/UIProcess/API/APIUIClient.h:131 >> + virtual void requestStorageAccessConfirm(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WTF::String& requestingDomain, const WTF::String& currentDomain, Function<void (bool)>&& completionHandler) { completionHandler(true); } > > I think we should make the parameters a WebPageProxy& and a WebFrameProxy& Done. >> Source/WebKit/UIProcess/API/C/WKPage.cpp:1535 >> + Function<void (bool)> m_completionHandler; > > This and all uses of Function in this patch could be a CompletionHandler. > I also think we don't have a space between void and (bool) in our style. Yeah, I've let Chris Dumez rub off on me too much here. I'll remove the space. >> Source/WebKit/UIProcess/API/C/WKPage.cpp:2028 >> + RefPtr<RequestStorageAccessConfirmResultListener> listener = RequestStorageAccessConfirmResultListener::create(WTFMove(completionHandler)); > > auto listener I tried this initially, but clang get confused about type and toAPI fails. >>> Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h:119 >>> +- (void)webView:(WKWebView *)webView requestStorageAccessPanelForDomain:(NSString *)requestingDomain underCurrentDomain:(NSString *)currentDomain completionHandler:(void (^)(BOOL result))completionHandler; >> >> webView should be _webView because this is SPI > > And this needs an availability macro. Done and Done! >> Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:345 >> + RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(webView:requestStorageAccessPanelForDomain:underCurrentDomain:completionHandler:)); > > auto checker Done! >> Source/WebKit/UIProcess/WebPageProxy.cpp:4292 >> + WTFLogAlways("ResourceLoadLog | WebPageProxy::requestStorageAccessConfirm()."); > > Please remove Done! >> Source/WebKit/UIProcess/WebPreferences.cpp:137 >> + if (key == WebPreferencesKey::storageAccessPromptsEnabledKey()) > > This feels out of place because it's the only such thing here. I can't find a more appropriate place to set this value in the call stack. I did it the same way as WebPreferencesKey::privateBrowsingEnabledKey(), the only difference being that this is an experimental feature, while private browsing is a full feature. Since this is an experimental feature, its state is controlled by the client application, so I need to set it in this call stack, since some clients (e.g., Safari) manipulate multiple WKPreferences for different uses and not all of them bother to read the correct state from NSPreferences, so it will improperly reset this value to its default. I can get into the details with you in person if you want to know, but I'd ask that you allow this quirk for the time being. >> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1292 >> void WebChromeClient::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback) > > We can remove WTF:: here Done. >> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1295 >> + if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPageProxy::RequestStorageAccessConfirm(frameID, subFrameHost, topFrameHost), Messages::WebPageProxy::RequestStorageAccessConfirm::Reply(result), pageID, Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend) || !result) { > > I don't think we should add synchronous IPC for this. I think we should have a different message type for the reply, and store the CompletionHandler in a HashMap with an identifier so we don't hang the WebProcess during this. Hmm. Okay. I'll do that.
Brent Fulgham
Comment 17 2018-05-06 15:47:32 PDT
EWS Watchlist
Comment 18 2018-05-06 15:50:28 PDT
Attachment 339693 [details] did not pass style-queue: ERROR: Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:346: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/UIProcess/API/APIUIClient.h:131: Extra space before ( in function call [whitespace/parens] [4] ERROR: Source/WebKit/WebProcess/WebProcess.cpp:84: Alphabetical sorting problem. [build/include_order] [4] ERROR: Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1292: Extra space before ( in function call [whitespace/parens] [4] Total errors found: 4 in 28 files If any of these errors are false positives, please file a bug against check-webkit-style.
Brent Fulgham
Comment 19 2018-05-06 17:25:40 PDT
EWS Watchlist
Comment 20 2018-05-06 19:15:06 PDT
Comment on attachment 339697 [details] Patch Attachment 339697 [details] did not pass win-ews (win): Output: http://webkit-queues.webkit.org/results/7590023 New failing tests: http/tests/preload/onload_event.html
EWS Watchlist
Comment 21 2018-05-06 19:15:17 PDT
Created attachment 339700 [details] Archive of layout-test-results from ews204 for win-future The attached test failures were seen while running run-webkit-tests on the win-ews. Bot: ews204 Port: win-future Platform: CYGWIN_NT-6.1-2.9.0-0.318-5-3-x86_64-64bit
Brent Fulgham
Comment 22 2018-05-07 09:42:25 PDT
Those windows-specific issues are unrelated to this modern WebKit patch. Apple WebKit on Win does not use the modern WebKit infrastructure.
Alex Christensen
Comment 23 2018-05-07 09:55:35 PDT
Comment on attachment 339697 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339697&action=review Better, but still some substantial changes needed. > Source/WebKit/UIProcess/API/APIUIClient.h:131 > + virtual void requestStorageAccessConfirm(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WTF::String& requestingDomain, const WTF::String& currentDomain, Function<void(bool)>&& completionHandler) { completionHandler(true); } This Function could be a CompletionHandler > Source/WebKit/UIProcess/API/C/WKPage.cpp:2028 > + RefPtr<RequestStorageAccessConfirmResultListener> listener = RequestStorageAccessConfirmResultListener::create(WTFMove(completionHandler)); auto listener. Really. This would make the code cleaner, and make listener a ref, and you would need to call listener.ptr() below. > Source/WebKit/UIProcess/Cocoa/UIDelegate.h:91 > + void requestStorageAccessConfirm(WebPageProxy&, WebFrameProxy&, const WTF::String& requestingDomain, const WTF::String& currentDomain, Function<void(bool)>&& completionHandler) final; CompletionHandler > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1294 > + static std::atomic<uint64_t> currentHandlerIdentifier; Can this be accessed by more than one thread? If not (and I think the answer is no) then this doesn't need to be atomic and we don't need m_requestStorageAccessCallbackLock. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:367 > + HashMap<uint64_t, std::tuple<String, String, CompletionHandler<void(bool)>>> m_requestStorageAccessCallbacks; You can just make the value of this HashMap a CompletionHandler and capture subFrameHost and topFrameHost and the given CompletionHandler in a lambda.
youenn fablet
Comment 24 2018-05-07 10:02:28 PDT
Comment on attachment 339697 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339697&action=review > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1313 > + auto callbackTuple = m_requestStorageAccessCallbacks.take(callbackIdentifier); We often exit early if there is no callbakIdentifier in the map. Might use find/remove(iterator) > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:366 > + Lock m_requestStorageAccessCallbackLock; Do we need this lock, maybe all calls are main thread only? > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:367 > + HashMap<uint64_t, std::tuple<String, String, CompletionHandler<void(bool)>>> m_requestStorageAccessCallbacks; Since this is a map of CompletionHandler, you might need to call all callbacks in WebChromeClient destructor. Probably my preference only, but defining a struct instead of a tuple gives usually more readable code to me. > Source/WebKit/WebProcess/WebPage/WebPage.h:1056 > + void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void(bool)>&& callback); Might be able to remove WTF:: > Source/WebKit/WebProcess/WebProcess.cpp:1693 > +void WebProcess::didRequestStorageAccessConfirm(uint64_t frameID, uint64_t pageID, uint64_t callbackIdentifier, bool confirmed) s/confirmed/didConfirm? > Source/WebKit/WebProcess/WebProcess.h:322 > + void didRequestStorageAccessConfirm(uint64_t frameID, uint64_t pageID, uint64_t callbackIdentifier, bool hasActivity); s/hasActivity/didConfirm?
Brent Fulgham
Comment 25 2018-05-07 11:33:17 PDT
Comment on attachment 339697 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339697&action=review >> Source/WebKit/UIProcess/API/APIUIClient.h:131 >> + virtual void requestStorageAccessConfirm(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WTF::String& requestingDomain, const WTF::String& currentDomain, Function<void(bool)>&& completionHandler) { completionHandler(true); } > > This Function could be a CompletionHandler Done! >> Source/WebKit/UIProcess/API/C/WKPage.cpp:2028 >> + RefPtr<RequestStorageAccessConfirmResultListener> listener = RequestStorageAccessConfirmResultListener::create(WTFMove(completionHandler)); > > auto listener. Really. This would make the code cleaner, and make listener a ref, and you would need to call listener.ptr() below. Ah! Got it. Thanks. >> Source/WebKit/UIProcess/Cocoa/UIDelegate.h:91 >> + void requestStorageAccessConfirm(WebPageProxy&, WebFrameProxy&, const WTF::String& requestingDomain, const WTF::String& currentDomain, Function<void(bool)>&& completionHandler) final; > > CompletionHandler Done. >> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1294 >> + static std::atomic<uint64_t> currentHandlerIdentifier; > > Can this be accessed by more than one thread? If not (and I think the answer is no) then this doesn't need to be atomic and we don't need m_requestStorageAccessCallbackLock. I added an assertion that this is only hit on the main thread and removed the Lock and the atomic. >> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1313 >> + auto callbackTuple = m_requestStorageAccessCallbacks.take(callbackIdentifier); > > We often exit early if there is no callbakIdentifier in the map. > Might use find/remove(iterator) Done. >> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:366 >> + Lock m_requestStorageAccessCallbackLock; > > Do we need this lock, maybe all calls are main thread only? Yes -- removed. >>> Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:367 >>> + HashMap<uint64_t, std::tuple<String, String, CompletionHandler<void(bool)>>> m_requestStorageAccessCallbacks; >> >> You can just make the value of this HashMap a CompletionHandler and capture subFrameHost and topFrameHost and the given CompletionHandler in a lambda. > > Since this is a map of CompletionHandler, you might need to call all callbacks in WebChromeClient destructor. > Probably my preference only, but defining a struct instead of a tuple gives usually more readable code to me. I captured in a lambda as Alex suggested. >> Source/WebKit/WebProcess/WebPage/WebPage.h:1056 >> + void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void(bool)>&& callback); > > Might be able to remove WTF:: Done. >> Source/WebKit/WebProcess/WebProcess.cpp:1693 >> +void WebProcess::didRequestStorageAccessConfirm(uint64_t frameID, uint64_t pageID, uint64_t callbackIdentifier, bool confirmed) > > s/confirmed/didConfirm? Done. >> Source/WebKit/WebProcess/WebProcess.h:322 >> + void didRequestStorageAccessConfirm(uint64_t frameID, uint64_t pageID, uint64_t callbackIdentifier, bool hasActivity); > > s/hasActivity/didConfirm? Doh! Yes.
Brent Fulgham
Comment 26 2018-05-07 11:34:34 PDT
Alex Christensen
Comment 27 2018-05-07 11:50:58 PDT
Comment on attachment 339735 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339735&action=review I'll fix these up and land it. > Source/WebCore/page/ChromeClient.h:472 > + virtual void didRequestStorageAccessConfirm(uint64_t /*frameID*/, uint64_t /*pageID*/, uint64_t /*callbackIdentifier*/, bool /*hasActivity*/) { } You'll probably want to replace callbackIdentifier with a CompletionHandler of some sort, but we can do that when this is adopted. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1292 > +void WebChromeClient::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&& completionHandler) It looks like this logic should be moved to the page. > Source/WebKit/WebProcess/WebProcess.messages.in:139 > + DidRequestStorageAccessConfirm(uint64_t frameID, uint64_t pageID, uint64_t callbackIdentifier, bool didConfirm) I think this should be in WebPage.messages.in.
youenn fablet
Comment 28 2018-05-07 11:53:50 PDT
Comment on attachment 339735 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339735&action=review > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1297 > + uint64_t identifier = ++currentHandlerIdentifier; We now usually try to use typed identifiers using ObjectIdentifier<>. This allows making sure we are not taking an identifier for another. Would be good to be done in a follow-up especially as we are handling 3 uint64_t here. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1299 > + auto result = m_requestStorageAccessCallbacks.ensure(identifier, [this, subFrameHost, topFrameHost, frameID, pageID, completionHandler = WTFMove(completionHandler)]() mutable { No need for ensure since identifier is unique. m_requestStorageAccessCallbacks.add should be good enough. You can do ASSERT(!m_requestStorageAccessCallbacks.contains(identifier)) maybe. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1311 > + WebProcess::singleton().parentProcessConnection()->send(Messages::WebPageProxy::RequestStorageAccessConfirm(frameID, pageID, subFrameHost, topFrameHost, identifier), m_page.pageID()); Can we have a case where pageID != m_page.pageID? If not, maybe we should not pass pageID as a method parameter. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:1318 > + auto currentCallbackIter = m_requestStorageAccessCallbacks.find(callbackIdentifier); s/Iter/Iterator maybe > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:357 > + void didRequestStorageAccessConfirm(uint64_t frameID, uint64_t pageID, uint64_t callbackIdentifier, bool hasActivity) final; s/hasActivity/confirmedAccess. > Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:366 > + HashMap<uint64_t, CompletionHandler<void(bool)>> m_requestStorageAccessCallbacks; We probably need to call all completion handlers of m_requestStorageAccessCallbacks at destruction of WebChromeClient. Otherwise, we might hit debug assertions that the completion handlers were not called.
Brent Fulgham
Comment 29 2018-05-07 12:12:19 PDT
Alex has a slightly revised version he plans to land shortly.
Alex Christensen
Comment 30 2018-05-07 12:56:37 PDT
Comment on attachment 339735 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339735&action=review > Source/WebKit/UIProcess/API/APIUIClient.h:131 > + virtual void requestStorageAccessConfirm(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WTF::String& requestingDomain, const WTF::String& currentDomain, CompletionHandler<void(bool)>&& completionHandler) { completionHandler(true); } You also have inconsistent defaults. Here it's true. > Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:335 > + completionHandler(false); Here it's false. I'm going to make it false everywhere.
Alex Christensen
Comment 31 2018-05-07 13:00:59 PDT
(In reply to Alex Christensen from comment #30) > I'm going to make it false everywhere. Actually true to retain current behavior.
Brent Fulgham
Comment 32 2018-05-07 13:03:08 PDT
Comment on attachment 339735 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339735&action=review >> Source/WebKit/UIProcess/Cocoa/UIDelegate.mm:335 >> + completionHandler(false); > > Here it's false. I'm going to make it false everywhere. Let's make it true for now so that we don't have a behavior change until we've completed this work. Right now, storage access is requested and always allowed to proceed to checking with ResourceLoadStatistics to see if it's a tracker. This prompt would prevent that check from happening. I think tests will fail if we default to false right now.
Alex Christensen
Comment 33 2018-05-07 13:03:37 PDT
Brent Fulgham
Comment 34 2018-05-07 13:03:54 PDT
(In reply to Alex Christensen from comment #31) > (In reply to Alex Christensen from comment #30) > > I'm going to make it false everywhere. > Actually true to retain current behavior. Yes, right.
Alex Christensen
Comment 35 2018-05-07 13:07:21 PDT
Comment on attachment 339742 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339742&action=review > Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm:139 > + _preferences->setStorageAccessPromptsEnabled(enabled); And this has no corresponding C SPI. I'll add one.
Brent Fulgham
Comment 36 2018-05-07 13:12:26 PDT
Comment on attachment 339742 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339742&action=review >> Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm:139 >> + _preferences->setStorageAccessPromptsEnabled(enabled); > > And this has no corresponding C SPI. I'll add one. We did have that in the patch originally, but removed it after review comments suggested it wasn't desirable to keep.
Alex Christensen
Comment 37 2018-05-07 13:14:15 PDT
Alex Christensen
Comment 38 2018-05-07 13:19:54 PDT
(In reply to Dean Jackson from comment #10) > Do you need these versions for the legacy C API? I don't think so. Unfortunately they are still needed.
Alex Christensen
Comment 39 2018-05-07 14:43:10 PDT
John Wilander
Comment 40 2018-05-07 14:47:25 PDT
Youenn and I discussed https://bugs.webkit.org/show_bug.cgi?id=185368 and concluded that the prompt code will be called in the UI process to avoid an extra round trip to the web process. Prompting will be done straight from WebKit::WebResourceLoadStatisticsStore through WebKit::WebsiteDataStore. Thus the WebProcess infrastructure in this patch is not needed. It's OK to land it, I can remove it.
Alex Christensen
Comment 41 2018-05-07 14:57:17 PDT
Brent Fulgham
Comment 42 2018-05-07 16:33:22 PDT
Reopening to add follow-up patch.
Brent Fulgham
Comment 43 2018-05-07 16:36:24 PDT
Alex Christensen
Comment 44 2018-05-07 16:39:12 PDT
Comment on attachment 339766 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=339766&action=review > Source/WebKit/UIProcess/WebPageProxy.cpp:7490 > + RunLoop::main().dispatch([this, protectedThis = makeRef(*this), requestingDomain = WTFMove(requestingDomain), currentDomain = WTFMove(currentDomain), promptEnabled, wasGranted, frameID, completionHandler = WTFMove(completionHandler)] () mutable { This should be in WebResourceLoadStatisticsStore::requestStorageAccess
Brent Fulgham
Comment 45 2018-05-07 16:58:46 PDT
Main thread bug is being handled by Bug 185403
Brent Fulgham
Comment 46 2018-05-07 16:59:28 PDT
Re-closing.
Note You need to log in before you can comment on or make changes to this bug.