diff options
Diffstat (limited to 'Source/WebKit2/Shared/Plugins')
8 files changed, 158 insertions, 22 deletions
diff --git a/Source/WebKit2/Shared/Plugins/NPIdentifierData.cpp b/Source/WebKit2/Shared/Plugins/NPIdentifierData.cpp index eeb8914..6edf5a5 100644 --- a/Source/WebKit2/Shared/Plugins/NPIdentifierData.cpp +++ b/Source/WebKit2/Shared/Plugins/NPIdentifierData.cpp @@ -30,9 +30,9 @@ #include "ArgumentDecoder.h" #include "ArgumentEncoder.h" -#include "NotImplemented.h" #include "WebCoreArgumentCoders.h" #include <WebCore/IdentifierRep.h> +#include <WebCore/NotImplemented.h> using namespace WebCore; diff --git a/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp b/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp index bcf2a7c..0e164f1 100644 --- a/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp +++ b/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp @@ -32,7 +32,7 @@ #include "NPObjectProxy.h" #include "NPRuntimeUtilities.h" #include "NPVariantData.h" -#include "NotImplemented.h" +#include <WebCore/NotImplemented.h> #include <wtf/OwnPtr.h> namespace WebKit { diff --git a/Source/WebKit2/Shared/Plugins/NPVariantData.cpp b/Source/WebKit2/Shared/Plugins/NPVariantData.cpp index 5e4392b..f06d776 100644 --- a/Source/WebKit2/Shared/Plugins/NPVariantData.cpp +++ b/Source/WebKit2/Shared/Plugins/NPVariantData.cpp @@ -30,8 +30,8 @@ #include "ArgumentDecoder.h" #include "ArgumentEncoder.h" -#include "NotImplemented.h" #include "WebCoreArgumentCoders.h" +#include <WebCore/NotImplemented.h> namespace WebKit { 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 diff --git a/Source/WebKit2/Shared/Plugins/PluginQuirks.h b/Source/WebKit2/Shared/Plugins/PluginQuirks.h index 8dd3a74..9f8c1c4 100644 --- a/Source/WebKit2/Shared/Plugins/PluginQuirks.h +++ b/Source/WebKit2/Shared/Plugins/PluginQuirks.h @@ -32,12 +32,18 @@ class PluginQuirks { public: enum PluginQuirk { // Mac specific quirks: -#if PLATFORM(MAC) +#if PLUGIN_ARCHITECTURE(MAC) // The plug-in wants the call to getprogame() to return "WebKitPluginHost". // Adobe Flash Will not handle key down events otherwise. PrognameShouldBeWebKitPluginHost, + // Supports receiving a paint event, even when using CoreAnimation rendering. + SupportsSnapshotting, +#elif PLUGIN_ARCHITECTURE(X11) + // Flash and npwrapper ask the browser about which GTK version does it use + // and refuse to load and work if it is not GTK 2 so we need to fake it in + // NPN_GetValue even when it is a lie. + RequiresGTKToolKit, #endif - NumPluginQuirks }; |