18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitDLL.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CFDictionaryPropertyBag.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebPreferences.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebNotificationCenter.h"
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <WebCore/BitmapInfo.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/BString.h>
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/COMPtr.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/FileSystem.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/IconDatabase.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Image.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/PlatformString.h>
402bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/SharedBuffer.h>
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MainThread.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "shlobj.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WebIconDatabase ----------------------------------------------------------------
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebIconDatabase* WebIconDatabase::m_sharedWebIconDatabase = 0;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebIconDatabase::WebIconDatabase()
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project: m_refCount(0)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project, m_deliveryRequested(false)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gClassCount++;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gClassNameCount.add("WebIconDatabase");
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebIconDatabase::~WebIconDatabase()
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gClassCount--;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gClassNameCount.remove("WebIconDatabase");
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::init()
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences* standardPrefs = WebPreferences::sharedStandardPreferences();
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL enabled = FALSE;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(standardPrefs->iconDatabaseEnabled(&enabled))) {
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enabled = FALSE;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("Unable to get icon database enabled preference");
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    iconDatabase().setEnabled(!!enabled);
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!(!!enabled))
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    startUpIconDatabase();
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WebIconDatabase::startUpIconDatabase()
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    WebPreferences* standardPrefs = WebPreferences::sharedStandardPreferences();
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    iconDatabase().setClient(this);
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BSTR prefDatabasePath = 0;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(standardPrefs->iconDatabaseLocation(&prefDatabasePath)))
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("Unable to get icon database location preference");
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String databasePath(prefDatabasePath, SysStringLen(prefDatabasePath));
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SysFreeString(prefDatabasePath);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (databasePath.isEmpty()) {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        databasePath = localUserSpecificStorageDirectory();
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (databasePath.isEmpty())
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("Failed to construct default icon database path");
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
992bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!iconDatabase().open(databasePath, WebCore::IconDatabase::defaultDatabaseFilename()))
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("Failed to open icon database path");
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WebIconDatabase::shutDownIconDatabase()
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebIconDatabase* WebIconDatabase::createInstance()
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebIconDatabase* instance = new WebIconDatabase();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    instance->AddRef();
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return instance;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebIconDatabase* WebIconDatabase::sharedWebIconDatabase()
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_sharedWebIconDatabase) {
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_sharedWebIconDatabase->AddRef();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_sharedWebIconDatabase;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sharedWebIconDatabase = createInstance();
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sharedWebIconDatabase->init();
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_sharedWebIconDatabase;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// IUnknown -------------------------------------------------------------------
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::QueryInterface(REFIID riid, void** ppvObject)
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *ppvObject = 0;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (IsEqualGUID(riid, IID_IUnknown))
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *ppvObject = static_cast<IWebIconDatabase*>(this);
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (IsEqualGUID(riid, IID_IWebIconDatabase))
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *ppvObject = static_cast<IWebIconDatabase*>(this);
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return E_NOINTERFACE;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AddRef();
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectULONG STDMETHODCALLTYPE WebIconDatabase::AddRef(void)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ++m_refCount;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectULONG STDMETHODCALLTYPE WebIconDatabase::Release(void)
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ULONG newRef = --m_refCount;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!newRef)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete(this);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return newRef;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// IWebIconDatabase --------------------------------------------------------------------
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::sharedIconDatabase(
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [retval][out] */ IWebIconDatabase** result)
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *result = sharedWebIconDatabase();
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::iconForURL(
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ BSTR url,
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [optional][in] */ LPSIZE size,
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [optional][in] */ BOOL /*cache*/,
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [retval][out] */ OLE_HANDLE* bitmap)
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntSize intSize(*size);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Image* icon = 0;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (url)
1742bde8e466a4451c7319e3a072d118917957d6554Steve Block        icon = iconDatabase().synchronousIconForPageURL(String(url, SysStringLen(url)), intSize);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make sure we check for the case of an "empty image"
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (icon && icon->width()) {
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *bitmap = (OLE_HANDLE)(ULONG64)getOrCreateSharedBitmap(size);
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!icon->getHBITMAPOfSize((HBITMAP)(ULONG64)*bitmap, size)) {
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("Failed to draw Image to HBITMAP");
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *bitmap = 0;
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return E_FAIL;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return S_OK;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return defaultIconWithSize(size, bitmap);
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::defaultIconWithSize(
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ LPSIZE size,
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [retval][out] */ OLE_HANDLE* result)
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *result = (OLE_HANDLE)(ULONG64)getOrCreateDefaultIconBitmap(size);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::retainIconForURL(
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ BSTR url)
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    iconDatabase().retainIconForPageURL(String(url, SysStringLen(url)));
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::releaseIconForURL(
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ BSTR url)
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    iconDatabase().releaseIconForPageURL(String(url, SysStringLen(url)));
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::removeAllIcons(void)
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    iconDatabase().removeAllIcons();
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::delayDatabaseCleanup(void)
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IconDatabase::delayDatabaseCleanup();
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::allowDatabaseCleanup(void)
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IconDatabase::allowDatabaseCleanup();
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::iconURLForURL(
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ BSTR url,
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [retval][out] */ BSTR* iconURL)
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!url || !iconURL)
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return E_POINTER;
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block    BString iconURLBSTR(iconDatabase().synchronousIconURLForPageURL(String(url, SysStringLen(url))));
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *iconURL = iconURLBSTR.release();
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::isEnabled(
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* [retval][out] */ BOOL *result)
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
24481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    *result = iconDatabase().isEnabled();
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return S_OK;
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebIconDatabase::setEnabled(
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* [in] */ BOOL flag)
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    BOOL currentlyEnabled;
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    isEnabled(&currentlyEnabled);
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (currentlyEnabled && !flag) {
25481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        iconDatabase().setEnabled(false);
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        shutDownIconDatabase();
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else if (!currentlyEnabled && flag) {
25781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        iconDatabase().setEnabled(true);
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        startUpIconDatabase();
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return S_OK;
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
26381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochHRESULT STDMETHODCALLTYPE WebIconDatabase::hasIconForURL(
26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        /* [in] */ BSTR url,
26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        /* [out][retval] */ BOOL* result)
26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
26781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!url || !result)
26881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return E_POINTER;
26981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
27081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String urlString(url, SysStringLen(url));
27181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Passing a size parameter of 0, 0 means we don't care about the result of the image, we just
27381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // want to make sure the read from disk to load the icon is kicked off.
2742bde8e466a4451c7319e3a072d118917957d6554Steve Block    iconDatabase().synchronousIconForPageURL(urlString, IntSize(0, 0));
27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Check to see if we have a non-empty icon URL for the page, and if we do, we have an icon for
27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // the page.
2782bde8e466a4451c7319e3a072d118917957d6554Steve Block    *result = !(iconDatabase().synchronousIconURLForPageURL(urlString).isEmpty());
27981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return S_OK;
28181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHBITMAP createDIB(LPSIZE size)
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BitmapInfo bmInfo = BitmapInfo::create(IntSize(*size));
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HDC dc = GetDC(0);
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HBITMAP result = CreateDIBSection(dc, &bmInfo, DIB_RGB_COLORS, 0, 0, 0);
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ReleaseDC(0, dc);
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHBITMAP WebIconDatabase::getOrCreateSharedBitmap(LPSIZE size)
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HBITMAP result = m_sharedIconMap.get(*size);
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result)
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return result;
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = createDIB(size);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sharedIconMap.set(*size, result);
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHBITMAP WebIconDatabase::getOrCreateDefaultIconBitmap(LPSIZE size)
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HBITMAP result = m_defaultIconMap.get(*size);
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result)
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return result;
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = createDIB(size);
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_defaultIconMap.set(*size, result);
31381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!iconDatabase().defaultIcon(*size)->getHBITMAPOfSize(result, size)) {
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("Failed to draw Image to HBITMAP");
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// IconDatabaseClient
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3222bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebIconDatabase::performImport()
3232bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3242bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Windows doesn't do any old-style database importing.
3252bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
3262bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3272bde8e466a4451c7319e3a072d118917957d6554Steve Block
3282bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didRemoveAllIcons()
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Queueing the empty string is a special way of saying "this queued notification is the didRemoveAllIcons notification"
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MutexLocker locker(m_notificationMutex);
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_notificationQueue.append(String());
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    scheduleNotificationDelivery();
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3362bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didImportIconURLForPageURL(const WTF::String& pageURL)
3372bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MutexLocker locker(m_notificationMutex);
339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_notificationQueue.append(pageURL.threadsafeCopy());
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    scheduleNotificationDelivery();
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3432bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didImportIconDataForPageURL(const WTF::String& pageURL)
3442bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3452bde8e466a4451c7319e3a072d118917957d6554Steve Block    // WebKit1 only has a single "icon did change" notification.
3462bde8e466a4451c7319e3a072d118917957d6554Steve Block    didImportIconURLForPageURL(pageURL);
3472bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3482bde8e466a4451c7319e3a072d118917957d6554Steve Block
3492bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didChangeIconForPageURL(const WTF::String& pageURL)
3502bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3512bde8e466a4451c7319e3a072d118917957d6554Steve Block    // WebKit1 only has a single "icon did change" notification.
3522bde8e466a4451c7319e3a072d118917957d6554Steve Block    didImportIconURLForPageURL(pageURL);
3532bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3542bde8e466a4451c7319e3a072d118917957d6554Steve Block
3552bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebIconDatabase::didFinishURLImport()
3562bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3572bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3582bde8e466a4451c7319e3a072d118917957d6554Steve Block
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::scheduleNotificationDelivery()
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Caller of this method must hold the m_notificationQueue lock
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_notificationMutex.tryLock());
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_deliveryRequested) {
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_deliveryRequested = true;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callOnMainThread(deliverNotifications, 0);
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBSTR WebIconDatabase::iconDatabaseDidAddIconNotification()
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BSTR didAddIconName = SysAllocString(WebIconDatabaseDidAddIconNotification);
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return didAddIconName;
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFStringRef WebIconDatabase::iconDatabaseNotificationUserInfoURLKey()
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static CFStringRef iconUserInfoURLKey = String(WebIconNotificationUserInfoURLKey).createCFString();
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return iconUserInfoURLKey;
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBSTR WebIconDatabase::iconDatabaseDidRemoveAllIconsNotification()
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BSTR didRemoveAllIconsName = SysAllocString(WebIconDatabaseDidRemoveAllIconsNotification);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return didRemoveAllIconsName;
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void postDidRemoveAllIconsNotification(WebIconDatabase* iconDB)
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebNotificationCenter* notifyCenter = WebNotificationCenter::defaultCenterInternal();
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notifyCenter->postNotificationName(WebIconDatabase::iconDatabaseDidRemoveAllIconsNotification(), static_cast<IWebIconDatabase*>(iconDB), 0);
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void postDidAddIconNotification(const String& pageURL, WebIconDatabase* iconDB)
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<CFMutableDictionaryRef> dictionary(AdoptCF,
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<CFStringRef> url(AdoptCF, pageURL.createCFString());
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFDictionaryAddValue(dictionary.get(), WebIconDatabase::iconDatabaseNotificationUserInfoURLKey(), url.get());
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPtr<CFDictionaryPropertyBag> userInfo = CFDictionaryPropertyBag::createInstance();
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    userInfo->setDictionary(dictionary.get());
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebNotificationCenter* notifyCenter = WebNotificationCenter::defaultCenterInternal();
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notifyCenter->postNotificationName(WebIconDatabase::iconDatabaseDidAddIconNotification(), static_cast<IWebIconDatabase*>(iconDB), userInfo.get());
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::deliverNotifications(void*)
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_sharedWebIconDatabase);
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_sharedWebIconDatabase)
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_sharedWebIconDatabase->m_deliveryRequested);
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<String> queue;
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        MutexLocker locker(m_sharedWebIconDatabase->m_notificationMutex);
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        queue.swap(m_sharedWebIconDatabase->m_notificationQueue);
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_sharedWebIconDatabase->m_deliveryRequested = false;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < queue.size(); ++i) {
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (queue[i].isNull())
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            postDidRemoveAllIconsNotification(m_sharedWebIconDatabase);
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            postDidAddIconNotification(queue[i], m_sharedWebIconDatabase);
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
431