Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 6b90cc53702b153ef3d8652580543a296c0eb7c5
https://github.com/WebKit/WebKit/commit/6b90cc53702b153ef3d8652580543a296c0eb7c5
Author: Alex Christensen <[email protected]>
Date: 2024-05-06 (Mon, 06 May 2024)
Changed paths:
M Source/WebCore/history/BackForwardController.cpp
M Source/WebCore/loader/EmptyClients.cpp
M Source/WebCore/loader/NavigationScheduler.cpp
M Source/WebCore/page/LocalFrame.cpp
M Source/WebCore/page/LocalFrame.h
M Source/WebCore/page/Page.cpp
M Source/WebCore/page/Page.h
M Source/WebCore/page/PageConfiguration.cpp
M Source/WebCore/page/PageConfiguration.h
M Source/WebCore/page/RemoteFrame.cpp
M Source/WebCore/page/RemoteFrame.h
M Source/WebKit/CMakeLists.txt
M Source/WebKit/DerivedSources-input.xcfilelist
M Source/WebKit/DerivedSources.make
R Source/WebKit/Shared/LocalFrameCreationParameters.h
R Source/WebKit/Shared/LocalFrameCreationParameters.serialization.in
A Source/WebKit/Shared/ProvisionalFrameCreationParameters.h
A Source/WebKit/Shared/ProvisionalFrameCreationParameters.serialization.in
M Source/WebKit/UIProcess/BrowsingContextGroup.cpp
M Source/WebKit/UIProcess/BrowsingContextGroup.h
M Source/WebKit/UIProcess/ProvisionalPageProxy.cpp
M Source/WebKit/UIProcess/WebFrameProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp
M
Source/WebKit/WebProcess/Storage/WebSharedWorkerContextManagerConnection.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h
M Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.h
M Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.h
M Source/WebKit/WebProcess/WebPage/WebFrame.cpp
M Source/WebKit/WebProcess/WebPage/WebFrame.h
M Source/WebKit/WebProcess/WebPage/WebPage.cpp
M Source/WebKit/WebProcess/WebPage/WebPage.h
M Source/WebKit/WebProcess/WebPage/WebPage.messages.in
M Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
M Source/WebKitLegacy/mac/WebView/WebFrame.mm
M Source/WebKitLegacy/mac/WebView/WebView.mm
M Tools/TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm
M Tools/TestWebKitAPI/Tests/WebKitCocoa/LoadAndDecodeImage.mm
M Tools/TestWebKitAPI/Tests/WebKitCocoa/SiteIsolation.mm
M Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPIWebNavigation.mm
M Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPIWebRequest.mm
M Tools/TestWebKitAPI/cocoa/HTTPServer.h
M Tools/TestWebKitAPI/cocoa/HTTPServer.mm
Log Message:
-----------
[Site Isolation] Introduce provisional frames to handle load failures and JS
during navigation
https://bugs.webkit.org/show_bug.cgi?id=273741
rdar://127553870
Reviewed by Brady Eidson.
Until now, to navigate a RemoteFrame we first transitioned it to a LocalFrame
then started a load in it.
This worked fine, but it has two fundamental issues. First, if JS interacts
with the Frame between when
the provisional load starts and the server reply is received and the load
commits, the JS will be interacting
with a LocalFrame instead of the old RemoteFrame. Second, if the provisional
load fails, we need the original
RemoteFrame to be in the frame tree afterwards. With main frame provisional
load failures we were just
transitioning them back to a new RemoteFrame and that passed existing tests,
but with iframes or any
more involved testing we ran into an issue.
To solve this, I give each WebFrame the ability to have a provisional
LocalFrame and I use that for loading
instead, then when the load commits I replace the RemoteFrame in the tree with
a LocalFrame. This model allows
us to fix the two issues.
A WebFrame can now have multiple WebCore::Frames, one possibly provisional. To
make this work, I need
WebLocalFrameLoaderClient to not get its LocalFrame from the WebFrame, but have
its own reference to its LocalFrame.
To use a non-nullable type (WeakRef<WebCore::LocalFrame>) I made it so that the
FrameLoaderClient construction
happens during the constructor of the LocalFrame rather than making the
FrameLoaderClient then passing it in
to the LocalFrame constructor. I did this using ClientCreator.
This makes the frame construction and destruction less symmetric as well as the
transitions from remote to local
and local to remote less symmetric, but it is necessary because the provisional
state needs to be handled robustly.
I also did a few simple cleanups of code I was touching anyways, such as moving
the WebFrame invalidator to
the shared WebFrameLoaderClient from the local and remote clients to reduce
duplicate code, removing the
BrowsingContextGroup::remotePageInProcess function that takes a
RegistrableDomain because we already have the
WebProcessProxy and don't need to look it up with what is hopefully always the
right URL, and using
toWebLocalFrameLoaderClient instead of assuming the client is not an
EmptyFrameLoaderClient.
I added some test infrastructure to have HTTPServer never send a response,
which will be needed for many
upcoming tests in this area.
* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/Shared/ProvisionalFrameCreationParameters.h: Renamed from
Source/WebKit/Shared/LocalFrameCreationParameters.h.
* Source/WebKit/Shared/ProvisionalFrameCreationParameters.serialization.in:
Renamed from Source/WebKit/Shared/LocalFrameCreationParameters.serialization.in.
* Source/WebKit/UIProcess/BrowsingContextGroup.cpp:
(WebKit::BrowsingContextGroup::takeRemotePageInProcessForProvisionalPage):
* Source/WebKit/UIProcess/BrowsingContextGroup.h:
* Source/WebKit/UIProcess/ProvisionalPageProxy.cpp:
(WebKit::ProvisionalPageProxy::initializeWebPage):
(WebKit::ProvisionalPageProxy::didFailProvisionalLoadForFrame):
* Source/WebKit/UIProcess/WebFrameProxy.cpp:
(WebKit::WebFrameProxy::prepareForProvisionalNavigationInProcess):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::continueNavigationInNewProcess):
(WebKit::WebPageProxy::webPageIDInProcess const):
(WebKit::WebPageProxy::webPageIDInProcessForDomain const): Deleted.
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.cpp:
(WebKit::WebLocalFrameLoaderClient::dispatchDidCommitLoad):
* Source/WebKit/WebProcess/WebPage/WebFrame.cpp:
(WebKit::WebFrame::coreLocalFrame const):
(WebKit::WebFrame::createProvisionalFrame):
(WebKit::WebFrame::commitProvisionalFrame):
(WebKit::WebFrame::removeFromTree):
(WebKit::WebFrame::transitionToLocal): Deleted.
* Source/WebKit/WebProcess/WebPage/WebFrame.h:
(WebKit::WebFrame::provisionalFrame):
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::createProvisionalFrame):
(WebKit::WebPage::commitProvisionalFrame):
(WebKit::WebPage::loadRequest):
(WebKit::WebPage::transitionFrameToLocal): Deleted.
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/SiteIsolation.mm:
(TestWebKitAPI::TEST(SiteIsolation,
NavigateIframeToProvisionalNavigationFailure)): Deleted.
(TestWebKitAPI::TEST(SiteIsolation,
PresentationUpdateAfterCrossSiteNavigation)): Deleted.
Canonical link: https://commits.webkit.org/278444@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes