summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp')
-rw-r--r--Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp87
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()