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
69f25579c312629288541e80e03be1b6c08c609942Steve Blockbool WebIconDatabase::performImport()
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
71f25579c312629288541e80e03be1b6c08c609942Steve Block    // We don't do do any old-style database importing.
72f25579c312629288541e80e03be1b6c08c609942Steve Block    return true;
73f25579c312629288541e80e03be1b6c08c609942Steve Block}
74f25579c312629288541e80e03be1b6c08c609942Steve Block
75f25579c312629288541e80e03be1b6c08c609942Steve Block// Called on the WebCore thread
76f25579c312629288541e80e03be1b6c08c609942Steve Blockvoid WebIconDatabase::didImportIconURLForPageURL(const WTF::String& pageURL)
77f25579c312629288541e80e03be1b6c08c609942Steve Block{
78f25579c312629288541e80e03be1b6c08c609942Steve Block    // FIXME: After http://trac.webkit.org/changeset/81719 this method is called
79f25579c312629288541e80e03be1b6c08c609942Steve Block    // on the WebCore thread, so switching threads via this queue is superfluous
80f25579c312629288541e80e03be1b6c08c609942Steve Block    // and should be removed. http://b/4565022
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.lock();
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotifications.append(pageURL);
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mDeliveryRequested) {
840deb5796f1ccc4ea91903fec3eda2c18ea5b3e37Patrick Scott        mDeliveryRequested = true;
850deb5796f1ccc4ea91903fec3eda2c18ea5b3e37Patrick Scott        JavaSharedClient::EnqueueFunctionPtr(DeliverNotifications, this);
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.unlock();
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
90f25579c312629288541e80e03be1b6c08c609942Steve Blockvoid WebIconDatabase::didImportIconDataForPageURL(const WTF::String& pageURL)
91f25579c312629288541e80e03be1b6c08c609942Steve Block{
92f25579c312629288541e80e03be1b6c08c609942Steve Block    // WebKit1 only has a single "icon did change" notification.
93f25579c312629288541e80e03be1b6c08c609942Steve Block    didImportIconURLForPageURL(pageURL);
94f25579c312629288541e80e03be1b6c08c609942Steve Block}
95f25579c312629288541e80e03be1b6c08c609942Steve Block
96f25579c312629288541e80e03be1b6c08c609942Steve Blockvoid WebIconDatabase::didChangeIconForPageURL(const WTF::String& pageURL)
97f25579c312629288541e80e03be1b6c08c609942Steve Block{
98f25579c312629288541e80e03be1b6c08c609942Steve Block    // WebKit1 only has a single "icon did change" notification.
99f25579c312629288541e80e03be1b6c08c609942Steve Block    didImportIconURLForPageURL(pageURL);
100f25579c312629288541e80e03be1b6c08c609942Steve Block}
101f25579c312629288541e80e03be1b6c08c609942Steve Block
102f25579c312629288541e80e03be1b6c08c609942Steve Blockvoid WebIconDatabase::didRemoveAllIcons()
103f25579c312629288541e80e03be1b6c08c609942Steve Block{
104f25579c312629288541e80e03be1b6c08c609942Steve Block}
105f25579c312629288541e80e03be1b6c08c609942Steve Block
106f25579c312629288541e80e03be1b6c08c609942Steve Blockvoid WebIconDatabase::didFinishURLImport()
107f25579c312629288541e80e03be1b6c08c609942Steve Block{
108f25579c312629288541e80e03be1b6c08c609942Steve Block}
109f25579c312629288541e80e03be1b6c08c609942Steve Block
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::RegisterForIconNotification(WebIconDatabaseClient* client)
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11394f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott    WebIconDatabase* db = gIconDatabaseClient;
11494f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott    for (unsigned i = 0; i < db->mClients.size(); ++i) {
11594f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott        // Do not add the same client twice.
11694f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott        if (db->mClients[i] == client)
11794f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott            return;
11894f369b3daaa736ae6488f8f206884d0dcf600aaPatrick Scott    }
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gIconDatabaseClient->mClients.append(client);
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::UnregisterForIconNotification(WebIconDatabaseClient* client)
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebIconDatabase* db = gIconDatabaseClient;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < db->mClients.size(); ++i) {
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (db->mClients[i] == client) {
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            db->mClients.remove(i);
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::DeliverNotifications(void* v)
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(v);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ((WebIconDatabase*)v)->deliverNotifications();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called in the WebCore thread
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebIconDatabase::deliverNotifications()
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(mDeliveryRequested);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Swap the notifications queue
14745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    Vector<WTF::String> queue;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.lock();
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    queue.swap(mNotifications);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mDeliveryRequested = false;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mNotificationsMutex.unlock();
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Swap the clients queue
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<WebIconDatabaseClient*> clients;
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    clients.swap(mClients);
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < queue.size(); ++i) {
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned j = 0; j < clients.size(); ++j) {
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            clients[j]->didAddIconForPageUrl(queue[i]);
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Open(JNIEnv* env, jobject obj, jstring path)
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
166afec8e01b31500328646269eadfaff1913adcebaSteve Block    WebCore::IconDatabaseBase& iconDb = WebCore::iconDatabase();
167d937470c29d31833299da3bb47599e43db82852bBen Murdoch    if (iconDb.isOpen())
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
169d937470c29d31833299da3bb47599e43db82852bBen Murdoch    iconDb.setEnabled(true);
170d937470c29d31833299da3bb47599e43db82852bBen Murdoch    iconDb.setClient(gIconDatabaseClient);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(path, "No path given to nativeOpen");
17227dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String pathStr = jstringToWtfString(env, path);
173be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    WTF::CString fullPath = WebCore::pathByAppendingComponent(pathStr,
174be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            WebCore::IconDatabase::defaultDatabaseFilename()).utf8();
175be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
176be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    bool didSetPermissions = false;
177be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    if (access(fullPath.data(), F_OK) == 0) {
178be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        if (chmod(fullPath.data(), mode) == 0)
179be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            didSetPermissions = true;
180be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    } else {
181be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        int fd = open(fullPath.data(), O_CREAT, mode);
182be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        if (fd >= 0) {
183be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            close(fd);
184be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            didSetPermissions = true;
185be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        }
186be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    }
187be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    if (didSetPermissions) {
188be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        LOGV("Opening WebIconDatabase file '%s'", pathStr.latin1().data());
1895d332600324dd9cf9a71dd5cf45b849859890818Steve Block        bool res = iconDb.open(pathStr, WebCore::IconDatabase::defaultDatabaseFilename());
190be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        if (!res)
191be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck            LOGE("Open failed!");
192be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck    } else
193be2100c6dda5250b84fe4e0a6eed77bcd6d6e781John Reck        LOGE("Failed to set permissions on '%s'", fullPath.data());
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Close(JNIEnv* env, jobject obj)
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
198d937470c29d31833299da3bb47599e43db82852bBen Murdoch    WebCore::iconDatabase().close();
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RemoveAllIcons(JNIEnv* env, jobject obj)
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Removing all icons");
204d937470c29d31833299da3bb47599e43db82852bBen Murdoch    WebCore::iconDatabase().removeAllIcons();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject IconForPageUrl(JNIEnv* env, jobject obj, jstring url)
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to iconForPageUrl");
21027dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String urlStr = jstringToWtfString(env, url);
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2122f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block    // FIXME: This method should not be used from outside WebCore and will be removed.
2132f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block    // http://trac.webkit.org/changeset/81484
2142f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block    WebCore::Image* icon = WebCore::iconDatabase().synchronousIconForPageURL(urlStr, WebCore::IntSize(16, 16));
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Retrieving icon for '%s' %p", urlStr.latin1().data(), icon);
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return webcoreImageToJavaBitmap(env, icon);
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RetainIconForPageUrl(JNIEnv* env, jobject obj, jstring url)
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to retainIconForPageUrl");
22227dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String urlStr = jstringToWtfString(env, url);
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Retaining icon for '%s'", urlStr.latin1().data());
225d937470c29d31833299da3bb47599e43db82852bBen Murdoch    WebCore::iconDatabase().retainIconForPageURL(urlStr);
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void ReleaseIconForPageUrl(JNIEnv* env, jobject obj, jstring url)
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(url, "No url given to releaseIconForPageUrl");
23127dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String urlStr = jstringToWtfString(env, url);
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("Releasing icon for '%s'", urlStr.latin1().data());
234d937470c29d31833299da3bb47599e43db82852bBen Murdoch    WebCore::iconDatabase().releaseIconForPageURL(urlStr);
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gWebIconDatabaseMethods[] = {
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeOpen", "(Ljava/lang/String;)V",
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) Open },
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeClose", "()V",
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) Close },
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRemoveAllIcons", "()V",
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) RemoveAllIcons },
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeIconForPageUrl", "(Ljava/lang/String;)Landroid/graphics/Bitmap;",
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) IconForPageUrl },
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRetainIconForPageUrl", "(Ljava/lang/String;)V",
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) RetainIconForPageUrl },
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeReleaseIconForPageUrl", "(Ljava/lang/String;)V",
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) ReleaseIconForPageUrl }
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
255b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebIconDatabase(JNIEnv* env)
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
257bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block#ifndef NDEBUG
258bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    jclass webIconDatabase = env->FindClass("android/webkit/WebIconDatabase");
259bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    LOG_ASSERT(webIconDatabase, "Unable to find class android.webkit.WebIconDatabase");
260bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(webIconDatabase);
261bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block#endif
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jniRegisterNativeMethods(env, "android/webkit/WebIconDatabase",
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            gWebIconDatabaseMethods, NELEM(gWebIconDatabaseMethods));
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
268