[webkit-changes] [WebKit/WebKit] 1085de: [Site Isolation] Begin to fix the back forward lis...

Charlie Wolfe noreply at github.com
Wed May 22 13:40:53 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 1085dea9ba4113642ffc393e3f9ac06a778ff26c
      https://github.com/WebKit/WebKit/commit/1085dea9ba4113642ffc393e3f9ac06a778ff26c
  Author: Charlie Wolfe <charliew at apple.com>
  Date:   2024-05-22 (Wed, 22 May 2024)

  Changed paths:
    M Source/WebCore/history/BackForwardClient.h
    M Source/WebCore/history/BackForwardController.cpp
    M Source/WebCore/history/BackForwardController.h
    M Source/WebCore/loader/EmptyClients.cpp
    M Source/WebCore/loader/HistoryController.cpp
    M Source/WebCore/page/Page.cpp
    M Source/WebCore/page/Page.h
    M Source/WebKit/Shared/WebBackForwardListItem.h
    M Source/WebKit/UIProcess/ProvisionalPageProxy.cpp
    M Source/WebKit/UIProcess/ProvisionalPageProxy.h
    M Source/WebKit/UIProcess/WebBackForwardList.cpp
    M Source/WebKit/UIProcess/WebFrameProxy.h
    M Source/WebKit/UIProcess/WebPageProxy.cpp
    M Source/WebKit/UIProcess/WebPageProxy.h
    M Source/WebKit/UIProcess/WebPageProxy.messages.in
    M Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.cpp
    M Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.h
    M Source/WebKit/WebProcess/WebPage/WebPage.cpp
    M Source/WebKitLegacy/mac/History/BackForwardList.h
    M Source/WebKitLegacy/mac/History/BackForwardList.mm
    M Source/WebKitLegacy/mac/History/WebBackForwardList.mm
    M Source/WebKitLegacy/mac/WebView/WebView.mm
    M Tools/TestWebKitAPI/Tests/WebKitCocoa/SiteIsolation.mm

  Log Message:
  -----------
  [Site Isolation] Begin to fix the back forward list for same-origin iframe navigations
https://bugs.webkit.org/show_bug.cgi?id=274419
rdar://128420789

Reviewed by Alex Christensen.

Some back forward list state for child frames is currently stored only in the web process. This needs to
change with site isolation because web processes can only have history items corresponding to frames they
are hosting or have embedded. With this patch, whenever a root child frame is embedded, we add a separate
item to the back forward list in the UI process. This way, when navigating back or forward, iframe
processes can request history items containing state about same-origin frames that have been embedded by
another process without receiving information about the entire frame tree. We also need to keep track of
which back forward items correspond to initial root child frame loads. This is necessary to determine
which item to navigate an isolated iframe to, while also ignoring these items when the main frame is
moved back or forward.

Further work is required to make the back forward list behave correctly after cross-origin iframe
navigations. More details below.

* Source/WebCore/history/BackForwardClient.h:
* Source/WebCore/history/BackForwardController.cpp:
(WebCore::BackForwardController::addItem):
* Source/WebCore/history/BackForwardController.h:
* Source/WebCore/loader/EmptyClients.cpp:
* Source/WebCore/loader/HistoryController.cpp:
(WebCore::HistoryController::goToItem):
(WebCore::HistoryController::updateBackForwardListClippedAtTarget):
(WebCore::HistoryController::pushState):
* Source/WebCore/page/Page.cpp:
(WebCore::Page::goToItem):
* Source/WebCore/page/Page.h:

Update `addItem` to include a FrameIdentifier parameter so the UI process knows which frame is being
targeted. Also remove several unneeded local frame downcasts.

* Source/WebKit/Shared/WebBackForwardListItem.h:
(WebKit::WebBackForwardListItem::setIsRootChildFrameItem):
(WebKit::WebBackForwardListItem::isRootChildFrameItem const):

Add `m_isRootChildFrameItem` to indicate when a back forward item was created by an initial root child
frame load.

* Source/WebKit/UIProcess/ProvisionalPageProxy.cpp:
(WebKit::ProvisionalPageProxy::backForwardAddItem):
* Source/WebKit/UIProcess/ProvisionalPageProxy.h:

* Source/WebKit/UIProcess/WebBackForwardList.cpp:
(WebKit::itemSkippingBackForwardItemsAddedByJSWithoutUserGesture):

Skip root child frame items to avoid targeting initial child frame loads when trying to move the main
frame back/forward. This logic probably still isn’t correct when going back/forward between
cross-origin iframes.

* Source/WebKit/UIProcess/WebFrameProxy.h:
(WebKit::WebFrameProxy::setHasPendingBackForwardItem):
(WebKit::WebFrameProxy::takeHasPendingBackforwardItem):

Add `m_hasPendingBackForwardItem` to indicate when a root frame is waiting for its initial back forward
item to be created.

* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::goToBackForwardItem):

Change this function to send back forward list items corresponding to isolated iframes to the process
that navigated. `m_lastProcessIdentifier` on `WebBackForwardListItem` is already used for process
selection for PSON. It will initially be the identifier of the web process that constructed the object,
so we can use it for iframe isolation too.

(WebKit::WebPageProxy::didChangeBackForwardList):

Do not call `didChangeBackForwardList` delegates or `setCanGoBack/Forward` for root child frame items to
keep the same behavior as without site isolation.

(WebKit::WebPageProxy::continueNavigationInNewProcess):

Set `m_hasPendingBackForwardItem` to true when creating a new root child frame.

(WebKit::WebPageProxy::backForwardAddItem):
(WebKit::WebPageProxy::backForwardAddItemShared):

When a back forward list item is created set `m_isRootChildFrameItem` and reset
`m_hasPendingBackForwardItem`.

* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.cpp:
(WebKit::WebBackForwardListProxy::addItem):
* Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.h:
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::goToBackForwardItem):

* Source/WebKitLegacy/mac/History/BackForwardList.h:
* Source/WebKitLegacy/mac/History/BackForwardList.mm:
(BackForwardList::addItem):
* Source/WebKitLegacy/mac/History/WebBackForwardList.mm:
(-[WebBackForwardList addItem:]):
* Source/WebKitLegacy/mac/WebView/WebView.mm:
(-[WebView _loadBackForwardListFromOtherView:]):
(-[WebBackForwardList setToMatchDictionaryRepresentation:]):

WebKitLegacy is not supported with site isolation, so we can always just pass the main frame id.

* Tools/TestWebKitAPI/Tests/WebKitCocoa/SiteIsolation.mm:
(TestWebKitAPI::TEST(SiteIsolation, NavigateIframeBackForward)):

Add a test that navigates an isolated iframe same-origin and verifies that `goBack` and `goForward`
behave correctly.

Canonical link: https://commits.webkit.org/279152@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