12bde8e466a4451c7319e3a072d118917957d6554Steve Block/*
22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved.
32bde8e466a4451c7319e3a072d118917957d6554Steve Block *
42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Redistribution and use in source and binary forms, with or without
52bde8e466a4451c7319e3a072d118917957d6554Steve Block * modification, are permitted provided that the following conditions
62bde8e466a4451c7319e3a072d118917957d6554Steve Block * are met:
72bde8e466a4451c7319e3a072d118917957d6554Steve Block * 1. Redistributions of source code must retain the above copyright
82bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer.
92bde8e466a4451c7319e3a072d118917957d6554Steve Block * 2. Redistributions in binary form must reproduce the above copyright
102bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer in the
112bde8e466a4451c7319e3a072d118917957d6554Steve Block *    documentation and/or other materials provided with the distribution.
122bde8e466a4451c7319e3a072d118917957d6554Steve Block *
132bde8e466a4451c7319e3a072d118917957d6554Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
142bde8e466a4451c7319e3a072d118917957d6554Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
152bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162bde8e466a4451c7319e3a072d118917957d6554Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
172bde8e466a4451c7319e3a072d118917957d6554Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
182bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
192bde8e466a4451c7319e3a072d118917957d6554Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
202bde8e466a4451c7319e3a072d118917957d6554Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
212bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
222bde8e466a4451c7319e3a072d118917957d6554Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
232bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE POSSIBILITY OF SUCH DAMAGE.
242bde8e466a4451c7319e3a072d118917957d6554Steve Block */
252bde8e466a4451c7319e3a072d118917957d6554Steve Block
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "config.h"
272bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebIconDatabase.h"
282bde8e466a4451c7319e3a072d118917957d6554Steve Block
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DataReference.h"
302bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "Logging.h"
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebContext.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebIconDatabaseProxyMessages.h"
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/FileSystem.h>
342bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/IconDatabase.h>
352bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/IconDatabaseBase.h>
362bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/text/WTFString.h>
372bde8e466a4451c7319e3a072d118917957d6554Steve Block
382bde8e466a4451c7319e3a072d118917957d6554Steve Blockusing namespace WebCore;
392bde8e466a4451c7319e3a072d118917957d6554Steve Block
402bde8e466a4451c7319e3a072d118917957d6554Steve Blocknamespace WebKit {
412bde8e466a4451c7319e3a072d118917957d6554Steve Block
422bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<WebIconDatabase> WebIconDatabase::create(WebContext* context)
432bde8e466a4451c7319e3a072d118917957d6554Steve Block{
442bde8e466a4451c7319e3a072d118917957d6554Steve Block    return adoptRef(new WebIconDatabase(context));
452bde8e466a4451c7319e3a072d118917957d6554Steve Block}
462bde8e466a4451c7319e3a072d118917957d6554Steve Block
472bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebIconDatabase::~WebIconDatabase()
482bde8e466a4451c7319e3a072d118917957d6554Steve Block{
492bde8e466a4451c7319e3a072d118917957d6554Steve Block}
502bde8e466a4451c7319e3a072d118917957d6554Steve Block
512bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebIconDatabase::WebIconDatabase(WebContext* context)
522bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_webContext(context)
532bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_urlImportCompleted(false)
542bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_databaseCleanupDisabled(false)
552bde8e466a4451c7319e3a072d118917957d6554Steve Block{
562bde8e466a4451c7319e3a072d118917957d6554Steve Block}
572bde8e466a4451c7319e3a072d118917957d6554Steve Block
582bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::invalidate()
592bde8e466a4451c7319e3a072d118917957d6554Steve Block{
602bde8e466a4451c7319e3a072d118917957d6554Steve Block}
612bde8e466a4451c7319e3a072d118917957d6554Steve Block
622bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::setDatabasePath(const String& path)
632bde8e466a4451c7319e3a072d118917957d6554Steve Block{
642bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_iconDatabaseImpl && m_iconDatabaseImpl->isOpen()) {
652bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG_ERROR("Icon database already has a path and is already open. We don't currently support changing its path and reopening.");
662bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
672bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
682bde8e466a4451c7319e3a072d118917957d6554Steve Block
692bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_iconDatabaseImpl =  IconDatabase::create();
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_iconDatabaseImpl->setClient(this);
712bde8e466a4451c7319e3a072d118917957d6554Steve Block    IconDatabase::delayDatabaseCleanup();
722bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_databaseCleanupDisabled = true;
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_iconDatabaseImpl->setEnabled(true);
742bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_iconDatabaseImpl->open(directoryName(path), pathGetFileName(path))) {
752bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG_ERROR("Unable to open WebKit2 icon database on disk");
762bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_iconDatabaseImpl.clear();
772bde8e466a4451c7319e3a072d118917957d6554Steve Block        setGlobalIconDatabase(0);
782bde8e466a4451c7319e3a072d118917957d6554Steve Block        IconDatabase::allowDatabaseCleanup();
792bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_databaseCleanupDisabled = false;
802bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
812bde8e466a4451c7319e3a072d118917957d6554Steve Block    setGlobalIconDatabase(m_iconDatabaseImpl.get());
822bde8e466a4451c7319e3a072d118917957d6554Steve Block}
832bde8e466a4451c7319e3a072d118917957d6554Steve Block
842bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::enableDatabaseCleanup()
852bde8e466a4451c7319e3a072d118917957d6554Steve Block{
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_iconDatabaseImpl) {
872bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG_ERROR("Cannot enabled Icon Database cleanup - it hasn't been opened yet.");
882bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
892bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
902bde8e466a4451c7319e3a072d118917957d6554Steve Block
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_databaseCleanupDisabled) {
922bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG_ERROR("Attempt to enable database cleanup, but it's already enabled.");
932bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT_NOT_REACHED();
942bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
962bde8e466a4451c7319e3a072d118917957d6554Steve Block
972bde8e466a4451c7319e3a072d118917957d6554Steve Block    IconDatabase::allowDatabaseCleanup();
982bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_databaseCleanupDisabled = false;
992bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block
1012bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::retainIconForPageURL(const String& pageURL)
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_iconDatabaseImpl)
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_iconDatabaseImpl->retainIconForPageURL(pageURL);
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block
1072bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::releaseIconForPageURL(const String& pageURL)
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_iconDatabaseImpl)
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_iconDatabaseImpl->releaseIconForPageURL(pageURL);
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block
1132bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::setIconURLForPageURL(const String& iconURL, const String& pageURL)
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block    LOG(IconDatabase, "WK2 UIProcess setting icon URL %s for page URL %s", iconURL.ascii().data(), pageURL.ascii().data());
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_iconDatabaseImpl)
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_iconDatabaseImpl->setIconURLForPageURL(iconURL, pageURL);
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block
1202bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::setIconDataForIconURL(const CoreIPC::DataReference& iconData, const String& iconURL)
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block    LOG(IconDatabase, "WK2 UIProcess setting icon data (%i bytes) for page URL %s", (int)iconData.size(), iconURL.ascii().data());
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_iconDatabaseImpl)
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<SharedBuffer> buffer = SharedBuffer::create(iconData.data(), iconData.size());
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_iconDatabaseImpl->setIconDataForIconURL(buffer.release(), iconURL);
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block
1302bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::synchronousIconDataForPageURL(const String&, CoreIPC::DataReference& iconData)
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block    iconData = CoreIPC::DataReference();
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block
1352bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::synchronousIconURLForPageURL(const String&, String& iconURL)
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block    iconURL = String();
1382bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block
1402bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::synchronousIconDataKnownForIconURL(const String&, bool& iconDataKnown) const
1412bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block    iconDataKnown = false;
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1442bde8e466a4451c7319e3a072d118917957d6554Steve Block
1452bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::synchronousLoadDecisionForIconURL(const String&, int& loadDecision) const
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block    loadDecision = static_cast<int>(IconLoadNo);
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1492bde8e466a4451c7319e3a072d118917957d6554Steve Block
1502bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::getLoadDecisionForIconURL(const String& iconURL, uint64_t callbackID)
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block    LOG(IconDatabase, "WK2 UIProcess getting load decision for icon URL %s with callback ID %lli", iconURL.ascii().data(), static_cast<long long>(callbackID));
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_webContext)
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_iconDatabaseImpl || !m_iconDatabaseImpl->isOpen() || iconURL.isEmpty()) {
1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // FIXME (Multi-WebProcess): We need to know which connection to send this message to.
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_webContext->sendToAllProcesses(Messages::WebIconDatabaseProxy::ReceivedIconLoadDecision(static_cast<int>(IconLoadNo), callbackID));
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1612bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block    // If the decision hasn't been read from disk yet, set this url and callback ID aside to be notifed later
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block    IconLoadDecision decision = m_iconDatabaseImpl->synchronousLoadDecisionForIconURL(iconURL, 0);
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (decision == IconLoadUnknown) {
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block        // We should never get an unknown load decision after the URL import has completed.
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(!m_urlImportCompleted);
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_pendingLoadDecisionURLMap.set(callbackID, iconURL);
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME (Multi-WebProcess): We need to know which connection to send this message to.
1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_webContext->sendToAllProcesses(Messages::WebIconDatabaseProxy::ReceivedIconLoadDecision((int)decision, callbackID));
1752bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1762bde8e466a4451c7319e3a072d118917957d6554Steve Block
1772bde8e466a4451c7319e3a072d118917957d6554Steve BlockImage* WebIconDatabase::imageForPageURL(const String& pageURL)
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_webContext || !m_iconDatabaseImpl || !m_iconDatabaseImpl->isOpen() || pageURL.isEmpty())
1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
1812bde8e466a4451c7319e3a072d118917957d6554Steve Block
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block    // The WebCore IconDatabase ignores the passed in size parameter.
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block    // If that changes we'll need to rethink how this API is exposed.
1842bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_iconDatabaseImpl->synchronousIconForPageURL(pageURL, WebCore::IntSize(32, 32));
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block
1872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::removeAllIcons()
1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_iconDatabaseImpl->removeAllIcons();
1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::checkIntegrityBeforeOpening()
1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    IconDatabase::checkIntegrityBeforeOpening();
1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::close()
1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_iconDatabaseImpl->close();
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::initializeIconDatabaseClient(const WKIconDatabaseClient* client)
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_iconDatabaseClient.initialize(client);
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2062bde8e466a4451c7319e3a072d118917957d6554Steve Block
2072bde8e466a4451c7319e3a072d118917957d6554Steve Block// WebCore::IconDatabaseClient
2082bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebIconDatabase::performImport()
2092bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2102bde8e466a4451c7319e3a072d118917957d6554Steve Block    // WebKit2 icon database doesn't currently support importing any old icon database formats.
2112bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
2122bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2132bde8e466a4451c7319e3a072d118917957d6554Steve Block
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::didImportIconURLForPageURL(const String& pageURL)
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    didChangeIconForPageURL(pageURL);
2172bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::didImportIconDataForPageURL(const String& pageURL)
2202bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    didChangeIconForPageURL(pageURL);
2222bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block
2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebIconDatabase::didChangeIconForPageURL(const String& pageURL)
2252bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_iconDatabaseClient.didChangeIconForPageURL(this, WebURL::create(pageURL).get());
2272bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2282bde8e466a4451c7319e3a072d118917957d6554Steve Block
2292bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didRemoveAllIcons()
2302bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_iconDatabaseClient.didRemoveAllIcons(this);
2322bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2332bde8e466a4451c7319e3a072d118917957d6554Steve Block
2342bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didFinishURLImport()
2352bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_webContext)
2372bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
2382bde8e466a4451c7319e3a072d118917957d6554Steve Block
2392bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT(!m_urlImportCompleted);
2402bde8e466a4451c7319e3a072d118917957d6554Steve Block
2412bde8e466a4451c7319e3a072d118917957d6554Steve Block    LOG(IconDatabase, "WK2 UIProcess URL import complete, notifying all %i pending page URL load decisions", m_pendingLoadDecisionURLMap.size());
2422bde8e466a4451c7319e3a072d118917957d6554Steve Block
2432bde8e466a4451c7319e3a072d118917957d6554Steve Block    HashMap<uint64_t, String>::iterator i = m_pendingLoadDecisionURLMap.begin();
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block    HashMap<uint64_t, String>::iterator end = m_pendingLoadDecisionURLMap.end();
2452bde8e466a4451c7319e3a072d118917957d6554Steve Block
2462bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (; i != end; ++i) {
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block        LOG(IconDatabase, "WK2 UIProcess performing delayed callback on callback ID %i for page url %s", (int)i->first, i->second.ascii().data());
2482bde8e466a4451c7319e3a072d118917957d6554Steve Block        IconLoadDecision decision = m_iconDatabaseImpl->synchronousLoadDecisionForIconURL(i->second, 0);
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Decisions should never be unknown after the inital import is complete
2512bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(decision != IconLoadUnknown);
2522bde8e466a4451c7319e3a072d118917957d6554Steve Block
2532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // FIXME (Multi-WebProcess): We need to know which connection to send this message to.
2542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_webContext->sendToAllProcesses(Messages::WebIconDatabaseProxy::ReceivedIconLoadDecision(static_cast<int>(decision), i->first));
2552bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2562bde8e466a4451c7319e3a072d118917957d6554Steve Block
2572bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_pendingLoadDecisionURLMap.clear();
2582bde8e466a4451c7319e3a072d118917957d6554Steve Block
2592bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_urlImportCompleted = true;
2602bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2612bde8e466a4451c7319e3a072d118917957d6554Steve Block
2622bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* decoder)
2632bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2642bde8e466a4451c7319e3a072d118917957d6554Steve Block    didReceiveWebIconDatabaseMessage(connection, messageID, decoder);
2652bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2662bde8e466a4451c7319e3a072d118917957d6554Steve Block
2672bde8e466a4451c7319e3a072d118917957d6554Steve BlockCoreIPC::SyncReplyMode WebIconDatabase::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* decoder, CoreIPC::ArgumentEncoder* reply)
2682bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2692bde8e466a4451c7319e3a072d118917957d6554Steve Block    return didReceiveSyncWebIconDatabaseMessage(connection, messageID, decoder, reply);
2702bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2712bde8e466a4451c7319e3a072d118917957d6554Steve Block
2722bde8e466a4451c7319e3a072d118917957d6554Steve Block} // namespace WebKit
273