diff -r 000000000000 -r 4f2f89ce4247 WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,277 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "WebBackForwardListProxy.h" + +#include "WebCoreArgumentCoders.h" +#include "WebPage.h" +#include "WebPageProxyMessageKinds.h" +#include "WebProcess.h" +#include "WebProcessProxyMessageKinds.h" +#include +#include + +using namespace WebCore; + +namespace WebKit { + +static const unsigned DefaultCapacity = 100; +static const unsigned NoCurrentItemIndex = UINT_MAX; + +// FIXME: This leaks all HistoryItems that go into these maps. We need to clear +// up the life time of these objects. + +typedef HashMap > IDToHistoryItemMap; +typedef HashMap, uint64_t> HistoryItemToIDMap; + +static IDToHistoryItemMap& idToHistoryItemMap() +{ + static IDToHistoryItemMap map; + return map; +} + +static HistoryItemToIDMap& historyItemToIDMap() +{ + static HistoryItemToIDMap map; + return map; +} + +static uint64_t generateHistoryItemID() +{ + static uint64_t uniqueHistoryItemID = 1; + return uniqueHistoryItemID++; +} + +static uint64_t getIDForHistoryItem(HistoryItem* item) +{ + uint64_t itemID = 0; + + std::pair result = historyItemToIDMap().add(item, 0); + if (result.second) { + itemID = generateHistoryItemID(); + result.first->second = itemID; + idToHistoryItemMap().set(itemID, item); + } else + itemID = result.first->second; + + ASSERT(itemID); + return itemID; +} + +static void updateBackForwardItem(HistoryItem* item) +{ + uint64_t itemID = getIDForHistoryItem(item); + const String& originalURLString = item->originalURLString(); + const String& urlString = item->urlString(); + const String& title = item->title(); + WebProcess::shared().connection()->send(WebProcessProxyMessage::AddBackForwardItem, 0, CoreIPC::In(itemID, originalURLString, urlString, title)); +} + +static void WK2NotifyHistoryItemChanged(HistoryItem* item) +{ + updateBackForwardItem(item); +} + +HistoryItem* WebBackForwardListProxy::itemForID(uint64_t itemID) +{ + return idToHistoryItemMap().get(itemID).get(); +} + +WebBackForwardListProxy::WebBackForwardListProxy(WebPage* page) + : m_page(page) + , m_capacity(DefaultCapacity) + , m_closed(true) + , m_enabled(true) +{ + WebCore::notifyHistoryItemChanged = WK2NotifyHistoryItemChanged; +} + +WebBackForwardListProxy::~WebBackForwardListProxy() +{ +} + +void WebBackForwardListProxy::addItem(PassRefPtr prpItem) +{ + if (!m_capacity || !m_enabled) + return; + + RefPtr item = prpItem; + uint64_t itemID = historyItemToIDMap().get(item); + WebProcess::shared().connection()->send(WebPageProxyMessage::BackForwardAddItem, m_page->pageID(), CoreIPC::In(itemID)); +} + +void WebBackForwardListProxy::goBack() +{ + ASSERT_NOT_REACHED(); +} + +void WebBackForwardListProxy::goForward() +{ + ASSERT_NOT_REACHED(); +} + +void WebBackForwardListProxy::goToItem(HistoryItem* item) +{ + uint64_t itemID = historyItemToIDMap().get(item); + WebProcess::shared().connection()->send(WebPageProxyMessage::BackForwardGoToItem, m_page->pageID(), CoreIPC::In(itemID)); +} + +HistoryItem* WebBackForwardListProxy::backItem() +{ + return 0; +} + +HistoryItem* WebBackForwardListProxy::currentItem() +{ + uint64_t currentItemID = 0; + if (!WebProcess::shared().connection()->sendSync(WebPageProxyMessage::BackForwardCurrentItem, + m_page->pageID(), CoreIPC::In(), + CoreIPC::Out(currentItemID), + CoreIPC::Connection::NoTimeout)) { + return 0; + } + + if (!currentItemID) + return 0; + + RefPtr item = idToHistoryItemMap().get(currentItemID); + return item.get(); +} + +HistoryItem* WebBackForwardListProxy::forwardItem() +{ + return 0; +} + +HistoryItem* WebBackForwardListProxy::itemAtIndex(int itemIndex) +{ + uint64_t itemID = 0; + if (!WebProcess::shared().connection()->sendSync(WebPageProxyMessage::BackForwardItemAtIndex, + m_page->pageID(), CoreIPC::In(itemIndex), + CoreIPC::Out(itemID), + CoreIPC::Connection::NoTimeout)) { + return 0; + } + + if (!itemID) + return 0; + + RefPtr item = idToHistoryItemMap().get(itemID); + return item.get(); +} + +void WebBackForwardListProxy::backListWithLimit(int, HistoryItemVector&) +{ + ASSERT_NOT_REACHED(); +} + +void WebBackForwardListProxy::forwardListWithLimit(int, HistoryItemVector&) +{ + ASSERT_NOT_REACHED(); +} + +int WebBackForwardListProxy::capacity() +{ + return m_capacity; +} + +void WebBackForwardListProxy::setCapacity(int capacity) +{ + m_capacity = capacity; +} + +bool WebBackForwardListProxy::enabled() +{ + return m_enabled; +} + +void WebBackForwardListProxy::setEnabled(bool enabled) +{ + m_enabled = enabled; +} + +int WebBackForwardListProxy::backListCount() +{ + int backListCount = 0; + if (!WebProcess::shared().connection()->sendSync(WebPageProxyMessage::BackForwardBackListCount, + m_page->pageID(), CoreIPC::In(), + CoreIPC::Out(backListCount), + CoreIPC::Connection::NoTimeout)) { + return 0; + } + + return backListCount; +} + +int WebBackForwardListProxy::forwardListCount() +{ + int forwardListCount = 0; + if (!WebProcess::shared().connection()->sendSync(WebPageProxyMessage::BackForwardForwardListCount, + m_page->pageID(), CoreIPC::In(), + CoreIPC::Out(forwardListCount), + CoreIPC::Connection::NoTimeout)) { + return 0; + } + + return forwardListCount; +} + +bool WebBackForwardListProxy::containsItem(HistoryItem*) +{ + return false; +} + +void WebBackForwardListProxy::close() +{ + m_closed = true; + m_page = 0; +} + +bool WebBackForwardListProxy::closed() +{ + return m_closed; +} + +void WebBackForwardListProxy::removeItem(HistoryItem*) +{ +} + +HistoryItemVector& WebBackForwardListProxy::entries() +{ + static HistoryItemVector noEntries; + return noEntries; +} + +void WebBackForwardListProxy::pushStateItem(PassRefPtr) +{ +} + +#if ENABLE(WML) +void WebBackForwardListProxy::clearWMLPageHistory() +{ +} +#endif + +} // namespace WebKit