diff options
author | Ben Murdoch <benm@google.com> | 2011-05-24 11:24:40 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-06-02 09:53:15 +0100 |
commit | 81bc750723a18f21cd17d1b173cd2a4dda9cea6e (patch) | |
tree | 7a9e5ed86ff429fd347a25153107221543909b19 /Source/WebKit2/Shared/Plugins/Netscape | |
parent | 94088a6d336c1dd80a1e734af51e96abcbb689a7 (diff) | |
download | external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.zip external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.gz external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.bz2 |
Merge WebKit at r80534: Intial merge by Git
Change-Id: Ia7a83357124c9e1cdb1debf55d9661ec0bd09a61
Diffstat (limited to 'Source/WebKit2/Shared/Plugins/Netscape')
4 files changed, 147 insertions, 17 deletions
diff --git a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp index a1f0833..7bbdaa8 100644 --- a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp +++ b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp @@ -27,8 +27,14 @@ #include "NetscapePluginModule.h" #include "Module.h" +#include "NPRuntimeUtilities.h" #include "NetscapeBrowserFuncs.h" #include <wtf/PassOwnPtr.h> +#include <wtf/text/CString.h> + +#if !PLUGIN_ARCHITECTURE(MAC) && !PLUGIN_ARCHITECTURE(WIN) && !PLUGIN_ARCHITECTURE(X11) +#error Unknown plug-in architecture +#endif namespace WebKit { @@ -41,7 +47,7 @@ static Vector<NetscapePluginModule*>& initializedNetscapePluginModules() NetscapePluginModule::NetscapePluginModule(const String& pluginPath) : m_pluginPath(pluginPath) , m_isInitialized(false) - , m_pluginCount(0) + , m_loadCount(0) , m_shutdownProcPtr(0) , m_pluginFuncs() { @@ -54,23 +60,72 @@ NetscapePluginModule::~NetscapePluginModule() void NetscapePluginModule::pluginCreated() { - if (!m_pluginCount) { - // Load the plug-in module if necessary. - load(); - } - - m_pluginCount++; + incrementLoadCount(); } void NetscapePluginModule::pluginDestroyed() { - ASSERT(m_pluginCount > 0); - m_pluginCount--; - - if (!m_pluginCount) { - shutdown(); - unload(); + decrementLoadCount(); +} + +Vector<String> NetscapePluginModule::sitesWithData() +{ + Vector<String> sites; + + incrementLoadCount(); + tryGetSitesWithData(sites); + decrementLoadCount(); + + return sites; +} + +bool NetscapePluginModule::clearSiteData(const String& site, uint64_t flags, uint64_t maxAge) +{ + incrementLoadCount(); + bool result = tryClearSiteData(site, flags, maxAge); + decrementLoadCount(); + + return result; +} + +bool NetscapePluginModule::tryGetSitesWithData(Vector<String>& sites) +{ + if (!m_isInitialized) + return false; + + // Check if the plug-in supports NPP_GetSitesWithData. + if (!m_pluginFuncs.getsiteswithdata) + return false; + + char** siteArray = m_pluginFuncs.getsiteswithdata(); + for (int i = 0; siteArray[i]; ++i) { + char* site = siteArray[i]; + + String siteString = String::fromUTF8(site); + if (!siteString.isNull()) + sites.append(siteString); + + npnMemFree(site); } + + npnMemFree(siteArray); + return true; +} + +bool NetscapePluginModule::tryClearSiteData(const String& site, uint64_t flags, uint64_t maxAge) +{ + if (!m_isInitialized) + return false; + + // Check if the plug-in supports NPP_ClearSiteData. + if (!m_pluginFuncs.clearsitedata) + return false; + + CString siteString; + if (!site.isNull()) + siteString = site.utf8(); + + return m_pluginFuncs.clearsitedata(siteString.data(), flags, maxAge) == NPERR_NO_ERROR; } void NetscapePluginModule::shutdown() @@ -106,6 +161,27 @@ PassRefPtr<NetscapePluginModule> NetscapePluginModule::getOrCreate(const String& return pluginModule.release(); } +void NetscapePluginModule::incrementLoadCount() +{ + if (!m_loadCount) { + // Load the plug-in module if necessary. + load(); + } + + m_loadCount++; +} + +void NetscapePluginModule::decrementLoadCount() +{ + ASSERT(m_loadCount > 0); + m_loadCount--; + + if (!m_loadCount) { + shutdown(); + unload(); + } +} + bool NetscapePluginModule::load() { if (m_isInitialized) { @@ -130,6 +206,10 @@ bool NetscapePluginModule::load() bool NetscapePluginModule::tryLoad() { +#if PLUGIN_ARCHITECTURE(X11) + applyX11QuirksBeforeLoad(); +#endif + m_module = adoptPtr(new Module(m_pluginPath)); if (!m_module->load()) return false; @@ -138,9 +218,11 @@ bool NetscapePluginModule::tryLoad() if (!initializeFuncPtr) return false; +#if !PLUGIN_ARCHITECTURE(X11) NP_GetEntryPointsFuncPtr getEntryPointsFuncPtr = m_module->functionPointer<NP_GetEntryPointsFuncPtr>("NP_GetEntryPoints"); if (!getEntryPointsFuncPtr) return false; +#endif m_shutdownProcPtr = m_module->functionPointer<NPP_ShutdownProcPtr>("NP_Shutdown"); if (!m_shutdownProcPtr) @@ -152,12 +234,15 @@ bool NetscapePluginModule::tryLoad() // On Mac, NP_Initialize must be called first, then NP_GetEntryPoints. On Windows, the order is // reversed. Failing to follow this order results in crashes (e.g., in Silverlight on Mac and // in Flash and QuickTime on Windows). -#if PLATFORM(MAC) +#if PLUGIN_ARCHITECTURE(MAC) if (initializeFuncPtr(netscapeBrowserFuncs()) != NPERR_NO_ERROR || getEntryPointsFuncPtr(&m_pluginFuncs) != NPERR_NO_ERROR) return false; -#elif PLATFORM(WIN) +#elif PLUGIN_ARCHITECTURE(WIN) if (getEntryPointsFuncPtr(&m_pluginFuncs) != NPERR_NO_ERROR || initializeFuncPtr(netscapeBrowserFuncs()) != NPERR_NO_ERROR) return false; +#elif PLUGIN_ARCHITECTURE(X11) + if (initializeFuncPtr(netscapeBrowserFuncs(), &m_pluginFuncs) != NPERR_NO_ERROR) + return false; #endif return true; diff --git a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h index a245b11..aee26bb 100644 --- a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h +++ b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h @@ -28,7 +28,7 @@ #include "Module.h" #include "PluginQuirks.h" -#include <WebCore/npfunctions.h> +#include <WebCore/npruntime_internal.h> #include <wtf/RefCounted.h> #include <wtf/text/WTFString.h> @@ -53,11 +53,27 @@ public: const PluginQuirks& pluginQuirks() const { return m_pluginQuirks; } + // Return a list of domains for which the plug-in has data stored. + Vector<String> sitesWithData(); + + // Request that the plug-in clear the site data. + bool clearSiteData(const String& site, uint64_t flags, uint64_t maxAge); + private: explicit NetscapePluginModule(const String& pluginPath); void determineQuirks(); +#if PLUGIN_ARCHITECTURE(X11) + void applyX11QuirksBeforeLoad(); +#endif + + void incrementLoadCount(); + void decrementLoadCount(); + + bool tryGetSitesWithData(Vector<String>&); + bool tryClearSiteData(const String& site, uint64_t flags, uint64_t maxAge); + bool tryLoad(); bool load(); void unload(); @@ -66,7 +82,7 @@ private: String m_pluginPath; bool m_isInitialized; - unsigned m_pluginCount; + unsigned m_loadCount; PluginQuirks m_pluginQuirks; diff --git a/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm b/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm index 544def3..accab46 100644 --- a/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm +++ b/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm @@ -333,6 +333,7 @@ void NetscapePluginModule::determineQuirks() if (plugin.bundleIdentifier == "com.macromedia.Flash Player.plugin") { // Flash requires that the return value of getprogname() be "WebKitPluginHost". m_pluginQuirks.add(PluginQuirks::PrognameShouldBeWebKitPluginHost); + m_pluginQuirks.add(PluginQuirks::SupportsSnapshotting); } } diff --git a/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp b/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp index a651d3b..b5e3aad 100644 --- a/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp +++ b/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp @@ -29,10 +29,38 @@ #include "PluginDatabase.h" #include "PluginPackage.h" +#if PLATFORM(QT) +#include <QLibrary> +#endif + using namespace WebCore; namespace WebKit { +#if PLATFORM(QT) +static void initializeGTK() +{ + QLibrary library("libgtk-x11-2.0.so.0"); + if (library.load()) { + typedef void *(*gtk_init_check_ptr)(int*, char***); + gtk_init_check_ptr gtkInitCheck = reinterpret_cast<gtk_init_check_ptr>(library.resolve("gtk_init_check")); + // NOTE: We're using gtk_init_check() since gtk_init() calls exit() on failure. + if (gtkInitCheck) + (void) gtkInitCheck(0, 0); + } +} +#endif + +void NetscapePluginModule::applyX11QuirksBeforeLoad() +{ +#if PLATFORM(QT) + if (m_pluginPath.contains("npwrapper") || m_pluginPath.contains("flashplayer")) { + initializeGTK(); + m_pluginQuirks.add(PluginQuirks::RequiresGTKToolKit); + } +#endif +} + bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginInfoStore::Plugin& plugin) { // We are loading the plugin here since it does not seem to be a standardized way to |