[webkit-changes] [WebKit/WebKit] acdf94: [Site Isolation] Begin implementing cross-site red...

Alex Christensen noreply at github.com
Mon May 13 22:52:49 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: acdf944d361b6379c01cd8e66d518a4dfa54f40e
      https://github.com/WebKit/WebKit/commit/acdf944d361b6379c01cd8e66d518a4dfa54f40e
  Author: Alex Christensen <achristensen at apple.com>
  Date:   2024-05-13 (Mon, 13 May 2024)

  Changed paths:
    M Source/WebCore/Modules/beacon/NavigatorBeacon.cpp
    M Source/WebCore/Modules/beacon/NavigatorBeacon.h
    M Source/WebCore/Modules/mediasession/MediaMetadata.cpp
    M Source/WebCore/Modules/mediasession/MediaMetadata.h
    M Source/WebCore/Modules/model-element/HTMLModelElement.cpp
    M Source/WebCore/Modules/model-element/HTMLModelElement.h
    M Source/WebCore/bindings/js/CachedModuleScriptLoader.cpp
    M Source/WebCore/bindings/js/CachedModuleScriptLoader.h
    M Source/WebCore/dom/LoadableClassicScript.cpp
    M Source/WebCore/dom/LoadableClassicScript.h
    M Source/WebCore/html/HTMLImageLoader.cpp
    M Source/WebCore/html/HTMLImageLoader.h
    M Source/WebCore/loader/ApplicationManifestLoader.cpp
    M Source/WebCore/loader/ApplicationManifestLoader.h
    M Source/WebCore/loader/CrossOriginPreflightChecker.cpp
    M Source/WebCore/loader/CrossOriginPreflightChecker.h
    M Source/WebCore/loader/DocumentLoader.cpp
    M Source/WebCore/loader/DocumentLoader.h
    M Source/WebCore/loader/DocumentThreadableLoader.cpp
    M Source/WebCore/loader/DocumentThreadableLoader.h
    M Source/WebCore/loader/FrameLoader.cpp
    M Source/WebCore/loader/FrameLoader.h
    M Source/WebCore/loader/ImageLoader.cpp
    M Source/WebCore/loader/ImageLoader.h
    M Source/WebCore/loader/LinkLoader.cpp
    M Source/WebCore/loader/LinkLoader.h
    M Source/WebCore/loader/LinkPreloadResourceClients.h
    M Source/WebCore/loader/MediaResourceLoader.cpp
    M Source/WebCore/loader/MediaResourceLoader.h
    M Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
    M Source/WebCore/loader/NetscapePlugInStreamLoader.h
    M Source/WebCore/loader/ResourceLoader.cpp
    M Source/WebCore/loader/ResourceLoader.h
    M Source/WebCore/loader/SubresourceLoader.cpp
    M Source/WebCore/loader/SubresourceLoader.h
    M Source/WebCore/loader/TextTrackLoader.cpp
    M Source/WebCore/loader/TextTrackLoader.h
    M Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.cpp
    M Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.h
    M Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp
    M Source/WebCore/loader/cache/CachedCSSStyleSheet.h
    M Source/WebCore/loader/cache/CachedFont.cpp
    M Source/WebCore/loader/cache/CachedFont.h
    M Source/WebCore/loader/cache/CachedResource.cpp
    M Source/WebCore/loader/cache/CachedResource.h
    M Source/WebCore/loader/cache/CachedResourceClient.cpp
    M Source/WebCore/loader/cache/CachedResourceClient.h
    M Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp
    M Source/WebCore/loader/cache/CachedXSLStyleSheet.h
    M Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp
    M Source/WebCore/loader/cache/KeepaliveRequestTracker.h
    M Source/WebCore/loader/icon/IconLoader.cpp
    M Source/WebCore/loader/icon/IconLoader.h
    M Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm
    M Source/WebCore/rendering/RenderElement.cpp
    M Source/WebCore/rendering/RenderElement.h
    M Source/WebCore/rendering/RenderImage.cpp
    M Source/WebCore/rendering/RenderImage.h
    M Source/WebCore/rendering/RenderLayerFilters.cpp
    M Source/WebCore/rendering/RenderLayerFilters.h
    M Source/WebCore/rendering/svg/RenderSVGImage.cpp
    M Source/WebCore/rendering/svg/RenderSVGImage.h
    M Source/WebCore/svg/SVGFEImageElement.cpp
    M Source/WebCore/svg/SVGFEImageElement.h
    M Source/WebCore/svg/SVGUseElement.cpp
    M Source/WebCore/svg/SVGUseElement.h
    M Source/WebKit/UIProcess/ProvisionalFrameProxy.cpp
    M Source/WebKit/UIProcess/ProvisionalFrameProxy.h
    M Source/WebKit/UIProcess/RemotePageProxy.cpp
    M Source/WebKit/UIProcess/WebFrameProxy.cpp
    M Source/WebKit/UIProcess/WebPageProxy.cpp
    M Source/WebKit/WebProcess/WebPage/WebFrame.cpp
    M Tools/TestWebKitAPI/Tests/WebKitCocoa/SiteIsolation.mm

  Log Message:
  -----------
  [Site Isolation] Begin implementing cross-site redirects to provisional load failures
https://bugs.webkit.org/show_bug.cgi?id=274104
rdar://128015329

Reviewed by Charlie Wolfe and Sihui Liu.

When NavigationPolicyDecision::LoadWillContinueInAnotherProcess is sent to a web content process,
that web content process calls DocumentLoader::stopLoadingForPolicyChange which calls
WebLocalFrameLoaderClient::dispatchDidFailProvisionalLoad which sends IPC to the UI process.
When NavigationPolicyDecision::IgnoreLoad is used, this IPC message is desired, but if the load
is continuing in another process the message is not needed because the UI process already knows,
and it is not desired because receiving and handling such a message would lead to inconsistent
state.  We solved this previously for Process-Swap-On-Navigation by just ignoring most messages
from a previous process, but with site isolation we can't do this.  I saw four ways to possibly
implement this for site isolation:

1. Pipe a boolean from DocumentLoader::willSendRequest's call to stopLoadingForPolicyChange all
the way through this stack trace to directly get whether we should send the message:
FrameLoader::dispatchDidFailProvisionalLoad(DocumentLoader&, const ResourceError&, WillInternallyHandleFailure)
FrameLoader::checkLoadCompleteForThisFrame()
FrameLoader::checkLoadComplete()
FrameLoader::receivedMainResourceError(const ResourceError&)
DocumentLoader::mainReceivedError(const ResourceError&)
DocumentLoader::notifyFinished(CachedResource&, const NetworkLoadMetrics&)
CachedResource::checkNotify(const NetworkLoadMetrics&)
CachedResource::cancelLoad()
SubresourceLoader::didCancel(const ResourceError&)
ResourceLoader::cancel(const ResourceError&)
DocumentLoader::cancelMainResourceLoad(const ResourceError&)
DocumentLoader::stopLoadingForPolicyChange()

2. Store a boolean on the CachedResource along with the ResourceError to shortcut all the parts
of 1's stack where a ResourceError is currently not sent.

3. Create a new ResourceError that is a sentinel value indicating that LoadWillContinueInAnotherProcess
has been used and checking for that sentinel value before sending the message.

4. Store a boolean on the WebFrame when receiving LoadWillContinueInAnotherProcess indicating
that one dispatchDidFailProvisionalLoad should be ignored.

I chose 1 because it is the most direct and complete, even though it adds a lot of false boolean
parameters to code that is used for all loading.

* Source/WebCore/loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::willSendRequest):
(WebCore::DocumentLoader::continueAfterContentPolicy):
(WebCore::DocumentLoader::interruptedForPolicyChangeError const):
(WebCore::DocumentLoader::stopLoadingForPolicyChange):
* Source/WebCore/loader/DocumentLoader.h:
* Source/WebCore/loader/EmptyClients.cpp:
(WebCore::EmptyFrameLoaderClient::interruptedForPolicyChangeError const):
* Source/WebCore/loader/EmptyFrameLoaderClient.h:
* Source/WebCore/loader/LocalFrameLoaderClient.h:
* Source/WebKit/Shared/API/APIError.h:
* Source/WebKit/Shared/API/c/WKErrorRef.cpp:
(WKErrorGetErrorCode):
* Source/WebKit/Shared/WebErrors.cpp:
(WebKit::interruptedForPolicyChangeError):
* Source/WebKit/Shared/WebErrors.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::continueNavigationInNewProcess):
* Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.cpp:
(WebKit::WebLocalFrameLoaderClient::dispatchDidFailProvisionalLoad):
(WebKit::WebLocalFrameLoaderClient::interruptedForPolicyChangeError const):
* Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.h:
* Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h:
* Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::interruptedForPolicyChangeError const):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/SiteIsolation.mm:
(TestWebKitAPI::TEST(SiteIsolation, NavigateIframeToProvisionalNavigationFailure)):

Canonical link: https://commits.webkit.org/278736@main



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list