Title: [277977] branches/safari-611.3.6.0-branch/Source
Revision
277977
Author
alanc...@apple.com
Date
2021-05-24 16:18:16 -0700 (Mon, 24 May 2021)

Log Message

Cherry-pick r274746. rdar://78422238

    Cannot login to microsoftonline.com without allowing storage access
    https://bugs.webkit.org/show_bug.cgi?id=223510
    <rdar://problem/75619058>

    Reviewed by John Wilander.

    Source/WebCore:

    This patch introduces two changes:

    1. Activate the storage access quirks for default browsers only. This
    is the main place we test them, and can lead to unexpected behavior in
    apps otherwise.

    2. Doesn't cancel the click even if the user denies storage access.
    Previously we we were not allowing the click because it produces
    unexpected behavior. But, sites like login.microsoftonline.com are used
    by multiple Microsoft login flows. Since only a subset require storage
    access, canceling the click across the board could be considered
    regressing behavior.

    Since storage access data is stored in the network process, we
    currently cancel the user's click on quirked sites while we wait
    asyncronously for the IPC response. If the user grants storage access,
    we store this in the web content process and dispatch a synthetic
    click. In this case, when the click triggers another storage access
    check, we can allow the click because we no longer need to wait for
    information from the network process.

    We need some heuristic in the web content process to handle the case
    of the user denying storage access to know whether to allow a
    synthetic click to happen. This patch introduces
    hasDeniedCrossPageStorageAccess which stores domains in the web
    content process which have been denied storage access via quirk. If
    a user has previously denied storage access in that web content
    process, we don't prompt again. A new web content process will give them
    another opportunity to allow/deny storage access.

    * dom/Element.cpp:
    (WebCore::Element::dispatchMouseEvent):
    * loader/FrameLoaderClient.h:
    Add a client function to check if the parent process is a full web
    browser, and pass this to the place we apply the quirks.

    * loader/ResourceLoadObserver.h:
    (WebCore::ResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
    (WebCore::ResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
    * page/Quirks.cpp:
    (WebCore::hasDeniedCrossPageStorageAccess):
    (WebCore::Quirks::requestStorageAccessAndHandleClick const):
    (WebCore::Quirks::triggerOptionalStorageAccessQuirk const):
    * page/Quirks.h:

    Source/WebKit:

    Disable the storage access quirk for non-default web browsers and
    don't cancel the login click on sites even if the user denies storage
    access. See WebCore changelog for more details.

    * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
    (WebKit::WebFrameLoaderClient::isParentProcessAFullWebBrowser const):
    * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
    * WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp:
    (WebKit::WebResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
    (WebKit::WebResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
    * WebProcess/WebCoreSupport/WebResourceLoadObserver.h:
    * WebProcess/WebPage/WebPage.cpp:
    (WebKit::WebPage::pageIsParentProcessAFullWebBrowser):
    (WebKit::WebPage::updatePreferences):
    * WebProcess/WebPage/WebPage.h:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274746 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-611.3.6.0-branch/Source/WebCore/ChangeLog (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebCore/ChangeLog	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebCore/ChangeLog	2021-05-24 23:18:16 UTC (rev 277977)
@@ -1,3 +1,133 @@
+2021-03-22  Russell Epstein  <repst...@apple.com>
+
+        Cherry-pick r274746. rdar://problem/75706601
+
+    Cannot login to microsoftonline.com without allowing storage access
+    https://bugs.webkit.org/show_bug.cgi?id=223510
+    <rdar://problem/75619058>
+    
+    Reviewed by John Wilander.
+    
+    Source/WebCore:
+    
+    This patch introduces two changes:
+    
+    1. Activate the storage access quirks for default browsers only. This
+    is the main place we test them, and can lead to unexpected behavior in
+    apps otherwise.
+    
+    2. Doesn't cancel the click even if the user denies storage access.
+    Previously we we were not allowing the click because it produces
+    unexpected behavior. But, sites like login.microsoftonline.com are used
+    by multiple Microsoft login flows. Since only a subset require storage
+    access, canceling the click across the board could be considered
+    regressing behavior.
+    
+    Since storage access data is stored in the network process, we
+    currently cancel the user's click on quirked sites while we wait
+    asyncronously for the IPC response. If the user grants storage access,
+    we store this in the web content process and dispatch a synthetic
+    click. In this case, when the click triggers another storage access
+    check, we can allow the click because we no longer need to wait for
+    information from the network process.
+    
+    We need some heuristic in the web content process to handle the case
+    of the user denying storage access to know whether to allow a
+    synthetic click to happen. This patch introduces
+    hasDeniedCrossPageStorageAccess which stores domains in the web
+    content process which have been denied storage access via quirk. If
+    a user has previously denied storage access in that web content
+    process, we don't prompt again. A new web content process will give them
+    another opportunity to allow/deny storage access.
+    
+    * dom/Element.cpp:
+    (WebCore::Element::dispatchMouseEvent):
+    * loader/FrameLoaderClient.h:
+    Add a client function to check if the parent process is a full web
+    browser, and pass this to the place we apply the quirks.
+    
+    * loader/ResourceLoadObserver.h:
+    (WebCore::ResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
+    (WebCore::ResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
+    * page/Quirks.cpp:
+    (WebCore::hasDeniedCrossPageStorageAccess):
+    (WebCore::Quirks::requestStorageAccessAndHandleClick const):
+    (WebCore::Quirks::triggerOptionalStorageAccessQuirk const):
+    * page/Quirks.h:
+    
+    Source/WebKit:
+    
+    Disable the storage access quirk for non-default web browsers and
+    don't cancel the login click on sites even if the user denies storage
+    access. See WebCore changelog for more details.
+    
+    * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+    (WebKit::WebFrameLoaderClient::isParentProcessAFullWebBrowser const):
+    * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+    * WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp:
+    (WebKit::WebResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
+    (WebKit::WebResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
+    * WebProcess/WebCoreSupport/WebResourceLoadObserver.h:
+    * WebProcess/WebPage/WebPage.cpp:
+    (WebKit::WebPage::pageIsParentProcessAFullWebBrowser):
+    (WebKit::WebPage::updatePreferences):
+    * WebProcess/WebPage/WebPage.h:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274746 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-03-19  Kate Cheney  <katherine_che...@apple.com>
+
+            Cannot login to microsoftonline.com without allowing storage access
+            https://bugs.webkit.org/show_bug.cgi?id=223510
+            <rdar://problem/75619058>
+
+            Reviewed by John Wilander.
+
+            This patch introduces two changes:
+
+            1. Activate the storage access quirks for default browsers only. This
+            is the main place we test them, and can lead to unexpected behavior in
+            apps otherwise.
+
+            2. Doesn't cancel the click even if the user denies storage access.
+            Previously we we were not allowing the click because it produces
+            unexpected behavior. But, sites like login.microsoftonline.com are used
+            by multiple Microsoft login flows. Since only a subset require storage
+            access, canceling the click across the board could be considered
+            regressing behavior.
+
+            Since storage access data is stored in the network process, we
+            currently cancel the user's click on quirked sites while we wait
+            asyncronously for the IPC response. If the user grants storage access,
+            we store this in the web content process and dispatch a synthetic
+            click. In this case, when the click triggers another storage access
+            check, we can allow the click because we no longer need to wait for
+            information from the network process.
+
+            We need some heuristic in the web content process to handle the case
+            of the user denying storage access to know whether to allow a
+            synthetic click to happen. This patch introduces
+            hasDeniedCrossPageStorageAccess which stores domains in the web
+            content process which have been denied storage access via quirk. If
+            a user has previously denied storage access in that web content
+            process, we don't prompt again. A new web content process will give them
+            another opportunity to allow/deny storage access.
+
+            * dom/Element.cpp:
+            (WebCore::Element::dispatchMouseEvent):
+            * loader/FrameLoaderClient.h:
+            Add a client function to check if the parent process is a full web
+            browser, and pass this to the place we apply the quirks.
+
+            * loader/ResourceLoadObserver.h:
+            (WebCore::ResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
+            (WebCore::ResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
+            * page/Quirks.cpp:
+            (WebCore::hasDeniedCrossPageStorageAccess):
+            (WebCore::Quirks::requestStorageAccessAndHandleClick const):
+            (WebCore::Quirks::triggerOptionalStorageAccessQuirk const):
+            * page/Quirks.h:
+
 2021-05-24  Alan Coon  <alanc...@apple.com>
 
         Cherry-pick r277177. rdar://problem/78411433

Modified: branches/safari-611.3.6.0-branch/Source/WebCore/dom/Element.cpp (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebCore/dom/Element.cpp	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebCore/dom/Element.cpp	2021-05-24 23:18:16 UTC (rev 277977)
@@ -389,8 +389,15 @@
 
     if (dispatchPointerEventIfNeeded(*this, mouseEvent.get(), platformEvent, didNotSwallowEvent) == ShouldIgnoreMouseEvent::Yes)
         return false;
-
-    if (Quirks::StorageAccessResult::ShouldCancelEvent == document().quirks().triggerOptionalStorageAccessQuirk(*this, platformEvent, eventType, detail, relatedTarget))
+    
+    auto isParentProcessAFullWebBrowser = false;
+#if PLATFORM(IOS_FAMILY)
+    if (Frame* frame = document().frame())
+        isParentProcessAFullWebBrowser = frame->loader().client().isParentProcessAFullWebBrowser();
+#elif PLATFORM(MAC)
+    isParentProcessAFullWebBrowser = MacApplication::isSafari();
+#endif
+    if (Quirks::StorageAccessResult::ShouldCancelEvent == document().quirks().triggerOptionalStorageAccessQuirk(*this, platformEvent, eventType, detail, relatedTarget, isParentProcessAFullWebBrowser))
         return false;
 
     ASSERT(!mouseEvent->target() || mouseEvent->target() != relatedTarget);

Modified: branches/safari-611.3.6.0-branch/Source/WebCore/loader/FrameLoaderClient.h (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebCore/loader/FrameLoaderClient.h	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebCore/loader/FrameLoaderClient.h	2021-05-24 23:18:16 UTC (rev 277977)
@@ -381,6 +381,8 @@
     virtual bool shouldEnableInAppBrowserPrivacyProtections() const { return false; }
     virtual void notifyPageOfAppBoundBehavior() { }
 #endif
+    
+    virtual bool isParentProcessAFullWebBrowser() const { return false; }
 };
 
 } // namespace WebCore

Modified: branches/safari-611.3.6.0-branch/Source/WebCore/loader/ResourceLoadObserver.h (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebCore/loader/ResourceLoadObserver.h	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebCore/loader/ResourceLoadObserver.h	2021-05-24 23:18:16 UTC (rev 277977)
@@ -71,6 +71,9 @@
     virtual void setDomainsWithCrossPageStorageAccess(HashMap<TopFrameDomain, SubResourceDomain>&&, CompletionHandler<void()>&& completionHandler) { completionHandler(); }
     virtual bool hasCrossPageStorageAccess(const SubResourceDomain&, const TopFrameDomain&) const { return false; }
     virtual bool hasHadUserInteraction(const RegistrableDomain&) const { return false; }
+    
+    virtual void setHasDeniedCrossPageStorageAccess(HashMap<TopFrameDomain, SubResourceDomain>&&, CompletionHandler<void()>&& completionHandler) { completionHandler(); }
+    virtual bool hasDeniedCrossPageStorageAccess(const SubResourceDomain&, const TopFrameDomain&) const { return false; }
 };
     
 } // namespace WebCore

Modified: branches/safari-611.3.6.0-branch/Source/WebCore/page/Quirks.cpp (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebCore/page/Quirks.cpp	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebCore/page/Quirks.cpp	2021-05-24 23:18:16 UTC (rev 277977)
@@ -1033,6 +1033,15 @@
     return true;
 }
 
+static bool hasDeniedCrossPageStorageAccess(const HashSet<RegistrableDomain>& loginDomains, const RegistrableDomain& topFrameDomain)
+{
+    for (auto& loginDomain : loginDomains) {
+        if (ResourceLoadObserver::shared().hasDeniedCrossPageStorageAccess(loginDomain, topFrameDomain))
+            return true;
+    }
+    return false;
+}
+
 const String& Quirks::BBCRadioPlayerURLString()
 {
     static NeverDestroyed<String> BBCRadioPlayerURLString = "https://www.bbc.co.uk/sounds/player/bbc_world_service"_s;
@@ -1060,16 +1069,17 @@
     return element.parentElement()->classNames().contains("p_audioButton_buttonInner") && parentElement->parentElement()->classNames().contains("hidden");
 }
 
-Quirks::StorageAccessResult Quirks::requestStorageAccessAndHandleClick(CompletionHandler<void(StorageAccessWasGranted)>&& completionHandler) const
+Quirks::StorageAccessResult Quirks::requestStorageAccessAndHandleClick(CompletionHandler<void(ShouldDispatchClick)>&& completionHandler) const
 {
     auto firstPartyDomain = mapToTopDomain(m_document->topDocument().url());
     auto domainsInNeedOfStorageAccess = NetworkStorageSession::subResourceDomainsInNeedOfStorageAccessForFirstParty(firstPartyDomain);
     if (!domainsInNeedOfStorageAccess || domainsInNeedOfStorageAccess.value().isEmpty()) {
-        completionHandler(StorageAccessWasGranted::No);
+        completionHandler(ShouldDispatchClick::No);
         return Quirks::StorageAccessResult::ShouldNotCancelEvent;
     }
-    if (hasStorageAccessForAllLoginDomains(*domainsInNeedOfStorageAccess, firstPartyDomain)) {
-        completionHandler(StorageAccessWasGranted::No);
+    if (hasStorageAccessForAllLoginDomains(*domainsInNeedOfStorageAccess, firstPartyDomain)
+        || hasDeniedCrossPageStorageAccess(*domainsInNeedOfStorageAccess, firstPartyDomain)) {
+        completionHandler(ShouldDispatchClick::No);
         return Quirks::StorageAccessResult::ShouldNotCancelEvent;
     }
 
@@ -1076,18 +1086,20 @@
     auto domainInNeedOfStorageAccess = RegistrableDomain(*domainsInNeedOfStorageAccess.value().begin().get());
 
     if (!m_document) {
-        completionHandler(StorageAccessWasGranted::No);
+        completionHandler(ShouldDispatchClick::No);
         return Quirks::StorageAccessResult::ShouldNotCancelEvent;
     }
 
     DocumentStorageAccess::requestStorageAccessForNonDocumentQuirk(*m_document, WTFMove(domainInNeedOfStorageAccess), [firstPartyDomain, domainInNeedOfStorageAccess, completionHandler = WTFMove(completionHandler)](StorageAccessWasGranted storageAccessGranted) mutable {
         if (storageAccessGranted == StorageAccessWasGranted::No) {
-            completionHandler(storageAccessGranted);
+            ResourceLoadObserver::shared().setHasDeniedCrossPageStorageAccess({{ firstPartyDomain, domainInNeedOfStorageAccess }}, [completionHandler = WTFMove(completionHandler)] () mutable {
+                completionHandler(ShouldDispatchClick::Yes);
+            });
             return;
         }
 
-        ResourceLoadObserver::shared().setDomainsWithCrossPageStorageAccess({{ firstPartyDomain, domainInNeedOfStorageAccess }}, [storageAccessGranted, completionHandler = WTFMove(completionHandler)] () mutable {
-            completionHandler(storageAccessGranted);
+        ResourceLoadObserver::shared().setDomainsWithCrossPageStorageAccess({{ firstPartyDomain, domainInNeedOfStorageAccess }}, [completionHandler = WTFMove(completionHandler)] () mutable {
+            completionHandler(ShouldDispatchClick::Yes);
         });
     });
     return Quirks::StorageAccessResult::ShouldCancelEvent;
@@ -1102,9 +1114,9 @@
 }
 #endif
 
-Quirks::StorageAccessResult Quirks::triggerOptionalStorageAccessQuirk(Element& element, const PlatformMouseEvent& platformEvent, const AtomString& eventType, int detail, Element* relatedTarget) const
+Quirks::StorageAccessResult Quirks::triggerOptionalStorageAccessQuirk(Element& element, const PlatformMouseEvent& platformEvent, const AtomString& eventType, int detail, Element* relatedTarget, bool isParentProcessAFullWebBrowser) const
 {
-    if (!DeprecatedGlobalSettings::resourceLoadStatisticsEnabled())
+    if (!DeprecatedGlobalSettings::resourceLoadStatisticsEnabled() || !isParentProcessAFullWebBrowser)
         return Quirks::StorageAccessResult::ShouldNotCancelEvent;
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -1179,11 +1191,11 @@
         }
 
         if (isStorageAccessQuirkDomainAndElement(m_document->url(), element)) {
-            return requestStorageAccessAndHandleClick([element = makeWeakPtr(element), platformEvent, eventType, detail, relatedTarget] (StorageAccessWasGranted storageAccessWasGranted) mutable {
+            return requestStorageAccessAndHandleClick([element = makeWeakPtr(element), platformEvent, eventType, detail, relatedTarget] (ShouldDispatchClick shouldDispatchClick) mutable {
                 if (!element)
                     return;
 
-                if (storageAccessWasGranted == StorageAccessWasGranted::Yes)
+                if (shouldDispatchClick == ShouldDispatchClick::Yes)
                     element->dispatchMouseEvent(platformEvent, eventType, detail, relatedTarget);
             });
         }
@@ -1193,8 +1205,8 @@
 
         // BBC RadioPlayer case.
         if (isBBCDomain(domain) && isBBCPopUpPlayerElement(element)) {
-            return requestStorageAccessAndHandleClick([document = m_document] (StorageAccessWasGranted storageAccessWasGranted) mutable {
-                if (!document || storageAccessWasGranted == StorageAccessWasGranted::No)
+            return requestStorageAccessAndHandleClick([document = m_document] (ShouldDispatchClick shouldDispatchClick) mutable {
+                if (!document || shouldDispatchClick == ShouldDispatchClick::No)
                     return;
 
                 auto domWindow = document->domWindow();

Modified: branches/safari-611.3.6.0-branch/Source/WebCore/page/Quirks.h (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebCore/page/Quirks.h	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebCore/page/Quirks.h	2021-05-24 23:18:16 UTC (rev 277977)
@@ -115,7 +115,8 @@
     bool shouldAvoidPastingImagesAsWebContent() const;
 
     enum StorageAccessResult : bool { ShouldNotCancelEvent, ShouldCancelEvent };
-    StorageAccessResult triggerOptionalStorageAccessQuirk(Element&, const PlatformMouseEvent&, const AtomString& eventType, int, Element*) const;
+    enum ShouldDispatchClick : bool { No, Yes };
+    StorageAccessResult triggerOptionalStorageAccessQuirk(Element&, const PlatformMouseEvent&, const AtomString& eventType, int, Element*, bool isParentProcessAFullWebBrowser) const;
 
     bool needsVP9FullRangeFlagQuirk() const;
     bool needsHDRPixelDepthQuirk() const;
@@ -136,7 +137,7 @@
     static bool hasStorageAccessForAllLoginDomains(const HashSet<RegistrableDomain>&, const RegistrableDomain&);
     static const String& BBCRadioPlayerURLString();
     WEBCORE_EXPORT static const String& staticRadioPlayerURLString();
-    StorageAccessResult requestStorageAccessAndHandleClick(CompletionHandler<void(StorageAccessWasGranted)>&&) const;
+    StorageAccessResult requestStorageAccessAndHandleClick(CompletionHandler<void(ShouldDispatchClick)>&&) const;
     static RegistrableDomain mapToTopDomain(const URL&);
 #endif
 

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/ChangeLog (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/ChangeLog	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/ChangeLog	2021-05-24 23:18:16 UTC (rev 277977)
@@ -1,3 +1,104 @@
+2021-03-22  Russell Epstein  <repst...@apple.com>
+
+        Cherry-pick r274746. rdar://problem/75706601
+
+    Cannot login to microsoftonline.com without allowing storage access
+    https://bugs.webkit.org/show_bug.cgi?id=223510
+    <rdar://problem/75619058>
+    
+    Reviewed by John Wilander.
+    
+    Source/WebCore:
+    
+    This patch introduces two changes:
+    
+    1. Activate the storage access quirks for default browsers only. This
+    is the main place we test them, and can lead to unexpected behavior in
+    apps otherwise.
+    
+    2. Doesn't cancel the click even if the user denies storage access.
+    Previously we we were not allowing the click because it produces
+    unexpected behavior. But, sites like login.microsoftonline.com are used
+    by multiple Microsoft login flows. Since only a subset require storage
+    access, canceling the click across the board could be considered
+    regressing behavior.
+    
+    Since storage access data is stored in the network process, we
+    currently cancel the user's click on quirked sites while we wait
+    asyncronously for the IPC response. If the user grants storage access,
+    we store this in the web content process and dispatch a synthetic
+    click. In this case, when the click triggers another storage access
+    check, we can allow the click because we no longer need to wait for
+    information from the network process.
+    
+    We need some heuristic in the web content process to handle the case
+    of the user denying storage access to know whether to allow a
+    synthetic click to happen. This patch introduces
+    hasDeniedCrossPageStorageAccess which stores domains in the web
+    content process which have been denied storage access via quirk. If
+    a user has previously denied storage access in that web content
+    process, we don't prompt again. A new web content process will give them
+    another opportunity to allow/deny storage access.
+    
+    * dom/Element.cpp:
+    (WebCore::Element::dispatchMouseEvent):
+    * loader/FrameLoaderClient.h:
+    Add a client function to check if the parent process is a full web
+    browser, and pass this to the place we apply the quirks.
+    
+    * loader/ResourceLoadObserver.h:
+    (WebCore::ResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
+    (WebCore::ResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
+    * page/Quirks.cpp:
+    (WebCore::hasDeniedCrossPageStorageAccess):
+    (WebCore::Quirks::requestStorageAccessAndHandleClick const):
+    (WebCore::Quirks::triggerOptionalStorageAccessQuirk const):
+    * page/Quirks.h:
+    
+    Source/WebKit:
+    
+    Disable the storage access quirk for non-default web browsers and
+    don't cancel the login click on sites even if the user denies storage
+    access. See WebCore changelog for more details.
+    
+    * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+    (WebKit::WebFrameLoaderClient::isParentProcessAFullWebBrowser const):
+    * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+    * WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp:
+    (WebKit::WebResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
+    (WebKit::WebResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
+    * WebProcess/WebCoreSupport/WebResourceLoadObserver.h:
+    * WebProcess/WebPage/WebPage.cpp:
+    (WebKit::WebPage::pageIsParentProcessAFullWebBrowser):
+    (WebKit::WebPage::updatePreferences):
+    * WebProcess/WebPage/WebPage.h:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274746 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-03-19  Kate Cheney  <katherine_che...@apple.com>
+
+            Cannot login to microsoftonline.com without allowing storage access
+            https://bugs.webkit.org/show_bug.cgi?id=223510
+            <rdar://problem/75619058>
+
+            Reviewed by John Wilander.
+
+            Disable the storage access quirk for non-default web browsers and
+            don't cancel the login click on sites even if the user denies storage
+            access. See WebCore changelog for more details.
+
+            * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+            (WebKit::WebFrameLoaderClient::isParentProcessAFullWebBrowser const):
+            * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+            * WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp:
+            (WebKit::WebResourceLoadObserver::hasDeniedCrossPageStorageAccess const):
+            (WebKit::WebResourceLoadObserver::setHasDeniedCrossPageStorageAccess):
+            * WebProcess/WebCoreSupport/WebResourceLoadObserver.h:
+            * WebProcess/WebPage/WebPage.cpp:
+            (WebKit::WebPage::pageIsParentProcessAFullWebBrowser):
+            (WebKit::WebPage::updatePreferences):
+            * WebProcess/WebPage/WebPage.h:
+
 2021-05-20  Alan Coon  <alanc...@apple.com>
 
         Cherry-pick r277713. rdar://problem/78264364

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2021-05-24 23:18:16 UTC (rev 277977)
@@ -1959,6 +1959,12 @@
 }
 #endif
 
+bool WebFrameLoaderClient::isParentProcessAFullWebBrowser() const
+{
+    auto* page = m_frame->page();
+    return page && page->isParentProcessAWebBrowser();
+}
+
 } // namespace WebKit
 
 #undef PREFIX_PARAMETERS

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h	2021-05-24 23:18:16 UTC (rev 277977)
@@ -290,6 +290,8 @@
     bool shouldEnableInAppBrowserPrivacyProtections() const final;
     void notifyPageOfAppBoundBehavior() final;
 #endif
+
+    bool isParentProcessAFullWebBrowser() const final;
 };
 
 // As long as EmptyFrameLoaderClient exists in WebCore, this can return nullptr.

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp	2021-05-24 23:18:16 UTC (rev 277977)
@@ -443,6 +443,25 @@
     completionHandler();
 }
 
+bool WebResourceLoadObserver::hasDeniedCrossPageStorageAccess(const SubFrameDomain& subDomain, const TopFrameDomain& topDomain) const
+{
+    auto it = m_domainsWithDeniedStorageAccess.find(topDomain);
+
+    if (it != m_domainsWithDeniedStorageAccess.end())
+        return it->value.contains(subDomain);
+
+    return false;
+}
+
+void WebResourceLoadObserver::setHasDeniedCrossPageStorageAccess(HashMap<TopFrameDomain, SubFrameDomain>&& domains, CompletionHandler<void()>&& completionHandler)
+{
+    for (auto& topDomain : domains.keys()) {
+        m_domainsWithDeniedStorageAccess.ensure(topDomain, [] { return HashSet<RegistrableDomain> { };
+            }).iterator->value.add(domains.get(topDomain));
+    }
+    completionHandler();
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(RESOURCE_LOAD_STATISTICS)

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.h (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.h	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.h	2021-05-24 23:18:16 UTC (rev 277977)
@@ -69,6 +69,8 @@
     void setDomainsWithCrossPageStorageAccess(HashMap<TopFrameDomain, SubFrameDomain>&&, CompletionHandler<void()>&&) final;
     bool hasHadUserInteraction(const WebCore::RegistrableDomain&) const final;
     bool hasCrossPageStorageAccess(const SubFrameDomain&, const TopFrameDomain&) const final;
+    void setHasDeniedCrossPageStorageAccess(HashMap<TopFrameDomain, SubFrameDomain>&&, CompletionHandler<void()>&&) final;
+    bool hasDeniedCrossPageStorageAccess(const SubFrameDomain&, const TopFrameDomain&) const final;
 
 private:
     WebCore::ResourceLoadStatistics& ensureResourceStatisticsForRegistrableDomain(const WebCore::RegistrableDomain&);
@@ -88,6 +90,7 @@
 
     HashSet<WebCore::RegistrableDomain> m_domainsWithUserInteraction;
     HashMap<TopFrameDomain, HashSet<SubFrameDomain>> m_domainsWithCrossPageStorageAccess;
+    HashMap<TopFrameDomain, HashSet<SubFrameDomain>> m_domainsWithDeniedStorageAccess;
 #if !RELEASE_LOG_DISABLED
     uint64_t m_loggingCounter { 0 };
     static bool shouldLogUserInteraction;

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-05-24 23:18:16 UTC (rev 277977)
@@ -3744,6 +3744,15 @@
     updatePreferences(store);
 }
 
+bool WebPage::isParentProcessAWebBrowser() const
+{
+#if HAVE(AUDIT_TOKEN)
+    if (auto* connection = WebProcess::singleton().parentProcessConnection())
+        return isParentProcessAFullWebBrowser(connection->getAuditToken());
+#endif
+    return false;
+}
+
 void WebPage::updatePreferences(const WebPreferencesStore& store)
 {
     updatePreferencesGenerated(store);
@@ -3849,10 +3858,8 @@
     m_page->setTextInteractionEnabled(store.getBoolValueForKey(WebPreferencesKey::textInteractionEnabledKey()));
 
 #if ENABLE(WEB_AUTHN) && PLATFORM(IOS)
-    if (auto* connection = WebProcess::singleton().parentProcessConnection()) {
-        if (isParentProcessAFullWebBrowser(connection->getAuditToken()))
-            settings.setWebAuthenticationEnabled(true);
-    }
+    if (isParentProcessAWebBrowser())
+        settings.setWebAuthenticationEnabled(true);
 #endif
 
 #if ENABLE(WEBM_FORMAT_READER)

Modified: branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebPage/WebPage.h (277976 => 277977)


--- branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-05-24 23:14:44 UTC (rev 277976)
+++ branches/safari-611.3.6.0-branch/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-05-24 23:18:16 UTC (rev 277977)
@@ -1382,6 +1382,8 @@
 
     void dispatchWheelEventWithoutScrolling(const WebWheelEvent&, CompletionHandler<void(bool)>&&);
 
+    bool isParentProcessAWebBrowser() const;
+    
 private:
     WebPage(WebCore::PageIdentifier, WebPageCreationParameters&&);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to