WebIconDatabase.cpp revision be2100c6dda5250b84fe4e0a6eed77bcd6d6e781
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
2820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck#include "FileSystem.h"
3220ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "GraphicsJNI.h"
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 "KURL.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreJni.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIHelp.h>
4120ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h>
423c25249500ca8f7f4650b123b179948d46b9aa81Steve Block#include <SharedBuffer.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>
4620ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <pthread.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/misc.h>
4820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <wtf/Platform.h>
490ed5f4b1c2410265cfbba9f377e79a044dcd8744Patrick Scott#include <wtf/text/CString.h>
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectjobject webcoreImageToJavaBitmap(JNIEnv* env, WebCore::Image* icon)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!icon)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkBitmap bm;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::SharedBuffer* buffer = icon->data();
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!buffer || !SkImageDecoder::DecodeMemory(buffer->data(), buffer->size(),
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 &bm, SkBitmap::kNo_Config,
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                            SkImageDecoder::kDecodePixels_Mode))
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return GraphicsJNI::createBitmap(env, new SkBitmap(bm), false, NULL);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WebIconDatabase* gIconDatabaseClient = new WebIconDatabase();
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// XXX: Called by the IconDatabase thread
7045b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid WebIconDatabase::dispatchDidAddIconForPageURL(const WTF::String& pageURL)
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.lock();
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotifications.append(pageURL);
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mDeliveryRequested) {
750deb5796f1ccc4ea91903fec3eda2c18ea5b3e37Patrick Scott        mDeliveryRequested = true;
760deb5796f1ccc4ea91903fec3eda2c18ea5b3e37Patrick Scott        JavaSharedClient::EnqueueFunctionPtr(DeliverNotifications, this);
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.unlock();
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::RegisterForIconNotification(WebIconDatabaseClient* client)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8494f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott    WebIconDatabase* db = gIconDatabaseClient;
8594f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott    for (unsigned i = 0; i < db->mClients.size(); ++i) {
8694f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott        // Do not add the same client twice.
8794f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott        if (db->mClients[i] == client)
8894f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott            return;
8994f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott    }
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gIconDatabaseClient->mClients.append(client);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::UnregisterForIconNotification(WebIconDatabaseClient* client)
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebIconDatabase* db = gIconDatabaseClient;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < db->mClients.size(); ++i) {
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (db->mClients[i] == client) {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            db->mClients.remove(i);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
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
11845b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    Vector<WTF::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    clients.swap(mClients);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < queue.size(); ++i) {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned j = 0; j < clients.size(); ++j) {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            clients[j]->didAddIconForPageUrl(queue[i]);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Open(JNIEnv* env, jobject obj, jstring path)
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IconDatabase* iconDb = WebCore::iconDatabase();
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (iconDb->isOpen())
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    iconDb->setEnabled(true);
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    iconDb->setClient(gIconDatabaseClient);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(path, "No path given to nativeOpen");
14327dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String pathStr = jstringToWtfString(env, path);
144be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    WTF::CString fullPath = WebCore::pathByAppendingComponent(pathStr,
145be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            WebCore::IconDatabase::defaultDatabaseFilename()).utf8();
146be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
147be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    bool didSetPermissions = false;
148be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    if (access(fullPath.data(), F_OK) == 0) {
149be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        if (chmod(fullPath.data(), mode) == 0)
150be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            didSetPermissions = true;
151be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    } else {
152be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        int fd = open(fullPath.data(), O_CREAT, mode);
153be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        if (fd >= 0) {
154be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            close(fd);
155be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            didSetPermissions = true;
156be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        }
157be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    }
158be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    if (didSetPermissions) {
159be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        LOGV("Opening WebIconDatabase file '%s'", pathStr.latin1().data());
160be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        bool res = iconDb->open(pathStr);
161be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        if (!res)
162be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            LOGE("Open failed!");
163be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    } else
164be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        LOGE("Failed to set permissions on '%s'", fullPath.data());
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Close(JNIEnv* env, jobject obj)
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->close();
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RemoveAllIcons(JNIEnv* env, jobject obj)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Removing all icons");
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->removeAllIcons();
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject IconForPageUrl(JNIEnv* env, jobject obj, jstring url)
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to iconForPageUrl");
18127dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String urlStr = jstringToWtfString(env, url);
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(urlStr,
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebCore::IntSize(16, 16));
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Retrieving icon for '%s' %p", urlStr.latin1().data(), icon);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return webcoreImageToJavaBitmap(env, icon);
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RetainIconForPageUrl(JNIEnv* env, jobject obj, jstring url)
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to retainIconForPageUrl");
19227dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String urlStr = jstringToWtfString(env, url);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Retaining icon for '%s'", urlStr.latin1().data());
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->retainIconForPageURL(urlStr);
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void ReleaseIconForPageUrl(JNIEnv* env, jobject obj, jstring url)
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to releaseIconForPageUrl");
20127dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String urlStr = jstringToWtfString(env, url);
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Releasing icon for '%s'", urlStr.latin1().data());
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::iconDatabase()->releaseIconForPageURL(urlStr);
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gWebIconDatabaseMethods[] = {
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeOpen", "(Ljava/lang/String;)V",
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) Open },
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeClose", "()V",
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) Close },
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRemoveAllIcons", "()V",
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) RemoveAllIcons },
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeIconForPageUrl", "(Ljava/lang/String;)Landroid/graphics/Bitmap;",
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) IconForPageUrl },
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRetainIconForPageUrl", "(Ljava/lang/String;)V",
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) RetainIconForPageUrl },
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeReleaseIconForPageUrl", "(Ljava/lang/String;)V",
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) ReleaseIconForPageUrl }
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
225b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebIconDatabase(JNIEnv* env)
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
227bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block#ifndef NDEBUG
228bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    jclass webIconDatabase = env->FindClass("android/webkit/WebIconDatabase");
229bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    LOG_ASSERT(webIconDatabase, "Unable to find class android.webkit.WebIconDatabase");
230bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(webIconDatabase);
231bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block#endif
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jniRegisterNativeMethods(env, "android/webkit/WebIconDatabase",
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            gWebIconDatabaseMethods, NELEM(gWebIconDatabaseMethods));
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
238