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

Reply via email to