summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/webkit/WebCore/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/webkit/WebCore/plugins')
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDatabase.h22
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDatabaseClient.h42
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackage.h8
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h2
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginStream.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginView.cpp223
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginView.h20
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp103
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/npapi.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp187
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginPackageWin.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp135
17 files changed, 483 insertions, 394 deletions
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp
index de1c298..f40ed95 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp
@@ -21,7 +21,7 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
@@ -29,11 +29,19 @@
#include "Frame.h"
#include "KURL.h"
+#include "PluginDatabaseClient.h"
#include "PluginPackage.h"
#include <stdlib.h>
namespace WebCore {
+typedef HashMap<String, RefPtr<PluginPackage> > PluginPackageByNameMap;
+
+PluginDatabase::PluginDatabase()
+ : m_client(0)
+{
+}
+
PluginDatabase* PluginDatabase::installedPlugins(bool populate)
{
static PluginDatabase* plugins = 0;
@@ -109,9 +117,11 @@ bool PluginDatabase::refresh()
remove(oldPackage.get());
}
- RefPtr<PluginPackage> package = PluginPackage::createPackage(*it, lastModified);
- if (package && add(package.release()))
- pluginSetChanged = true;
+ if (!m_client || m_client->shouldLoadPluginAtPath(*it)) {
+ RefPtr<PluginPackage> package = PluginPackage::createPackage(*it, lastModified);
+ if (package && (!m_client || m_client->shouldLoadPluginPackage(package.get())) && add(package.release()))
+ pluginSetChanged = true;
+ }
}
// Cache all the paths we found with their timestamps for next time.
@@ -126,10 +136,10 @@ bool PluginDatabase::refresh()
PluginSet::const_iterator end = m_plugins.end();
for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
// Get MIME types
+ MIMEToDescriptionsMap::const_iterator map_it = (*it)->mimeToDescriptions().begin();
MIMEToDescriptionsMap::const_iterator map_end = (*it)->mimeToDescriptions().end();
- for (MIMEToDescriptionsMap::const_iterator map_it = (*it)->mimeToDescriptions().begin(); map_it != map_end; ++map_it) {
+ for (; map_it != map_end; ++map_it)
m_registeredMIMETypes.add(map_it->first);
- }
}
return true;
@@ -161,12 +171,23 @@ PluginPackage* PluginDatabase::pluginForMIMEType(const String& mimeType)
String key = mimeType.lower();
PluginSet::const_iterator end = m_plugins.end();
+ PluginPackage* preferredPlugin = m_preferredPlugins.get(key).get();
+ if (preferredPlugin
+ && preferredPlugin->isEnabled()
+ && preferredPlugin->mimeToDescriptions().contains(key)) {
+ return preferredPlugin;
+ }
Vector<PluginPackage*, 2> pluginChoices;
for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
- if ((*it)->mimeToDescriptions().contains(key))
- pluginChoices.append((*it).get());
+ PluginPackage* plugin = (*it).get();
+
+ if (!plugin->isEnabled())
+ continue;
+
+ if (plugin->mimeToDescriptions().contains(key))
+ pluginChoices.append(plugin);
}
if (pluginChoices.isEmpty())
@@ -188,16 +209,25 @@ String PluginDatabase::MIMETypeForExtension(const String& extension) const
HashMap<PluginPackage*, String> mimeTypeForPlugin;
for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
+ if (!(*it)->isEnabled())
+ continue;
+
MIMEToExtensionsMap::const_iterator mime_end = (*it)->mimeToExtensions().end();
for (MIMEToExtensionsMap::const_iterator mime_it = (*it)->mimeToExtensions().begin(); mime_it != mime_end; ++mime_it) {
+ mimeType = mime_it->first;
+ PluginPackage* preferredPlugin = m_preferredPlugins.get(mimeType).get();
const Vector<String>& extensions = mime_it->second;
bool foundMapping = false;
for (unsigned i = 0; i < extensions.size(); i++) {
if (equalIgnoringCase(extensions[i], extension)) {
PluginPackage* plugin = (*it).get();
+
+ if (preferredPlugin && PluginPackage::equal(*plugin, *preferredPlugin))
+ return mimeType;
+
pluginChoices.append(plugin);
- mimeTypeForPlugin.add(plugin, mime_it->first);
+ mimeTypeForPlugin.add(plugin, mimeType);
foundMapping = true;
break;
}
@@ -219,7 +249,7 @@ PluginPackage* PluginDatabase::findPlugin(const KURL& url, String& mimeType)
{
PluginPackage* plugin = pluginForMIMEType(mimeType);
String filename = url.string();
-
+
if (!plugin) {
String filename = url.lastPathComponent();
if (!filename.endsWith("/")) {
@@ -233,12 +263,18 @@ PluginPackage* PluginDatabase::findPlugin(const KURL& url, String& mimeType)
}
}
- // FIXME: if no plugin could be found, query Windows for the mime type
+ // FIXME: if no plugin could be found, query Windows for the mime type
// corresponding to the extension.
return plugin;
}
+void PluginDatabase::setPreferredPluginForMIMEType(const String& mimeType, PluginPackage* plugin)
+{
+ if (!plugin || plugin->mimeToExtensions().contains(mimeType))
+ m_preferredPlugins.set(mimeType.lower(), plugin);
+}
+
void PluginDatabase::getDeletedPlugins(PluginSet& plugins) const
{
PluginSet::const_iterator end = m_plugins.end();
@@ -263,6 +299,14 @@ bool PluginDatabase::add(PassRefPtr<PluginPackage> prpPackage)
void PluginDatabase::remove(PluginPackage* package)
{
+ MIMEToExtensionsMap::const_iterator it = package->mimeToExtensions().begin();
+ MIMEToExtensionsMap::const_iterator end = package->mimeToExtensions().end();
+ for ( ; it != end; ++it) {
+ PluginPackageByNameMap::iterator packageInMap = m_preferredPlugins.find(it->first);
+ if (packageInMap != m_preferredPlugins.end() && packageInMap->second == package)
+ m_preferredPlugins.remove(packageInMap);
+ }
+
m_plugins.remove(package);
m_pluginsByPath.remove(package->path());
}
@@ -273,6 +317,7 @@ void PluginDatabase::clear()
m_pluginsByPath.clear();
m_pluginPathsWithTimes.clear();
m_registeredMIMETypes.clear();
+ m_preferredPlugins.clear();
}
#if !PLATFORM(WIN_OS) || PLATFORM(WX)
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.h b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.h
index b8d2bfe..fdc9330 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.h
@@ -22,7 +22,7 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PluginDatabase_H
@@ -32,20 +32,23 @@
#include "PluginPackage.h"
#include "StringHash.h"
-#include <wtf/Vector.h>
#include <wtf/HashSet.h>
+#include <wtf/Vector.h>
namespace WebCore {
class Element;
class Frame;
class IntSize;
class KURL;
+ class PluginDatabaseClient;
class PluginPackage;
typedef HashSet<RefPtr<PluginPackage>, PluginPackageHash> PluginSet;
class PluginDatabase {
public:
+ PluginDatabase();
+
// The first call to installedPlugins creates the plugin database
// and by default populates it with the plugins installed on the system.
// For testing purposes, it is possible to not populate the database
@@ -63,6 +66,8 @@ namespace WebCore {
static int preferredPluginCompare(const void*, const void*);
PluginPackage* findPlugin(const KURL&, String& mimeType);
+ PluginPackage* pluginForMIMEType(const String& mimeType);
+ void setPreferredPluginForMIMEType(const String& mimeType, PluginPackage* plugin);
void setPluginDirectories(const Vector<String>& directories)
{
@@ -70,6 +75,14 @@ namespace WebCore {
m_pluginDirectories = directories;
}
+ void setClient(PluginDatabaseClient* client)
+ {
+ m_client = client;
+ }
+
+ static Vector<String> defaultPluginDirectories();
+ Vector<String> pluginDirectories() const { return m_pluginDirectories; }
+
private:
void getPluginPathsInDirectories(HashSet<String>&) const;
void getDeletedPlugins(PluginSet&) const;
@@ -78,16 +91,15 @@ namespace WebCore {
bool add(PassRefPtr<PluginPackage>);
void remove(PluginPackage*);
- PluginPackage* pluginForMIMEType(const String& mimeType);
String MIMETypeForExtension(const String& extension) const;
- static Vector<String> defaultPluginDirectories();
-
Vector<String> m_pluginDirectories;
HashSet<String> m_registeredMIMETypes;
PluginSet m_plugins;
HashMap<String, RefPtr<PluginPackage> > m_pluginsByPath;
HashMap<String, time_t> m_pluginPathsWithTimes;
+ HashMap<String, RefPtr<PluginPackage> > m_preferredPlugins;
+ PluginDatabaseClient* m_client;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginDatabaseClient.h b/src/3rdparty/webkit/WebCore/plugins/PluginDatabaseClient.h
new file mode 100644
index 0000000..b19ab83
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginDatabaseClient.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2007 Marius Renn <damarvy@gmail.com> All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef PluginDatabaseClient_h
+#define PluginDatabaseClient_h
+
+namespace WebCore {
+
+ class PluginPackage;
+ class String;
+
+ class PluginDatabaseClient {
+ public:
+ virtual ~PluginDatabaseClient() { }
+ virtual bool shouldLoadPluginAtPath(const String&) = 0;
+ virtual bool shouldLoadPluginPackage(const PluginPackage*) = 0;
+ };
+
+} // namespace WebCore
+
+#endif // PluginDatabaseClient_h
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp
index 8adba98..612a9d7 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp
@@ -22,7 +22,7 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
@@ -47,7 +47,7 @@ PluginPackage::~PluginPackage()
// course would cause a crash, so we check to call unload before we
// ASSERT.
// FIXME: There is probably a better way to fix this.
- if (m_loadCount == 0)
+ if (!m_loadCount)
unloadWithoutShutdown();
else
unload();
@@ -59,7 +59,7 @@ void PluginPackage::freeLibrarySoon()
{
ASSERT(!m_freeLibraryTimer.isActive());
ASSERT(m_module);
- ASSERT(m_loadCount == 0);
+ ASSERT(!m_loadCount);
m_freeLibraryTimer.startOneShot(0);
}
@@ -67,7 +67,7 @@ void PluginPackage::freeLibrarySoon()
void PluginPackage::freeLibraryTimerFired(Timer<PluginPackage>*)
{
ASSERT(m_module);
- ASSERT(m_loadCount == 0);
+ ASSERT(!m_loadCount);
unloadModule(m_module);
m_module = 0;
@@ -100,7 +100,8 @@ int PluginPackage::compare(const PluginPackage& compareTo) const
}
PluginPackage::PluginPackage(const String& path, const time_t& lastModified)
- : m_isLoaded(false)
+ : m_isEnabled(true)
+ , m_isLoaded(false)
, m_loadCount(0)
, m_path(path)
, m_moduleVersion(0)
@@ -130,7 +131,7 @@ void PluginPackage::unloadWithoutShutdown()
if (!m_isLoaded)
return;
- ASSERT(m_loadCount == 0);
+ ASSERT(!m_loadCount);
ASSERT(m_module);
// <rdar://5530519>: Crash when closing tab with pdf file (Reader 7 only)
@@ -144,6 +145,11 @@ void PluginPackage::unloadWithoutShutdown()
m_isLoaded = false;
}
+void PluginPackage::setEnabled(bool enabled)
+{
+ m_isEnabled = enabled;
+}
+
PassRefPtr<PluginPackage> PluginPackage::createPackage(const String& path, const time_t& lastModified)
{
RefPtr<PluginPackage> package = adoptRef(new PluginPackage(path, lastModified));
@@ -243,7 +249,7 @@ void PluginPackage::determineModuleVersionFromDescription()
void PluginPackage::initializeBrowserFuncs()
{
memset(&m_browserFuncs, 0, sizeof(m_browserFuncs));
- m_browserFuncs.size = sizeof (m_browserFuncs);
+ m_browserFuncs.size = sizeof(m_browserFuncs);
m_browserFuncs.version = NP_VERSION_MINOR;
m_browserFuncs.geturl = NPN_GetURL;
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h
index 02d0dfc..3afc57f 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h
@@ -21,7 +21,7 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PluginPackage_H
@@ -44,7 +44,7 @@ namespace WebCore {
public:
~PluginPackage();
static PassRefPtr<PluginPackage> createPackage(const String& path, const time_t& lastModified);
-
+
const String& name() const { return m_name; }
const String& description() const { return m_description; }
const String& path() const { return m_path; }
@@ -62,6 +62,9 @@ namespace WebCore {
void unload();
void unloadWithoutShutdown();
+ bool isEnabled() const { return m_isEnabled; }
+ void setEnabled(bool);
+
const NPPluginFuncs* pluginFuncs() const { return &m_pluginFuncs; }
int compareFileVersion(const PlatformModuleVersion&) const;
int compare(const PluginPackage&) const;
@@ -77,6 +80,7 @@ namespace WebCore {
void determineModuleVersionFromDescription();
void initializeBrowserFuncs();
+ bool m_isEnabled;
bool m_isLoaded;
int m_loadCount;
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h b/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h
index 8183050..b652c6e 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h
@@ -45,7 +45,7 @@ namespace WebCore {
PluginQuirkDontClipToZeroRectWhenScrolling = 1 << 9,
PluginQuirkDontSetNullWindowHandleOnDestroy = 1 << 10,
PluginQuirkDontAllowMultipleInstances = 1 << 11,
- PluginQuirkRequiresGtkToolKit = 1 << 12
+ PluginQuirkRequiresGtkToolKit = 1 << 12,
};
class PluginQuirkSet {
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginStream.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginStream.cpp
index d2d5d3c..cd9f83d 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginStream.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginStream.cpp
@@ -248,6 +248,11 @@ void PluginStream::destroyStream()
bool newStreamCalled = m_stream.ndata;
+ // Protect from destruction if:
+ // NPN_DestroyStream is called from NPP_NewStream or
+ // PluginStreamClient::streamDidFinishLoading() removes the last reference
+ RefPtr<PluginStream> protect(this);
+
if (newStreamCalled) {
if (m_reason == NPRES_DONE && (m_transferMode == NP_ASFILE || m_transferMode == NP_ASFILEONLY)) {
ASSERT(!m_path.isNull());
@@ -281,9 +286,6 @@ void PluginStream::destroyStream()
m_loader->setDefersLoading(true);
if (!newStreamCalled && m_quirks.contains(PluginQuirkFlashURLNotifyBug) &&
equalIgnoringCase(m_resourceRequest.httpMethod(), "POST")) {
- // Protect the stream if NPN_DestroyStream is called from NPP_NewStream
- RefPtr<PluginStream> protect(this);
-
m_transferMode = NP_NORMAL;
m_stream.url = "";
m_stream.notifyData = m_notifyData;
@@ -303,8 +305,6 @@ void PluginStream::destroyStream()
m_streamState = StreamStopped;
- // streamDidFinishLoading can cause us to be deleted.
- RefPtr<PluginStream> protect(this);
if (!m_loadManually)
m_client->streamDidFinishLoading(this);
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp
index 2cecdc4..c28e586 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp
@@ -149,11 +149,55 @@ void PluginView::handleEvent(Event* event)
handleKeyboardEvent(static_cast<KeyboardEvent*>(event));
}
+void PluginView::init()
+{
+ if (m_haveInitialized)
+ return;
+
+ m_haveInitialized = true;
+
+ if (!m_plugin) {
+ ASSERT(m_status == PluginStatusCanNotFindPlugin);
+ return;
+ }
+
+ LOG(Plugins, "PluginView::init(): Initializing plug-in '%s'", m_plugin->name().utf8().data());
+
+ if (!m_plugin->load()) {
+ m_plugin = 0;
+ m_status = PluginStatusCanNotLoadPlugin;
+ return;
+ }
+
+ if (!startOrAddToUnstartedList()) {
+ m_status = PluginStatusCanNotLoadPlugin;
+ return;
+ }
+
+ m_status = PluginStatusLoadedSuccessfully;
+}
+
+bool PluginView::startOrAddToUnstartedList()
+{
+ if (!m_parentFrame->page())
+ return false;
+
+ if (!m_parentFrame->page()->canStartPlugins()) {
+ m_parentFrame->page()->addUnstartedPlugin(this);
+ m_isWaitingToStart = true;
+ return true;
+ }
+
+ return start();
+}
+
bool PluginView::start()
{
if (m_isStarted)
return false;
+ m_isWaitingToStart = false;
+
PluginMainThreadScheduler::scheduler().registerPlugin(m_instance);
ASSERT(m_plugin);
@@ -164,14 +208,17 @@ bool PluginView::start()
PluginView::setCurrentPluginView(this);
JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
setCallingPlugin(true);
- npErr = m_plugin->pluginFuncs()->newp((NPMIMEType)m_mimeType.data(), m_instance, m_mode, m_paramCount, m_paramNames, m_paramValues, NULL);
+ npErr = m_plugin->pluginFuncs()->newp((NPMIMEType)m_mimeType.utf8().data(), m_instance, m_mode, m_paramCount, m_paramNames, m_paramValues, NULL);
setCallingPlugin(false);
LOG_NPERROR(npErr);
PluginView::setCurrentPluginView(0);
}
- if (npErr != NPERR_NO_ERROR)
+ if (npErr != NPERR_NO_ERROR) {
+ m_status = PluginStatusCanNotLoadPlugin;
+ PluginMainThreadScheduler::scheduler().unregisterPlugin(m_instance);
return false;
+ }
m_isStarted = true;
@@ -182,7 +229,125 @@ bool PluginView::start()
load(frameLoadRequest, false, 0);
}
- return true;
+ m_status = PluginStatusLoadedSuccessfully;
+
+ if (!platformStart())
+ m_status = PluginStatusCanNotLoadPlugin;
+
+ return (m_status == PluginStatusLoadedSuccessfully);
+}
+
+PluginView::~PluginView()
+{
+ LOG(Plugins, "PluginView::~PluginView()");
+
+ removeFromUnstartedListIfNecessary();
+
+ stop();
+
+ deleteAllValues(m_requests);
+
+ freeStringArray(m_paramNames, m_paramCount);
+ freeStringArray(m_paramValues, m_paramCount);
+
+ platformDestroy();
+
+ m_parentFrame->script()->cleanupScriptObjectsForPlugin(this);
+
+ if (m_plugin && !(m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin)))
+ m_plugin->unload();
+}
+
+void PluginView::removeFromUnstartedListIfNecessary()
+{
+ if (!m_isWaitingToStart)
+ return;
+
+ if (!m_parentFrame->page())
+ return;
+
+ m_parentFrame->page()->removeUnstartedPlugin(this);
+}
+
+void PluginView::stop()
+{
+ if (!m_isStarted)
+ return;
+
+ LOG(Plugins, "PluginView::stop(): Stopping plug-in '%s'", m_plugin->name().utf8().data());
+
+ HashSet<RefPtr<PluginStream> > streams = m_streams;
+ HashSet<RefPtr<PluginStream> >::iterator end = streams.end();
+ for (HashSet<RefPtr<PluginStream> >::iterator it = streams.begin(); it != end; ++it) {
+ (*it)->stop();
+ disconnectStream((*it).get());
+ }
+
+ ASSERT(m_streams.isEmpty());
+
+ m_isStarted = false;
+
+ JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+
+#if !PLATFORM(WX) // FIXME: Revisit this when implementing plugins for wx
+#ifdef XP_WIN
+ // Unsubclass the window
+ if (m_isWindowed) {
+#if PLATFORM(WINCE)
+ WNDPROC currentWndProc = (WNDPROC)GetWindowLong(platformPluginWidget(), GWL_WNDPROC);
+
+ if (currentWndProc == PluginViewWndProc)
+ SetWindowLong(platformPluginWidget(), GWL_WNDPROC, (LONG)m_pluginWndProc);
+#else
+ WNDPROC currentWndProc = (WNDPROC)GetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC);
+
+ if (currentWndProc == PluginViewWndProc)
+ SetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC, (LONG)m_pluginWndProc);
+#endif
+ }
+#endif // XP_WIN
+#endif // !PLATFORM(WX)
+
+#if !defined(XP_MACOSX)
+ // Clear the window
+ m_npWindow.window = 0;
+
+ if (m_plugin->pluginFuncs()->setwindow && !m_plugin->quirks().contains(PluginQuirkDontSetNullWindowHandleOnDestroy)) {
+ PluginView::setCurrentPluginView(this);
+ setCallingPlugin(true);
+ m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
+ setCallingPlugin(false);
+ PluginView::setCurrentPluginView(0);
+ }
+
+#ifdef XP_UNIX
+ if (m_isWindowed && m_npWindow.ws_info)
+ delete (NPSetWindowCallbackStruct *)m_npWindow.ws_info;
+ m_npWindow.ws_info = 0;
+#endif
+
+#endif // !defined(XP_MACOSX)
+
+ PluginMainThreadScheduler::scheduler().unregisterPlugin(m_instance);
+
+ NPSavedData* savedData = 0;
+ PluginView::setCurrentPluginView(this);
+ setCallingPlugin(true);
+ NPError npErr = m_plugin->pluginFuncs()->destroy(m_instance, &savedData);
+ setCallingPlugin(false);
+ LOG_NPERROR(npErr);
+ PluginView::setCurrentPluginView(0);
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ if (savedData) {
+ // TODO: Actually save this data instead of just discarding it
+ if (savedData->buf)
+ NPN_MemFree(savedData->buf);
+ NPN_MemFree(savedData);
+ }
+#endif
+
+ m_instance->pdata = 0;
}
void PluginView::setCurrentPluginView(PluginView* pluginView)
@@ -221,6 +386,9 @@ static bool getString(ScriptController* proxy, JSValue result, String& string)
void PluginView::performRequest(PluginRequest* request)
{
+ if (!m_isStarted)
+ return;
+
// don't let a plugin start any loads if it is no longer part of a document that is being
// displayed unless the loads are in the same frame as the plugin.
const String& targetFrameName = request->frameLoadRequest().frameName();
@@ -522,7 +690,7 @@ PassRefPtr<JSC::Bindings::Instance> PluginView::bindingInstance()
#if ENABLE(NETSCAPE_PLUGIN_API)
NPObject* object = 0;
- if (!m_plugin || !m_plugin->pluginFuncs()->getvalue)
+ if (!m_isStarted || !m_plugin || !m_plugin->pluginFuncs()->getvalue)
return 0;
// On Windows, calling Java's NPN_GetValue can allow the message loop to
@@ -582,6 +750,9 @@ void PluginView::setParameters(const Vector<String>& paramNames, const Vector<St
if (m_plugin->quirks().contains(PluginQuirkRemoveWindowlessVideoParam) && equalIgnoringCase(paramNames[i], "windowlessvideo"))
continue;
+ if (paramNames[i] == "pluginspage")
+ m_pluginsPage = paramValues[i];
+
m_paramNames[paramCount] = createUTF8String(paramNames[i]);
m_paramValues[paramCount] = createUTF8String(paramValues[i]);
@@ -604,7 +775,7 @@ PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* p
, m_popPopupsStateTimer(this, &PluginView::popPopupsStateTimerFired)
, m_paramNames(0)
, m_paramValues(0)
- , m_instance(0)
+ , m_mimeType(mimeType)
#if defined(XP_MACOSX)
, m_isWindowed(false)
#else
@@ -612,7 +783,8 @@ PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* p
#endif
, m_isTransparent(false)
, m_haveInitialized(false)
-#if PLATFORM(GTK) || defined(Q_WS_X11)
+ , m_isWaitingToStart(false)
+#if defined(XP_UNIX) || defined(Q_WS_X11)
, m_needsXEmbed(false)
#endif
#if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
@@ -620,6 +792,7 @@ PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* p
, m_lastMessage(0)
, m_isCallingPluginWndProc(false)
, m_wmPrintHDC(0)
+ , m_haveUpdatedPluginWidget(false)
#endif
#if (PLATFORM(QT) && PLATFORM(WIN_OS)) || defined(XP_MACOSX)
, m_window(0)
@@ -628,6 +801,9 @@ PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* p
, m_drawingModel(NPDrawingModel(-1))
, m_eventModel(NPEventModel(-1))
#endif
+#if defined(Q_WS_X11)
+ , m_hasPendingGeometryChange(false)
+#endif
, m_loadManually(loadManually)
, m_manualStream(0)
, m_isJavaScriptPaused(false)
@@ -641,8 +817,6 @@ PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* p
m_instance->ndata = this;
m_instance->pdata = 0;
- m_mimeType = mimeType.utf8();
-
setParameters(paramNames, paramValues);
memset(&m_npWindow, 0, sizeof(m_npWindow));
@@ -1005,4 +1179,37 @@ void PluginView::paintMissingPluginIcon(GraphicsContext* context, const IntRect&
context->restore();
}
+static const char* MozillaUserAgent = "Mozilla/5.0 ("
+#if defined(XP_MACOSX)
+ "Macintosh; U; Intel Mac OS X;"
+#elif defined(XP_WIN)
+ "Windows; U; Windows NT 5.1;"
+#elif defined(XP_UNIX)
+// The Gtk port uses X11 plugins in Mac.
+#if PLATFORM(DARWIN) && PLATFORM(GTK)
+ "X11; U; Intel Mac OS X;"
+#else
+ "X11; U; Linux i686;"
+#endif
+#endif
+ " en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0";
+
+const char* PluginView::userAgent()
+{
+ if (m_plugin->quirks().contains(PluginQuirkWantsMozillaUserAgent))
+ return MozillaUserAgent;
+
+ if (m_userAgent.isNull())
+ m_userAgent = m_parentFrame->loader()->userAgent(m_url).utf8();
+
+ return m_userAgent.data();
+}
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+const char* PluginView::userAgentStatic()
+{
+ return MozillaUserAgent;
+}
+#endif
+
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginView.h b/src/3rdparty/webkit/WebCore/plugins/PluginView.h
index 95d73db..54c1065 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginView.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginView.h
@@ -177,6 +177,10 @@ namespace WebCore {
void focusPluginElement();
+ const String& pluginsPage() const { return m_pluginsPage; }
+ const String& mimeType() const { return m_mimeType; }
+ const KURL& url() const { return m_url; }
+
#if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
@@ -191,13 +195,18 @@ namespace WebCore {
static bool isCallingPlugin();
+ bool start();
+
private:
PluginView(Frame* parentFrame, const IntSize&, PluginPackage*, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
void setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues);
+ bool startOrAddToUnstartedList();
+ void removeFromUnstartedListIfNecessary();
void init();
- bool start();
+ bool platformStart();
void stop();
+ void platformDestroy();
static void setCurrentPluginView(PluginView*);
NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData);
NPError handlePost(const char* url, const char* target, uint32 len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders);
@@ -245,8 +254,9 @@ namespace WebCore {
int m_paramCount;
char** m_paramNames;
char** m_paramValues;
+ String m_pluginsPage;
- CString m_mimeType;
+ String m_mimeType;
CString m_userAgent;
NPP m_instance;
@@ -261,8 +271,9 @@ namespace WebCore {
bool m_isWindowed;
bool m_isTransparent;
bool m_haveInitialized;
+ bool m_isWaitingToStart;
-#if PLATFORM(GTK) || defined(Q_WS_X11)
+#if defined(XP_UNIX) || defined(Q_WS_X11)
bool m_needsXEmbed;
#endif
@@ -272,6 +283,7 @@ namespace WebCore {
unsigned m_lastMessage;
bool m_isCallingPluginWndProc;
HDC m_wmPrintHDC;
+ bool m_haveUpdatedPluginWidget;
#endif
#if (PLATFORM(QT) && PLATFORM(WIN_OS)) || defined(XP_MACOSX)
@@ -288,7 +300,7 @@ public:
private:
-#if PLATFORM(GTK) || defined(Q_WS_X11)
+#if defined(XP_UNIX) || defined(Q_WS_X11)
void setNPWindowIfNeeded();
#elif defined(XP_MACOSX)
NP_CGContext m_npCgContext;
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp
index a3b6a17..b694214 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp
@@ -73,25 +73,6 @@ void PluginView::setNPWindowRect(const IntRect&)
notImplemented();
}
-void PluginView::stop()
-{
- notImplemented();
-}
-
-const char* PluginView::userAgent()
-{
- notImplemented();
- return 0;
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-const char* PluginView::userAgentStatic()
-{
- notImplemented();
- return 0;
-}
-#endif
-
NPError PluginView::handlePostReadFile(Vector<char>&, uint32, const char*)
{
notImplemented();
@@ -133,12 +114,14 @@ void PluginView::forceRedraw()
notImplemented();
}
-PluginView::~PluginView()
+bool PluginView::platformStart()
{
notImplemented();
+
+ return true;
}
-void PluginView::init()
+void PluginView::platformDestroy()
{
notImplemented();
}
diff --git a/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp b/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp
index bf6a81b..d242fb8 100644
--- a/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp
@@ -246,9 +246,6 @@ bool PluginPackage::fetchInfo()
bool PluginPackage::isPluginBlacklisted()
{
- if (name() == "Silverlight Plug-In" || name().startsWith("QuickTime Plug-in"))
- return true;
-
return false;
}
diff --git a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
index 721ec29..d0a3288 100644
--- a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
@@ -125,30 +125,10 @@ static inline IntPoint topLevelOffsetFor(PlatformWidget widget)
// --------------- Lifetime management -----------------
-void PluginView::init()
+bool PluginView::platformStart()
{
- LOG(Plugins, "PluginView::init(): Initializing plug-in '%s'", m_plugin->name().utf8().data());
-
- if (m_haveInitialized)
- return;
- m_haveInitialized = true;
-
- if (!m_plugin) {
- ASSERT(m_status == PluginStatusCanNotFindPlugin);
- return;
- }
-
- if (!m_plugin->load()) {
- m_plugin = 0;
- m_status = PluginStatusCanNotLoadPlugin;
- return;
- }
-
- if (!start()) {
- m_status = PluginStatusCanNotLoadPlugin;
- stop(); // Make sure we unregister the plugin
- return;
- }
+ ASSERT(m_isStarted);
+ ASSERT(m_status == PluginStatusLoadedSuccessfully);
if (m_drawingModel == NPDrawingModel(-1)) {
// We default to QuickDraw, even though we don't support it,
@@ -180,8 +160,7 @@ void PluginView::init()
m_status = PluginStatusCanNotLoadPlugin;
LOG(Plugins, "Plug-in '%s' uses unsupported event model %s",
m_plugin->name().utf8().data(), prettyNameForEventModel(m_eventModel));
- stop();
- return;
+ return false;
}
if (getValueStatic(NPNVariable(NPNVsupportsQuickDrawBool + m_drawingModel), &drawingModelSupported) != NPERR_NO_ERROR
@@ -189,70 +168,24 @@ void PluginView::init()
m_status = PluginStatusCanNotLoadPlugin;
LOG(Plugins, "Plug-in '%s' uses unsupported drawing model %s",
m_plugin->name().utf8().data(), prettyNameForDrawingModel(m_drawingModel));
- stop();
- return;
+ return false;
}
setPlatformPluginWidget(m_parentFrame->view()->hostWindow()->platformWindow());
show();
- m_status = PluginStatusLoadedSuccessfully;
-
// TODO: Implement null timer throttling depending on plugin activation
m_nullEventTimer.set(new Timer<PluginView>(this, &PluginView::nullEventTimerFired));
m_nullEventTimer->startRepeating(0.02);
-}
-
-PluginView::~PluginView()
-{
- LOG(Plugins, "PluginView::~PluginView()");
- stop();
-
- deleteAllValues(m_requests);
-
- freeStringArray(m_paramNames, m_paramCount);
- freeStringArray(m_paramValues, m_paramCount);
-
- m_parentFrame->script()->cleanupScriptObjectsForPlugin(this);
-
- if (m_plugin && !(m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin)))
- m_plugin->unload();
-
- m_window = 0;
+ return true;
}
-void PluginView::stop()
+void PluginView::platformDestroy()
{
- if (!m_isStarted)
- return;
-
- LOG(Plugins, "PluginView::stop(): Stopping plug-in '%s'", m_plugin->name().utf8().data());
-
- HashSet<RefPtr<PluginStream> > streams = m_streams;
- HashSet<RefPtr<PluginStream> >::iterator end = streams.end();
- for (HashSet<RefPtr<PluginStream> >::iterator it = streams.begin(); it != end; ++it) {
- (*it)->stop();
- disconnectStream((*it).get());
- }
-
- ASSERT(m_streams.isEmpty());
-
- m_isStarted = false;
-
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-
- PluginMainThreadScheduler::scheduler().unregisterPlugin(m_instance);
-
- // Destroy the plugin
- PluginView::setCurrentPluginView(this);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->destroy(m_instance, 0);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-
- m_instance->pdata = 0;
+ if (platformPluginWidget())
+ setPlatformPluginWidget(0);
}
// Used before the plugin view has been initialized properly, and as a
@@ -724,24 +657,6 @@ bool PluginView::dispatchNPEvent(NPEvent& event)
// ------------------- Miscellaneous ------------------
-static const char* MozillaUserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0";
-
-const char* PluginView::userAgent()
-{
- if (m_plugin->quirks().contains(PluginQuirkWantsMozillaUserAgent))
- return MozillaUserAgent;
-
- if (m_userAgent.isNull())
- m_userAgent = m_parentFrame->loader()->userAgent(m_url).utf8();
-
- return m_userAgent.data();
-}
-
-const char* PluginView::userAgentStatic()
-{
- return MozillaUserAgent;
-}
-
NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf)
{
String filename(buf, len);
diff --git a/src/3rdparty/webkit/WebCore/plugins/npapi.cpp b/src/3rdparty/webkit/WebCore/plugins/npapi.cpp
index d275a39..4135b64 100644
--- a/src/3rdparty/webkit/WebCore/plugins/npapi.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/npapi.cpp
@@ -171,9 +171,7 @@ void NPN_PopPopupsEnabledState(NPP instance)
pluginViewForInstance(instance)->popPopupsEnabledState();
}
-extern "C" {
void NPN_PluginThreadAsyncCall(NPP instance, void (*func) (void *), void *userData)
{
PluginMainThreadScheduler::scheduler().scheduleCall(instance, func, userData);
}
-}
diff --git a/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp b/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp
index b9c1656..7f5a7b9 100644
--- a/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp
@@ -63,7 +63,7 @@ bool PluginPackage::fetchInfo()
String s = gm();
Vector<String> types;
s.split(UChar(';'), false, types);
- for (int i = 0; i < types.size(); ++i) {
+ for (unsigned i = 0; i < types.size(); ++i) {
Vector<String> mime;
types[i].split(UChar(':'), true, mime);
if (mime.size() > 0) {
diff --git a/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp b/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp
index 883c9aa..fdeac2f 100644
--- a/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp
@@ -45,6 +45,7 @@
#include "NotImplemented.h"
#include "Page.h"
#include "PlatformMouseEvent.h"
+#include "PlatformKeyboardEvent.h"
#include "PluginContainerQt.h"
#include "PluginDebug.h"
#include "PluginPackage.h"
@@ -55,10 +56,12 @@
#include "npruntime_impl.h"
#include "runtime.h"
#include "runtime_root.h"
+#include <QKeyEvent>
#include <QWidget>
#include <QX11Info>
#include <runtime/JSLock.h>
#include <runtime/JSValue.h>
+#include <X11/X.h>
using JSC::ExecState;
using JSC::Interpreter;
@@ -150,14 +153,76 @@ void PluginView::paint(GraphicsContext* context, const IntRect& rect)
setNPWindowIfNeeded();
}
+// TODO: Unify across ports.
+bool PluginView::dispatchNPEvent(NPEvent& event)
+{
+ if (!m_plugin->pluginFuncs()->event)
+ return false;
+
+ PluginView::setCurrentPluginView(this);
+ JSC::JSLock::DropAllLocks dropAllLocks(false);
+
+ setCallingPlugin(true);
+ bool accepted = m_plugin->pluginFuncs();
+ setCallingPlugin(false);
+
+ return accepted;
+}
+
+void setSharedXEventFields(XEvent& xEvent, QWidget* hostWindow)
+{
+ xEvent.xany.serial = 0; // we are unaware of the last request processed by X Server
+ xEvent.xany.send_event = false;
+ xEvent.xany.display = hostWindow->x11Info().display();
+ // NOTE: event.xany.window doesn't always respond to the .window property of other XEvent's
+ // but does in the case of KeyPress, KeyRelease, ButtonPress, ButtonRelease, and MotionNotify
+ // events; thus, this is right:
+ xEvent.xany.window = hostWindow->window()->handle();
+}
+
+void setXKeyEventSpecificFields(XEvent& xEvent, KeyboardEvent* event)
+{
+ QKeyEvent* qKeyEvent = event->keyEvent()->qtEvent();
+
+ xEvent.xkey.root = QX11Info::appRootWindow();
+ xEvent.xkey.subwindow = 0; // we have no child window
+ xEvent.xkey.time = event->timeStamp();
+ xEvent.xkey.state = qKeyEvent->nativeModifiers();
+ xEvent.xkey.keycode = qKeyEvent->nativeScanCode();
+ xEvent.xkey.same_screen = true;
+
+ // NOTE: As the XEvents sent to the plug-in are synthesized and there is not a native window
+ // corresponding to the plug-in rectangle, some of the members of the XEvent structures are not
+ // set to their normal Xserver values. e.g. Key events don't have a position.
+ // source: https://developer.mozilla.org/en/NPEvent
+ xEvent.xkey.x = 0;
+ xEvent.xkey.y = 0;
+ xEvent.xkey.x_root = 0;
+ xEvent.xkey.y_root = 0;
+}
+
void PluginView::handleKeyboardEvent(KeyboardEvent* event)
{
- notImplemented();
+ if (m_isWindowed)
+ return;
+
+ if (event->type() != "keydown" && event->type() != "keyup")
+ return;
+
+ XEvent npEvent; // On UNIX NPEvent is a typedef for XEvent.
+
+ npEvent.type = (event->type() == "keydown") ? 2 : 3; // ints as Qt unsets KeyPress and KeyRelease
+ setSharedXEventFields(npEvent, m_parentFrame->view()->hostWindow()->platformWindow());
+ setXKeyEventSpecificFields(npEvent, event);
+
+ if (!dispatchNPEvent(npEvent))
+ event->setDefaultHandled();
}
void PluginView::handleMouseEvent(MouseEvent* event)
{
- notImplemented();
+ if (m_isWindowed)
+ return;
}
void PluginView::setParent(ScrollView* parent)
@@ -227,70 +292,6 @@ void PluginView::setParentVisible(bool visible)
platformPluginWidget()->setVisible(visible);
}
-void PluginView::stop()
-{
- if (!m_isStarted)
- return;
-
- HashSet<RefPtr<PluginStream> > streams = m_streams;
- HashSet<RefPtr<PluginStream> >::iterator end = streams.end();
- for (HashSet<RefPtr<PluginStream> >::iterator it = streams.begin(); it != end; ++it) {
- (*it)->stop();
- disconnectStream((*it).get());
- }
-
- ASSERT(m_streams.isEmpty());
-
- m_isStarted = false;
-
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-
- PluginMainThreadScheduler::scheduler().unregisterPlugin(m_instance);
-
- // Clear the window
- m_npWindow.window = 0;
- if (m_plugin->pluginFuncs()->setwindow && !m_plugin->quirks().contains(PluginQuirkDontSetNullWindowHandleOnDestroy)) {
- PluginView::setCurrentPluginView(this);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
-
- delete (NPSetWindowCallbackStruct *)m_npWindow.ws_info;
- m_npWindow.ws_info = 0;
-
- // Destroy the plugin
- {
- PluginView::setCurrentPluginView(this);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->destroy(m_instance, 0);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
-
- m_instance->pdata = 0;
-}
-
-static const char* MozillaUserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0";
-
-const char* PluginView::userAgent()
-{
- if (m_plugin->quirks().contains(PluginQuirkWantsMozillaUserAgent))
- return MozillaUserAgent;
-
- if (m_userAgent.isNull())
- m_userAgent = m_parentFrame->loader()->userAgent(m_url).utf8();
-
- return m_userAgent.data();
-}
-
-const char* PluginView::userAgentStatic()
-{
- // FIXME - Just say we are Mozilla
- return MozillaUserAgent;
-}
-
NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf)
{
String filename(buf, len);
@@ -435,46 +436,10 @@ void PluginView::forceRedraw()
notImplemented();
}
-PluginView::~PluginView()
-{
- stop();
-
- deleteAllValues(m_requests);
-
- freeStringArray(m_paramNames, m_paramCount);
- freeStringArray(m_paramValues, m_paramCount);
-
- m_parentFrame->script()->cleanupScriptObjectsForPlugin(this);
-
- if (m_plugin && !(m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin)))
- m_plugin->unload();
-
- delete platformPluginWidget();
-}
-
-void PluginView::init()
+bool PluginView::platformStart()
{
- if (m_haveInitialized)
- return;
- m_haveInitialized = true;
-
- m_hasPendingGeometryChange = false;
-
- if (!m_plugin) {
- ASSERT(m_status == PluginStatusCanNotFindPlugin);
- return;
- }
-
- if (!m_plugin->load()) {
- m_plugin = 0;
- m_status = PluginStatusCanNotLoadPlugin;
- return;
- }
-
- if (!start()) {
- m_status = PluginStatusCanNotLoadPlugin;
- return;
- }
+ ASSERT(m_isStarted);
+ ASSERT(m_status == PluginStatusLoadedSuccessfully);
if (m_plugin->pluginFuncs()->getvalue) {
PluginView::setCurrentPluginView(this);
@@ -489,9 +454,9 @@ void PluginView::init()
setPlatformWidget(new PluginContainerQt(this, m_parentFrame->view()->hostWindow()->platformWindow()));
} else {
notImplemented();
- m_status = PluginStatusCanNotLoadPlugin;
- return;
+ return false;
}
+
show();
NPSetWindowCallbackStruct *wsi = new NPSetWindowCallbackStruct();
@@ -514,7 +479,13 @@ void PluginView::init()
setNPWindowIfNeeded();
}
- m_status = PluginStatusLoadedSuccessfully;
+ return true;
+}
+
+void PluginView::platformDestroy()
+{
+ if (platformPluginWidget())
+ delete platformPluginWidget();
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/win/PluginPackageWin.cpp b/src/3rdparty/webkit/WebCore/plugins/win/PluginPackageWin.cpp
index 9e38925..e6fb9d5 100644
--- a/src/3rdparty/webkit/WebCore/plugins/win/PluginPackageWin.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/win/PluginPackageWin.cpp
@@ -245,7 +245,9 @@ bool PluginPackage::load()
m_loadCount++;
return true;
} else {
-#if !PLATFORM(WINCE)
+#if PLATFORM(WINCE)
+ m_module = ::LoadLibraryW(m_path.charactersWithNullTermination());
+#else
WCHAR currentPath[MAX_PATH];
if (!::GetCurrentDirectoryW(MAX_PATH, currentPath))
@@ -255,12 +257,10 @@ bool PluginPackage::load()
if (!::SetCurrentDirectoryW(path.charactersWithNullTermination()))
return false;
-#endif
// Load the library
m_module = ::LoadLibraryExW(m_path.charactersWithNullTermination(), 0, LOAD_WITH_ALTERED_SEARCH_PATH);
-#if !PLATFORM(WINCE)
if (!::SetCurrentDirectoryW(currentPath)) {
if (m_module)
::FreeLibrary(m_module);
diff --git a/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp b/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp
index 2687186..9ee8ee6 100644
--- a/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp
@@ -104,8 +104,6 @@ using namespace HTMLNames;
const LPCWSTR kWebPluginViewdowClassName = L"WebPluginView";
const LPCWSTR kWebPluginViewProperty = L"WebPluginViewProperty";
-static const char* MozillaUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0";
-
#if !PLATFORM(WINCE)
// The code used to hook BeginPaint/EndPaint originally came from
// <http://www.fengyuan.com/article/wmprint.html>.
@@ -411,7 +409,7 @@ void PluginView::updatePluginWidget()
m_clipRect = windowClipRect();
m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
- if (platformPluginWidget() && (m_windowRect != oldWindowRect || m_clipRect != oldClipRect)) {
+ if (platformPluginWidget() && (!m_haveUpdatedPluginWidget || m_windowRect != oldWindowRect || m_clipRect != oldClipRect)) {
HRGN rgn;
setCallingPlugin(true);
@@ -429,7 +427,7 @@ void PluginView::updatePluginWidget()
::SetWindowRgn(platformPluginWidget(), rgn, TRUE);
}
- if (m_windowRect != oldWindowRect)
+ if (!m_haveUpdatedPluginWidget || m_windowRect != oldWindowRect)
::MoveWindow(platformPluginWidget(), m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height(), TRUE);
if (clipToZeroRect) {
@@ -438,6 +436,8 @@ void PluginView::updatePluginWidget()
}
setCallingPlugin(false);
+
+ m_haveUpdatedPluginWidget = true;
}
}
@@ -795,80 +795,6 @@ void PluginView::setNPWindowRect(const IntRect& rect)
}
}
-void PluginView::stop()
-{
- if (!m_isStarted)
- return;
-
- HashSet<RefPtr<PluginStream> > streams = m_streams;
- HashSet<RefPtr<PluginStream> >::iterator end = streams.end();
- for (HashSet<RefPtr<PluginStream> >::iterator it = streams.begin(); it != end; ++it) {
- (*it)->stop();
- disconnectStream((*it).get());
- }
-
- ASSERT(m_streams.isEmpty());
-
- m_isStarted = false;
-
- // Unsubclass the window
- if (m_isWindowed) {
-#if PLATFORM(WINCE)
- WNDPROC currentWndProc = (WNDPROC)GetWindowLong(platformPluginWidget(), GWL_WNDPROC);
-
- if (currentWndProc == PluginViewWndProc)
- SetWindowLong(platformPluginWidget(), GWL_WNDPROC, (LONG)m_pluginWndProc);
-#else
- WNDPROC currentWndProc = (WNDPROC)GetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC);
-
- if (currentWndProc == PluginViewWndProc)
- SetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC, (LONG)m_pluginWndProc);
-#endif
- }
-
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-
- // Clear the window
- m_npWindow.window = 0;
- if (m_plugin->pluginFuncs()->setwindow && !m_plugin->quirks().contains(PluginQuirkDontSetNullWindowHandleOnDestroy)) {
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
- }
-
- PluginMainThreadScheduler::scheduler().unregisterPlugin(m_instance);
-
- // Destroy the plugin
- NPSavedData* savedData = 0;
- setCallingPlugin(true);
- NPError npErr = m_plugin->pluginFuncs()->destroy(m_instance, &savedData);
- setCallingPlugin(false);
- LOG_NPERROR(npErr);
-
- if (savedData) {
- if (savedData->buf)
- NPN_MemFree(savedData->buf);
- NPN_MemFree(savedData);
- }
-
- m_instance->pdata = 0;
-}
-
-const char* PluginView::userAgentStatic()
-{
- return 0;
-}
-
-const char* PluginView::userAgent()
-{
- if (m_plugin->quirks().contains(PluginQuirkWantsMozillaUserAgent))
- return MozillaUserAgent;
-
- if (m_userAgent.isNull())
- m_userAgent = m_parentFrame->loader()->userAgent(m_url).utf8();
- return m_userAgent.data();
-}
-
NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf)
{
String filename(buf, len);
@@ -1029,47 +955,10 @@ void PluginView::forceRedraw()
::UpdateWindow(windowHandleForPlatformWidget(parent() ? parent()->hostWindow()->platformWindow() : 0));
}
-PluginView::~PluginView()
+bool PluginView::platformStart()
{
- if (m_instance)
- m_instance->ndata = 0;
- stop();
-
- deleteAllValues(m_requests);
-
- freeStringArray(m_paramNames, m_paramCount);
- freeStringArray(m_paramValues, m_paramCount);
-
- if (platformPluginWidget())
- DestroyWindow(platformPluginWidget());
-
- m_parentFrame->script()->cleanupScriptObjectsForPlugin(this);
-
- if (m_plugin && !m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin))
- m_plugin->unload();
-}
-
-void PluginView::init()
-{
- if (m_haveInitialized)
- return;
- m_haveInitialized = true;
-
- if (!m_plugin) {
- ASSERT(m_status == PluginStatusCanNotFindPlugin);
- return;
- }
-
- if (!m_plugin->load()) {
- m_plugin = 0;
- m_status = PluginStatusCanNotLoadPlugin;
- return;
- }
-
- if (!start()) {
- m_status = PluginStatusCanNotLoadPlugin;
- return;
- }
+ ASSERT(m_isStarted);
+ ASSERT(m_status == PluginStatusLoadedSuccessfully);
if (m_isWindowed) {
registerPluginView();
@@ -1109,10 +998,18 @@ void PluginView::init()
m_npWindow.window = 0;
}
+ updatePluginWidget();
+
if (!m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))
setNPWindowRect(frameRect());
- m_status = PluginStatusLoadedSuccessfully;
+ return true;
+}
+
+void PluginView::platformDestroy()
+{
+ if (platformPluginWidget())
+ DestroyWindow(platformPluginWidget());
}
} // namespace WebCore