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