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