18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2009, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
8e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
10e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
14e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30e431852bff2ca6954b119a8c9471fd676abea029Steve Block#ifdef ANDROID_PLUGINS
31e431852bff2ca6954b119a8c9471fd676abea029Steve Block
3220ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "JNIUtility.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
3420ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "PluginDatabase.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginMainThreadScheduler.h"
3620ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "Timer.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npfunctions.h"
3820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "npruntime_impl.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <dlfcn.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <errno.h>
4179768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4334122fda872b1add732615ee1f705b3c748b773cGrace Kloba// un-comment this to enable logging
4434122fda872b1add732615ee1f705b3c748b773cGrace Kloba//#define PLUGIN_DEBUG_LOCAL
45e431852bff2ca6954b119a8c9471fd676abea029Steve Block#define LOG_TAG "WebKit"
4634122fda872b1add732615ee1f705b3c748b773cGrace Kloba#include "NotImplemented.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDebug.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDebugAndroid.h"
49e431852bff2ca6954b119a8c9471fd676abea029Steve Block
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Simple class which calls dlclose() on a dynamic library when going
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// out of scope. Call ok() if the handle should stay open.
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass DynamicLibraryCloser
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  public:
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DynamicLibraryCloser(PlatformModule *module) : m_module(module) { }
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~DynamicLibraryCloser()
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Close the library if non-NULL reference and open.
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_module && *m_module)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dlclose(*m_module);
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *m_module = 0;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void ok() { m_module = NULL; }
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  private:
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PlatformModule *m_module;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// A container for a dummy npp instance. This is used to allow
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// NPN_PluginThreadAsyncCall() to be used with NULL passed as the npp
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// instance. This is substituted instead, and is shared between all
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// plugins which behave in this way. This will be lazily created in
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the first call to NPN_PluginThreadAsyncCall().
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass DummyNpp {
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  public:
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DummyNpp() {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npp = new NPP_t();
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npp->pdata = NULL;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_npp->ndata = NULL;
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PluginMainThreadScheduler::scheduler().registerPlugin(m_npp);
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~DummyNpp() {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PluginMainThreadScheduler::scheduler().unregisterPlugin(m_npp);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_npp;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPP_t *getInstance() { return m_npp; }
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  private:
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPP_t *m_npp;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool getEntryPoint(PlatformModule module,
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          const char *name,
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          void **entry_point)
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    dlerror();
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *entry_point = dlsym(module, name);
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char *error = dlerror();
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(error == NULL && *entry_point != NULL) {
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("Couldn't get entry point \"%s\": %s\n",
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                   name, error);
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginPackage::isPluginBlacklisted()
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // No blacklisted Android plugins... yet!
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginPackage::determineQuirks(const String& mimeType)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The Gears implementation relies on it being loaded *all the time*,
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // so check to see if this package represents the Gears plugin and
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // load it.
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mimeType == "application/x-googlegears") {
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_quirks.add(PluginQuirkDontUnloadPlugin);
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Android_NPN_PluginThreadAsyncCall(NPP instance,
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              void (*func) (void *),
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              void *userData)
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Translate all instance == NULL to a dummy actual npp.
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static DummyNpp dummyNpp;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (instance == NULL) {
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        instance = dummyNpp.getInstance();
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Call through to the wrapped function.
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPN_PluginThreadAsyncCall(instance, func, userData);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
141d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reedstatic void initializeExtraBrowserFuncs(NPNetscapeFuncs *funcs)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->version = NP_VERSION_MINOR;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->geturl = NPN_GetURL;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->posturl = NPN_PostURL;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->requestread = NPN_RequestRead;
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->newstream = NPN_NewStream;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->write = NPN_Write;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->destroystream = NPN_DestroyStream;
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->status = NPN_Status;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->uagent = NPN_UserAgent;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->memalloc = NPN_MemAlloc;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->memfree = NPN_MemFree;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->memflush = NPN_MemFlush;
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->reloadplugins = NPN_ReloadPlugins;
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->geturlnotify = NPN_GetURLNotify;
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->posturlnotify = NPN_PostURLNotify;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getvalue = NPN_GetValue;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->setvalue = NPN_SetValue;
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->invalidaterect = NPN_InvalidateRect;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->invalidateregion = NPN_InvalidateRegion;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->forceredraw = NPN_ForceRedraw;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getJavaEnv = NPN_GetJavaEnv;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getJavaPeer = NPN_GetJavaPeer;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->pushpopupsenabledstate = NPN_PushPopupsEnabledState;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->poppopupsenabledstate = NPN_PopPopupsEnabledState;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->pluginthreadasynccall = Android_NPN_PluginThreadAsyncCall;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->scheduletimer = NPN_ScheduleTimer;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->unscheduletimer = NPN_UnscheduleTimer;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->releasevariantvalue = _NPN_ReleaseVariantValue;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getstringidentifier = _NPN_GetStringIdentifier;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getstringidentifiers = _NPN_GetStringIdentifiers;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getintidentifier = _NPN_GetIntIdentifier;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->identifierisstring = _NPN_IdentifierIsString;
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->utf8fromidentifier = _NPN_UTF8FromIdentifier;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->intfromidentifier = _NPN_IntFromIdentifier;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->createobject = _NPN_CreateObject;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->retainobject = _NPN_RetainObject;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->releaseobject = _NPN_ReleaseObject;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->invoke = _NPN_Invoke;
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->invokeDefault = _NPN_InvokeDefault;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->evaluate = _NPN_Evaluate;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->getproperty = _NPN_GetProperty;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->setproperty = _NPN_SetProperty;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->removeproperty = _NPN_RemoveProperty;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->hasproperty = _NPN_HasProperty;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->hasmethod = _NPN_HasMethod;
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->setexception = _NPN_SetException;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    funcs->enumerate = _NPN_Enumerate;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginPackage::load()
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("tid:%d isActive:%d isLoaded:%d loadCount:%d\n",
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               gettid(),
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               m_freeLibraryTimer.isActive(),
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               m_isLoaded,
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               m_loadCount);
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_freeLibraryTimer.isActive()) {
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_module);
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_freeLibraryTimer.stop();
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (m_isLoaded) {
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_quirks.contains(PluginQuirkDontAllowMultipleInstances))
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_loadCount++;
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("Already loaded, count now %d\n", m_loadCount);
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
2091a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    } else {
2101a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        ASSERT(m_loadCount == 0);
2111a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        ASSERT(m_module == NULL);
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2131a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        PLUGIN_LOG("Loading \"%s\"\n", m_path.utf8().data());
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2151a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        // Open the library
2161a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        void *handle = dlopen(m_path.utf8().data(), RTLD_NOW);
2171a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        if(!handle) {
2181a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott            PLUGIN_LOG("Couldn't load plugin library \"%s\": %s\n",
2191a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott                       m_path.utf8().data(), dlerror());
2201a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott            return false;
2211a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        }
2221a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        m_module = handle;
2231a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        PLUGIN_LOG("Fetch Info Loaded %p\n", m_module);
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2251a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This object will call dlclose() and set m_module to NULL
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when going out of scope.
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DynamicLibraryCloser dlCloser(&m_module);
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NP_InitializeFuncPtr NP_Initialize;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(!getEntryPoint(m_module, "NP_Initialize", (void **) &NP_Initialize) ||
2331a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott            !getEntryPoint(m_module, "NP_Shutdown", (void **) &m_NPP_Shutdown)) {
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("Couldn't find Initialize function\n");
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
237d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Provide the plugin with our browser function table and grab its
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // plugin table. Provide the Java environment and the Plugin which
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // can be used to override the defaults if the plugin wants.
2415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    initializeBrowserFuncs();
242d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed    // call this afterwards, which may re-initialize some methods, but ensures
243d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed    // that any additional (or changed) procs are set. There is no real attempt
244d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed    // to have this step be minimal (i.e. only what we add/override), since the
245d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed    // core version (initializeBrowserFuncs) can change in the future.
246d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed    initializeExtraBrowserFuncs(&m_browserFuncs);
247d04b8c72551b49cbd8443eaf0211c68ec27bf635Mike Reed
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_pluginFuncs.size = sizeof(m_pluginFuncs);
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(NP_Initialize(&m_browserFuncs,
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                     &m_pluginFuncs,
2520901873a159d5b57e194ccb92bc8521cb24e570dDerek Sollenberger                     JSC::Bindings::getJNIEnv()) != NPERR_NO_ERROR) {
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("Couldn't initialize plugin\n");
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't close the library - loaded OK.
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    dlCloser.ok();
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_isLoaded = true;
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ++m_loadCount;
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("Initial load ok, count now %d\n", m_loadCount);
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginPackage::fetchInfo()
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("Fetch Info Loading \"%s\"\n", m_path.utf8().data());
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Open the library
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void *handle = dlopen(m_path.utf8().data(), RTLD_NOW);
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(!handle) {
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("Couldn't load plugin library \"%s\": %s\n",
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                   m_path.utf8().data(), dlerror());
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("Fetch Info Loaded %p\n", handle);
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This object will call dlclose() and set m_module to NULL
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when going out of scope.
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DynamicLibraryCloser dlCloser(&handle);
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the three entry points we need for Linux Netscape Plug-ins
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NP_GetMIMEDescriptionFuncPtr NP_GetMIMEDescription;
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPP_GetValueProcPtr NP_GetValue;
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(!getEntryPoint(handle, "NP_GetMIMEDescription",
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (void **) &NP_GetMIMEDescription) ||
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            !getEntryPoint(handle, "NP_GetValue", (void **) &NP_GetValue)) {
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If any of those failed to resolve, fail the entire load
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the plugin name and description using NP_GetValue
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char *name;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char *description;
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(NP_GetValue(NULL, NPPVpluginNameString, &name) != NPERR_NO_ERROR ||
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NP_GetValue(NULL, NPPVpluginDescriptionString, &description) !=
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NPERR_NO_ERROR) {
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("Couldn't get name/description using NP_GetValue\n");
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("Plugin name: \"%s\"\n", name);
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("Plugin description: \"%s\"\n", description);
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_name = name;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_description = description;
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // fileName is just the trailing part of the path
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int last_slash = m_path.reverseFind('/');
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(last_slash < 0)
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fileName = m_path;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fileName = m_path.substring(last_slash + 1);
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Grab the MIME description. This is in the format, e.g:
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // application/x-somescriptformat:ssf:Some Script Format
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String mimeDescription(NP_GetMIMEDescription());
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("MIME description: \"%s\"\n", mimeDescription.utf8().data());
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clear out the current mappings.
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_mimeToDescriptions.clear();
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_mimeToExtensions.clear();
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Split the description into its component entries, separated by
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // semicolons.
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<String> mimeEntries;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mimeDescription.split(';', true, mimeEntries);
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Iterate through the entries, adding them to the MIME mappings.
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for(Vector<String>::const_iterator it = mimeEntries.begin();
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it != mimeEntries.end(); ++it) {
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Each part is split into 3 fields separated by colons
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Field 1 is the MIME type (e.g "application/x-shockwave-flash").
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Field 2 is a comma separated list of file extensions.
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Field 3 is a human readable short description.
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String &mimeEntry = *it;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Vector<String> fields;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mimeEntry.split(':', true, fields);
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if(fields.size() != 3) {
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PLUGIN_LOG("Bad MIME entry \"%s\"\n", mimeEntry.utf8().data());
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& mimeType = fields[0];
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Vector<String> extensions;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fields[1].split(',', true, extensions);
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& description = fields[2];
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        determineQuirks(mimeType);
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("mime_type: \"%s\"\n", mimeType.utf8().data());
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("extensions: \"%s\"\n", fields[1].utf8().data());
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PLUGIN_LOG("description: \"%s\"\n", description.utf8().data());
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Map the mime type to the vector of extensions and the description
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if(!extensions.isEmpty())
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_mimeToExtensions.set(mimeType, extensions);
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if(!description.isEmpty())
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_mimeToDescriptions.set(mimeType, description);
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PLUGIN_LOG("Fetch Info Loaded plugin details ok \"%s\"\n",
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_path.utf8().data());
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If this plugin needs to be kept in memory, unload the module now
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and load it permanently.
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_quirks.contains(PluginQuirkDontUnloadPlugin)) {
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dlCloser.ok();
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dlclose(handle);
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        load();
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // dlCloser will unload the plugin if required.
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned PluginPackage::hash() const
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const unsigned hashCodes[] = {
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_name.impl()->hash(),
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_description.impl()->hash(),
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_mimeToExtensions.size(),
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
381b999e45add23dd4039ec66ff24acd14b85470657Steve Block    return StringHasher::computeHash(reinterpret_cast<const UChar*>(hashCodes), sizeof(hashCodes) / sizeof(UChar));
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginPackage::equal(const PluginPackage& a, const PluginPackage& b)
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a.m_name != b.m_name)
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a.m_description != b.m_description)
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a.m_mimeToExtensions.size() != b.m_mimeToExtensions.size())
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MIMEToExtensionsMap::const_iterator::Keys end =
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            a.m_mimeToExtensions.end().keys();
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (MIMEToExtensionsMap::const_iterator::Keys it =
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                 a.m_mimeToExtensions.begin().keys();
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         it != end;
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         ++it) {
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!b.m_mimeToExtensions.contains(*it)) {
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
409c02eba192362e2ea83fdfbe0be51a08429ec4123Ben Murdochuint16_t PluginPackage::NPVersion() const
410af051345af6893a284d0ce367aa92a6d8a977f38Steve Block{
411af051345af6893a284d0ce367aa92a6d8a977f38Steve Block    return NP_VERSION_MINOR;
412af051345af6893a284d0ce367aa92a6d8a977f38Steve Block}
413af051345af6893a284d0ce367aa92a6d8a977f38Steve Block
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
417