summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/Shared/Plugins
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-25 19:08:45 +0100
committerSteve Block <steveblock@google.com>2011-06-08 13:51:31 +0100
commit2bde8e466a4451c7319e3a072d118917957d6554 (patch)
tree28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebKit2/Shared/Plugins
parent6939c99b71d9372d14a0c74a772108052e8c48c8 (diff)
downloadexternal_webkit-2bde8e466a4451c7319e3a072d118917957d6554.zip
external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.gz
external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.bz2
Merge WebKit at r82507: Initial merge by git
Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e
Diffstat (limited to 'Source/WebKit2/Shared/Plugins')
-rw-r--r--Source/WebKit2/Shared/Plugins/NPIdentifierData.h2
-rw-r--r--Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.cpp34
-rw-r--r--Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.h8
-rw-r--r--Source/WebKit2/Shared/Plugins/NPObjectProxy.cpp28
-rw-r--r--Source/WebKit2/Shared/Plugins/NPObjectProxy.h9
-rw-r--r--Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp57
-rw-r--r--Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.h16
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp27
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h9
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm61
-rw-r--r--Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp2
-rw-r--r--Source/WebKit2/Shared/Plugins/PluginQuirks.h17
12 files changed, 171 insertions, 99 deletions
diff --git a/Source/WebKit2/Shared/Plugins/NPIdentifierData.h b/Source/WebKit2/Shared/Plugins/NPIdentifierData.h
index dbe979e..1a7c772 100644
--- a/Source/WebKit2/Shared/Plugins/NPIdentifierData.h
+++ b/Source/WebKit2/Shared/Plugins/NPIdentifierData.h
@@ -28,7 +28,7 @@
#if ENABLE(PLUGIN_PROCESS)
-#include <WebCore/npruntime.h>
+#include <WebCore/npruntime_internal.h>
#include <wtf/text/CString.h>
namespace CoreIPC {
diff --git a/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.cpp b/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.cpp
index 2fd7244..46742af 100644
--- a/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.cpp
+++ b/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.cpp
@@ -33,21 +33,18 @@
#include "NPRuntimeUtilities.h"
#include "NPVariantData.h"
-// FIXME: This code shouldn't know about NPJSObject.
-#include "NPJSObject.h"
-
namespace WebKit {
-PassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject)
+PassOwnPtr<NPObjectMessageReceiver> NPObjectMessageReceiver::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject)
{
- return adoptPtr(new NPObjectMessageReceiver(npRemoteObjectMap, npObjectID, npObject));
+ return adoptPtr(new NPObjectMessageReceiver(npRemoteObjectMap, plugin, npObjectID, npObject));
}
-NPObjectMessageReceiver::NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject)
+NPObjectMessageReceiver::NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID, NPObject* npObject)
: m_npRemoteObjectMap(npRemoteObjectMap)
+ , m_plugin(plugin)
, m_npObjectID(npObjectID)
, m_npObject(npObject)
- , m_shouldReleaseObjectWhenInvalidating(!NPJSObject::isNPJSObject(npObject))
{
retainNPObject(m_npObject);
}
@@ -56,13 +53,6 @@ NPObjectMessageReceiver::~NPObjectMessageReceiver()
{
m_npRemoteObjectMap->unregisterNPObject(m_npObjectID);
- // If we're invalidating the remote object map, we don't always want to release the underlying NPObject.
- // One example of this is NPJSObjects in the Web process, which have already been deallocated by the plug-in view.
- // FIXME: This is not the ideal way to handle this. Maybe NPObjectMessageReceiver should be notified somehow when the underlying
- // NPObject is deallocated.
- if (m_npRemoteObjectMap->isInvalidating() && !m_shouldReleaseObjectWhenInvalidating)
- return;
-
releaseNPObject(m_npObject);
}
@@ -90,7 +80,7 @@ void NPObjectMessageReceiver::invoke(const NPIdentifierData& methodNameData, con
Vector<NPVariant> arguments;
for (size_t i = 0; i < argumentsData.size(); ++i)
- arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i]));
+ arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin));
NPVariant result;
VOID_TO_NPVARIANT(result);
@@ -98,7 +88,7 @@ void NPObjectMessageReceiver::invoke(const NPIdentifierData& methodNameData, con
returnValue = m_npObject->_class->invoke(m_npObject, methodNameData.createNPIdentifier(), arguments.data(), arguments.size(), &result);
if (returnValue) {
// Convert the NPVariant to an NPVariantData.
- resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result);
+ resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
}
// Release all arguments.
@@ -118,7 +108,7 @@ void NPObjectMessageReceiver::invokeDefault(const Vector<NPVariantData>& argumen
Vector<NPVariant> arguments;
for (size_t i = 0; i < argumentsData.size(); ++i)
- arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i]));
+ arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin));
NPVariant result;
VOID_TO_NPVARIANT(result);
@@ -126,7 +116,7 @@ void NPObjectMessageReceiver::invokeDefault(const Vector<NPVariantData>& argumen
returnValue = m_npObject->_class->invokeDefault(m_npObject, arguments.data(), arguments.size(), &result);
if (returnValue) {
// Convert the NPVariant to an NPVariantData.
- resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result);
+ resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
}
// Release all arguments.
@@ -160,7 +150,7 @@ void NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameDa
return;
// Convert the NPVariant to an NPVariantData.
- resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result);
+ resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
// And release the result.
releaseNPVariantValue(&result);
@@ -173,7 +163,7 @@ void NPObjectMessageReceiver::setProperty(const NPIdentifierData& propertyNameDa
return;
}
- NPVariant propertyValue = m_npRemoteObjectMap->npVariantDataToNPVariant(propertyValueData);
+ NPVariant propertyValue = m_npRemoteObjectMap->npVariantDataToNPVariant(propertyValueData, m_plugin);
// Set the property.
returnValue = m_npObject->_class->setProperty(m_npObject, propertyNameData.createNPIdentifier(), &propertyValue);
@@ -221,7 +211,7 @@ void NPObjectMessageReceiver::construct(const Vector<NPVariantData>& argumentsDa
Vector<NPVariant> arguments;
for (size_t i = 0; i < argumentsData.size(); ++i)
- arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i]));
+ arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin));
NPVariant result;
VOID_TO_NPVARIANT(result);
@@ -229,7 +219,7 @@ void NPObjectMessageReceiver::construct(const Vector<NPVariantData>& argumentsDa
returnValue = m_npObject->_class->construct(m_npObject, arguments.data(), arguments.size(), &result);
if (returnValue) {
// Convert the NPVariant to an NPVariantData.
- resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result);
+ resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin);
}
// Release all arguments.
diff --git a/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.h b/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.h
index cfb66e1..22352d2 100644
--- a/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.h
+++ b/Source/WebKit2/Shared/Plugins/NPObjectMessageReceiver.h
@@ -38,20 +38,22 @@ namespace WebKit {
class NPIdentifierData;
class NPRemoteObjectMap;
class NPVariantData;
+class Plugin;
class NPObjectMessageReceiver {
WTF_MAKE_NONCOPYABLE(NPObjectMessageReceiver);
public:
- static PassOwnPtr<NPObjectMessageReceiver> create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject);
+ static PassOwnPtr<NPObjectMessageReceiver> create(NPRemoteObjectMap*, Plugin*, uint64_t npObjectID, NPObject*);
~NPObjectMessageReceiver();
CoreIPC::SyncReplyMode didReceiveSyncNPObjectMessageReceiverMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
+ Plugin* plugin() const { return m_plugin; }
NPObject* npObject() const { return m_npObject; }
private:
- NPObjectMessageReceiver(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID, NPObject* npObject);
+ NPObjectMessageReceiver(NPRemoteObjectMap*, Plugin*, uint64_t npObjectID, NPObject*);
// Message handlers.
void deallocate();
@@ -66,9 +68,9 @@ private:
void construct(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData);
NPRemoteObjectMap* m_npRemoteObjectMap;
+ Plugin* m_plugin;
uint64_t m_npObjectID;
NPObject* m_npObject;
- bool m_shouldReleaseObjectWhenInvalidating;
};
} // namespace WebKit
diff --git a/Source/WebKit2/Shared/Plugins/NPObjectProxy.cpp b/Source/WebKit2/Shared/Plugins/NPObjectProxy.cpp
index 04a6e7d..61daa6c 100644
--- a/Source/WebKit2/Shared/Plugins/NPObjectProxy.cpp
+++ b/Source/WebKit2/Shared/Plugins/NPObjectProxy.cpp
@@ -38,16 +38,17 @@
namespace WebKit {
-NPObjectProxy* NPObjectProxy::create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID)
+NPObjectProxy* NPObjectProxy::create(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID)
{
NPObjectProxy* npObjectProxy = toNPObjectProxy(createNPObject(0, npClass()));
- npObjectProxy->initialize(npRemoteObjectMap, npObjectID);
+ npObjectProxy->initialize(npRemoteObjectMap, plugin, npObjectID);
return npObjectProxy;
}
NPObjectProxy::NPObjectProxy()
: m_npRemoteObjectMap(0)
+ , m_plugin(0)
, m_npObjectID(0)
{
}
@@ -69,19 +70,24 @@ bool NPObjectProxy::isNPObjectProxy(NPObject* npObject)
void NPObjectProxy::invalidate()
{
ASSERT(m_npRemoteObjectMap);
+ ASSERT(m_plugin);
m_npRemoteObjectMap = 0;
+ m_plugin = 0;
}
-void NPObjectProxy::initialize(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID)
+void NPObjectProxy::initialize(NPRemoteObjectMap* npRemoteObjectMap, Plugin* plugin, uint64_t npObjectID)
{
ASSERT(!m_npRemoteObjectMap);
+ ASSERT(!m_plugin);
ASSERT(!m_npObjectID);
ASSERT(npRemoteObjectMap);
+ ASSERT(plugin);
ASSERT(npObjectID);
m_npRemoteObjectMap = npRemoteObjectMap;
+ m_plugin = plugin;
m_npObjectID = npObjectID;
}
@@ -108,7 +114,7 @@ bool NPObjectProxy::invoke(NPIdentifier methodName, const NPVariant* arguments,
NPIdentifierData methodNameData = NPIdentifierData::fromNPIdentifier(methodName);
Vector<NPVariantData> argumentsData;
for (uint32_t i = 0; i < argumentCount; ++i)
- argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i]));
+ argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
bool returnValue = false;
NPVariantData resultData;
@@ -119,7 +125,7 @@ bool NPObjectProxy::invoke(NPIdentifier methodName, const NPVariant* arguments,
if (!returnValue)
return false;
- *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData);
+ *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
return true;
}
@@ -130,7 +136,7 @@ bool NPObjectProxy::invokeDefault(const NPVariant* arguments, uint32_t argumentC
Vector<NPVariantData> argumentsData;
for (uint32_t i = 0; i < argumentCount; ++i)
- argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i]));
+ argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
bool returnValue = false;
NPVariantData resultData;
@@ -141,7 +147,7 @@ bool NPObjectProxy::invokeDefault(const NPVariant* arguments, uint32_t argumentC
if (!returnValue)
return false;
- *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData);
+ *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
return true;
}
@@ -176,7 +182,7 @@ bool NPObjectProxy::getProperty(NPIdentifier propertyName, NPVariant* result)
if (!returnValue)
return false;
- *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData);
+ *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
return true;
}
@@ -186,7 +192,7 @@ bool NPObjectProxy::setProperty(NPIdentifier propertyName, const NPVariant* valu
return false;
NPIdentifierData propertyNameData = NPIdentifierData::fromNPIdentifier(propertyName);
- NPVariantData propertyValueData = m_npRemoteObjectMap->npVariantToNPVariantData(*value);
+ NPVariantData propertyValueData = m_npRemoteObjectMap->npVariantToNPVariantData(*value, m_plugin);
bool returnValue = false;
@@ -242,7 +248,7 @@ bool NPObjectProxy::construct(const NPVariant* arguments, uint32_t argumentCount
Vector<NPVariantData> argumentsData;
for (uint32_t i = 0; i < argumentCount; ++i)
- argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i]));
+ argumentsData.append(m_npRemoteObjectMap->npVariantToNPVariantData(arguments[i], m_plugin));
bool returnValue = false;
NPVariantData resultData;
@@ -253,7 +259,7 @@ bool NPObjectProxy::construct(const NPVariant* arguments, uint32_t argumentCount
if (!returnValue)
return false;
- *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData);
+ *result = m_npRemoteObjectMap->npVariantDataToNPVariant(resultData, m_plugin);
return true;
}
diff --git a/Source/WebKit2/Shared/Plugins/NPObjectProxy.h b/Source/WebKit2/Shared/Plugins/NPObjectProxy.h
index e4c00c5..f472cb8 100644
--- a/Source/WebKit2/Shared/Plugins/NPObjectProxy.h
+++ b/Source/WebKit2/Shared/Plugins/NPObjectProxy.h
@@ -28,18 +28,19 @@
#if ENABLE(PLUGIN_PROCESS)
-#include <WebCore/npruntime.h>
+#include <WebCore/npruntime_internal.h>
#include <wtf/Noncopyable.h>
namespace WebKit {
class NPRemoteObjectMap;
+class Plugin;
class NPObjectProxy : public NPObject {
WTF_MAKE_NONCOPYABLE(NPObjectProxy);
public:
- static NPObjectProxy* create(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID);
+ static NPObjectProxy* create(NPRemoteObjectMap*, Plugin*, uint64_t npObjectID);
static bool isNPObjectProxy(NPObject*);
@@ -49,6 +50,7 @@ public:
return static_cast<NPObjectProxy*>(npObject);
}
+ Plugin* plugin() const { return m_plugin; }
uint64_t npObjectID() const { return m_npObjectID; }
void invalidate();
@@ -57,7 +59,7 @@ private:
NPObjectProxy();
~NPObjectProxy();
- void initialize(NPRemoteObjectMap* npRemoteObjectMap, uint64_t npObjectID);
+ void initialize(NPRemoteObjectMap*, Plugin*, uint64_t npObjectID);
bool hasMethod(NPIdentifier methodName);
bool invoke(NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
@@ -83,6 +85,7 @@ private:
static bool NP_Construct(NPObject*, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
NPRemoteObjectMap* m_npRemoteObjectMap;
+ Plugin* m_plugin;
uint64_t m_npObjectID;
};
diff --git a/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp b/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp
index 0e164f1..70978c5 100644
--- a/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp
+++ b/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.cpp
@@ -50,7 +50,6 @@ PassRefPtr<NPRemoteObjectMap> NPRemoteObjectMap::create(CoreIPC::Connection* con
NPRemoteObjectMap::NPRemoteObjectMap(CoreIPC::Connection* connection)
: m_connection(connection)
- , m_isInvalidating(false)
{
}
@@ -60,9 +59,9 @@ NPRemoteObjectMap::~NPRemoteObjectMap()
ASSERT(m_registeredNPObjects.isEmpty());
}
-NPObject* NPRemoteObjectMap::createNPObjectProxy(uint64_t remoteObjectID)
+NPObject* NPRemoteObjectMap::createNPObjectProxy(uint64_t remoteObjectID, Plugin* plugin)
{
- NPObjectProxy* npObjectProxy = NPObjectProxy::create(this, remoteObjectID);
+ NPObjectProxy* npObjectProxy = NPObjectProxy::create(this, plugin, remoteObjectID);
m_npObjectProxies.add(npObjectProxy);
@@ -71,16 +70,16 @@ NPObject* NPRemoteObjectMap::createNPObjectProxy(uint64_t remoteObjectID)
void NPRemoteObjectMap::npObjectProxyDestroyed(NPObject* npObject)
{
- ASSERT(NPObjectProxy::isNPObjectProxy(npObject));
- ASSERT(m_npObjectProxies.contains(npObject));
+ NPObjectProxy* npObjectProxy = NPObjectProxy::toNPObjectProxy(npObject);
+ ASSERT(m_npObjectProxies.contains(npObjectProxy));
- m_npObjectProxies.remove(npObject);
+ m_npObjectProxies.remove(npObjectProxy);
}
-uint64_t NPRemoteObjectMap::registerNPObject(NPObject* npObject)
+uint64_t NPRemoteObjectMap::registerNPObject(NPObject* npObject, Plugin* plugin)
{
uint64_t npObjectID = generateNPObjectID();
- m_registeredNPObjects.set(npObjectID, NPObjectMessageReceiver::create(this, npObjectID, npObject).leakPtr());
+ m_registeredNPObjects.set(npObjectID, NPObjectMessageReceiver::create(this, plugin, npObjectID, npObject).leakPtr());
return npObjectID;
}
@@ -90,7 +89,7 @@ void NPRemoteObjectMap::unregisterNPObject(uint64_t npObjectID)
m_registeredNPObjects.remove(npObjectID);
}
-NPVariantData NPRemoteObjectMap::npVariantToNPVariantData(const NPVariant& variant)
+NPVariantData NPRemoteObjectMap::npVariantToNPVariantData(const NPVariant& variant, Plugin* plugin)
{
switch (variant.type) {
case NPVariantType_Void:
@@ -124,7 +123,7 @@ NPVariantData NPRemoteObjectMap::npVariantToNPVariantData(const NPVariant& varia
return NPVariantData::makeRemoteNPObjectID(npObjectID);
}
- uint64_t npObjectID = registerNPObject(npObject);
+ uint64_t npObjectID = registerNPObject(npObject, plugin);
return NPVariantData::makeLocalNPObjectID(npObjectID);
}
@@ -134,7 +133,7 @@ NPVariantData NPRemoteObjectMap::npVariantToNPVariantData(const NPVariant& varia
return NPVariantData::makeVoid();
}
-NPVariant NPRemoteObjectMap::npVariantDataToNPVariant(const NPVariantData& npVariantData)
+NPVariant NPRemoteObjectMap::npVariantDataToNPVariant(const NPVariantData& npVariantData, Plugin* plugin)
{
NPVariant npVariant;
@@ -178,7 +177,7 @@ NPVariant NPRemoteObjectMap::npVariantDataToNPVariant(const NPVariantData& npVar
break;
}
case NPVariantData::RemoteNPObjectID: {
- NPObject* npObjectProxy = createNPObjectProxy(npVariantData.remoteNPObjectIDValue());
+ NPObject* npObjectProxy = createNPObjectProxy(npVariantData.remoteNPObjectIDValue(), plugin);
OBJECT_TO_NPVARIANT(npObjectProxy, npVariant);
break;
}
@@ -187,25 +186,37 @@ NPVariant NPRemoteObjectMap::npVariantDataToNPVariant(const NPVariantData& npVar
return npVariant;
}
-void NPRemoteObjectMap::invalidate()
+void NPRemoteObjectMap::pluginDestroyed(Plugin* plugin)
{
- ASSERT(!m_isInvalidating);
-
- m_isInvalidating = true;
-
Vector<NPObjectMessageReceiver*> messageReceivers;
- copyValuesToVector(m_registeredNPObjects, messageReceivers);
+
+ // Gather the receivers associated with this plug-in.
+ for (HashMap<uint64_t, NPObjectMessageReceiver*>::const_iterator it = m_registeredNPObjects.begin(), end = m_registeredNPObjects.end(); it != end; ++it) {
+ NPObjectMessageReceiver* npObjectMessageReceiver = it->second;
+ if (npObjectMessageReceiver->plugin() == plugin)
+ messageReceivers.append(npObjectMessageReceiver);
+ }
// Now delete all the receivers.
deleteAllValues(messageReceivers);
- ASSERT(m_registeredNPObjects.isEmpty());
+ Vector<NPObjectProxy*> objectProxies;
+ for (HashSet<NPObjectProxy*>::const_iterator it = m_npObjectProxies.begin(), end = m_npObjectProxies.end(); it != end; ++it) {
+ NPObjectProxy* npObjectProxy = *it;
- for (HashSet<NPObject*>::const_iterator it = m_npObjectProxies.begin(), end = m_npObjectProxies.end(); it != end; ++it)
- NPObjectProxy::toNPObjectProxy(*it)->invalidate();
- m_npObjectProxies.clear();
+ if (npObjectProxy->plugin() == plugin)
+ objectProxies.append(npObjectProxy);
+ }
+
+ // Invalidate and remove all proxies associated with this plug-in.
+ for (size_t i = 0; i < objectProxies.size(); ++i) {
+ NPObjectProxy* npObjectProxy = objectProxies[i];
- m_isInvalidating = false;
+ npObjectProxy->invalidate();
+
+ ASSERT(m_npObjectProxies.contains(npObjectProxy));
+ m_npObjectProxies.remove(npObjectProxy);
+ }
}
CoreIPC::SyncReplyMode NPRemoteObjectMap::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)
diff --git a/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.h b/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.h
index ff0bbbb..812d4d7 100644
--- a/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.h
+++ b/Source/WebKit2/Shared/Plugins/NPRemoteObjectMap.h
@@ -39,6 +39,7 @@ namespace WebKit {
class NPObjectMessageReceiver;
class NPObjectProxy;
class NPVariantData;
+class Plugin;
class NPRemoteObjectMap : public RefCounted<NPRemoteObjectMap> {
public:
@@ -46,23 +47,22 @@ public:
~NPRemoteObjectMap();
// Creates an NPObjectProxy wrapper for the remote object with the given remote object ID.
- NPObject* createNPObjectProxy(uint64_t remoteObjectID);
+ NPObject* createNPObjectProxy(uint64_t remoteObjectID, Plugin*);
void npObjectProxyDestroyed(NPObject*);
// Expose the given NPObject as a remote object. Returns the objectID.
- uint64_t registerNPObject(NPObject*);
+ uint64_t registerNPObject(NPObject*, Plugin*);
void unregisterNPObject(uint64_t);
// Given an NPVariant, creates an NPVariantData object (a CoreIPC representation of an NPVariant).
- NPVariantData npVariantToNPVariantData(const NPVariant&);
+ NPVariantData npVariantToNPVariantData(const NPVariant&, Plugin*);
// Given an NPVariantData, creates an NPVariant object.
- NPVariant npVariantDataToNPVariant(const NPVariantData&);
+ NPVariant npVariantDataToNPVariant(const NPVariantData&, Plugin*);
CoreIPC::Connection* connection() const { return m_connection; }
- bool isInvalidating() const { return m_isInvalidating; }
- void invalidate();
+ void pluginDestroyed(Plugin*);
CoreIPC::SyncReplyMode didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply);
@@ -70,14 +70,12 @@ private:
explicit NPRemoteObjectMap(CoreIPC::Connection*);
CoreIPC::Connection* m_connection;
- bool m_isInvalidating;
-
// A map of NPObjectMessageReceiver classes, wrapping objects that we export to the
// other end of the connection.
HashMap<uint64_t, NPObjectMessageReceiver*> m_registeredNPObjects;
// A set of NPObjectProxy objects associated with this map.
- HashSet<NPObject*> m_npObjectProxies;
+ HashSet<NPObjectProxy*> m_npObjectProxies;
};
} // namespace WebKit
diff --git a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp
index 7bbdaa8..54af967 100644
--- a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp
+++ b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp
@@ -58,16 +58,6 @@ NetscapePluginModule::~NetscapePluginModule()
ASSERT(initializedNetscapePluginModules().find(this) == notFound);
}
-void NetscapePluginModule::pluginCreated()
-{
- incrementLoadCount();
-}
-
-void NetscapePluginModule::pluginDestroyed()
-{
- decrementLoadCount();
-}
-
Vector<String> NetscapePluginModule::sitesWithData()
{
Vector<String> sites;
@@ -235,8 +225,21 @@ bool NetscapePluginModule::tryLoad()
// reversed. Failing to follow this order results in crashes (e.g., in Silverlight on Mac and
// in Flash and QuickTime on Windows).
#if PLUGIN_ARCHITECTURE(MAC)
- if (initializeFuncPtr(netscapeBrowserFuncs()) != NPERR_NO_ERROR || getEntryPointsFuncPtr(&m_pluginFuncs) != NPERR_NO_ERROR)
- return false;
+#ifndef NP_NO_CARBON
+ // Plugins (at least QT) require that you call UseResFile on the resource file before loading it.
+ ResFileRefNum currentResourceFile = CurResFile();
+
+ ResFileRefNum pluginResourceFile = m_module->bundleResourceMap();
+ UseResFile(pluginResourceFile);
+#endif
+ bool result = initializeFuncPtr(netscapeBrowserFuncs()) == NPERR_NO_ERROR && getEntryPointsFuncPtr(&m_pluginFuncs) == NPERR_NO_ERROR;
+
+#ifndef NP_NO_CARBON
+ // Restore the resource file.
+ UseResFile(currentResourceFile);
+#endif
+
+ return result;
#elif PLUGIN_ARCHITECTURE(WIN)
if (getEntryPointsFuncPtr(&m_pluginFuncs) != NPERR_NO_ERROR || initializeFuncPtr(netscapeBrowserFuncs()) != NPERR_NO_ERROR)
return false;
diff --git a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h
index aee26bb..4ec7991 100644
--- a/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h
+++ b/Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h
@@ -45,9 +45,9 @@ public:
~NetscapePluginModule();
const NPPluginFuncs& pluginFuncs() const { return m_pluginFuncs; }
-
- void pluginCreated();
- void pluginDestroyed();
+
+ void incrementLoadCount();
+ void decrementLoadCount();
static bool getPluginInfo(const String& pluginPath, PluginInfoStore::Plugin&);
@@ -68,9 +68,6 @@ private:
void applyX11QuirksBeforeLoad();
#endif
- void incrementLoadCount();
- void decrementLoadCount();
-
bool tryGetSitesWithData(Vector<String>&);
bool tryClearSiteData(const String& site, uint64_t flags, uint64_t maxAge);
diff --git a/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm b/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm
index accab46..d290f5b 100644
--- a/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm
+++ b/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm
@@ -86,13 +86,35 @@ static bool getPluginArchitecture(CFBundleRef bundle, cpu_type_t& pluginArchitec
return false;
}
+
+static RetainPtr<CFDictionaryRef> getMIMETypesFromPluginBundle(CFBundleRef bundle)
+{
+ CFStringRef propertyListFilename = static_cast<CFStringRef>(CFBundleGetValueForInfoDictionaryKey(bundle, CFSTR("WebPluginMIMETypesFilename")));
+ if (propertyListFilename) {
+ RetainPtr<CFStringRef> propertyListPath(AdoptCF, CFStringCreateWithFormat(kCFAllocatorDefault, 0, CFSTR("%@/Library/Preferences/%@"), NSHomeDirectory(), propertyListFilename));
+ RetainPtr<CFURLRef> propertyListURL(AdoptCF, CFURLCreateWithFileSystemPath(kCFAllocatorDefault, propertyListPath.get(), kCFURLPOSIXPathStyle, FALSE));
+
+ CFDataRef propertyListData;
+ CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, propertyListURL.get(), &propertyListData, 0, 0, 0);
+ RetainPtr<CFPropertyListRef> propertyList(AdoptCF, CFPropertyListCreateWithData(kCFAllocatorDefault, propertyListData, kCFPropertyListImmutable, 0, 0));
+ if (propertyListData)
+ CFRelease(propertyListData);
+
+ // FIXME: Have the plug-in create the MIME types property list if it doesn't exist.
+ // https://bugs.webkit.org/show_bug.cgi?id=57204
+ if (!propertyList || CFGetTypeID(propertyList.get()) != CFDictionaryGetTypeID())
+ return 0;
+
+ return static_cast<CFDictionaryRef>(CFDictionaryGetValue(static_cast<CFDictionaryRef>(propertyList.get()), CFSTR("WebPluginMIMETypes")));
+ }
+
+ return static_cast<CFDictionaryRef>(CFBundleGetValueForInfoDictionaryKey(bundle, CFSTR("WebPluginMIMETypes")));
+}
static bool getPluginInfoFromPropertyLists(CFBundleRef bundle, PluginInfo& pluginInfo)
{
- // FIXME: Handle WebPluginMIMETypesFilenameKey.
-
- CFDictionaryRef mimeTypes = static_cast<CFDictionaryRef>(CFBundleGetValueForInfoDictionaryKey(bundle, CFSTR("WebPluginMIMETypes")));
- if (!mimeTypes || CFGetTypeID(mimeTypes) != CFDictionaryGetTypeID())
+ RetainPtr<CFDictionaryRef> mimeTypes = getMIMETypesFromPluginBundle(bundle);
+ if (!mimeTypes || CFGetTypeID(mimeTypes.get()) != CFDictionaryGetTypeID())
return false;
// Get the plug-in name.
@@ -106,10 +128,10 @@ static bool getPluginInfoFromPropertyLists(CFBundleRef bundle, PluginInfo& plugi
pluginInfo.desc = pluginDescription;
// Get the MIME type mapping dictionary.
- CFIndex numMimeTypes = CFDictionaryGetCount(mimeTypes);
+ CFIndex numMimeTypes = CFDictionaryGetCount(mimeTypes.get());
Vector<CFStringRef> mimeTypesVector(numMimeTypes);
Vector<CFDictionaryRef> mimeTypeInfoVector(numMimeTypes);
- CFDictionaryGetKeysAndValues(mimeTypes, reinterpret_cast<const void**>(mimeTypesVector.data()), reinterpret_cast<const void**>(mimeTypeInfoVector.data()));
+ CFDictionaryGetKeysAndValues(mimeTypes.get(), reinterpret_cast<const void**>(mimeTypesVector.data()), reinterpret_cast<const void**>(mimeTypeInfoVector.data()));
for (CFIndex i = 0; i < numMimeTypes; ++i) {
MimeClassInfo mimeClassInfo;
@@ -142,8 +164,15 @@ static bool getPluginInfoFromPropertyLists(CFBundleRef bundle, PluginInfo& plugi
CFStringRef extension = static_cast<CFStringRef>(CFArrayGetValueAtIndex(extensionsArray, i));
if (!extension || CFGetTypeID(extension) != CFStringGetTypeID())
continue;
-
- mimeClassInfo.extensions.append(String(extension).lower());
+
+ // The DivX plug-in lists multiple extensions in a comma separated string instead of using
+ // multiple array elements in the property list. Work around this here by splitting the
+ // extension string into components.
+ Vector<String> extensionComponents;
+ String(extension).lower().split(',', extensionComponents);
+
+ for (size_t i = 0; i < extensionComponents.size(); ++i)
+ mimeClassInfo.extensions.append(extensionComponents[i]);
}
// Add this MIME type.
@@ -333,8 +362,24 @@ 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);
+
+ // Flash supports snapshotting.
m_pluginQuirks.add(PluginQuirks::SupportsSnapshotting);
}
+
+ if (plugin.bundleIdentifier == "com.microsoft.SilverlightPlugin") {
+ // Silverlight doesn't explicitly opt into transparency, so we'll do it whenever
+ // there's a 'background' attribute.
+ m_pluginQuirks.add(PluginQuirks::MakeTransparentIfBackgroundAttributeExists);
+ }
+
+#ifndef NP_NO_QUICKDRAW
+ if (plugin.bundleIdentifier == "com.apple.ist.ds.appleconnect.webplugin") {
+ // The AppleConnect plug-in uses QuickDraw but doesn't paint or receive events
+ // so we'll allow it to be instantiated even though we don't support QuickDraw.
+ m_pluginQuirks.add(PluginQuirks::AllowHalfBakedQuickDrawSupport);
+ }
+#endif
}
} // namespace WebKit
diff --git a/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp b/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
index b5e3aad..76ecda7 100644
--- a/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
+++ b/Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
@@ -40,7 +40,7 @@ namespace WebKit {
#if PLATFORM(QT)
static void initializeGTK()
{
- QLibrary library("libgtk-x11-2.0.so.0");
+ QLibrary library(QLatin1String("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"));
diff --git a/Source/WebKit2/Shared/Plugins/PluginQuirks.h b/Source/WebKit2/Shared/Plugins/PluginQuirks.h
index 9f8c1c4..ea4643b 100644
--- a/Source/WebKit2/Shared/Plugins/PluginQuirks.h
+++ b/Source/WebKit2/Shared/Plugins/PluginQuirks.h
@@ -36,8 +36,25 @@ public:
// 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,
+
+ // Make the plug-in transparent if it has a "background" attribute set.
+ // Microsoft Silverlight doesn't opt into transparency using NPN_SetValue and
+ // NPPVpluginTransparentBool, so we'll always force if the plug-in has a "background"
+ // attribute specified, regardless of it's value.
+ // FIXME: We could get more fancy here and check for specific values that we know are
+ // transparent.
+ MakeTransparentIfBackgroundAttributeExists,
+
+#ifndef NP_NO_QUICKDRAW
+ // Allow the plug-in to use the QuickDraw drawing model, since wek now that the plug-in
+ // will never paint or receive events. Used by the AppleConnect plug-in.
+ AllowHalfBakedQuickDrawSupport,
+#endif
+
+ // X11 specific quirks:
#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