WebKit Bugzilla
Attachment 339755 Details for
Bug 185335
: Add experimental feature to prompt for Storage Access API use
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-185335-20180507144310.patch (text/plain), 43.80 KB, created by
Alex Christensen
on 2018-05-07 14:43:10 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Alex Christensen
Created:
2018-05-07 14:43:10 PDT
Size:
43.80 KB
patch
obsolete
>Index: Source/WebCore/ChangeLog >=================================================================== >--- Source/WebCore/ChangeLog (revision 231438) >+++ Source/WebCore/ChangeLog (working copy) >@@ -1,3 +1,26 @@ >+2018-05-07 Brent Fulgham <bfulgham@apple.com> >+ >+ Add experimental feature to prompt for Storage Access API use >+ https://bugs.webkit.org/show_bug.cgi?id=185335 >+ <rdar://problem/39994649> >+ >+ Reviewed by Alex Christensen and Youenn Fablet. >+ >+ Create a new experimental feature that gates the ability of WebKit clients to prompt the user when >+ Storage Access API is invoked. >+ >+ Currently this feature doesn't have any user-visible impact. >+ >+ * page/RuntimeEnabledFeatures.h: >+ (WebCore::RuntimeEnabledFeatures::setStorageAccessPromptsEnabled): >+ (WebCore::RuntimeEnabledFeatures::storageAccessPromptsEnabled const): >+ * testing/InternalSettings.cpp: >+ (WebCore::InternalSettings::Backup::Backup): >+ (WebCore::InternalSettings::Backup::restoreTo): >+ (WebCore::InternalSettings::setStorageAccessPromptsEnabled): >+ * testing/InternalSettings.h: >+ * testing/InternalSettings.idl: >+ > 2018-05-07 Eric Carlson <eric.carlson@apple.com> > > Text track cue logging should include cue text >Index: Source/WebCore/page/RuntimeEnabledFeatures.h >=================================================================== >--- Source/WebCore/page/RuntimeEnabledFeatures.h (revision 231438) >+++ Source/WebCore/page/RuntimeEnabledFeatures.h (working copy) >@@ -256,6 +256,9 @@ public: > void setWebGLCompressedTextureASTCSupportEnabled(bool isEnabled) { m_isWebGLCompressedTextureASTCSupportEnabled = isEnabled; } > bool webGLCompressedTextureASTCSupportEnabled() const { return m_isWebGLCompressedTextureASTCSupportEnabled; } > >+ void setStorageAccessPromptsEnabled(bool isEnabled) { m_promptForStorageAccessAPIEnabled = isEnabled; } >+ bool storageAccessPromptsEnabled() const { return m_promptForStorageAccessAPIEnabled; } >+ > WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures(); > > private: >@@ -394,6 +397,8 @@ private: > > bool m_isWebGLCompressedTextureASTCSupportEnabled { false }; > >+ bool m_promptForStorageAccessAPIEnabled { false }; >+ > friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>; > }; > >Index: Source/WebCore/testing/InternalSettings.cpp >=================================================================== >--- Source/WebCore/testing/InternalSettings.cpp (revision 231438) >+++ Source/WebCore/testing/InternalSettings.cpp (working copy) >@@ -122,6 +122,7 @@ InternalSettings::Backup::Backup(Setting > , m_shouldManageAudioSessionCategory(DeprecatedGlobalSettings::shouldManageAudioSessionCategory()) > #endif > , m_customPasteboardDataEnabled(RuntimeEnabledFeatures::sharedFeatures().customPasteboardDataEnabled()) >+ , m_promptForStorageAccessAPIEnabled(RuntimeEnabledFeatures::sharedFeatures().storageAccessPromptsEnabled()) > { > } > >@@ -225,6 +226,8 @@ void InternalSettings::Backup::restoreTo > #if USE(AUDIO_SESSION) > DeprecatedGlobalSettings::setShouldManageAudioSessionCategory(m_shouldManageAudioSessionCategory); > #endif >+ >+ RuntimeEnabledFeatures::sharedFeatures().setStorageAccessPromptsEnabled(m_promptForStorageAccessAPIEnabled); > } > > class InternalSettingsWrapper : public Supplement<Page> { >@@ -776,6 +779,11 @@ void InternalSettings::setScreenCaptureE > #endif > } > >+void InternalSettings::setStorageAccessPromptsEnabled(bool enabled) >+{ >+ RuntimeEnabledFeatures::sharedFeatures().setStorageAccessPromptsEnabled(enabled); >+} >+ > ExceptionOr<String> InternalSettings::userInterfaceDirectionPolicy() > { > if (!m_page) >Index: Source/WebCore/testing/InternalSettings.h >=================================================================== >--- Source/WebCore/testing/InternalSettings.h (revision 231438) >+++ Source/WebCore/testing/InternalSettings.h (working copy) >@@ -127,6 +127,8 @@ public: > > static bool cssAnimationsAndCSSTransitionsBackedByWebAnimationsEnabled(); > >+ static void setStorageAccessPromptsEnabled(bool); >+ > private: > explicit InternalSettings(Page*); > >@@ -214,6 +216,7 @@ private: > bool m_shouldManageAudioSessionCategory; > #endif > bool m_customPasteboardDataEnabled; >+ bool m_promptForStorageAccessAPIEnabled { false }; > }; > > Page* m_page; >Index: Source/WebCore/testing/InternalSettings.idl >=================================================================== >--- Source/WebCore/testing/InternalSettings.idl (revision 231438) >+++ Source/WebCore/testing/InternalSettings.idl (working copy) >@@ -92,6 +92,7 @@ enum FontLoadTimingOverride { "Block", " > void setWebGPUEnabled(boolean enabled); > void setWebVREnabled(boolean enabled); > void setScreenCaptureEnabled(boolean enabled); >+ void setStorageAccessPromptsEnabled(boolean enabled); > > [MayThrowException] DOMString userInterfaceDirectionPolicy(); > [MayThrowException] void setUserInterfaceDirectionPolicy(DOMString policy); >Index: Source/WebKit/ChangeLog >=================================================================== >--- Source/WebKit/ChangeLog (revision 231438) >+++ Source/WebKit/ChangeLog (working copy) >@@ -1,3 +1,48 @@ >+2018-05-07 Brent Fulgham <bfulgham@apple.com> >+ >+ Add experimental feature to prompt for Storage Access API use >+ https://bugs.webkit.org/show_bug.cgi?id=185335 >+ <rdar://problem/39994649> >+ >+ Reviewed by Alex Christensen and Youenn Fablet. >+ >+ Create a new experimental feature that gates the ability of WebKit clients to prompt the user when >+ Storage Access API is invoked. >+ >+ Currently this feature doesn't have any user-visible impact. >+ >+ * Shared/API/APIObject.h: >+ * Shared/API/c/WKBase.h: >+ * Shared/WebPreferences.yaml: >+ * UIProcess/API/APIUIClient.h: >+ (API::UIClient::requestStorageAccessConfirm): >+ * UIProcess/API/C/WKPage.cpp: >+ (WebKit::RequestStorageAccessConfirmResultListener::create): >+ (WebKit::RequestStorageAccessConfirmResultListener::~RequestStorageAccessConfirmResultListener): >+ (WebKit::RequestStorageAccessConfirmResultListener::call): >+ (WebKit::RequestStorageAccessConfirmResultListener::RequestStorageAccessConfirmResultListener): >+ (WKPageRequestStorageAccessConfirmResultListenerGetTypeID): >+ (WKPageRequestStorageAccessConfirmResultListenerCall): >+ (WKPageSetPageUIClient): >+ * UIProcess/API/C/WKPageUIClient.h: >+ * UIProcess/API/Cocoa/WKPreferences.mm: >+ (-[WKPreferences _storageAccessPromptsEnabled]): >+ (-[WKPreferences _setStorageAccessPromptsEnabled:]): >+ * UIProcess/API/Cocoa/WKPreferencesPrivate.h: >+ * UIProcess/API/Cocoa/WKUIDelegatePrivate.h: >+ * UIProcess/Cocoa/UIDelegate.h: >+ * UIProcess/Cocoa/UIDelegate.mm: >+ (WebKit::UIDelegate::setDelegate): >+ (WebKit::UIDelegate::UIClient::requestStorageAccessConfirm): >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::WebPageProxy::requestStorageAccessConfirm): >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebPageProxy.messages.in: >+ * UIProcess/WebPreferences.cpp: >+ (WebKit::WebPreferences::update): >+ * WebProcess/WebCoreSupport/WebChromeClient.cpp: >+ (WebKit::WebChromeClient::requestStorageAccess): >+ > 2018-05-04 Tim Horton <timothy_horton@apple.com> > > Shift to a lower-level framework for simplifying URLs >Index: Source/WebKit/Shared/WebPreferences.yaml >=================================================================== >--- Source/WebKit/Shared/WebPreferences.yaml (revision 231438) >+++ Source/WebKit/Shared/WebPreferences.yaml (working copy) >@@ -1259,3 +1259,11 @@ WebGLCompressedTextureASTCSupportEnabled > humanReadableDescription: "Support for ASTC compressed texture formats in WebGL" > category: experimental > webcoreBinding: RuntimeEnabledFeatures >+ >+StorageAccessPromptsEnabled: >+ type: bool >+ defaultValue: false >+ humanReadableName: "Prompt for Storage Access API Requests" >+ humanReadableDescription: "Prompt the user when Storage Access API calls are made" >+ category: experimental >+ webcoreBinding: RuntimeEnabledFeatures >Index: Source/WebKit/Shared/API/APIObject.h >=================================================================== >--- Source/WebKit/Shared/API/APIObject.h (revision 231438) >+++ Source/WebKit/Shared/API/APIObject.h (working copy) >@@ -144,6 +144,7 @@ public: > ProcessPoolConfiguration, > PluginSiteDataManager, > Preferences, >+ RequestStorageAccessConfirmResultListener, > ResourceLoadStatisticsStore, > RunBeforeUnloadConfirmPanelResultListener, > RunJavaScriptAlertResultListener, >Index: Source/WebKit/Shared/API/c/WKBase.h >=================================================================== >--- Source/WebKit/Shared/API/c/WKBase.h (revision 231438) >+++ Source/WebKit/Shared/API/c/WKBase.h (working copy) >@@ -125,6 +125,7 @@ typedef const struct OpaqueWKPageRunBefo > typedef const struct OpaqueWKPageRunJavaScriptAlertResultListener* WKPageRunJavaScriptAlertResultListenerRef; > typedef const struct OpaqueWKPageRunJavaScriptConfirmResultListener* WKPageRunJavaScriptConfirmResultListenerRef; > typedef const struct OpaqueWKPageRunJavaScriptPromptResultListener* WKPageRunJavaScriptPromptResultListenerRef; >+typedef const struct OpaqueWKPageRequestStorageAccessConfirmResultListener* WKPageRequestStorageAccessConfirmResultListenerRef; > typedef const struct OpaqueWKResourceLoadStatisticsManager* WKResourceLoadStatisticsManagerRef; > typedef const struct OpaqueWKTextChecker* WKTextCheckerRef; > typedef const struct OpaqueWKSession* WKSessionRef; >Index: Source/WebKit/UIProcess/WebPageProxy.cpp >=================================================================== >--- Source/WebKit/UIProcess/WebPageProxy.cpp (revision 231438) >+++ Source/WebKit/UIProcess/WebPageProxy.cpp (working copy) >@@ -7472,18 +7472,28 @@ void WebPageProxy::stopURLSchemeTask(uin > } > > #if HAVE(CFNETWORK_STORAGE_PARTITIONING) >-void WebPageProxy::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, uint64_t webProcessContextId) >+void WebPageProxy::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t webProcessContextId) > { >- m_websiteDataStore->hasStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, pageID, [this, webProcessContextId] (bool hasAccess) { >+ m_websiteDataStore->hasStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, m_pageID, [this, webProcessContextId] (bool hasAccess) { > m_process->send(Messages::WebPage::StorageAccessResponse(hasAccess, webProcessContextId), m_pageID); > }); > } > >-void WebPageProxy::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, uint64_t webProcessContextId) >+void WebPageProxy::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t webProcessContextId, bool promptEnabled) > { >- ASSERT(pageID == m_pageID); >- m_websiteDataStore->requestStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, pageID, [this, webProcessContextId] (bool wasGranted) { >- m_process->send(Messages::WebPage::StorageAccessResponse(wasGranted, webProcessContextId), m_pageID); >+ auto completionHandler = [this, protectedThis = makeRef(*this), webProcessContextId] (bool access) { >+ m_process->send(Messages::WebPage::StorageAccessResponse(access, webProcessContextId), m_pageID); >+ }; >+ String requestingDomain = subFrameHost; >+ String currentDomain = topFrameHost; >+ m_websiteDataStore->requestStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, m_pageID, [this, protectedThis = makeRef(*this), requestingDomain = WTFMove(requestingDomain), currentDomain = WTFMove(currentDomain), promptEnabled, frameID, completionHandler = WTFMove(completionHandler)] (bool wasGranted) mutable { >+ if (!wasGranted) >+ return completionHandler(false); >+ >+ if (!promptEnabled) >+ return completionHandler(true); >+ >+ m_uiClient->requestStorageAccessConfirm(*this, m_process->webFrame(frameID), requestingDomain, currentDomain, WTFMove(completionHandler)); > }); > } > #endif >Index: Source/WebKit/UIProcess/WebPageProxy.h >=================================================================== >--- Source/WebKit/UIProcess/WebPageProxy.h (revision 231438) >+++ Source/WebKit/UIProcess/WebPageProxy.h (working copy) >@@ -1277,8 +1277,8 @@ public: > #endif > > #if HAVE(CFNETWORK_STORAGE_PARTITIONING) >- void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, uint64_t webProcessContextId); >- void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, uint64_t webProcessContextId); >+ void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t webProcessContextId); >+ void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t webProcessContextId, bool prompt); > #endif > > #if ENABLE(ATTACHMENT_ELEMENT) >Index: Source/WebKit/UIProcess/WebPageProxy.messages.in >=================================================================== >--- Source/WebKit/UIProcess/WebPageProxy.messages.in (revision 231438) >+++ Source/WebKit/UIProcess/WebPageProxy.messages.in (working copy) >@@ -510,8 +510,8 @@ messages -> WebPageProxy { > StopURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier) > > #if HAVE(CFNETWORK_STORAGE_PARTITIONING) >- HasStorageAccess(String subFrameHost, String topFrameHost, uint64_t frameID, uint64_t pageID, uint64_t contextID) >- RequestStorageAccess(String subFrameHost, String topFrameHost, uint64_t frameID, uint64_t pageID, uint64_t contextID) >+ HasStorageAccess(String subFrameHost, String topFrameHost, uint64_t frameID, uint64_t contextID) >+ RequestStorageAccess(String subFrameHost, String topFrameHost, uint64_t frameID, uint64_t contextID, bool prompt) > #endif > > #if ENABLE(ATTACHMENT_ELEMENT) >Index: Source/WebKit/UIProcess/API/APIUIClient.h >=================================================================== >--- Source/WebKit/UIProcess/API/APIUIClient.h (revision 231438) >+++ Source/WebKit/UIProcess/API/APIUIClient.h (working copy) >@@ -128,6 +128,7 @@ public: > virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; } > virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; } > virtual void decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy&, SecurityOrigin&, Function<void(bool)>&& completionHandler) { completionHandler(false); } >+ virtual void requestStorageAccessConfirm(WebKit::WebPageProxy&, WebKit::WebFrameProxy*, const WTF::String& requestingDomain, const WTF::String& currentDomain, CompletionHandler<void(bool)>&& completionHandler) { completionHandler(true); } > > // Printing. > virtual float headerHeight(WebKit::WebPageProxy&, WebKit::WebFrameProxy&) { return 0; } >Index: Source/WebKit/UIProcess/API/C/WKPage.cpp >=================================================================== >--- Source/WebKit/UIProcess/API/C/WKPage.cpp (revision 231438) >+++ Source/WebKit/UIProcess/API/C/WKPage.cpp (working copy) >@@ -111,7 +111,7 @@ template<> struct ClientTraits<WKPagePol > }; > > template<> struct ClientTraits<WKPageUIClientBase> { >- typedef std::tuple<WKPageUIClientV0, WKPageUIClientV1, WKPageUIClientV2, WKPageUIClientV3, WKPageUIClientV4, WKPageUIClientV5, WKPageUIClientV6, WKPageUIClientV7, WKPageUIClientV8, WKPageUIClientV9, WKPageUIClientV10, WKPageUIClientV11> Versions; >+ typedef std::tuple<WKPageUIClientV0, WKPageUIClientV1, WKPageUIClientV2, WKPageUIClientV3, WKPageUIClientV4, WKPageUIClientV5, WKPageUIClientV6, WKPageUIClientV7, WKPageUIClientV8, WKPageUIClientV9, WKPageUIClientV10, WKPageUIClientV11, WKPageUIClientV12> Versions; > }; > > #if ENABLE(CONTEXT_MENUS) >@@ -1510,10 +1510,36 @@ private: > Function<void (const String&)> m_completionHandler; > }; > >+class RequestStorageAccessConfirmResultListener : public API::ObjectImpl<API::Object::Type::RequestStorageAccessConfirmResultListener> { >+public: >+ static Ref<RequestStorageAccessConfirmResultListener> create(CompletionHandler<void(bool)>&& completionHandler) >+ { >+ return adoptRef(*new RequestStorageAccessConfirmResultListener(WTFMove(completionHandler))); >+ } >+ >+ virtual ~RequestStorageAccessConfirmResultListener() >+ { >+ } >+ >+ void call(bool result) >+ { >+ m_completionHandler(result); >+ } >+ >+private: >+ explicit RequestStorageAccessConfirmResultListener(CompletionHandler<void(bool)>&& completionHandler) >+ : m_completionHandler(WTFMove(completionHandler)) >+ { >+ } >+ >+ CompletionHandler<void(bool)> m_completionHandler; >+}; >+ > WK_ADD_API_MAPPING(WKPageRunBeforeUnloadConfirmPanelResultListenerRef, RunBeforeUnloadConfirmPanelResultListener) > WK_ADD_API_MAPPING(WKPageRunJavaScriptAlertResultListenerRef, RunJavaScriptAlertResultListener) > WK_ADD_API_MAPPING(WKPageRunJavaScriptConfirmResultListenerRef, RunJavaScriptConfirmResultListener) > WK_ADD_API_MAPPING(WKPageRunJavaScriptPromptResultListenerRef, RunJavaScriptPromptResultListener) >+WK_ADD_API_MAPPING(WKPageRequestStorageAccessConfirmResultListenerRef, RequestStorageAccessConfirmResultListener) > > } > >@@ -1557,6 +1583,16 @@ void WKPageRunJavaScriptPromptResultList > toImpl(listener)->call(toWTFString(result)); > } > >+WKTypeID WKPageRequestStorageAccessConfirmResultListenerGetTypeID() >+{ >+ return toAPI(RequestStorageAccessConfirmResultListener::APIType); >+} >+ >+void WKPageRequestStorageAccessConfirmResultListenerCall(WKPageRequestStorageAccessConfirmResultListenerRef listener, bool result) >+{ >+ toImpl(listener)->call(result); >+} >+ > void WKPageSetPageUIClient(WKPageRef pageRef, const WKPageUIClientBase* wkClient) > { > class UIClient : public API::Client<WKPageUIClientBase>, public API::UIClient { >@@ -1982,6 +2018,17 @@ void WKPageSetPageUIClient(WKPageRef pag > m_client.decidePolicyForNotificationPermissionRequest(toAPI(&page), toAPI(&origin), toAPI(NotificationPermissionRequest::create(WTFMove(completionHandler)).ptr()), m_client.base.clientInfo); > } > >+ void requestStorageAccessConfirm(WebPageProxy& page, WebFrameProxy* frame, const WTF::String& requestingDomain, const WTF::String& currentDomain, CompletionHandler<void(bool)>&& completionHandler) final >+ { >+ if (!m_client.requestStorageAccessConfirm) { >+ completionHandler(true); >+ return; >+ } >+ >+ auto listener = RequestStorageAccessConfirmResultListener::create(WTFMove(completionHandler)); >+ m_client.requestStorageAccessConfirm(toAPI(&page), toAPI(frame), toAPI(requestingDomain.impl()), toAPI(currentDomain.impl()), toAPI(listener.ptr()), m_client.base.clientInfo); >+ } >+ > // Printing. > float headerHeight(WebPageProxy& page, WebFrameProxy& frame) final > { >Index: Source/WebKit/UIProcess/API/C/WKPageUIClient.h >=================================================================== >--- Source/WebKit/UIProcess/API/C/WKPageUIClient.h (revision 231438) >+++ Source/WebKit/UIProcess/API/C/WKPageUIClient.h (working copy) >@@ -79,12 +79,16 @@ WK_EXPORT void WKPageRunJavaScriptConfir > WK_EXPORT WKTypeID WKPageRunJavaScriptPromptResultListenerGetTypeID(); > WK_EXPORT void WKPageRunJavaScriptPromptResultListenerCall(WKPageRunJavaScriptPromptResultListenerRef listener, WKStringRef result); > >+WK_EXPORT WKTypeID WKPageRequestStorageAccessConfirmResultListenerGetTypeID(); >+WK_EXPORT void WKPageRequestStorageAccessConfirmResultListenerCall(WKPageRequestStorageAccessConfirmResultListenerRef listener, bool result); >+ > typedef void (*WKPageUIClientCallback)(WKPageRef page, const void* clientInfo); > typedef WKPageRef (*WKPageCreateNewPageCallback)(WKPageRef page, WKPageConfigurationRef configuration, WKNavigationActionRef navigationAction, WKWindowFeaturesRef windowFeatures, const void *clientInfo); > typedef void (*WKPageRunBeforeUnloadConfirmPanelCallback)(WKPageRef page, WKStringRef message, WKFrameRef frame, WKPageRunBeforeUnloadConfirmPanelResultListenerRef listener, const void *clientInfo); > typedef void (*WKPageRunJavaScriptAlertCallback)(WKPageRef page, WKStringRef alertText, WKFrameRef frame, WKSecurityOriginRef securityOrigin, WKPageRunJavaScriptAlertResultListenerRef listener, const void *clientInfo); > typedef void (*WKPageRunJavaScriptConfirmCallback)(WKPageRef page, WKStringRef message, WKFrameRef frame, WKSecurityOriginRef securityOrigin, WKPageRunJavaScriptConfirmResultListenerRef listener, const void *clientInfo); > typedef void (*WKPageRunJavaScriptPromptCallback)(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, WKSecurityOriginRef securityOrigin, WKPageRunJavaScriptPromptResultListenerRef listener, const void *clientInfo); >+typedef void (*WKPageRequestStorageAccessConfirmCallback)(WKPageRef page, WKFrameRef frame, WKStringRef requestingDomain, WKStringRef currentDomain, WKPageRequestStorageAccessConfirmResultListenerRef listener, const void *clientInfo); > typedef void (*WKPageTakeFocusCallback)(WKPageRef page, WKFocusDirection direction, const void *clientInfo); > typedef void (*WKPageFocusCallback)(WKPageRef page, const void *clientInfo); > typedef void (*WKPageUnfocusCallback)(WKPageRef page, const void *clientInfo); >@@ -1033,6 +1037,107 @@ typedef struct WKPageUIClientV11 { > WKPageDidResignInputElementStrongPasswordAppearanceCallback didResignInputElementStrongPasswordAppearance; > } WKPageUIClientV11; > >+typedef struct WKPageUIClientV12 { >+ WKPageUIClientBase base; >+ >+ // Version 0. >+ WKPageCreateNewPageCallback_deprecatedForUseWithV0 createNewPage_deprecatedForUseWithV0; >+ WKPageUIClientCallback showPage; >+ WKPageUIClientCallback close; >+ WKPageTakeFocusCallback takeFocus; >+ WKPageFocusCallback focus; >+ WKPageUnfocusCallback unfocus; >+ WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV0 runJavaScriptAlert_deprecatedForUseWithV0; >+ WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV0 runJavaScriptConfirm_deprecatedForUseWithV0; >+ WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV0 runJavaScriptPrompt_deprecatedForUseWithV0; >+ WKPageSetStatusTextCallback setStatusText; >+ WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0 mouseDidMoveOverElement_deprecatedForUseWithV0; >+ WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0 missingPluginButtonClicked_deprecatedForUseWithV0; >+ WKPageDidNotHandleKeyEventCallback didNotHandleKeyEvent; >+ WKPageDidNotHandleWheelEventCallback didNotHandleWheelEvent; >+ WKPageGetToolbarsAreVisibleCallback toolbarsAreVisible; >+ WKPageSetToolbarsAreVisibleCallback setToolbarsAreVisible; >+ WKPageGetMenuBarIsVisibleCallback menuBarIsVisible; >+ WKPageSetMenuBarIsVisibleCallback setMenuBarIsVisible; >+ WKPageGetStatusBarIsVisibleCallback statusBarIsVisible; >+ WKPageSetStatusBarIsVisibleCallback setStatusBarIsVisible; >+ WKPageGetIsResizableCallback isResizable; >+ WKPageSetIsResizableCallback setIsResizable; >+ WKPageGetWindowFrameCallback getWindowFrame; >+ WKPageSetWindowFrameCallback setWindowFrame; >+ WKPageRunBeforeUnloadConfirmPanelCallback_deprecatedForUseWithV6 runBeforeUnloadConfirmPanel_deprecatedForUseWithV6; >+ WKPageUIClientCallback didDraw; >+ WKPageUIClientCallback pageDidScroll; >+ WKPageExceededDatabaseQuotaCallback exceededDatabaseQuota; >+ WKPageRunOpenPanelCallback runOpenPanel; >+ WKPageDecidePolicyForGeolocationPermissionRequestCallback decidePolicyForGeolocationPermissionRequest; >+ WKPageHeaderHeightCallback headerHeight; >+ WKPageFooterHeightCallback footerHeight; >+ WKPageDrawHeaderCallback drawHeader; >+ WKPageDrawFooterCallback drawFooter; >+ WKPagePrintFrameCallback printFrame; >+ WKPageUIClientCallback runModal; >+ void* unused1; // Used to be didCompleteRubberBandForMainFrame >+ WKPageSaveDataToFileInDownloadsFolderCallback saveDataToFileInDownloadsFolder; >+ void* shouldInterruptJavaScript_unavailable; >+ >+ // Version 1. >+ WKPageCreateNewPageCallback_deprecatedForUseWithV1 createNewPage_deprecatedForUseWithV1; >+ WKPageMouseDidMoveOverElementCallback mouseDidMoveOverElement; >+ WKPageDecidePolicyForNotificationPermissionRequestCallback decidePolicyForNotificationPermissionRequest; >+ WKPageUnavailablePluginButtonClickedCallback_deprecatedForUseWithV1 unavailablePluginButtonClicked_deprecatedForUseWithV1; >+ >+ // Version 2. >+ WKPageShowColorPickerCallback showColorPicker; >+ WKPageHideColorPickerCallback hideColorPicker; >+ WKPageUnavailablePluginButtonClickedCallback unavailablePluginButtonClicked; >+ >+ // Version 3. >+ WKPagePinnedStateDidChangeCallback pinnedStateDidChange; >+ >+ // Version 4. >+ void* unused2; // Used to be didBeginTrackingPotentialLongMousePress. >+ void* unused3; // Used to be didRecognizeLongMousePress. >+ void* unused4; // Used to be didCancelTrackingPotentialLongMousePress. >+ WKPageIsPlayingAudioDidChangeCallback isPlayingAudioDidChange; >+ >+ // Version 5. >+ WKPageDecidePolicyForUserMediaPermissionRequestCallback decidePolicyForUserMediaPermissionRequest; >+ WKPageDidClickAutoFillButtonCallback didClickAutoFillButton; >+ WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV5 runJavaScriptAlert_deprecatedForUseWithV5; >+ WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV5 runJavaScriptConfirm_deprecatedForUseWithV5; >+ WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV5 runJavaScriptPrompt_deprecatedForUseWithV5; >+ WKPageMediaSessionMetadataDidChangeCallback mediaSessionMetadataDidChange; >+ >+ // Version 6. >+ WKPageCreateNewPageCallback createNewPage; >+ WKPageRunJavaScriptAlertCallback runJavaScriptAlert; >+ WKPageRunJavaScriptConfirmCallback runJavaScriptConfirm; >+ WKPageRunJavaScriptPromptCallback runJavaScriptPrompt; >+ WKCheckUserMediaPermissionCallback checkUserMediaPermissionForOrigin; >+ >+ // Version 7. >+ WKPageRunBeforeUnloadConfirmPanelCallback runBeforeUnloadConfirmPanel; >+ WKFullscreenMayReturnToInlineCallback fullscreenMayReturnToInline; >+ >+ // Version 8. >+ WKRequestPointerLockCallback requestPointerLock; >+ WKDidLosePointerLockCallback didLosePointerLock; >+ >+ // Version 9. >+ WKHandleAutoplayEventCallback handleAutoplayEvent; >+ >+ // Version 10. >+ WKHasVideoInPictureInPictureDidChangeCallback hasVideoInPictureInPictureDidChange; >+ WKDidExceedBackgroundResourceLimitWhileInForegroundCallback didExceedBackgroundResourceLimitWhileInForeground; >+ >+ // Version 11. >+ WKPageDidResignInputElementStrongPasswordAppearanceCallback didResignInputElementStrongPasswordAppearance; >+ >+ // Version 12. >+ WKPageRequestStorageAccessConfirmCallback requestStorageAccessConfirm; >+} WKPageUIClientV12; >+ > #ifdef __cplusplus > } > #endif >Index: Source/WebKit/UIProcess/API/C/WKPreferences.cpp >=================================================================== >--- Source/WebKit/UIProcess/API/C/WKPreferences.cpp (revision 231438) >+++ Source/WebKit/UIProcess/API/C/WKPreferences.cpp (working copy) >@@ -194,6 +194,16 @@ bool WKPreferencesGetJavaScriptCanOpenWi > return toImpl(preferencesRef)->javaScriptCanOpenWindowsAutomatically(); > } > >+void WKPreferencesSetStorageAccessPromptsEnabled(WKPreferencesRef preferencesRef, bool enabled) >+{ >+ toImpl(preferencesRef)->setStorageAccessPromptsEnabled(enabled); >+} >+ >+bool WKPreferencesGetStorageAccessPromptsEnabled(WKPreferencesRef preferencesRef) >+{ >+ return toImpl(preferencesRef)->storageAccessPromptsEnabled(); >+} >+ > void WKPreferencesSetHyperlinkAuditingEnabled(WKPreferencesRef preferencesRef, bool hyperlinkAuditingEnabled) > { > toImpl(preferencesRef)->setHyperlinkAuditingEnabled(hyperlinkAuditingEnabled); >Index: Source/WebKit/UIProcess/API/C/WKPreferencesRef.h >=================================================================== >--- Source/WebKit/UIProcess/API/C/WKPreferencesRef.h (revision 231438) >+++ Source/WebKit/UIProcess/API/C/WKPreferencesRef.h (working copy) >@@ -108,6 +108,10 @@ WK_EXPORT bool WKPreferencesGetJavaEnabl > WK_EXPORT void WKPreferencesSetJavaScriptCanOpenWindowsAutomatically(WKPreferencesRef preferences, bool javaScriptCanOpenWindowsAutomatically); > WK_EXPORT bool WKPreferencesGetJavaScriptCanOpenWindowsAutomatically(WKPreferencesRef preferences); > >+// Defaults to false. >+WK_EXPORT void WKPreferencesSetStorageAccessPromptsEnabled(WKPreferencesRef preferencesRef, bool enabled); >+WK_EXPORT bool WKPreferencesGetStorageAccessPromptsEnabled(WKPreferencesRef preferencesRef); >+ > // Defaults to true. > WK_EXPORT void WKPreferencesSetHyperlinkAuditingEnabled(WKPreferencesRef preferences, bool hyperlinkAuditingEnabled); > WK_EXPORT bool WKPreferencesGetHyperlinkAuditingEnabled(WKPreferencesRef preferences); >Index: Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm >=================================================================== >--- Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm (revision 231438) >+++ Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm (working copy) >@@ -129,6 +129,16 @@ - (void)setJavaScriptCanOpenWindowsAutom > _preferences->setJavaScriptCanOpenWindowsAutomatically(javaScriptCanOpenWindowsAutomatically); > } > >+- (BOOL)_storageAccessPromptsEnabled >+{ >+ return _preferences->storageAccessPromptsEnabled(); >+} >+ >+- (void)_setStorageAccessPromptsEnabled:(BOOL)enabled >+{ >+ _preferences->setStorageAccessPromptsEnabled(enabled); >+} >+ > #pragma mark OS X-specific methods > > #if PLATFORM(MAC) >Index: Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h >=================================================================== >--- Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h (revision 231438) >+++ Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h (working copy) >@@ -136,6 +136,8 @@ typedef NS_ENUM(NSInteger, _WKEditableLi > > @property (nonatomic, setter=_setShouldEnableTextAutosizingBoost:) BOOL _shouldEnableTextAutosizingBoost WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > >+@property (nonatomic, setter=_setStorageAccessPromptsEnabled:) BOOL _storageAccessPromptsEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+ > #if !TARGET_OS_IPHONE > @property (nonatomic, setter=_setWebGLEnabled:) BOOL _webGLEnabled WK_API_AVAILABLE(macosx(10.13.4)); > @property (nonatomic, setter=_setJavaEnabledForLocalFiles:) BOOL _javaEnabledForLocalFiles WK_API_AVAILABLE(macosx(10.13.4)); >Index: Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h >=================================================================== >--- Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (revision 231438) >+++ Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (working copy) >@@ -116,6 +116,8 @@ struct UIEdgeInsets; > > - (void)_webView:(WKWebView *)webView didResignInputElementStrongPasswordAppearanceWithUserInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > >+- (void)_webView:(WKWebView *)webView requestStorageAccessPanelForDomain:(NSString *)requestingDomain underCurrentDomain:(NSString *)currentDomain completionHandler:(void (^)(BOOL result))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+ > #if TARGET_OS_IPHONE > - (BOOL)_webView:(WKWebView *)webView shouldIncludeAppLinkActionsForElement:(_WKActivatedElementInfo *)element WK_API_AVAILABLE(ios(9.0)); > - (NSArray *)_webView:(WKWebView *)webView actionsForElement:(_WKActivatedElementInfo *)element defaultActions:(NSArray<_WKElementAction *> *)defaultActions; >Index: Source/WebKit/UIProcess/Cocoa/UIDelegate.h >=================================================================== >--- Source/WebKit/UIProcess/Cocoa/UIDelegate.h (revision 231438) >+++ Source/WebKit/UIProcess/Cocoa/UIDelegate.h (working copy) >@@ -88,6 +88,7 @@ private: > void runJavaScriptAlert(WebPageProxy*, const WTF::String&, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void()>&& completionHandler) final; > void runJavaScriptConfirm(WebPageProxy*, const WTF::String&, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void(bool)>&& completionHandler) final; > void runJavaScriptPrompt(WebPageProxy*, const WTF::String&, const WTF::String&, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void(const WTF::String&)>&&) final; >+ void requestStorageAccessConfirm(WebPageProxy&, WebFrameProxy*, const WTF::String& requestingDomain, const WTF::String& currentDomain, CompletionHandler<void(bool)>&&) final; > void decidePolicyForGeolocationPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, Function<void(bool)>&) final; > bool canRunBeforeUnloadConfirmPanel() const final; > void runBeforeUnloadConfirmPanel(WebPageProxy*, const WTF::String&, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void(bool)>&& completionHandler) final; >@@ -156,6 +157,7 @@ private: > bool webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler : 1; > bool webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler : 1; > bool webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler : 1; >+ bool webViewRequestStorageAccessPanelForTopPrivatelyControlledDomainUnderFirstPartyTopPrivatelyControlledDomainCompletionHandler : 1; > bool webViewRunBeforeUnloadConfirmPanelWithMessageInitiatedByFrameCompletionHandler : 1; > bool webViewRequestGeolocationPermissionForFrameDecisionHandler : 1; > bool webViewDidResignInputElementStrongPasswordAppearanceWithUserInfo : 1; >Index: Source/WebKit/UIProcess/Cocoa/UIDelegate.mm >=================================================================== >--- Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (revision 231438) >+++ Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (working copy) >@@ -102,6 +102,7 @@ void UIDelegate::setDelegate(id <WKUIDel > m_delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:)]; > m_delegateMethods.webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:)]; > m_delegateMethods.webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:)]; >+ m_delegateMethods.webViewRequestStorageAccessPanelForTopPrivatelyControlledDomainUnderFirstPartyTopPrivatelyControlledDomainCompletionHandler = [delegate respondsToSelector:@selector(_webView:requestStorageAccessPanelForDomain:underCurrentDomain:completionHandler:)]; > m_delegateMethods.webViewRunBeforeUnloadConfirmPanelWithMessageInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(_webView:runBeforeUnloadConfirmPanelWithMessage:initiatedByFrame:completionHandler:)]; > m_delegateMethods.webViewRequestGeolocationPermissionForFrameDecisionHandler = [delegate respondsToSelector:@selector(_webView:requestGeolocationPermissionForFrame:decisionHandler:)]; > m_delegateMethods.webViewDidResignInputElementStrongPasswordAppearanceWithUserInfo = [delegate respondsToSelector:@selector(_webView:didResignInputElementStrongPasswordAppearanceWithUserInfo:)]; >@@ -328,6 +329,28 @@ void UIDelegate::UIClient::runJavaScript > }).get()]; > } > >+void UIDelegate::UIClient::requestStorageAccessConfirm(WebPageProxy&, WebFrameProxy*, const WTF::String& requestingDomain, const WTF::String& currentDomain, CompletionHandler<void(bool)>&& completionHandler) >+{ >+ if (!m_uiDelegate.m_delegateMethods.webViewRequestStorageAccessPanelForTopPrivatelyControlledDomainUnderFirstPartyTopPrivatelyControlledDomainCompletionHandler) { >+ completionHandler(true); >+ return; >+ } >+ >+ auto delegate = m_uiDelegate.m_delegate.get(); >+ if (!delegate) { >+ completionHandler(true); >+ return; >+ } >+ >+ auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:requestStorageAccessPanelForDomain:underCurrentDomain:completionHandler:)); >+ [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView requestStorageAccessPanelForDomain:requestingDomain underCurrentDomain:currentDomain completionHandler:BlockPtr<void(BOOL)>::fromCallable([completionHandler = WTFMove(completionHandler), checker = WTFMove(checker)](BOOL result) { >+ if (checker->completionHandlerHasBeenCalled()) >+ return; >+ completionHandler(result); >+ checker->didCallCompletionHandler(); >+ }).get()]; >+} >+ > void UIDelegate::UIClient::decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy& frame, API::SecurityOrigin& securityOrigin, Function<void(bool)>& completionHandler) > { > if (!m_uiDelegate.m_delegateMethods.webViewRequestGeolocationPermissionForFrameDecisionHandler) >Index: Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp >=================================================================== >--- Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp (revision 231438) >+++ Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp (working copy) >@@ -1284,14 +1284,14 @@ void WebChromeClient::didInvalidateDocum > } > > #if HAVE(CFNETWORK_STORAGE_PARTITIONING) >-void WebChromeClient::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback) >+void WebChromeClient::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t, CompletionHandler<void(bool)>&& callback) > { >- m_page.hasStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, pageID, WTFMove(callback)); >+ m_page.hasStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, WTFMove(callback)); > } > >-void WebChromeClient::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback) >+void WebChromeClient::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t, CompletionHandler<void(bool)>&& callback) > { >- m_page.requestStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, pageID, WTFMove(callback)); >+ m_page.requestStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, WTFMove(callback)); > } > #endif > >Index: Source/WebKit/WebProcess/WebPage/WebPage.cpp >=================================================================== >--- Source/WebKit/WebProcess/WebPage/WebPage.cpp (revision 231438) >+++ Source/WebKit/WebProcess/WebPage/WebPage.cpp (working copy) >@@ -5907,25 +5907,26 @@ static uint64_t nextRequestStorageAccess > return ++nextContextId; > } > >-void WebPage::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback) >+void WebPage::hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, CompletionHandler<void(bool)>&& callback) > { > auto contextId = nextRequestStorageAccessContextId(); > auto addResult = m_storageAccessResponseCallbackMap.add(contextId, WTFMove(callback)); > ASSERT(addResult.isNewEntry); > if (addResult.iterator->value) >- send(Messages::WebPageProxy::HasStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, pageID, contextId)); >+ send(Messages::WebPageProxy::HasStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, contextId)); > else > callback(false); > } > >-void WebPage::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback) >+void WebPage::requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, CompletionHandler<void(bool)>&& callback) > { > auto contextId = nextRequestStorageAccessContextId(); > auto addResult = m_storageAccessResponseCallbackMap.add(contextId, WTFMove(callback)); > ASSERT(addResult.isNewEntry); >- if (addResult.iterator->value) >- send(Messages::WebPageProxy::RequestStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, pageID, contextId)); >- else >+ if (addResult.iterator->value) { >+ bool promptEnabled = RuntimeEnabledFeatures::sharedFeatures().storageAccessPromptsEnabled(); >+ send(Messages::WebPageProxy::RequestStorageAccess(WTFMove(subFrameHost), WTFMove(topFrameHost), frameID, contextId, promptEnabled)); >+ } else > callback(false); > } > >Index: Source/WebKit/WebProcess/WebPage/WebPage.h >=================================================================== >--- Source/WebKit/WebProcess/WebPage/WebPage.h (revision 231438) >+++ Source/WebKit/WebProcess/WebPage/WebPage.h (working copy) >@@ -1052,8 +1052,8 @@ public: > void flushPendingEditorStateUpdate(); > > #if HAVE(CFNETWORK_STORAGE_PARTITIONING) >- void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback); >- void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, WTF::CompletionHandler<void (bool)>&& callback); >+ void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, CompletionHandler<void(bool)>&& callback); >+ void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, CompletionHandler<void(bool)>&& callback); > void storageAccessResponse(bool wasGranted, uint64_t contextId); > #endif >
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 185335
:
339616
|
339651
|
339652
|
339655
|
339659
|
339693
|
339697
|
339700
|
339735
|
339742
|
339745
|
339755
|
339766