diff options
Diffstat (limited to 'Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp')
-rw-r--r-- | Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp | 87 |
1 files changed, 37 insertions, 50 deletions
diff --git a/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp b/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp index 11bb1a18f..f2e8ecd60 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp +++ b/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp @@ -26,14 +26,16 @@ #include "config.h" #include "WebBackForwardListProxy.h" -#include "DataReference.h" -#include "EncoderAdapter.h" +#include "SessionState.h" +#include "SessionStateConversion.h" #include "WebCoreArgumentCoders.h" #include "WebPage.h" #include "WebPageProxyMessages.h" #include "WebProcess.h" #include "WebProcessProxyMessages.h" +#include <WebCore/HistoryController.h> #include <WebCore/HistoryItem.h> +#include <WebCore/MainFrame.h> #include <WebCore/PageCache.h> #include <wtf/HashMap.h> #include <wtf/NeverDestroyed.h> @@ -45,20 +47,25 @@ namespace WebKit { // FIXME <rdar://problem/8819268>: This leaks all HistoryItems that go into these maps. // We need to clear up the life time of these objects. -typedef HashMap<uint64_t, RefPtr<HistoryItem>> IDToHistoryItemMap; -typedef HashMap<RefPtr<HistoryItem>, uint64_t> HistoryItemToIDMap; +typedef HashMap<uint64_t, RefPtr<HistoryItem>> IDToHistoryItemMap; // "ID" here is the item ID. + +struct ItemAndPageID { + uint64_t itemID; + uint64_t pageID; +}; +typedef HashMap<RefPtr<HistoryItem>, ItemAndPageID> HistoryItemToIDMap; static IDToHistoryItemMap& idToHistoryItemMap() { - static NeverDestroyed<IDToHistoryItemMap> map;; + static NeverDestroyed<IDToHistoryItemMap> map; return map; -} +} static HistoryItemToIDMap& historyItemToIDMap() { static NeverDestroyed<HistoryItemToIDMap> map; return map; -} +} static uint64_t uniqueHistoryItemID = 1; @@ -82,33 +89,28 @@ void WebBackForwardListProxy::setHighestItemIDFromUIProcess(uint64_t itemID) uniqueHistoryItemID = itemID + 1; } -static void updateBackForwardItem(uint64_t itemID, HistoryItem* item) +static void updateBackForwardItem(uint64_t itemID, uint64_t pageID, HistoryItem* item) { - EncoderAdapter encoder; - item->encodeBackForwardTree(encoder); - - WebProcess::shared().parentProcessConnection()->send(Messages::WebProcessProxy::AddBackForwardItem(itemID, item->originalURLString(), item->urlString(), item->title(), encoder.dataReference()), 0); + WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::AddBackForwardItem(itemID, pageID, toPageState(*item)), 0); } -void WebBackForwardListProxy::addItemFromUIProcess(uint64_t itemID, PassRefPtr<WebCore::HistoryItem> prpItem) +void WebBackForwardListProxy::addItemFromUIProcess(uint64_t itemID, Ref<HistoryItem>&& item, uint64_t pageID) { - RefPtr<HistoryItem> item = prpItem; - // This item/itemID pair should not already exist in our maps. - ASSERT(!historyItemToIDMap().contains(item.get())); + ASSERT(!historyItemToIDMap().contains(item.ptr())); ASSERT(!idToHistoryItemMap().contains(itemID)); - - historyItemToIDMap().set(item, itemID); - idToHistoryItemMap().set(itemID, item); + + historyItemToIDMap().set<ItemAndPageID>(item.ptr(), { .itemID = itemID, .pageID = pageID }); + idToHistoryItemMap().set(itemID, item.ptr()); } static void WK2NotifyHistoryItemChanged(HistoryItem* item) { - uint64_t itemID = historyItemToIDMap().get(item); - if (!itemID) + ItemAndPageID ids = historyItemToIDMap().get(item); + if (!ids.itemID) return; - updateBackForwardItem(itemID, item); + updateBackForwardItem(ids.itemID, ids.pageID, item); } HistoryItem* WebBackForwardListProxy::itemForID(uint64_t itemID) @@ -119,7 +121,7 @@ HistoryItem* WebBackForwardListProxy::itemForID(uint64_t itemID) uint64_t WebBackForwardListProxy::idForItem(HistoryItem* item) { ASSERT(item); - return historyItemToIDMap().get(item); + return historyItemToIDMap().get(item).itemID; } void WebBackForwardListProxy::removeItem(uint64_t itemID) @@ -128,7 +130,8 @@ void WebBackForwardListProxy::removeItem(uint64_t itemID) if (!item) return; - pageCache()->remove(item.get()); + PageCache::singleton().remove(*item); + WebCore::Page::clearPreviousItemFromAllPages(item.get()); historyItemToIDMap().remove(item); } @@ -138,11 +141,9 @@ WebBackForwardListProxy::WebBackForwardListProxy(WebPage* page) WebCore::notifyHistoryItemChanged = WK2NotifyHistoryItemChanged; } -void WebBackForwardListProxy::addItem(PassRefPtr<HistoryItem> prpItem) +void WebBackForwardListProxy::addItem(Ref<HistoryItem>&& item) { - RefPtr<HistoryItem> item = prpItem; - - ASSERT(!historyItemToIDMap().contains(item)); + ASSERT(!historyItemToIDMap().contains(item.ptr())); if (!m_page) return; @@ -151,12 +152,10 @@ void WebBackForwardListProxy::addItem(PassRefPtr<HistoryItem> prpItem) ASSERT(!idToHistoryItemMap().contains(itemID)); - m_associatedItemIDs.add(itemID); - - historyItemToIDMap().set(item, itemID); - idToHistoryItemMap().set(itemID, item); + historyItemToIDMap().set<ItemAndPageID>(item.ptr(), { .itemID = itemID, .pageID = m_page->pageID() }); + idToHistoryItemMap().set(itemID, item.ptr()); - updateBackForwardItem(itemID, item.get()); + updateBackForwardItem(itemID, m_page->pageID(), item.ptr()); m_page->send(Messages::WebPageProxy::BackForwardAddItem(itemID)); } @@ -166,7 +165,7 @@ void WebBackForwardListProxy::goToItem(HistoryItem* item) return; SandboxExtension::Handle sandboxExtensionHandle; - m_page->sendSync(Messages::WebPageProxy::BackForwardGoToItem(historyItemToIDMap().get(item)), Messages::WebPageProxy::BackForwardGoToItem::Reply(sandboxExtensionHandle)); + m_page->sendSync(Messages::WebPageProxy::BackForwardGoToItem(historyItemToIDMap().get(item).itemID), Messages::WebPageProxy::BackForwardGoToItem::Reply(sandboxExtensionHandle)); m_page->sandboxExtensionTracker().beginLoad(m_page->mainWebFrame(), sandboxExtensionHandle); } @@ -176,7 +175,7 @@ HistoryItem* WebBackForwardListProxy::itemAtIndex(int itemIndex) return 0; uint64_t itemID = 0; - if (!WebProcess::shared().parentProcessConnection()->sendSync(Messages::WebPageProxy::BackForwardItemAtIndex(itemIndex), Messages::WebPageProxy::BackForwardItemAtIndex::Reply(itemID), m_page->pageID())) + if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPageProxy::BackForwardItemAtIndex(itemIndex), Messages::WebPageProxy::BackForwardItemAtIndex::Reply(itemID), m_page->pageID())) return 0; if (!itemID) @@ -191,7 +190,7 @@ int WebBackForwardListProxy::backListCount() return 0; int backListCount = 0; - if (!WebProcess::shared().parentProcessConnection()->sendSync(Messages::WebPageProxy::BackForwardBackListCount(), Messages::WebPageProxy::BackForwardBackListCount::Reply(backListCount), m_page->pageID())) + if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPageProxy::BackForwardBackListCount(), Messages::WebPageProxy::BackForwardBackListCount::Reply(backListCount), m_page->pageID())) return 0; return backListCount; @@ -203,7 +202,7 @@ int WebBackForwardListProxy::forwardListCount() return 0; int forwardListCount = 0; - if (!WebProcess::shared().parentProcessConnection()->sendSync(Messages::WebPageProxy::BackForwardForwardListCount(), Messages::WebPageProxy::BackForwardForwardListCount::Reply(forwardListCount), m_page->pageID())) + if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPageProxy::BackForwardForwardListCount(), Messages::WebPageProxy::BackForwardForwardListCount::Reply(forwardListCount), m_page->pageID())) return 0; return forwardListCount; @@ -211,19 +210,7 @@ int WebBackForwardListProxy::forwardListCount() void WebBackForwardListProxy::close() { - HashSet<uint64_t>::iterator end = m_associatedItemIDs.end(); - for (HashSet<uint64_t>::iterator i = m_associatedItemIDs.begin(); i != end; ++i) - WebCore::pageCache()->remove(itemForID(*i)); - - m_associatedItemIDs.clear(); - - m_page = 0; -} - -bool WebBackForwardListProxy::isActive() -{ - // FIXME: Should check the the list is enabled and has non-zero capacity. - return true; + m_page = nullptr; } void WebBackForwardListProxy::clear() |