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(¤tlyEnabled); 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