WebIconDatabase.cpp revision 3298a7d84b96ade73c6b170671711a8f2792ae59
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2006, The Android Open Source Project
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 *  * 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 *  * 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 THE COPYRIGHT HOLDERS ``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
163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER 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#define LOG_TAG "favicons"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <config.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Platform.h>
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JavaSharedClient.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "jni_utility.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KURL.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreJni.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <pthread.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsJNI.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <SkBitmap.h>
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <SkImageDecoder.h>
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <SkTemplates.h>
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/misc.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h>
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectjobject webcoreImageToJavaBitmap(JNIEnv* env, WebCore::Image* icon)
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!icon)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkBitmap bm;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::SharedBuffer* buffer = icon->data();
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!buffer || !SkImageDecoder::DecodeMemory(buffer->data(), buffer->size(),
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 &bm, SkBitmap::kNo_Config,
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                            SkImageDecoder::kDecodePixels_Mode))
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return GraphicsJNI::createBitmap(env, new SkBitmap(bm), false, NULL);
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WebIconDatabase* gIconDatabaseClient = new WebIconDatabase();
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// XXX: Called by the IconDatabase thread
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::dispatchDidAddIconForPageURL(const WebCore::String& pageURL)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If there are no clients currently, drop this message.
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mClients.size() == 0)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.lock();
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotifications.append(pageURL);
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mDeliveryRequested) {
770deb5796f1ccc4ea91903fec3eda2c18ea5b3e37Patrick Scott        mDeliveryRequested = true;
780deb5796f1ccc4ea91903fec3eda2c18ea5b3e37Patrick Scott        JavaSharedClient::EnqueueFunctionPtr(DeliverNotifications, this);
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.unlock();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::RegisterForIconNotification(WebIconDatabaseClient* client)
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gIconDatabaseClient->mClientsMutex.lock();
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gIconDatabaseClient->mClients.append(client);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gIconDatabaseClient->mClientsMutex.unlock();
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::UnregisterForIconNotification(WebIconDatabaseClient* client)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebIconDatabase* db = gIconDatabaseClient;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    db->mClientsMutex.lock();
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < db->mClients.size(); ++i) {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (db->mClients[i] == client) {
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            db->mClients.remove(i);
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    db->mClientsMutex.unlock();
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::DeliverNotifications(void* v)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(v);
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ((WebIconDatabase*)v)->deliverNotifications();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::deliverNotifications()
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(mDeliveryRequested);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Swap the notifications queue
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<WebCore::String> queue;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.lock();
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    queue.swap(mNotifications);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mDeliveryRequested = false;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.unlock();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Swap the clients queue
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<WebIconDatabaseClient*> clients;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mClientsMutex.lock();
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clients.swap(mClients);
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mClientsMutex.unlock();
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < queue.size(); ++i) {
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned j = 0; j < clients.size(); ++j) {
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            clients[j]->didAddIconForPageUrl(queue[i]);
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Open(JNIEnv* env, jobject obj, jstring path)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IconDatabase* iconDb = WebCore::iconDatabase();
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (iconDb->isOpen())
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    iconDb->setEnabled(true);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    iconDb->setClient(gIconDatabaseClient);
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(path, "No path given to nativeOpen");
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String pathStr = to_string(env, path);
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Opening WebIconDatabase file '%s'", pathStr.latin1().data());
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool res = iconDb->open(pathStr);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!res)
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGE("Open failed!");
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Close(JNIEnv* env, jobject obj)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->close();
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RemoveAllIcons(JNIEnv* env, jobject obj)
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Removing all icons");
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->removeAllIcons();
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject IconForPageUrl(JNIEnv* env, jobject obj, jstring url)
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to iconForPageUrl");
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String urlStr = to_string(env, url);
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(urlStr,
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebCore::IntSize(16, 16));
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Retrieving icon for '%s' %p", urlStr.latin1().data(), icon);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return webcoreImageToJavaBitmap(env, icon);
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RetainIconForPageUrl(JNIEnv* env, jobject obj, jstring url)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to retainIconForPageUrl");
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String urlStr = to_string(env, url);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Retaining icon for '%s'", urlStr.latin1().data());
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->retainIconForPageURL(urlStr);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void ReleaseIconForPageUrl(JNIEnv* env, jobject obj, jstring url)
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to releaseIconForPageUrl");
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String urlStr = to_string(env, url);
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Releasing icon for '%s'", urlStr.latin1().data());
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->releaseIconForPageURL(urlStr);
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gWebIconDatabaseMethods[] = {
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeOpen", "(Ljava/lang/String;)V",
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) Open },
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeClose", "()V",
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) Close },
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRemoveAllIcons", "()V",
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) RemoveAllIcons },
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeIconForPageUrl", "(Ljava/lang/String;)Landroid/graphics/Bitmap;",
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) IconForPageUrl },
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRetainIconForPageUrl", "(Ljava/lang/String;)V",
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) RetainIconForPageUrl },
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeReleaseIconForPageUrl", "(Ljava/lang/String;)V",
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) ReleaseIconForPageUrl }
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint register_webicondatabase(JNIEnv* env)
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass webIconDB = env->FindClass("android/webkit/WebIconDatabase");
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(webIconDB, "Unable to find class android.webkit.WebIconDatabase");
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jniRegisterNativeMethods(env, "android/webkit/WebIconDatabase",
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            gWebIconDatabaseMethods, NELEM(gWebIconDatabaseMethods));
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
220