summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/Shared/Plugins
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/Shared/Plugins')
-rw-r--r--Source/WebKit2/Shared/Plugins/NPIdentifierData.cpp2
-rw-r--r--Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp2
-rw-r--r--Source/WebKit2/Shared/Plugins/NPVariantData.cpp2
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp115
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h20
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm1
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp28
-rw-r--r--Source/WebKit2/Shared/Plugins/PluginQuirks.h10
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
};