Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 94edb16b0b9cc57a7293a34a49af70d7675fd7b9
https://github.com/WebKit/WebKit/commit/94edb16b0b9cc57a7293a34a49af70d7675fd7b9
Author: Basuke Suzuki <[email protected]>
Date: 2026-02-05 (Thu, 05 Feb 2026)
Changed paths:
A
LayoutTests/http/tests/navigation/cross-site-iframe-nav-with-bfcache-expected.txt
A LayoutTests/http/tests/navigation/cross-site-iframe-nav-with-bfcache.html
A
LayoutTests/http/tests/navigation/resources/cross-site-iframe-nav-with-bfcache-other.html
A
LayoutTests/http/tests/navigation/resources/cross-site-iframe-nav-with-bfcache-page.html
A
LayoutTests/http/tests/navigation/resources/cross-site-iframe-nav-with-bfcache-popup.html
M Source/WebCore/history/BackForwardCache.cpp
M Source/WebCore/history/BackForwardCache.h
M Source/WebCore/history/HistoryItem.cpp
M Source/WebCore/page/Page.cpp
M Source/WebCore/page/Page.h
M Source/WebKit/UIProcess/WebBackForwardCache.cpp
M Source/WebKit/UIProcess/WebBackForwardCacheEntry.cpp
M Source/WebKit/UIProcess/WebBackForwardCacheEntry.h
M Source/WebKit/UIProcess/WebBackForwardList.cpp
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.cpp
M Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.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/WebProcess.cpp
M Source/WebKit/WebProcess/WebProcess.h
M Source/WebKit/WebProcess/WebProcess.messages.in
Log Message:
-----------
BFCache fails to restore pages when iframe performs cross-site navigation.
https://bugs.webkit.org/show_bug.cgi?id=306900
rdar://169563332
Reviewed by Charlie Wolfe.
When an iframe navigates to a cross-site URL, a new BackForwardList entry is
created
with a new BackForwardItemIdentifier (itemID). However, the BackForwardCache
(BFCache)
uses this itemID as its key, causing a mismatch between:
- The itemID used when saving to BFCache (old itemID from before iframe
navigation)
- The itemID used when restoring from BFCache (new itemID after iframe
navigation)
This results in BFCache misses even though the main frame content hasn't
changed.
Steps to Reproduce:
1. Navigate to page A with an iframe (same-site HTML)
2. Navigate the iframe to a cross-site page B
3. Navigate the main frame to page C (no iframe)
4. Go back → Step 2 is displayed correctly
5. Go back again → Expected: Step 1 should be restored from BFCache, Actual:
Page is
reloaded (BFCache miss)
Change BFCache to use BackForwardFrameItemIdentifier instead of
BackForwardItemIdentifier
as its key. BFCache stores/restores per-frame state, so using frame-specific
identifiers
ensures correct matching even when iframes navigate cross-site.
New test: http/tests/navigation/cross-site-iframe-nav-with-bfcache.html
*
LayoutTests/http/tests/navigation/cross-site-iframe-nav-with-bfcache-expected.txt:
Added.
* LayoutTests/http/tests/navigation/cross-site-iframe-nav-with-bfcache.html:
Added.
*
LayoutTests/http/tests/navigation/resources/cross-site-iframe-nav-with-bfcache-other.html:
Added.
*
LayoutTests/http/tests/navigation/resources/cross-site-iframe-nav-with-bfcache-page.html:
Added.
*
LayoutTests/http/tests/navigation/resources/cross-site-iframe-nav-with-bfcache-popup.html:
Added.
* Source/WebCore/history/BackForwardCache.cpp:
(WebCore::BackForwardCache::addIfCacheable):
(WebCore::BackForwardCache::take):
(WebCore::BackForwardCache::get):
(WebCore::BackForwardCache::remove):
(WebCore::BackForwardCache::isInBackForwardCache const):
(WebCore::BackForwardCache::hasCachedPageExpired const):
* Source/WebCore/history/BackForwardCache.h:
* Source/WebCore/history/HistoryItem.cpp:
(WebCore::HistoryItem::isInBackForwardCache const):
(WebCore::HistoryItem::hasCachedPageExpired const):
* Source/WebCore/page/Page.cpp:
(WebCore::Page::clearPreviousItemFromAllPages):
* Source/WebCore/page/Page.h:
* Source/WebKit/UIProcess/WebBackForwardCache.cpp:
(WebKit::WebBackForwardCache::addEntry):
* Source/WebKit/UIProcess/WebBackForwardCacheEntry.cpp:
(WebKit::WebBackForwardCacheEntry::create):
(WebKit::WebBackForwardCacheEntry::WebBackForwardCacheEntry):
(WebKit::WebBackForwardCacheEntry::~WebBackForwardCacheEntry):
(WebKit::WebBackForwardCacheEntry::takeSuspendedPage):
(WebKit::WebBackForwardCacheEntry::expirationTimerFired):
* Source/WebKit/UIProcess/WebBackForwardCacheEntry.h:
* Source/WebKit/UIProcess/WebBackForwardList.cpp:
(WebKit::WebBackForwardList::didRemoveItem):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::backForwardRemovedItem):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.cpp:
(WebKit::WebBackForwardListProxy::removeItem):
* Source/WebKit/WebProcess/WebPage/WebBackForwardListProxy.h:
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didRemoveBackForwardItem):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:
* Source/WebKit/WebProcess/WebProcess.cpp:
(WebKit::WebProcess::clearCachedPage):
* Source/WebKit/WebProcess/WebProcess.h:
* Source/WebKit/WebProcess/WebProcess.messages.in:
Canonical link: https://commits.webkit.org/306880@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications