165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NetscapePluginModule.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Module.h" 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "NPRuntimeUtilities.h" 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NetscapeBrowserFuncs.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassOwnPtr.h> 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/text/CString.h> 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic Vector<NetscapePluginModule*>& initializedNetscapePluginModules() 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DEFINE_STATIC_LOCAL(Vector<NetscapePluginModule*>, initializedNetscapePluginModules, ()); 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return initializedNetscapePluginModules; 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNetscapePluginModule::NetscapePluginModule(const String& pluginPath) 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_pluginPath(pluginPath) 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_isInitialized(false) 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_loadCount(0) 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_shutdownProcPtr(0) 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_pluginFuncs() 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNetscapePluginModule::~NetscapePluginModule() 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(initializedNetscapePluginModules().find(this) == notFound); 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochVector<String> NetscapePluginModule::sitesWithData() 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Vector<String> sites; 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch incrementLoadCount(); 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch tryGetSitesWithData(sites); 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch decrementLoadCount(); 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return sites; 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool NetscapePluginModule::clearSiteData(const String& site, uint64_t flags, uint64_t maxAge) 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch incrementLoadCount(); 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool result = tryClearSiteData(site, flags, maxAge); 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch decrementLoadCount(); 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return result; 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool NetscapePluginModule::tryGetSitesWithData(Vector<String>& sites) 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_isInitialized) 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Check if the plug-in supports NPP_GetSitesWithData. 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_pluginFuncs.getsiteswithdata) 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch char** siteArray = m_pluginFuncs.getsiteswithdata(); 872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // There were no sites with data. 892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!siteArray) 902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (int i = 0; siteArray[i]; ++i) { 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch char* site = siteArray[i]; 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String siteString = String::fromUTF8(site); 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!siteString.isNull()) 9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch sites.append(siteString); 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch npnMemFree(site); 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch npnMemFree(siteArray); 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return true; 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool NetscapePluginModule::tryClearSiteData(const String& site, uint64_t flags, uint64_t maxAge) 10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_isInitialized) 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Check if the plug-in supports NPP_ClearSiteData. 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_pluginFuncs.clearsitedata) 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CString siteString; 11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!site.isNull()) 11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch siteString = site.utf8(); 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return m_pluginFuncs.clearsitedata(siteString.data(), flags, maxAge) == NPERR_NO_ERROR; 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePluginModule::shutdown() 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_isInitialized); 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_shutdownProcPtr(); 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isInitialized = false; 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t pluginModuleIndex = initializedNetscapePluginModules().find(this); 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(pluginModuleIndex != notFound); 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch initializedNetscapePluginModules().remove(pluginModuleIndex); 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<NetscapePluginModule> NetscapePluginModule::getOrCreate(const String& pluginPath) 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // First, see if we already have a module with this plug-in path. 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < initializedNetscapePluginModules().size(); ++i) { 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NetscapePluginModule* pluginModule = initializedNetscapePluginModules()[i]; 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (pluginModule->m_pluginPath == pluginPath) 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return pluginModule; 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<NetscapePluginModule> pluginModule(adoptRef(new NetscapePluginModule(pluginPath))); 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Try to load and initialize the plug-in module. 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!pluginModule->load()) 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return pluginModule.release(); 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid NetscapePluginModule::incrementLoadCount() 15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 15781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_loadCount) { 15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Load the plug-in module if necessary. 15981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch load(); 16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 16281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_loadCount++; 16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 16581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid NetscapePluginModule::decrementLoadCount() 16681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 16781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(m_loadCount > 0); 16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_loadCount--; 16981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 17081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_loadCount) { 17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shutdown(); 17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unload(); 17381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 17481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 17581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePluginModule::load() 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_isInitialized) { 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(initializedNetscapePluginModules().find(this) != notFound); 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!tryLoad()) { 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unload(); 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isInitialized = true; 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(initializedNetscapePluginModules().find(this) == notFound); 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch initializedNetscapePluginModules().append(this); 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch determineQuirks(); 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePluginModule::tryLoad() 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLUGIN_ARCHITECTURE(X11) 20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch applyX11QuirksBeforeLoad(); 20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_module = adoptPtr(new Module(m_pluginPath)); 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_module->load()) 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NP_InitializeFuncPtr initializeFuncPtr = m_module->functionPointer<NP_InitializeFuncPtr>("NP_Initialize"); 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!initializeFuncPtr) 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if !PLUGIN_ARCHITECTURE(X11) 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NP_GetEntryPointsFuncPtr getEntryPointsFuncPtr = m_module->functionPointer<NP_GetEntryPointsFuncPtr>("NP_GetEntryPoints"); 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!getEntryPointsFuncPtr) 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 21681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_shutdownProcPtr = m_module->functionPointer<NPP_ShutdownProcPtr>("NP_Shutdown"); 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_shutdownProcPtr) 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginFuncs.size = sizeof(NPPluginFuncs); 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginFuncs.version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR; 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // On Mac, NP_Initialize must be called first, then NP_GetEntryPoints. On Windows, the order is 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // reversed. Failing to follow this order results in crashes (e.g., in Silverlight on Mac and 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // in Flash and QuickTime on Windows). 22881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLUGIN_ARCHITECTURE(MAC) 2292bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifndef NP_NO_CARBON 2302bde8e466a4451c7319e3a072d118917957d6554Steve Block // Plugins (at least QT) require that you call UseResFile on the resource file before loading it. 2312bde8e466a4451c7319e3a072d118917957d6554Steve Block ResFileRefNum currentResourceFile = CurResFile(); 2322bde8e466a4451c7319e3a072d118917957d6554Steve Block 2332bde8e466a4451c7319e3a072d118917957d6554Steve Block ResFileRefNum pluginResourceFile = m_module->bundleResourceMap(); 2342bde8e466a4451c7319e3a072d118917957d6554Steve Block UseResFile(pluginResourceFile); 2352bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 2362bde8e466a4451c7319e3a072d118917957d6554Steve Block bool result = initializeFuncPtr(netscapeBrowserFuncs()) == NPERR_NO_ERROR && getEntryPointsFuncPtr(&m_pluginFuncs) == NPERR_NO_ERROR; 2372bde8e466a4451c7319e3a072d118917957d6554Steve Block 2382bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifndef NP_NO_CARBON 2392bde8e466a4451c7319e3a072d118917957d6554Steve Block // Restore the resource file. 2402bde8e466a4451c7319e3a072d118917957d6554Steve Block UseResFile(currentResourceFile); 2412bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 2422bde8e466a4451c7319e3a072d118917957d6554Steve Block 2432bde8e466a4451c7319e3a072d118917957d6554Steve Block return result; 24481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#elif PLUGIN_ARCHITECTURE(WIN) 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (getEntryPointsFuncPtr(&m_pluginFuncs) != NPERR_NO_ERROR || initializeFuncPtr(netscapeBrowserFuncs()) != NPERR_NO_ERROR) 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 24781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#elif PLUGIN_ARCHITECTURE(X11) 24881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (initializeFuncPtr(netscapeBrowserFuncs(), &m_pluginFuncs) != NPERR_NO_ERROR) 24981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return false; 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePluginModule::unload() 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_isInitialized); 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_module = 0; 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 264