Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2b008f6776a29ebcc21676061f084bbcfc53d0ed
https://github.com/WebKit/WebKit/commit/2b008f6776a29ebcc21676061f084bbcfc53d0ed
Author: Chris Dumez <[email protected]>
Date: 2024-10-26 (Sat, 26 Oct 2024)
Changed paths:
M Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.h
M Source/WebKit/WebProcess/WebPage/WebPage.cpp
M Source/WebKit/WebProcess/WebPage/WebPage.h
M Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm
Log Message:
-----------
Using Cross-Origin-Opener-Policy HTTP header may corrupt the back/forward list
https://bugs.webkit.org/show_bug.cgi?id=281175
rdar://137635838
Reviewed by Sihui Liu.
The reason the back/forward list was getting "corrupted" is that we would
process-swap
on link navigation but use an API::Navigation object from an earlier
back/forward
navigation, instead of create a new API::Navigation object for this new
navigation.
This would cause us to think this is a back/forward navigation and we would
incorrectly
overwrite the current back/forward item.
The reason we were using the wrong API::Navigation object is that this is a
navigation
triggered by the page (not the client app). As a result, the navigation request
comes
from the WebProcess to the UIProcess and this request contained a navigationID
which
was the navigationID of the previous same-document back navigation. (If the
navigation
was trigger by the client app, we would create a new navigation object right
away and
pass this navigationID to the WebProcess).
Now the reason why the WebProcess was sending us an old navigationID is because
when
the WebProcess did the last same-document back navigation, it stored the
navigationID
in WebPage::m_pendingNavigationID. Normally, this navigationID would get set on
the
DocumentLoader later on when it gets created and m_pendingNavigationID would
get cleared.
Here, because it was a same document navigation, no DocumentLoader gets
created. Our
code was dealing with that by overriding
`dispatchDidChangeLocationWithinPage()` and
clearing m_pendingNavigationID then. However,
`dispatchDidChangeLocationWithinPage()`
only gets called on fragment navigations. The reproduction site here was using
a same
document navigation using `history.pushState()` but the new URL would append
`/foo` to
the URL instead of `#foo`, which is allowed. It's still a same-document
navigation but
not a fragment navigation. As a result, it wouldn't call
`dispatchDidChangeLocationWithinPage()`
and it wouldn't clear m_pendingNavigationID. Then when the next link navigation
would
occur, it would end up mistakenly reusing the leftover m_pendingNavigationID.
To address the issue, I now override `dispatchDidNavigateWithinPage()` too and
clear
`WebPage::m_pendingNavigationID` when it gets called.
`dispatchDidNavigateWithinPage()`
gets called on all same-document navigations.
This is covered by a new API test.
* Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.cpp:
(WebKit::WebLocalFrameLoaderClient::dispatchDidNavigateWithinPage):
* Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.h:
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didNavigateWithinPageForFrame):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
((ProcessSwap,
NavigateBackAfterNavigatingAwayFromCrossOriginOpenerPolicyUsingBackForwardCache2)):
Canonical link: https://commits.webkit.org/285729@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