summaryrefslogtreecommitdiffstats
path: root/WebCore/plugins/android/PluginPackageAndroid.cpp
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:15 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:15 -0800
commit1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch)
tree4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/plugins/android/PluginPackageAndroid.cpp
parent9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff)
downloadexternal_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.zip
external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.gz
external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.bz2
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'WebCore/plugins/android/PluginPackageAndroid.cpp')
-rw-r--r--WebCore/plugins/android/PluginPackageAndroid.cpp504
1 files changed, 0 insertions, 504 deletions
diff --git a/WebCore/plugins/android/PluginPackageAndroid.cpp b/WebCore/plugins/android/PluginPackageAndroid.cpp
deleted file mode 100644
index b8dca9a..0000000
--- a/WebCore/plugins/android/PluginPackageAndroid.cpp
+++ /dev/null
@@ -1,504 +0,0 @@
-#ifdef ANDROID_PLUGINS
-
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "WebCoreJni.h"
-#include "PluginPackageAndroid.h"
-#include "PluginDatabaseAndroid.h"
-
-#include "Timer.h"
-#include "DeprecatedString.h"
-#include "PlatformString.h"
-#include "CString.h"
-#include "npruntime_impl.h"
-
-#include <dlfcn.h>
-#include <errno.h>
-
-#include "PluginDebug.h"
-
-namespace WebCore {
-
-PluginPackageAndroid::PluginPackageAndroid(const String& path,
- uint32 lastModified)
- : m_path(path),
- m_name(),
- m_fileName(),
- m_description(),
- m_lastModified(lastModified),
- m_pluginFuncs(),
- m_mimeToDescriptions(),
- m_mimeToExtensions(),
- m_env(0),
- m_pluginObject(0),
- m_libraryHandle(NULL),
- m_libraryInitialized(false),
- m_NP_Initialize((NP_InitializeFuncPtr) NULL),
- m_NP_Shutdown((NP_ShutdownFuncPtr) NULL),
- m_NP_GetMIMEDescription((NP_GetMIMEDescriptionFuncPtr) NULL),
- m_NP_GetValue((NP_GetValueFuncPtr) NULL)
-{
- PLUGIN_LOG("Constructing PluginPackageAndroid\n");
- if(android::WebCoreJni::getJavaVM()->GetEnv((void**) &m_env,
- JNI_VERSION_1_4) != JNI_OK) {
- PLUGIN_LOG("GetEnv failed!");
- }
-}
-
-PluginPackageAndroid::~PluginPackageAndroid()
-{
- PLUGIN_LOG("Destructing PluginPackageAndroid\n");
- unload();
-}
-
-void PluginPackageAndroid::initializeBrowserFuncs()
-{
- // Initialize the NPN function pointers that we hand over to the
- // plugin.
-
- memset(&m_browserFuncs, 0, sizeof(m_browserFuncs));
-
- m_browserFuncs.size = sizeof(m_browserFuncs);
- m_browserFuncs.version = NP_VERSION_MINOR;
- m_browserFuncs.geturl = NPN_GetURL;
- m_browserFuncs.posturl = NPN_PostURL;
- m_browserFuncs.requestread = NPN_RequestRead;
- m_browserFuncs.newstream = NPN_NewStream;
- m_browserFuncs.write = NPN_Write;
- m_browserFuncs.destroystream = NPN_DestroyStream;
- m_browserFuncs.status = NPN_Status;
- m_browserFuncs.uagent = NPN_UserAgent;
- m_browserFuncs.memalloc = NPN_MemAlloc;
- m_browserFuncs.memfree = NPN_MemFree;
- m_browserFuncs.memflush = NPN_MemFlush;
- m_browserFuncs.reloadplugins = NPN_ReloadPlugins;
- m_browserFuncs.geturlnotify = NPN_GetURLNotify;
- m_browserFuncs.posturlnotify = NPN_PostURLNotify;
- m_browserFuncs.getvalue = NPN_GetValue;
- m_browserFuncs.setvalue = NPN_SetValue;
- m_browserFuncs.invalidaterect = NPN_InvalidateRect;
- m_browserFuncs.invalidateregion = NPN_InvalidateRegion;
- m_browserFuncs.forceredraw = NPN_ForceRedraw;
- m_browserFuncs.getJavaEnv = NPN_GetJavaEnv;
- m_browserFuncs.getJavaPeer = NPN_GetJavaPeer;
- m_browserFuncs.pushpopupsenabledstate = NPN_PushPopupsEnabledState;
- m_browserFuncs.poppopupsenabledstate = NPN_PopPopupsEnabledState;
- m_browserFuncs.pluginthreadasynccall = NPN_PluginThreadAsyncCall;
-
- m_browserFuncs.releasevariantvalue = _NPN_ReleaseVariantValue;
- m_browserFuncs.getstringidentifier = _NPN_GetStringIdentifier;
- m_browserFuncs.getstringidentifiers = _NPN_GetStringIdentifiers;
- m_browserFuncs.getintidentifier = _NPN_GetIntIdentifier;
- m_browserFuncs.identifierisstring = _NPN_IdentifierIsString;
- m_browserFuncs.utf8fromidentifier = _NPN_UTF8FromIdentifier;
- m_browserFuncs.intfromidentifier = _NPN_IntFromIdentifier;
- m_browserFuncs.createobject = _NPN_CreateObject;
- m_browserFuncs.retainobject = _NPN_RetainObject;
- m_browserFuncs.releaseobject = _NPN_ReleaseObject;
- m_browserFuncs.invoke = _NPN_Invoke;
- m_browserFuncs.invokeDefault = _NPN_InvokeDefault;
- m_browserFuncs.evaluate = _NPN_Evaluate;
- m_browserFuncs.getproperty = _NPN_GetProperty;
- m_browserFuncs.setproperty = _NPN_SetProperty;
- m_browserFuncs.removeproperty = _NPN_RemoveProperty;
- m_browserFuncs.hasproperty = _NPN_HasProperty;
- m_browserFuncs.hasmethod = _NPN_HasMethod;
- m_browserFuncs.setexception = _NPN_SetException;
- m_browserFuncs.enumerate = _NPN_Enumerate;
-}
-
-jobject PluginPackageAndroid::createPluginObject(const char *name,
- const char *path,
- const char *fileName,
- const char *description)
-{
- // Create a Java "class Plugin" object instance
- jclass pluginClass = m_env->FindClass("android/webkit/Plugin");
- if(!pluginClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.Plugin\n");
- return 0;
- }
- // Get Plugin(String, String, String, String, Context)
- jmethodID pluginConstructor = m_env->GetMethodID(
- pluginClass,
- "<init>",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
- if(!pluginConstructor) {
- PLUGIN_LOG("Couldn't get android.webkit.Plugin constructor\n");
- return 0;
- }
- // Make Java strings of name, path, fileName, description
- jstring javaName = m_env->NewStringUTF(name);
- jstring javaPath = m_env->NewStringUTF(m_path.utf8().data());
- jstring javaFileName = m_env->NewStringUTF(m_fileName.utf8().data());
- jstring javaDescription = m_env->NewStringUTF(description);
- // Make a plugin instance
- jobject pluginObject = m_env->NewObject(pluginClass,
- pluginConstructor,
- javaName,
- javaPath,
- javaFileName,
- javaDescription);
- return pluginObject;
-}
-
-jobject PluginPackageAndroid::getPluginListObject()
-{
- // Get WebView.getPluginList()
- jclass webViewClass = m_env->FindClass("android/webkit/WebView");
- if(!webViewClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.WebView\n");
- return 0;
- }
- jmethodID getPluginList = m_env->GetStaticMethodID(
- webViewClass,
- "getPluginList",
- "()Landroid/webkit/PluginList;");
- if(!getPluginList) {
- PLUGIN_LOG("Couldn't find android.webkit.WebView.getPluginList()\n");
- return 0;
- }
- // Get the PluginList instance
- jobject pluginListObject = m_env->CallStaticObjectMethod(webViewClass,
- getPluginList);
- if(!pluginListObject) {
- PLUGIN_LOG("Couldn't get PluginList object\n");
- return 0;
- }
- return pluginListObject;
-}
-
-bool PluginPackageAndroid::addPluginObjectToList(jobject pluginList,
- jobject plugin)
-{
- // Add the Plugin object
- jclass pluginListClass = m_env->FindClass("android/webkit/PluginList");
- if(!pluginListClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.PluginList\n");
- return false;
- }
- jmethodID addPlugin = m_env->GetMethodID(
- pluginListClass,
- "addPlugin",
- "(Landroid/webkit/Plugin;)V");
- if(!addPlugin) {
- PLUGIN_LOG("Couldn't find android.webkit.PluginList.addPlugin()\n");
- return false;
- }
- m_env->CallVoidMethod(pluginList,
- addPlugin,
- plugin);
- return true;
-}
-
-void PluginPackageAndroid::removePluginObjectFromList(jobject pluginList,
- jobject plugin)
-{
- // Remove the Plugin object
- jclass pluginListClass = m_env->FindClass("android/webkit/PluginList");
- if(!pluginListClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.PluginList\n");
- return;
- }
- jmethodID removePlugin = m_env->GetMethodID(
- pluginListClass,
- "removePlugin",
- "(Landroid/webkit/Plugin;)V");
- if(!removePlugin) {
- PLUGIN_LOG("Couldn't find android.webkit.PluginList.removePlugin()\n");
- return;
- }
- m_env->CallVoidMethod(pluginList,
- removePlugin,
- plugin);
-}
-
-bool PluginPackageAndroid::load()
-{
- if(m_libraryHandle) {
- PLUGIN_LOG("Plugin \"%s\" already loaded\n", m_path.utf8().data());
- return true;
- }
-
- PLUGIN_LOG("Loading \"%s\"\n", m_path.utf8().data());
-
- // Open the library
- void *handle = dlopen(m_path.utf8().data(), RTLD_NOW);
- if(!handle) {
- PLUGIN_LOG("Couldn't load plugin library \"%s\": %s\n",
- m_path.utf8().data(), dlerror());
- return false;
- }
- m_libraryHandle = handle;
- // This object will call dlclose() and set m_libraryHandle to NULL
- // when going out of scope.
- DynamicLibraryCloser dlCloser(this);
-
- // Get the four entry points we need for Linux Netscape Plug-ins
- if(!getEntryPoint("NP_Initialize", (void **) &m_NP_Initialize) ||
- !getEntryPoint("NP_Shutdown", (void **) &m_NP_Shutdown) ||
- !getEntryPoint("NP_GetMIMEDescription",
- (void **) &m_NP_GetMIMEDescription) ||
- !getEntryPoint("NP_GetValue", (void **) &m_NP_GetValue)) {
- // If any of those failed to resolve, fail the entire load
- return false;
- }
-
- // Get the plugin name and description using NP_GetValue
- const char *name;
- const char *description;
- if(m_NP_GetValue(NULL, NPPVpluginNameString,
- &name) != NPERR_NO_ERROR ||
- m_NP_GetValue(NULL, NPPVpluginDescriptionString,
- &description) != NPERR_NO_ERROR) {
- PLUGIN_LOG("Couldn't get name/description using NP_GetValue\n");
- return false;
- }
-
- PLUGIN_LOG("Plugin name: \"%s\"\n", name);
- PLUGIN_LOG("Plugin description: \"%s\"\n", description);
- m_name = name;
- m_description = description;
-
- // fileName is just the trailing part of the path
- int last_slash = m_path.reverseFind('/');
- if(last_slash < 0)
- m_fileName = m_path;
- else
- m_fileName = m_path.substring(last_slash + 1);
-
- // Grab the MIME description. This is in the format, e.g:
- // application/x-somescriptformat:ssf:Some Script Format
- const char *mime_description = m_NP_GetMIMEDescription();
- if(!initializeMIMEDescription(mime_description)) {
- PLUGIN_LOG("Bad MIME description: \"%s\"\n",
- mime_description);
- return false;
- }
-
- // Create a new Java Plugin object.
- jobject pluginObject = createPluginObject(name,
- m_path.utf8().data(),
- m_fileName.utf8().data(),
- description);
- if(!pluginObject) {
- PLUGIN_LOG("Couldn't create Java Plugin\n");
- return false;
- }
-
- // Provide the plugin with our browser function table and grab its
- // plugin table. Provide the Java environment and the Plugin which
- // can be used to override the defaults if the plugin wants.
- initializeBrowserFuncs();
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
- if(m_NP_Initialize(&m_browserFuncs,
- &m_pluginFuncs,
- m_env,
- pluginObject) != NPERR_NO_ERROR) {
- PLUGIN_LOG("Couldn't initialize plugin\n");
- return false;
- }
-
- // Add the Plugin to the PluginList
- jobject pluginListObject = getPluginListObject();
- if(!pluginListObject) {
- PLUGIN_LOG("Couldn't get PluginList object\n");
- m_NP_Shutdown();
- return false;
- }
- if(!addPluginObjectToList(pluginListObject, pluginObject)) {
- PLUGIN_LOG("Couldn't add Plugin to PluginList\n");
- m_NP_Shutdown();
- return false;
- }
-
- // Retain the Java Plugin object
- m_pluginObject = m_env->NewGlobalRef(pluginObject);
-
- // Need to call NP_Shutdown at some point in the future.
- m_libraryInitialized = true;
-
- // Don't close the library - loaded OK.
- dlCloser.ok();
- // Retain the handle so we can close it in the future.
- m_libraryHandle = handle;
-
- PLUGIN_LOG("Loaded OK\n");
- return true;
-}
-
-void PluginPackageAndroid::unload()
-{
- if(!m_libraryHandle) {
- PLUGIN_LOG("Plugin \"%s\" already unloaded\n", m_path.utf8().data());
- return; // No library loaded
- }
- PLUGIN_LOG("Unloading \"%s\"\n", m_path.utf8().data());
-
- if(m_libraryInitialized) {
- // Shutdown the plug-in
- ASSERT(m_NP_Shutdown != NULL);
- PLUGIN_LOG("Calling NP_Shutdown\n");
- NPError err = m_NP_Shutdown();
- if(err != NPERR_NO_ERROR)
- PLUGIN_LOG("Couldn't shutdown plug-in \"%s\"\n",
- m_path.utf8().data());
- m_libraryInitialized = false;
-
- // Remove the plugin from the PluginList
- if(m_pluginObject) {
- jobject pluginListObject = getPluginListObject();
- if(pluginListObject) {
- removePluginObjectFromList(pluginListObject, m_pluginObject);
- }
- // Remove a reference to the Plugin object so it can
- // garbage collect.
- m_env->DeleteGlobalRef(m_pluginObject);
- m_pluginObject = 0;
- }
- }
-
- PLUGIN_LOG("Closing library\n");
- dlclose(m_libraryHandle);
- m_libraryHandle = 0;
- memset(&m_browserFuncs, 0, sizeof(m_browserFuncs));
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_NP_Initialize = 0;
- m_NP_Shutdown = 0;
- m_NP_GetMIMEDescription = 0;
- m_NP_GetValue = 0;
-}
-
-const NPPluginFuncs* PluginPackageAndroid::pluginFuncs() const
-{
- ASSERT(m_libraryHandle && m_libraryInitialized);
- return &m_pluginFuncs;
-}
-
-PluginPackageAndroid* PluginPackageAndroid::createPackage(const String& path,
- uint32 lastModified)
-{
- PluginPackageAndroid* package = new PluginPackageAndroid(path,
- lastModified);
-
- if (!package->load()) {
- delete package;
- return 0;
- }
-
- return package;
-}
-
-bool PluginPackageAndroid::getEntryPoint(const char *name, void **entry_point)
-{
- dlerror();
- *entry_point = dlsym(m_libraryHandle, name);
- const char *error = dlerror();
- if(error == NULL && *entry_point != NULL) {
- return true;
- } else {
- PLUGIN_LOG("Couldn't get entry point \"%s\": %s\n",
- name, error);
- return false;
- }
-}
-
-bool PluginPackageAndroid::initializeMIMEEntry(const String& mimeEntry)
-{
- // Each part is split into 3 fields separated by colons
- // Field 1 is the MIME type (e.g "application/x-shockwave-flash").
- // Field 2 is a comma separated list of file extensions.
- // Field 3 is a human readable short description.
- Vector<String> fields = mimeEntry.split(':', true);
- if(fields.size() != 3)
- return false;
-
- const String& mimeType = fields[0];
- Vector<String> extensions = fields[1].split(',', true);
- const String& description = fields[2];
-
- PLUGIN_LOG("mime_type: \"%s\"\n",
- mimeType.utf8().data());
- PLUGIN_LOG("extensions: \"%s\"\n",
- fields[1].utf8().data());
- PLUGIN_LOG("description: \"%s\"\n",
- description.utf8().data());
-
- // Map the mime type to the vector of extensions and the description
- if(!extensions.isEmpty())
- m_mimeToExtensions.set(mimeType, extensions);
- if(!description.isEmpty())
- m_mimeToDescriptions.set(mimeType, description);
-
- return true;
-}
-
-bool PluginPackageAndroid::initializeMIMEDescription(
- const String& mimeDescription)
-{
- PLUGIN_LOG("MIME description: \"%s\"\n", mimeDescription.utf8().data());
-
- // Clear out the current mappings.
- m_mimeToDescriptions.clear();
- m_mimeToExtensions.clear();
-
- // Split the description into its component entries, separated by
- // semicolons.
- Vector<String> mimeEntries = mimeDescription.split(';', true);
-
- // Iterate through the entries, adding them to the MIME mappings.
- for(Vector<String>::const_iterator it = mimeEntries.begin();
- it != mimeEntries.end(); ++it) {
- if(!initializeMIMEEntry(*it)) {
- PLUGIN_LOG("Bad MIME entry: \"%s\"\n", it->utf8().data());
- m_mimeToDescriptions.clear();
- m_mimeToExtensions.clear();
- return false;
- }
- }
-
- return true;
-}
-
-PluginPackageAndroid::DynamicLibraryCloser::~DynamicLibraryCloser()
-{
- // Close the PluginPackageAndroid's library
- if(m_package)
- {
- if(m_package->m_libraryHandle)
- {
- dlclose(m_package->m_libraryHandle);
- m_package->m_libraryHandle = NULL;
- }
- m_package = NULL;
- }
-}
-
-} // namespace WebCore
-
-#endif