diff options
author | Steve Block <steveblock@google.com> | 2011-05-25 19:08:45 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-06-08 13:51:31 +0100 |
commit | 2bde8e466a4451c7319e3a072d118917957d6554 (patch) | |
tree | 28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebKit2/Shared/Plugins | |
parent | 6939c99b71d9372d14a0c74a772108052e8c48c8 (diff) | |
download | external_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')
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 |