summaryrefslogtreecommitdiffstats
path: root/WebCore/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/plugins')
-rw-r--r--WebCore/plugins/DOMMimeType.cpp74
-rw-r--r--WebCore/plugins/DOMMimeType.h54
-rw-r--r--WebCore/plugins/DOMMimeType.idl30
-rw-r--r--WebCore/plugins/DOMMimeTypeArray.cpp95
-rw-r--r--WebCore/plugins/DOMMimeTypeArray.h56
-rw-r--r--WebCore/plugins/DOMMimeTypeArray.idl32
-rw-r--r--WebCore/plugins/DOMPlugin.cpp91
-rw-r--r--WebCore/plugins/DOMPlugin.h58
-rw-r--r--WebCore/plugins/DOMPlugin.idl35
-rw-r--r--WebCore/plugins/DOMPluginArray.cpp100
-rw-r--r--WebCore/plugins/DOMPluginArray.h58
-rw-r--r--WebCore/plugins/DOMPluginArray.idl33
-rw-r--r--WebCore/plugins/PluginData.cpp82
-rw-r--r--WebCore/plugins/PluginData.h80
-rw-r--r--WebCore/plugins/PluginDataNone.cpp40
-rw-r--r--WebCore/plugins/PluginDatabase.cpp675
-rw-r--r--WebCore/plugins/PluginDatabase.h125
-rw-r--r--WebCore/plugins/PluginDebug.cpp176
-rw-r--r--WebCore/plugins/PluginDebug.h55
-rw-r--r--WebCore/plugins/PluginMainThreadScheduler.cpp116
-rw-r--r--WebCore/plugins/PluginMainThreadScheduler.h86
-rw-r--r--WebCore/plugins/PluginPackage.cpp394
-rw-r--r--WebCore/plugins/PluginPackage.h149
-rw-r--r--WebCore/plugins/PluginPackageNone.cpp52
-rw-r--r--WebCore/plugins/PluginQuirkSet.h65
-rw-r--r--WebCore/plugins/PluginStrategy.h50
-rw-r--r--WebCore/plugins/PluginStream.cpp508
-rw-r--r--WebCore/plugins/PluginStream.h125
-rw-r--r--WebCore/plugins/PluginView.cpp1620
-rw-r--r--WebCore/plugins/PluginView.h501
-rw-r--r--WebCore/plugins/PluginViewBase.h59
-rw-r--r--WebCore/plugins/PluginViewNone.cpp167
-rw-r--r--WebCore/plugins/chromium/PluginDataChromium.cpp97
-rw-r--r--WebCore/plugins/chromium/PluginDataChromium.h39
-rw-r--r--WebCore/plugins/gtk/PluginDataGtk.cpp65
-rw-r--r--WebCore/plugins/gtk/PluginPackageGtk.cpp176
-rw-r--r--WebCore/plugins/gtk/PluginViewGtk.cpp901
-rw-r--r--WebCore/plugins/gtk/gtk2xtbin.c966
-rw-r--r--WebCore/plugins/gtk/gtk2xtbin.h158
-rw-r--r--WebCore/plugins/gtk/xembed.h64
-rw-r--r--WebCore/plugins/mac/PluginPackageMac.cpp307
-rw-r--r--WebCore/plugins/mac/PluginViewMac.mm821
-rw-r--r--WebCore/plugins/npapi.cpp206
-rw-r--r--WebCore/plugins/npfunctions.h219
-rw-r--r--WebCore/plugins/qt/PluginContainerQt.cpp150
-rw-r--r--WebCore/plugins/qt/PluginContainerQt.h63
-rw-r--r--WebCore/plugins/qt/PluginPackageQt.cpp199
-rw-r--r--WebCore/plugins/qt/PluginViewQt.cpp1011
-rw-r--r--WebCore/plugins/symbian/PluginContainerSymbian.cpp77
-rw-r--r--WebCore/plugins/symbian/PluginContainerSymbian.h53
-rw-r--r--WebCore/plugins/symbian/PluginDatabaseSymbian.cpp79
-rw-r--r--WebCore/plugins/symbian/PluginPackageSymbian.cpp182
-rw-r--r--WebCore/plugins/symbian/PluginViewSymbian.cpp441
-rw-r--r--WebCore/plugins/symbian/npinterface.h37
-rw-r--r--WebCore/plugins/win/PaintHooks.asm50
-rw-r--r--WebCore/plugins/win/PluginDatabaseWin.cpp451
-rw-r--r--WebCore/plugins/win/PluginMessageThrottlerWin.cpp151
-rw-r--r--WebCore/plugins/win/PluginMessageThrottlerWin.h74
-rw-r--r--WebCore/plugins/win/PluginPackageWin.cpp342
-rw-r--r--WebCore/plugins/win/PluginViewWin.cpp1080
-rw-r--r--WebCore/plugins/wx/PluginDataWx.cpp70
61 files changed, 0 insertions, 14370 deletions
diff --git a/WebCore/plugins/DOMMimeType.cpp b/WebCore/plugins/DOMMimeType.cpp
deleted file mode 100644
index e799314..0000000
--- a/WebCore/plugins/DOMMimeType.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "config.h"
-#include "DOMMimeType.h"
-
-#include "DOMPlugin.h"
-#include "Frame.h"
-#include "FrameLoaderClient.h"
-#include "Page.h"
-#include "PluginData.h"
-#include "Settings.h"
-#include <wtf/text/StringBuilder.h>
-
-namespace WebCore {
-
-DOMMimeType::DOMMimeType(PassRefPtr<PluginData> pluginData, unsigned index)
- : m_pluginData(pluginData)
- , m_index(index)
-{
-}
-
-DOMMimeType::~DOMMimeType()
-{
-}
-
-const String &DOMMimeType::type() const
-{
- return mimeClassInfo().type;
-}
-
-String DOMMimeType::suffixes() const
-{
- const Vector<String>& extensions = mimeClassInfo().extensions;
-
- StringBuilder builder;
- for (size_t i = 0; i < extensions.size(); ++i) {
- if (i)
- builder.append(',');
- builder.append(extensions[i]);
- }
- return builder.toString();
-}
-
-const String &DOMMimeType::description() const
-{
- return mimeClassInfo().desc;
-}
-
-PassRefPtr<DOMPlugin> DOMMimeType::enabledPlugin() const
-{
- const Page* p = m_pluginData->page();
- if (!p || !p->mainFrame()->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin))
- return 0;
-
- return DOMPlugin::create(m_pluginData.get(), m_pluginData->mimePluginIndices()[m_index]);
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/DOMMimeType.h b/WebCore/plugins/DOMMimeType.h
deleted file mode 100644
index cefdb48..0000000
--- a/WebCore/plugins/DOMMimeType.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef DOMMimeType_h
-#define DOMMimeType_h
-
-#include <wtf/Forward.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefPtr.h>
-#include <wtf/RefCounted.h>
-
-#include "PluginData.h"
-
-namespace WebCore {
-
-class DOMPlugin;
-
-class DOMMimeType : public RefCounted<DOMMimeType> {
-public:
- static PassRefPtr<DOMMimeType> create(PassRefPtr<PluginData> pluginData, unsigned index) { return adoptRef(new DOMMimeType(pluginData, index)); }
- ~DOMMimeType();
-
- const String &type() const;
- String suffixes() const;
- const String &description() const;
- PassRefPtr<DOMPlugin> enabledPlugin() const;
-
-private:
- const MimeClassInfo& mimeClassInfo() const { return m_pluginData->mimes()[m_index]; }
-
- DOMMimeType(PassRefPtr<PluginData>, unsigned index);
- RefPtr<PluginData> m_pluginData;
- unsigned m_index;
-};
-
-}
-
-#endif
diff --git a/WebCore/plugins/DOMMimeType.idl b/WebCore/plugins/DOMMimeType.idl
deleted file mode 100644
index 1d97a6b..0000000
--- a/WebCore/plugins/DOMMimeType.idl
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2008 Apple Inc. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-module window {
-
- interface DOMMimeType {
- readonly attribute DOMString type;
- readonly attribute DOMString suffixes;
- readonly attribute DOMString description;
- readonly attribute DOMPlugin enabledPlugin;
- };
-
-}
diff --git a/WebCore/plugins/DOMMimeTypeArray.cpp b/WebCore/plugins/DOMMimeTypeArray.cpp
deleted file mode 100644
index 8c81bb7..0000000
--- a/WebCore/plugins/DOMMimeTypeArray.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "config.h"
-#include "DOMMimeTypeArray.h"
-
-#include "DOMPlugin.h"
-#include "Frame.h"
-#include "Page.h"
-#include "PluginData.h"
-#include <wtf/text/AtomicString.h>
-
-namespace WebCore {
-
-DOMMimeTypeArray::DOMMimeTypeArray(Frame* frame)
- : m_frame(frame)
-{
-}
-
-DOMMimeTypeArray::~DOMMimeTypeArray()
-{
-}
-
-unsigned DOMMimeTypeArray::length() const
-{
- PluginData* data = getPluginData();
- if (!data)
- return 0;
- return data->mimes().size();
-}
-
-PassRefPtr<DOMMimeType> DOMMimeTypeArray::item(unsigned index)
-{
- PluginData* data = getPluginData();
- if (!data)
- return 0;
- const Vector<MimeClassInfo>& mimes = data->mimes();
- if (index >= mimes.size())
- return 0;
- return DOMMimeType::create(data, index).get();
-}
-
-bool DOMMimeTypeArray::canGetItemsForName(const AtomicString& propertyName)
-{
- PluginData *data = getPluginData();
- if (!data)
- return 0;
- const Vector<MimeClassInfo>& mimes = data->mimes();
- for (unsigned i = 0; i < mimes.size(); ++i) {
- if (mimes[i].type == propertyName)
- return true;
- }
- return false;
-}
-
-PassRefPtr<DOMMimeType> DOMMimeTypeArray::namedItem(const AtomicString& propertyName)
-{
- PluginData *data = getPluginData();
- if (!data)
- return 0;
- const Vector<MimeClassInfo>& mimes = data->mimes();
- for (unsigned i = 0; i < mimes.size(); ++i) {
- if (mimes[i].type == propertyName)
- return DOMMimeType::create(data, i).get();
- }
- return 0;
-}
-
-PluginData* DOMMimeTypeArray::getPluginData() const
-{
- if (!m_frame)
- return 0;
- Page* p = m_frame->page();
- if (!p)
- return 0;
- return p->pluginData();
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/DOMMimeTypeArray.h b/WebCore/plugins/DOMMimeTypeArray.h
deleted file mode 100644
index ed078bb..0000000
--- a/WebCore/plugins/DOMMimeTypeArray.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2008 Apple Inc. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef DOMMimeTypeArray_h
-#define DOMMimeTypeArray_h
-
-#include "DOMMimeType.h"
-#include <wtf/Forward.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
-#include <wtf/Vector.h>
-
-namespace WebCore {
-
-class Frame;
-class PluginData;
-
-class DOMMimeTypeArray : public RefCounted<DOMMimeTypeArray> {
-public:
- static PassRefPtr<DOMMimeTypeArray> create(Frame* frame) { return adoptRef(new DOMMimeTypeArray(frame)); }
- ~DOMMimeTypeArray();
-
- void disconnectFrame() { m_frame = 0; }
-
- unsigned length() const;
- PassRefPtr<DOMMimeType> item(unsigned index);
- bool canGetItemsForName(const AtomicString& propertyName);
- PassRefPtr<DOMMimeType> namedItem(const AtomicString& propertyName);
-
-private:
- DOMMimeTypeArray(Frame*);
- PluginData* getPluginData() const;
-
- Frame* m_frame;
-};
-
-} // namespace WebCore
-
-#endif // MimeTypeArray_h
diff --git a/WebCore/plugins/DOMMimeTypeArray.idl b/WebCore/plugins/DOMMimeTypeArray.idl
deleted file mode 100644
index 8b79a7e..0000000
--- a/WebCore/plugins/DOMMimeTypeArray.idl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2008 Apple Inc. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-module window {
-
- interface [
- HasNameGetter,
- HasIndexGetter
- ] DOMMimeTypeArray {
- readonly attribute unsigned long length;
- DOMMimeType item(in unsigned long index);
- DOMMimeType namedItem(in DOMString name);
- };
-
-}
diff --git a/WebCore/plugins/DOMPlugin.cpp b/WebCore/plugins/DOMPlugin.cpp
deleted file mode 100644
index ac4fd03..0000000
--- a/WebCore/plugins/DOMPlugin.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "config.h"
-#include "DOMPlugin.h"
-
-#include "PluginData.h"
-#include "Frame.h"
-#include <wtf/text/AtomicString.h>
-
-namespace WebCore {
-
-DOMPlugin::DOMPlugin(PluginData* pluginData, unsigned index)
- : m_pluginData(pluginData)
- , m_index(index)
-{
-}
-
-DOMPlugin::~DOMPlugin()
-{
-}
-
-String DOMPlugin::name() const
-{
- return pluginInfo().name;
-}
-
-String DOMPlugin::filename() const
-{
- return pluginInfo().file;
-}
-
-String DOMPlugin::description() const
-{
- return pluginInfo().desc;
-}
-
-unsigned DOMPlugin::length() const
-{
- return pluginInfo().mimes.size();
-}
-
-PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index)
-{
- if (index >= pluginInfo().mimes.size())
- return 0;
-
- const MimeClassInfo& mime = pluginInfo().mimes[index];
-
- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
- for (unsigned i = 0; i < mimes.size(); ++i) {
- if (mimes[i] == mime && m_pluginData->mimePluginIndices()[i] == m_index)
- return DOMMimeType::create(m_pluginData.get(), i).get();
- }
- return 0;
-}
-
-bool DOMPlugin::canGetItemsForName(const AtomicString& propertyName)
-{
- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
- for (unsigned i = 0; i < mimes.size(); ++i)
- if (mimes[i].type == propertyName)
- return true;
- return false;
-}
-
-PassRefPtr<DOMMimeType> DOMPlugin::namedItem(const AtomicString& propertyName)
-{
- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
- for (unsigned i = 0; i < mimes.size(); ++i)
- if (mimes[i].type == propertyName)
- return DOMMimeType::create(m_pluginData.get(), i).get();
- return 0;
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/DOMPlugin.h b/WebCore/plugins/DOMPlugin.h
deleted file mode 100644
index 9700ab5..0000000
--- a/WebCore/plugins/DOMPlugin.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef DOMPlugin_h
-#define DOMPlugin_h
-
-#include "DOMMimeType.h"
-#include <wtf/Forward.h>
-#include <wtf/RefPtr.h>
-#include <wtf/RefCounted.h>
-
-namespace WebCore {
-
-class Plugin;
-class PluginData;
-
-class DOMPlugin : public RefCounted<DOMPlugin> {
-public:
- static PassRefPtr<DOMPlugin> create(PluginData* pluginData, unsigned index) { return adoptRef(new DOMPlugin(pluginData, index)); }
- ~DOMPlugin();
-
- String name() const;
- String filename() const;
- String description() const;
-
- unsigned length() const;
-
- PassRefPtr<DOMMimeType> item(unsigned index);
- bool canGetItemsForName(const AtomicString& propertyName);
- PassRefPtr<DOMMimeType> namedItem(const AtomicString& propertyName);
-
-private:
- const PluginInfo& pluginInfo() const { return m_pluginData->plugins()[m_index]; }
-
- DOMPlugin(PluginData*, unsigned index);
- RefPtr<PluginData> m_pluginData;
- unsigned m_index;
-};
-
-} // namespace WebCore
-
-#endif // Plugin_h
diff --git a/WebCore/plugins/DOMPlugin.idl b/WebCore/plugins/DOMPlugin.idl
deleted file mode 100644
index dc2b141..0000000
--- a/WebCore/plugins/DOMPlugin.idl
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2008 Apple Inc. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-module window {
-
- interface [
- HasNameGetter,
- HasIndexGetter
- ] DOMPlugin {
- readonly attribute DOMString name;
- readonly attribute DOMString filename;
- readonly attribute DOMString description;
- readonly attribute unsigned long length;
- DOMMimeType item(in unsigned long index);
- DOMMimeType namedItem(in DOMString name);
- };
-
-}
diff --git a/WebCore/plugins/DOMPluginArray.cpp b/WebCore/plugins/DOMPluginArray.cpp
deleted file mode 100644
index 3717f32..0000000
--- a/WebCore/plugins/DOMPluginArray.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "config.h"
-#include "DOMPluginArray.h"
-
-#include "DOMPlugin.h"
-#include "Frame.h"
-#include "Page.h"
-#include "PluginData.h"
-#include <wtf/text/AtomicString.h>
-
-namespace WebCore {
-
-DOMPluginArray::DOMPluginArray(Frame* frame)
- : m_frame(frame)
-{
-}
-
-DOMPluginArray::~DOMPluginArray()
-{
-}
-
-unsigned DOMPluginArray::length() const
-{
- PluginData* data = pluginData();
- if (!data)
- return 0;
- return data->plugins().size();
-}
-
-PassRefPtr<DOMPlugin> DOMPluginArray::item(unsigned index)
-{
- PluginData* data = pluginData();
- if (!data)
- return 0;
- const Vector<PluginInfo>& plugins = data->plugins();
- if (index >= plugins.size())
- return 0;
- return DOMPlugin::create(data, index).get();
-}
-
-bool DOMPluginArray::canGetItemsForName(const AtomicString& propertyName)
-{
- PluginData* data = pluginData();
- if (!data)
- return 0;
- const Vector<PluginInfo>& plugins = data->plugins();
- for (unsigned i = 0; i < plugins.size(); ++i) {
- if (plugins[i].name == propertyName)
- return true;
- }
- return false;
-}
-
-PassRefPtr<DOMPlugin> DOMPluginArray::namedItem(const AtomicString& propertyName)
-{
- PluginData* data = pluginData();
- if (!data)
- return 0;
- const Vector<PluginInfo>& plugins = data->plugins();
- for (unsigned i = 0; i < plugins.size(); ++i) {
- if (plugins[i].name == propertyName)
- return DOMPlugin::create(data, i).get();
- }
- return 0;
-}
-
-void DOMPluginArray::refresh(bool reload)
-{
- Page::refreshPlugins(reload);
-}
-
-PluginData* DOMPluginArray::pluginData() const
-{
- if (!m_frame)
- return 0;
- Page* page = m_frame->page();
- if (!page)
- return 0;
- return page->pluginData();
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/DOMPluginArray.h b/WebCore/plugins/DOMPluginArray.h
deleted file mode 100644
index cc70572..0000000
--- a/WebCore/plugins/DOMPluginArray.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2008 Apple Inc. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef DOMPluginArray_h
-#define DOMPluginArray_h
-
-#include "DOMPlugin.h"
-#include <wtf/Forward.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
-#include <wtf/Vector.h>
-
-namespace WebCore {
-
-class Frame;
-class PluginData;
-
-class DOMPluginArray : public RefCounted<DOMPluginArray> {
-public:
- static PassRefPtr<DOMPluginArray> create(Frame* frame) { return adoptRef(new DOMPluginArray(frame)); }
- ~DOMPluginArray();
-
- void disconnectFrame() { m_frame = 0; }
-
- unsigned length() const;
- PassRefPtr<DOMPlugin> item(unsigned index);
- bool canGetItemsForName(const AtomicString& propertyName);
- PassRefPtr<DOMPlugin> namedItem(const AtomicString& propertyName);
-
- void refresh(bool reload);
-
-private:
- DOMPluginArray(Frame*);
- PluginData* pluginData() const;
-
- Frame* m_frame;
-};
-
-} // namespace WebCore
-
-#endif // PluginArray_h
diff --git a/WebCore/plugins/DOMPluginArray.idl b/WebCore/plugins/DOMPluginArray.idl
deleted file mode 100644
index 4c0d64c..0000000
--- a/WebCore/plugins/DOMPluginArray.idl
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2008 Apple Inc. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-module window {
-
- interface [
- HasNameGetter,
- HasIndexGetter
- ] DOMPluginArray {
- readonly attribute unsigned long length;
- DOMPlugin item(in unsigned long index);
- DOMPlugin namedItem(in DOMString name);
- void refresh(in boolean reload);
- };
-
-}
diff --git a/WebCore/plugins/PluginData.cpp b/WebCore/plugins/PluginData.cpp
deleted file mode 100644
index d24d234..0000000
--- a/WebCore/plugins/PluginData.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- Copyright (C) 2000 Harri Porten (porten@kde.org)
- Copyright (C) 2000 Daniel Molkentin (molkentin@kde.org)
- Copyright (C) 2000 Stefan Schimanski (schimmi@kde.org)
- Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All Rights Reserved.
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "config.h"
-#include "PluginData.h"
-
-#if USE(PLATFORM_STRATEGIES)
-#include "PlatformStrategies.h"
-#include "PluginStrategy.h"
-#endif
-
-namespace WebCore {
-
-PluginData::PluginData(const Page* page)
- : m_page(page)
-{
- initPlugins();
-
- for (unsigned i = 0; i < m_plugins.size(); ++i) {
- const PluginInfo& plugin = m_plugins[i];
- for (unsigned j = 0; j < plugin.mimes.size(); ++j) {
- m_mimes.append(plugin.mimes[j]);
- m_mimePluginIndices.append(i);
- }
- }
-}
-
-bool PluginData::supportsMimeType(const String& mimeType) const
-{
- for (unsigned i = 0; i < m_mimes.size(); ++i)
- if (m_mimes[i].type == mimeType)
- return true;
- return false;
-}
-
-String PluginData::pluginNameForMimeType(const String& mimeType) const
-{
- for (unsigned i = 0; i < m_mimes.size(); ++i) {
- const MimeClassInfo& info = m_mimes[i];
-
- if (info.type == mimeType)
- return m_plugins[m_mimePluginIndices[i]].name;
- }
-
- return String();
-}
-
-#if USE(PLATFORM_STRATEGIES)
-void PluginData::refresh()
-{
- platformStrategies()->pluginStrategy()->refreshPlugins();
-}
-
-void PluginData::initPlugins()
-{
- ASSERT(m_plugins.isEmpty());
-
- platformStrategies()->pluginStrategy()->getPluginInfo(m_page, m_plugins);
-}
-#endif
-
-}
diff --git a/WebCore/plugins/PluginData.h b/WebCore/plugins/PluginData.h
deleted file mode 100644
index f4cc62f..0000000
--- a/WebCore/plugins/PluginData.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef PluginData_h
-#define PluginData_h
-
-#include <wtf/RefCounted.h>
-#include <wtf/Vector.h>
-#include "PlatformString.h"
-
-namespace WebCore {
-
-class Page;
-struct PluginInfo;
-
-struct MimeClassInfo {
- String type;
- String desc;
- Vector<String> extensions;
-};
-
-inline bool operator==(const MimeClassInfo& a, const MimeClassInfo& b)
-{
- return a.type == b.type && a.desc == b.desc && a.extensions == b.extensions;
-}
-
-struct PluginInfo {
- String name;
- String file;
- String desc;
- Vector<MimeClassInfo> mimes;
-};
-
-// FIXME: merge with PluginDatabase in the future
-class PluginData : public RefCounted<PluginData> {
-public:
- static PassRefPtr<PluginData> create(const Page* page) { return adoptRef(new PluginData(page)); }
-
- void disconnectPage() { m_page = 0; }
- const Page* page() const { return m_page; }
-
- const Vector<PluginInfo>& plugins() const { return m_plugins; }
- const Vector<MimeClassInfo>& mimes() const { return m_mimes; }
- const Vector<size_t>& mimePluginIndices() const { return m_mimePluginIndices; }
-
- bool supportsMimeType(const String& mimeType) const;
- String pluginNameForMimeType(const String& mimeType) const;
-
- static void refresh();
-
-private:
- PluginData(const Page*);
- void initPlugins();
-
- Vector<PluginInfo> m_plugins;
- Vector<MimeClassInfo> m_mimes;
- Vector<size_t> m_mimePluginIndices;
-
- const Page* m_page;
-};
-
-}
-
-#endif
diff --git a/WebCore/plugins/PluginDataNone.cpp b/WebCore/plugins/PluginDataNone.cpp
deleted file mode 100644
index 3b98383..0000000
--- a/WebCore/plugins/PluginDataNone.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 Kevin Ollivier <kevino@theolliviers.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 APPLE INC. ``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 APPLE INC. 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.
- */
-
-
-#include "config.h"
-#include "PluginData.h"
-
-namespace WebCore {
-
-void PluginData::initPlugins()
-{
-}
-
-void PluginData::refresh()
-{
-}
-
-};
diff --git a/WebCore/plugins/PluginDatabase.cpp b/WebCore/plugins/PluginDatabase.cpp
deleted file mode 100644
index b9e154a..0000000
--- a/WebCore/plugins/PluginDatabase.cpp
+++ /dev/null
@@ -1,675 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginDatabase.h"
-
-#include "Frame.h"
-#include "KURL.h"
-#include "PluginPackage.h"
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
-#include "FileSystem.h"
-#endif
-#include <stdlib.h>
-#include <wtf/text/CString.h>
-
-#if PLATFORM(ANDROID)
-#include "JavaSharedClient.h"
-#include "PluginClient.h"
-#endif
-
-namespace WebCore {
-
-typedef HashMap<String, RefPtr<PluginPackage> > PluginPackageByNameMap;
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
-static const size_t maximumPersistentPluginMetadataCacheSize = 32768;
-
-static bool gPersistentPluginMetadataCacheIsEnabled;
-
-String& persistentPluginMetadataCachePath()
-{
- DEFINE_STATIC_LOCAL(String, cachePath, ());
- return cachePath;
-}
-#endif
-
-PluginDatabase::PluginDatabase()
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- : m_persistentMetadataCacheIsLoaded(false)
-#endif
-{
-}
-
-PluginDatabase* PluginDatabase::installedPlugins(bool populate)
-{
- static PluginDatabase* plugins = 0;
-
- if (!plugins) {
- plugins = new PluginDatabase;
-
- if (populate) {
- plugins->setPluginDirectories(PluginDatabase::defaultPluginDirectories());
- plugins->refresh();
- }
- }
-
- return plugins;
-}
-
-bool PluginDatabase::isMIMETypeRegistered(const String& mimeType)
-{
- if (mimeType.isNull())
- return false;
- if (m_registeredMIMETypes.contains(mimeType))
- return true;
- // No plugin was found, try refreshing the database and searching again
- return (refresh() && m_registeredMIMETypes.contains(mimeType));
-}
-
-void PluginDatabase::addExtraPluginDirectory(const String& directory)
-{
- m_pluginDirectories.append(directory);
- refresh();
-}
-
-bool PluginDatabase::refresh()
-{
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- if (!m_persistentMetadataCacheIsLoaded)
- loadPersistentMetadataCache();
-#endif
- bool pluginSetChanged = false;
-
- if (!m_plugins.isEmpty()) {
- PluginSet pluginsToUnload;
- getDeletedPlugins(pluginsToUnload);
-
- // Unload plugins
- PluginSet::const_iterator end = pluginsToUnload.end();
- for (PluginSet::const_iterator it = pluginsToUnload.begin(); it != end; ++it)
- remove(it->get());
-
- pluginSetChanged = !pluginsToUnload.isEmpty();
- }
-
- HashSet<String> paths;
- getPluginPathsInDirectories(paths);
-
- HashMap<String, time_t> pathsWithTimes;
-
- // We should only skip unchanged files if we didn't remove any plugins above. If we did remove
- // any plugins, we need to look at every plugin file so that, e.g., if the user has two versions
- // of RealPlayer installed and just removed the newer one, we'll pick up the older one.
- bool shouldSkipUnchangedFiles = !pluginSetChanged;
-
- HashSet<String>::const_iterator pathsEnd = paths.end();
- for (HashSet<String>::const_iterator it = paths.begin(); it != pathsEnd; ++it) {
- time_t lastModified;
- if (!getFileModificationTime(*it, lastModified))
- continue;
-
- pathsWithTimes.add(*it, lastModified);
-
- // If the path's timestamp hasn't changed since the last time we ran refresh(), we don't have to do anything.
- if (shouldSkipUnchangedFiles && m_pluginPathsWithTimes.get(*it) == lastModified)
- continue;
-
- if (RefPtr<PluginPackage> oldPackage = m_pluginsByPath.get(*it)) {
- ASSERT(!shouldSkipUnchangedFiles || oldPackage->lastModified() != lastModified);
- remove(oldPackage.get());
- }
-
- RefPtr<PluginPackage> package = PluginPackage::createPackage(*it, lastModified);
- if (package && add(package.release()))
- pluginSetChanged = true;
- }
-
- // Cache all the paths we found with their timestamps for next time.
- pathsWithTimes.swap(m_pluginPathsWithTimes);
-
- if (!pluginSetChanged)
- return false;
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- updatePersistentMetadataCache();
-#endif
-
- m_registeredMIMETypes.clear();
-
- // Register plug-in MIME types
- 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 (; map_it != map_end; ++map_it)
- m_registeredMIMETypes.add(map_it->first);
- }
-
- return true;
-}
-
-Vector<PluginPackage*> PluginDatabase::plugins() const
-{
- Vector<PluginPackage*> result;
-
- PluginSet::const_iterator end = m_plugins.end();
- for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it)
- result.append((*it).get());
-
- return result;
-}
-
-int PluginDatabase::preferredPluginCompare(const void* a, const void* b)
-{
- PluginPackage* pluginA = *static_cast<PluginPackage* const*>(a);
- PluginPackage* pluginB = *static_cast<PluginPackage* const*>(b);
-
- return pluginA->compare(*pluginB);
-}
-
-PluginPackage* PluginDatabase::pluginForMIMEType(const String& mimeType)
-{
- if (mimeType.isEmpty())
- return 0;
-
- 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) {
- PluginPackage* plugin = (*it).get();
-
- if (!plugin->isEnabled())
- continue;
-
- if (plugin->mimeToDescriptions().contains(key)) {
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- if (!plugin->ensurePluginLoaded())
- continue;
-#endif
- pluginChoices.append(plugin);
- }
- }
-
- if (pluginChoices.isEmpty())
- return 0;
-
- qsort(pluginChoices.data(), pluginChoices.size(), sizeof(PluginPackage*), PluginDatabase::preferredPluginCompare);
-
- return pluginChoices[0];
-}
-
-String PluginDatabase::MIMETypeForExtension(const String& extension) const
-{
- if (extension.isEmpty())
- return String();
-
- PluginSet::const_iterator end = m_plugins.end();
- String mimeType;
- Vector<PluginPackage*, 2> pluginChoices;
- 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;
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- if (!plugin->ensurePluginLoaded())
- continue;
-#endif
- pluginChoices.append(plugin);
- mimeTypeForPlugin.add(plugin, mimeType);
- foundMapping = true;
- break;
- }
- }
- if (foundMapping)
- break;
- }
- }
-
- if (pluginChoices.isEmpty())
- return String();
-
- qsort(pluginChoices.data(), pluginChoices.size(), sizeof(PluginPackage*), PluginDatabase::preferredPluginCompare);
-
- return mimeTypeForPlugin.get(pluginChoices[0]);
-}
-
-PluginPackage* PluginDatabase::findPlugin(const KURL& url, String& mimeType)
-{
- if (!mimeType.isEmpty())
- return pluginForMIMEType(mimeType);
-
- String filename = url.lastPathComponent();
- if (filename.endsWith("/"))
- return 0;
-
- int extensionPos = filename.reverseFind('.');
- if (extensionPos == -1)
- return 0;
-
- String mimeTypeForExtension = MIMETypeForExtension(filename.substring(extensionPos + 1));
- PluginPackage* plugin = pluginForMIMEType(mimeTypeForExtension);
- if (!plugin) {
- // FIXME: if no plugin could be found, query Windows for the mime type
- // corresponding to the extension.
- return 0;
- }
-
- mimeType = mimeTypeForExtension;
- 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();
- for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
- if (!fileExists((*it)->path()))
- plugins.add(*it);
- }
-}
-
-bool PluginDatabase::add(PassRefPtr<PluginPackage> prpPackage)
-{
- ASSERT_ARG(prpPackage, prpPackage);
-
- RefPtr<PluginPackage> package = prpPackage;
-
- if (!m_plugins.add(package).second)
- return false;
-
- m_pluginsByPath.add(package->path(), package);
- return true;
-}
-
-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());
-}
-
-void PluginDatabase::clear()
-{
- m_plugins.clear();
- m_pluginsByPath.clear();
- m_pluginPathsWithTimes.clear();
- m_registeredMIMETypes.clear();
- m_preferredPlugins.clear();
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- m_persistentMetadataCacheIsLoaded = false;
-#endif
-}
-
-#if (!OS(WINCE)) && (!OS(SYMBIAN)) && (!OS(WINDOWS) || !ENABLE(NETSCAPE_PLUGIN_API))
-// For Safari/Win the following three methods are implemented
-// in PluginDatabaseWin.cpp, but if we can use WebCore constructs
-// for the logic we should perhaps move it here under XP_WIN?
-
-Vector<String> PluginDatabase::defaultPluginDirectories()
-{
- Vector<String> paths;
-
- // Add paths specific to each platform
-#if defined(XP_UNIX)
- String userPluginPath = homeDirectoryPath();
- userPluginPath.append(String("/.mozilla/plugins"));
- paths.append(userPluginPath);
-
- userPluginPath = homeDirectoryPath();
- userPluginPath.append(String("/.netscape/plugins"));
- paths.append(userPluginPath);
-
- paths.append("/usr/lib/browser/plugins");
- paths.append("/usr/local/lib/mozilla/plugins");
- paths.append("/usr/lib/firefox/plugins");
- paths.append("/usr/lib64/browser-plugins");
- paths.append("/usr/lib/browser-plugins");
- paths.append("/usr/lib/mozilla/plugins");
- paths.append("/usr/local/netscape/plugins");
- paths.append("/opt/mozilla/plugins");
- paths.append("/opt/mozilla/lib/plugins");
- paths.append("/opt/netscape/plugins");
- paths.append("/opt/netscape/communicator/plugins");
- paths.append("/usr/lib/netscape/plugins");
- paths.append("/usr/lib/netscape/plugins-libc5");
- paths.append("/usr/lib/netscape/plugins-libc6");
- paths.append("/usr/lib64/netscape/plugins");
- paths.append("/usr/lib64/mozilla/plugins");
- paths.append("/usr/lib/nsbrowser/plugins");
- paths.append("/usr/lib64/nsbrowser/plugins");
-
- String mozHome(getenv("MOZILLA_HOME"));
- mozHome.append("/plugins");
- paths.append(mozHome);
-
- Vector<String> mozPaths;
- String mozPath(getenv("MOZ_PLUGIN_PATH"));
- mozPath.split(UChar(':'), /* allowEmptyEntries */ false, mozPaths);
- paths.append(mozPaths);
-#elif defined(XP_MACOSX)
- String userPluginPath = homeDirectoryPath();
- userPluginPath.append(String("/Library/Internet Plug-Ins"));
- paths.append(userPluginPath);
- paths.append("/Library/Internet Plug-Ins");
-#elif defined(XP_WIN)
- String userPluginPath = homeDirectoryPath();
- userPluginPath.append(String("\\Application Data\\Mozilla\\plugins"));
- paths.append(userPluginPath);
-#endif
-
- // Add paths specific to each port
-#if PLATFORM(QT)
- Vector<String> qtPaths;
- String qtPath(qgetenv("QTWEBKIT_PLUGIN_PATH").constData());
- qtPath.split(UChar(':'), /* allowEmptyEntries */ false, qtPaths);
- paths.append(qtPaths);
-#endif
-
-#if PLATFORM(ANDROID)
- if (android::JavaSharedClient::GetPluginClient())
- return android::JavaSharedClient::GetPluginClient()->getPluginDirectories();
-#endif
-
- return paths;
-}
-
-bool PluginDatabase::isPreferredPluginDirectory(const String& path)
-{
- String preferredPath = homeDirectoryPath();
-
-#if defined(XP_UNIX)
- preferredPath.append(String("/.mozilla/plugins"));
-#elif defined(XP_MACOSX)
- preferredPath.append(String("/Library/Internet Plug-Ins"));
-#elif defined(XP_WIN)
- preferredPath.append(String("\\Application Data\\Mozilla\\plugins"));
-#endif
-
- // TODO: We should normalize the path before doing a comparison.
- return path == preferredPath;
-}
-
-void PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const
-{
- // FIXME: This should be a case insensitive set.
- HashSet<String> uniqueFilenames;
-
-#if defined(XP_UNIX) || defined(ANDROID)
- String fileNameFilter("*.so");
-#else
- String fileNameFilter("");
-#endif
-
- Vector<String>::const_iterator dirsEnd = m_pluginDirectories.end();
- for (Vector<String>::const_iterator dIt = m_pluginDirectories.begin(); dIt != dirsEnd; ++dIt) {
- Vector<String> pluginPaths = listDirectory(*dIt, fileNameFilter);
- Vector<String>::const_iterator pluginsEnd = pluginPaths.end();
- for (Vector<String>::const_iterator pIt = pluginPaths.begin(); pIt != pluginsEnd; ++pIt) {
- if (!fileExists(*pIt))
- continue;
-
- paths.add(*pIt);
- }
- }
-}
-
-#endif // !OS(SYMBIAN) && !OS(WINDOWS)
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
-
-static void fillBufferWithContentsOfFile(PlatformFileHandle file, Vector<char>& buffer)
-{
- size_t bufferSize = 0;
- size_t bufferCapacity = 1024;
- buffer.resize(bufferCapacity);
-
- do {
- bufferSize += readFromFile(file, buffer.data() + bufferSize, bufferCapacity - bufferSize);
- if (bufferSize == bufferCapacity) {
- if (bufferCapacity < maximumPersistentPluginMetadataCacheSize) {
- bufferCapacity *= 2;
- buffer.resize(bufferCapacity);
- } else {
- buffer.clear();
- return;
- }
- } else
- break;
- } while (true);
-
- buffer.shrink(bufferSize);
-}
-
-static bool readUTF8String(String& resultString, char*& start, const char* end)
-{
- if (start >= end)
- return false;
-
- int len = strlen(start);
- resultString = String::fromUTF8(start, len);
- start += len + 1;
-
- return true;
-}
-
-static bool readTime(time_t& resultTime, char*& start, const char* end)
-{
- if (start + sizeof(time_t) >= end)
- return false;
-
- resultTime = *reinterpret_cast_ptr<time_t*>(start);
- start += sizeof(time_t);
-
- return true;
-}
-
-static const char schemaVersion = '1';
-static const char persistentPluginMetadataCacheFilename[] = "PluginMetadataCache.bin";
-
-void PluginDatabase::loadPersistentMetadataCache()
-{
- if (!isPersistentMetadataCacheEnabled() || persistentMetadataCachePath().isEmpty())
- return;
-
- PlatformFileHandle file;
- String absoluteCachePath = pathByAppendingComponent(persistentMetadataCachePath(), persistentPluginMetadataCacheFilename);
- file = openFile(absoluteCachePath, OpenForRead);
-
- if (!isHandleValid(file))
- return;
-
- // Mark cache as loaded regardless of success or failure. If
- // there's error in the cache, we won't try to load it anymore.
- m_persistentMetadataCacheIsLoaded = true;
-
- Vector<char> fileContents;
- fillBufferWithContentsOfFile(file, fileContents);
- closeFile(file);
-
- if (fileContents.size() < 2 || fileContents.first() != schemaVersion || fileContents.last() != '\0') {
- LOG_ERROR("Unable to read plugin metadata cache: corrupt schema");
- deleteFile(absoluteCachePath);
- return;
- }
-
- char* bufferPos = fileContents.data() + 1;
- char* end = fileContents.data() + fileContents.size();
-
- PluginSet cachedPlugins;
- HashMap<String, time_t> cachedPluginPathsWithTimes;
- HashMap<String, RefPtr<PluginPackage> > cachedPluginsByPath;
-
- while (bufferPos < end) {
- String path;
- time_t lastModified;
- String name;
- String desc;
- String mimeDesc;
- if (!(readUTF8String(path, bufferPos, end)
- && readTime(lastModified, bufferPos, end)
- && readUTF8String(name, bufferPos, end)
- && readUTF8String(desc, bufferPos, end)
- && readUTF8String(mimeDesc, bufferPos, end))) {
- LOG_ERROR("Unable to read plugin metadata cache: corrupt data");
- deleteFile(absoluteCachePath);
- return;
- }
-
- // Skip metadata that points to plugins from directories that
- // are not part of plugin directory list anymore.
- String pluginDirectoryName = directoryName(path);
- if (m_pluginDirectories.find(pluginDirectoryName) == WTF::notFound)
- continue;
-
- RefPtr<PluginPackage> package = PluginPackage::createPackageFromCache(path, lastModified, name, desc, mimeDesc);
-
- if (package && cachedPlugins.add(package).second) {
- cachedPluginPathsWithTimes.add(package->path(), package->lastModified());
- cachedPluginsByPath.add(package->path(), package);
- }
- }
-
- m_plugins.swap(cachedPlugins);
- m_pluginsByPath.swap(cachedPluginsByPath);
- m_pluginPathsWithTimes.swap(cachedPluginPathsWithTimes);
-}
-
-static bool writeUTF8String(PlatformFileHandle file, const String& string)
-{
- CString utf8String = string.utf8();
- int length = utf8String.length() + 1;
- return writeToFile(file, utf8String.data(), length) == length;
-}
-
-static bool writeTime(PlatformFileHandle file, const time_t& time)
-{
- return writeToFile(file, reinterpret_cast<const char*>(&time), sizeof(time_t)) == sizeof(time_t);
-}
-
-void PluginDatabase::updatePersistentMetadataCache()
-{
- if (!isPersistentMetadataCacheEnabled() || persistentMetadataCachePath().isEmpty())
- return;
-
- makeAllDirectories(persistentMetadataCachePath());
- String absoluteCachePath = pathByAppendingComponent(persistentMetadataCachePath(), persistentPluginMetadataCacheFilename);
- deleteFile(absoluteCachePath);
-
- if (m_plugins.isEmpty())
- return;
-
- PlatformFileHandle file;
- file = openFile(absoluteCachePath, OpenForWrite);
-
- if (!isHandleValid(file)) {
- LOG_ERROR("Unable to open plugin metadata cache for saving");
- return;
- }
-
- char localSchemaVersion = schemaVersion;
- if (writeToFile(file, &localSchemaVersion, 1) != 1) {
- LOG_ERROR("Unable to write plugin metadata cache schema");
- closeFile(file);
- deleteFile(absoluteCachePath);
- return;
- }
-
- PluginSet::const_iterator end = m_plugins.end();
- for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
- if (!(writeUTF8String(file, (*it)->path())
- && writeTime(file, (*it)->lastModified())
- && writeUTF8String(file, (*it)->name())
- && writeUTF8String(file, (*it)->description())
- && writeUTF8String(file, (*it)->fullMIMEDescription()))) {
- LOG_ERROR("Unable to write plugin metadata to cache");
- closeFile(file);
- deleteFile(absoluteCachePath);
- return;
- }
- }
-
- closeFile(file);
-}
-
-bool PluginDatabase::isPersistentMetadataCacheEnabled()
-{
- return gPersistentPluginMetadataCacheIsEnabled;
-}
-
-void PluginDatabase::setPersistentMetadataCacheEnabled(bool isEnabled)
-{
- gPersistentPluginMetadataCacheIsEnabled = isEnabled;
-}
-
-String PluginDatabase::persistentMetadataCachePath()
-{
- return WebCore::persistentPluginMetadataCachePath();
-}
-
-void PluginDatabase::setPersistentMetadataCachePath(const String& persistentMetadataCachePath)
-{
- WebCore::persistentPluginMetadataCachePath() = persistentMetadataCachePath;
-}
-#endif
-}
diff --git a/WebCore/plugins/PluginDatabase.h b/WebCore/plugins/PluginDatabase.h
deleted file mode 100644
index b1e1525..0000000
--- a/WebCore/plugins/PluginDatabase.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
- * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 PluginDatabase_h
-#define PluginDatabase_h
-
-#include "PlatformString.h"
-#include "PluginPackage.h"
-#include <wtf/HashSet.h>
-#include <wtf/Vector.h>
-#include <wtf/text/StringHash.h>
-
-#if defined(ANDROID_PLUGINS)
-namespace android {
- class WebSettings;
-}
-#endif
-
-namespace WebCore {
- class Element;
- class Frame;
- class IntSize;
- class KURL;
- class PluginDatabaseClient;
- class PluginPackage;
-
- typedef HashSet<RefPtr<PluginPackage>, PluginPackageHash> PluginSet;
-
- class PluginDatabase : public Noncopyable {
- 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
- // automatically, as the plugins might affect the DRT results by
- // writing to a.o. stderr.
- static PluginDatabase* installedPlugins(bool populate = true);
-
- bool refresh();
- void clear();
- Vector<PluginPackage*> plugins() const;
- bool isMIMETypeRegistered(const String& mimeType);
- void addExtraPluginDirectory(const String&);
-
- static bool isPreferredPluginDirectory(const String& directory);
- 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)
- {
- clear();
- m_pluginDirectories = directories;
- }
-
- static Vector<String> defaultPluginDirectories();
- Vector<String> pluginDirectories() const { return m_pluginDirectories; }
-
- String MIMETypeForExtension(const String& extension) const;
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- static bool isPersistentMetadataCacheEnabled();
- static void setPersistentMetadataCacheEnabled(bool isEnabled);
- static String persistentMetadataCachePath();
- static void setPersistentMetadataCachePath(const String& persistentMetadataCachePath);
-#endif
-
- private:
- void getPluginPathsInDirectories(HashSet<String>&) const;
- void getDeletedPlugins(PluginSet&) const;
-
- // Returns whether the plugin was actually added or not (it won't be added if it's a duplicate of an existing plugin).
- bool add(PassRefPtr<PluginPackage>);
- void remove(PluginPackage*);
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- void loadPersistentMetadataCache();
- void updatePersistentMetadataCache();
-#endif
-
- Vector<String> m_pluginDirectories;
- HashSet<String> m_registeredMIMETypes;
- PluginSet m_plugins;
- HashMap<String, RefPtr<PluginPackage> > m_pluginsByPath;
- HashMap<String, time_t> m_pluginPathsWithTimes;
-
-#if defined(ANDROID_PLUGINS)
- // Need access to setPluginDirectories() to change the default
- // path after startup.
- friend class ::android::WebSettings;
-#endif
- HashMap<String, RefPtr<PluginPackage> > m_preferredPlugins;
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- bool m_persistentMetadataCacheIsLoaded;
-#endif
- };
-
-} // namespace WebCore
-
-#endif
diff --git a/WebCore/plugins/PluginDebug.cpp b/WebCore/plugins/PluginDebug.cpp
deleted file mode 100644
index 8c3efcb..0000000
--- a/WebCore/plugins/PluginDebug.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginDebug.h"
-#include "PlatformString.h"
-
-#if !LOG_DISABLED
-
-namespace WebCore {
-
-static const char* const errorStrings[] = {
- "No errors occurred.", /* NPERR_NO_ERROR */
- "Error with no specific error code occurred.", /* NPERR_GENERIC_ERROR */
- "Invalid instance passed to the plug-in.", /* NPERR_INVALID_INSTANCE_ERROR */
- "Function table invalid.", /* NPERR_INVALID_FUNCTABLE_ERROR */
- "Loading of plug-in failed.", /* NPERR_MODULE_LOAD_FAILED_ERROR */
- "Memory allocation failed.", /* NPERR_OUT_OF_MEMORY_ERROR */
- "Plug-in missing or invalid.", /* NPERR_INVALID_PLUGIN_ERROR */
- "Plug-in directory missing or invalid.", /* NPERR_INVALID_PLUGIN_DIR_ERROR */
- "Versions of plug-in and Communicator do not match.", /* NPERR_INCOMPATIBLE_VERSION_ERROR */
- "Parameter missing or invalid.", /* NPERR_INVALID_PARAM */
- "URL missing or invalid.", /* NPERR_INVALID_URL */
- "File missing or invalid.", /* NPERR_FILE_NOT_FOUND */
- "Stream contains no data.", /* NPERR_NO_DATA */
- "Seekable stream expected.", /* NPERR_STREAM_NOT_SEEKABLE */
- "Unknown error code"
-};
-
-#ifdef XP_MACOSX
-static const char* const drawingModels[] = {
- "NPDrawingModelQuickDraw",
- "NPDrawingModelCoreGraphics",
- "NPDrawingModelOpenGL",
- "NPDrawingModelCoreAnimation"
-};
-
-static const char* const eventModels[] = {
- "NPEventModelCarbon",
- "NPEventModelCocoa"
-};
-#endif //XP_MACOSX
-
-const char* prettyNameForNPError(NPError error)
-{
- return errorStrings[error];
-}
-
-#ifdef XP_MACOSX
-const char* prettyNameForDrawingModel(NPDrawingModel drawingModel)
-{
- return drawingModels[drawingModel];
-}
-
-const char* prettyNameForEventModel(NPEventModel eventModel)
-{
- return eventModels[eventModel];
-}
-#endif //XP_MACOSX
-
-CString prettyNameForNPNVariable(NPNVariable variable)
-{
- switch (variable) {
- case NPNVxDisplay: return "NPNVxDisplay";
- case NPNVxtAppContext: return "NPNVxtAppContext";
- case NPNVnetscapeWindow: return "NPNVnetscapeWindow";
- case NPNVjavascriptEnabledBool: return "NPNVjavascriptEnabledBool";
- case NPNVasdEnabledBool: return "NPNVasdEnabledBool";
- case NPNVisOfflineBool: return "NPNVisOfflineBool";
-
- case NPNVserviceManager: return "NPNVserviceManager (not supported)";
- case NPNVDOMElement: return "NPNVDOMElement (not supported)";
- case NPNVDOMWindow: return "NPNVDOMWindow (not supported)";
- case NPNVToolkit: return "NPNVToolkit (not supported)";
- case NPNVSupportsXEmbedBool: return "NPNVSupportsXEmbedBool (not supported)";
-
- case NPNVWindowNPObject: return "NPNVWindowNPObject";
- case NPNVPluginElementNPObject: return "NPNVPluginElementNPObject";
- case NPNVSupportsWindowless: return "NPNVSupportsWindowless";
- case NPNVprivateModeBool: return "NPNVprivateModeBool";
-
-#ifdef XP_MACOSX
- case NPNVpluginDrawingModel: return "NPNVpluginDrawingModel";
-#ifndef NP_NO_QUICKDRAW
- case NPNVsupportsQuickDrawBool: return "NPNVsupportsQuickDrawBool";
-#endif
- case NPNVsupportsCoreGraphicsBool: return "NPNVsupportsCoreGraphicsBool";
- case NPNVsupportsOpenGLBool: return "NPNVsupportsOpenGLBool";
- case NPNVsupportsCoreAnimationBool: return "NPNVsupportsCoreAnimationBool";
-#ifndef NP_NO_CARBON
- case NPNVsupportsCarbonBool: return "NPNVsupportsCarbonBool";
-#endif
- case NPNVsupportsCocoaBool: return "NPNVsupportsCocoaBool";
-#endif
-
- default: return "Unknown variable";
- }
-}
-
-CString prettyNameForNPPVariable(NPPVariable variable, void* value)
-{
- switch (variable) {
- case NPPVpluginNameString: return "NPPVpluginNameString";
- case NPPVpluginDescriptionString: return "NPPVpluginDescriptionString";
- case NPPVpluginWindowBool: return "NPPVpluginWindowBool";
- case NPPVpluginTransparentBool: return "NPPVpluginTransparentBool";
-
- case NPPVjavaClass: return "NPPVjavaClass (not supported)";
- case NPPVpluginWindowSize: return "NPPVpluginWindowSize (not supported)";
- case NPPVpluginTimerInterval: return "NPPVpluginTimerInterval (not supported)";
- case NPPVpluginScriptableInstance: return "NPPVpluginScriptableInstance (not supported)";
- case NPPVpluginScriptableIID: return "NPPVpluginScriptableIID (not supported)";
- case NPPVjavascriptPushCallerBool: return "NPPVjavascriptPushCallerBool (not supported)";
- case NPPVpluginKeepLibraryInMemory: return "NPPVpluginKeepLibraryInMemory (not supported)";
- case NPPVpluginNeedsXEmbed: return "NPPVpluginNeedsXEmbed (not supported)";
-
- case NPPVpluginScriptableNPObject: return "NPPVpluginScriptableNPObject";
-
- case NPPVformValue: return "NPPVformValue (not supported)";
- case NPPVpluginUrlRequestsDisplayedBool: return "NPPVpluginUrlRequestsDisplayedBool (not supported)";
-
- case NPPVpluginWantsAllNetworkStreams: return "NPPVpluginWantsAllNetworkStreams";
- case NPPVpluginCancelSrcStream: return "NPPVpluginCancelSrcStream";
-
-#ifdef XP_MACOSX
- case NPPVpluginDrawingModel: {
- String result("NPPVpluginDrawingModel, ");
- result.append(prettyNameForDrawingModel(NPDrawingModel(uintptr_t(value))));
- return result.latin1();
- }
- case NPPVpluginEventModel: {
- String result("NPPVpluginEventModel, ");
- result.append(prettyNameForEventModel(NPEventModel(uintptr_t(value))));
- return result.latin1();
- }
- case NPPVpluginCoreAnimationLayer: return "NPPVpluginCoreAnimationLayer";
-#endif
-
- default: return "Unknown variable";
- }
-}
-
-CString prettyNameForNPNURLVariable(NPNURLVariable variable)
-{
- switch (variable) {
- case NPNURLVCookie: return "NPNURLVCookie";
- case NPNURLVProxy: return "NPNURLVProxy";
- default: return "Unknown variable";
- }
-}
-} // namespace WebCore
-
-#endif // !LOG_DISABLED
diff --git a/WebCore/plugins/PluginDebug.h b/WebCore/plugins/PluginDebug.h
deleted file mode 100644
index 017e686..0000000
--- a/WebCore/plugins/PluginDebug.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 PluginDebug_h
-#define PluginDebug_h
-
-#include "Logging.h"
-#include "npruntime_internal.h"
-#include <wtf/text/CString.h>
-
-#define LOG_NPERROR(err) if (err != NPERR_NO_ERROR) LOG_VERBOSE(Plugins, "%s\n", prettyNameForNPError(err))
-#define LOG_PLUGIN_NET_ERROR() LOG_VERBOSE(Plugins, "Stream failed due to problems with network, disk I/O, lack of memory, or other problems.\n")
-
-#if !LOG_DISABLED
-
-namespace WebCore {
-
-const char* prettyNameForNPError(NPError error);
-
-CString prettyNameForNPNVariable(NPNVariable variable);
-CString prettyNameForNPPVariable(NPPVariable variable, void* value);
-CString prettyNameForNPNURLVariable(NPNURLVariable variable);
-
-#ifdef XP_MACOSX
-const char* prettyNameForDrawingModel(NPDrawingModel drawingModel);
-const char* prettyNameForEventModel(NPEventModel eventModel);
-#endif
-
-} // namespace WebCore
-
-#endif // !LOG_DISABLED
-
-#endif // PluginDebug_h
diff --git a/WebCore/plugins/PluginMainThreadScheduler.cpp b/WebCore/plugins/PluginMainThreadScheduler.cpp
deleted file mode 100644
index 7528676..0000000
--- a/WebCore/plugins/PluginMainThreadScheduler.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc. 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 APPLE INC. ``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 APPLE INC. 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.
- */
-
-#include "config.h"
-#include "PluginMainThreadScheduler.h"
-#include <wtf/StdLibExtras.h>
-
-namespace WebCore {
-
-PluginMainThreadScheduler& PluginMainThreadScheduler::scheduler()
-{
- DEFINE_STATIC_LOCAL(PluginMainThreadScheduler, scheduler, ());
-
- return scheduler;
-}
-
-PluginMainThreadScheduler::PluginMainThreadScheduler()
- : m_callPending(false)
-{
-}
-
-void PluginMainThreadScheduler::scheduleCall(NPP npp, MainThreadFunction function, void* userData)
-{
- MutexLocker lock(m_queueMutex);
-
- CallQueueMap::iterator it = m_callQueueMap.find(npp);
- if (it == m_callQueueMap.end())
- return;
-
- it->second.append(Call(function, userData));
-
- if (!m_callPending) {
- callOnMainThread(mainThreadCallback, this);
- m_callPending = true;
- }
-}
-
-void PluginMainThreadScheduler::registerPlugin(NPP npp)
-{
- MutexLocker lock(m_queueMutex);
-
- ASSERT(!m_callQueueMap.contains(npp));
- m_callQueueMap.set(npp, Deque<Call>());
-}
-
-void PluginMainThreadScheduler::unregisterPlugin(NPP npp)
-{
- MutexLocker lock(m_queueMutex);
-
- ASSERT(m_callQueueMap.contains(npp));
- m_callQueueMap.remove(npp);
-}
-
-void PluginMainThreadScheduler::dispatchCallsForPlugin(NPP npp, const Deque<Call>& calls)
-{
- Deque<Call>::const_iterator end = calls.end();
- for (Deque<Call>::const_iterator it = calls.begin(); it != end; ++it) {
- // Check if the plug-in has been destroyed.
- {
- MutexLocker lock(m_queueMutex);
- if (!m_callQueueMap.contains(npp))
- return;
- }
-
- (*it).performCall();
- }
-}
-
-void PluginMainThreadScheduler::dispatchCalls()
-{
- m_queueMutex.lock();
- CallQueueMap copy(m_callQueueMap);
-
- {
- // Empty all the queues in the original map
- CallQueueMap::iterator end = m_callQueueMap.end();
- for (CallQueueMap::iterator it = m_callQueueMap.begin(); it != end; ++it)
- it->second.clear();
- }
-
- m_callPending = false;
- m_queueMutex.unlock();
-
- CallQueueMap::iterator end = copy.end();
- for (CallQueueMap::iterator it = copy.begin(); it != end; ++it)
- dispatchCallsForPlugin(it->first, it->second);
-}
-
-void PluginMainThreadScheduler::mainThreadCallback(void* context)
-{
- static_cast<PluginMainThreadScheduler*>(context)->dispatchCalls();
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/PluginMainThreadScheduler.h b/WebCore/plugins/PluginMainThreadScheduler.h
deleted file mode 100644
index 610e89c..0000000
--- a/WebCore/plugins/PluginMainThreadScheduler.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc. 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 APPLE INC. ``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 APPLE INC. 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 PluginMainThreadScheduler_h
-#define PluginMainThreadScheduler_h
-
-#include <wtf/Deque.h>
-#include <wtf/HashMap.h>
-#include <wtf/MainThread.h>
-#include <wtf/Threading.h>
-
-typedef struct _NPP NPP_t;
-typedef NPP_t* NPP;
-
-namespace WebCore {
-
-class PluginMainThreadScheduler : public Noncopyable {
-public:
- typedef void MainThreadFunction(void*);
-
- static PluginMainThreadScheduler& scheduler();
-
- void scheduleCall(NPP, MainThreadFunction*, void* userData);
-
- void registerPlugin(NPP);
- void unregisterPlugin(NPP);
-
-private:
- PluginMainThreadScheduler();
- void dispatchCalls();
-
- class Call;
-
- void dispatchCallsForPlugin(NPP, const Deque<Call>& calls);
- typedef HashMap<NPP, Deque<Call> > CallQueueMap;
-
- static void mainThreadCallback(void* context);
-
- class Call {
- public:
- Call(MainThreadFunction* function, void* userData)
- : m_function(function)
- , m_userData(userData)
- {
- }
-
- void performCall() const
- {
- m_function(m_userData);
- }
-
- private:
- MainThreadFunction* m_function;
- void* m_userData;
- };
-
- bool m_callPending;
- CallQueueMap m_callQueueMap;
- Mutex m_queueMutex;
-};
-
-} // namespace WebCore
-
-#endif // PluginMainThreadScheduler_h
diff --git a/WebCore/plugins/PluginPackage.cpp b/WebCore/plugins/PluginPackage.cpp
deleted file mode 100644
index 10149bf..0000000
--- a/WebCore/plugins/PluginPackage.cpp
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2009 Holger Hans Peter Freyther
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginPackage.h"
-
-#include "MIMETypeRegistry.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include "Timer.h"
-#include "npruntime_impl.h"
-#include <string.h>
-#include <wtf/OwnArrayPtr.h>
-#include <wtf/text/CString.h>
-
-namespace WebCore {
-
-PluginPackage::~PluginPackage()
-{
- // This destructor gets called during refresh() if PluginDatabase's
- // PluginSet hash is already populated, as it removes items from
- // the hash table. Calling the destructor on a loaded plug-in of
- // 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)
- unloadWithoutShutdown();
- else
- unload();
-
- ASSERT(!m_isLoaded);
-}
-
-void PluginPackage::freeLibrarySoon()
-{
- ASSERT(!m_freeLibraryTimer.isActive());
- ASSERT(m_module);
- ASSERT(!m_loadCount);
-
- m_freeLibraryTimer.startOneShot(0);
-}
-
-void PluginPackage::freeLibraryTimerFired(Timer<PluginPackage>*)
-{
- ASSERT(m_module);
- ASSERT(!m_loadCount);
-
- unloadModule(m_module);
- m_module = 0;
-}
-
-
-int PluginPackage::compare(const PluginPackage& compareTo) const
-{
- // Sort plug-ins that allow multiple instances first.
- bool AallowsMultipleInstances = !quirks().contains(PluginQuirkDontAllowMultipleInstances);
- bool BallowsMultipleInstances = !compareTo.quirks().contains(PluginQuirkDontAllowMultipleInstances);
- if (AallowsMultipleInstances != BallowsMultipleInstances)
- return AallowsMultipleInstances ? -1 : 1;
-
- // Sort plug-ins in a preferred path first.
- bool AisInPreferredDirectory = PluginDatabase::isPreferredPluginDirectory(parentDirectory());
- bool BisInPreferredDirectory = PluginDatabase::isPreferredPluginDirectory(compareTo.parentDirectory());
- if (AisInPreferredDirectory != BisInPreferredDirectory)
- return AisInPreferredDirectory ? -1 : 1;
-
- int diff = strcmp(name().utf8().data(), compareTo.name().utf8().data());
- if (diff)
- return diff;
-
- diff = compareFileVersion(compareTo.version());
- if (diff)
- return diff;
-
- return strcmp(parentDirectory().utf8().data(), compareTo.parentDirectory().utf8().data());
-}
-
-PluginPackage::PluginPackage(const String& path, const time_t& lastModified)
- : m_isEnabled(true)
- , m_isLoaded(false)
- , m_loadCount(0)
- , m_path(path)
- , m_moduleVersion(0)
- , m_module(0)
- , m_lastModified(lastModified)
- , m_freeLibraryTimer(this, &PluginPackage::freeLibraryTimerFired)
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- , m_infoIsFromCache(true)
-#endif
-{
- m_fileName = pathGetFileName(m_path);
- m_parentDirectory = m_path.left(m_path.length() - m_fileName.length() - 1);
-}
-
-#if !OS(SYMBIAN)
-void PluginPackage::unload()
-{
- if (!m_isLoaded)
- return;
-
- if (--m_loadCount > 0)
- return;
-
- m_NPP_Shutdown();
-
- unloadWithoutShutdown();
-}
-#endif // !OS(SYMBIAN)
-
-void PluginPackage::unloadWithoutShutdown()
-{
- if (!m_isLoaded)
- return;
-
- ASSERT(!m_loadCount);
- ASSERT(m_module);
-
- // <rdar://5530519>: Crash when closing tab with pdf file (Reader 7 only)
- // If the plugin has subclassed its parent window, as with Reader 7, we may have
- // gotten here by way of the plugin's internal window proc forwarding a message to our
- // original window proc. If we free the plugin library from here, we will jump back
- // to code we just freed when we return, so delay calling FreeLibrary at least until
- // the next message loop
- freeLibrarySoon();
-
- 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));
-
- if (!package->fetchInfo())
- return 0;
-
- return package.release();
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
-PassRefPtr<PluginPackage> PluginPackage::createPackageFromCache(const String& path, const time_t& lastModified, const String& name, const String& description, const String& mimeDescription)
-{
- RefPtr<PluginPackage> package = adoptRef(new PluginPackage(path, lastModified));
- package->m_name = name;
- package->m_description = description;
- package->determineModuleVersionFromDescription();
- package->setMIMEDescription(mimeDescription);
- package->m_infoIsFromCache = true;
- return package.release();
-}
-#endif
-
-#if defined(XP_UNIX)
-void PluginPackage::determineQuirks(const String& mimeType)
-{
- if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
- // Because a single process cannot create multiple VMs, and we cannot reliably unload a
- // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM
- m_quirks.add(PluginQuirkDontUnloadPlugin);
-
- // Setting the window region to an empty region causes bad scrolling repaint problems
- // with the Java plug-in.
- m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling);
- return;
- }
-
- if (mimeType == "application/x-shockwave-flash") {
- static const PlatformModuleVersion flashTenVersion(0x0a000000);
-
- if (compareFileVersion(flashTenVersion) >= 0) {
- // Flash 10.0 b218 doesn't like having a NULL window handle
- m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy);
-#if PLATFORM(QT)
- m_quirks.add(PluginQuirkRequiresGtkToolKit);
-#endif
- } else {
- // Flash 9 and older requests windowless plugins if we return a mozilla user agent
- m_quirks.add(PluginQuirkWantsMozillaUserAgent);
- }
-
-#if PLATFORM(QT)
- // Flash will crash on repeated calls to SetWindow in windowed mode
- m_quirks.add(PluginQuirkDontCallSetWindowMoreThanOnce);
-
-#if CPU(X86_64)
- // 64-bit Flash freezes if right-click is sent in windowless mode
- m_quirks.add(PluginQuirkIgnoreRightClickInWindowlessMode);
-#endif
-#endif
-
- m_quirks.add(PluginQuirkRequiresDefaultScreenDepth);
- m_quirks.add(PluginQuirkThrottleInvalidate);
- m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages);
- m_quirks.add(PluginQuirkFlashURLNotifyBug);
- }
-
-#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6)
- // Passing a 32-bit depth pixmap to NPAPI plugins is too inefficient. Instead, pass a X Pixmap
- // that has same depth as the screen depth since graphics operations are optimized
- // for this depth.
- m_quirks.add(PluginQuirkRequiresDefaultScreenDepth);
-#endif
-}
-#endif
-
-#if !OS(WINDOWS)
-void PluginPackage::determineModuleVersionFromDescription()
-{
- // It's a bit lame to detect the plugin version by parsing it
- // from the plugin description string, but it doesn't seem that
- // version information is available in any standardized way at
- // the module level, like in Windows
-
- if (m_description.isEmpty())
- return;
-
- if (m_description.startsWith("Shockwave Flash") && m_description.length() >= 19) {
- // The flash version as a PlatformModuleVersion differs on Unix from Windows
- // since the revision can be larger than a 8 bits, so we allow it 16 here and
- // push the major/minor up 8 bits. Thus on Unix, Flash's version may be
- // 0x0a000000 instead of 0x000a0000.
-
- Vector<String> versionParts;
- m_description.substring(16).split(' ', /*allowEmptyEntries =*/ false, versionParts);
- if (versionParts.isEmpty())
- return;
-
- if (versionParts.size() >= 1) {
- Vector<String> majorMinorParts;
- versionParts[0].split('.', majorMinorParts);
- if (majorMinorParts.size() >= 1) {
- bool converted = false;
- unsigned major = majorMinorParts[0].toUInt(&converted);
- if (converted)
- m_moduleVersion = (major & 0xff) << 24;
- }
- if (majorMinorParts.size() == 2) {
- bool converted = false;
- unsigned minor = majorMinorParts[1].toUInt(&converted);
- if (converted)
- m_moduleVersion |= (minor & 0xff) << 16;
- }
- }
-
- if (versionParts.size() >= 2) {
- String revision = versionParts[1];
- if (revision.length() > 1 && (revision[0] == 'r' || revision[0] == 'b')) {
- revision.remove(0, 1);
- m_moduleVersion |= revision.toInt() & 0xffff;
- }
- }
- }
-}
-#endif
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-void PluginPackage::initializeBrowserFuncs()
-{
- memset(&m_browserFuncs, 0, sizeof(m_browserFuncs));
- m_browserFuncs.size = sizeof(m_browserFuncs);
- m_browserFuncs.version = NPVersion();
-
- m_browserFuncs.geturl = NPN_GetURL;
- m_browserFuncs.posturl = NPN_PostURL;
- m_browserFuncs.requestread = NPN_RequestRead;
- m_browserFuncs.newstream = NPN_NewStream;
- m_browserFuncs.write = NPN_Write;
- m_browserFuncs.destroystream = NPN_DestroyStream;
- m_browserFuncs.status = NPN_Status;
- m_browserFuncs.uagent = NPN_UserAgent;
- m_browserFuncs.memalloc = NPN_MemAlloc;
- m_browserFuncs.memfree = NPN_MemFree;
- m_browserFuncs.memflush = NPN_MemFlush;
- m_browserFuncs.reloadplugins = NPN_ReloadPlugins;
- m_browserFuncs.geturlnotify = NPN_GetURLNotify;
- m_browserFuncs.posturlnotify = NPN_PostURLNotify;
- m_browserFuncs.getvalue = NPN_GetValue;
- m_browserFuncs.setvalue = NPN_SetValue;
- m_browserFuncs.invalidaterect = NPN_InvalidateRect;
- m_browserFuncs.invalidateregion = NPN_InvalidateRegion;
- m_browserFuncs.forceredraw = NPN_ForceRedraw;
- m_browserFuncs.getJavaEnv = NPN_GetJavaEnv;
- m_browserFuncs.getJavaPeer = NPN_GetJavaPeer;
- m_browserFuncs.pushpopupsenabledstate = NPN_PushPopupsEnabledState;
- m_browserFuncs.poppopupsenabledstate = NPN_PopPopupsEnabledState;
- m_browserFuncs.pluginthreadasynccall = NPN_PluginThreadAsyncCall;
-
- m_browserFuncs.releasevariantvalue = _NPN_ReleaseVariantValue;
- m_browserFuncs.getstringidentifier = _NPN_GetStringIdentifier;
- m_browserFuncs.getstringidentifiers = _NPN_GetStringIdentifiers;
- m_browserFuncs.getintidentifier = _NPN_GetIntIdentifier;
- m_browserFuncs.identifierisstring = _NPN_IdentifierIsString;
- m_browserFuncs.utf8fromidentifier = _NPN_UTF8FromIdentifier;
- m_browserFuncs.intfromidentifier = _NPN_IntFromIdentifier;
- m_browserFuncs.createobject = _NPN_CreateObject;
- m_browserFuncs.retainobject = _NPN_RetainObject;
- m_browserFuncs.releaseobject = _NPN_ReleaseObject;
- m_browserFuncs.invoke = _NPN_Invoke;
- m_browserFuncs.invokeDefault = _NPN_InvokeDefault;
- m_browserFuncs.evaluate = _NPN_Evaluate;
- m_browserFuncs.getproperty = _NPN_GetProperty;
- m_browserFuncs.setproperty = _NPN_SetProperty;
- m_browserFuncs.removeproperty = _NPN_RemoveProperty;
- m_browserFuncs.hasproperty = _NPN_HasProperty;
- m_browserFuncs.hasmethod = _NPN_HasMethod;
- m_browserFuncs.setexception = _NPN_SetException;
- m_browserFuncs.enumerate = _NPN_Enumerate;
- m_browserFuncs.construct = _NPN_Construct;
- m_browserFuncs.getvalueforurl = NPN_GetValueForURL;
- m_browserFuncs.setvalueforurl = NPN_SetValueForURL;
- m_browserFuncs.getauthenticationinfo = NPN_GetAuthenticationInfo;
-}
-#endif
-
-#if ENABLE(PLUGIN_PACKAGE_SIMPLE_HASH)
-unsigned PluginPackage::hash() const
-{
- unsigned hashCodes[] = {
- m_path.impl()->hash(),
- m_lastModified
- };
-
- return WTF::StringHasher::createBlobHash<sizeof(hashCodes)>(hashCodes);
-}
-
-bool PluginPackage::equal(const PluginPackage& a, const PluginPackage& b)
-{
- return a.m_description == b.m_description;
-}
-#endif
-
-int PluginPackage::compareFileVersion(const PlatformModuleVersion& compareVersion) const
-{
- // return -1, 0, or 1 if plug-in version is less than, equal to, or greater than
- // the passed version
-
-#if OS(WINDOWS)
- if (m_moduleVersion.mostSig != compareVersion.mostSig)
- return m_moduleVersion.mostSig > compareVersion.mostSig ? 1 : -1;
- if (m_moduleVersion.leastSig != compareVersion.leastSig)
- return m_moduleVersion.leastSig > compareVersion.leastSig ? 1 : -1;
-#else
- if (m_moduleVersion != compareVersion)
- return m_moduleVersion > compareVersion ? 1 : -1;
-#endif
-
- return 0;
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
-bool PluginPackage::ensurePluginLoaded()
-{
- if (!m_infoIsFromCache)
- return m_isLoaded;
-
- m_quirks = PluginQuirkSet();
- m_name = String();
- m_description = String();
- m_fullMIMEDescription = String();
- m_moduleVersion = 0;
-
- return fetchInfo();
-}
-#endif
-
-}
diff --git a/WebCore/plugins/PluginPackage.h b/WebCore/plugins/PluginPackage.h
deleted file mode 100644
index f4d1dac..0000000
--- a/WebCore/plugins/PluginPackage.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 PluginPackage_h
-#define PluginPackage_h
-
-#include "FileSystem.h"
-#include "PlatformString.h"
-#include "PluginQuirkSet.h"
-#include "Timer.h"
-#include "npruntime_internal.h"
-#include <wtf/HashMap.h>
-#include <wtf/RefCounted.h>
-#include <wtf/text/StringHash.h>
-
-#if OS(SYMBIAN)
-class QPluginLoader;
-class NPInterface;
-#endif
-
-namespace WebCore {
- typedef HashMap<String, String> MIMEToDescriptionsMap;
- typedef HashMap<String, Vector<String> > MIMEToExtensionsMap;
-
- class PluginPackage : public RefCounted<PluginPackage> {
- public:
- ~PluginPackage();
- static PassRefPtr<PluginPackage> createPackage(const String& path, const time_t& lastModified);
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- static PassRefPtr<PluginPackage> createPackageFromCache(const String& path, const time_t& lastModified, const String& name, const String& description, const String& mimeDescription);
-#endif
-
- const String& name() const { return m_name; }
- const String& description() const { return m_description; }
- const String& path() const { return m_path; }
- const String& fileName() const { return m_fileName; }
- const String& parentDirectory() const { return m_parentDirectory; }
- uint16_t NPVersion() const;
- time_t lastModified() const { return m_lastModified; }
-
- const MIMEToDescriptionsMap& mimeToDescriptions() const { return m_mimeToDescriptions; }
- const MIMEToExtensionsMap& mimeToExtensions() const { return m_mimeToExtensions; }
-
- unsigned hash() const;
- static bool equal(const PluginPackage& a, const PluginPackage& b);
-
- bool load();
- 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;
- PluginQuirkSet quirks() const { return m_quirks; }
- const PlatformModuleVersion& version() const { return m_moduleVersion; }
-#if OS(SYMBIAN)
- NPInterface* npInterface() const { return m_npInterface; }
-#endif // OS(SYMBIAN)
-
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- bool ensurePluginLoaded();
- void setMIMEDescription(const String& mimeDescription);
- String fullMIMEDescription() const { return m_fullMIMEDescription;}
-#endif
- private:
- PluginPackage(const String& path, const time_t& lastModified);
-
-#if OS(SYMBIAN)
- NPInterface* m_npInterface;
- QPluginLoader* m_pluginLoader;
-#endif // OS(SYMBIAN)
- bool fetchInfo();
- bool isPluginBlacklisted();
- void determineQuirks(const String& mimeType);
-
- void determineModuleVersionFromDescription();
- void initializeBrowserFuncs();
-
- bool m_isEnabled;
- bool m_isLoaded;
- int m_loadCount;
-
- String m_description;
- String m_path;
- String m_fileName;
- String m_name;
- String m_parentDirectory;
-
- PlatformModuleVersion m_moduleVersion;
-
- MIMEToDescriptionsMap m_mimeToDescriptions;
- MIMEToExtensionsMap m_mimeToExtensions;
-
- PlatformModule m_module;
- time_t m_lastModified;
-
- NPP_ShutdownProcPtr m_NPP_Shutdown;
- NPPluginFuncs m_pluginFuncs;
- NPNetscapeFuncs m_browserFuncs;
-
- void freeLibrarySoon();
- void freeLibraryTimerFired(Timer<PluginPackage>*);
- Timer<PluginPackage> m_freeLibraryTimer;
-
- PluginQuirkSet m_quirks;
-#if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
- String m_fullMIMEDescription;
- bool m_infoIsFromCache;
-#endif
- };
-
- struct PluginPackageHash {
- static unsigned hash(const uintptr_t key) { return reinterpret_cast<PluginPackage*>(key)->hash(); }
- static unsigned hash(const RefPtr<PluginPackage>& key) { return key->hash(); }
-
- static bool equal(const uintptr_t a, const uintptr_t b) { return equal(reinterpret_cast<PluginPackage*>(a), reinterpret_cast<PluginPackage*>(b)); }
- static bool equal(const RefPtr<PluginPackage>& a, const RefPtr<PluginPackage>& b) { return PluginPackage::equal(*a.get(), *b.get()); }
- static const bool safeToCompareToEmptyOrDeleted = false;
- };
-
-} // namespace WebCore
-
-#endif
diff --git a/WebCore/plugins/PluginPackageNone.cpp b/WebCore/plugins/PluginPackageNone.cpp
deleted file mode 100644
index f7e2a6b..0000000
--- a/WebCore/plugins/PluginPackageNone.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2008 Kevin Ollivier <kevino@theolliviers.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 APPLE INC. ``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 APPLE INC. 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.
- */
-
-#include "config.h"
-#include "PluginPackage.h"
-
-namespace WebCore {
-
-void PluginPackage::determineQuirks(const String&)
-{
-}
-
-bool PluginPackage::fetchInfo()
-{
- return false;
-}
-
-bool PluginPackage::load()
-{
- return false;
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-uint16_t PluginPackage::NPVersion() const
-{
- return 0;
-}
-#endif
-
-}
diff --git a/WebCore/plugins/PluginQuirkSet.h b/WebCore/plugins/PluginQuirkSet.h
deleted file mode 100644
index 1a684fe..0000000
--- a/WebCore/plugins/PluginQuirkSet.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc. 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.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS 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 APPLE OR ITS 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 PluginQuirkSet_h
-#define PluginQuirkSet_h
-
-
-namespace WebCore {
-
- enum PluginQuirk {
- PluginQuirkWantsMozillaUserAgent = 1 << 0,
- PluginQuirkDeferFirstSetWindowCall = 1 << 1,
- PluginQuirkThrottleInvalidate = 1 << 2,
- PluginQuirkRemoveWindowlessVideoParam = 1 << 3,
- PluginQuirkThrottleWMUserPlusOneMessages = 1 << 4,
- PluginQuirkDontUnloadPlugin = 1 << 5,
- PluginQuirkDontCallWndProcForSameMessageRecursively = 1 << 6,
- PluginQuirkHasModalMessageLoop = 1 << 7,
- PluginQuirkFlashURLNotifyBug = 1 << 8,
- PluginQuirkDontClipToZeroRectWhenScrolling = 1 << 9,
- PluginQuirkDontSetNullWindowHandleOnDestroy = 1 << 10,
- PluginQuirkDontAllowMultipleInstances = 1 << 11,
- PluginQuirkRequiresGtkToolKit = 1 << 12,
- PluginQuirkRequiresDefaultScreenDepth = 1 << 13,
- PluginQuirkDontCallSetWindowMoreThanOnce = 1 << 14,
- PluginQuirkIgnoreRightClickInWindowlessMode = 1 << 15
- };
-
- class PluginQuirkSet {
- public:
- PluginQuirkSet() : m_quirks(0) { }
- void add(PluginQuirk quirk) { m_quirks |= quirk; }
- bool contains(PluginQuirk quirk) const { return m_quirks & quirk; }
- private:
- unsigned m_quirks;
- };
-
-} // namespace WebCore
-
-#endif // PluginQuirkSet_h
diff --git a/WebCore/plugins/PluginStrategy.h b/WebCore/plugins/PluginStrategy.h
deleted file mode 100644
index 9d8a7b5..0000000
--- a/WebCore/plugins/PluginStrategy.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 Apple Inc. 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 PluginStrategy_h
-#define PluginStrategy_h
-
-#if USE(PLATFORM_STRATEGIES)
-
-#include "PluginData.h"
-
-namespace WebCore {
-
-class Page;
-
-class PluginStrategy {
-public:
- virtual void refreshPlugins() = 0;
- virtual void getPluginInfo(const Page*, Vector<PluginInfo>&) = 0;
-
-protected:
- virtual ~PluginStrategy() { }
-};
-
-} // namespace WebCore
-
-#endif // USE(PLATFORM_STRATEGIES)
-
-#endif // PluginStrategy_h
diff --git a/WebCore/plugins/PluginStream.cpp b/WebCore/plugins/PluginStream.cpp
deleted file mode 100644
index f9021a8..0000000
--- a/WebCore/plugins/PluginStream.cpp
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginStream.h"
-
-#include "DocumentLoader.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "PluginDebug.h"
-#include "ResourceLoadScheduler.h"
-#include "SharedBuffer.h"
-#include "SubresourceLoader.h"
-#include <StringExtras.h>
-#include <wtf/text/CString.h>
-#include <wtf/text/StringConcatenate.h>
-
-// We use -2 here because some plugins like to return -1 to indicate error
-// and this way we won't clash with them.
-static const int WebReasonNone = -2;
-
-using std::max;
-using std::min;
-
-namespace WebCore {
-
-typedef HashMap<NPStream*, NPP> StreamMap;
-static StreamMap& streams()
-{
- static StreamMap staticStreams;
- return staticStreams;
-}
-
-PluginStream::PluginStream(PluginStreamClient* client, Frame* frame, const ResourceRequest& resourceRequest, bool sendNotification, void* notifyData, const NPPluginFuncs* pluginFuncs, NPP instance, const PluginQuirkSet& quirks)
- : m_resourceRequest(resourceRequest)
- , m_client(client)
- , m_frame(frame)
- , m_notifyData(notifyData)
- , m_sendNotification(sendNotification)
- , m_streamState(StreamBeforeStarted)
- , m_loadManually(false)
- , m_delayDeliveryTimer(this, &PluginStream::delayDeliveryTimerFired)
- , m_deliveryData(0)
- , m_tempFileHandle(invalidPlatformFileHandle)
- , m_pluginFuncs(pluginFuncs)
- , m_instance(instance)
- , m_quirks(quirks)
-{
- ASSERT(m_instance);
-
- m_stream.url = 0;
- m_stream.ndata = 0;
- m_stream.pdata = 0;
- m_stream.end = 0;
- m_stream.notifyData = 0;
- m_stream.lastmodified = 0;
-
- streams().add(&m_stream, m_instance);
-}
-
-PluginStream::~PluginStream()
-{
- ASSERT(m_streamState != StreamStarted);
- ASSERT(!m_loader);
-
- fastFree((char*)m_stream.url);
-
- streams().remove(&m_stream);
-}
-
-void PluginStream::start()
-{
- ASSERT(!m_loadManually);
- m_loader = resourceLoadScheduler()->schedulePluginStreamLoad(m_frame, this, m_resourceRequest);
-}
-
-void PluginStream::stop()
-{
- m_streamState = StreamStopped;
-
- if (m_loadManually) {
- ASSERT(!m_loader);
-
- DocumentLoader* documentLoader = m_frame->loader()->activeDocumentLoader();
- ASSERT(documentLoader);
-
- if (documentLoader->isLoadingMainResource())
- documentLoader->cancelMainResourceLoad(m_frame->loader()->cancelledError(m_resourceRequest));
-
- return;
- }
-
- if (m_loader) {
- m_loader->cancel();
- m_loader = 0;
- }
-
- m_client = 0;
-}
-
-void PluginStream::startStream()
-{
- ASSERT(m_streamState == StreamBeforeStarted);
-
- const KURL& responseURL = m_resourceResponse.url();
-
- // Some plugins (Flash) expect that javascript URLs are passed back decoded as this is the
- // format used when requesting the URL.
- if (protocolIsJavaScript(responseURL))
- m_stream.url = fastStrDup(decodeURLEscapeSequences(responseURL.string()).utf8().data());
- else
- m_stream.url = fastStrDup(responseURL.string().utf8().data());
-
- CString mimeTypeStr = m_resourceResponse.mimeType().utf8();
-
- long long expectedContentLength = m_resourceResponse.expectedContentLength();
-
- if (m_resourceResponse.isHTTP()) {
- Vector<UChar> stringBuilder;
- String separator(": ");
-
- String statusLine = makeString("HTTP ", String::number(m_resourceResponse.httpStatusCode()), " OK\n");
- stringBuilder.append(statusLine.characters(), statusLine.length());
-
- HTTPHeaderMap::const_iterator end = m_resourceResponse.httpHeaderFields().end();
- for (HTTPHeaderMap::const_iterator it = m_resourceResponse.httpHeaderFields().begin(); it != end; ++it) {
- stringBuilder.append(it->first.characters(), it->first.length());
- stringBuilder.append(separator.characters(), separator.length());
- stringBuilder.append(it->second.characters(), it->second.length());
- stringBuilder.append('\n');
- }
-
- m_headers = String::adopt(stringBuilder).utf8();
-
- // If the content is encoded (most likely compressed), then don't send its length to the plugin,
- // which is only interested in the decoded length, not yet known at the moment.
- // <rdar://problem/4470599> tracks a request for -[NSURLResponse expectedContentLength] to incorporate this logic.
- String contentEncoding = m_resourceResponse.httpHeaderField("Content-Encoding");
- if (!contentEncoding.isNull() && contentEncoding != "identity")
- expectedContentLength = -1;
- }
-
- m_stream.headers = m_headers.data();
- m_stream.pdata = 0;
- m_stream.ndata = this;
- m_stream.end = max(expectedContentLength, 0LL);
- m_stream.lastmodified = m_resourceResponse.lastModifiedDate();
- m_stream.notifyData = m_notifyData;
-
- m_transferMode = NP_NORMAL;
- m_offset = 0;
- m_reason = WebReasonNone;
-
- // Protect the stream if destroystream is called from within the newstream handler
- RefPtr<PluginStream> protect(this);
-
- // calling into a plug-in could result in re-entrance if the plug-in yields
- // control to the system (rdar://5744899). prevent this by deferring further
- // loading while calling into the plug-in.
- if (m_loader)
- m_loader->setDefersLoading(true);
- NPError npErr = m_pluginFuncs->newstream(m_instance, (NPMIMEType)mimeTypeStr.data(), &m_stream, false, &m_transferMode);
- if (m_loader)
- m_loader->setDefersLoading(false);
-
- // If the stream was destroyed in the call to newstream we return
- if (m_reason != WebReasonNone)
- return;
-
- if (npErr != NPERR_NO_ERROR) {
- cancelAndDestroyStream(npErr);
- return;
- }
-
- m_streamState = StreamStarted;
-
- if (m_transferMode == NP_NORMAL)
- return;
-
- m_path = openTemporaryFile("WKP", m_tempFileHandle);
-
- // Something went wrong, cancel loading the stream
- if (!isHandleValid(m_tempFileHandle))
- cancelAndDestroyStream(NPRES_NETWORK_ERR);
-}
-
-NPP PluginStream::ownerForStream(NPStream* stream)
-{
- return streams().get(stream);
-}
-
-void PluginStream::cancelAndDestroyStream(NPReason reason)
-{
- RefPtr<PluginStream> protect(this);
-
- destroyStream(reason);
- stop();
-}
-
-void PluginStream::destroyStream(NPReason reason)
-{
- m_reason = reason;
- if (m_reason != NPRES_DONE) {
- // Stop any pending data from being streamed
- if (m_deliveryData)
- m_deliveryData->resize(0);
- } else if (m_deliveryData && m_deliveryData->size() > 0) {
- // There is more data to be streamed, don't destroy the stream now.
- return;
- }
- destroyStream();
-}
-
-void PluginStream::destroyStream()
-{
- if (m_streamState == StreamStopped)
- return;
-
- ASSERT(m_reason != WebReasonNone);
- ASSERT(!m_deliveryData || m_deliveryData->size() == 0);
-
- closeFile(m_tempFileHandle);
-
- 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());
-
- if (m_loader)
- m_loader->setDefersLoading(true);
- m_pluginFuncs->asfile(m_instance, &m_stream, m_path.data());
- if (m_loader)
- m_loader->setDefersLoading(false);
- }
-
- if (m_streamState != StreamBeforeStarted) {
- if (m_loader)
- m_loader->setDefersLoading(true);
-
- NPError npErr = m_pluginFuncs->destroystream(m_instance, &m_stream, m_reason);
-
- if (m_loader)
- m_loader->setDefersLoading(false);
-
- LOG_NPERROR(npErr);
- }
-
- m_stream.ndata = 0;
- }
-
- if (m_sendNotification) {
- // Flash 9 can dereference null if we call NPP_URLNotify without first calling NPP_NewStream
- // for requests made with NPN_PostURLNotify; see <rdar://5588807>
- if (m_loader)
- m_loader->setDefersLoading(true);
- if (!newStreamCalled && m_quirks.contains(PluginQuirkFlashURLNotifyBug) &&
- equalIgnoringCase(m_resourceRequest.httpMethod(), "POST")) {
- m_transferMode = NP_NORMAL;
- m_stream.url = "";
- m_stream.notifyData = m_notifyData;
-
- static char emptyMimeType[] = "";
- m_pluginFuncs->newstream(m_instance, emptyMimeType, &m_stream, false, &m_transferMode);
- m_pluginFuncs->destroystream(m_instance, &m_stream, m_reason);
-
- // in successful requests, the URL is dynamically allocated and freed in our
- // destructor, so reset it to 0
- m_stream.url = 0;
- }
- m_pluginFuncs->urlnotify(m_instance, m_resourceRequest.url().string().utf8().data(), m_reason, m_notifyData);
- if (m_loader)
- m_loader->setDefersLoading(false);
- }
-
- m_streamState = StreamStopped;
-
- if (!m_loadManually && m_client)
- m_client->streamDidFinishLoading(this);
-
- if (!m_path.isNull()) {
- String tempFilePath = String::fromUTF8(m_path.data());
- deleteFile(tempFilePath);
- }
-}
-
-void PluginStream::delayDeliveryTimerFired(Timer<PluginStream>* timer)
-{
- ASSERT(timer == &m_delayDeliveryTimer);
-
- deliverData();
-}
-
-void PluginStream::deliverData()
-{
- ASSERT(m_deliveryData);
-
- if (m_streamState == StreamStopped)
- // FIXME: We should cancel our job in the SubresourceLoader on error so we don't reach this case
- return;
-
- ASSERT(m_streamState != StreamBeforeStarted);
-
- if (!m_stream.ndata || m_deliveryData->size() == 0)
- return;
-
- int32_t totalBytes = m_deliveryData->size();
- int32_t totalBytesDelivered = 0;
-
- if (m_loader)
- m_loader->setDefersLoading(true);
- while (totalBytesDelivered < totalBytes) {
- int32_t deliveryBytes = m_pluginFuncs->writeready(m_instance, &m_stream);
-
- if (deliveryBytes <= 0) {
-#if PLATFORM(ANDROID)
-// TODO: This needs to be upstreamed.
- if (m_loader)
- m_loader->pauseLoad(true);
-
- // ask the plugin for a delay value.
- int delay = deliveryDelay();
- m_delayDeliveryTimer.startOneShot(delay * 0.001);
-#else
- m_delayDeliveryTimer.startOneShot(0);
-#endif
- break;
- } else {
- deliveryBytes = min(deliveryBytes, totalBytes - totalBytesDelivered);
- int32_t dataLength = deliveryBytes;
- char* data = m_deliveryData->data() + totalBytesDelivered;
-
- // Write the data
- deliveryBytes = m_pluginFuncs->write(m_instance, &m_stream, m_offset, dataLength, (void*)data);
- if (deliveryBytes < 0) {
- LOG_PLUGIN_NET_ERROR();
- if (m_loader)
- m_loader->setDefersLoading(false);
- cancelAndDestroyStream(NPRES_NETWORK_ERR);
- return;
- }
- deliveryBytes = min(deliveryBytes, dataLength);
- m_offset += deliveryBytes;
- totalBytesDelivered += deliveryBytes;
- }
- }
- if (m_loader)
- m_loader->setDefersLoading(false);
-
- if (totalBytesDelivered > 0) {
- if (totalBytesDelivered < totalBytes) {
- int remainingBytes = totalBytes - totalBytesDelivered;
- memmove(m_deliveryData->data(), m_deliveryData->data() + totalBytesDelivered, remainingBytes);
- m_deliveryData->resize(remainingBytes);
- } else {
-#if PLATFORM(ANDROID)
-//TODO: This needs to be upstreamed to WebKit.
- if (m_loader)
- m_loader->pauseLoad(false);
-#endif
- m_deliveryData->resize(0);
- if (m_reason != WebReasonNone)
- destroyStream();
- }
- }
-}
-
-void PluginStream::sendJavaScriptStream(const KURL& requestURL, const CString& resultString)
-{
- didReceiveResponse(0, ResourceResponse(requestURL, "text/plain", resultString.length(), "", ""));
-
- if (m_streamState == StreamStopped)
- return;
-
- if (!resultString.isNull()) {
- didReceiveData(0, resultString.data(), resultString.length());
- if (m_streamState == StreamStopped)
- return;
- }
-
- m_loader = 0;
-
- destroyStream(resultString.isNull() ? NPRES_NETWORK_ERR : NPRES_DONE);
-}
-
-void PluginStream::didReceiveResponse(NetscapePlugInStreamLoader* loader, const ResourceResponse& response)
-{
- ASSERT(loader == m_loader);
- ASSERT(m_streamState == StreamBeforeStarted);
-
- m_resourceResponse = response;
-
- startStream();
-}
-
-void PluginStream::didReceiveData(NetscapePlugInStreamLoader* loader, const char* data, int length)
-{
- ASSERT(loader == m_loader);
- ASSERT(m_streamState == StreamStarted);
-
- // If the plug-in cancels the stream in deliverData it could be deleted,
- // so protect it here.
- RefPtr<PluginStream> protect(this);
-
- if (m_transferMode != NP_ASFILEONLY) {
- if (!m_deliveryData)
- m_deliveryData.set(new Vector<char>);
-
- int oldSize = m_deliveryData->size();
- m_deliveryData->resize(oldSize + length);
- memcpy(m_deliveryData->data() + oldSize, data, length);
-
-#if PLATFORM(ANDROID)
-//TODO: This needs to be upstreamed to WebKit.
- if (!m_delayDeliveryTimer.isActive())
-#endif
- deliverData();
- }
-
- if (m_streamState != StreamStopped && isHandleValid(m_tempFileHandle)) {
- int bytesWritten = writeToFile(m_tempFileHandle, data, length);
- if (bytesWritten != length)
- cancelAndDestroyStream(NPRES_NETWORK_ERR);
- }
-}
-
-void PluginStream::didFail(NetscapePlugInStreamLoader* loader, const ResourceError&)
-{
- ASSERT(loader == m_loader);
-
- LOG_PLUGIN_NET_ERROR();
-
- // destroyStream can result in our being deleted
- RefPtr<PluginStream> protect(this);
-
- destroyStream(NPRES_NETWORK_ERR);
-
- m_loader = 0;
-}
-
-void PluginStream::didFinishLoading(NetscapePlugInStreamLoader* loader)
-{
- ASSERT(loader == m_loader);
- ASSERT(m_streamState == StreamStarted);
-
- // destroyStream can result in our being deleted
- RefPtr<PluginStream> protect(this);
-
- destroyStream(NPRES_DONE);
-
- m_loader = 0;
-}
-
-bool PluginStream::wantsAllStreams() const
-{
- if (!m_pluginFuncs->getvalue)
- return false;
-
- void* result = 0;
- if (m_pluginFuncs->getvalue(m_instance, NPPVpluginWantsAllNetworkStreams, &result) != NPERR_NO_ERROR)
- return false;
-
- return result != 0;
-}
-
-#if PLATFORM(ANDROID)
-int PluginStream::deliveryDelay() const
-{
- if (!m_pluginFuncs->getvalue)
- return 0;
-
- int delay = 0;
- if (m_pluginFuncs->getvalue(m_instance, NPPDataDeliveryDelayMs, &delay) != NPERR_NO_ERROR)
- return 0;
-
- return delay;
-}
-#endif
-
-}
diff --git a/WebCore/plugins/PluginStream.h b/WebCore/plugins/PluginStream.h
deleted file mode 100644
index ae69539..0000000
--- a/WebCore/plugins/PluginStream.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 PluginStream_h
-#define PluginStream_h
-
-#include "FileSystem.h"
-#include "KURL.h"
-#include "NetscapePlugInStreamLoader.h"
-#include "PlatformString.h"
-#include "PluginQuirkSet.h"
-#include "ResourceRequest.h"
-#include "ResourceResponse.h"
-#include "Timer.h"
-#include "npruntime_internal.h"
-#include <wtf/HashMap.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/RefCounted.h>
-#include <wtf/Vector.h>
-#include <wtf/text/CString.h>
-#include <wtf/text/StringHash.h>
-
-namespace WebCore {
- class Frame;
- class PluginStream;
-
- enum PluginStreamState { StreamBeforeStarted, StreamStarted, StreamStopped };
-
- class PluginStreamClient {
- public:
- virtual ~PluginStreamClient() {}
- virtual void streamDidFinishLoading(PluginStream*) {}
- };
-
- class PluginStream : public RefCounted<PluginStream>, private NetscapePlugInStreamLoaderClient {
- public:
- static PassRefPtr<PluginStream> create(PluginStreamClient* client, Frame* frame, const ResourceRequest& request, bool sendNotification, void* notifyData, const NPPluginFuncs* functions, NPP instance, const PluginQuirkSet& quirks)
- {
- return adoptRef(new PluginStream(client, frame, request, sendNotification, notifyData, functions, instance, quirks));
- }
- virtual ~PluginStream();
-
- void start();
- void stop();
-
- void startStream();
-
- void setLoadManually(bool loadManually) { m_loadManually = loadManually; }
-
- void sendJavaScriptStream(const KURL& requestURL, const WTF::CString& resultString);
- void cancelAndDestroyStream(NPReason);
-
- static NPP ownerForStream(NPStream*);
-
- // NetscapePlugInStreamLoaderClient
- virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&);
- virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int);
- virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&);
- virtual void didFinishLoading(NetscapePlugInStreamLoader*);
- virtual bool wantsAllStreams() const;
-
- private:
- PluginStream(PluginStreamClient*, Frame*, const ResourceRequest&, bool sendNotification, void* notifyData, const NPPluginFuncs*, NPP instance, const PluginQuirkSet&);
-
- void deliverData();
- void destroyStream(NPReason);
- void destroyStream();
-#if PLATFORM(ANDROID)
- int deliveryDelay() const;
-#endif
- ResourceRequest m_resourceRequest;
- ResourceResponse m_resourceResponse;
-
- PluginStreamClient* m_client;
- Frame* m_frame;
- RefPtr<NetscapePlugInStreamLoader> m_loader;
- void* m_notifyData;
- bool m_sendNotification;
- PluginStreamState m_streamState;
- bool m_loadManually;
-
- Timer<PluginStream> m_delayDeliveryTimer;
- void delayDeliveryTimerFired(Timer<PluginStream>*);
-
- OwnPtr< Vector<char> > m_deliveryData;
-
- PlatformFileHandle m_tempFileHandle;
-
- const NPPluginFuncs* m_pluginFuncs;
- NPP m_instance;
- uint16_t m_transferMode;
- int32_t m_offset;
- WTF::CString m_headers;
- WTF::CString m_path;
- NPReason m_reason;
- NPStream m_stream;
- PluginQuirkSet m_quirks;
- };
-
-} // namespace WebCore
-
-#endif
diff --git a/WebCore/plugins/PluginView.cpp b/WebCore/plugins/PluginView.cpp
deleted file mode 100644
index f06daf4..0000000
--- a/WebCore/plugins/PluginView.cpp
+++ /dev/null
@@ -1,1620 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2010 Girish Ramakrishnan <girish@forwardbias.in>
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginView.h"
-
-#if USE(JSC)
-#include "Bridge.h"
-#endif
-#include "Chrome.h"
-#include "CookieJar.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Element.h"
-#include "FocusController.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "FrameLoaderClient.h"
-#include "FrameTree.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "HTMLNames.h"
-#include "HTMLPlugInElement.h"
-#include "Image.h"
-#include "KeyboardEvent.h"
-#include "MIMETypeRegistry.h"
-#include "MouseEvent.h"
-#include "NotImplemented.h"
-#include "Page.h"
-#include "PlatformMouseEvent.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include "PluginMainThreadScheduler.h"
-#include "PluginPackage.h"
-#include "ProxyServer.h"
-#include "RenderBox.h"
-#include "RenderObject.h"
-#include "ScriptController.h"
-#include "ScriptValue.h"
-#include "SecurityOrigin.h"
-#include "Settings.h"
-#include "npruntime_impl.h"
-#include <wtf/ASCIICType.h>
-
-#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
-#include "PluginMessageThrottlerWin.h"
-#endif
-
-#if defined(ANDROID_PLUGINS)
-#include "TouchEvent.h"
-#endif
-
-#if USE(JSC)
-#include "JSDOMBinding.h"
-#include "JSDOMWindow.h"
-#include "c_instance.h"
-#include "runtime_root.h"
-#include <runtime/JSLock.h>
-#include <runtime/JSValue.h>
-
-using JSC::ExecState;
-using JSC::JSLock;
-using JSC::JSObject;
-using JSC::JSValue;
-using JSC::UString;
-#endif
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-
-using std::min;
-
-using namespace WTF;
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-static int s_callingPlugin;
-
-typedef HashMap<NPP, PluginView*> InstanceMap;
-
-static InstanceMap& instanceMap()
-{
- static InstanceMap& map = *new InstanceMap;
- return map;
-}
-
-static String scriptStringIfJavaScriptURL(const KURL& url)
-{
- if (!protocolIsJavaScript(url))
- return String();
-
- // This returns an unescaped string
- return decodeURLEscapeSequences(url.string().substring(11));
-}
-
-PluginView* PluginView::s_currentPluginView = 0;
-
-void PluginView::popPopupsStateTimerFired(Timer<PluginView>*)
-{
- popPopupsEnabledState();
-}
-
-IntRect PluginView::windowClipRect() const
-{
- // Start by clipping to our bounds.
- IntRect clipRect(m_windowRect);
-
- // Take our element and get the clip rect from the enclosing layer and frame view.
- RenderLayer* layer = m_element->renderer()->enclosingLayer();
- FrameView* parentView = m_element->document()->view();
- clipRect.intersect(parentView->windowClipRectForLayer(layer, true));
-
- return clipRect;
-}
-
-void PluginView::setFrameRect(const IntRect& rect)
-{
- if (m_element->document()->printing())
- return;
-
- if (rect != frameRect())
- Widget::setFrameRect(rect);
-
- updatePluginWidget();
-
-#if OS(WINDOWS) || OS(SYMBIAN)
- // On Windows and Symbian, always call plugin to change geometry.
- setNPWindowRect(rect);
-#elif defined(XP_UNIX)
- // On Unix, multiple calls to setNPWindow() in windowed mode causes Flash to crash
- if (m_mode == NP_FULL || !m_isWindowed)
- setNPWindowRect(rect);
-#endif
-}
-
-void PluginView::frameRectsChanged()
-{
- updatePluginWidget();
-}
-
-void PluginView::handleEvent(Event* event)
-{
- if (!m_plugin || m_isWindowed)
- return;
-
- // Protect the plug-in from deletion while dispatching the event.
- RefPtr<PluginView> protect(this);
-
- if (event->isMouseEvent())
- handleMouseEvent(static_cast<MouseEvent*>(event));
- else if (event->isKeyboardEvent())
- handleKeyboardEvent(static_cast<KeyboardEvent*>(event));
-#if defined(ANDROID_PLUGINS)
-#if ENABLE(TOUCH_EVENTS)
- else if (event->isTouchEvent())
- handleTouchEvent(static_cast<TouchEvent*>(event));
-#endif
- else if (event->type() == eventNames().DOMFocusOutEvent)
- handleFocusEvent(false);
- else if (event->type() == eventNames().DOMFocusInEvent)
- handleFocusEvent(true);
-#endif
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
- else if (event->type() == eventNames().focusoutEvent)
- handleFocusOutEvent();
- else if (event->type() == eventNames().focusinEvent)
- handleFocusInEvent();
-#endif
-}
-
-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;
-
- // We only delay starting the plug-in if we're going to kick off the load
- // ourselves. Otherwise, the loader will try to deliver data before we've
- // started the plug-in.
- if (!m_loadManually && !m_parentFrame->page()->canStartMedia()) {
- m_parentFrame->document()->addMediaCanStartListener(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);
- ASSERT(m_plugin->pluginFuncs()->newp);
-
- NPError npErr;
- {
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- 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) {
- m_status = PluginStatusCanNotLoadPlugin;
- PluginMainThreadScheduler::scheduler().unregisterPlugin(m_instance);
- return false;
- }
-
- m_isStarted = true;
-
- if (!m_url.isEmpty() && !m_loadManually) {
- FrameLoadRequest frameLoadRequest(m_parentFrame->document()->securityOrigin());
- frameLoadRequest.resourceRequest().setHTTPMethod("GET");
- frameLoadRequest.resourceRequest().setURL(m_url);
-#ifdef ANDROID_PLUGINS
- if (!SecurityOrigin::shouldHideReferrer(
- m_url, m_parentFrame->loader()->outgoingReferrer()))
- frameLoadRequest.resourceRequest().setHTTPReferrer(
- m_parentFrame->loader()->outgoingReferrer());
-#endif
- load(frameLoadRequest, false, 0);
- }
-
- m_status = PluginStatusLoadedSuccessfully;
-
- if (!platformStart())
- m_status = PluginStatusCanNotLoadPlugin;
-
- if (m_status != PluginStatusLoadedSuccessfully)
- return false;
-
- if (parentFrame()->page())
- parentFrame()->page()->didStartPlugin(this);
-
- return true;
-}
-
-void PluginView::mediaCanStart()
-{
- ASSERT(!m_isStarted);
- if (!start())
- parentFrame()->loader()->client()->dispatchDidFailToStartPlugin(this);
-}
-
-PluginView::~PluginView()
-{
- LOG(Plugins, "PluginView::~PluginView()");
-
- ASSERT(!m_lifeSupportTimer.isActive());
-
- // If we failed to find the plug-in, we'll return early in our constructor, and
- // m_instance will be 0.
- if (m_instance)
- instanceMap().remove(m_instance);
-
- if (m_isWaitingToStart)
- m_parentFrame->document()->removeMediaCanStartListener(this);
-
- stop();
-
- deleteAllValues(m_requests);
-
- freeStringArray(m_paramNames, m_paramCount);
- freeStringArray(m_paramValues, m_paramCount);
-
- platformDestroy();
-
- m_parentFrame->script()->cleanupScriptObjectsForPlugin(this);
-
-#if PLATFORM(ANDROID)
- // Since we have no legacy plugins to check, we ignore the quirks check.
- if (m_plugin)
-#else
- if (m_plugin && !(m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin)))
-#endif
- m_plugin->unload();
-}
-
-void PluginView::stop()
-{
- if (!m_isStarted)
- return;
-
- if (parentFrame()->page())
- parentFrame()->page()->didStopPlugin(this);
-
- 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;
-
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-#ifdef XP_WIN
- // Unsubclass the window
- if (m_isWindowed) {
-#if OS(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_PTR)m_pluginWndProc);
-#endif
- }
-#endif // XP_WIN
-#endif // ENABLE(NETSCAPE_PLUGIN_API)
-
-#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)
-{
- s_currentPluginView = pluginView;
-}
-
-PluginView* PluginView::currentPluginView()
-{
- return s_currentPluginView;
-}
-
-static char* createUTF8String(const String& str)
-{
- CString cstr = str.utf8();
- char* result = reinterpret_cast<char*>(fastMalloc(cstr.length() + 1));
-
- strncpy(result, cstr.data(), cstr.length() + 1);
-
- return result;
-}
-
-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();
- if (m_parentFrame->loader()->documentLoader() != m_parentFrame->loader()->activeDocumentLoader() &&
- (targetFrameName.isNull() || m_parentFrame->tree()->find(targetFrameName) != m_parentFrame))
- return;
-
- KURL requestURL = request->frameLoadRequest().resourceRequest().url();
- String jsString = scriptStringIfJavaScriptURL(requestURL);
-
- if (jsString.isNull()) {
- // if this is not a targeted request, create a stream for it. otherwise,
- // just pass it off to the loader
- if (targetFrameName.isEmpty()) {
- RefPtr<PluginStream> stream = PluginStream::create(this, m_parentFrame.get(), request->frameLoadRequest().resourceRequest(), request->sendNotification(), request->notifyData(), plugin()->pluginFuncs(), instance(), m_plugin->quirks());
- m_streams.add(stream);
- stream->start();
- } else {
- // If the target frame is our frame, we could destroy the
- // PluginView, so we protect it. <rdar://problem/6991251>
- RefPtr<PluginView> protect(this);
-
- m_parentFrame->loader()->load(request->frameLoadRequest().resourceRequest(), targetFrameName, false);
-
- // FIXME: <rdar://problem/4807469> This should be sent when the document has finished loading
- if (request->sendNotification()) {
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->urlnotify(m_instance, requestURL.string().utf8().data(), NPRES_DONE, request->notifyData());
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
- }
- return;
- }
-
- // Targeted JavaScript requests are only allowed on the frame that contains the JavaScript plugin
- // and this has been made sure in ::load.
- ASSERT(targetFrameName.isEmpty() || m_parentFrame->tree()->find(targetFrameName) == m_parentFrame);
-
- // Executing a script can cause the plugin view to be destroyed, so we keep a reference to the parent frame.
- RefPtr<Frame> parentFrame = m_parentFrame;
- ScriptValue result = m_parentFrame->script()->executeScript(jsString, request->shouldAllowPopups());
-
- if (targetFrameName.isNull()) {
- String resultString;
-
-#if USE(JSC)
- ScriptState* scriptState = parentFrame->script()->globalObject(pluginWorld())->globalExec();
-#elif USE(V8)
- ScriptState* scriptState = 0; // Not used with V8
-#endif
- CString cstr;
- if (result.getString(scriptState, resultString))
- cstr = resultString.utf8();
-
- RefPtr<PluginStream> stream = PluginStream::create(this, m_parentFrame.get(), request->frameLoadRequest().resourceRequest(), request->sendNotification(), request->notifyData(), plugin()->pluginFuncs(), instance(), m_plugin->quirks());
- m_streams.add(stream);
- stream->sendJavaScriptStream(requestURL, cstr);
- }
-}
-
-void PluginView::requestTimerFired(Timer<PluginView>* timer)
-{
- ASSERT(timer == &m_requestTimer);
- ASSERT(m_requests.size() > 0);
- ASSERT(!m_isJavaScriptPaused);
-
- PluginRequest* request = m_requests[0];
- m_requests.remove(0);
-
- // Schedule a new request before calling performRequest since the call to
- // performRequest can cause the plugin view to be deleted.
- if (m_requests.size() > 0)
- m_requestTimer.startOneShot(0);
-
- performRequest(request);
- delete request;
-}
-
-void PluginView::scheduleRequest(PluginRequest* request)
-{
- m_requests.append(request);
-
- if (!m_isJavaScriptPaused)
- m_requestTimer.startOneShot(0);
-}
-
-NPError PluginView::load(const FrameLoadRequest& frameLoadRequest, bool sendNotification, void* notifyData)
-{
- ASSERT(frameLoadRequest.resourceRequest().httpMethod() == "GET" || frameLoadRequest.resourceRequest().httpMethod() == "POST");
-
- KURL url = frameLoadRequest.resourceRequest().url();
-
- if (url.isEmpty())
- return NPERR_INVALID_URL;
-
- // Don't allow requests to be made when the document loader is stopping all loaders.
- DocumentLoader* loader = m_parentFrame->loader()->documentLoader();
- if (!loader || loader->isStopping())
- return NPERR_GENERIC_ERROR;
-
- const String& targetFrameName = frameLoadRequest.frameName();
- String jsString = scriptStringIfJavaScriptURL(url);
-
- if (!jsString.isNull()) {
- // Return NPERR_GENERIC_ERROR if JS is disabled. This is what Mozilla does.
- if (!m_parentFrame->script()->canExecuteScripts(NotAboutToExecuteScript))
- return NPERR_GENERIC_ERROR;
-
- // For security reasons, only allow JS requests to be made on the frame that contains the plug-in.
- if (!targetFrameName.isNull() && m_parentFrame->tree()->find(targetFrameName) != m_parentFrame)
- return NPERR_INVALID_PARAM;
- } else if (!m_parentFrame->document()->securityOrigin()->canDisplay(url))
- return NPERR_GENERIC_ERROR;
-
- PluginRequest* request = new PluginRequest(frameLoadRequest, sendNotification, notifyData, arePopupsAllowed());
- scheduleRequest(request);
-
- return NPERR_NO_ERROR;
-}
-
-static KURL makeURL(const KURL& baseURL, const char* relativeURLString)
-{
- String urlString = relativeURLString;
-
- // Strip return characters.
- urlString.replace('\n', "");
- urlString.replace('\r', "");
-
- return KURL(baseURL, urlString);
-}
-
-NPError PluginView::getURLNotify(const char* url, const char* target, void* notifyData)
-{
- FrameLoadRequest frameLoadRequest(m_parentFrame->document()->securityOrigin());
-
- frameLoadRequest.setFrameName(target);
- frameLoadRequest.resourceRequest().setHTTPMethod("GET");
- frameLoadRequest.resourceRequest().setURL(makeURL(m_baseURL, url));
-#ifdef ANDROID_PLUGINS
- if (!SecurityOrigin::shouldHideReferrer(
- frameLoadRequest.resourceRequest().url(), m_url))
- frameLoadRequest.resourceRequest().setHTTPReferrer(m_url);
-#endif
-
- return load(frameLoadRequest, true, notifyData);
-}
-
-NPError PluginView::getURL(const char* url, const char* target)
-{
- FrameLoadRequest frameLoadRequest(m_parentFrame->document()->securityOrigin());
-
- frameLoadRequest.setFrameName(target);
- frameLoadRequest.resourceRequest().setHTTPMethod("GET");
- frameLoadRequest.resourceRequest().setURL(makeURL(m_baseURL, url));
-#ifdef ANDROID_PLUGINS
- if (!SecurityOrigin::shouldHideReferrer(
- frameLoadRequest.resourceRequest().url(), m_url))
- frameLoadRequest.resourceRequest().setHTTPReferrer(m_url);
-#endif
-
- return load(frameLoadRequest, false, 0);
-}
-
-NPError PluginView::postURLNotify(const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData)
-{
- return handlePost(url, target, len, buf, file, notifyData, true, true);
-}
-
-NPError PluginView::postURL(const char* url, const char* target, uint32_t len, const char* buf, NPBool file)
-{
- // As documented, only allow headers to be specified via NPP_PostURL when using a file.
- return handlePost(url, target, len, buf, file, 0, false, file);
-}
-
-NPError PluginView::newStream(NPMIMEType type, const char* target, NPStream** stream)
-{
- notImplemented();
- // Unsupported
- return NPERR_GENERIC_ERROR;
-}
-
-int32_t PluginView::write(NPStream* stream, int32_t len, void* buffer)
-{
- notImplemented();
- // Unsupported
- return -1;
-}
-
-NPError PluginView::destroyStream(NPStream* stream, NPReason reason)
-{
- if (!stream || PluginStream::ownerForStream(stream) != m_instance)
- return NPERR_INVALID_INSTANCE_ERROR;
-
- PluginStream* browserStream = static_cast<PluginStream*>(stream->ndata);
- browserStream->cancelAndDestroyStream(reason);
-
- return NPERR_NO_ERROR;
-}
-
-void PluginView::status(const char* message)
-{
- if (Page* page = m_parentFrame->page())
- page->chrome()->setStatusbarText(m_parentFrame.get(), String::fromUTF8(message));
-}
-
-NPError PluginView::setValue(NPPVariable variable, void* value)
-{
- LOG(Plugins, "PluginView::setValue(%s): ", prettyNameForNPPVariable(variable, value).data());
-
- switch (variable) {
- case NPPVpluginWindowBool:
- m_isWindowed = value;
- return NPERR_NO_ERROR;
- case NPPVpluginTransparentBool:
- m_isTransparent = value;
- return NPERR_NO_ERROR;
-#if defined(XP_MACOSX)
- case NPPVpluginDrawingModel: {
- // Can only set drawing model inside NPP_New()
- if (this != currentPluginView())
- return NPERR_GENERIC_ERROR;
-
- NPDrawingModel newDrawingModel = NPDrawingModel(uintptr_t(value));
- switch (newDrawingModel) {
- case NPDrawingModelCoreGraphics:
- m_drawingModel = newDrawingModel;
- return NPERR_NO_ERROR;
-#ifndef NP_NO_QUICKDRAW
- case NPDrawingModelQuickDraw:
-#endif
- case NPDrawingModelCoreAnimation:
- default:
- LOG(Plugins, "Plugin asked for unsupported drawing model: %s",
- prettyNameForDrawingModel(newDrawingModel));
- return NPERR_GENERIC_ERROR;
- }
- }
-
- case NPPVpluginEventModel: {
- // Can only set event model inside NPP_New()
- if (this != currentPluginView())
- return NPERR_GENERIC_ERROR;
-
- NPEventModel newEventModel = NPEventModel(uintptr_t(value));
- switch (newEventModel) {
-#ifndef NP_NO_CARBON
- case NPEventModelCarbon:
-#endif
- case NPEventModelCocoa:
- m_eventModel = newEventModel;
- return NPERR_NO_ERROR;
-
- default:
- LOG(Plugins, "Plugin asked for unsupported event model: %s",
- prettyNameForEventModel(newEventModel));
- return NPERR_GENERIC_ERROR;
- }
- }
-#endif // defined(XP_MACOSX)
-
-#if PLATFORM(QT) && defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- case NPPVpluginWindowlessLocalBool:
- m_renderToImage = true;
- return NPERR_NO_ERROR;
-#endif
-
- default:
-#ifdef PLUGIN_PLATFORM_SETVALUE
- return platformSetValue(variable, value);
-#else
- notImplemented();
- return NPERR_GENERIC_ERROR;
-#endif
- }
-}
-
-void PluginView::invalidateTimerFired(Timer<PluginView>* timer)
-{
- ASSERT(timer == &m_invalidateTimer);
-
- for (unsigned i = 0; i < m_invalidRects.size(); i++)
- invalidateRect(m_invalidRects[i]);
- m_invalidRects.clear();
-}
-
-
-void PluginView::pushPopupsEnabledState(bool state)
-{
- m_popupStateStack.append(state);
-}
-
-void PluginView::popPopupsEnabledState()
-{
- m_popupStateStack.removeLast();
-}
-
-bool PluginView::arePopupsAllowed() const
-{
- if (!m_popupStateStack.isEmpty())
- return m_popupStateStack.last();
-
- return false;
-}
-
-void PluginView::setJavaScriptPaused(bool paused)
-{
- if (m_isJavaScriptPaused == paused)
- return;
- m_isJavaScriptPaused = paused;
-
- if (m_isJavaScriptPaused)
- m_requestTimer.stop();
- else if (!m_requests.isEmpty())
- m_requestTimer.startOneShot(0);
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-NPObject* PluginView::npObject()
-{
- NPObject* object = 0;
-
- if (!m_isStarted || !m_plugin || !m_plugin->pluginFuncs()->getvalue)
- return 0;
-
- // On Windows, calling Java's NPN_GetValue can allow the message loop to
- // run, allowing loading to take place or JavaScript to run. Protect the
- // PluginView from destruction. <rdar://problem/6978804>
- RefPtr<PluginView> protect(this);
-
- NPError npErr;
- {
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- npErr = m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginScriptableNPObject, &object);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
-
- if (npErr != NPERR_NO_ERROR)
- return 0;
-
- return object;
-}
-#endif
-
-#if USE(JSC)
-PassRefPtr<JSC::Bindings::Instance> PluginView::bindingInstance()
-{
-#if ENABLE(NETSCAPE_PLUGIN_API)
- NPObject* object = npObject();
- if (!object)
- return 0;
-
- if (hasOneRef()) {
- // The renderer for the PluginView was destroyed during the above call, and
- // the PluginView will be destroyed when this function returns, so we
- // return null.
- return 0;
- }
-
- RefPtr<JSC::Bindings::RootObject> root = m_parentFrame->script()->createRootObject(this);
- RefPtr<JSC::Bindings::Instance> instance = JSC::Bindings::CInstance::create(object, root.release());
-
- _NPN_ReleaseObject(object);
-
- return instance.release();
-#else
- return 0;
-#endif
-}
-#endif
-
-#if USE(V8)
-// This is really JS engine independent
-NPObject* PluginView::getNPObject() {
-#if ENABLE(NETSCAPE_PLUGIN_API)
- if (!m_plugin || !m_plugin->pluginFuncs()->getvalue)
- return 0;
-
- NPObject* object = 0;
-
- NPError npErr;
- {
- PluginView::setCurrentPluginView(this);
- setCallingPlugin(true);
- npErr = m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginScriptableNPObject, &object);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
-
- if (npErr != NPERR_NO_ERROR || !object)
- return 0;
-
- // Bindings::CInstance (used in JSC version) retains the object, so in ~PluginView() it calls
- // cleanupScriptObjectsForPlugin() to releases the object. To maintain the reference count,
- // don't call _NPN_ReleaseObject(object) here.
- return object;
-#else
- return 0;
-#endif // NETSCAPE_PLUGIN_API
-}
-#endif // V8
-
-void PluginView::disconnectStream(PluginStream* stream)
-{
- ASSERT(m_streams.contains(stream));
-
- m_streams.remove(stream);
-}
-
-void PluginView::setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues)
-{
- ASSERT(paramNames.size() == paramValues.size());
-
- unsigned size = paramNames.size();
- unsigned paramCount = 0;
-
- m_paramNames = reinterpret_cast<char**>(fastMalloc(sizeof(char*) * size));
- m_paramValues = reinterpret_cast<char**>(fastMalloc(sizeof(char*) * size));
-
- for (unsigned i = 0; i < size; i++) {
- 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]);
-
- paramCount++;
- }
-
- m_paramCount = paramCount;
-}
-
-PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* plugin, Element* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually)
- : m_parentFrame(parentFrame)
- , m_plugin(plugin)
- , m_element(element)
- , m_isStarted(false)
- , m_url(url)
- , m_baseURL(m_parentFrame->loader()->completeURL(m_parentFrame->document()->baseURL().string()))
- , m_status(PluginStatusLoadedSuccessfully)
- , m_requestTimer(this, &PluginView::requestTimerFired)
- , m_invalidateTimer(this, &PluginView::invalidateTimerFired)
- , m_popPopupsStateTimer(this, &PluginView::popPopupsStateTimerFired)
- , m_lifeSupportTimer(this, &PluginView::lifeSupportTimerFired)
- , m_mode(loadManually ? NP_FULL : NP_EMBED)
- , m_paramNames(0)
- , m_paramValues(0)
- , m_mimeType(mimeType)
- , m_instance(0)
-#if defined(XP_MACOSX)
- , m_isWindowed(false)
-#else
- , m_isWindowed(true)
-#endif
- , m_isTransparent(false)
- , m_haveInitialized(false)
- , m_isWaitingToStart(false)
-#if defined(XP_UNIX)
- , m_needsXEmbed(false)
-#endif
-#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
- , m_pluginWndProc(0)
- , m_lastMessage(0)
- , m_isCallingPluginWndProc(false)
- , m_wmPrintHDC(0)
- , m_haveUpdatedPluginWidget(false)
-#endif
-#if (PLATFORM(QT) && OS(WINDOWS)) || defined(XP_MACOSX)
- , m_window(0)
-#endif
-#if defined(XP_MACOSX)
- , m_drawingModel(NPDrawingModel(-1))
- , m_eventModel(NPEventModel(-1))
- , m_contextRef(0)
- , m_fakeWindow(0)
-#endif
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
- , m_hasPendingGeometryChange(true)
- , m_drawable(0)
- , m_visual(0)
- , m_colormap(0)
- , m_pluginDisplay(0)
-#endif
-#if PLATFORM(QT) && defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- , m_renderToImage(false)
-#endif
- , m_loadManually(loadManually)
- , m_manualStream(0)
- , m_isJavaScriptPaused(false)
- , m_isHalted(false)
- , m_hasBeenHalted(false)
- , m_haveCalledSetWindow(false)
-{
-#if defined(ANDROID_PLUGINS)
- platformInit();
-#endif
-
- if (!m_plugin) {
- m_status = PluginStatusCanNotFindPlugin;
- return;
- }
-
- m_instance = &m_instanceStruct;
- m_instance->ndata = this;
- m_instance->pdata = 0;
-
- instanceMap().add(m_instance, this);
-
- setParameters(paramNames, paramValues);
-
- memset(&m_npWindow, 0, sizeof(m_npWindow));
-#if defined(XP_MACOSX)
- memset(&m_npCgContext, 0, sizeof(m_npCgContext));
-#endif
-
- resize(size);
-}
-
-void PluginView::focusPluginElement()
-{
- // Focus the plugin
- if (Page* page = m_parentFrame->page())
- page->focusController()->setFocusedFrame(m_parentFrame);
- m_parentFrame->document()->setFocusedNode(m_element);
-}
-
-void PluginView::didReceiveResponse(const ResourceResponse& response)
-{
- if (m_status != PluginStatusLoadedSuccessfully)
- return;
-
- ASSERT(m_loadManually);
- ASSERT(!m_manualStream);
-
- m_manualStream = PluginStream::create(this, m_parentFrame.get(), m_parentFrame->loader()->activeDocumentLoader()->request(), false, 0, plugin()->pluginFuncs(), instance(), m_plugin->quirks());
- m_manualStream->setLoadManually(true);
-
- m_manualStream->didReceiveResponse(0, response);
-}
-
-void PluginView::didReceiveData(const char* data, int length)
-{
- if (m_status != PluginStatusLoadedSuccessfully)
- return;
-
- ASSERT(m_loadManually);
- ASSERT(m_manualStream);
-
- m_manualStream->didReceiveData(0, data, length);
-}
-
-void PluginView::didFinishLoading()
-{
- if (m_status != PluginStatusLoadedSuccessfully)
- return;
-
- ASSERT(m_loadManually);
- ASSERT(m_manualStream);
-
- m_manualStream->didFinishLoading(0);
-}
-
-void PluginView::didFail(const ResourceError& error)
-{
- if (m_status != PluginStatusLoadedSuccessfully)
- return;
-
- ASSERT(m_loadManually);
- ASSERT(m_manualStream);
-
- m_manualStream->didFail(0, error);
-}
-
-void PluginView::setCallingPlugin(bool b) const
-{
- if (!m_plugin->quirks().contains(PluginQuirkHasModalMessageLoop))
- return;
-
- if (b)
- ++s_callingPlugin;
- else
- --s_callingPlugin;
-
- ASSERT(s_callingPlugin >= 0);
-}
-
-bool PluginView::isCallingPlugin()
-{
- return s_callingPlugin > 0;
-}
-
-PassRefPtr<PluginView> PluginView::create(Frame* parentFrame, const IntSize& size, Element* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually)
-{
- // if we fail to find a plugin for this MIME type, findPlugin will search for
- // a plugin by the file extension and update the MIME type, so pass a mutable String
- String mimeTypeCopy = mimeType;
- PluginPackage* plugin = PluginDatabase::installedPlugins()->findPlugin(url, mimeTypeCopy);
-
- // No plugin was found, try refreshing the database and searching again
- if (!plugin && PluginDatabase::installedPlugins()->refresh()) {
- mimeTypeCopy = mimeType;
- plugin = PluginDatabase::installedPlugins()->findPlugin(url, mimeTypeCopy);
- }
-
- return adoptRef(new PluginView(parentFrame, size, plugin, element, url, paramNames, paramValues, mimeTypeCopy, loadManually));
-}
-
-void PluginView::freeStringArray(char** stringArray, int length)
-{
- if (!stringArray)
- return;
-
- for (int i = 0; i < length; i++)
- fastFree(stringArray[i]);
-
- fastFree(stringArray);
-}
-
-static inline bool startsWithBlankLine(const Vector<char>& buffer)
-{
- return buffer.size() > 0 && buffer[0] == '\n';
-}
-
-static inline int locationAfterFirstBlankLine(const Vector<char>& buffer)
-{
- const char* bytes = buffer.data();
- unsigned length = buffer.size();
-
- for (unsigned i = 0; i < length - 4; i++) {
- // Support for Acrobat. It sends "\n\n".
- if (bytes[i] == '\n' && bytes[i + 1] == '\n')
- return i + 2;
-
- // Returns the position after 2 CRLF's or 1 CRLF if it is the first line.
- if (bytes[i] == '\r' && bytes[i + 1] == '\n') {
- i += 2;
- if (i == 2)
- return i;
- else if (bytes[i] == '\n')
- // Support for Director. It sends "\r\n\n" (3880387).
- return i + 1;
- else if (bytes[i] == '\r' && bytes[i + 1] == '\n')
- // Support for Flash. It sends "\r\n\r\n" (3758113).
- return i + 2;
- }
- }
-
- return -1;
-}
-
-static inline const char* findEOL(const char* bytes, unsigned length)
-{
- // According to the HTTP specification EOL is defined as
- // a CRLF pair. Unfortunately, some servers will use LF
- // instead. Worse yet, some servers will use a combination
- // of both (e.g. <header>CRLFLF<body>), so findEOL needs
- // to be more forgiving. It will now accept CRLF, LF or
- // CR.
- //
- // It returns NULL if EOLF is not found or it will return
- // a pointer to the first terminating character.
- for (unsigned i = 0; i < length; i++) {
- if (bytes[i] == '\n')
- return bytes + i;
- if (bytes[i] == '\r') {
- // Check to see if spanning buffer bounds
- // (CRLF is across reads). If so, wait for
- // next read.
- if (i + 1 == length)
- break;
-
- return bytes + i;
- }
- }
-
- return 0;
-}
-
-static inline String capitalizeRFC822HeaderFieldName(const String& name)
-{
- bool capitalizeCharacter = true;
- String result;
-
- for (unsigned i = 0; i < name.length(); i++) {
- UChar c;
-
- if (capitalizeCharacter && name[i] >= 'a' && name[i] <= 'z')
- c = toASCIIUpper(name[i]);
- else if (!capitalizeCharacter && name[i] >= 'A' && name[i] <= 'Z')
- c = toASCIILower(name[i]);
- else
- c = name[i];
-
- if (name[i] == '-')
- capitalizeCharacter = true;
- else
- capitalizeCharacter = false;
-
- result.append(c);
- }
-
- return result;
-}
-
-static inline HTTPHeaderMap parseRFC822HeaderFields(const Vector<char>& buffer, unsigned length)
-{
- const char* bytes = buffer.data();
- const char* eol;
- String lastKey;
- HTTPHeaderMap headerFields;
-
- // Loop ove rlines until we're past the header, or we can't find any more end-of-lines
- while ((eol = findEOL(bytes, length))) {
- const char* line = bytes;
- int lineLength = eol - bytes;
-
- // Move bytes to the character after the terminator as returned by findEOL.
- bytes = eol + 1;
- if ((*eol == '\r') && (*bytes == '\n'))
- bytes++; // Safe since findEOL won't return a spanning CRLF.
-
- length -= (bytes - line);
- if (lineLength == 0)
- // Blank line; we're at the end of the header
- break;
- else if (*line == ' ' || *line == '\t') {
- // Continuation of the previous header
- if (lastKey.isNull()) {
- // malformed header; ignore it and continue
- continue;
- } else {
- // Merge the continuation of the previous header
- String currentValue = headerFields.get(lastKey);
- String newValue(line, lineLength);
-
- headerFields.set(lastKey, currentValue + newValue);
- }
- } else {
- // Brand new header
- const char* colon;
- for (colon = line; *colon != ':' && colon != eol; colon++) {
- // empty loop
- }
- if (colon == eol)
- // malformed header; ignore it and continue
- continue;
- else {
- lastKey = capitalizeRFC822HeaderFieldName(String(line, colon - line));
- String value;
-
- for (colon++; colon != eol; colon++) {
- if (*colon != ' ' && *colon != '\t')
- break;
- }
- if (colon == eol)
- value = "";
- else
- value = String(colon, eol - colon);
-
- String oldValue = headerFields.get(lastKey);
- if (!oldValue.isNull()) {
- String tmp = oldValue;
- tmp += ", ";
- tmp += value;
- value = tmp;
- }
-
- headerFields.set(lastKey, value);
- }
- }
- }
-
- return headerFields;
-}
-
-NPError PluginView::handlePost(const char* url, const char* target, uint32_t len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders)
-{
- if (!url || !len || !buf)
- return NPERR_INVALID_PARAM;
-
- FrameLoadRequest frameLoadRequest(m_parentFrame->document()->securityOrigin());
-
- HTTPHeaderMap headerFields;
- Vector<char> buffer;
-
- if (file) {
- NPError readResult = handlePostReadFile(buffer, len, buf);
- if(readResult != NPERR_NO_ERROR)
- return readResult;
- } else {
- buffer.resize(len);
- memcpy(buffer.data(), buf, len);
- }
-
- const char* postData = buffer.data();
- int postDataLength = buffer.size();
-
- if (allowHeaders) {
- if (startsWithBlankLine(buffer)) {
- postData++;
- postDataLength--;
- } else {
- int location = locationAfterFirstBlankLine(buffer);
- if (location != -1) {
- // If the blank line is somewhere in the middle of the buffer, everything before is the header
- headerFields = parseRFC822HeaderFields(buffer, location);
- unsigned dataLength = buffer.size() - location;
-
- // Sometimes plugins like to set Content-Length themselves when they post,
- // but WebFoundation does not like that. So we will remove the header
- // and instead truncate the data to the requested length.
- String contentLength = headerFields.get("Content-Length");
-
- if (!contentLength.isNull())
- dataLength = min(contentLength.toInt(), (int)dataLength);
- headerFields.remove("Content-Length");
-
- postData += location;
- postDataLength = dataLength;
- }
- }
- }
-
- frameLoadRequest.resourceRequest().setHTTPMethod("POST");
- frameLoadRequest.resourceRequest().setURL(makeURL(m_baseURL, url));
- frameLoadRequest.resourceRequest().addHTTPHeaderFields(headerFields);
- frameLoadRequest.resourceRequest().setHTTPBody(FormData::create(postData, postDataLength));
- frameLoadRequest.setFrameName(target);
-
- return load(frameLoadRequest, sendNotification, notifyData);
-}
-
-#ifdef PLUGIN_SCHEDULE_TIMER
-uint32_t PluginView::scheduleTimer(NPP instance, uint32_t interval, bool repeat,
- void (*timerFunc)(NPP, uint32_t timerID))
-{
- return m_timerList.schedule(instance, interval, repeat, timerFunc);
-}
-
-void PluginView::unscheduleTimer(NPP instance, uint32_t timerID)
-{
- m_timerList.unschedule(instance, timerID);
-}
-#endif
-
-void PluginView::invalidateWindowlessPluginRect(const IntRect& rect)
-{
- if (!isVisible())
- return;
-
- if (!m_element->renderer())
- return;
- RenderBox* renderer = toRenderBox(m_element->renderer());
-
- IntRect dirtyRect = rect;
- dirtyRect.move(renderer->borderLeft() + renderer->paddingLeft(), renderer->borderTop() + renderer->paddingTop());
- renderer->repaintRectangle(dirtyRect);
-}
-
-void PluginView::paintMissingPluginIcon(GraphicsContext* context, const IntRect& rect)
-{
- static RefPtr<Image> nullPluginImage;
- if (!nullPluginImage)
- nullPluginImage = Image::loadPlatformResource("nullPlugin");
-
- IntRect imageRect(frameRect().x(), frameRect().y(), nullPluginImage->width(), nullPluginImage->height());
-
- int xOffset = (frameRect().width() - imageRect.width()) / 2;
- int yOffset = (frameRect().height() - imageRect.height()) / 2;
-
- imageRect.move(xOffset, yOffset);
-
- if (!rect.intersects(imageRect))
- return;
-
- context->save();
- context->clip(windowClipRect());
- context->drawImage(nullPluginImage.get(), ColorSpaceDeviceRGB, imageRect.location());
- 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 OS(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 !PLATFORM(ANDROID)
- if (m_plugin->quirks().contains(PluginQuirkWantsMozillaUserAgent))
- return MozillaUserAgent;
-#endif
-
- 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
-
-
-Node* PluginView::node() const
-{
- return m_element;
-}
-
-String PluginView::pluginName() const
-{
- return m_plugin->name();
-}
-
-void PluginView::lifeSupportTimerFired(Timer<PluginView>*)
-{
- deref();
-}
-
-void PluginView::keepAlive()
-{
- if (m_lifeSupportTimer.isActive())
- return;
-
- ref();
- m_lifeSupportTimer.startOneShot(0);
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-void PluginView::keepAlive(NPP instance)
-{
- PluginView* view = instanceMap().get(instance);
- if (!view)
- return;
-
- view->keepAlive();
-}
-
-NPError PluginView::getValueStatic(NPNVariable variable, void* value)
-{
- LOG(Plugins, "PluginView::getValueStatic(%s)", prettyNameForNPNVariable(variable).data());
-
- NPError result;
- if (platformGetValueStatic(variable, value, &result))
- return result;
-
- return NPERR_GENERIC_ERROR;
-}
-
-NPError PluginView::getValue(NPNVariable variable, void* value)
-{
- LOG(Plugins, "PluginView::getValue(%s)", prettyNameForNPNVariable(variable).data());
-
- NPError result;
- if (platformGetValue(variable, value, &result))
- return result;
-
- if (platformGetValueStatic(variable, value, &result))
- return result;
-
- switch (variable) {
- case NPNVWindowNPObject: {
- if (m_isJavaScriptPaused)
- return NPERR_GENERIC_ERROR;
-
- NPObject* windowScriptObject = m_parentFrame->script()->windowScriptNPObject();
-
- // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugin/npruntime.html>
- if (windowScriptObject)
- _NPN_RetainObject(windowScriptObject);
-
- void** v = (void**)value;
- *v = windowScriptObject;
-
- return NPERR_NO_ERROR;
- }
-
- case NPNVPluginElementNPObject: {
- if (m_isJavaScriptPaused)
- return NPERR_GENERIC_ERROR;
-
- NPObject* pluginScriptObject = 0;
-
- if (m_element->hasTagName(appletTag) || m_element->hasTagName(embedTag) || m_element->hasTagName(objectTag))
- pluginScriptObject = static_cast<HTMLPlugInElement*>(m_element)->getNPObject();
-
- // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugin/npruntime.html>
- if (pluginScriptObject)
- _NPN_RetainObject(pluginScriptObject);
-
- void** v = (void**)value;
- *v = pluginScriptObject;
-
- return NPERR_NO_ERROR;
- }
-
- case NPNVprivateModeBool: {
- Page* page = m_parentFrame->page();
- if (!page)
- return NPERR_GENERIC_ERROR;
- *((NPBool*)value) = !page->settings() || page->settings()->privateBrowsingEnabled();
- return NPERR_NO_ERROR;
- }
-
- default:
- return NPERR_GENERIC_ERROR;
- }
-}
-
-static Frame* getFrame(Frame* parentFrame, Element* element)
-{
- if (parentFrame)
- return parentFrame;
-
- Document* document = element->document();
- if (!document)
- document = element->ownerDocument();
- if (document)
- return document->frame();
-
- return 0;
-}
-
-NPError PluginView::getValueForURL(NPNURLVariable variable, const char* url, char** value, uint32_t* len)
-{
- LOG(Plugins, "PluginView::getValueForURL(%s)", prettyNameForNPNURLVariable(variable).data());
-
- NPError result = NPERR_NO_ERROR;
-
- switch (variable) {
- case NPNURLVCookie: {
- KURL u(m_baseURL, url);
- if (u.isValid()) {
- Frame* frame = getFrame(parentFrame(), m_element);
- if (frame) {
- const CString cookieStr = cookies(frame->document(), u).utf8();
- if (!cookieStr.isNull()) {
- const int size = cookieStr.length();
- *value = static_cast<char*>(NPN_MemAlloc(size+1));
- if (*value) {
- memset(*value, 0, size+1);
- memcpy(*value, cookieStr.data(), size+1);
- if (len)
- *len = size;
- } else
- result = NPERR_OUT_OF_MEMORY_ERROR;
- }
- }
- } else
- result = NPERR_INVALID_URL;
- break;
- }
- case NPNURLVProxy: {
- KURL u(m_baseURL, url);
- if (u.isValid()) {
- Frame* frame = getFrame(parentFrame(), m_element);
- const FrameLoader* frameLoader = frame ? frame->loader() : 0;
- const NetworkingContext* context = frameLoader ? frameLoader->networkingContext() : 0;
- const CString proxyStr = toString(proxyServersForURL(u, context)).utf8();
- if (!proxyStr.isNull()) {
- const int size = proxyStr.length();
- *value = static_cast<char*>(NPN_MemAlloc(size+1));
- if (*value) {
- memset(*value, 0, size+1);
- memcpy(*value, proxyStr.data(), size+1);
- if (len)
- *len = size;
- } else
- result = NPERR_OUT_OF_MEMORY_ERROR;
- }
- } else
- result = NPERR_INVALID_URL;
- break;
- }
- default:
- result = NPERR_GENERIC_ERROR;
- LOG(Plugins, "PluginView::getValueForURL: %s", prettyNameForNPNURLVariable(variable).data());
- break;
- }
-
- return result;
-}
-
-
-NPError PluginView::setValueForURL(NPNURLVariable variable, const char* url, const char* value, uint32_t len)
-{
- LOG(Plugins, "PluginView::setValueForURL(%s)", prettyNameForNPNURLVariable(variable).data());
-
- NPError result = NPERR_NO_ERROR;
-
- switch (variable) {
- case NPNURLVCookie: {
- KURL u(m_baseURL, url);
- if (u.isValid()) {
- const String cookieStr = String::fromUTF8(value, len);
- Frame* frame = getFrame(parentFrame(), m_element);
- if (frame && !cookieStr.isEmpty())
- setCookies(frame->document(), u, cookieStr);
- } else
- result = NPERR_INVALID_URL;
- break;
- }
- case NPNURLVProxy:
- LOG(Plugins, "PluginView::setValueForURL(%s): Plugins are NOT allowed to set proxy information.", prettyNameForNPNURLVariable(variable).data());
- result = NPERR_GENERIC_ERROR;
- break;
- default:
- LOG(Plugins, "PluginView::setValueForURL: %s", prettyNameForNPNURLVariable(variable).data());
- result = NPERR_GENERIC_ERROR;
- break;
- }
-
- return result;
-}
-
-NPError PluginView::getAuthenticationInfo(const char* protocol, const char* host, int32_t port, const char* scheme, const char* realm, char** username, uint32_t* ulen, char** password, uint32_t* plen)
-{
- LOG(Plugins, "PluginView::getAuthenticationInfo: protocol=%s, host=%s, port=%d", protocol, host, port);
- notImplemented();
- return NPERR_GENERIC_ERROR;
-}
-#endif
-
-void PluginView::privateBrowsingStateChanged(bool privateBrowsingEnabled)
-{
- NPP_SetValueProcPtr setValue = m_plugin->pluginFuncs()->setvalue;
- if (!setValue)
- return;
-
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- NPBool value = privateBrowsingEnabled;
- setValue(m_instance, NPNVprivateModeBool, &value);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(NETSCAPE_PLUGIN_API)
diff --git a/WebCore/plugins/PluginView.h b/WebCore/plugins/PluginView.h
deleted file mode 100644
index 2ecdc51..0000000
--- a/WebCore/plugins/PluginView.h
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 PluginView_h
-#define PluginView_h
-
-#include "FrameLoadRequest.h"
-#include "HaltablePlugin.h"
-#include "IntRect.h"
-#include "MediaCanStartListener.h"
-#include "PluginViewBase.h"
-#include "ResourceRequest.h"
-#include "Timer.h"
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefPtr.h>
-#include <wtf/Vector.h>
-#include <wtf/text/CString.h>
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-#include "PluginStream.h"
-#include "npruntime_internal.h"
-#endif
-
-// ANDROID
-// TODO: Upstream to webkit.org
-#ifdef PLUGIN_SCHEDULE_TIMER
-#include "PluginTimer.h"
-#endif
-
-#if OS(WINDOWS) && (PLATFORM(QT) || PLATFORM(WX))
-typedef struct HWND__* HWND;
-typedef HWND PlatformPluginWidget;
-#elif defined(ANDROID_PLUGINS)
-typedef struct PluginWidgetAndroid* PlatformPluginWidget;
-#else
-typedef PlatformWidget PlatformPluginWidget;
-#if defined(XP_MACOSX) && PLATFORM(QT)
-#include <QPixmap>
-#endif
-#endif
-#if PLATFORM(QT)
-#include <QGraphicsItem>
-#include <QImage>
-class QPainter;
-#endif
-
-#if USE(JSC)
-namespace JSC {
- namespace Bindings {
- class Instance;
- }
-}
-#endif
-
-class NPObject;
-
-namespace WebCore {
- class Element;
- class Frame;
- class Image;
- class KeyboardEvent;
- class MouseEvent;
-#ifdef ANDROID_PLUGINS
- class TouchEvent;
-#endif
- class KURL;
-#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
- class PluginMessageThrottlerWin;
-#endif
- class PluginPackage;
- class PluginRequest;
- class PluginStream;
- class ResourceError;
- class ResourceResponse;
-
- enum PluginStatus {
- PluginStatusCanNotFindPlugin,
- PluginStatusCanNotLoadPlugin,
- PluginStatusLoadedSuccessfully
- };
-
- class PluginRequest : public Noncopyable {
- public:
- PluginRequest(const FrameLoadRequest& frameLoadRequest, bool sendNotification, void* notifyData, bool shouldAllowPopups)
- : m_frameLoadRequest(frameLoadRequest)
- , m_notifyData(notifyData)
- , m_sendNotification(sendNotification)
- , m_shouldAllowPopups(shouldAllowPopups) { }
- public:
- const FrameLoadRequest& frameLoadRequest() const { return m_frameLoadRequest; }
- void* notifyData() const { return m_notifyData; }
- bool sendNotification() const { return m_sendNotification; }
- bool shouldAllowPopups() const { return m_shouldAllowPopups; }
- private:
- FrameLoadRequest m_frameLoadRequest;
- void* m_notifyData;
- bool m_sendNotification;
- bool m_shouldAllowPopups;
- };
-
- class PluginManualLoader {
- public:
- virtual ~PluginManualLoader() {}
- virtual void didReceiveResponse(const ResourceResponse&) = 0;
- virtual void didReceiveData(const char*, int) = 0;
- virtual void didFinishLoading() = 0;
- virtual void didFail(const ResourceError&) = 0;
- };
-
- class PluginView : public PluginViewBase
-#if ENABLE(NETSCAPE_PLUGIN_API)
- , private PluginStreamClient
-#endif
- , public PluginManualLoader
- , private HaltablePlugin
- , private MediaCanStartListener {
- public:
- static PassRefPtr<PluginView> create(Frame* parentFrame, const IntSize&, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
- virtual ~PluginView();
-
- PluginPackage* plugin() const { return m_plugin.get(); }
-#if ENABLE(NETSCAPE_PLUGIN_API)
- NPP instance() const { return m_instance; }
-#endif
-
- void setNPWindowRect(const IntRect&);
- static PluginView* currentPluginView();
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
- NPObject* npObject();
-#endif
-#if USE(JSC)
- PassRefPtr<JSC::Bindings::Instance> bindingInstance();
-#endif
-
- PluginStatus status() const { return m_status; }
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
- // NPN functions
- NPError getURLNotify(const char* url, const char* target, void* notifyData);
- NPError getURL(const char* url, const char* target);
- NPError postURLNotify(const char* url, const char* target, uint32_t len, const char* but, NPBool file, void* notifyData);
- NPError postURL(const char* url, const char* target, uint32_t len, const char* but, NPBool file);
- NPError newStream(NPMIMEType type, const char* target, NPStream** stream);
- int32_t write(NPStream* stream, int32_t len, void* buffer);
- NPError destroyStream(NPStream* stream, NPReason reason);
-#endif
- const char* userAgent();
-#if ENABLE(NETSCAPE_PLUGIN_API)
- static const char* userAgentStatic();
-#endif
- void status(const char* message);
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
- NPError getValue(NPNVariable variable, void* value);
- static NPError getValueStatic(NPNVariable variable, void* value);
- NPError setValue(NPPVariable variable, void* value);
- NPError getValueForURL(NPNURLVariable variable, const char* url, char** value, uint32_t* len);
- NPError setValueForURL(NPNURLVariable variable, const char* url, const char* value, uint32_t len);
- NPError getAuthenticationInfo(const char* protocol, const char* host, int32_t port, const char* scheme, const char* realm, char** username, uint32_t* ulen, char** password, uint32_t* plen);
- void invalidateRect(NPRect*);
- void invalidateRegion(NPRegion);
-#endif
- void forceRedraw();
- void pushPopupsEnabledState(bool state);
- void popPopupsEnabledState();
-#ifdef PLUGIN_SCHEDULE_TIMER
- uint32_t scheduleTimer(NPP, uint32_t interval, bool repeat,
- void (*timerFunc)(NPP, uint32_t timerID));
- void unscheduleTimer(NPP, uint32_t timerID);
-#endif
-#if USE(V8)
- NPObject* getNPObject();
-#endif
-
- virtual void invalidateRect(const IntRect&);
-
- bool arePopupsAllowed() const;
-
- void setJavaScriptPaused(bool);
-
- void privateBrowsingStateChanged(bool);
-
- void disconnectStream(PluginStream*);
- void streamDidFinishLoading(PluginStream* stream) { disconnectStream(stream); }
-
- // Widget functions
- virtual void setFrameRect(const IntRect&);
- virtual void frameRectsChanged();
- virtual void setFocus(bool);
- virtual void show();
- virtual void hide();
- virtual void paint(GraphicsContext*, const IntRect&);
-
- // This method is used by plugins on all platforms to obtain a clip rect that includes clips set by WebCore,
- // e.g., in overflow:auto sections. The clip rects coordinates are in the containing window's coordinate space.
- // This clip includes any clips that the widget itself sets up for its children.
- IntRect windowClipRect() const;
-
- virtual void handleEvent(Event*);
- virtual void setParent(ScrollView*);
- virtual void setParentVisible(bool);
-
- virtual bool isPluginView() const { return true; }
-
- Frame* parentFrame() const { return m_parentFrame.get(); }
-
- void focusPluginElement();
-
- const String& pluginsPage() const { return m_pluginsPage; }
- const String& mimeType() const { return m_mimeType; }
- const KURL& url() const { return m_url; }
-
-#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
- static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM);
- LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
- WNDPROC pluginWndProc() const { return m_pluginWndProc; }
-#endif
-
- // Used for manual loading
- void didReceiveResponse(const ResourceResponse&);
- void didReceiveData(const char*, int);
- void didFinishLoading();
- void didFail(const ResourceError&);
-
- // HaltablePlugin
- virtual void halt();
- virtual void restart();
- virtual Node* node() const;
- virtual bool isWindowed() const { return m_isWindowed; }
- virtual String pluginName() const;
-
- bool isHalted() const { return m_isHalted; }
- bool hasBeenHalted() const { return m_hasBeenHalted; }
-
- static bool isCallingPlugin();
-
-#ifdef ANDROID_PLUGINS
- Element* getElement() const { return m_element; }
-#endif
-
- bool start();
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
- static void keepAlive(NPP);
-#endif
- void keepAlive();
-
-#if USE(ACCELERATED_COMPOSITING)
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(QT)
- virtual PlatformLayer* platformLayer() const;
-#elif ENABLE(NETSCAPE_PLUGIN_API) && defined(ANDROID_PLUGINS)
- virtual PlatformLayer* platformLayer() const;
-#else
- virtual PlatformLayer* platformLayer() const { return 0; }
-#endif
-#endif
-
- 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 init();
- bool platformStart();
- void stop();
- void platformDestroy();
- static void setCurrentPluginView(PluginView*);
-#if ENABLE(NETSCAPE_PLUGIN_API)
- NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData);
- NPError handlePost(const char* url, const char* target, uint32_t len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders);
- NPError handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf);
-#endif
- static void freeStringArray(char** stringArray, int length);
- void setCallingPlugin(bool) const;
-
- void invalidateWindowlessPluginRect(const IntRect&);
-
- virtual void mediaCanStart();
-
-#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
- void paintWindowedPluginIntoContext(GraphicsContext*, const IntRect&);
- static HDC WINAPI hookedBeginPaint(HWND, PAINTSTRUCT*);
- static BOOL WINAPI hookedEndPaint(HWND, const PAINTSTRUCT*);
-#endif
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
- static bool platformGetValueStatic(NPNVariable variable, void* value, NPError* result);
- bool platformGetValue(NPNVariable variable, void* value, NPError* result);
-#endif
-
- RefPtr<Frame> m_parentFrame;
- RefPtr<PluginPackage> m_plugin;
- Element* m_element;
- bool m_isStarted;
- KURL m_url;
- KURL m_baseURL;
- PluginStatus m_status;
- Vector<IntRect> m_invalidRects;
-
- void performRequest(PluginRequest*);
- void scheduleRequest(PluginRequest*);
- void requestTimerFired(Timer<PluginView>*);
- void invalidateTimerFired(Timer<PluginView>*);
- Timer<PluginView> m_requestTimer;
- Timer<PluginView> m_invalidateTimer;
-
- void popPopupsStateTimerFired(Timer<PluginView>*);
- Timer<PluginView> m_popPopupsStateTimer;
-
- void lifeSupportTimerFired(Timer<PluginView>*);
- Timer<PluginView> m_lifeSupportTimer;
-
-#ifndef NP_NO_CARBON
-#if ENABLE(NETSCAPE_PLUGIN_API)
- bool dispatchNPEvent(NPEvent&);
-#endif // ENABLE(NETSCAPE_PLUGIN_API)
-#endif
- void updatePluginWidget();
- void paintMissingPluginIcon(GraphicsContext*, const IntRect&);
-
- void handleKeyboardEvent(KeyboardEvent*);
- void handleMouseEvent(MouseEvent*);
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
- void handleFocusInEvent();
- void handleFocusOutEvent();
-#endif
-
-#if OS(WINDOWS)
- void paintIntoTransformedContext(HDC);
- PassRefPtr<Image> snapshot();
-#endif
-
-#ifdef ANDROID_PLUGINS
- void handleFocusEvent(bool hasFocus);
- void handleTouchEvent(TouchEvent*);
- // called at the end of the base constructor
- void platformInit();
-#endif
-#ifdef PLUGIN_PLATFORM_SETVALUE
- // called if the default setValue does not recognize the variable
- NPError platformSetValue(NPPVariable variable, void* value);
-#endif
-
- int m_mode;
- int m_paramCount;
- char** m_paramNames;
- char** m_paramValues;
- String m_pluginsPage;
-
- String m_mimeType;
- WTF::CString m_userAgent;
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
- NPP m_instance;
- NPP_t m_instanceStruct;
- NPWindow m_npWindow;
-#endif
-
- Vector<bool, 4> m_popupStateStack;
-
- HashSet<RefPtr<PluginStream> > m_streams;
- Vector<PluginRequest*> m_requests;
-
- bool m_isWindowed;
- bool m_isTransparent;
- bool m_haveInitialized;
- bool m_isWaitingToStart;
-
-#if defined(XP_UNIX)
- bool m_needsXEmbed;
-#endif
-
-#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
- OwnPtr<PluginMessageThrottlerWin> m_messageThrottler;
- WNDPROC m_pluginWndProc;
- unsigned m_lastMessage;
- bool m_isCallingPluginWndProc;
- HDC m_wmPrintHDC;
- bool m_haveUpdatedPluginWidget;
-#endif
-
-// ANDROID
-// TODO: Upstream to webkit.org
-#ifdef PLUGIN_SCHEDULE_TIMER
- PluginTimerList m_timerList;
-#endif
-
-#if ((PLATFORM(QT) || PLATFORM(WX)) && OS(WINDOWS)) || defined(XP_MACOSX)
- // On Mac OSX and Qt/Windows the plugin does not have its own native widget,
- // but is using the containing window as its reference for positioning/painting.
- PlatformPluginWidget m_window;
-public:
- PlatformPluginWidget platformPluginWidget() const { return m_window; }
- void setPlatformPluginWidget(PlatformPluginWidget widget) { m_window = widget; }
-#elif defined(ANDROID_PLUGINS)
-public:
- PlatformPluginWidget m_window;
- PlatformPluginWidget platformPluginWidget() const { return m_window; } // MANUAL MERGE FIXME
-#else
-public:
- void setPlatformPluginWidget(PlatformPluginWidget widget) { setPlatformWidget(widget); }
- PlatformPluginWidget platformPluginWidget() const { return platformWidget(); }
-#endif
-
-private:
-
-#if defined(XP_UNIX) || OS(SYMBIAN) || defined(ANDROID_PLUGINS)
- void setNPWindowIfNeeded();
-#elif defined(XP_MACOSX)
- NP_CGContext m_npCgContext;
- OwnPtr<Timer<PluginView> > m_nullEventTimer;
- NPDrawingModel m_drawingModel;
- NPEventModel m_eventModel;
- CGContextRef m_contextRef;
- WindowRef m_fakeWindow;
-#if PLATFORM(QT)
- QPixmap m_pixmap;
-#endif
-
- Point m_lastMousePos;
- void setNPWindowIfNeeded();
- void nullEventTimerFired(Timer<PluginView>*);
- Point globalMousePosForPlugin() const;
- Point mousePosForPlugin(MouseEvent* event = 0) const;
-#endif
-
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
- bool m_hasPendingGeometryChange;
- Pixmap m_drawable;
- Visual* m_visual;
- Colormap m_colormap;
- Display* m_pluginDisplay;
-
- void initXEvent(XEvent* event);
-#endif
-
-#if PLATFORM(QT)
-#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- QImage m_image;
- bool m_renderToImage;
- void paintUsingImageSurfaceExtension(QPainter* painter, const IntRect& exposedRect);
-#endif
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
- void paintUsingXPixmap(QPainter* painter, const QRect &exposedRect);
-#if USE(ACCELERATED_COMPOSITING)
- OwnPtr<PlatformLayer> m_platformLayer;
- friend class PluginGraphicsLayerQt;
-#endif // USE(ACCELERATED_COMPOSITING)
-#endif
-#endif // PLATFORM(QT)
-
- IntRect m_clipRect; // The clip rect to apply to a windowed plug-in
- IntRect m_windowRect; // Our window rect.
-#ifdef ANDROID_PLUGINS
- IntRect m_pageRect; // The rect in page coordinate system.
-#endif
-
- bool m_loadManually;
- RefPtr<PluginStream> m_manualStream;
-
- bool m_isJavaScriptPaused;
-
- bool m_isHalted;
- bool m_hasBeenHalted;
-
- bool m_haveCalledSetWindow;
-
- static PluginView* s_currentPluginView;
- };
-
-} // namespace WebCore
-
-#endif
diff --git a/WebCore/plugins/PluginViewBase.h b/WebCore/plugins/PluginViewBase.h
deleted file mode 100644
index 8dc667a..0000000
--- a/WebCore/plugins/PluginViewBase.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 Apple Inc. 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 PluginWidget_h
-#define PluginWidget_h
-
-#include "Widget.h"
-#include "GraphicsLayer.h"
-
-namespace JSC {
- class ExecState;
- class JSGlobalObject;
- class JSObject;
-}
-
-namespace WebCore {
-
-// PluginViewBase is a widget that all plug-in views inherit from, both in Webkit and WebKit2.
-// It's intended as a stopgap measure until we can merge all plug-in views into a single plug-in view.
-class PluginViewBase : public Widget {
-public:
-#if USE(ACCELERATED_COMPOSITING)
- virtual PlatformLayer* platformLayer() const { return 0; }
-#endif
-
- virtual JSC::JSObject* scriptObject(JSC::JSGlobalObject*) { return 0; }
- virtual void privateBrowsingStateChanged(bool) { }
-
-protected:
- PluginViewBase(PlatformWidget widget = 0) : Widget(widget) { }
-
-private:
- virtual bool isPluginViewBase() const { return true; }
-};
-
-} // namespace WebCore
-
-#endif // PluginWidget_h
diff --git a/WebCore/plugins/PluginViewNone.cpp b/WebCore/plugins/PluginViewNone.cpp
deleted file mode 100644
index 9aeaf3b..0000000
--- a/WebCore/plugins/PluginViewNone.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 Kevin Ollivier <kevino@theolliviers.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 APPLE INC. ``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 APPLE INC. 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.
- */
-
-#include "config.h"
-#include "PluginView.h"
-
-#if USE(JSC)
-#include "Bridge.h"
-#endif
-
-using namespace WTF;
-
-namespace WebCore {
-
-void PluginView::setFocus(bool)
-{
-}
-
-void PluginView::show()
-{
-}
-
-void PluginView::hide()
-{
-}
-
-void PluginView::paint(GraphicsContext*, const IntRect&)
-{
-}
-
-void PluginView::handleKeyboardEvent(KeyboardEvent*)
-{
-}
-
-void PluginView::handleMouseEvent(MouseEvent*)
-{
-}
-
-void PluginView::setParent(ScrollView*)
-{
-}
-
-void PluginView::setNPWindowRect(const IntRect&)
-{
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-NPError PluginView::handlePostReadFile(Vector<char>&, uint32_t, const char*)
-{
- return 0;
-}
-
-bool PluginView::platformGetValue(NPNVariable, void*, NPError*)
-{
- return false;
-}
-
-bool PluginView::platformGetValueStatic(NPNVariable, void*, NPError*)
-{
- return false;
-}
-
-void PluginView::invalidateRect(NPRect*)
-{
-}
-#endif
-
-void PluginView::invalidateRect(const IntRect&)
-{
-}
-
-#if ENABLE(NETSCAPE_PLUGIN_API)
-void PluginView::invalidateRegion(NPRegion)
-{
-}
-#endif
-
-void PluginView::forceRedraw()
-{
-}
-
-bool PluginView::platformStart()
-{
- return true;
-}
-
-void PluginView::platformDestroy()
-{
-}
-
-void PluginView::setParentVisible(bool)
-{
-}
-
-void PluginView::updatePluginWidget()
-{
-}
-
-void PluginView::halt()
-{
-}
-
-void PluginView::restart()
-{
-}
-
-#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
-void PluginView::handleFocusInEvent()
-{
-}
-
-void PluginView::handleFocusOutEvent()
-{
-}
-#endif
-
-// The functions below are for platforms that do not use PluginView for plugins
-// due to architectural differences. The plan is to eventually have all
-// ports using PluginView, but until then, if new functions like this are
-// added, please make sure they have the proper platform #ifs so that changes
-// do not break ports who compile both this file and PluginView.cpp.
-#if PLATFORM(MAC) || PLATFORM(CHROMIUM) || PLATFORM(EFL) || (OS(WINCE) && !PLATFORM(QT)) || (PLATFORM(QT) && !OS(WINCE)) || PLATFORM(BREWMP)
-#if ENABLE(NETSCAPE_PLUGIN_API)
-void PluginView::keepAlive(NPP)
-{
-}
-#endif
-
-#if USE(JSC)
-PassRefPtr<JSC::Bindings::Instance> PluginView::bindingInstance()
-{
- return 0;
-}
-#endif
-
-void PluginView::privateBrowsingStateChanged(bool)
-{
-}
-
-void PluginView::setJavaScriptPaused(bool)
-{
-}
-#endif
-
-} // namespace WebCore
diff --git a/WebCore/plugins/chromium/PluginDataChromium.cpp b/WebCore/plugins/chromium/PluginDataChromium.cpp
deleted file mode 100644
index 378fccb..0000000
--- a/WebCore/plugins/chromium/PluginDataChromium.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER 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.
- */
-
-#include "config.h"
-#include "PluginDataChromium.h"
-
-#include "ChromiumBridge.h"
-
-namespace WebCore {
-
-class PluginCache {
-public:
- PluginCache() : m_loaded(false), m_refresh(false) {}
- ~PluginCache() { reset(false); }
-
- void reset(bool refresh)
- {
- m_plugins.clear();
- m_loaded = false;
- m_refresh = refresh;
- }
-
- const Vector<PluginInfo>& plugins()
- {
- if (!m_loaded) {
- ChromiumBridge::plugins(m_refresh, &m_plugins);
- m_loaded = true;
- m_refresh = false;
- }
- return m_plugins;
- }
-
-private:
- Vector<PluginInfo> m_plugins;
- bool m_loaded;
- bool m_refresh;
-};
-
-static PluginCache pluginCache;
-
-void PluginData::initPlugins()
-{
- const Vector<PluginInfo>& plugins = pluginCache.plugins();
- for (size_t i = 0; i < plugins.size(); ++i)
- m_plugins.append(plugins[i]);
-}
-
-void PluginData::refresh()
-{
- pluginCache.reset(true);
- pluginCache.plugins(); // Force the plugins to be reloaded now.
-}
-
-String getPluginMimeTypeFromExtension(const String& extension)
-{
- const Vector<PluginInfo>& plugins = pluginCache.plugins();
- for (size_t i = 0; i < plugins.size(); ++i) {
- for (size_t j = 0; j < plugins[i].mimes.size(); ++j) {
- const MimeClassInfo& mime = plugins[i].mimes[j];
- const Vector<String>& extensions = mime.extensions;
- for (size_t k = 0; k < extensions.size(); ++k) {
- if (extension == extensions[k])
- return mime.type;
- }
- }
- }
- return String();
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/chromium/PluginDataChromium.h b/WebCore/plugins/chromium/PluginDataChromium.h
deleted file mode 100644
index 78701b4..0000000
--- a/WebCore/plugins/chromium/PluginDataChromium.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2009 Google, Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 PluginDataChromium_h
-#define PluginDataChromium_h
-
-#include "PluginData.h"
-
-namespace WebCore {
-
-// Checks if any of the plugins handle this extension, and if so returns the
-// plugin's mime type for this extension. Otherwise returns an empty string.
-String getPluginMimeTypeFromExtension(const String& extension);
-
-} // namespace WebCore
-
-#endif // PluginDataChromium_h
diff --git a/WebCore/plugins/gtk/PluginDataGtk.cpp b/WebCore/plugins/gtk/PluginDataGtk.cpp
deleted file mode 100644
index ae4d98b..0000000
--- a/WebCore/plugins/gtk/PluginDataGtk.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- Copyright (C) 2008 Collabora Ltd. All rights reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "config.h"
-#include "PluginData.h"
-
-#include "PluginDatabase.h"
-#include "PluginPackage.h"
-#include <stdio.h>
-namespace WebCore {
-
-void PluginData::initPlugins()
-{
- PluginDatabase *db = PluginDatabase::installedPlugins();
- const Vector<PluginPackage*> &plugins = db->plugins();
-
- for (unsigned int i = 0; i < plugins.size(); ++i) {
- PluginInfo info;
- PluginPackage* package = plugins[i];
-
- info.name = package->name();
- info.file = package->fileName();
- info.desc = package->description();
-
- const MIMEToDescriptionsMap& mimeToDescriptions = package->mimeToDescriptions();
- MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
- for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
- MimeClassInfo mime;
-
- mime.type = it->first;
- mime.desc = it->second;
- mime.extensions = package->mimeToExtensions().get(mime.type);
-
- info.mimes.append(mime);
- }
-
- m_plugins.append(info);
- }
-}
-
-void PluginData::refresh()
-{
- PluginDatabase *db = PluginDatabase::installedPlugins();
- db->refresh();
-}
-
-};
diff --git a/WebCore/plugins/gtk/PluginPackageGtk.cpp b/WebCore/plugins/gtk/PluginPackageGtk.cpp
deleted file mode 100644
index a702296..0000000
--- a/WebCore/plugins/gtk/PluginPackageGtk.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2008 Nuanti Ltd.
- * Copyright (C) 2008 Novell Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginPackage.h"
-
-#include <gio/gio.h>
-#include <stdio.h>
-
-#include "GOwnPtr.h"
-#include "MIMETypeRegistry.h"
-#include "NotImplemented.h"
-#include "npruntime_impl.h"
-#include "PluginDebug.h"
-#include <wtf/text/CString.h>
-
-namespace WebCore {
-
-bool PluginPackage::fetchInfo()
-{
-#if defined(XP_UNIX)
- if (!load())
- return false;
-
- NP_GetMIMEDescriptionFuncPtr NP_GetMIMEDescription = 0;
- NPP_GetValueProcPtr NPP_GetValue = 0;
-
- g_module_symbol(m_module, "NP_GetMIMEDescription", (void**)&NP_GetMIMEDescription);
- g_module_symbol(m_module, "NP_GetValue", (void**)&NPP_GetValue);
-
- if (!NP_GetMIMEDescription || !NPP_GetValue)
- return false;
-
- char* buffer = 0;
- NPError err = NPP_GetValue(0, NPPVpluginNameString, &buffer);
- if (err == NPERR_NO_ERROR)
- m_name = buffer;
-
- buffer = 0;
- err = NPP_GetValue(0, NPPVpluginDescriptionString, &buffer);
- if (err == NPERR_NO_ERROR) {
- m_description = buffer;
- determineModuleVersionFromDescription();
- }
-
- const gchar* types = NP_GetMIMEDescription();
- if (!types)
- return true;
-
- gchar** mimeDescs = g_strsplit(types, ";", -1);
- for (int i = 0; mimeDescs[i] && mimeDescs[i][0]; i++) {
- GOwnPtr<char> mime(g_utf8_strdown(mimeDescs[i], -1));
- gchar** mimeData = g_strsplit(mime.get(), ":", 3);
- if (g_strv_length(mimeData) < 3) {
- g_strfreev(mimeData);
- continue;
- }
-
- String description = String::fromUTF8(mimeData[2]);
- gchar** extensions = g_strsplit(mimeData[1], ",", -1);
-
- Vector<String> extVector;
- for (int j = 0; extensions[j]; j++)
- extVector.append(String::fromUTF8(extensions[j]));
-
- determineQuirks(mimeData[0]);
- m_mimeToExtensions.add(mimeData[0], extVector);
- m_mimeToDescriptions.add(mimeData[0], description);
-
- g_strfreev(extensions);
- g_strfreev(mimeData);
- }
- g_strfreev(mimeDescs);
-
- return true;
-#else
- notImplemented();
- return false;
-#endif
-}
-
-bool PluginPackage::load()
-{
- if (m_isLoaded) {
- m_loadCount++;
- return true;
- }
-
- GOwnPtr<gchar> finalPath(g_strdup(m_path.utf8().data()));
- while (g_file_test(finalPath.get(), G_FILE_TEST_IS_SYMLINK)) {
- GOwnPtr<GFile> file(g_file_new_for_path(finalPath.get()));
- GOwnPtr<GFile> dir(g_file_get_parent(file.get()));
- GOwnPtr<gchar> linkPath(g_file_read_link(finalPath.get(), 0));
- GOwnPtr<GFile> resolvedFile(g_file_resolve_relative_path(dir.get(), linkPath.get()));
- finalPath.set(g_file_get_path(resolvedFile.get()));
- }
-
- // No joke. If there is a netscape component in the path, go back
- // to the symlink, as flash breaks otherwise.
- // See http://src.chromium.org/viewvc/chrome/trunk/src/webkit/glue/plugins/plugin_list_posix.cc
- GOwnPtr<gchar> baseName(g_path_get_basename(finalPath.get()));
- if (!g_strcmp0(baseName.get(), "libflashplayer.so")
- && g_strstr_len(finalPath.get(), -1, "/netscape/"))
- finalPath.set(g_strdup(m_path.utf8().data()));
-
- m_module = g_module_open(finalPath.get(), G_MODULE_BIND_LOCAL);
-
- if (!m_module) {
- LOG(Plugins,"Module Load Failed :%s, Error:%s\n", (m_path.utf8()).data(), g_module_error());
- return false;
- }
-
- m_isLoaded = true;
-
- NP_InitializeFuncPtr NP_Initialize = 0;
- m_NPP_Shutdown = 0;
-
- NPError npErr;
-
- g_module_symbol(m_module, "NP_Initialize", (void**)&NP_Initialize);
- g_module_symbol(m_module, "NP_Shutdown", (void**)&m_NPP_Shutdown);
-
- if (!NP_Initialize || !m_NPP_Shutdown)
- goto abort;
-
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
-
- initializeBrowserFuncs();
-
-#if defined(XP_UNIX)
- npErr = NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
-#else
- npErr = NP_Initialize(&m_browserFuncs);
-#endif
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- m_loadCount++;
- return true;
-
-abort:
- unloadWithoutShutdown();
- return false;
-}
-
-uint16_t PluginPackage::NPVersion() const
-{
- return NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL;
-}
-}
diff --git a/WebCore/plugins/gtk/PluginViewGtk.cpp b/WebCore/plugins/gtk/PluginViewGtk.cpp
deleted file mode 100644
index ec855a2..0000000
--- a/WebCore/plugins/gtk/PluginViewGtk.cpp
+++ /dev/null
@@ -1,901 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2009, 2010 Kakai, Inc. <brian@kakai.com>
- * Copyright (C) 2010 Igalia S.L.
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginView.h"
-
-#include "Bridge.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Element.h"
-#include "FocusController.h"
-#include "FrameLoader.h"
-#include "FrameLoadRequest.h"
-#include "FrameTree.h"
-#include "Frame.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "GtkVersioning.h"
-#include "HTMLNames.h"
-#include "HTMLPlugInElement.h"
-#include "HostWindow.h"
-#include "Image.h"
-#include "KeyboardEvent.h"
-#include "MouseEvent.h"
-#include "Page.h"
-#include "PlatformKeyboardEvent.h"
-#include "PlatformMouseEvent.h"
-#include "PluginDebug.h"
-#include "PluginMainThreadScheduler.h"
-#include "PluginPackage.h"
-#include "RenderLayer.h"
-#include "Settings.h"
-#include "JSDOMBinding.h"
-#include "ScriptController.h"
-#include "npruntime_impl.h"
-#include "runtime_root.h"
-#include <runtime/JSLock.h>
-#include <runtime/JSValue.h>
-
-#ifdef GTK_API_VERSION_2
-#include <gdkconfig.h>
-#endif
-#include <gtk/gtk.h>
-
-#if defined(XP_UNIX)
-#include "RefPtrCairo.h"
-#include "gtk2xtbin.h"
-#define Bool int // this got undefined somewhere
-#define Status int // ditto
-#include <X11/extensions/Xrender.h>
-#include <cairo/cairo-xlib.h>
-#include <gdk/gdkx.h>
-#elif defined(GDK_WINDOWING_WIN32)
-#include "PluginMessageThrottlerWin.h"
-#include <gdk/gdkwin32.h>
-#endif
-
-using JSC::ExecState;
-using JSC::Interpreter;
-using JSC::JSLock;
-using JSC::JSObject;
-using JSC::UString;
-
-using std::min;
-
-using namespace WTF;
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-bool PluginView::dispatchNPEvent(NPEvent& event)
-{
- // sanity check
- if (!m_plugin->pluginFuncs()->event)
- return false;
-
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
-
- bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
-
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- return accepted;
-}
-
-#if defined(XP_UNIX)
-static Window getRootWindow(Frame* parentFrame)
-{
- GtkWidget* parentWidget = parentFrame->view()->hostWindow()->platformPageClient();
- GdkScreen* gscreen = gtk_widget_get_screen(parentWidget);
- return GDK_WINDOW_XWINDOW(gdk_screen_get_root_window(gscreen));
-}
-#endif
-
-void PluginView::updatePluginWidget()
-{
- if (!parent())
- return;
-
- ASSERT(parent()->isFrameView());
- FrameView* frameView = static_cast<FrameView*>(parent());
-
- IntRect oldWindowRect = m_windowRect;
- IntRect oldClipRect = m_clipRect;
-
- m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
- m_clipRect = windowClipRect();
- m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
-
- if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect)
- return;
-
-#if defined(XP_UNIX)
- if (!m_isWindowed) {
- Display* display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
- if (m_drawable)
- XFreePixmap(display, m_drawable);
-
- m_drawable = XCreatePixmap(display, getRootWindow(m_parentFrame.get()),
- m_windowRect.width(), m_windowRect.height(),
- ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth);
- XSync(display, false); // make sure that the server knows about the Drawable
- }
-#endif
-
- setNPWindowIfNeeded();
-}
-
-void PluginView::setFocus(bool focused)
-{
- ASSERT(platformPluginWidget() == platformWidget());
- Widget::setFocus(focused);
-}
-
-void PluginView::show()
-{
- ASSERT(platformPluginWidget() == platformWidget());
- Widget::show();
-}
-
-void PluginView::hide()
-{
- ASSERT(platformPluginWidget() == platformWidget());
- Widget::hide();
-}
-
-void PluginView::paint(GraphicsContext* context, const IntRect& rect)
-{
- if (!m_isStarted) {
- paintMissingPluginIcon(context, rect);
- return;
- }
-
- if (context->paintingDisabled())
- return;
-
- setNPWindowIfNeeded();
-
- if (m_isWindowed)
- return;
-
-#if defined(XP_UNIX)
- if (!m_drawable)
- return;
-
- Display* display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
- const bool syncX = m_pluginDisplay && m_pluginDisplay != display;
-
- IntRect exposedRect(rect);
- exposedRect.intersect(frameRect());
- exposedRect.move(-frameRect().x(), -frameRect().y());
-
- RefPtr<cairo_surface_t> drawableSurface = adoptRef(cairo_xlib_surface_create(display,
- m_drawable,
- m_visual,
- m_windowRect.width(),
- m_windowRect.height()));
-
- if (m_isTransparent) {
- // If we have a 32 bit drawable and the plugin wants transparency,
- // we'll clear the exposed area to transparent first. Otherwise,
- // we'd end up with junk in there from the last paint, or, worse,
- // uninitialized data.
- RefPtr<cairo_t> cr = adoptRef(cairo_create(drawableSurface.get()));
-
- if (!(cairo_surface_get_content(drawableSurface.get()) & CAIRO_CONTENT_ALPHA)) {
- // Attempt to fake it when we don't have an alpha channel on our
- // pixmap. If that's not possible, at least clear the window to
- // avoid drawing artifacts.
-
- // This Would not work without double buffering, but we always use it.
- cairo_set_source_surface(cr.get(), cairo_get_group_target(context->platformContext()),
- -m_windowRect.x(), -m_windowRect.y());
- cairo_set_operator(cr.get(), CAIRO_OPERATOR_SOURCE);
- } else
- cairo_set_operator(cr.get(), CAIRO_OPERATOR_CLEAR);
-
- cairo_rectangle(cr.get(), exposedRect.x(), exposedRect.y(),
- exposedRect.width(), exposedRect.height());
- cairo_fill(cr.get());
- }
-
- XEvent xevent;
- memset(&xevent, 0, sizeof(XEvent));
- XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
- exposeEvent.type = GraphicsExpose;
- exposeEvent.display = display;
- exposeEvent.drawable = m_drawable;
- exposeEvent.x = exposedRect.x();
- exposeEvent.y = exposedRect.y();
- exposeEvent.width = exposedRect.x() + exposedRect.width(); // flash bug? it thinks width is the right in transparent mode
- exposeEvent.height = exposedRect.y() + exposedRect.height(); // flash bug? it thinks height is the bottom in transparent mode
-
- dispatchNPEvent(xevent);
-
- if (syncX)
- XSync(m_pluginDisplay, false); // sync changes by plugin
-
- cairo_t* cr = context->platformContext();
- cairo_save(cr);
-
- cairo_set_source_surface(cr, drawableSurface.get(), frameRect().x(), frameRect().y());
-
- cairo_rectangle(cr,
- frameRect().x() + exposedRect.x(), frameRect().y() + exposedRect.y(),
- exposedRect.width(), exposedRect.height());
- cairo_clip(cr);
-
- if (m_isTransparent)
- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
- else
- cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
- cairo_paint(cr);
-
- cairo_restore(cr);
-#endif // defined(XP_UNIX)
-}
-
-void PluginView::handleKeyboardEvent(KeyboardEvent* event)
-{
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-
- if (m_isWindowed)
- return;
-
- if (event->type() != eventNames().keydownEvent && event->type() != eventNames().keyupEvent)
- return;
-
- NPEvent xEvent;
-#if defined(XP_UNIX)
- initXEvent(&xEvent);
- GdkEventKey* gdkEvent = event->keyEvent()->gdkEventKey();
-
- xEvent.type = (event->type() == eventNames().keydownEvent) ? 2 : 3; // KeyPress/Release get unset somewhere
- xEvent.xkey.root = getRootWindow(m_parentFrame.get());
- xEvent.xkey.subwindow = 0; // we have no child window
- xEvent.xkey.time = event->timeStamp();
- xEvent.xkey.state = gdkEvent->state; // GdkModifierType mirrors xlib state masks
- xEvent.xkey.keycode = gdkEvent->hardware_keycode;
- 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;
-#endif
-
- if (!dispatchNPEvent(xEvent))
- event->setDefaultHandled();
-}
-
-#if defined(XP_UNIX)
-static unsigned int inputEventState(MouseEvent* event)
-{
- unsigned int state = 0;
- if (event->ctrlKey())
- state |= ControlMask;
- if (event->shiftKey())
- state |= ShiftMask;
- if (event->altKey())
- state |= Mod1Mask;
- if (event->metaKey())
- state |= Mod4Mask;
- return state;
-}
-
-void PluginView::initXEvent(XEvent* xEvent)
-{
- memset(xEvent, 0, sizeof(XEvent));
-
- xEvent->xany.serial = 0; // we are unaware of the last request processed by X Server
- xEvent->xany.send_event = false;
- xEvent->xany.display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
- // NOTE: event->xany.window doesn't always correspond 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:
- GtkWidget* widget = m_parentFrame->view()->hostWindow()->platformPageClient();
- xEvent->xany.window = widget ? GDK_WINDOW_XWINDOW(gtk_widget_get_window(widget)) : 0;
-}
-
-static void setXButtonEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos, Frame* parentFrame)
-{
- XButtonEvent& xbutton = xEvent->xbutton;
- xbutton.type = event->type() == eventNames().mousedownEvent ? ButtonPress : ButtonRelease;
- xbutton.root = getRootWindow(parentFrame);
- xbutton.subwindow = 0;
- xbutton.time = event->timeStamp();
- xbutton.x = postZoomPos.x();
- xbutton.y = postZoomPos.y();
- xbutton.x_root = event->screenX();
- xbutton.y_root = event->screenY();
- xbutton.state = inputEventState(event);
- switch (event->button()) {
- case MiddleButton:
- xbutton.button = Button2;
- break;
- case RightButton:
- xbutton.button = Button3;
- break;
- case LeftButton:
- default:
- xbutton.button = Button1;
- break;
- }
- xbutton.same_screen = true;
-}
-
-static void setXMotionEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos, Frame* parentFrame)
-{
- XMotionEvent& xmotion = xEvent->xmotion;
- xmotion.type = MotionNotify;
- xmotion.root = getRootWindow(parentFrame);
- xmotion.subwindow = 0;
- xmotion.time = event->timeStamp();
- xmotion.x = postZoomPos.x();
- xmotion.y = postZoomPos.y();
- xmotion.x_root = event->screenX();
- xmotion.y_root = event->screenY();
- xmotion.state = inputEventState(event);
- xmotion.is_hint = NotifyNormal;
- xmotion.same_screen = true;
-}
-
-static void setXCrossingEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos, Frame* parentFrame)
-{
- XCrossingEvent& xcrossing = xEvent->xcrossing;
- xcrossing.type = event->type() == eventNames().mouseoverEvent ? EnterNotify : LeaveNotify;
- xcrossing.root = getRootWindow(parentFrame);
- xcrossing.subwindow = 0;
- xcrossing.time = event->timeStamp();
- xcrossing.x = postZoomPos.y();
- xcrossing.y = postZoomPos.x();
- xcrossing.x_root = event->screenX();
- xcrossing.y_root = event->screenY();
- xcrossing.state = inputEventState(event);
- xcrossing.mode = NotifyNormal;
- xcrossing.detail = NotifyDetailNone;
- xcrossing.same_screen = true;
- xcrossing.focus = false;
-}
-#endif
-
-void PluginView::handleMouseEvent(MouseEvent* event)
-{
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-
- if (m_isWindowed)
- return;
-
- if (event->type() == eventNames().mousedownEvent) {
- if (Page* page = m_parentFrame->page())
- page->focusController()->setActive(true);
- focusPluginElement();
- }
-
- NPEvent xEvent;
-#if defined(XP_UNIX)
- initXEvent(&xEvent);
-
- IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
-
- if (event->type() == eventNames().mousedownEvent || event->type() == eventNames().mouseupEvent)
- setXButtonEventSpecificFields(&xEvent, event, postZoomPos, m_parentFrame.get());
- else if (event->type() == eventNames().mousemoveEvent)
- setXMotionEventSpecificFields(&xEvent, event, postZoomPos, m_parentFrame.get());
- else if (event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mouseoverEvent)
- setXCrossingEventSpecificFields(&xEvent, event, postZoomPos, m_parentFrame.get());
- else
- return;
-#endif
-
- if (!dispatchNPEvent(xEvent))
- event->setDefaultHandled();
-}
-
-#if defined(XP_UNIX)
-void PluginView::handleFocusInEvent()
-{
- XEvent npEvent;
- initXEvent(&npEvent);
-
- XFocusChangeEvent& event = npEvent.xfocus;
- event.type = 9; // FocusIn gets unset somewhere
- event.mode = NotifyNormal;
- event.detail = NotifyDetailNone;
-
- dispatchNPEvent(npEvent);
-}
-
-void PluginView::handleFocusOutEvent()
-{
- XEvent npEvent;
- initXEvent(&npEvent);
-
- XFocusChangeEvent& event = npEvent.xfocus;
- event.type = 10; // FocusOut gets unset somewhere
- event.mode = NotifyNormal;
- event.detail = NotifyDetailNone;
-
- dispatchNPEvent(npEvent);
-}
-#endif
-
-void PluginView::setParent(ScrollView* parent)
-{
- Widget::setParent(parent);
-
- if (parent)
- init();
-}
-
-void PluginView::setNPWindowRect(const IntRect&)
-{
- if (!m_isWindowed)
- setNPWindowIfNeeded();
-}
-
-void PluginView::setNPWindowIfNeeded()
-{
- if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
- return;
-
- // If the plugin didn't load sucessfully, no point in calling setwindow
- if (m_status != PluginStatusLoadedSuccessfully)
- return;
-
- // On Unix, only call plugin's setwindow if it's full-page or windowed
- if (m_mode != NP_FULL && m_mode != NP_EMBED)
- return;
-
- // Check if the platformPluginWidget still exists
- if (m_isWindowed && !platformPluginWidget())
- return;
-
- if (m_isWindowed) {
- m_npWindow.x = m_windowRect.x();
- m_npWindow.y = m_windowRect.y();
- m_npWindow.width = m_windowRect.width();
- m_npWindow.height = m_windowRect.height();
-
- m_npWindow.clipRect.left = max(0, m_clipRect.x());
- m_npWindow.clipRect.top = max(0, m_clipRect.y());
- m_npWindow.clipRect.right = m_clipRect.x() + m_clipRect.width();
- m_npWindow.clipRect.bottom = m_clipRect.y() + m_clipRect.height();
- } else {
- m_npWindow.x = 0;
- m_npWindow.y = 0;
- m_npWindow.width = m_windowRect.width();
- m_npWindow.height = m_windowRect.height();
-
- m_npWindow.clipRect.left = 0;
- m_npWindow.clipRect.top = 0;
- m_npWindow.clipRect.right = 0;
- m_npWindow.clipRect.bottom = 0;
- }
-
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-
- if (m_isWindowed) {
- GtkAllocation allocation = { m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height() };
- gtk_widget_size_allocate(platformPluginWidget(), &allocation);
-#if defined(XP_UNIX)
- if (!m_needsXEmbed) {
- gtk_xtbin_set_position(GTK_XTBIN(platformPluginWidget()), m_windowRect.x(), m_windowRect.y());
- gtk_xtbin_resize(platformPluginWidget(), m_windowRect.width(), m_windowRect.height());
- }
-#endif
- }
-}
-
-void PluginView::setParentVisible(bool visible)
-{
- if (isParentVisible() == visible)
- return;
-
- Widget::setParentVisible(visible);
-
- if (isSelfVisible() && platformPluginWidget()) {
- if (visible)
- gtk_widget_show(platformPluginWidget());
- else
- gtk_widget_hide(platformPluginWidget());
- }
-}
-
-NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
-{
- WTF::String filename(buf, len);
-
- if (filename.startsWith("file:///"))
- filename = filename.substring(8);
-
- // Get file info
- if (!g_file_test ((filename.utf8()).data(), (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)))
- return NPERR_FILE_NOT_FOUND;
-
- //FIXME - read the file data into buffer
- FILE* fileHandle = fopen((filename.utf8()).data(), "r");
-
- if (fileHandle == 0)
- return NPERR_FILE_NOT_FOUND;
-
- //buffer.resize();
-
- int bytesRead = fread(buffer.data(), 1, 0, fileHandle);
-
- fclose(fileHandle);
-
- if (bytesRead <= 0)
- return NPERR_FILE_NOT_FOUND;
-
- return NPERR_NO_ERROR;
-}
-
-bool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVToolkit:
-#if defined(XP_UNIX)
- *static_cast<uint32_t*>(value) = 2;
-#else
- *static_cast<uint32_t*>(value) = 0;
-#endif
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVSupportsXEmbedBool:
-#if defined(XP_UNIX)
- *static_cast<NPBool*>(value) = true;
-#else
- *static_cast<NPBool*>(value) = false;
-#endif
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVjavascriptEnabledBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVSupportsWindowless:
-#if defined(XP_UNIX)
- *static_cast<NPBool*>(value) = true;
-#else
- *static_cast<NPBool*>(value) = false;
-#endif
- *result = NPERR_NO_ERROR;
- return true;
-
- default:
- return false;
- }
-}
-
-bool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVxDisplay:
-#if defined(XP_UNIX)
- if (m_needsXEmbed)
- *(void **)value = (void *)GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
- else
- *(void **)value = (void *)GTK_XTBIN(platformPluginWidget())->xtclient.xtdisplay;
- *result = NPERR_NO_ERROR;
-#else
- *result = NPERR_GENERIC_ERROR;
-#endif
- return true;
-
-#if defined(XP_UNIX)
- case NPNVxtAppContext:
- if (!m_needsXEmbed) {
- *(void **)value = XtDisplayToApplicationContext (GTK_XTBIN(platformPluginWidget())->xtclient.xtdisplay);
-
- *result = NPERR_NO_ERROR;
- } else
- *result = NPERR_GENERIC_ERROR;
- return true;
-#endif
-
- case NPNVnetscapeWindow: {
-#if defined(XP_UNIX)
- void* w = reinterpret_cast<void*>(value);
- GtkWidget* widget = m_parentFrame->view()->hostWindow()->platformPageClient();
- *((XID *)w) = GDK_WINDOW_XWINDOW(gtk_widget_get_window(widget));
-#endif
-#ifdef GDK_WINDOWING_WIN32
- HGDIOBJ* w = reinterpret_cast<HGDIOBJ*>(value);
- GtkWidget* widget = m_parentFrame->view()->hostWindow()->platformPageClient();
- *w = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
-#endif
- *result = NPERR_NO_ERROR;
- return true;
- }
-
- default:
- return false;
- }
-}
-
-void PluginView::invalidateRect(const IntRect& rect)
-{
- if (m_isWindowed) {
- gtk_widget_queue_draw_area(GTK_WIDGET(platformPluginWidget()), rect.x(), rect.y(), rect.width(), rect.height());
- return;
- }
-
- invalidateWindowlessPluginRect(rect);
-}
-
-void PluginView::invalidateRect(NPRect* rect)
-{
- if (!rect) {
- invalidate();
- return;
- }
-
- IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
- invalidateWindowlessPluginRect(r);
-}
-
-void PluginView::invalidateRegion(NPRegion)
-{
- // TODO: optimize
- invalidate();
-}
-
-void PluginView::forceRedraw()
-{
- if (m_isWindowed)
- gtk_widget_queue_draw(platformPluginWidget());
- else
- gtk_widget_queue_draw(m_parentFrame->view()->hostWindow()->platformPageClient());
-}
-
-static Display* getPluginDisplay()
-{
- // The plugin toolkit might have a different X connection open. Since we're
- // a gdk/gtk app, we'll (probably?) have the same X connection as any gdk-based
- // plugins, so we can return that. We might want to add other implementations here
- // later.
-
-#if defined(XP_UNIX)
- return GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
-#else
- return 0;
-#endif
-}
-
-#if defined(XP_UNIX)
-static void getVisualAndColormap(int depth, Visual** visual, Colormap* colormap)
-{
- *visual = 0;
- *colormap = 0;
-
- Display* display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
- int rmaj, rmin;
- if (depth == 32 && (!XRenderQueryVersion(display, &rmaj, &rmin) || (rmaj == 0 && rmin < 5)))
- return;
-
- XVisualInfo templ;
- templ.screen = gdk_screen_get_number(gdk_screen_get_default());
- templ.depth = depth;
- templ.c_class = TrueColor;
- int nVisuals;
- XVisualInfo* visualInfo = XGetVisualInfo(display, VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nVisuals);
-
- if (!nVisuals)
- return;
-
- if (depth == 32) {
- for (int idx = 0; idx < nVisuals; ++idx) {
- XRenderPictFormat* format = XRenderFindVisualFormat(display, visualInfo[idx].visual);
- if (format->type == PictTypeDirect && format->direct.alphaMask) {
- *visual = visualInfo[idx].visual;
- break;
- }
- }
- } else
- *visual = visualInfo[0].visual;
-
- XFree(visualInfo);
-
- if (*visual)
- *colormap = XCreateColormap(display, GDK_ROOT_WINDOW(), *visual, AllocNone);
-}
-#endif
-
-static gboolean plugRemovedCallback(GtkSocket* socket, gpointer)
-{
- return TRUE;
-}
-
-static void plugAddedCallback(GtkSocket* socket, PluginView* view)
-{
- if (!socket || !view)
- return;
-
- // FIXME: Java Plugins do not seem to draw themselves properly the
- // first time unless we do a size-allocate after they have done
- // the plug operation on their side, which in general does not
- // happen since we do size-allocates before setting the
- // NPWindow. Apply this workaround until we figure out a better
- // solution, if any.
- IntRect rect = view->frameRect();
- GtkAllocation allocation = { rect.x(), rect.y(), rect.width(), rect.height() };
- gtk_widget_size_allocate(GTK_WIDGET(socket), &allocation);
-}
-
-bool PluginView::platformStart()
-{
- ASSERT(m_isStarted);
- ASSERT(m_status == PluginStatusLoadedSuccessfully);
-
- if (m_plugin->pluginFuncs()->getvalue) {
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginNeedsXEmbed, &m_needsXEmbed);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
-
- if (m_isWindowed) {
-#if defined(XP_UNIX)
- GtkWidget* pageClient = m_parentFrame->view()->hostWindow()->platformPageClient();
-
- if (m_needsXEmbed) {
- // If our parent is not anchored the startup process will
- // fail miserably for XEmbed plugins a bit later on when
- // we try to get the ID of our window (since realize will
- // fail), so let's just abort here.
- if (!gtk_widget_get_parent(pageClient))
- return false;
-
- setPlatformWidget(gtk_socket_new());
- gtk_container_add(GTK_CONTAINER(pageClient), platformPluginWidget());
- g_signal_connect(platformPluginWidget(), "plug-added", G_CALLBACK(plugAddedCallback), this);
- g_signal_connect(platformPluginWidget(), "plug-removed", G_CALLBACK(plugRemovedCallback), NULL);
- } else
- setPlatformWidget(gtk_xtbin_new(pageClient, 0));
-#else
- setPlatformWidget(gtk_socket_new());
- gtk_container_add(GTK_CONTAINER(pageClient), platformPluginWidget());
-#endif
- } else {
- setPlatformWidget(0);
- m_pluginDisplay = getPluginDisplay();
- }
-
- show();
-
-#if defined(XP_UNIX)
- NPSetWindowCallbackStruct* ws = new NPSetWindowCallbackStruct();
- ws->type = 0;
-#endif
-
- if (m_isWindowed) {
- m_npWindow.type = NPWindowTypeWindow;
-#if defined(XP_UNIX)
- if (m_needsXEmbed) {
- GtkWidget* widget = platformPluginWidget();
- gtk_widget_realize(widget);
- m_npWindow.window = (void*)gtk_socket_get_id(GTK_SOCKET(platformPluginWidget()));
- GdkWindow* window = gtk_widget_get_window(widget);
- ws->display = GDK_WINDOW_XDISPLAY(window);
- ws->visual = GDK_VISUAL_XVISUAL(gdk_window_get_visual(window));
- ws->depth = gdk_visual_get_depth(gdk_window_get_visual(window));
- ws->colormap = XCreateColormap(ws->display, GDK_ROOT_WINDOW(), ws->visual, AllocNone);
- } else {
- m_npWindow.window = (void*)GTK_XTBIN(platformPluginWidget())->xtwindow;
- ws->display = GTK_XTBIN(platformPluginWidget())->xtdisplay;
- ws->visual = GTK_XTBIN(platformPluginWidget())->xtclient.xtvisual;
- ws->depth = GTK_XTBIN(platformPluginWidget())->xtclient.xtdepth;
- ws->colormap = GTK_XTBIN(platformPluginWidget())->xtclient.xtcolormap;
- }
- XFlush (ws->display);
-#elif defined(GDK_WINDOWING_WIN32)
- m_npWindow.window = (void*)GDK_WINDOW_HWND(gtk_widget_get_window(platformPluginWidget()));
-#endif
- } else {
- m_npWindow.type = NPWindowTypeDrawable;
- m_npWindow.window = 0; // Not used?
-
-#if defined(XP_UNIX)
- GdkScreen* gscreen = gdk_screen_get_default();
- GdkVisual* gvisual = gdk_screen_get_system_visual(gscreen);
-
- if (gdk_visual_get_depth(gvisual) == 32 || !m_plugin->quirks().contains(PluginQuirkRequiresDefaultScreenDepth)) {
- getVisualAndColormap(32, &m_visual, &m_colormap);
- ws->depth = 32;
- }
-
- if (!m_visual) {
- getVisualAndColormap(gdk_visual_get_depth(gvisual), &m_visual, &m_colormap);
- ws->depth = gdk_visual_get_depth(gvisual);
- }
-
- ws->display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
- ws->visual = m_visual;
- ws->colormap = m_colormap;
-
- m_npWindow.x = 0;
- m_npWindow.y = 0;
- m_npWindow.width = -1;
- m_npWindow.height = -1;
-#else
- notImplemented();
- m_status = PluginStatusCanNotLoadPlugin;
- return false;
-#endif
- }
-
-#if defined(XP_UNIX)
- m_npWindow.ws_info = ws;
-#endif
-
- // TODO remove in favor of null events, like mac port?
- if (!(m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall)))
- updatePluginWidget(); // was: setNPWindowIfNeeded(), but this doesn't produce 0x0 rects at first go
-
- return true;
-}
-
-void PluginView::platformDestroy()
-{
-#if defined(XP_UNIX)
- if (m_drawable) {
- XFreePixmap(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), m_drawable);
- m_drawable = 0;
- }
-#endif
-}
-
-void PluginView::halt()
-{
-}
-
-void PluginView::restart()
-{
-}
-
-} // namespace WebCore
-
diff --git a/WebCore/plugins/gtk/gtk2xtbin.c b/WebCore/plugins/gtk/gtk2xtbin.c
deleted file mode 100644
index e03fad3..0000000
--- a/WebCore/plugins/gtk/gtk2xtbin.c
+++ /dev/null
@@ -1,966 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim:expandtab:shiftwidth=2:tabstop=2: */
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Gtk2XtBin Widget Implementation.
- *
- * The Initial Developer of the Original Code is
- * Sun Microsystems, Inc.
- * Portions created by the Initial Developer are Copyright (C) 2002
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/*
- * The GtkXtBin widget allows for Xt toolkit code to be used
- * inside a GTK application.
- */
-
-#include "GtkVersioning.h"
-#include "xembed.h"
-#include "gtk2xtbin.h"
-#include <gtk/gtk.h>
-#include <gdk/gdkx.h>
-#include <glib.h>
-#include <assert.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Xlib/Xt stuff */
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Shell.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-
-/* uncomment this if you want debugging information about widget
- creation and destruction */
-#undef DEBUG_XTBIN
-
-#define XTBIN_MAX_EVENTS 30
-
-static void gtk_xtbin_class_init (GtkXtBinClass *klass);
-static void gtk_xtbin_init (GtkXtBin *xtbin);
-static void gtk_xtbin_realize (GtkWidget *widget);
-static void gtk_xtbin_unrealize (GtkWidget *widget);
-static void gtk_xtbin_dispose (GObject *object);
-
-/* Xt aware XEmbed */
-static void xt_client_init (XtClient * xtclient,
- Visual *xtvisual,
- Colormap xtcolormap,
- int xtdepth);
-static void xt_client_create (XtClient * xtclient,
- Window embeder,
- int height,
- int width );
-static void xt_client_unrealize (XtClient* xtclient);
-static void xt_client_destroy (XtClient* xtclient);
-static void xt_client_set_info (Widget xtplug,
- unsigned long flags);
-static void xt_client_event_handler (Widget w,
- XtPointer client_data,
- XEvent *event);
-static void xt_client_handle_xembed_message (Widget w,
- XtPointer client_data,
- XEvent *event);
-static void xt_client_focus_listener (Widget w,
- XtPointer user_data,
- XEvent *event);
-static void xt_add_focus_listener( Widget w, XtPointer user_data );
-static void xt_add_focus_listener_tree ( Widget treeroot, XtPointer user_data);
-static void xt_remove_focus_listener(Widget w, XtPointer user_data);
-static void send_xembed_message (XtClient *xtclient,
- long message,
- long detail,
- long data1,
- long data2,
- long time);
-static int error_handler (Display *display,
- XErrorEvent *error);
-/* For error trap of XEmbed */
-static void trap_errors(void);
-static int untrap_error(void);
-static int (*old_error_handler) (Display *, XErrorEvent *);
-static int trapped_error_code = 0;
-
-static GtkWidgetClass *parent_class = NULL;
-
-static Display *xtdisplay = NULL;
-static String *fallback = NULL;
-static gboolean xt_is_initialized = FALSE;
-static gint num_widgets = 0;
-
-static GPollFD xt_event_poll_fd;
-static gint xt_polling_timer_id = 0;
-static guint tag = 0;
-
-static gboolean
-xt_event_prepare (GSource* source_data,
- gint *timeout)
-{
- int mask;
-
- GDK_THREADS_ENTER();
- mask = XPending(xtdisplay);
- GDK_THREADS_LEAVE();
-
- return (gboolean)mask;
-}
-
-static gboolean
-xt_event_check (GSource* source_data)
-{
- GDK_THREADS_ENTER ();
-
- if (xt_event_poll_fd.revents & G_IO_IN) {
- int mask;
- mask = XPending(xtdisplay);
- GDK_THREADS_LEAVE ();
- return (gboolean)mask;
- }
-
- GDK_THREADS_LEAVE ();
- return FALSE;
-}
-
-static gboolean
-xt_event_dispatch (GSource* source_data,
- GSourceFunc call_back,
- gpointer user_data)
-{
- XtAppContext ac;
- int i = 0;
-
- ac = XtDisplayToApplicationContext(xtdisplay);
-
- GDK_THREADS_ENTER ();
-
- /* Process only real X traffic here. We only look for data on the
- * pipe, limit it to XTBIN_MAX_EVENTS and only call
- * XtAppProcessEvent so that it will look for X events. There's no
- * timer processing here since we already have a timer callback that
- * does it. */
- for (i=0; i < XTBIN_MAX_EVENTS && XPending(xtdisplay); i++) {
- XtAppProcessEvent(ac, XtIMXEvent);
- }
-
- GDK_THREADS_LEAVE ();
-
- return TRUE;
-}
-
-typedef void (*GSourceFuncsFinalize) (GSource* source);
-
-static GSourceFuncs xt_event_funcs = {
- xt_event_prepare,
- xt_event_check,
- xt_event_dispatch,
- (GSourceFuncsFinalize)g_free,
- (GSourceFunc)NULL,
- (GSourceDummyMarshal)NULL
-};
-
-static gboolean
-xt_event_polling_timer_callback(gpointer user_data)
-{
- Display * display;
- XtAppContext ac;
- int eventsToProcess = 20;
-
- display = (Display *)user_data;
- ac = XtDisplayToApplicationContext(display);
-
- /* We need to process many Xt events here. If we just process
- one event we might starve one or more Xt consumers. On the other hand
- this could hang the whole app if Xt events come pouring in. So process
- up to 20 Xt events right now and save the rest for later. This is a hack,
- but it oughta work. We *really* should have out of process plugins.
- */
- while (eventsToProcess-- && XtAppPending(ac))
- XtAppProcessEvent(ac, XtIMAll);
- return TRUE;
-}
-
-GType
-gtk_xtbin_get_type (void)
-{
- static GType xtbin_type = 0;
-
- if (!xtbin_type) {
- static const GTypeInfo xtbin_info =
- {
- sizeof (GtkXtBinClass),
- NULL,
- NULL,
-
- (GClassInitFunc)gtk_xtbin_class_init,
- NULL,
- NULL,
-
- sizeof (GtkXtBin),
- 0,
- (GInstanceInitFunc)gtk_xtbin_init,
- NULL
- };
- xtbin_type = g_type_register_static (GTK_TYPE_SOCKET,
- "GtkXtBin",
- &xtbin_info,
- 0);
- }
- return xtbin_type;
-}
-
-static void
-gtk_xtbin_class_init (GtkXtBinClass *klass)
-{
- GtkWidgetClass *widget_class;
- GObjectClass *object_class;
-
- parent_class = g_type_class_peek_parent (klass);
-
- widget_class = GTK_WIDGET_CLASS (klass);
- widget_class->realize = gtk_xtbin_realize;
- widget_class->unrealize = gtk_xtbin_unrealize;
-
- object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = gtk_xtbin_dispose;
-}
-
-static void
-gtk_xtbin_init (GtkXtBin *xtbin)
-{
- xtbin->xtdisplay = NULL;
- xtbin->parent_window = NULL;
- xtbin->xtwindow = 0;
- xtbin->x = 0;
- xtbin->y = 0;
-}
-
-static void
-gtk_xtbin_realize (GtkWidget *widget)
-{
- GtkXtBin *xtbin;
- GtkAllocation allocation = { 0, 0, 200, 200 };
-#if GTK_CHECK_VERSION(2, 18, 0)
- GtkAllocation widget_allocation;
-#endif
-
-#ifdef DEBUG_XTBIN
- printf("gtk_xtbin_realize()\n");
-#endif
-
- g_return_if_fail (GTK_IS_XTBIN (widget));
-
- xtbin = GTK_XTBIN (widget);
-
- /* caculate the allocation before realize */
-#if GTK_CHECK_VERSION(2, 24, 0)
- allocation.width = gdk_window_get_width(xtbin->parent_window);
- allocation.height = gdk_window_get_height(xtbin->parent_window);
-#else
- gint x, y, w, h, d; /* geometry of window */
- gdk_window_get_geometry(xtbin->parent_window, &x, &y, &w, &h, &d);
- allocation.width = w;
- allocation.height = h;
-#endif
- gtk_widget_size_allocate (widget, &allocation);
-
-#ifdef DEBUG_XTBIN
- printf("initial allocation %d %d %d %d\n", x, y, w, h);
-#endif
-
-#if GTK_CHECK_VERSION(2, 18, 0)
- gtk_widget_get_allocation(widget, &widget_allocation);
- xtbin->width = widget_allocation.width;
- xtbin->height = widget_allocation.height;
-#else
- xtbin->width = widget->allocation.width;
- xtbin->height = widget->allocation.height;
-#endif
-
- /* use GtkSocket's realize */
- (*GTK_WIDGET_CLASS(parent_class)->realize)(widget);
-
- /* create the Xt client widget */
- xt_client_create(&(xtbin->xtclient),
- gtk_socket_get_id(GTK_SOCKET(xtbin)),
- xtbin->height,
- xtbin->width);
- xtbin->xtwindow = XtWindow(xtbin->xtclient.child_widget);
-
- gdk_flush();
-
- /* now that we have created the xt client, add it to the socket. */
- gtk_socket_add_id(GTK_SOCKET(widget), xtbin->xtwindow);
-}
-
-
-
-GtkWidget*
-gtk_xtbin_new (GtkWidget *parent_widget, String *f)
-{
- GtkXtBin *xtbin;
- gpointer user_data;
- GdkScreen *screen;
- GdkVisual* visual;
- Colormap colormap;
- GdkWindow* parent_window = gtk_widget_get_window(parent_widget);
-
- assert(parent_window != NULL);
- xtbin = g_object_new (GTK_TYPE_XTBIN, NULL);
-
- if (!xtbin)
- return (GtkWidget*)NULL;
-
- if (f)
- fallback = f;
-
- /* Initialize the Xt toolkit */
- xtbin->parent_window = parent_window;
-
- screen = gtk_widget_get_screen(parent_widget);
- visual = gdk_screen_get_system_visual(screen);
- colormap = XCreateColormap(GDK_DISPLAY_XDISPLAY(gdk_screen_get_display(screen)),
- GDK_WINDOW_XWINDOW(gdk_screen_get_root_window(screen)),
- GDK_VISUAL_XVISUAL(visual), AllocNone);
-
- xt_client_init(&(xtbin->xtclient),
- GDK_VISUAL_XVISUAL(visual),
- colormap,
- gdk_visual_get_depth(visual));
-
- if (!xtbin->xtclient.xtdisplay) {
- /* If XtOpenDisplay failed, we can't go any further.
- * Bail out.
- */
-#ifdef DEBUG_XTBIN
- printf("gtk_xtbin_init: XtOpenDisplay() returned NULL.\n");
-#endif
- g_free (xtbin);
- return (GtkWidget *)NULL;
- }
-
- /* If this is the first running widget, hook this display into the
- mainloop */
- if (0 == num_widgets) {
- int cnumber;
- /*
- * hook Xt event loop into the glib event loop.
- */
-
- /* the assumption is that gtk_init has already been called */
- GSource* gs = g_source_new(&xt_event_funcs, sizeof(GSource));
- if (!gs) {
- return NULL;
- }
-
- g_source_set_priority(gs, GDK_PRIORITY_EVENTS);
- g_source_set_can_recurse(gs, TRUE);
- tag = g_source_attach(gs, (GMainContext*)NULL);
-#ifdef VMS
- cnumber = XConnectionNumber(xtdisplay);
-#else
- cnumber = ConnectionNumber(xtdisplay);
-#endif
- xt_event_poll_fd.fd = cnumber;
- xt_event_poll_fd.events = G_IO_IN;
- xt_event_poll_fd.revents = 0; /* hmm... is this correct? */
-
- g_main_context_add_poll ((GMainContext*)NULL,
- &xt_event_poll_fd,
- G_PRIORITY_LOW);
- /* add a timer so that we can poll and process Xt timers */
- xt_polling_timer_id =
- g_timeout_add(25,
- (GSourceFunc)xt_event_polling_timer_callback,
- xtdisplay);
- }
-
- /* Bump up our usage count */
- num_widgets++;
-
- /* Build the hierachy */
- xtbin->xtdisplay = xtbin->xtclient.xtdisplay;
- gtk_widget_set_parent_window(GTK_WIDGET(xtbin), parent_window);
- gdk_window_get_user_data(xtbin->parent_window, &user_data);
- if (user_data)
- gtk_container_add(GTK_CONTAINER(user_data), GTK_WIDGET(xtbin));
-
- return GTK_WIDGET (xtbin);
-}
-
-void
-gtk_xtbin_set_position (GtkXtBin *xtbin,
- gint x,
- gint y)
-{
- xtbin->x = x;
- xtbin->y = y;
-
- if (gtk_widget_get_realized (GTK_WIDGET(xtbin)))
- gdk_window_move (gtk_widget_get_window(GTK_WIDGET (xtbin)), x, y);
-}
-
-void
-gtk_xtbin_resize (GtkWidget *widget,
- gint width,
- gint height)
-{
- Arg args[2];
- GtkXtBin *xtbin = GTK_XTBIN (widget);
- GtkAllocation allocation;
-
-#ifdef DEBUG_XTBIN
- printf("gtk_xtbin_resize %p %d %d\n", (void *)widget, width, height);
-#endif
-
- xtbin->height = height;
- xtbin->width = width;
-
- // Avoid BadValue errors in XtSetValues
- if (height <= 0 || width <=0) {
- height = 1;
- width = 1;
- }
- XtSetArg(args[0], XtNheight, height);
- XtSetArg(args[1], XtNwidth, width);
- XtSetValues(xtbin->xtclient.top_widget, args, 2);
-
- /* we need to send a size allocate so the socket knows about the
- size changes */
- allocation.x = xtbin->x;
- allocation.y = xtbin->y;
- allocation.width = xtbin->width;
- allocation.height = xtbin->height;
-
- gtk_widget_size_allocate(widget, &allocation);
-}
-
-static void
-gtk_xtbin_unrealize (GtkWidget *object)
-{
- GtkXtBin *xtbin;
- GtkWidget *widget;
-
-#ifdef DEBUG_XTBIN
- printf("gtk_xtbin_unrealize()\n");
-#endif
-
- /* gtk_object_destroy() will already hold a refcount on object
- */
- xtbin = GTK_XTBIN(object);
- widget = GTK_WIDGET(object);
-
- gtk_widget_set_visible(widget, FALSE);
- if (gtk_widget_get_realized (widget)) {
- xt_client_unrealize(&(xtbin->xtclient));
- }
-
- (*GTK_WIDGET_CLASS (parent_class)->unrealize)(widget);
-}
-
-static void
-gtk_xtbin_dispose (GObject *object)
-{
- GtkXtBin *xtbin;
-
-#ifdef DEBUG_XTBIN
- printf("gtk_xtbin_destroy()\n");
-#endif
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GTK_IS_XTBIN (object));
-
- xtbin = GTK_XTBIN (object);
-
- if(xtbin->xtwindow) {
- /* remove the event handler */
- xt_client_destroy(&(xtbin->xtclient));
- xtbin->xtwindow = 0;
-
- num_widgets--; /* reduce our usage count */
-
- /* If this is the last running widget, remove the Xt display
- connection from the mainloop */
- if (0 == num_widgets) {
-#ifdef DEBUG_XTBIN
- printf("removing the Xt connection from the main loop\n");
-#endif
- g_main_context_remove_poll((GMainContext*)NULL, &xt_event_poll_fd);
- g_source_remove(tag);
-
- g_source_remove(xt_polling_timer_id);
- xt_polling_timer_id = 0;
- }
- }
-
- G_OBJECT_CLASS(parent_class)->dispose(object);
-}
-
-/*
-* Following is the implementation of Xt XEmbedded for client side
-*/
-
-/* Initial Xt plugin */
-static void
-xt_client_init( XtClient * xtclient,
- Visual *xtvisual,
- Colormap xtcolormap,
- int xtdepth)
-{
- XtAppContext app_context;
- char *mArgv[1];
- int mArgc = 0;
-
- /*
- * Initialize Xt stuff
- */
- xtclient->top_widget = NULL;
- xtclient->child_widget = NULL;
- xtclient->xtdisplay = NULL;
- xtclient->xtvisual = NULL;
- xtclient->xtcolormap = 0;
- xtclient->xtdepth = 0;
-
- if (!xt_is_initialized) {
-#ifdef DEBUG_XTBIN
- printf("starting up Xt stuff\n");
-#endif
- XtToolkitInitialize();
- app_context = XtCreateApplicationContext();
- if (fallback)
- XtAppSetFallbackResources(app_context, fallback);
-
- xtdisplay = XtOpenDisplay(app_context, gdk_get_display(), NULL,
- "Wrapper", NULL, 0, &mArgc, mArgv);
- if (xtdisplay)
- xt_is_initialized = TRUE;
- }
- xtclient->xtdisplay = xtdisplay;
- xtclient->xtvisual = xtvisual;
- xtclient->xtcolormap = xtcolormap;
- xtclient->xtdepth = xtdepth;
-}
-
-/* Create the Xt client widgets
-* */
-static void
-xt_client_create ( XtClient* xtclient ,
- Window embedderid,
- int height,
- int width )
-{
- int n;
- Arg args[6];
- Widget child_widget;
- Widget top_widget;
-
-#ifdef DEBUG_XTBIN
- printf("xt_client_create() \n");
-#endif
- top_widget = XtAppCreateShell("drawingArea", "Wrapper",
- applicationShellWidgetClass,
- xtclient->xtdisplay,
- NULL, 0);
- xtclient->top_widget = top_widget;
-
- /* set size of Xt window */
- n = 0;
- XtSetArg(args[n], XtNheight, height);n++;
- XtSetArg(args[n], XtNwidth, width);n++;
- XtSetValues(top_widget, args, n);
-
- child_widget = XtVaCreateWidget("form",
- compositeWidgetClass,
- top_widget, NULL);
-
- n = 0;
- XtSetArg(args[n], XtNheight, height);n++;
- XtSetArg(args[n], XtNwidth, width);n++;
- XtSetArg(args[n], XtNvisual, xtclient->xtvisual ); n++;
- XtSetArg(args[n], XtNdepth, xtclient->xtdepth ); n++;
- XtSetArg(args[n], XtNcolormap, xtclient->xtcolormap ); n++;
- XtSetArg(args[n], XtNborderWidth, 0); n++;
- XtSetValues(child_widget, args, n);
-
- XSync(xtclient->xtdisplay, FALSE);
- xtclient->oldwindow = top_widget->core.window;
- top_widget->core.window = embedderid;
-
- /* this little trick seems to finish initializing the widget */
-#if XlibSpecificationRelease >= 6
- XtRegisterDrawable(xtclient->xtdisplay,
- embedderid,
- top_widget);
-#else
- _XtRegisterWindow( embedderid,
- top_widget);
-#endif
- XtRealizeWidget(child_widget);
-
- /* listen to all Xt events */
- XSelectInput(xtclient->xtdisplay,
- XtWindow(top_widget),
- 0x0FFFFF);
- xt_client_set_info (child_widget, 0);
-
- XtManageChild(child_widget);
- xtclient->child_widget = child_widget;
-
- /* set the event handler */
- XtAddEventHandler(child_widget,
- 0x0FFFFF & ~ResizeRedirectMask,
- TRUE,
- (XtEventHandler)xt_client_event_handler, xtclient);
- XtAddEventHandler(child_widget,
- SubstructureNotifyMask | ButtonReleaseMask,
- TRUE,
- (XtEventHandler)xt_client_focus_listener,
- xtclient);
- XSync(xtclient->xtdisplay, FALSE);
-}
-
-static void
-xt_client_unrealize ( XtClient* xtclient )
-{
-#if XlibSpecificationRelease >= 6
- XtUnregisterDrawable(xtclient->xtdisplay,
- xtclient->top_widget->core.window);
-#else
- _XtUnregisterWindow(xtclient->top_widget->core.window,
- xtclient->top_widget);
-#endif
-
- /* flush the queue before we returning origin top_widget->core.window
- or we can get X error since the window is gone */
- XSync(xtclient->xtdisplay, False);
-
- xtclient->top_widget->core.window = xtclient->oldwindow;
- XtUnrealizeWidget(xtclient->top_widget);
-}
-
-static void
-xt_client_destroy (XtClient* xtclient)
-{
- if(xtclient->top_widget) {
- XtRemoveEventHandler(xtclient->child_widget, 0x0FFFFF, TRUE,
- (XtEventHandler)xt_client_event_handler, xtclient);
- XtDestroyWidget(xtclient->top_widget);
- xtclient->top_widget = NULL;
- }
-}
-
-static void
-xt_client_set_info (Widget xtplug, unsigned long flags)
-{
- unsigned long buffer[2];
-
- Atom infoAtom = XInternAtom(XtDisplay(xtplug), "_XEMBED_INFO", False);
-
- buffer[1] = 0; /* Protocol version */
- buffer[1] = flags;
-
- XChangeProperty (XtDisplay(xtplug), XtWindow(xtplug),
- infoAtom, infoAtom, 32,
- PropModeReplace,
- (unsigned char *)buffer, 2);
-}
-
-static void
-xt_client_handle_xembed_message(Widget w, XtPointer client_data, XEvent *event)
-{
- XtClient *xtplug = (XtClient*)client_data;
- switch (event->xclient.data.l[1])
- {
- case XEMBED_EMBEDDED_NOTIFY:
- break;
- case XEMBED_WINDOW_ACTIVATE:
-#ifdef DEBUG_XTBIN
- printf("Xt client get XEMBED_WINDOW_ACTIVATE\n");
-#endif
- break;
- case XEMBED_WINDOW_DEACTIVATE:
-#ifdef DEBUG_XTBIN
- printf("Xt client get XEMBED_WINDOW_DEACTIVATE\n");
-#endif
- break;
- case XEMBED_MODALITY_ON:
-#ifdef DEBUG_XTBIN
- printf("Xt client get XEMBED_MODALITY_ON\n");
-#endif
- break;
- case XEMBED_MODALITY_OFF:
-#ifdef DEBUG_XTBIN
- printf("Xt client get XEMBED_MODALITY_OFF\n");
-#endif
- break;
- case XEMBED_FOCUS_IN:
- case XEMBED_FOCUS_OUT:
- {
- XEvent xevent;
- memset(&xevent, 0, sizeof(xevent));
-
- if(event->xclient.data.l[1] == XEMBED_FOCUS_IN) {
-#ifdef DEBUG_XTBIN
- printf("XTEMBED got focus in\n");
-#endif
- xevent.xfocus.type = FocusIn;
- }
- else {
-#ifdef DEBUG_XTBIN
- printf("XTEMBED got focus out\n");
-#endif
- xevent.xfocus.type = FocusOut;
- }
-
- xevent.xfocus.window = XtWindow(xtplug->child_widget);
- xevent.xfocus.display = XtDisplay(xtplug->child_widget);
- XSendEvent(XtDisplay(xtplug->child_widget),
- xevent.xfocus.window,
- False, NoEventMask,
- &xevent );
- XSync( XtDisplay(xtplug->child_widget), False);
- }
- break;
- default:
- break;
- } /* End of XEmbed Message */
-}
-
-static void
-xt_client_event_handler( Widget w, XtPointer client_data, XEvent *event)
-{
- XtClient *xtplug = (XtClient*)client_data;
-
- switch(event->type)
- {
- case ClientMessage:
- /* Handle xembed message */
- if (event->xclient.message_type==
- XInternAtom (XtDisplay(xtplug->child_widget),
- "_XEMBED", False)) {
- xt_client_handle_xembed_message(w, client_data, event);
- }
- break;
- case ReparentNotify:
- break;
- case MappingNotify:
- xt_client_set_info (w, XEMBED_MAPPED);
- break;
- case UnmapNotify:
- xt_client_set_info (w, 0);
- break;
- case FocusIn:
- send_xembed_message ( xtplug,
- XEMBED_REQUEST_FOCUS, 0, 0, 0, 0);
- break;
- case FocusOut:
- break;
- case KeyPress:
-#ifdef DEBUG_XTBIN
- printf("Key Press Got!\n");
-#endif
- break;
- default:
- break;
- } /* End of switch(event->type) */
-}
-
-static void
-send_xembed_message (XtClient *xtclient,
- long message,
- long detail,
- long data1,
- long data2,
- long time)
-{
- XEvent xevent;
- Window w=XtWindow(xtclient->top_widget);
- Display* dpy=xtclient->xtdisplay;
- int errorcode;
-
- memset(&xevent,0,sizeof(xevent));
- xevent.xclient.window = w;
- xevent.xclient.type = ClientMessage;
- xevent.xclient.message_type = XInternAtom(dpy,"_XEMBED",False);
- xevent.xclient.format = 32;
- xevent.xclient.data.l[0] = time;
- xevent.xclient.data.l[1] = message;
- xevent.xclient.data.l[2] = detail;
- xevent.xclient.data.l[3] = data1;
- xevent.xclient.data.l[4] = data2;
-
- trap_errors ();
- XSendEvent (dpy, w, False, NoEventMask, &xevent);
- XSync (dpy,False);
-
- if((errorcode = untrap_error())) {
-#ifdef DEBUG_XTBIN
- printf("send_xembed_message error(%d)!!!\n",errorcode);
-#endif
- }
-}
-
-static int
-error_handler(Display *display, XErrorEvent *error)
-{
- trapped_error_code = error->error_code;
- return 0;
-}
-
-static void
-trap_errors(void)
-{
- trapped_error_code =0;
- old_error_handler = XSetErrorHandler(error_handler);
-}
-
-static int
-untrap_error(void)
-{
- XSetErrorHandler(old_error_handler);
- if(trapped_error_code) {
-#ifdef DEBUG_XTBIN
- printf("Get X Window Error = %d\n", trapped_error_code);
-#endif
- }
- return trapped_error_code;
-}
-
-static void
-xt_client_focus_listener( Widget w, XtPointer user_data, XEvent *event)
-{
- Display *dpy = XtDisplay(w);
- XtClient *xtclient = user_data;
- Window win = XtWindow(w);
-
- switch(event->type)
- {
- case CreateNotify:
- if(event->xcreatewindow.parent == win) {
- Widget child=XtWindowToWidget( dpy, event->xcreatewindow.window);
- if (child)
- xt_add_focus_listener_tree(child, user_data);
- }
- break;
- case DestroyNotify:
- xt_remove_focus_listener( w, user_data);
- break;
- case ReparentNotify:
- if(event->xreparent.parent == win) {
- /* I am the new parent */
- Widget child=XtWindowToWidget(dpy, event->xreparent.window);
- if (child)
- xt_add_focus_listener_tree( child, user_data);
- }
- else if(event->xreparent.window == win) {
- /* I am the new child */
- }
- else {
- /* I am the old parent */
- }
- break;
- case ButtonRelease:
-#if 0
- XSetInputFocus(dpy, XtWindow(xtclient->child_widget), RevertToParent, event->xbutton.time);
-#endif
- send_xembed_message ( xtclient,
- XEMBED_REQUEST_FOCUS, 0, 0, 0, 0);
- break;
- default:
- break;
- } /* End of switch(event->type) */
-}
-
-static void
-xt_add_focus_listener( Widget w, XtPointer user_data)
-{
- XWindowAttributes attr;
- long eventmask;
- XtClient *xtclient = user_data;
-
- trap_errors ();
- XGetWindowAttributes(XtDisplay(w), XtWindow(w), &attr);
- eventmask = attr.your_event_mask | SubstructureNotifyMask | ButtonReleaseMask;
- XSelectInput(XtDisplay(w),
- XtWindow(w),
- eventmask);
-
- XtAddEventHandler(w,
- SubstructureNotifyMask | ButtonReleaseMask,
- TRUE,
- (XtEventHandler)xt_client_focus_listener,
- xtclient);
- untrap_error();
-}
-
-static void
-xt_remove_focus_listener(Widget w, XtPointer user_data)
-{
- trap_errors ();
- XtRemoveEventHandler(w, SubstructureNotifyMask | ButtonReleaseMask, TRUE,
- (XtEventHandler)xt_client_focus_listener, user_data);
-
- untrap_error();
-}
-
-static void
-xt_add_focus_listener_tree ( Widget treeroot, XtPointer user_data)
-{
- Window win = XtWindow(treeroot);
- Window *children;
- Window root, parent;
- Display *dpy = XtDisplay(treeroot);
- unsigned int i, nchildren;
-
- /* ensure we don't add more than once */
- xt_remove_focus_listener( treeroot, user_data);
- xt_add_focus_listener( treeroot, user_data);
- trap_errors();
- if(!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) {
- untrap_error();
- return;
- }
-
- if(untrap_error())
- return;
-
- for(i=0; i<nchildren; ++i) {
- Widget child = XtWindowToWidget(dpy, children[i]);
- if (child)
- xt_add_focus_listener_tree( child, user_data);
- }
- XFree((void*)children);
-
- return;
-}
diff --git a/WebCore/plugins/gtk/gtk2xtbin.h b/WebCore/plugins/gtk/gtk2xtbin.h
deleted file mode 100644
index 11f6e06..0000000
--- a/WebCore/plugins/gtk/gtk2xtbin.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim: set expandtab shiftwidth=2 tabstop=2: */
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Gtk2XtBin Widget Implementation.
- *
- * The Initial Developer of the Original Code is
- * Sun Microsystems, Inc.
- * Portions created by the Initial Developer are Copyright (C) 2002
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef __GTK_XTBIN_H__
-#define __GTK_XTBIN_H__
-
-#include <gtk/gtk.h>
-#include <X11/Intrinsic.h>
-#include <X11/Xutil.h>
-#include <X11/Xlib.h>
-#ifdef MOZILLA_CLIENT
-#include "nscore.h"
-#ifdef _IMPL_GTKXTBIN_API
-#define GTKXTBIN_API(type) NS_EXPORT_(type)
-#else
-#define GTKXTBIN_API(type) NS_IMPORT_(type)
-#endif
-#else
-#define GTKXTBIN_API(type) type
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-typedef struct _GtkXtBin GtkXtBin;
-typedef struct _GtkXtBinClass GtkXtBinClass;
-
-#define GTK_TYPE_XTBIN (gtk_xtbin_get_type ())
-#define GTK_XTBIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
- GTK_TYPE_XTBIN, GtkXtBin))
-#define GTK_XTBIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
- GTK_TYPE_XTBIN, GtkXtBinClass))
-#define GTK_IS_XTBIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
- GTK_TYPE_XTBIN))
-#define GTK_IS_XTBIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
- GTK_TYPE_XTBIN))
-typedef struct _XtClient XtClient;
-
-struct _XtClient {
- Display *xtdisplay;
- Widget top_widget; /* The toplevel widget */
- Widget child_widget; /* The embedded widget */
- Visual *xtvisual;
- int xtdepth;
- Colormap xtcolormap;
- Window oldwindow;
-};
-
-struct _GtkXtBin
-{
- GtkSocket gsocket;
- GdkWindow *parent_window;
- Display *xtdisplay; /* Xt Toolkit Display */
-
- Window xtwindow; /* Xt Toolkit XWindow */
- gint x, y;
- gint width, height;
- XtClient xtclient; /* Xt Client for XEmbed */
-};
-
-struct _GtkXtBinClass
-{
- GtkSocketClass widget_class;
-};
-
-GTKXTBIN_API(GType) gtk_xtbin_get_type (void);
-GTKXTBIN_API(GtkWidget *) gtk_xtbin_new (GtkWidget *parent_widget, String *f);
-GTKXTBIN_API(void) gtk_xtbin_set_position (GtkXtBin *xtbin,
- gint x,
- gint y);
-GTKXTBIN_API(void) gtk_xtbin_resize (GtkWidget *widget,
- gint width,
- gint height);
-
-typedef struct _XtTMRec {
- XtTranslations translations; /* private to Translation Manager */
- XtBoundActions proc_table; /* procedure bindings for actions */
- struct _XtStateRec *current_state; /* Translation Manager state ptr */
- unsigned long lastEventTime;
-} XtTMRec, *XtTM;
-
-typedef struct _CorePart {
- Widget self; /* pointer to widget itself */
- WidgetClass widget_class; /* pointer to Widget's ClassRec */
- Widget parent; /* parent widget */
- XrmName xrm_name; /* widget resource name quarkified */
- Boolean being_destroyed; /* marked for destroy */
- XtCallbackList destroy_callbacks; /* who to call when widget destroyed */
- XtPointer constraints; /* constraint record */
- Position x, y; /* window position */
- Dimension width, height; /* window dimensions */
- Dimension border_width; /* window border width */
- Boolean managed; /* is widget geometry managed? */
- Boolean sensitive; /* is widget sensitive to user events*/
- Boolean ancestor_sensitive; /* are all ancestors sensitive? */
- XtEventTable event_table; /* private to event dispatcher */
- XtTMRec tm; /* translation management */
- XtTranslations accelerators; /* accelerator translations */
- Pixel border_pixel; /* window border pixel */
- Pixmap border_pixmap; /* window border pixmap or NULL */
- WidgetList popup_list; /* list of popups */
- Cardinal num_popups; /* how many popups */
- String name; /* widget resource name */
- Screen *screen; /* window's screen */
- Colormap colormap; /* colormap */
- Window window; /* window ID */
- Cardinal depth; /* number of planes in window */
- Pixel background_pixel; /* window background pixel */
- Pixmap background_pixmap; /* window background pixmap or NULL */
- Boolean visible; /* is window mapped and not occluded?*/
- Boolean mapped_when_managed;/* map window if it's managed? */
-} CorePart;
-
-typedef struct _WidgetRec {
- CorePart core;
- } WidgetRec, CoreRec;
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* __GTK_XTBIN_H__ */
diff --git a/WebCore/plugins/gtk/xembed.h b/WebCore/plugins/gtk/xembed.h
deleted file mode 100644
index dff7be9..0000000
--- a/WebCore/plugins/gtk/xembed.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim:expandtab:shiftwidth=2:tabstop=2: */
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the XEMBED Declaration.
- *
- * The Initial Developer of the Original Code is
- * Sun Microsystems, Inc.
- * Portions created by the Initial Developer are Copyright (C) 2002
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/* XEMBED messages */
-#define XEMBED_EMBEDDED_NOTIFY 0
-#define XEMBED_WINDOW_ACTIVATE 1
-#define XEMBED_WINDOW_DEACTIVATE 2
-#define XEMBED_REQUEST_FOCUS 3
-#define XEMBED_FOCUS_IN 4
-#define XEMBED_FOCUS_OUT 5
-#define XEMBED_FOCUS_NEXT 6
-#define XEMBED_FOCUS_PREV 7
-#define XEMBED_GRAB_KEY 8
-#define XEMBED_UNGRAB_KEY 9
-#define XEMBED_MODALITY_ON 10
-#define XEMBED_MODALITY_OFF 11
-
-/* Non standard messages*/
-#define XEMBED_GTK_GRAB_KEY 108
-#define XEMBED_GTK_UNGRAB_KEY 109
-
-/* Details for XEMBED_FOCUS_IN: */
-#define XEMBED_FOCUS_CURRENT 0
-#define XEMBED_FOCUS_FIRST 1
-#define XEMBED_FOCUS_LAST 2
-
-/* Flags for _XEMBED_INFO */
-#define XEMBED_MAPPED (1 << 0)
diff --git a/WebCore/plugins/mac/PluginPackageMac.cpp b/WebCore/plugins/mac/PluginPackageMac.cpp
deleted file mode 100644
index 865ea32..0000000
--- a/WebCore/plugins/mac/PluginPackageMac.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginPackage.h"
-
-#include <wtf/RetainPtr.h>
-#include "MIMETypeRegistry.h"
-#include "npruntime_impl.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include "WebCoreNSStringExtras.h"
-#include <wtf/text/CString.h>
-
-#include <CoreFoundation/CoreFoundation.h>
-
-#define PluginNameOrDescriptionStringNumber 126
-#define MIMEDescriptionStringNumber 127
-#define MIMEListStringStringNumber 128
-
-namespace WebCore {
-
-void PluginPackage::determineQuirks(const String& mimeType)
-{
- if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
- // Because a single process cannot create multiple VMs, and we cannot reliably unload a
- // Java VM, we cannot unload the Java Plugin, or we'll lose reference to our only VM
- m_quirks.add(PluginQuirkDontUnloadPlugin);
-
- // Setting the window region to an empty region causes bad scrolling repaint problems
- // with the Java plug-in.
- m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling);
- }
-
- if (mimeType == "application/x-shockwave-flash") {
- // The flash plugin only requests windowless plugins if we return a mozilla user agent
- m_quirks.add(PluginQuirkWantsMozillaUserAgent);
- m_quirks.add(PluginQuirkThrottleInvalidate);
- m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages);
- m_quirks.add(PluginQuirkFlashURLNotifyBug);
- }
-
-}
-
-typedef void (*BP_CreatePluginMIMETypesPreferencesFuncPtr)(void);
-
-static WTF::RetainPtr<CFDictionaryRef> readPListFile(CFStringRef fileName, bool createFile, CFBundleRef bundle)
-{
- if (createFile) {
- BP_CreatePluginMIMETypesPreferencesFuncPtr funcPtr =
- (BP_CreatePluginMIMETypesPreferencesFuncPtr)CFBundleGetFunctionPointerForName(bundle, CFSTR("BP_CreatePluginMIMETypesPreferences"));
- if (funcPtr)
- funcPtr();
- }
-
- WTF::RetainPtr<CFDictionaryRef> map;
- WTF::RetainPtr<CFURLRef> url =
- CFURLCreateWithFileSystemPath(kCFAllocatorDefault, fileName, kCFURLPOSIXPathStyle, false);
-
- CFDataRef resource = 0;
- SInt32 code;
- if (!CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, url.get(), &resource, 0, 0, &code))
- return map;
-
- WTF::RetainPtr<CFPropertyListRef> propertyList =
- CFPropertyListCreateFromXMLData(kCFAllocatorDefault, resource, kCFPropertyListImmutable, 0);
-
- CFRelease(resource);
-
- if (!propertyList)
- return map;
-
- if (CFGetTypeID(propertyList.get()) != CFDictionaryGetTypeID())
- return map;
-
- map = static_cast<CFDictionaryRef>(static_cast<CFPropertyListRef>(propertyList.get()));
- return map;
-}
-
-static Vector<String> stringListFromResourceId(SInt16 id)
-{
- Vector<String> list;
-
- Handle handle = Get1Resource('STR#', id);
- if (!handle)
- return list;
-
- CFStringEncoding encoding = stringEncodingForResource(handle);
-
- unsigned char* p = (unsigned char*)*handle;
- if (!p)
- return list;
-
- SInt16 count = *(SInt16*)p;
- p += sizeof(SInt16);
-
- for (SInt16 i = 0; i < count; ++i) {
- unsigned char length = *p;
- WTF::RetainPtr<CFStringRef> str = CFStringCreateWithPascalString(0, p, encoding);
- list.append(str.get());
- p += 1 + length;
- }
-
- return list;
-}
-
-bool PluginPackage::fetchInfo()
-{
- if (!load())
- return false;
-
- WTF::RetainPtr<CFDictionaryRef> mimeDict;
-
- WTF::RetainPtr<CFTypeRef> mimeTypesFileName = CFBundleGetValueForInfoDictionaryKey(m_module, CFSTR("WebPluginMIMETypesFilename"));
- if (mimeTypesFileName && CFGetTypeID(mimeTypesFileName.get()) == CFStringGetTypeID()) {
-
- WTF::RetainPtr<CFStringRef> fileName = (CFStringRef)mimeTypesFileName.get();
- WTF::RetainPtr<CFStringRef> homeDir = homeDirectoryPath().createCFString();
- WTF::RetainPtr<CFStringRef> path = CFStringCreateWithFormat(0, 0, CFSTR("%@/Library/Preferences/%@"), homeDir.get(), fileName.get());
-
- WTF::RetainPtr<CFDictionaryRef> plist = readPListFile(path.get(), /*createFile*/ false, m_module);
- if (plist) {
- // If the plist isn't localized, have the plug-in recreate it in the preferred language.
- WTF::RetainPtr<CFStringRef> localizationName =
- (CFStringRef)CFDictionaryGetValue(plist.get(), CFSTR("WebPluginLocalizationName"));
- CFLocaleRef locale = CFLocaleCopyCurrent();
- if (localizationName != CFLocaleGetIdentifier(locale))
- plist = readPListFile(path.get(), /*createFile*/ true, m_module);
-
- CFRelease(locale);
- } else {
- // Plist doesn't exist, ask the plug-in to create it.
- plist = readPListFile(path.get(), /*createFile*/ true, m_module);
- }
-
- if (plist)
- mimeDict = (CFDictionaryRef)CFDictionaryGetValue(plist.get(), CFSTR("WebPluginMIMETypes"));
- }
-
- if (!mimeDict)
- mimeDict = (CFDictionaryRef)CFBundleGetValueForInfoDictionaryKey(m_module, CFSTR("WebPluginMIMETypes"));
-
- if (mimeDict) {
- CFIndex propCount = CFDictionaryGetCount(mimeDict.get());
- Vector<const void*, 128> keys(propCount);
- Vector<const void*, 128> values(propCount);
- CFDictionaryGetKeysAndValues(mimeDict.get(), keys.data(), values.data());
- for (int i = 0; i < propCount; ++i) {
- String mimeType = (CFStringRef)keys[i];
- mimeType = mimeType.lower();
-
- WTF::RetainPtr<CFDictionaryRef> extensionsDict = (CFDictionaryRef)values[i];
-
- WTF::RetainPtr<CFNumberRef> enabled = (CFNumberRef)CFDictionaryGetValue(extensionsDict.get(), CFSTR("WebPluginTypeEnabled"));
- if (enabled) {
- int enabledValue = 0;
- if (CFNumberGetValue(enabled.get(), kCFNumberIntType, &enabledValue) && enabledValue == 0)
- continue;
- }
-
- Vector<String> mimeExtensions;
- WTF::RetainPtr<CFArrayRef> extensions = (CFArrayRef)CFDictionaryGetValue(extensionsDict.get(), CFSTR("WebPluginExtensions"));
- if (extensions) {
- CFIndex extensionCount = CFArrayGetCount(extensions.get());
- for (CFIndex i = 0; i < extensionCount; ++i) {
- String extension =(CFStringRef)CFArrayGetValueAtIndex(extensions.get(), i);
- extension = extension.lower();
- mimeExtensions.append(extension);
- }
- }
- m_mimeToExtensions.set(mimeType, mimeExtensions);
-
- String description = (CFStringRef)CFDictionaryGetValue(extensionsDict.get(), CFSTR("WebPluginTypeDescription"));
- m_mimeToDescriptions.set(mimeType, description);
- }
-
- m_name = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(m_module, CFSTR("WebPluginName"));
- m_description = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(m_module, CFSTR("WebPluginDescription"));
-
- } else {
- int resFile = CFBundleOpenBundleResourceMap(m_module);
-
- UseResFile(resFile);
-
- Vector<String> mimes = stringListFromResourceId(MIMEListStringStringNumber);
-
- if (mimes.size() % 2 != 0)
- return false;
-
- Vector<String> descriptions = stringListFromResourceId(MIMEDescriptionStringNumber);
- if (descriptions.size() != mimes.size() / 2)
- return false;
-
- for (size_t i = 0; i < mimes.size(); i += 2) {
- String mime = mimes[i].lower();
- Vector<String> extensions;
- mimes[i + 1].lower().split(UChar(','), extensions);
-
- m_mimeToExtensions.set(mime, extensions);
-
- m_mimeToDescriptions.set(mime, descriptions[i / 2]);
- }
-
- Vector<String> names = stringListFromResourceId(PluginNameOrDescriptionStringNumber);
- if (names.size() == 2) {
- m_description = names[0];
- m_name = names[1];
- }
-
- CFBundleCloseBundleResourceMap(m_module, resFile);
- }
-
- LOG(Plugins, "PluginPackage::fetchInfo(): Found plug-in '%s'", m_name.utf8().data());
- if (isPluginBlacklisted()) {
- LOG(Plugins, "\tPlug-in is blacklisted!");
- return false;
- }
-
- return true;
-}
-
-bool PluginPackage::isPluginBlacklisted()
-{
- return false;
-}
-
-bool PluginPackage::load()
-{
- if (m_isLoaded) {
- m_loadCount++;
- return true;
- }
-
- WTF::RetainPtr<CFStringRef> path(AdoptCF, m_path.createCFString());
- WTF::RetainPtr<CFURLRef> url(AdoptCF, CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path.get(),
- kCFURLPOSIXPathStyle, false));
- m_module = CFBundleCreate(NULL, url.get());
- if (!m_module || !CFBundleLoadExecutable(m_module)) {
- LOG(Plugins, "%s not loaded", m_path.utf8().data());
- return false;
- }
-
- m_isLoaded = true;
-
- NP_GetEntryPointsFuncPtr NP_GetEntryPoints = 0;
- NP_InitializeFuncPtr NP_Initialize;
- NPError npErr;
-
- NP_Initialize = (NP_InitializeFuncPtr)CFBundleGetFunctionPointerForName(m_module, CFSTR("NP_Initialize"));
- NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)CFBundleGetFunctionPointerForName(m_module, CFSTR("NP_GetEntryPoints"));
- m_NPP_Shutdown = (NPP_ShutdownProcPtr)CFBundleGetFunctionPointerForName(m_module, CFSTR("NP_Shutdown"));
-
- if (!NP_Initialize || !NP_GetEntryPoints || !m_NPP_Shutdown)
- goto abort;
-
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
-
- initializeBrowserFuncs();
-
- npErr = NP_Initialize(&m_browserFuncs);
- LOG_NPERROR(npErr);
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- npErr = NP_GetEntryPoints(&m_pluginFuncs);
- LOG_NPERROR(npErr);
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- m_loadCount++;
- return true;
-
-abort:
- unloadWithoutShutdown();
- return false;
-}
-
-uint16_t PluginPackage::NPVersion() const
-{
- return NP_VERSION_MINOR;
-}
-} // namespace WebCore
diff --git a/WebCore/plugins/mac/PluginViewMac.mm b/WebCore/plugins/mac/PluginViewMac.mm
deleted file mode 100644
index 7119f0d..0000000
--- a/WebCore/plugins/mac/PluginViewMac.mm
+++ /dev/null
@@ -1,821 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginView.h"
-
-#include "Bridge.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Element.h"
-#include "EventNames.h"
-#include "FocusController.h"
-#include "FrameLoader.h"
-#include "FrameLoadRequest.h"
-#include "FrameTree.h"
-#include "Frame.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "HostWindow.h"
-#include "HTMLNames.h"
-#include "HTMLPlugInElement.h"
-#include "Image.h"
-#include "JSDOMBinding.h"
-#include "KeyboardEvent.h"
-#include "MouseEvent.h"
-#include "NotImplemented.h"
-#include "Page.h"
-#include "PlatformMouseEvent.h"
-#include "PlatformKeyboardEvent.h"
-#include "PluginDebug.h"
-#include "PluginPackage.h"
-#include "PluginMainThreadScheduler.h"
-#include "RenderLayer.h"
-#include "ScriptController.h"
-#include "Settings.h"
-#include "npruntime_impl.h"
-#include "runtime_root.h"
-#include <runtime/JSLock.h>
-#include <runtime/JSValue.h>
-#include <wtf/RetainPtr.h>
-
-
-using JSC::ExecState;
-using JSC::Interpreter;
-using JSC::JSLock;
-using JSC::JSObject;
-using JSC::JSValue;
-using JSC::UString;
-
-#if PLATFORM(QT)
-#include <QWidget>
-#include <QKeyEvent>
-#include <QPainter>
-#include "QWebPageClient.h"
-QT_BEGIN_NAMESPACE
-extern Q_GUI_EXPORT OSWindowRef qt_mac_window_for(const QWidget* w);
-QT_END_NAMESPACE
-#endif
-
-#if PLATFORM(WX)
-#include <wx/defs.h>
-#include <wx/wx.h>
-#endif
-
-using std::min;
-
-using namespace WTF;
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-#ifndef NP_NO_CARBON
-static int modifiersForEvent(UIEventWithKeyState *event);
-#endif
-
-static inline WindowRef nativeWindowFor(PlatformWidget widget)
-{
-#if PLATFORM(QT)
- if (widget)
-#if QT_MAC_USE_COCOA
- return static_cast<WindowRef>([qt_mac_window_for(widget) windowRef]);
-#else
- return static_cast<WindowRef>(qt_mac_window_for(widget));
-#endif
-#elif PLATFORM(WX)
- if (widget)
- return (WindowRef)widget->MacGetTopLevelWindowRef();
-#endif
- return 0;
-}
-
-static inline CGContextRef cgHandleFor(PlatformWidget widget)
-{
-#if PLATFORM(QT)
- if (widget)
- return (CGContextRef)widget->macCGHandle();
-#endif
-#if PLATFORM(WX)
- if (widget)
- return (CGContextRef)widget->MacGetCGContextRef();
-#endif
- return 0;
-}
-
-static inline IntPoint topLevelOffsetFor(PlatformWidget widget)
-{
-#if PLATFORM(QT)
- if (widget) {
- PlatformWidget topLevel = widget->window();
- return widget->mapTo(topLevel, QPoint(0, 0)) + topLevel->geometry().topLeft() - topLevel->pos();
- }
-#endif
-#if PLATFORM(WX)
- if (widget) {
- PlatformWidget toplevel = wxGetTopLevelParent(widget);
- return toplevel->ScreenToClient(widget->GetScreenPosition());
- }
-#endif
- return IntPoint();
-}
-
-// --------------- Lifetime management -----------------
-
-bool PluginView::platformStart()
-{
- ASSERT(m_isStarted);
- ASSERT(m_status == PluginStatusLoadedSuccessfully);
-
- if (m_drawingModel == NPDrawingModel(-1)) {
- // We default to QuickDraw, even though we don't support it,
- // since that's what Safari does, and some plugins expect this
- // behavior and never set the drawing model explicitly.
-#ifndef NP_NO_QUICKDRAW
- m_drawingModel = NPDrawingModelQuickDraw;
-#else
- // QuickDraw not available, so we have to default to CoreGraphics
- m_drawingModel = NPDrawingModelCoreGraphics;
-#endif
- }
-
- if (m_eventModel == NPEventModel(-1)) {
- // If the plug-in did not specify an event model
- // we default to Carbon, when it is available.
-#ifndef NP_NO_CARBON
- m_eventModel = NPEventModelCarbon;
-#else
- m_eventModel = NPEventModelCocoa;
-#endif
- }
-
- // Gracefully handle unsupported drawing or event models. We can do this
- // now since the drawing and event model can only be set during NPP_New.
-#ifndef NP_NO_CARBON
- NPBool eventModelSupported;
- if (getValueStatic(NPNVariable(NPNVsupportsCarbonBool + m_eventModel), &eventModelSupported) != NPERR_NO_ERROR
- || !eventModelSupported) {
-#endif
- m_status = PluginStatusCanNotLoadPlugin;
- LOG(Plugins, "Plug-in '%s' uses unsupported event model %s",
- m_plugin->name().utf8().data(), prettyNameForEventModel(m_eventModel));
- return false;
-#ifndef NP_NO_CARBON
- }
-#endif
-
-#ifndef NP_NO_QUICKDRAW
- NPBool drawingModelSupported;
- if (getValueStatic(NPNVariable(NPNVsupportsQuickDrawBool + m_drawingModel), &drawingModelSupported) != NPERR_NO_ERROR
- || !drawingModelSupported) {
-#endif
- m_status = PluginStatusCanNotLoadPlugin;
- LOG(Plugins, "Plug-in '%s' uses unsupported drawing model %s",
- m_plugin->name().utf8().data(), prettyNameForDrawingModel(m_drawingModel));
- return false;
-#ifndef NP_NO_QUICKDRAW
- }
-#endif
-
-#if PLATFORM(QT)
- // Set the platformPluginWidget only in the case of QWebView so that the context menu appears in the right place.
- // In all other cases, we use off-screen rendering
- if (QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient()) {
- if (QWidget* widget = qobject_cast<QWidget*>(client->pluginParent()))
- setPlatformPluginWidget(widget);
- }
-#endif
-#if PLATFORM(WX)
- if (wxWindow* widget = m_parentFrame->view()->hostWindow()->platformPageClient())
- setPlatformPluginWidget(widget);
-#endif
-
- // Create a fake window relative to which all events will be sent when using offscreen rendering
- if (!platformPluginWidget()) {
-#ifndef NP_NO_CARBON
- // Make the default size really big. It is unclear why this is required but with a smaller size, mouse move
- // events don't get processed. Resizing the fake window to flash's size doesn't help.
- ::Rect windowBounds = { 0, 0, 1000, 1000 };
- CreateNewWindow(kDocumentWindowClass, kWindowStandardDocumentAttributes, &windowBounds, &m_fakeWindow);
- // Flash requires the window to be hilited to process mouse move events.
- HiliteWindow(m_fakeWindow, true);
-#endif
- }
-
- updatePluginWidget();
-
- if (!m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))
- setNPWindowIfNeeded();
-
- // TODO: Implement null timer throttling depending on plugin activation
- m_nullEventTimer.set(new Timer<PluginView>(this, &PluginView::nullEventTimerFired));
- m_nullEventTimer->startRepeating(0.02);
-
- m_lastMousePos.h = m_lastMousePos.v = 0;
-
- return true;
-}
-
-void PluginView::platformDestroy()
-{
- if (platformPluginWidget())
- setPlatformPluginWidget(0);
- else {
- CGContextRelease(m_contextRef);
-#ifndef NP_NO_CARBON
- if (m_fakeWindow)
- DisposeWindow(m_fakeWindow);
-#endif
- }
-}
-
-// Used before the plugin view has been initialized properly, and as a
-// fallback for variables that do not require a view to resolve.
-bool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVToolkit:
- *static_cast<uint32_t*>(value) = 0;
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVjavascriptEnabledBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
-#ifndef NP_NO_CARBON
- case NPNVsupportsCarbonBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
-#endif
- case NPNVsupportsCocoaBool:
- *static_cast<NPBool*>(value) = false;
- *result = NPERR_NO_ERROR;
- return true;
-
- // CoreGraphics is the only drawing model we support
- case NPNVsupportsCoreGraphicsBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
-#ifndef NP_NO_QUICKDRAW
- // QuickDraw is deprecated in 10.5 and not supported on 64-bit
- case NPNVsupportsQuickDrawBool:
-#endif
- case NPNVsupportsOpenGLBool:
- case NPNVsupportsCoreAnimationBool:
- *static_cast<NPBool*>(value) = false;
- *result = NPERR_NO_ERROR;
- return true;
-
- default:
- return false;
- }
-}
-
-// Used only for variables that need a view to resolve
-bool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* error)
-{
- return false;
-}
-
-void PluginView::setParent(ScrollView* parent)
-{
- LOG(Plugins, "PluginView::setParent(%p)", parent);
-
- Widget::setParent(parent);
-
- if (parent)
- init();
-}
-
-// -------------- Geometry and painting ----------------
-
-void PluginView::show()
-{
- LOG(Plugins, "PluginView::show()");
-
- setSelfVisible(true);
-
- Widget::show();
-}
-
-void PluginView::hide()
-{
- LOG(Plugins, "PluginView::hide()");
-
- setSelfVisible(false);
-
- Widget::hide();
-}
-
-void PluginView::setFocus(bool focused)
-{
- LOG(Plugins, "PluginView::setFocus(%d)", focused);
- if (!focused) {
- Widget::setFocus(focused);
- return;
- }
-
- if (platformPluginWidget())
-#if PLATFORM(QT)
- platformPluginWidget()->setFocus(Qt::OtherFocusReason);
-#else
- platformPluginWidget()->SetFocus();
-#endif
- else
- Widget::setFocus(focused);
-
- // TODO: Also handle and pass on blur events (focus lost)
-
-#ifndef NP_NO_CARBON
- EventRecord record;
- record.what = NPEventType_GetFocusEvent;
- record.message = 0;
- record.when = TickCount();
- record.where = globalMousePosForPlugin();
- record.modifiers = GetCurrentKeyModifiers();
-
- if (!dispatchNPEvent(record))
- LOG(Events, "PluginView::setFocus(%d): Focus event not accepted", focused);
-#endif
-}
-
-void PluginView::setParentVisible(bool visible)
-{
- if (isParentVisible() == visible)
- return;
-
- Widget::setParentVisible(visible);
-}
-
-void PluginView::setNPWindowRect(const IntRect&)
-{
- setNPWindowIfNeeded();
-}
-
-void PluginView::setNPWindowIfNeeded()
-{
- if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
- return;
-
- CGContextRef newContextRef = 0;
- WindowRef newWindowRef = 0;
- if (platformPluginWidget()) {
- newContextRef = cgHandleFor(platformPluginWidget());
- newWindowRef = nativeWindowFor(platformPluginWidget());
- m_npWindow.type = NPWindowTypeWindow;
- } else {
- newContextRef = m_contextRef;
- newWindowRef = m_fakeWindow;
- m_npWindow.type = NPWindowTypeDrawable;
- }
-
- if (!newContextRef || !newWindowRef)
- return;
-
- m_npWindow.window = (void*)&m_npCgContext;
-#ifndef NP_NO_CARBON
- m_npCgContext.window = newWindowRef;
-#endif
- m_npCgContext.context = newContextRef;
-
- m_npWindow.x = m_windowRect.x();
- m_npWindow.y = m_windowRect.y();
- m_npWindow.width = m_windowRect.width();
- m_npWindow.height = m_windowRect.height();
-
- // TODO: (also clip against scrollbars, etc.)
- m_npWindow.clipRect.left = max(0, m_windowRect.x());
- m_npWindow.clipRect.top = max(0, m_windowRect.y());
- m_npWindow.clipRect.right = m_windowRect.x() + m_windowRect.width();
- m_npWindow.clipRect.bottom = m_windowRect.y() + m_windowRect.height();
-
- LOG(Plugins, "PluginView::setNPWindowIfNeeded(): window=%p, context=%p,"
- " window.x:%d window.y:%d window.width:%d window.height:%d window.clipRect size:%dx%d",
- newWindowRef, newContextRef, m_npWindow.x, m_npWindow.y, m_npWindow.width, m_npWindow.height,
- m_npWindow.clipRect.right - m_npWindow.clipRect.left, m_npWindow.clipRect.bottom - m_npWindow.clipRect.top);
-
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-}
-
-void PluginView::updatePluginWidget()
-{
- if (!parent())
- return;
-
- ASSERT(parent()->isFrameView());
- FrameView* frameView = static_cast<FrameView*>(parent());
-
- IntRect oldWindowRect = m_windowRect;
- IntRect oldClipRect = m_clipRect;
-
- m_windowRect = frameView->contentsToWindow(frameRect());
- IntPoint offset = topLevelOffsetFor(platformPluginWidget());
- m_windowRect.move(offset.x(), offset.y());
-
- if (!platformPluginWidget()) {
- if (m_windowRect.size() != oldWindowRect.size()) {
- CGContextRelease(m_contextRef);
-#if PLATFORM(QT)
- m_pixmap = QPixmap(m_windowRect.size());
- m_pixmap.fill(Qt::transparent);
- m_contextRef = m_pixmap.isNull() ? 0 : qt_mac_cg_context(&m_pixmap);
-#endif
- }
- }
-
- m_clipRect = windowClipRect();
- m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
-
- if (platformPluginWidget() && (m_windowRect != oldWindowRect || m_clipRect != oldClipRect))
- setNPWindowIfNeeded();
-}
-
-void PluginView::paint(GraphicsContext* context, const IntRect& rect)
-{
- if (!m_isStarted || m_status != PluginStatusLoadedSuccessfully) {
- paintMissingPluginIcon(context, rect);
- return;
- }
-
- if (context->paintingDisabled())
- return;
-
- setNPWindowIfNeeded();
-
- CGContextRef cgContext = m_npCgContext.context;
- if (!cgContext)
- return;
-
- CGContextSaveGState(cgContext);
- if (platformPluginWidget()) {
- IntPoint offset = frameRect().location();
- CGContextTranslateCTM(cgContext, offset.x(), offset.y());
- }
-
- IntRect targetRect(frameRect());
- targetRect.intersects(rect);
-
- // clip the context so that plugin only updates the interested area.
- CGRect r;
- r.origin.x = targetRect.x() - frameRect().x();
- r.origin.y = targetRect.y() - frameRect().y();
- r.size.width = targetRect.width();
- r.size.height = targetRect.height();
- CGContextClipToRect(cgContext, r);
-
- if (!platformPluginWidget() && m_isTransparent) { // clean the pixmap in transparent mode
-#if PLATFORM(QT)
- QPainter painter(&m_pixmap);
- painter.setCompositionMode(QPainter::CompositionMode_Clear);
- painter.fillRect(QRectF(r.origin.x, r.origin.y, r.size.width, r.size.height), Qt::transparent);
-#endif
- }
-
-#ifndef NP_NO_CARBON
- EventRecord event;
- event.what = updateEvt;
- event.message = (long unsigned int)m_npCgContext.window;
- event.when = TickCount();
- event.where.h = 0;
- event.where.v = 0;
- event.modifiers = GetCurrentKeyModifiers();
-
- if (!dispatchNPEvent(event))
- LOG(Events, "PluginView::paint(): Paint event not accepted");
-#endif
-
- CGContextRestoreGState(cgContext);
-
- if (!platformPluginWidget()) {
-#if PLATFORM(QT)
- QPainter* painter = context->platformContext();
- painter->drawPixmap(targetRect.x(), targetRect.y(), m_pixmap,
- targetRect.x() - frameRect().x(), targetRect.y() - frameRect().y(), targetRect.width(), targetRect.height());
-#endif
- }
-}
-
-void PluginView::invalidateRect(const IntRect& rect)
-{
- if (platformPluginWidget())
-#if PLATFORM(QT)
- platformPluginWidget()->update(convertToContainingWindow(rect));
-#else
- platformPluginWidget()->RefreshRect(convertToContainingWindow(rect));
-#endif
- else
- invalidateWindowlessPluginRect(rect);
-}
-
-void PluginView::invalidateRect(NPRect* rect)
-{
- IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
- invalidateRect(r);
-}
-
-void PluginView::invalidateRegion(NPRegion region)
-{
- // TODO: optimize
- invalidate();
-}
-
-void PluginView::forceRedraw()
-{
- notImplemented();
-}
-
-
-// ----------------- Event handling --------------------
-
-void PluginView::handleMouseEvent(MouseEvent* event)
-{
- if (!m_isStarted)
- return;
-
-#ifndef NP_NO_CARBON
- EventRecord record;
-
- if (event->type() == eventNames().mousemoveEvent) {
- // Mouse movement is handled by null timer events
- m_lastMousePos = mousePosForPlugin(event);
- return;
- } else if (event->type() == eventNames().mouseoverEvent) {
- record.what = NPEventType_AdjustCursorEvent;
- } else if (event->type() == eventNames().mouseoutEvent) {
- record.what = NPEventType_AdjustCursorEvent;
- } else if (event->type() == eventNames().mousedownEvent) {
- record.what = mouseDown;
- // The plugin needs focus to receive keyboard events
- if (Page* page = m_parentFrame->page())
- page->focusController()->setFocusedFrame(m_parentFrame);
- m_parentFrame->document()->setFocusedNode(m_element);
- } else if (event->type() == eventNames().mouseupEvent) {
- record.what = mouseUp;
- } else {
- return;
- }
- record.where = mousePosForPlugin(event);
- record.modifiers = modifiersForEvent(event);
-
- if (!event->buttonDown())
- record.modifiers |= btnState;
-
- if (event->button() == 2)
- record.modifiers |= controlKey;
-
- if (!dispatchNPEvent(record)) {
- if (record.what == NPEventType_AdjustCursorEvent)
- return; // Signals that the plugin wants a normal cursor
-
- LOG(Events, "PluginView::handleMouseEvent(): Mouse event type %d at %d,%d not accepted",
- record.what, record.where.h, record.where.v);
- } else {
- event->setDefaultHandled();
- }
-#endif
-}
-
-void PluginView::handleKeyboardEvent(KeyboardEvent* event)
-{
- if (!m_isStarted)
- return;
-
- LOG(Plugins, "PluginView::handleKeyboardEvent() ----------------- ");
-
- LOG(Plugins, "PV::hKE(): KE.keyCode: 0x%02X, KE.charCode: %d",
- event->keyCode(), event->charCode());
-
-#ifndef NP_NO_CARBON
- EventRecord record;
-
- if (event->type() == eventNames().keydownEvent) {
- // This event is the result of a PlatformKeyboardEvent::KeyDown which
- // was disambiguated into a PlatformKeyboardEvent::RawKeyDown. Since
- // we don't have access to the text here, we return, and wait for the
- // corresponding event based on PlatformKeyboardEvent::Char.
- return;
- } else if (event->type() == eventNames().keypressEvent) {
- // Which would be this one. This event was disambiguated from the same
- // PlatformKeyboardEvent::KeyDown, but to a PlatformKeyboardEvent::Char,
- // which retains the text from the original event. So, we can safely pass
- // on the event as a key-down event to the plugin.
- record.what = keyDown;
- } else if (event->type() == eventNames().keyupEvent) {
- // PlatformKeyboardEvent::KeyUp events always have the text, so nothing
- // fancy here.
- record.what = keyUp;
- } else {
- return;
- }
-
- const PlatformKeyboardEvent* platformEvent = event->keyEvent();
- int keyCode = platformEvent->nativeVirtualKeyCode();
-
- const String text = platformEvent->text();
- if (text.length() < 1) {
- event->setDefaultHandled();
- return;
- }
-
- WTF::RetainPtr<CFStringRef> cfText(WTF::AdoptCF, text.createCFString());
-
- LOG(Plugins, "PV::hKE(): PKE.text: %s, PKE.unmodifiedText: %s, PKE.keyIdentifier: %s",
- text.ascii().data(), platformEvent->unmodifiedText().ascii().data(),
- platformEvent->keyIdentifier().ascii().data());
-
- char charCodes[2] = { 0, 0 };
- if (!CFStringGetCString(cfText.get(), charCodes, 2, CFStringGetSystemEncoding())) {
- LOG_ERROR("Could not resolve character code using system encoding.");
- event->setDefaultHandled();
- return;
- }
-
- record.where = globalMousePosForPlugin();
- record.modifiers = modifiersForEvent(event);
- record.message = ((keyCode & 0xFF) << 8) | (charCodes[0] & 0xFF);
- record.when = TickCount();
-
- LOG(Plugins, "PV::hKE(): record.modifiers: %d", record.modifiers);
-
-#if PLATFORM(QT)
- LOG(Plugins, "PV::hKE(): PKE.qtEvent()->nativeVirtualKey: 0x%02X, charCode: %d",
- keyCode, int(uchar(charCodes[0])));
-#endif
-
- if (!dispatchNPEvent(record))
- LOG(Events, "PluginView::handleKeyboardEvent(): Keyboard event type %d not accepted", record.what);
- else
- event->setDefaultHandled();
-#endif
-}
-
-#ifndef NP_NO_CARBON
-void PluginView::nullEventTimerFired(Timer<PluginView>*)
-{
- EventRecord record;
-
- record.what = nullEvent;
- record.message = 0;
- record.when = TickCount();
- record.where = m_lastMousePos;
- record.modifiers = GetCurrentKeyModifiers();
- if (!Button())
- record.modifiers |= btnState;
-
- if (!dispatchNPEvent(record))
- LOG(Events, "PluginView::nullEventTimerFired(): Null event not accepted");
-}
-#endif
-
-#ifndef NP_NO_CARBON
-static int modifiersForEvent(UIEventWithKeyState* event)
-{
- int modifiers = 0;
-
- if (event->ctrlKey())
- modifiers |= controlKey;
-
- if (event->altKey())
- modifiers |= optionKey;
-
- if (event->metaKey())
- modifiers |= cmdKey;
-
- if (event->shiftKey())
- modifiers |= shiftKey;
-
- return modifiers;
-}
-#endif
-
-#ifndef NP_NO_CARBON
-Point PluginView::globalMousePosForPlugin() const
-{
- Point pos;
- GetGlobalMouse(&pos);
-
-#if PLATFORM(WX)
- // make sure the titlebar/toolbar size is included
- WindowRef windowRef = nativeWindowFor(platformPluginWidget());
- ::Rect content, structure;
-
- GetWindowBounds(windowRef, kWindowStructureRgn, &structure);
- GetWindowBounds(windowRef, kWindowContentRgn, &content);
-
- int top = content.top - structure.top;
- pos.v -= top;
-#endif
-
- return pos;
-}
-#endif
-
-#ifndef NP_NO_CARBON
-Point PluginView::mousePosForPlugin(MouseEvent* event) const
-{
- ASSERT(event);
- if (platformPluginWidget())
- return globalMousePosForPlugin();
-
- if (event->button() == 2) {
- // always pass the global position for right-click since Flash uses it to position the context menu
- return globalMousePosForPlugin();
- }
-
- Point pos;
- IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
- pos.h = postZoomPos.x() + m_windowRect.x();
- // The number 22 is the height of the title bar. As to why it figures in the calculation below
- // is left as an exercise to the reader :-)
- pos.v = postZoomPos.y() + m_windowRect.y() - 22;
- return pos;
-}
-#endif
-
-#ifndef NP_NO_CARBON
-bool PluginView::dispatchNPEvent(NPEvent& event)
-{
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
-
- bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
-
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- return accepted;
-}
-#endif
-
-// ------------------- Miscellaneous ------------------
-
-NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
-{
- String filename(buf, len);
-
- if (filename.startsWith("file:///"))
- filename = filename.substring(8);
-
- if (!fileExists(filename))
- return NPERR_FILE_NOT_FOUND;
-
- FILE* fileHandle = fopen((filename.utf8()).data(), "r");
-
- if (fileHandle == 0)
- return NPERR_FILE_NOT_FOUND;
-
- int bytesRead = fread(buffer.data(), 1, 0, fileHandle);
-
- fclose(fileHandle);
-
- if (bytesRead <= 0)
- return NPERR_FILE_NOT_FOUND;
-
- return NPERR_NO_ERROR;
-}
-
-void PluginView::halt()
-{
-}
-
-void PluginView::restart()
-{
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/npapi.cpp b/WebCore/plugins/npapi.cpp
deleted file mode 100644
index bc64901..0000000
--- a/WebCore/plugins/npapi.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-
-#include "Page.h"
-#include "PluginMainThreadScheduler.h"
-#include "PluginView.h"
-#include "npruntime_internal.h"
-
-using namespace WebCore;
-
-// The plugin view is always the ndata of the instance,. Sometimes, plug-ins will call an instance-specific function
-// with a NULL instance. To workaround this, call the last plug-in view that made a call to a plug-in.
-// Currently, the current plug-in view is only set before NPP_New in PluginView::start.
-// This specifically works around Flash and Shockwave. When we call NPP_New, they call NPN_Useragent with a NULL instance.
-static PluginView* pluginViewForInstance(NPP instance)
-{
- if (instance && instance->ndata)
- return static_cast<PluginView*>(instance->ndata);
- return PluginView::currentPluginView();
-}
-
-void* NPN_MemAlloc(uint32_t size)
-{
- return malloc(size);
-}
-
-void NPN_MemFree(void* ptr)
-{
- free(ptr);
-}
-
-uint32_t NPN_MemFlush(uint32_t size)
-{
- // Do nothing
- return 0;
-}
-
-void NPN_ReloadPlugins(NPBool reloadPages)
-{
- Page::refreshPlugins(reloadPages);
-}
-
-NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList)
-{
- return NPERR_STREAM_NOT_SEEKABLE;
-}
-
-NPError NPN_GetURLNotify(NPP instance, const char* url, const char* target, void* notifyData)
-{
- return pluginViewForInstance(instance)->getURLNotify(url, target, notifyData);
-}
-
-NPError NPN_GetURL(NPP instance, const char* url, const char* target)
-{
- return pluginViewForInstance(instance)->getURL(url, target);
-}
-
-NPError NPN_PostURLNotify(NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData)
-{
- return pluginViewForInstance(instance)->postURLNotify(url, target, len, buf, file, notifyData);
-}
-
-NPError NPN_PostURL(NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file)
-{
- return pluginViewForInstance(instance)->postURL(url, target, len, buf, file);
-}
-
-NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* target, NPStream** stream)
-{
- return pluginViewForInstance(instance)->newStream(type, target, stream);
-}
-
-int32_t NPN_Write(NPP instance, NPStream* stream, int32_t len, void* buffer)
-{
- return pluginViewForInstance(instance)->write(stream, len, buffer);
-}
-
-NPError NPN_DestroyStream(NPP instance, NPStream* stream, NPReason reason)
-{
- return pluginViewForInstance(instance)->destroyStream(stream, reason);
-}
-
-const char* NPN_UserAgent(NPP instance)
-{
- PluginView* view = pluginViewForInstance(instance);
-
- if (!view)
- return PluginView::userAgentStatic();
-
- return view->userAgent();
-}
-
-void NPN_Status(NPP instance, const char* message)
-{
- pluginViewForInstance(instance)->status(message);
-}
-
-void NPN_InvalidateRect(NPP instance, NPRect* invalidRect)
-{
- pluginViewForInstance(instance)->invalidateRect(invalidRect);
-}
-
-void NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion)
-{
- pluginViewForInstance(instance)->invalidateRegion(invalidRegion);
-}
-
-void NPN_ForceRedraw(NPP instance)
-{
- pluginViewForInstance(instance)->forceRedraw();
-}
-
-NPError NPN_GetValue(NPP instance, NPNVariable variable, void* value)
-{
- PluginView* view = pluginViewForInstance(instance);
-
- if (!view)
- return PluginView::getValueStatic(variable, value);
-
- return pluginViewForInstance(instance)->getValue(variable, value);
-}
-
-NPError NPN_SetValue(NPP instance, NPPVariable variable, void* value)
-{
- return pluginViewForInstance(instance)->setValue(variable, value);
-}
-
-void* NPN_GetJavaEnv()
-{
- // Unsupported
- return 0;
-}
-
-void* NPN_GetJavaPeer(NPP instance)
-{
- // Unsupported
- return 0;
-}
-
-void NPN_PushPopupsEnabledState(NPP instance, NPBool enabled)
-{
- pluginViewForInstance(instance)->pushPopupsEnabledState(enabled);
-}
-
-void NPN_PopPopupsEnabledState(NPP instance)
-{
- pluginViewForInstance(instance)->popPopupsEnabledState();
-}
-
-void NPN_PluginThreadAsyncCall(NPP instance, void (*func) (void *), void *userData)
-{
- PluginMainThreadScheduler::scheduler().scheduleCall(instance, func, userData);
-}
-
-NPError NPN_GetValueForURL(NPP instance, NPNURLVariable variable, const char* url, char** value, uint32_t* len)
-{
- return pluginViewForInstance(instance)->getValueForURL(variable, url, value, len);
-}
-
-NPError NPN_SetValueForURL(NPP instance, NPNURLVariable variable, const char* url, const char* value, uint32_t len)
-{
- return pluginViewForInstance(instance)->setValueForURL(variable, url, value, len);
-}
-
-NPError NPN_GetAuthenticationInfo(NPP instance, const char* protocol, const char* host, int32_t port, const char* scheme, const char* realm, char** username, uint32_t* ulen, char** password, uint32_t* plen)
-{
- return pluginViewForInstance(instance)->getAuthenticationInfo(protocol, host, port, scheme, realm, username, ulen, password, plen);
-}
-
-#ifdef PLUGIN_SCHEDULE_TIMER
-uint32_t NPN_ScheduleTimer(NPP instance, uint32_t interval, NPBool repeat,
- void (*timerFunc)(NPP npp, uint32_t timerID))
-{
- return pluginViewForInstance(instance)->scheduleTimer(instance, interval,
- repeat != 0, timerFunc);
-}
-
-void NPN_UnscheduleTimer(NPP instance, uint32_t timerID)
-{
- pluginViewForInstance(instance)->unscheduleTimer(instance, timerID);
-}
-#endif
diff --git a/WebCore/plugins/npfunctions.h b/WebCore/plugins/npfunctions.h
deleted file mode 100644
index 675ccb9..0000000
--- a/WebCore/plugins/npfunctions.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2007 Apple Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 NPFUNCTIONS_H
-#define NPFUNCTIONS_H
-
-
-#include "npruntime.h"
-#include "npapi.h"
-#if defined(ANDROID_PLUGINS)
-#include "nativehelper/jni.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(XP_WIN)
-#define EXPORTED_CALLBACK(_type, _name) _type (__stdcall * _name)
-#else
-#define EXPORTED_CALLBACK(_type, _name) _type (* _name)
-#endif
-
-typedef NPError (*NPN_GetURLNotifyProcPtr)(NPP instance, const char* URL, const char* window, void* notifyData);
-typedef NPError (*NPN_PostURLNotifyProcPtr)(NPP instance, const char* URL, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData);
-typedef NPError (*NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeList);
-typedef NPError (*NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream);
-typedef int32_t (*NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32_t len, void* buffer);
-typedef NPError (*NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason);
-typedef void (*NPN_StatusProcPtr)(NPP instance, const char* message);
-typedef const char*(*NPN_UserAgentProcPtr)(NPP instance);
-typedef void* (*NPN_MemAllocProcPtr)(uint32_t size);
-typedef void (*NPN_MemFreeProcPtr)(void* ptr);
-typedef uint32_t (*NPN_MemFlushProcPtr)(uint32_t size);
-typedef void (*NPN_ReloadPluginsProcPtr)(NPBool reloadPages);
-typedef NPError (*NPN_GetValueProcPtr)(NPP instance, NPNVariable variable, void *ret_value);
-typedef NPError (*NPN_SetValueProcPtr)(NPP instance, NPPVariable variable, void *value);
-typedef void (*NPN_InvalidateRectProcPtr)(NPP instance, NPRect *rect);
-typedef void (*NPN_InvalidateRegionProcPtr)(NPP instance, NPRegion region);
-typedef void (*NPN_ForceRedrawProcPtr)(NPP instance);
-typedef NPError (*NPN_GetURLProcPtr)(NPP instance, const char* URL, const char* window);
-typedef NPError (*NPN_PostURLProcPtr)(NPP instance, const char* URL, const char* window, uint32_t len, const char* buf, NPBool file);
-typedef void* (*NPN_GetJavaEnvProcPtr)(void);
-typedef void* (*NPN_GetJavaPeerProcPtr)(NPP instance);
-typedef void (*NPN_PushPopupsEnabledStateProcPtr)(NPP instance, NPBool enabled);
-typedef void (*NPN_PopPopupsEnabledStateProcPtr)(NPP instance);
-typedef void (*NPN_PluginThreadAsyncCallProcPtr)(NPP npp, void (*func)(void *), void *userData);
-typedef NPError (*NPN_GetValueForURLProcPtr)(NPP npp, NPNURLVariable variable, const char* url, char** value, uint32_t* len);
-typedef NPError (*NPN_SetValueForURLProcPtr)(NPP npp, NPNURLVariable variable, const char* url, const char* value, uint32_t len);
-typedef NPError (*NPN_GetAuthenticationInfoProcPtr)(NPP npp, const char* protocol, const char* host, int32_t port, const char* scheme, const char *realm, char** username, uint32_t* ulen, char** password, uint32_t* plen);
-
-typedef uint32_t (*NPN_ScheduleTimerProcPtr)(NPP npp, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID));
-typedef void (*NPN_UnscheduleTimerProcPtr)(NPP npp, uint32_t timerID);
-typedef NPError (*NPN_PopUpContextMenuProcPtr)(NPP instance, NPMenu* menu);
-typedef NPBool (*NPN_ConvertPointProcPtr)(NPP npp, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
-
-typedef void (*NPN_ReleaseVariantValueProcPtr) (NPVariant *variant);
-
-typedef NPIdentifier (*NPN_GetStringIdentifierProcPtr) (const NPUTF8 *name);
-typedef void (*NPN_GetStringIdentifiersProcPtr) (const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers);
-typedef NPIdentifier (*NPN_GetIntIdentifierProcPtr) (int32_t intid);
-typedef int32_t (*NPN_IntFromIdentifierProcPtr) (NPIdentifier identifier);
-typedef bool (*NPN_IdentifierIsStringProcPtr) (NPIdentifier identifier);
-typedef NPUTF8 *(*NPN_UTF8FromIdentifierProcPtr) (NPIdentifier identifier);
-
-typedef NPObject* (*NPN_CreateObjectProcPtr) (NPP, NPClass *aClass);
-typedef NPObject* (*NPN_RetainObjectProcPtr) (NPObject *obj);
-typedef void (*NPN_ReleaseObjectProcPtr) (NPObject *obj);
-typedef bool (*NPN_InvokeProcPtr) (NPP npp, NPObject *obj, NPIdentifier methodName, const NPVariant *args, unsigned argCount, NPVariant *result);
-typedef bool (*NPN_InvokeDefaultProcPtr) (NPP npp, NPObject *obj, const NPVariant *args, unsigned argCount, NPVariant *result);
-typedef bool (*NPN_EvaluateProcPtr) (NPP npp, NPObject *obj, NPString *script, NPVariant *result);
-typedef bool (*NPN_GetPropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result);
-typedef bool (*NPN_SetPropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value);
-typedef bool (*NPN_HasPropertyProcPtr) (NPP, NPObject *npobj, NPIdentifier propertyName);
-typedef bool (*NPN_HasMethodProcPtr) (NPP npp, NPObject *npobj, NPIdentifier methodName);
-typedef bool (*NPN_RemovePropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier propertyName);
-typedef void (*NPN_SetExceptionProcPtr) (NPObject *obj, const NPUTF8 *message);
-typedef bool (*NPN_EnumerateProcPtr) (NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t *count);
-typedef bool (*NPN_ConstructProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
-
-typedef NPError (*NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
-typedef NPError (*NPP_DestroyProcPtr)(NPP instance, NPSavedData** save);
-typedef NPError (*NPP_SetWindowProcPtr)(NPP instance, NPWindow* window);
-typedef NPError (*NPP_NewStreamProcPtr)(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype);
-typedef NPError (*NPP_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason);
-typedef void (*NPP_StreamAsFileProcPtr)(NPP instance, NPStream* stream, const char* fname);
-typedef int32_t (*NPP_WriteReadyProcPtr)(NPP instance, NPStream* stream);
-typedef int32_t (*NPP_WriteProcPtr)(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer);
-typedef void (*NPP_PrintProcPtr)(NPP instance, NPPrint* platformPrint);
-typedef int16_t (*NPP_HandleEventProcPtr)(NPP instance, void* event);
-typedef void (*NPP_URLNotifyProcPtr)(NPP instance, const char* URL, NPReason reason, void* notifyData);
-typedef NPError (*NPP_GetValueProcPtr)(NPP instance, NPPVariable variable, void *ret_value);
-typedef NPError (*NPP_SetValueProcPtr)(NPP instance, NPNVariable variable, void *value);
-
-typedef void *(*NPP_GetJavaClassProcPtr)(void);
-typedef void* JRIGlobalRef; //not using this right now
-
-typedef struct _NPNetscapeFuncs {
- uint16_t size;
- uint16_t version;
-
- NPN_GetURLProcPtr geturl;
- NPN_PostURLProcPtr posturl;
- NPN_RequestReadProcPtr requestread;
- NPN_NewStreamProcPtr newstream;
- NPN_WriteProcPtr write;
- NPN_DestroyStreamProcPtr destroystream;
- NPN_StatusProcPtr status;
- NPN_UserAgentProcPtr uagent;
- NPN_MemAllocProcPtr memalloc;
- NPN_MemFreeProcPtr memfree;
- NPN_MemFlushProcPtr memflush;
- NPN_ReloadPluginsProcPtr reloadplugins;
- NPN_GetJavaEnvProcPtr getJavaEnv;
- NPN_GetJavaPeerProcPtr getJavaPeer;
- NPN_GetURLNotifyProcPtr geturlnotify;
- NPN_PostURLNotifyProcPtr posturlnotify;
- NPN_GetValueProcPtr getvalue;
- NPN_SetValueProcPtr setvalue;
- NPN_InvalidateRectProcPtr invalidaterect;
- NPN_InvalidateRegionProcPtr invalidateregion;
- NPN_ForceRedrawProcPtr forceredraw;
-
- NPN_GetStringIdentifierProcPtr getstringidentifier;
- NPN_GetStringIdentifiersProcPtr getstringidentifiers;
- NPN_GetIntIdentifierProcPtr getintidentifier;
- NPN_IdentifierIsStringProcPtr identifierisstring;
- NPN_UTF8FromIdentifierProcPtr utf8fromidentifier;
- NPN_IntFromIdentifierProcPtr intfromidentifier;
- NPN_CreateObjectProcPtr createobject;
- NPN_RetainObjectProcPtr retainobject;
- NPN_ReleaseObjectProcPtr releaseobject;
- NPN_InvokeProcPtr invoke;
- NPN_InvokeDefaultProcPtr invokeDefault;
- NPN_EvaluateProcPtr evaluate;
- NPN_GetPropertyProcPtr getproperty;
- NPN_SetPropertyProcPtr setproperty;
- NPN_RemovePropertyProcPtr removeproperty;
- NPN_HasPropertyProcPtr hasproperty;
- NPN_HasMethodProcPtr hasmethod;
- NPN_ReleaseVariantValueProcPtr releasevariantvalue;
- NPN_SetExceptionProcPtr setexception;
- NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate;
- NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate;
- NPN_EnumerateProcPtr enumerate;
- NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall;
- NPN_ConstructProcPtr construct;
- NPN_GetValueForURLProcPtr getvalueforurl;
- NPN_SetValueForURLProcPtr setvalueforurl;
- NPN_GetAuthenticationInfoProcPtr getauthenticationinfo;
- NPN_ScheduleTimerProcPtr scheduletimer;
- NPN_UnscheduleTimerProcPtr unscheduletimer;
- NPN_PopUpContextMenuProcPtr popupcontextmenu;
- NPN_ConvertPointProcPtr convertpoint;
-} NPNetscapeFuncs;
-
-typedef struct _NPPluginFuncs {
- uint16_t size;
- uint16_t version;
- NPP_NewProcPtr newp;
- NPP_DestroyProcPtr destroy;
- NPP_SetWindowProcPtr setwindow;
- NPP_NewStreamProcPtr newstream;
- NPP_DestroyStreamProcPtr destroystream;
- NPP_StreamAsFileProcPtr asfile;
- NPP_WriteReadyProcPtr writeready;
- NPP_WriteProcPtr write;
- NPP_PrintProcPtr print;
- NPP_HandleEventProcPtr event;
- NPP_URLNotifyProcPtr urlnotify;
- JRIGlobalRef javaClass;
- NPP_GetValueProcPtr getvalue;
- NPP_SetValueProcPtr setvalue;
-} NPPluginFuncs;
-
-typedef EXPORTED_CALLBACK(NPError, NP_GetEntryPointsFuncPtr)(NPPluginFuncs*);
-typedef EXPORTED_CALLBACK(void, NPP_ShutdownProcPtr)(void);
-
-#if defined(XP_MACOSX)
-typedef void (*BP_CreatePluginMIMETypesPreferencesFuncPtr)(void);
-typedef NPError (*MainFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*, NPP_ShutdownProcPtr*);
-#endif
-
-#if defined(XP_UNIX)
-typedef EXPORTED_CALLBACK(NPError, NP_InitializeFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*);
-typedef EXPORTED_CALLBACK(char*, NP_GetMIMEDescriptionFuncPtr)(void);
-#elif defined(ANDROID_PLUGINS)
-typedef EXPORTED_CALLBACK(NPError, NP_InitializeFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*, JNIEnv *java_environment);
-typedef EXPORTED_CALLBACK(char*, NP_GetMIMEDescriptionFuncPtr)(void);
-#else
-typedef EXPORTED_CALLBACK(NPError, NP_InitializeFuncPtr)(NPNetscapeFuncs*);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/WebCore/plugins/qt/PluginContainerQt.cpp b/WebCore/plugins/qt/PluginContainerQt.cpp
deleted file mode 100644
index 8486180..0000000
--- a/WebCore/plugins/qt/PluginContainerQt.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "config.h"
-#include "PluginContainerQt.h"
-
-#include "FocusController.h"
-#include "Frame.h"
-#include "FrameView.h"
-#include "Page.h"
-#include "PlatformKeyboardEvent.h"
-#include "PlatformWheelEvent.h"
-#include "PluginView.h"
-#include <QApplication>
-#include <QX11Info>
-
-using namespace WebCore;
-
-PluginClientWrapper::PluginClientWrapper(QWidget* parent, WId client)
- : QWidget(0, Qt::Popup)
-{
- // create a QWidget that adopts the plugin window id, do not give it
- // a parent so that we don't end up handling events supposed to be
- // handled by the QX11EmbedContainer.
-
- // without the parent this will be considered a toplevel widget,
- // and thus make Qt not quit the event loop after the last window
- // has been closed. In order to work around this, we set the window
- // type to Qt::Popup.
-
- create(client, false, true);
- m_parent = parent;
-}
-
-PluginClientWrapper::~PluginClientWrapper()
-{
- destroy(false, false);
-}
-
-bool PluginClientWrapper::x11Event(XEvent* event)
-{
- // modify the event window id and insert it into the Qt event system.
- event->xany.window = m_parent->effectiveWinId();
- static_cast<QApplication*>(QApplication::instance())->x11ProcessEvent(event);
- return true;
-}
-
-PluginContainerQt::PluginContainerQt(PluginView* view, QWidget* parent)
- : QX11EmbedContainer(parent)
- , m_pluginView(view)
- , m_clientWrapper(0)
-{
- connect(this, SIGNAL(clientClosed()), this, SLOT(on_clientClosed()));
- connect(this, SIGNAL(clientIsEmbedded()), this, SLOT(on_clientIsEmbedded()));
-}
-
-PluginContainerQt::~PluginContainerQt()
-{
- delete m_clientWrapper;
- m_pluginView->setPlatformPluginWidget(0);
-}
-
-void PluginContainerQt::on_clientClosed()
-{
- delete m_clientWrapper;
- m_clientWrapper = 0;
-}
-
-void PluginContainerQt::on_clientIsEmbedded()
-{
- delete m_clientWrapper;
- m_clientWrapper = 0;
-
- // Only create a QWidget wrapper for the plugin in the case it isn't in the
- // Qt window mapper, and thus receiving events from the Qt event system.
- // This way the PluginClientWrapper receives the scroll events and passes
- // them to the parent. NOTICE: Native Qt based plugins running in process,
- // will already be in the window mapper, and thus creating a wrapper, stops
- // them from getting events from Qt, as they are redirected to the wrapper.
- if (!QWidget::find(clientWinId()))
- m_clientWrapper = new PluginClientWrapper(this, clientWinId());
-}
-
-void PluginContainerQt::redirectWheelEventsToParent(bool enable)
-{
- // steal wheel events from the plugin as we want to handle it. When doing this
- // all button 4, 5, 6, and 7, ButtonPress and ButtonRelease events are passed
- // to the x11Event handler of the PluginClientWrapper, which then changes the
- // window id of the event to the parent of PluginContainer and puts the event
- // back into the Qt event loop, so that we will actually scroll the parent
- // frame.
- for (int buttonNo = 4; buttonNo < 8; buttonNo++) {
- if (enable)
- XGrabButton(x11Info().display(), buttonNo, AnyModifier, clientWinId(),
- false, ButtonPressMask, GrabModeAsync, GrabModeAsync, 0L, 0L);
- else
- XUngrabButton(x11Info().display(), buttonNo, AnyModifier, clientWinId());
- }
-}
-
-bool PluginContainerQt::x11Event(XEvent* event)
-{
- switch (event->type) {
- case EnterNotify:
- // if the plugin window doesn't have focus we do not want to send wheel
- // events to it, but to the parent frame, so let's redirect here.
- redirectWheelEventsToParent(!hasFocus());
- break;
- case LeaveNotify:
- // it is always safe to ungrab wheel events when the mouse leaves the
- // plugin window.
- redirectWheelEventsToParent(false);
- break;
- }
-
- return QX11EmbedContainer::x11Event(event);
-}
-
-void PluginContainerQt::focusInEvent(QFocusEvent* event)
-{
- // we got focus, stop redirecting the wheel events
- redirectWheelEventsToParent(false);
-
- if (Page* page = m_pluginView->parentFrame()->page())
- page->focusController()->setActive(true);
-
- m_pluginView->focusPluginElement();
-}
-
-void PluginContainerQt::focusOutEvent(QFocusEvent*)
-{
- if (Page* page = m_pluginView->parentFrame()->page())
- page->focusController()->setActive(false);
-}
diff --git a/WebCore/plugins/qt/PluginContainerQt.h b/WebCore/plugins/qt/PluginContainerQt.h
deleted file mode 100644
index 3a2896d..0000000
--- a/WebCore/plugins/qt/PluginContainerQt.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#ifndef PluginContainerQt_h
-#define PluginContainerQt_h
-
-#include <QX11EmbedContainer>
-
-namespace WebCore {
-
- class PluginView;
-
- class PluginContainerQt : public QX11EmbedContainer
- {
- Q_OBJECT
- public:
- PluginContainerQt(PluginView*, QWidget* parent);
- ~PluginContainerQt();
-
- void redirectWheelEventsToParent(bool enable = true);
-
- protected:
- virtual bool x11Event(XEvent*);
- virtual void focusInEvent(QFocusEvent*);
- virtual void focusOutEvent(QFocusEvent*);
-
- public slots:
- void on_clientClosed();
- void on_clientIsEmbedded();
-
- private:
- PluginView* m_pluginView;
- QWidget* m_clientWrapper;
- };
-
- class PluginClientWrapper : public QWidget
- {
- public:
- PluginClientWrapper(QWidget* parent, WId client);
- ~PluginClientWrapper();
- bool x11Event(XEvent*);
-
- private:
- QWidget* m_parent;
- };
-}
-
-#endif // PluginContainerQt_h
diff --git a/WebCore/plugins/qt/PluginPackageQt.cpp b/WebCore/plugins/qt/PluginPackageQt.cpp
deleted file mode 100644
index ce07faf..0000000
--- a/WebCore/plugins/qt/PluginPackageQt.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginPackage.h"
-
-#include "MIMETypeRegistry.h"
-#include "npruntime_impl.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include <wtf/text/CString.h>
-
-namespace WebCore {
-
-bool PluginPackage::fetchInfo()
-{
- if (!load())
- return false;
-
- NPP_GetValueProcPtr gv = (NPP_GetValueProcPtr)m_module->resolve("NP_GetValue");
- typedef char *(*NPP_GetMIMEDescriptionProcPtr)();
- NPP_GetMIMEDescriptionProcPtr gm =
- (NPP_GetMIMEDescriptionProcPtr)m_module->resolve("NP_GetMIMEDescription");
- if (!gm || !gv)
- return false;
-
- char *buf = 0;
- NPError err = gv(0, NPPVpluginNameString, (void*) &buf);
- if (err != NPERR_NO_ERROR)
- return false;
-
- m_name = buf;
- err = gv(0, NPPVpluginDescriptionString, (void*) &buf);
- if (err != NPERR_NO_ERROR)
- return false;
-
- m_description = buf;
- determineModuleVersionFromDescription();
-
- String mimeDescription = gm();
- setMIMEDescription(mimeDescription);
- m_infoIsFromCache = false;
-
- return true;
-}
-
-void PluginPackage::setMIMEDescription(const String& mimeDescription)
-{
- m_fullMIMEDescription = mimeDescription.lower();
-
- Vector<String> types;
- mimeDescription.lower().split(UChar(';'), false, types);
- for (unsigned i = 0; i < types.size(); ++i) {
- Vector<String> mime;
- types[i].split(UChar(':'), true, mime);
- if (mime.size() > 0) {
- Vector<String> exts;
- if (mime.size() > 1)
- mime[1].split(UChar(','), false, exts);
- determineQuirks(mime[0]);
- m_mimeToExtensions.add(mime[0], exts);
- if (mime.size() > 2)
- m_mimeToDescriptions.add(mime[0], mime[2]);
- }
- }
-}
-
-static NPError staticPluginQuirkRequiresGtkToolKit_NPN_GetValue(NPP instance, NPNVariable variable, void* value)
-{
- if (variable == NPNVToolkit) {
- *static_cast<uint32_t*>(value) = 2;
- return NPERR_NO_ERROR;
- }
-
- return NPN_GetValue(instance, variable, value);
-}
-
-static void initializeGtk(QLibrary* module = 0)
-{
- // Ensures missing Gtk initialization in some versions of Adobe's flash player
- // plugin do not cause crashes. See BR# 40567, 44324, and 44405 for details.
- if (module) {
- typedef void *(*gtk_init_ptr)(int*, char***);
- gtk_init_ptr gtkInit = (gtk_init_ptr)module->resolve("gtk_init");
- if (gtkInit) {
- // Prevent gtk_init() from replacing the X error handlers, since the Gtk
- // handlers abort when they receive an X error, thus killing the viewer.
-#ifdef Q_WS_X11
- int (*old_error_handler)(Display*, XErrorEvent*) = XSetErrorHandler(0);
- int (*old_io_error_handler)(Display*) = XSetIOErrorHandler(0);
-#endif
- gtkInit(0, 0);
-#ifdef Q_WS_X11
- XSetErrorHandler(old_error_handler);
- XSetIOErrorHandler(old_io_error_handler);
-#endif
- return;
- }
- }
-
- QLibrary library("libgtk-x11-2.0.so.0");
- if (library.load()) {
- typedef void *(*gtk_init_check_ptr)(int*, char***);
- gtk_init_check_ptr gtkInitCheck = (gtk_init_check_ptr)library.resolve("gtk_init_check");
- // NOTE: We're using gtk_init_check() since gtk_init() calls exit() on failure.
- if (gtkInitCheck)
- (void) gtkInitCheck(0, 0);
- }
-}
-
-bool PluginPackage::load()
-{
- if (m_isLoaded) {
- m_loadCount++;
- return true;
- }
-
- m_module = new QLibrary((QString)m_path);
- m_module->setLoadHints(QLibrary::ResolveAllSymbolsHint);
- if (!m_module->load()) {
- LOG(Plugins, "%s not loaded (%s)", m_path.utf8().data(),
- m_module->errorString().toLatin1().constData());
- return false;
- }
-
- m_isLoaded = true;
-
- NP_InitializeFuncPtr NP_Initialize;
- NPError npErr;
-
- NP_Initialize = (NP_InitializeFuncPtr)m_module->resolve("NP_Initialize");
- m_NPP_Shutdown = (NPP_ShutdownProcPtr)m_module->resolve("NP_Shutdown");
-
- if (!NP_Initialize || !m_NPP_Shutdown)
- goto abort;
-
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
-
- initializeBrowserFuncs();
-
- if (m_path.contains("npwrapper.")) {
- // nspluginwrapper relies on the toolkit value to know if glib is available
- // It does so in NP_Initialize with a null instance, therefore it is done this way:
- m_browserFuncs.getvalue = staticPluginQuirkRequiresGtkToolKit_NPN_GetValue;
- // Workaround Adobe's failure to properly initialize Gtk in some versions
- // of their flash player plugin.
- initializeGtk();
- } else if (m_path.contains("flashplayer")) {
- // Workaround Adobe's failure to properly initialize Gtk in some versions
- // of their flash player plugin.
- initializeGtk(m_module);
- }
-
-#if defined(XP_UNIX)
- npErr = NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
-#else
- npErr = NP_Initialize(&m_browserFuncs);
-#endif
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- m_loadCount++;
- return true;
-
-abort:
- unloadWithoutShutdown();
- return false;
-}
-
-uint16_t PluginPackage::NPVersion() const
-{
- return NP_VERSION_MINOR;
-}
-
-}
diff --git a/WebCore/plugins/qt/PluginViewQt.cpp b/WebCore/plugins/qt/PluginViewQt.cpp
deleted file mode 100644
index fdbe552..0000000
--- a/WebCore/plugins/qt/PluginViewQt.cpp
+++ /dev/null
@@ -1,1011 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
- *
- * 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginView.h"
-
-#if USE(JSC)
-#include "Bridge.h"
-#endif
-#include "Chrome.h"
-#include "ChromeClient.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Element.h"
-#include "FloatPoint.h"
-#include "FocusController.h"
-#include "Frame.h"
-#include "FrameLoadRequest.h"
-#include "FrameLoader.h"
-#include "FrameTree.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "HTMLNames.h"
-#include "HTMLPlugInElement.h"
-#include "HostWindow.h"
-#include "Image.h"
-#if USE(JSC)
-#include "JSDOMBinding.h"
-#endif
-#include "KeyboardEvent.h"
-#include "MouseEvent.h"
-#include "NotImplemented.h"
-#include "Page.h"
-#include "PlatformMouseEvent.h"
-#include "PlatformKeyboardEvent.h"
-#include "PluginContainerQt.h"
-#include "PluginDebug.h"
-#include "PluginPackage.h"
-#include "PluginMainThreadScheduler.h"
-#include "QWebPageClient.h"
-#include "RenderLayer.h"
-#include "ScriptController.h"
-#include "Settings.h"
-#include "npruntime_impl.h"
-#include "qwebpage_p.h"
-#include "runtime_root.h"
-
-#include <QApplication>
-#include <QDesktopWidget>
-#include <QGraphicsWidget>
-#include <QKeyEvent>
-#include <QPainter>
-#include <QStyleOptionGraphicsItem>
-#include <QWidget>
-#include <QX11Info>
-#include <X11/X.h>
-#ifndef QT_NO_XRENDER
-#define Bool int
-#define Status int
-#include <X11/extensions/Xrender.h>
-#endif
-#include <runtime/JSLock.h>
-#include <runtime/JSValue.h>
-
-using JSC::ExecState;
-using JSC::Interpreter;
-using JSC::JSLock;
-using JSC::JSObject;
-using JSC::UString;
-
-using std::min;
-
-using namespace WTF;
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-#if USE(ACCELERATED_COMPOSITING)
-// Qt's GraphicsLayer (GraphicsLayerQt) requires layers to be QGraphicsWidgets
-class PluginGraphicsLayerQt : public QGraphicsWidget {
-public:
- PluginGraphicsLayerQt(PluginView* view) : m_view(view) { }
- ~PluginGraphicsLayerQt() { }
-
- void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0)
- {
- Q_UNUSED(widget);
- m_view->paintUsingXPixmap(painter, option->exposedRect.toRect());
- }
-
-private:
- PluginView* m_view;
-};
-#endif
-
-void PluginView::updatePluginWidget()
-{
- if (!parent())
- return;
-
- ASSERT(parent()->isFrameView());
- FrameView* frameView = static_cast<FrameView*>(parent());
-
- IntRect oldWindowRect = m_windowRect;
- IntRect oldClipRect = m_clipRect;
-
- m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
- m_clipRect = windowClipRect();
- m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
-
- if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect)
- return;
-
- if (!m_isWindowed && m_windowRect.size() != oldWindowRect.size()) {
-#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- // On Maemo5, Flash always renders to 16-bit buffer
- if (m_renderToImage)
- m_image = QImage(m_windowRect.width(), m_windowRect.height(), QImage::Format_RGB16);
- else
-#endif
- {
- if (m_drawable)
- XFreePixmap(QX11Info::display(), m_drawable);
-
- m_drawable = XCreatePixmap(QX11Info::display(), QX11Info::appRootWindow(), m_windowRect.width(), m_windowRect.height(),
- ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth);
- QApplication::syncX(); // make sure that the server knows about the Drawable
- }
- }
-
- // do not call setNPWindowIfNeeded immediately, will be called on paint()
- m_hasPendingGeometryChange = true;
-
- // (i) in order to move/resize the plugin window at the same time as the
- // rest of frame during e.g. scrolling, we set the window geometry
- // in the paint() function, but as paint() isn't called when the
- // plugin window is outside the frame which can be caused by a
- // scroll, we need to move/resize immediately.
- // (ii) if we are running layout tests from DRT, paint() won't ever get called
- // so we need to call setNPWindowIfNeeded() if window geometry has changed
- if (!m_windowRect.intersects(frameView->frameRect())
- || (QWebPagePrivate::drtRun && platformPluginWidget() && (m_windowRect != oldWindowRect || m_clipRect != oldClipRect)))
- setNPWindowIfNeeded();
-
- if (!m_platformLayer) {
- // Make sure we get repainted afterwards. This is necessary for downward
- // scrolling to move the plugin widget properly.
- invalidate();
- }
-}
-
-void PluginView::setFocus(bool focused)
-{
- if (platformPluginWidget()) {
- if (focused)
- platformPluginWidget()->setFocus(Qt::OtherFocusReason);
- } else {
- Widget::setFocus(focused);
- }
-}
-
-void PluginView::show()
-{
- Q_ASSERT(platformPluginWidget() == platformWidget());
- Widget::show();
-}
-
-void PluginView::hide()
-{
- Q_ASSERT(platformPluginWidget() == platformWidget());
- Widget::hide();
-}
-
-#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
-void PluginView::paintUsingImageSurfaceExtension(QPainter* painter, const IntRect& exposedRect)
-{
- NPImageExpose imageExpose;
- QPoint offset;
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- const bool surfaceHasUntransformedContents = client && qobject_cast<QWidget*>(client->pluginParent());
-
- QPaintDevice* surface = QPainter::redirected(painter->device(), &offset);
-
- // If the surface is a QImage, we can render directly into it
- if (surfaceHasUntransformedContents && surface && surface->devType() == QInternal::Image) {
- QImage* image = static_cast<QImage*>(surface);
- offset = -offset; // negating the offset gives us the offset of the view within the surface
- imageExpose.data = reinterpret_cast<char*>(image->bits());
- imageExpose.dataSize.width = image->width();
- imageExpose.dataSize.height = image->height();
- imageExpose.stride = image->bytesPerLine();
- imageExpose.depth = image->depth(); // this is guaranteed to be 16 on Maemo5
- imageExpose.translateX = offset.x() + m_windowRect.x();
- imageExpose.translateY = offset.y() + m_windowRect.y();
- imageExpose.scaleX = 1;
- imageExpose.scaleY = 1;
- } else {
- if (m_isTransparent) {
- // On Maemo5, Flash expects the buffer to contain the contents that are below it.
- // We don't support transparency for non-raster graphicssystem, so clean the image
- // before giving to Flash.
- QPainter imagePainter(&m_image);
- imagePainter.fillRect(exposedRect, Qt::white);
- }
-
- imageExpose.data = reinterpret_cast<char*>(m_image.bits());
- imageExpose.dataSize.width = m_image.width();
- imageExpose.dataSize.height = m_image.height();
- imageExpose.stride = m_image.bytesPerLine();
- imageExpose.depth = m_image.depth();
- imageExpose.translateX = 0;
- imageExpose.translateY = 0;
- imageExpose.scaleX = 1;
- imageExpose.scaleY = 1;
- }
- imageExpose.x = exposedRect.x();
- imageExpose.y = exposedRect.y();
- imageExpose.width = exposedRect.width();
- imageExpose.height = exposedRect.height();
-
- XEvent xevent;
- memset(&xevent, 0, sizeof(XEvent));
- XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
- exposeEvent.type = GraphicsExpose;
- exposeEvent.display = 0;
- exposeEvent.drawable = reinterpret_cast<XID>(&imageExpose);
- exposeEvent.x = exposedRect.x();
- exposeEvent.y = exposedRect.y();
- exposeEvent.width = exposedRect.width();
- exposeEvent.height = exposedRect.height();
-
- dispatchNPEvent(xevent);
-
- if (!surfaceHasUntransformedContents || !surface || surface->devType() != QInternal::Image)
- painter->drawImage(QPoint(frameRect().x() + exposedRect.x(), frameRect().y() + exposedRect.y()), m_image, exposedRect);
-}
-#endif
-
-void PluginView::paintUsingXPixmap(QPainter* painter, const QRect &exposedRect)
-{
- QPixmap qtDrawable = QPixmap::fromX11Pixmap(m_drawable, QPixmap::ExplicitlyShared);
- const int drawableDepth = ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth;
- ASSERT(drawableDepth == qtDrawable.depth());
- const bool syncX = m_pluginDisplay && m_pluginDisplay != QX11Info::display();
-
- // When printing, Qt uses a QPicture to capture the output in preview mode. The
- // QPicture holds a reference to the X Pixmap. As a result, the print preview would
- // update itself when the X Pixmap changes. To prevent this, we create a copy.
- if (m_element->document()->printing())
- qtDrawable = qtDrawable.copy();
-
- if (m_isTransparent && drawableDepth != 32) {
- // Attempt content propagation for drawable with no alpha by copying over from the backing store
- QPoint offset;
- QPaintDevice* backingStoreDevice = QPainter::redirected(painter->device(), &offset);
- offset = -offset; // negating the offset gives us the offset of the view within the backing store pixmap
-
- const bool hasValidBackingStore = backingStoreDevice && backingStoreDevice->devType() == QInternal::Pixmap;
- QPixmap* backingStorePixmap = static_cast<QPixmap*>(backingStoreDevice);
-
- // We cannot grab contents from the backing store when painting on QGraphicsView items
- // (because backing store contents are already transformed). What we really mean to do
- // here is to check if we are painting on QWebView, but let's be a little permissive :)
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- const bool backingStoreHasUntransformedContents = client && qobject_cast<QWidget*>(client->pluginParent());
-
- if (hasValidBackingStore && backingStorePixmap->depth() == drawableDepth
- && backingStoreHasUntransformedContents) {
- GC gc = XDefaultGC(QX11Info::display(), QX11Info::appScreen());
- XCopyArea(QX11Info::display(), backingStorePixmap->handle(), m_drawable, gc,
- offset.x() + m_windowRect.x() + exposedRect.x(), offset.y() + m_windowRect.y() + exposedRect.y(),
- exposedRect.width(), exposedRect.height(), exposedRect.x(), exposedRect.y());
- } else { // no backing store, clean the pixmap because the plugin thinks its transparent
- QPainter painter(&qtDrawable);
- painter.fillRect(exposedRect, Qt::white);
- }
-
- if (syncX)
- QApplication::syncX();
- }
-
- XEvent xevent;
- memset(&xevent, 0, sizeof(XEvent));
- XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
- exposeEvent.type = GraphicsExpose;
- exposeEvent.display = QX11Info::display();
- exposeEvent.drawable = qtDrawable.handle();
- exposeEvent.x = exposedRect.x();
- exposeEvent.y = exposedRect.y();
- exposeEvent.width = exposedRect.x() + exposedRect.width(); // flash bug? it thinks width is the right in transparent mode
- exposeEvent.height = exposedRect.y() + exposedRect.height(); // flash bug? it thinks height is the bottom in transparent mode
-
- dispatchNPEvent(xevent);
-
- if (syncX)
- XSync(m_pluginDisplay, false); // sync changes by plugin
-
- painter->drawPixmap(QPoint(exposedRect.x(), exposedRect.y()), qtDrawable, exposedRect);
-}
-
-void PluginView::paint(GraphicsContext* context, const IntRect& rect)
-{
- if (!m_isStarted) {
- paintMissingPluginIcon(context, rect);
- return;
- }
-
- if (context->paintingDisabled())
- return;
-
- setNPWindowIfNeeded();
-
- if (m_isWindowed)
- return;
-
-#if USE(ACCELERATED_COMPOSITING)
- if (m_platformLayer)
- return;
-#endif
-
- if (!m_drawable
-#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- && m_image.isNull()
-#endif
- )
- return;
-
- QPainter* painter = context->platformContext();
- IntRect exposedRect(rect);
- exposedRect.intersect(frameRect());
- exposedRect.move(-frameRect().x(), -frameRect().y());
-
-#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- if (!m_image.isNull()) {
- paintUsingImageSurfaceExtension(painter, exposedRect);
- return;
- }
-#endif
-
- painter->translate(frameRect().x(), frameRect().y());
- paintUsingXPixmap(painter, exposedRect);
- painter->translate(-frameRect().x(), -frameRect().y());
-}
-
-// TODO: Unify across ports.
-bool PluginView::dispatchNPEvent(NPEvent& event)
-{
- if (!m_plugin->pluginFuncs()->event)
- return false;
-
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-
- return accepted;
-}
-
-void setSharedXEventFields(XEvent* xEvent, QWidget* ownerWidget)
-{
- xEvent->xany.serial = 0; // we are unaware of the last request processed by X Server
- xEvent->xany.send_event = false;
- xEvent->xany.display = QX11Info::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 = ownerWidget ? ownerWidget->window()->handle() : 0;
-}
-
-void PluginView::initXEvent(XEvent* xEvent)
-{
- memset(xEvent, 0, sizeof(XEvent));
-
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- QWidget* ownerWidget = client ? client->ownerWidget() : 0;
- setSharedXEventFields(xEvent, ownerWidget);
-}
-
-void setXKeyEventSpecificFields(XEvent* xEvent, KeyboardEvent* event)
-{
- const PlatformKeyboardEvent* keyEvent = event->keyEvent();
-
- xEvent->type = (event->type() == eventNames().keydownEvent) ? 2 : 3; // ints as Qt unsets KeyPress and KeyRelease
- xEvent->xkey.root = QX11Info::appRootWindow();
- xEvent->xkey.subwindow = 0; // we have no child window
- xEvent->xkey.time = event->timeStamp();
- xEvent->xkey.state = keyEvent->nativeModifiers();
- xEvent->xkey.keycode = keyEvent->nativeScanCode();
-
- // We may not have a nativeScanCode() if the key event is from DRT's eventsender. In that
- // case just populate the XEvent's keycode with the Qt platform-independent keycode. The only
- // place this keycode will be used is in webkit_test_plugin_handle_event().
- if (QWebPagePrivate::drtRun && !xEvent->xkey.keycode) {
- QKeyEvent* qKeyEvent = keyEvent->qtEvent();
- ASSERT(qKeyEvent);
- if (!qKeyEvent->text().isEmpty())
- xEvent->xkey.keycode = int(qKeyEvent->text().at(0).unicode() + qKeyEvent->modifiers());
- else if (qKeyEvent->key() && (qKeyEvent->key() != Qt::Key_unknown))
- xEvent->xkey.keycode = int(qKeyEvent->key() + qKeyEvent->modifiers());
- }
-
- 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)
-{
- if (m_isWindowed)
- return;
-
- if (event->type() != eventNames().keydownEvent && event->type() != eventNames().keyupEvent)
- return;
-
- XEvent npEvent;
- initXEvent(&npEvent);
- setXKeyEventSpecificFields(&npEvent, event);
-
- if (!dispatchNPEvent(npEvent))
- event->setDefaultHandled();
-}
-
-static unsigned int inputEventState(MouseEvent* event)
-{
- unsigned int state = 0;
- if (event->ctrlKey())
- state |= ControlMask;
- if (event->shiftKey())
- state |= ShiftMask;
- if (event->altKey())
- state |= Mod1Mask;
- if (event->metaKey())
- state |= Mod4Mask;
- return state;
-}
-
-static void setXButtonEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
-{
- XButtonEvent& xbutton = xEvent->xbutton;
- xbutton.type = event->type() == eventNames().mousedownEvent ? ButtonPress : ButtonRelease;
- xbutton.root = QX11Info::appRootWindow();
- xbutton.subwindow = 0;
- xbutton.time = event->timeStamp();
- xbutton.x = postZoomPos.x();
- xbutton.y = postZoomPos.y();
- xbutton.x_root = event->screenX();
- xbutton.y_root = event->screenY();
- xbutton.state = inputEventState(event);
- switch (event->button()) {
- case MiddleButton:
- xbutton.button = Button2;
- break;
- case RightButton:
- xbutton.button = Button3;
- break;
- case LeftButton:
- default:
- xbutton.button = Button1;
- break;
- }
- xbutton.same_screen = true;
-}
-
-static void setXMotionEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
-{
- XMotionEvent& xmotion = xEvent->xmotion;
- xmotion.type = MotionNotify;
- xmotion.root = QX11Info::appRootWindow();
- xmotion.subwindow = 0;
- xmotion.time = event->timeStamp();
- xmotion.x = postZoomPos.x();
- xmotion.y = postZoomPos.y();
- xmotion.x_root = event->screenX();
- xmotion.y_root = event->screenY();
- xmotion.state = inputEventState(event);
- xmotion.is_hint = NotifyNormal;
- xmotion.same_screen = true;
-}
-
-static void setXCrossingEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
-{
- XCrossingEvent& xcrossing = xEvent->xcrossing;
- xcrossing.type = event->type() == eventNames().mouseoverEvent ? EnterNotify : LeaveNotify;
- xcrossing.root = QX11Info::appRootWindow();
- xcrossing.subwindow = 0;
- xcrossing.time = event->timeStamp();
- xcrossing.x = postZoomPos.y();
- xcrossing.y = postZoomPos.x();
- xcrossing.x_root = event->screenX();
- xcrossing.y_root = event->screenY();
- xcrossing.state = inputEventState(event);
- xcrossing.mode = NotifyNormal;
- xcrossing.detail = NotifyDetailNone;
- xcrossing.same_screen = true;
- xcrossing.focus = false;
-}
-
-void PluginView::handleMouseEvent(MouseEvent* event)
-{
- if (m_isWindowed)
- return;
-
- if (event->button() == RightButton && m_plugin->quirks().contains(PluginQuirkIgnoreRightClickInWindowlessMode))
- return;
-
- if (event->type() == eventNames().mousedownEvent) {
- // Give focus to the plugin on click
- if (Page* page = m_parentFrame->page())
- page->focusController()->setActive(true);
-
- focusPluginElement();
- }
-
- XEvent npEvent;
- initXEvent(&npEvent);
-
- IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
-
- if (event->type() == eventNames().mousedownEvent || event->type() == eventNames().mouseupEvent)
- setXButtonEventSpecificFields(&npEvent, event, postZoomPos);
- else if (event->type() == eventNames().mousemoveEvent)
- setXMotionEventSpecificFields(&npEvent, event, postZoomPos);
- else if (event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mouseoverEvent)
- setXCrossingEventSpecificFields(&npEvent, event, postZoomPos);
- else
- return;
-
- if (!dispatchNPEvent(npEvent))
- event->setDefaultHandled();
-}
-
-void PluginView::handleFocusInEvent()
-{
- XEvent npEvent;
- initXEvent(&npEvent);
-
- XFocusChangeEvent& event = npEvent.xfocus;
- event.type = 9; /* int as Qt unsets FocusIn */
- event.mode = NotifyNormal;
- event.detail = NotifyDetailNone;
-
- dispatchNPEvent(npEvent);
-}
-
-void PluginView::handleFocusOutEvent()
-{
- XEvent npEvent;
- initXEvent(&npEvent);
-
- XFocusChangeEvent& event = npEvent.xfocus;
- event.type = 10; /* int as Qt unsets FocusOut */
- event.mode = NotifyNormal;
- event.detail = NotifyDetailNone;
-
- dispatchNPEvent(npEvent);
-}
-
-void PluginView::setParent(ScrollView* parent)
-{
- Widget::setParent(parent);
-
- if (parent)
- init();
-}
-
-void PluginView::setNPWindowRect(const IntRect&)
-{
- if (!m_isWindowed)
- setNPWindowIfNeeded();
-}
-
-void PluginView::setNPWindowIfNeeded()
-{
- if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
- return;
-
- // If the plugin didn't load sucessfully, no point in calling setwindow
- if (m_status != PluginStatusLoadedSuccessfully)
- return;
-
- // On Unix, only call plugin if it's full-page or windowed
- if (m_mode != NP_FULL && m_mode != NP_EMBED)
- return;
-
- // Check if the platformPluginWidget still exists
- if (m_isWindowed && !platformPluginWidget())
- return;
-
- if (!m_hasPendingGeometryChange)
- return;
- m_hasPendingGeometryChange = false;
-
- if (m_isWindowed) {
- platformPluginWidget()->setGeometry(m_windowRect);
- // if setMask is set with an empty QRegion, no clipping will
- // be performed, so in that case we hide the plugin view
- platformPluginWidget()->setVisible(!m_clipRect.isEmpty());
- platformPluginWidget()->setMask(QRegion(m_clipRect));
-
- m_npWindow.x = m_windowRect.x();
- m_npWindow.y = m_windowRect.y();
- } else {
- m_npWindow.x = 0;
- m_npWindow.y = 0;
- }
-
- // If the width or height are null, set the clipRect to null, indicating that
- // the plugin is not visible/scrolled out.
- if (!m_clipRect.width() || !m_clipRect.height()) {
- m_npWindow.clipRect.left = 0;
- m_npWindow.clipRect.right = 0;
- m_npWindow.clipRect.top = 0;
- m_npWindow.clipRect.bottom = 0;
- } else {
- // Clipping rectangle of the plug-in; the origin is the top left corner of the drawable or window.
- m_npWindow.clipRect.left = m_npWindow.x + m_clipRect.x();
- m_npWindow.clipRect.top = m_npWindow.y + m_clipRect.y();
- m_npWindow.clipRect.right = m_npWindow.x + m_clipRect.x() + m_clipRect.width();
- m_npWindow.clipRect.bottom = m_npWindow.y + m_clipRect.y() + m_clipRect.height();
- }
-
- if (m_plugin->quirks().contains(PluginQuirkDontCallSetWindowMoreThanOnce)) {
- // FLASH WORKAROUND: Only set initially. Multiple calls to
- // setNPWindow() cause the plugin to crash in windowed mode.
- if (!m_isWindowed || m_npWindow.width == -1 || m_npWindow.height == -1) {
- m_npWindow.width = m_windowRect.width();
- m_npWindow.height = m_windowRect.height();
- }
- } else {
- m_npWindow.width = m_windowRect.width();
- m_npWindow.height = m_windowRect.height();
- }
-
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-}
-
-void PluginView::setParentVisible(bool visible)
-{
- if (isParentVisible() == visible)
- return;
-
- Widget::setParentVisible(visible);
-
- if (isSelfVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(visible);
-}
-
-NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
-{
- String filename(buf, len);
-
- if (filename.startsWith("file:///"))
- filename = filename.substring(8);
-
- long long size;
- if (!getFileSize(filename, size))
- return NPERR_FILE_NOT_FOUND;
-
- FILE* fileHandle = fopen((filename.utf8()).data(), "r");
- if (!fileHandle)
- return NPERR_FILE_NOT_FOUND;
-
- buffer.resize(size);
- int bytesRead = fread(buffer.data(), 1, size, fileHandle);
-
- fclose(fileHandle);
-
- if (bytesRead <= 0)
- return NPERR_FILE_NOT_FOUND;
-
- return NPERR_NO_ERROR;
-}
-
-bool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVToolkit:
- *static_cast<uint32_t*>(value) = 0;
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVSupportsXEmbedBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVjavascriptEnabledBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVSupportsWindowless:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
-#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
- case NPNVSupportsWindowlessLocal:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-#endif
-
- default:
- return false;
- }
-}
-
-bool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVxDisplay:
- *(void **)value = QX11Info::display();
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVxtAppContext:
- *result = NPERR_GENERIC_ERROR;
- return true;
-
- case NPNVnetscapeWindow: {
- void* w = reinterpret_cast<void*>(value);
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- *((XID *)w) = client ? client->ownerWidget()->window()->winId() : 0;
- *result = NPERR_NO_ERROR;
- return true;
- }
-
- case NPNVToolkit:
- if (m_plugin->quirks().contains(PluginQuirkRequiresGtkToolKit)) {
- *((uint32_t *)value) = 2;
- *result = NPERR_NO_ERROR;
- return true;
- }
- return false;
-
- default:
- return false;
- }
-}
-
-void PluginView::invalidateRect(const IntRect& rect)
-{
-#if USE(ACCELERATED_COMPOSITING) && !USE(TEXTURE_MAPPER)
- if (m_platformLayer) {
- m_platformLayer->update(QRectF(rect));
- return;
- }
-#endif
-
- if (m_isWindowed) {
- if (platformWidget())
- platformWidget()->update(rect);
- return;
- }
-
- invalidateWindowlessPluginRect(rect);
-}
-
-void PluginView::invalidateRect(NPRect* rect)
-{
- if (!rect) {
- invalidate();
- return;
- }
- IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
- invalidateRect(r);
-}
-
-void PluginView::invalidateRegion(NPRegion region)
-{
- Q_UNUSED(region);
- invalidate();
-}
-
-void PluginView::forceRedraw()
-{
- invalidate();
-}
-
-static Display *getPluginDisplay()
-{
- // The plugin toolkit might run using a different X connection. At the moment, we only
- // support gdk based plugins (like flash) that use a different X connection.
- // The code below has the same effect as this one:
- // Display *gdkDisplay = gdk_x11_display_get_xdisplay(gdk_display_get_default());
- QLibrary library("libgdk-x11-2.0", 0);
- if (!library.load())
- return 0;
-
- typedef void *(*gdk_display_get_default_ptr)();
- gdk_display_get_default_ptr gdk_display_get_default = (gdk_display_get_default_ptr)library.resolve("gdk_display_get_default");
- if (!gdk_display_get_default)
- return 0;
-
- typedef void *(*gdk_x11_display_get_xdisplay_ptr)(void *);
- gdk_x11_display_get_xdisplay_ptr gdk_x11_display_get_xdisplay = (gdk_x11_display_get_xdisplay_ptr)library.resolve("gdk_x11_display_get_xdisplay");
- if (!gdk_x11_display_get_xdisplay)
- return 0;
-
- return (Display*)gdk_x11_display_get_xdisplay(gdk_display_get_default());
-}
-
-static void getVisualAndColormap(int depth, Visual **visual, Colormap *colormap)
-{
- *visual = 0;
- *colormap = 0;
-
-#ifndef QT_NO_XRENDER
- static const bool useXRender = qgetenv("QT_X11_NO_XRENDER").isNull(); // Should also check for XRender >= 0.5
-#else
- static const bool useXRender = false;
-#endif
-
- if (!useXRender && depth == 32)
- return;
-
- int nvi;
- XVisualInfo templ;
- templ.screen = QX11Info::appScreen();
- templ.depth = depth;
- templ.c_class = TrueColor;
- XVisualInfo* xvi = XGetVisualInfo(QX11Info::display(), VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi);
-
- if (!xvi)
- return;
-
-#ifndef QT_NO_XRENDER
- if (depth == 32) {
- for (int idx = 0; idx < nvi; ++idx) {
- XRenderPictFormat* format = XRenderFindVisualFormat(QX11Info::display(), xvi[idx].visual);
- if (format->type == PictTypeDirect && format->direct.alphaMask) {
- *visual = xvi[idx].visual;
- break;
- }
- }
- } else
-#endif // QT_NO_XRENDER
- *visual = xvi[0].visual;
-
- XFree(xvi);
-
- if (*visual)
- *colormap = XCreateColormap(QX11Info::display(), QX11Info::appRootWindow(), *visual, AllocNone);
-}
-
-bool PluginView::platformStart()
-{
- ASSERT(m_isStarted);
- ASSERT(m_status == PluginStatusLoadedSuccessfully);
-
- if (m_plugin->pluginFuncs()->getvalue) {
- PluginView::setCurrentPluginView(this);
-#if USE(JSC)
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-#endif
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginNeedsXEmbed, &m_needsXEmbed);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
- }
-
- if (m_isWindowed) {
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- if (m_needsXEmbed && client) {
- setPlatformWidget(new PluginContainerQt(this, client->ownerWidget()));
- // sync our XEmbed container window creation before sending the xid to plugins.
- QApplication::syncX();
- } else {
- notImplemented();
- m_status = PluginStatusCanNotLoadPlugin;
- return false;
- }
- } else {
- setPlatformWidget(0);
- m_pluginDisplay = getPluginDisplay();
-
-#if USE(ACCELERATED_COMPOSITING) && !USE(TEXTURE_MAPPER)
- if (m_parentFrame->page()->chrome()->client()->allowsAcceleratedCompositing()
- && m_parentFrame->page()->settings()
- && m_parentFrame->page()->settings()->acceleratedCompositingEnabled()) {
- m_platformLayer = new PluginGraphicsLayerQt(this);
- // Trigger layer computation in RenderLayerCompositor
- m_element->setNeedsStyleRecalc(SyntheticStyleChange);
- }
-#endif
- }
-
- show();
-
- NPSetWindowCallbackStruct* wsi = new NPSetWindowCallbackStruct();
- wsi->type = 0;
-
- if (m_isWindowed) {
- const QX11Info* x11Info = &platformPluginWidget()->x11Info();
-
- wsi->display = x11Info->display();
- wsi->visual = (Visual*)x11Info->visual();
- wsi->depth = x11Info->depth();
- wsi->colormap = x11Info->colormap();
-
- m_npWindow.type = NPWindowTypeWindow;
- m_npWindow.window = (void*)platformPluginWidget()->winId();
- m_npWindow.width = -1;
- m_npWindow.height = -1;
- } else {
- const QX11Info* x11Info = &QApplication::desktop()->x11Info();
-
- if (x11Info->depth() == 32 || !m_plugin->quirks().contains(PluginQuirkRequiresDefaultScreenDepth)) {
- getVisualAndColormap(32, &m_visual, &m_colormap);
- wsi->depth = 32;
- }
-
- if (!m_visual) {
- getVisualAndColormap(x11Info->depth(), &m_visual, &m_colormap);
- wsi->depth = x11Info->depth();
- }
-
- wsi->display = x11Info->display();
- wsi->visual = m_visual;
- wsi->colormap = m_colormap;
-
- m_npWindow.type = NPWindowTypeDrawable;
- m_npWindow.window = 0; // Not used?
- m_npWindow.x = 0;
- m_npWindow.y = 0;
- m_npWindow.width = -1;
- m_npWindow.height = -1;
- }
-
- m_npWindow.ws_info = wsi;
-
- if (!(m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))) {
- updatePluginWidget();
- setNPWindowIfNeeded();
- }
-
- return true;
-}
-
-void PluginView::platformDestroy()
-{
- if (platformPluginWidget())
- delete platformPluginWidget();
-
- if (m_drawable)
- XFreePixmap(QX11Info::display(), m_drawable);
-
- if (m_colormap)
- XFreeColormap(QX11Info::display(), m_colormap);
-}
-
-void PluginView::halt()
-{
-}
-
-void PluginView::restart()
-{
-}
-
-#if USE(ACCELERATED_COMPOSITING)
-PlatformLayer* PluginView::platformLayer() const
-{
- return m_platformLayer.get();
-}
-#endif
-
-} // namespace WebCore
diff --git a/WebCore/plugins/symbian/PluginContainerSymbian.cpp b/WebCore/plugins/symbian/PluginContainerSymbian.cpp
deleted file mode 100644
index b839870..0000000
--- a/WebCore/plugins/symbian/PluginContainerSymbian.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "config.h"
-#include "PluginContainerSymbian.h"
-
-#include "FocusController.h"
-#include "Frame.h"
-#include "FrameView.h"
-#include "Page.h"
-#include "PlatformKeyboardEvent.h"
-#include "PluginView.h"
-
-#include <QApplication>
-#include <QWidget>
-
-using namespace WebCore;
-
-PluginContainerSymbian::PluginContainerSymbian(PluginView* view, QWidget* parent, QGraphicsProxyWidget* proxy)
- : QWidget(parent)
- , m_pluginView(view)
- , m_proxy(proxy)
- , m_hasPendingGeometryChange(false)
-{
-}
-
-PluginContainerSymbian::~PluginContainerSymbian()
-{
-}
-
-void PluginContainerSymbian::requestGeometry(const QRect& rect, const QRegion& clip)
-{
- if (m_windowRect != rect || m_clipRegion != clip) {
- m_windowRect = rect;
- m_clipRegion = clip;
- m_hasPendingGeometryChange = true;
- }
-}
-
-void PluginContainerSymbian::adjustGeometry()
-{
- if (m_hasPendingGeometryChange) {
- setGeometry(m_windowRect);
- setMask(m_clipRegion);
- m_hasPendingGeometryChange = false;
- }
-}
-
-void PluginContainerSymbian::focusInEvent(QFocusEvent*)
-{
- if (Page* page = m_pluginView->parentFrame()->page())
- page->focusController()->setActive(true);
-
- m_pluginView->focusPluginElement();
-}
-
-void PluginContainerSymbian::focusOutEvent(QFocusEvent*)
-{
- if (Page* page = m_pluginView->parentFrame()->page())
- page->focusController()->setActive(false);
-}
diff --git a/WebCore/plugins/symbian/PluginContainerSymbian.h b/WebCore/plugins/symbian/PluginContainerSymbian.h
deleted file mode 100644
index fead872..0000000
--- a/WebCore/plugins/symbian/PluginContainerSymbian.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef PluginContainerSymbian_h
-#define PluginContainerSymbian_h
-
-#include <QWidget>
-
-class QGraphicsProxyWidget;
-
-namespace WebCore {
-
- class PluginView;
-
- class PluginContainerSymbian : public QWidget {
- Q_OBJECT
- public:
- PluginContainerSymbian(PluginView*, QWidget* parent, QGraphicsProxyWidget* proxy = 0);
- ~PluginContainerSymbian();
-
- void requestGeometry(const QRect&, const QRegion& clip = QRegion());
- void adjustGeometry();
- QGraphicsProxyWidget* proxy() { return m_proxy; }
-
- protected:
- virtual void focusInEvent(QFocusEvent*);
- virtual void focusOutEvent(QFocusEvent*);
- private:
- PluginView* m_pluginView;
- QGraphicsProxyWidget* m_proxy;
- QRect m_windowRect;
- QRegion m_clipRegion;
- bool m_hasPendingGeometryChange;
- };
-}
-
-#endif // PluginContainerSymbian_h
diff --git a/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp b/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp
deleted file mode 100644
index 2e09296..0000000
--- a/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#include "config.h"
-#include "PluginDatabase.h"
-
-#include <QFileInfo>
-#include <f32file.h>
-
-static const char QTPLUGIN_FILTER[] = "*.qtplugin";
-static const char QT_PLUGIN_FOLDER[] = ":\\resource\\qt\\plugins\\npqtplugins\\";
-
-namespace WebCore {
-
-Vector<String> PluginDatabase::defaultPluginDirectories()
-{
- Vector<String> directories;
- //find the installation drive
- TDriveList drivelist;
- TChar driveLetter;
- RFs fsSession;
-
- if (fsSession.Connect() == KErrNone && fsSession.DriveList(drivelist) == KErrNone) {
- for (TInt driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++) {
- if (drivelist[driveNumber] && fsSession.DriveToChar(driveNumber, driveLetter) == KErrNone) {
- QString driveStringValue(QChar((uint)driveLetter.GetUpperCase()));
- QString stubDirPath;
- stubDirPath.append(driveStringValue);
- stubDirPath.append(QT_PLUGIN_FOLDER);
- if (QFileInfo(stubDirPath).exists())
- directories.append(stubDirPath);
- }
- }
- }
-
- fsSession.Close();
- return directories;
-}
-
-bool PluginDatabase::isPreferredPluginDirectory(const String& path)
-{
- return true;
-}
-
-void PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const
-{
- // FIXME: This should be a case insensitive set.
- HashSet<String> uniqueFilenames;
-
- String fileNameFilter(QTPLUGIN_FILTER);
-
- Vector<String>::const_iterator dirsEnd = m_pluginDirectories.end();
- for (Vector<String>::const_iterator dIt = m_pluginDirectories.begin(); dIt != dirsEnd; ++dIt) {
- Vector<String> pluginPaths = listDirectory(*dIt, fileNameFilter);
- Vector<String>::const_iterator pluginsEnd = pluginPaths.end();
- for (Vector<String>::const_iterator pIt = pluginPaths.begin(); pIt != pluginsEnd; ++pIt) {
- if (!fileExists(*pIt))
- continue;
- paths.add(*pIt);
- }
- }
-}
-
-}
diff --git a/WebCore/plugins/symbian/PluginPackageSymbian.cpp b/WebCore/plugins/symbian/PluginPackageSymbian.cpp
deleted file mode 100644
index 7fca625..0000000
--- a/WebCore/plugins/symbian/PluginPackageSymbian.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#include "config.h"
-#include "PluginPackage.h"
-
-#include "MIMETypeRegistry.h"
-#include "npinterface.h"
-#include "npruntime_impl.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include <QPluginLoader>
-#include <wtf/text/CString.h>
-
-namespace WebCore {
-
-bool PluginPackage::fetchInfo()
-{
- if (!load())
- return false;
-
- char* buf = 0;
- NPError err = m_pluginFuncs.getvalue(0, NPPVpluginNameString, (void *)&buf);
- m_name = buf;
- err = m_pluginFuncs.getvalue(0, NPPVpluginDescriptionString, (void *)&buf);
- m_description = buf;
-
- determineModuleVersionFromDescription();
-
- String s = m_npInterface->NP_GetMIMEDescription();
- Vector<String> types;
- s.split(UChar('|'), false, types); // <MIME1>;<ext1,ext2,ext3,...>;<Description>|<MIME2>|<MIME3>|...
-
- for (int i = 0; i < types.size(); ++i) {
- Vector<String> mime;
- types[i].split(UChar(';'), true, mime); // <MIME1>;<ext1,ext2,ext3,...>;<Description>
- if (mime.size() > 0) {
- Vector<String> exts;
- if (mime.size() > 1)
- mime[1].split(UChar(','), false, exts); // <ext1,ext2,ext3,...>
-
- m_mimeToExtensions.add(mime[0], exts); // <MIME>,<ext1,ext2,ext3>
- if (mime.size() > 2)
- m_mimeToDescriptions.add(mime[0], mime[2]); // <MIME>,<Description>
- }
- }
- unload();
- return true;
-}
-
-bool PluginPackage::load()
-{
- if (m_isLoaded) {
- m_loadCount++;
- return true;
- }
-
- m_pluginLoader = new QPluginLoader(m_path);
- if (!m_pluginLoader->load()) {
- delete m_pluginLoader;
- m_pluginLoader = 0;
- return false;
- }
-
- QObject* plugin = m_pluginLoader->instance();
- if (!plugin) {
- m_pluginLoader->unload();
- delete m_pluginLoader;
- m_pluginLoader = 0;
- return false;
- }
-
- // Plugin instance created
- // Cast plugin to NPInterface,
- m_npInterface = qobject_cast<NPInterface*>(plugin);
- if (!m_npInterface) {
- m_pluginLoader->unload();
- delete m_pluginLoader;
- m_pluginLoader = 0;
- return false;
- }
-
- m_isLoaded = true;
-
- NPError npErr;
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
- m_browserFuncs.size = sizeof(m_browserFuncs);
- m_browserFuncs.version = NP_VERSION_MINOR;
- m_browserFuncs.geturl = NPN_GetURL;
- m_browserFuncs.posturl = NPN_PostURL;
- m_browserFuncs.requestread = NPN_RequestRead;
- m_browserFuncs.newstream = NPN_NewStream;
- m_browserFuncs.write = NPN_Write;
- m_browserFuncs.destroystream = NPN_DestroyStream;
- m_browserFuncs.status = NPN_Status;
- m_browserFuncs.uagent = NPN_UserAgent;
- m_browserFuncs.memalloc = NPN_MemAlloc;
- m_browserFuncs.memfree = NPN_MemFree;
- m_browserFuncs.memflush = NPN_MemFlush;
- m_browserFuncs.reloadplugins = NPN_ReloadPlugins;
- m_browserFuncs.geturlnotify = NPN_GetURLNotify;
- m_browserFuncs.posturlnotify = NPN_PostURLNotify;
- m_browserFuncs.getvalue = NPN_GetValue;
- m_browserFuncs.setvalue = NPN_SetValue;
- m_browserFuncs.invalidaterect = NPN_InvalidateRect;
- m_browserFuncs.invalidateregion = NPN_InvalidateRegion;
- m_browserFuncs.forceredraw = NPN_ForceRedraw;
- m_browserFuncs.getJavaEnv = NPN_GetJavaEnv;
- m_browserFuncs.getJavaPeer = NPN_GetJavaPeer;
- m_browserFuncs.pushpopupsenabledstate = NPN_PushPopupsEnabledState;
- m_browserFuncs.poppopupsenabledstate = NPN_PopPopupsEnabledState;
- m_browserFuncs.releasevariantvalue = _NPN_ReleaseVariantValue;
- m_browserFuncs.getstringidentifier = _NPN_GetStringIdentifier;
- m_browserFuncs.getstringidentifiers = _NPN_GetStringIdentifiers;
- m_browserFuncs.getintidentifier = _NPN_GetIntIdentifier;
- m_browserFuncs.identifierisstring = _NPN_IdentifierIsString;
- m_browserFuncs.utf8fromidentifier = _NPN_UTF8FromIdentifier;
- m_browserFuncs.createobject = _NPN_CreateObject;
- m_browserFuncs.retainobject = _NPN_RetainObject;
- m_browserFuncs.releaseobject = _NPN_ReleaseObject;
- m_browserFuncs.invoke = _NPN_Invoke;
- m_browserFuncs.invokeDefault = _NPN_InvokeDefault;
- m_browserFuncs.evaluate = _NPN_Evaluate;
- m_browserFuncs.getproperty = _NPN_GetProperty;
- m_browserFuncs.setproperty = _NPN_SetProperty;
- m_browserFuncs.removeproperty = _NPN_RemoveProperty;
- m_browserFuncs.hasproperty = _NPN_HasMethod;
- m_browserFuncs.hasmethod = _NPN_HasProperty;
- m_browserFuncs.setexception = _NPN_SetException;
- m_browserFuncs.enumerate = _NPN_Enumerate;
- m_browserFuncs.construct = _NPN_Construct;
-
- npErr = m_npInterface->NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
- if (npErr != NPERR_NO_ERROR) {
- m_pluginLoader->unload();
- delete m_pluginLoader;
- m_pluginLoader = 0;
- return false;
- }
-
- m_loadCount++;
- return true;
-}
-
-void PluginPackage::unload()
-{
- if (!m_isLoaded)
- return;
-
- if (--m_loadCount > 0)
- return;
-
- m_isLoaded = false;
- m_npInterface->NP_Shutdown();
-
- m_pluginLoader->unload();
- delete m_pluginLoader;
- m_pluginLoader = 0;
-}
-
-uint16_t PluginPackage::NPVersion() const
-{
- return NP_VERSION_MINOR;
-}
-}
-
diff --git a/WebCore/plugins/symbian/PluginViewSymbian.cpp b/WebCore/plugins/symbian/PluginViewSymbian.cpp
deleted file mode 100644
index b8a72b1..0000000
--- a/WebCore/plugins/symbian/PluginViewSymbian.cpp
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- Copyright (C) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#include "config.h"
-#include "PluginView.h"
-
-#include "Bridge.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Element.h"
-#include "FocusController.h"
-#include "Frame.h"
-#include "FrameLoadRequest.h"
-#include "FrameLoader.h"
-#include "FrameTree.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "HTMLNames.h"
-#include "HTMLPlugInElement.h"
-#include "HostWindow.h"
-#include "Image.h"
-#include "JSDOMBinding.h"
-#include "KeyboardEvent.h"
-#include "MouseEvent.h"
-#include "NotImplemented.h"
-#include "Page.h"
-#include "PlatformKeyboardEvent.h"
-#include "PlatformMouseEvent.h"
-#include "PluginContainerSymbian.h"
-#include "PluginDebug.h"
-#include "PluginMainThreadScheduler.h"
-#include "PluginPackage.h"
-#include "QWebPageClient.h"
-#include "RenderLayer.h"
-#include "ScriptController.h"
-#include "Settings.h"
-#include "npfunctions.h"
-#include "npinterface.h"
-#include "npruntime_impl.h"
-#include "qgraphicswebview.h"
-#include "runtime_root.h"
-#include <QGraphicsProxyWidget>
-#include <QKeyEvent>
-#include <QPixmap>
-#include <QRegion>
-#include <QVector>
-#include <QWidget>
-#include <runtime/JSLock.h>
-#include <runtime/JSValue.h>
-
-using JSC::ExecState;
-using JSC::Interpreter;
-using JSC::JSLock;
-using JSC::JSObject;
-using JSC::UString;
-
-using namespace std;
-
-using namespace WTF;
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-void PluginView::updatePluginWidget()
-{
- if (!parent())
- return;
- ASSERT(parent()->isFrameView());
- FrameView* frameView = static_cast<FrameView*>(parent());
- IntRect oldWindowRect = m_windowRect;
- IntRect oldClipRect = m_clipRect;
-
- m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
-
- m_clipRect = windowClipRect();
- m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
- if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect)
- return;
-
- // in order to move/resize the plugin window at the same time as the rest of frame
- // during e.g. scrolling, we set the mask and geometry in the paint() function, but
- // as paint() isn't called when the plugin window is outside the frame which can
- // be caused by a scroll, we need to move/resize immediately.
- if (!m_windowRect.intersects(frameView->frameRect()))
- setNPWindowIfNeeded();
-}
-
-void PluginView::setFocus(bool focused)
-{
- if (platformPluginWidget()) {
- if (focused)
- platformPluginWidget()->setFocus(Qt::OtherFocusReason);
- } else {
- Widget::setFocus(focused);
- }
-}
-
-void PluginView::show()
-{
- setSelfVisible(true);
-
- if (isParentVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(true);
-}
-
-void PluginView::hide()
-{
- setSelfVisible(false);
-
- if (isParentVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(false);
-}
-
-void PluginView::paint(GraphicsContext* context, const IntRect& rect)
-{
- if (!m_isStarted) {
- paintMissingPluginIcon(context, rect);
- return;
- }
-
- if (context->paintingDisabled())
- return;
- m_npWindow.ws_info = (void*)(context->platformContext());
- setNPWindowIfNeeded();
-
- if (m_isWindowed && platformPluginWidget())
- static_cast<PluginContainerSymbian*>(platformPluginWidget())->adjustGeometry();
-
- if (m_isWindowed)
- return;
-
- context->save();
- IntRect clipRect(rect);
- clipRect.intersect(frameRect());
- context->clip(clipRect);
- context->translate(frameRect().location().x(), frameRect().location().y());
-
- QPaintEvent ev(rect);
- QEvent& npEvent = ev;
- dispatchNPEvent(npEvent);
-
- context->restore();
-}
-
-// TODO: Unify across ports.
-bool PluginView::dispatchNPEvent(NPEvent& event)
-{
- if (!m_plugin->pluginFuncs()->event)
- return false;
-
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
-
- setCallingPlugin(true);
- bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-
- return accepted;
-}
-
-void PluginView::handleKeyboardEvent(KeyboardEvent* event)
-{
- if (m_isWindowed)
- return;
-
- ASSERT(event->keyEvent()->qtEvent());
- QEvent& npEvent = *(event->keyEvent()->qtEvent());
- if (!dispatchNPEvent(npEvent))
- event->setDefaultHandled();
-}
-
-void PluginView::handleMouseEvent(MouseEvent* event)
-{
- if (m_isWindowed)
- return;
-
- if (event->type() == eventNames().mousedownEvent) {
- // Give focus to the plugin on click
- if (Page* page = m_parentFrame->page())
- page->focusController()->setActive(true);
-
- focusPluginElement();
- }
-
- QEvent::Type type;
- if (event->type() == eventNames().mousedownEvent)
- type = QEvent::MouseButtonPress;
- else if (event->type() == eventNames().mousemoveEvent)
- type = QEvent::MouseMove;
- else if (event->type() == eventNames().mouseupEvent)
- type = QEvent::MouseButtonRelease;
- else
- return;
-
- QPoint position(event->offsetX(), event->offsetY());
- Qt::MouseButton button;
- switch (event->which()) {
- case 1:
- button = Qt::LeftButton;
- break;
- case 2:
- button = Qt::MidButton;
- break;
- case 3:
- button = Qt::RightButton;
- break;
- default:
- button = Qt::NoButton;
- }
- Qt::KeyboardModifiers modifiers = 0;
- if (event->ctrlKey())
- modifiers |= Qt::ControlModifier;
- if (event->altKey())
- modifiers |= Qt::AltModifier;
- if (event->shiftKey())
- modifiers |= Qt::ShiftModifier;
- if (event->metaKey())
- modifiers |= Qt::MetaModifier;
- QMouseEvent mouseEvent(type, position, button, button, modifiers);
- QEvent& npEvent = mouseEvent;
- if (!dispatchNPEvent(npEvent))
- event->setDefaultHandled();
-}
-
-void PluginView::setParent(ScrollView* parent)
-{
- Widget::setParent(parent);
-
- if (parent) {
- init();
- if (m_status == PluginStatusLoadedSuccessfully)
- updatePluginWidget();
- }
-}
-
-void PluginView::setNPWindowRect(const IntRect&)
-{
- if (!m_isWindowed)
- setNPWindowIfNeeded();
-}
-
-void PluginView::setNPWindowIfNeeded()
-{
- if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
- return;
- if (m_isWindowed) {
- ASSERT(platformPluginWidget());
- platformPluginWidget()->setGeometry(m_windowRect);
- // if setMask is set with an empty QRegion, no clipping will
- // be performed, so in that case we hide the plugin view
- platformPluginWidget()->setVisible(!m_clipRect.isEmpty());
- platformPluginWidget()->setMask(QRegion(m_clipRect));
-
- m_npWindow.x = m_windowRect.x();
- m_npWindow.y = m_windowRect.y();
-
- m_npWindow.clipRect.left = max(0, m_clipRect.x());
- m_npWindow.clipRect.top = max(0, m_clipRect.y());
- m_npWindow.clipRect.right = m_clipRect.x() + m_clipRect.width();
- m_npWindow.clipRect.bottom = m_clipRect.y() + m_clipRect.height();
-
- } else {
- // always call this method before painting.
- m_npWindow.x = 0;
- m_npWindow.y = 0;
-
- m_npWindow.clipRect.left = 0;
- m_npWindow.clipRect.top = 0;
- m_npWindow.clipRect.right = m_windowRect.width();
- m_npWindow.clipRect.bottom = m_windowRect.height();
- m_npWindow.window = 0;
- }
-
- m_npWindow.width = m_windowRect.width();
- m_npWindow.height = m_windowRect.height();
-
- PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
- PluginView::setCurrentPluginView(0);
-}
-
-void PluginView::setParentVisible(bool visible)
-{
- if (isParentVisible() == visible)
- return;
-
- Widget::setParentVisible(visible);
-
- if (isSelfVisible() && platformPluginWidget())
- platformPluginWidget()->setVisible(visible);
-}
-
-NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
-{
- notImplemented();
- return NPERR_NO_ERROR;
-}
-
-bool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVjavascriptEnabledBool:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
- case NPNVSupportsWindowless:
- *static_cast<NPBool*>(value) = true;
- *result = NPERR_NO_ERROR;
- return true;
-
- default:
- return false;
- }
-}
-
-bool PluginView::platformGetValue(NPNVariable, void*, NPError*)
-{
- return false;
-}
-
-void PluginView::invalidateRect(const IntRect& rect)
-{
- if (m_isWindowed) {
- platformWidget()->update(rect);
- return;
- }
-
- invalidateWindowlessPluginRect(rect);
-}
-
-void PluginView::invalidateRect(NPRect* rect)
-{
- if (m_isWindowed)
- return;
- if (!rect) {
- invalidate();
- return;
- }
- IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
- m_invalidRects.append(r);
- if (!m_invalidateTimer.isActive())
- m_invalidateTimer.startOneShot(0.001);
-}
-
-void PluginView::invalidateRegion(NPRegion region)
-{
- if (m_isWindowed)
- return;
-
- if (!region)
- return;
-
- QVector<QRect> rects = region->rects();
- for (int i = 0; i < rects.size(); ++i) {
- const QRect& qRect = rects.at(i);
- m_invalidRects.append(qRect);
- if (!m_invalidateTimer.isActive())
- m_invalidateTimer.startOneShot(0.001);
- }
-}
-
-void PluginView::forceRedraw()
-{
- if (m_isWindowed)
- return;
- invalidate();
-}
-
-bool PluginView::platformStart()
-{
- ASSERT(m_isStarted);
- ASSERT(m_status == PluginStatusLoadedSuccessfully);
-
- show();
-
- if (m_isWindowed) {
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- QGraphicsProxyWidget* proxy = 0;
- if (QGraphicsWebView *webView = qobject_cast<QGraphicsWebView*>(client->pluginParent()))
- proxy = new QGraphicsProxyWidget(webView);
-
- PluginContainerSymbian* container = new PluginContainerSymbian(this, proxy ? 0 : client->ownerWidget(), proxy);
- setPlatformWidget(container);
- if (proxy)
- proxy->setWidget(container);
-
- m_npWindow.type = NPWindowTypeWindow;
- m_npWindow.window = (void*)platformPluginWidget();
-
- } else {
- setPlatformWidget(0);
- m_npWindow.type = NPWindowTypeDrawable;
- m_npWindow.window = 0; // Not used?
- }
- updatePluginWidget();
- setNPWindowIfNeeded();
-
- return true;
-}
-
-void PluginView::platformDestroy()
-{
- if (platformPluginWidget()) {
- PluginContainerSymbian* container = static_cast<PluginContainerSymbian*>(platformPluginWidget());
- if (container && container->proxy())
- delete container->proxy();
- else
- delete container;
- }
-}
-
-void PluginView::halt()
-{
-}
-
-void PluginView::restart()
-{
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/symbian/npinterface.h b/WebCore/plugins/symbian/npinterface.h
deleted file mode 100644
index e296127..0000000
--- a/WebCore/plugins/symbian/npinterface.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#ifndef npinterface_h
-#define npinterface_h
-
-#include "npfunctions.h"
-#include <QtPlugin>
-
-class NPInterface {
-public:
- virtual NPError NP_Initialize(NPNetscapeFuncs* aNPNFuncs, NPPluginFuncs* aNPPFuncs) = 0;
- virtual void NP_Shutdown() = 0;
- virtual char* NP_GetMIMEDescription() = 0;
-};
-
-
-QT_BEGIN_NAMESPACE
-Q_DECLARE_INTERFACE(NPInterface, "com.nokia.qts60.webplugin/1.0");
-QT_END_NAMESPACE
-
-#endif // npinterface_h
diff --git a/WebCore/plugins/win/PaintHooks.asm b/WebCore/plugins/win/PaintHooks.asm
deleted file mode 100644
index 1508813..0000000
--- a/WebCore/plugins/win/PaintHooks.asm
+++ /dev/null
@@ -1,50 +0,0 @@
-;/*
-; Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
-;
-; This library is free software; you can redistribute it and/or
-; modify it under the terms of the GNU Library General Public
-; License as published by the Free Software Foundation; either
-; version 2 of the License, or (at your option) any later version.
-;
-; This library is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-; Library General Public License for more details.
-;
-; You should have received a copy of the GNU Library General Public License
-; along with this library; see the file COPYING.LIB. If not, write to
-; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-; Boston, MA 02110-1301, USA.
-;*/
-
-;HDC __stdcall _HBeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
-
-PUBLIC _HBeginPaint
-
-_TEXT SEGMENT
-
-_HBeginPaint PROC
- mov r10,rcx
- mov eax,1017h
- syscall
- ret
-_HBeginPaint ENDP
-
-_TEXT ENDS
-
-;BOOL __stdcall _HEndPaint(HWND hWnd, const PAINTSTRUCT* lpPaint);
-
-PUBLIC _HEndPaint
-
-_TEXT SEGMENT
-
-_HEndPaint PROC
- mov r10,rcx
- mov eax,1019h
- syscall
- ret
-_HEndPaint ENDP
-
-_TEXT ENDS
-
-END
diff --git a/WebCore/plugins/win/PluginDatabaseWin.cpp b/WebCore/plugins/win/PluginDatabaseWin.cpp
deleted file mode 100644
index 27121c6..0000000
--- a/WebCore/plugins/win/PluginDatabaseWin.cpp
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
- * Copyright (C) 2008-2009 Torch Mobile, Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginDatabase.h"
-
-#include "Frame.h"
-#include "KURL.h"
-#include "PluginPackage.h"
-#include <windows.h>
-#include <shlwapi.h>
-
-#if OS(WINCE)
-// WINCE doesn't support Registry Key Access Rights. The parameter should always be 0
-#ifndef KEY_ENUMERATE_SUB_KEYS
-#define KEY_ENUMERATE_SUB_KEYS 0
-#endif
-
-DWORD SHGetValue(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData)
-{
- HKEY key;
- if (RegOpenKeyEx(hkey, pszSubKey, 0, 0, &key) == ERROR_SUCCESS) {
- DWORD result = RegQueryValueEx(key, pszValue, 0, pdwType, (LPBYTE)pvData, pcbData);
- RegCloseKey(key);
- return result;
- }
- return ERROR_INVALID_NAME;
-}
-
-BOOL PathRemoveFileSpec(LPWSTR moduleFileNameStr)
-{
- if (!*moduleFileNameStr)
- return FALSE;
-
- LPWSTR lastPos = 0;
- LPWSTR curPos = moduleFileNameStr;
- do {
- if (*curPos == L'/' || *curPos == L'\\')
- lastPos = curPos;
- } while (*++curPos);
-
- if (lastPos == curPos - 1)
- return FALSE;
-
- if (lastPos)
- *lastPos = 0;
- else {
- moduleFileNameStr[0] = L'\\';
- moduleFileNameStr[1] = 0;
- }
-
- return TRUE;
-}
-#endif
-
-namespace WebCore {
-
-static inline void addPluginPathsFromRegistry(HKEY rootKey, HashSet<String>& paths)
-{
- HKEY key;
- HRESULT result = RegOpenKeyExW(rootKey, L"Software\\MozillaPlugins", 0, KEY_ENUMERATE_SUB_KEYS, &key);
-
- if (result != ERROR_SUCCESS)
- return;
-
- wchar_t name[128];
- FILETIME lastModified;
-
- // Enumerate subkeys
- for (int i = 0;; i++) {
- DWORD nameLen = WTF_ARRAY_LENGTH(name);
- result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
-
- if (result != ERROR_SUCCESS)
- break;
-
- WCHAR pathStr[_MAX_PATH];
- DWORD pathStrSize = sizeof(pathStr);
- DWORD type;
-
- result = SHGetValue(key, name, TEXT("Path"), &type, (LPBYTE)pathStr, &pathStrSize);
- if (result != ERROR_SUCCESS || type != REG_SZ)
- continue;
-
- paths.add(String(pathStr, pathStrSize / sizeof(WCHAR) - 1));
- }
-
- RegCloseKey(key);
-}
-
-void PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const
-{
- // FIXME: This should be a case insensitive set.
- HashSet<String> uniqueFilenames;
-
- HANDLE hFind = INVALID_HANDLE_VALUE;
- WIN32_FIND_DATAW findFileData;
-
- String oldWMPPluginPath;
- String newWMPPluginPath;
-
- Vector<String>::const_iterator end = m_pluginDirectories.end();
- for (Vector<String>::const_iterator it = m_pluginDirectories.begin(); it != end; ++it) {
- String pattern = *it + "\\*";
-
- hFind = FindFirstFileW(pattern.charactersWithNullTermination(), &findFileData);
-
- if (hFind == INVALID_HANDLE_VALUE)
- continue;
-
- do {
- if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- continue;
-
- String filename = String(findFileData.cFileName, wcslen(findFileData.cFileName));
- if ((!filename.startsWith("np", false) || !filename.endsWith("dll", false)) &&
- (!equalIgnoringCase(filename, "Plugin.dll") || !it->endsWith("Shockwave 10", false)))
- continue;
-
- String fullPath = *it + "\\" + filename;
- if (!uniqueFilenames.add(fullPath).second)
- continue;
-
- paths.add(fullPath);
-
- if (equalIgnoringCase(filename, "npdsplay.dll"))
- oldWMPPluginPath = fullPath;
- else if (equalIgnoringCase(filename, "np-mswmp.dll"))
- newWMPPluginPath = fullPath;
-
- } while (FindNextFileW(hFind, &findFileData) != 0);
-
- FindClose(hFind);
- }
-
- addPluginPathsFromRegistry(HKEY_LOCAL_MACHINE, paths);
- addPluginPathsFromRegistry(HKEY_CURRENT_USER, paths);
-
- // If both the old and new WMP plugin are present in the plugins set,
- // we remove the old one so we don't end up choosing the old one.
- if (!oldWMPPluginPath.isEmpty() && !newWMPPluginPath.isEmpty())
- paths.remove(oldWMPPluginPath);
-}
-
-static inline Vector<int> parseVersionString(const String& versionString)
-{
- Vector<int> version;
-
- unsigned startPos = 0;
- unsigned endPos;
-
- while (startPos < versionString.length()) {
- for (endPos = startPos; endPos < versionString.length(); ++endPos)
- if (versionString[endPos] == '.' || versionString[endPos] == '_')
- break;
-
- int versionComponent = versionString.substring(startPos, endPos - startPos).toInt();
- version.append(versionComponent);
-
- startPos = endPos + 1;
- }
-
- return version;
-}
-
-// This returns whether versionA is higher than versionB
-static inline bool compareVersions(const Vector<int>& versionA, const Vector<int>& versionB)
-{
- for (unsigned i = 0; i < versionA.size(); i++) {
- if (i >= versionB.size())
- return true;
-
- if (versionA[i] > versionB[i])
- return true;
- else if (versionA[i] < versionB[i])
- return false;
- }
-
- // If we come here, the versions are either the same or versionB has an extra component, just return false
- return false;
-}
-
-static inline void addMozillaPluginDirectories(Vector<String>& directories)
-{
- // Enumerate all Mozilla plugin directories in the registry
- HKEY key;
- LONG result;
-
- result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Mozilla"), 0, KEY_READ, &key);
- if (result == ERROR_SUCCESS) {
- WCHAR name[128];
- FILETIME lastModified;
-
- // Enumerate subkeys
- for (int i = 0;; i++) {
- DWORD nameLen = sizeof(name) / sizeof(WCHAR);
- result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
-
- if (result != ERROR_SUCCESS)
- break;
-
- String extensionsPath = String(name, nameLen) + "\\Extensions";
- HKEY extensionsKey;
-
- // Try opening the key
- result = RegOpenKeyEx(key, extensionsPath.charactersWithNullTermination(), 0, KEY_READ, &extensionsKey);
-
- if (result == ERROR_SUCCESS) {
- // Now get the plugins directory
- WCHAR pluginsDirectoryStr[_MAX_PATH];
- DWORD pluginsDirectorySize = sizeof(pluginsDirectoryStr);
- DWORD type;
-
- result = RegQueryValueEx(extensionsKey, TEXT("Plugins"), 0, &type, (LPBYTE)&pluginsDirectoryStr, &pluginsDirectorySize);
-
- if (result == ERROR_SUCCESS && type == REG_SZ)
- directories.append(String(pluginsDirectoryStr, pluginsDirectorySize / sizeof(WCHAR) - 1));
-
- RegCloseKey(extensionsKey);
- }
- }
-
- RegCloseKey(key);
- }
-}
-
-static inline void addWindowsMediaPlayerPluginDirectory(Vector<String>& directories)
-{
-#if !OS(WINCE)
- // The new WMP Firefox plugin is installed in \PFiles\Plugins if it can't find any Firefox installs
- WCHAR pluginDirectoryStr[_MAX_PATH + 1];
- DWORD pluginDirectorySize = ::ExpandEnvironmentStringsW(TEXT("%SYSTEMDRIVE%\\PFiles\\Plugins"), pluginDirectoryStr, WTF_ARRAY_LENGTH(pluginDirectoryStr));
-
- if (pluginDirectorySize > 0 && pluginDirectorySize <= WTF_ARRAY_LENGTH(pluginDirectoryStr))
- directories.append(String(pluginDirectoryStr, pluginDirectorySize - 1));
-#endif
-
- DWORD type;
- WCHAR installationDirectoryStr[_MAX_PATH];
- DWORD installationDirectorySize = sizeof(installationDirectoryStr);
-
- HRESULT result = SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\MediaPlayer"), TEXT("Installation Directory"), &type, (LPBYTE)&installationDirectoryStr, &installationDirectorySize);
-
- if (result == ERROR_SUCCESS && type == REG_SZ)
- directories.append(String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1));
-}
-
-static inline void addQuickTimePluginDirectory(Vector<String>& directories)
-{
- DWORD type;
- WCHAR installationDirectoryStr[_MAX_PATH];
- DWORD installationDirectorySize = sizeof(installationDirectoryStr);
-
- HRESULT result = SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Apple Computer, Inc.\\QuickTime"), TEXT("InstallDir"), &type, (LPBYTE)&installationDirectoryStr, &installationDirectorySize);
-
- if (result == ERROR_SUCCESS && type == REG_SZ) {
- String pluginDir = String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1) + "\\plugins";
- directories.append(pluginDir);
- }
-}
-
-static inline void addAdobeAcrobatPluginDirectory(Vector<String>& directories)
-{
- HKEY key;
- HRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Adobe\\Acrobat Reader"), 0, KEY_READ, &key);
- if (result != ERROR_SUCCESS)
- return;
-
- WCHAR name[128];
- FILETIME lastModified;
-
- Vector<int> latestAcrobatVersion;
- String latestAcrobatVersionString;
-
- // Enumerate subkeys
- for (int i = 0;; i++) {
- DWORD nameLen = sizeof(name) / sizeof(WCHAR);
- result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
-
- if (result != ERROR_SUCCESS)
- break;
-
- Vector<int> acrobatVersion = parseVersionString(String(name, nameLen));
- if (compareVersions(acrobatVersion, latestAcrobatVersion)) {
- latestAcrobatVersion = acrobatVersion;
- latestAcrobatVersionString = String(name, nameLen);
- }
- }
-
- if (!latestAcrobatVersionString.isNull()) {
- DWORD type;
- WCHAR acrobatInstallPathStr[_MAX_PATH];
- DWORD acrobatInstallPathSize = sizeof(acrobatInstallPathStr);
-
- String acrobatPluginKeyPath = "Software\\Adobe\\Acrobat Reader\\" + latestAcrobatVersionString + "\\InstallPath";
- result = SHGetValue(HKEY_LOCAL_MACHINE, acrobatPluginKeyPath.charactersWithNullTermination(), 0, &type, (LPBYTE)acrobatInstallPathStr, &acrobatInstallPathSize);
-
- if (result == ERROR_SUCCESS) {
- String acrobatPluginDirectory = String(acrobatInstallPathStr, acrobatInstallPathSize / sizeof(WCHAR) - 1) + "\\browser";
- directories.append(acrobatPluginDirectory);
- }
- }
-
- RegCloseKey(key);
-}
-
-static inline void addJavaPluginDirectory(Vector<String>& directories)
-{
- HKEY key;
- HRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\JavaSoft\\Java Plug-in"), 0, KEY_READ, &key);
- if (result != ERROR_SUCCESS)
- return;
-
- WCHAR name[128];
- FILETIME lastModified;
-
- Vector<int> latestJavaVersion;
- String latestJavaVersionString;
-
- // Enumerate subkeys
- for (int i = 0;; i++) {
- DWORD nameLen = sizeof(name) / sizeof(WCHAR);
- result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
-
- if (result != ERROR_SUCCESS)
- break;
-
- Vector<int> javaVersion = parseVersionString(String(name, nameLen));
- if (compareVersions(javaVersion, latestJavaVersion)) {
- latestJavaVersion = javaVersion;
- latestJavaVersionString = String(name, nameLen);
- }
- }
-
- if (!latestJavaVersionString.isEmpty()) {
- DWORD type;
- WCHAR javaInstallPathStr[_MAX_PATH];
- DWORD javaInstallPathSize = sizeof(javaInstallPathStr);
- DWORD useNewPluginValue;
- DWORD useNewPluginSize;
-
- String javaPluginKeyPath = "Software\\JavaSoft\\Java Plug-in\\" + latestJavaVersionString;
- result = SHGetValue(HKEY_LOCAL_MACHINE, javaPluginKeyPath.charactersWithNullTermination(), TEXT("UseNewJavaPlugin"), &type, (LPVOID)&useNewPluginValue, &useNewPluginSize);
-
- if (result == ERROR_SUCCESS && useNewPluginValue == 1) {
- result = SHGetValue(HKEY_LOCAL_MACHINE, javaPluginKeyPath.charactersWithNullTermination(), TEXT("JavaHome"), &type, (LPBYTE)javaInstallPathStr, &javaInstallPathSize);
- if (result == ERROR_SUCCESS) {
- String javaPluginDirectory = String(javaInstallPathStr, javaInstallPathSize / sizeof(WCHAR) - 1) + "\\bin\\new_plugin";
- directories.append(javaPluginDirectory);
- }
- }
- }
-
- RegCloseKey(key);
-}
-
-static inline String safariPluginsDirectory()
-{
- WCHAR moduleFileNameStr[_MAX_PATH];
- static String pluginsDirectory;
- static bool cachedPluginDirectory = false;
-
- if (!cachedPluginDirectory) {
- cachedPluginDirectory = true;
-
- int moduleFileNameLen = GetModuleFileName(0, moduleFileNameStr, _MAX_PATH);
-
- if (!moduleFileNameLen || moduleFileNameLen == _MAX_PATH)
- goto exit;
-
- if (!PathRemoveFileSpec(moduleFileNameStr))
- goto exit;
-
- pluginsDirectory = String(moduleFileNameStr) + "\\Plugins";
- }
-exit:
- return pluginsDirectory;
-}
-
-static inline void addMacromediaPluginDirectories(Vector<String>& directories)
-{
-#if !OS(WINCE)
- WCHAR systemDirectoryStr[MAX_PATH];
-
- if (!GetSystemDirectory(systemDirectoryStr, WTF_ARRAY_LENGTH(systemDirectoryStr)))
- return;
-
- WCHAR macromediaDirectoryStr[MAX_PATH];
-
- PathCombine(macromediaDirectoryStr, systemDirectoryStr, TEXT("macromed\\Flash"));
- directories.append(macromediaDirectoryStr);
-
- PathCombine(macromediaDirectoryStr, systemDirectoryStr, TEXT("macromed\\Shockwave 10"));
- directories.append(macromediaDirectoryStr);
-#endif
-}
-
-Vector<String> PluginDatabase::defaultPluginDirectories()
-{
- Vector<String> directories;
- String ourDirectory = safariPluginsDirectory();
-
- if (!ourDirectory.isNull())
- directories.append(ourDirectory);
- addQuickTimePluginDirectory(directories);
- addAdobeAcrobatPluginDirectory(directories);
- addMozillaPluginDirectories(directories);
- addWindowsMediaPlayerPluginDirectory(directories);
- addMacromediaPluginDirectories(directories);
-#if PLATFORM(QT)
- addJavaPluginDirectory(directories);
-#endif
-
- return directories;
-}
-
-bool PluginDatabase::isPreferredPluginDirectory(const String& directory)
-{
- String ourDirectory = safariPluginsDirectory();
-
- if (!ourDirectory.isNull() && !directory.isNull())
- return ourDirectory == directory;
-
- return false;
-}
-
-}
diff --git a/WebCore/plugins/win/PluginMessageThrottlerWin.cpp b/WebCore/plugins/win/PluginMessageThrottlerWin.cpp
deleted file mode 100644
index c5f3081..0000000
--- a/WebCore/plugins/win/PluginMessageThrottlerWin.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2008 Collabora, Ltd. 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 APPLE INC. ``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 APPLE INC. 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.
- */
-
-#include "config.h"
-#include "PluginMessageThrottlerWin.h"
-
-#include "PluginView.h"
-#include <wtf/ASCIICType.h>
-#include <wtf/CurrentTime.h>
-
-using namespace WTF;
-
-namespace WebCore {
-
-// Set a timer to make sure we process any queued messages at least every 16ms.
-// This value allows Flash 60 messages/second, which should be enough for video
-// playback, and also gets us over the limit for kicking into high-resolution
-// timer mode (see SharedTimerWin.cpp).
-static const double MessageThrottleTimeInterval = 0.016;
-
-// During a continuous stream of messages, process one every 5ms.
-static const double MessageDirectProcessingInterval = 0.005;
-
-PluginMessageThrottlerWin::PluginMessageThrottlerWin(PluginView* pluginView)
- : m_pluginView(pluginView)
- , m_back(0)
- , m_front(0)
- , m_messageThrottleTimer(this, &PluginMessageThrottlerWin::messageThrottleTimerFired)
- , m_lastMessageTime(0)
-{
- // Initialize the free list with our inline messages
- for (unsigned i = 0; i < NumInlineMessages - 1; i++)
- m_inlineMessages[i].next = &m_inlineMessages[i + 1];
- m_inlineMessages[NumInlineMessages - 1].next = 0;
- m_freeInlineMessages = &m_inlineMessages[0];
-}
-
-PluginMessageThrottlerWin::~PluginMessageThrottlerWin()
-{
- PluginMessage* next;
-
- for (PluginMessage* message = m_front; message; message = next) {
- next = message->next;
- freeMessage(message);
- }
-}
-
-void PluginMessageThrottlerWin::appendMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- PluginMessage* message = allocateMessage();
-
- message->hWnd = hWnd;
- message->msg = msg;
- message->wParam = wParam;
- message->lParam = lParam;
- message->next = 0;
-
- if (m_back)
- m_back->next = message;
- m_back = message;
- if (!m_front)
- m_front = message;
-
- // If it has been more than MessageDirectProcessingInterval between throttled messages,
- // go ahead and process a message directly.
- double currentTime = WTF::currentTime();
- if (currentTime - m_lastMessageTime > MessageDirectProcessingInterval) {
- processQueuedMessage();
- m_lastMessageTime = currentTime;
- if (!m_front)
- return;
- }
-
- if (!m_messageThrottleTimer.isActive())
- m_messageThrottleTimer.startOneShot(MessageThrottleTimeInterval);
-}
-
-void PluginMessageThrottlerWin::processQueuedMessage()
-{
- PluginMessage* message = m_front;
- m_front = m_front->next;
- if (message == m_back)
- m_back = 0;
-
- // Protect the PluginView from destruction while calling its window proc.
- // <rdar://problem/6930280>
- RefPtr<PluginView> protect(m_pluginView);
- ::CallWindowProc(m_pluginView->pluginWndProc(), message->hWnd, message->msg, message->wParam, message->lParam);
-
- freeMessage(message);
-}
-
-void PluginMessageThrottlerWin::messageThrottleTimerFired(Timer<PluginMessageThrottlerWin>*)
-{
- processQueuedMessage();
-
- if (m_front)
- m_messageThrottleTimer.startOneShot(MessageThrottleTimeInterval);
-}
-
-PluginMessage* PluginMessageThrottlerWin::allocateMessage()
-{
- PluginMessage *message;
-
- if (m_freeInlineMessages) {
- message = m_freeInlineMessages;
- m_freeInlineMessages = message->next;
- } else
- message = new PluginMessage;
-
- return message;
-}
-
-bool PluginMessageThrottlerWin::isInlineMessage(PluginMessage* message)
-{
- return message >= &m_inlineMessages[0] && message <= &m_inlineMessages[NumInlineMessages - 1];
-}
-
-void PluginMessageThrottlerWin::freeMessage(PluginMessage* message)
-{
- if (isInlineMessage(message)) {
- message->next = m_freeInlineMessages;
- m_freeInlineMessages = message;
- } else
- delete message;
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/win/PluginMessageThrottlerWin.h b/WebCore/plugins/win/PluginMessageThrottlerWin.h
deleted file mode 100644
index 0a7be70..0000000
--- a/WebCore/plugins/win/PluginMessageThrottlerWin.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All Rights Reserved.
- * Copyright (C) 2008 Collabora, Ltd. 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 APPLE INC. ``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 APPLE INC. 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 PluginMessageThrottlerWin_h
-#define PluginMessageThrottlerWin_h
-
-#include "Timer.h"
-
-#include <windows.h>
-
-namespace WebCore {
- class PluginView;
-
- struct PluginMessage {
- HWND hWnd;
- UINT msg;
- WPARAM wParam;
- LPARAM lParam;
-
- struct PluginMessage* next;
- };
-
- class PluginMessageThrottlerWin {
- public:
- PluginMessageThrottlerWin(PluginView*);
- ~PluginMessageThrottlerWin();
-
- void appendMessage(HWND, UINT msg, WPARAM, LPARAM);
-
- private:
- void processQueuedMessage();
- void messageThrottleTimerFired(Timer<PluginMessageThrottlerWin>*);
- PluginMessage* allocateMessage();
- bool isInlineMessage(PluginMessage* message);
- void freeMessage(PluginMessage* message);
-
- PluginView* m_pluginView;
- PluginMessage* m_back;
- PluginMessage* m_front;
-
- static const int NumInlineMessages = 4;
- PluginMessage m_inlineMessages[NumInlineMessages];
- PluginMessage* m_freeInlineMessages;
-
- Timer<PluginMessageThrottlerWin> m_messageThrottleTimer;
- double m_lastMessageTime;
- };
-
-} // namespace WebCore
-
-#endif // PluginMessageThrottlerWin_h
diff --git a/WebCore/plugins/win/PluginPackageWin.cpp b/WebCore/plugins/win/PluginPackageWin.cpp
deleted file mode 100644
index 74bd2a9..0000000
--- a/WebCore/plugins/win/PluginPackageWin.cpp
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
- * Copyright (C) 2009 Torch Mobile, Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-
-#include "config.h"
-#include "PluginPackage.h"
-
-#include "MIMETypeRegistry.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include "Timer.h"
-#include "npruntime_impl.h"
-#include <string.h>
-#include <wtf/OwnArrayPtr.h>
-#include <wtf/text/CString.h>
-#include <shlwapi.h>
-
-namespace WebCore {
-
-static String getVersionInfo(const LPVOID versionInfoData, const String& info)
-{
- LPVOID buffer;
- UINT bufferLength;
- String subInfo = "\\StringfileInfo\\040904E4\\" + info;
- bool retval = VerQueryValueW(versionInfoData,
- const_cast<UChar*>(subInfo.charactersWithNullTermination()),
- &buffer, &bufferLength);
- if (!retval || bufferLength == 0)
- return String();
-
- // Subtract 1 from the length; we don't want the trailing null character.
- return String(reinterpret_cast<UChar*>(buffer), bufferLength - 1);
-}
-
-bool PluginPackage::isPluginBlacklisted()
-{
- if (name() == "Citrix ICA Client") {
- // The Citrix ICA Client plug-in requires a Mozilla-based browser; see <rdar://6418681>.
- return true;
- }
-
- if (name() == "Silverlight Plug-In") {
- // workaround for <rdar://5557379> Crash in Silverlight when opening microsoft.com.
- // the latest 1.0 version of Silverlight does not reproduce this crash, so allow it
- // and any newer versions
- static const PlatformModuleVersion slPluginMinRequired(0x51BE0000, 0x00010000);
-
- if (compareFileVersion(slPluginMinRequired) < 0)
- return true;
- } else if (fileName() == "npmozax.dll") {
- // Bug 15217: Mozilla ActiveX control complains about missing xpcom_core.dll
- return true;
- } else if (name() == "Yahoo Application State Plugin") {
- // https://bugs.webkit.org/show_bug.cgi?id=26860
- // Bug in Yahoo Application State plug-in earlier than 1.0.0.6 leads to heap corruption.
- static const PlatformModuleVersion yahooAppStatePluginMinRequired(0x00000006, 0x00010000);
- if (compareFileVersion(yahooAppStatePluginMinRequired) < 0)
- return true;
- }
-
- return false;
-}
-
-void PluginPackage::determineQuirks(const String& mimeType)
-{
- if (mimeType == "application/x-shockwave-flash") {
- static const PlatformModuleVersion flashTenVersion(0x00000000, 0x000a0000);
-
- // Pre 10 Flash only requests windowless plugins if we return a mozilla user agent
- if (compareFileVersion(flashTenVersion) < 0)
- m_quirks.add(PluginQuirkWantsMozillaUserAgent);
-
- m_quirks.add(PluginQuirkThrottleInvalidate);
- m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages);
- m_quirks.add(PluginQuirkFlashURLNotifyBug);
- }
-
- if (name().contains("Microsoft") && name().contains("Windows Media")) {
- // The WMP plugin sets its size on the first NPP_SetWindow call and never updates its size, so
- // call SetWindow when the plugin view has a correct size
- m_quirks.add(PluginQuirkDeferFirstSetWindowCall);
-
- // Windowless mode does not work at all with the WMP plugin so just remove that parameter
- // and don't pass it to the plug-in.
- m_quirks.add(PluginQuirkRemoveWindowlessVideoParam);
-
- // WMP has a modal message loop that it enters whenever we call it or
- // ask it to paint. This modal loop can deliver messages to other
- // windows in WebKit at times when they are not expecting them (for
- // example, delivering a WM_PAINT message during a layout), and these
- // can cause crashes.
- m_quirks.add(PluginQuirkHasModalMessageLoop);
- }
-
- if (name() == "VLC Multimedia Plugin" || name() == "VLC Multimedia Plug-in") {
- // VLC hangs on NPP_Destroy if we call NPP_SetWindow with a null window handle
- m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy);
-
- // VLC 0.8.6d and 0.8.6e crash if multiple instances are created.
- // <rdar://problem/5773070> tracks allowing multiple instances when this
- // bug is fixed.
- m_quirks.add(PluginQuirkDontAllowMultipleInstances);
- }
-
- // The DivX plugin sets its size on the first NPP_SetWindow call and never updates its size, so
- // call SetWindow when the plugin view has a correct size
- if (mimeType == "video/divx")
- m_quirks.add(PluginQuirkDeferFirstSetWindowCall);
-
- // FIXME: This is a workaround for a problem in our NPRuntime bindings; if a plug-in creates an
- // NPObject and passes it to a function it's not possible to see what root object that NPObject belongs to.
- // Thus, we don't know that the object should be invalidated when the plug-in instance goes away.
- // See <rdar://problem/5487742>.
- if (mimeType == "application/x-silverlight")
- m_quirks.add(PluginQuirkDontUnloadPlugin);
-
- if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
- // Because a single process cannot create multiple VMs, and we cannot reliably unload a
- // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM
- m_quirks.add(PluginQuirkDontUnloadPlugin);
-
- // Setting the window region to an empty region causes bad scrolling repaint problems
- // with the Java plug-in.
- m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling);
- }
-
- if (mimeType == "audio/x-pn-realaudio-plugin") {
- // Prevent the Real plugin from calling the Window Proc recursively, causing the stack to overflow.
- m_quirks.add(PluginQuirkDontCallWndProcForSameMessageRecursively);
-
- static const PlatformModuleVersion lastKnownUnloadableRealPlayerVersion(0x000B0B24, 0x00060000);
-
- // Unloading RealPlayer versions newer than 10.5 can cause a hang; see rdar://5669317.
- // FIXME: Resume unloading when this bug in the RealPlayer Plug-In is fixed (rdar://5713147)
- if (compareFileVersion(lastKnownUnloadableRealPlayerVersion) > 0)
- m_quirks.add(PluginQuirkDontUnloadPlugin);
- }
-}
-
-bool PluginPackage::fetchInfo()
-{
- DWORD versionInfoSize, zeroHandle;
- versionInfoSize = GetFileVersionInfoSizeW(const_cast<UChar*>(m_path.charactersWithNullTermination()), &zeroHandle);
- if (versionInfoSize == 0)
- return false;
-
- OwnArrayPtr<char> versionInfoData(new char[versionInfoSize]);
-
- if (!GetFileVersionInfoW(const_cast<UChar*>(m_path.charactersWithNullTermination()),
- 0, versionInfoSize, versionInfoData.get()))
- return false;
-
- m_name = getVersionInfo(versionInfoData.get(), "ProductName");
- m_description = getVersionInfo(versionInfoData.get(), "FileDescription");
- if (m_name.isNull() || m_description.isNull())
- return false;
-
- VS_FIXEDFILEINFO* info;
- UINT infoSize;
- if (!VerQueryValueW(versionInfoData.get(), L"\\", (LPVOID*) &info, &infoSize) || infoSize < sizeof(VS_FIXEDFILEINFO))
- return false;
- m_moduleVersion.leastSig = info->dwFileVersionLS;
- m_moduleVersion.mostSig = info->dwFileVersionMS;
-
- if (isPluginBlacklisted())
- return false;
-
- Vector<String> types;
- getVersionInfo(versionInfoData.get(), "MIMEType").split('|', types);
- Vector<String> extensionLists;
- getVersionInfo(versionInfoData.get(), "FileExtents").split('|', extensionLists);
- Vector<String> descriptions;
- getVersionInfo(versionInfoData.get(), "FileOpenName").split('|', descriptions);
-
- for (unsigned i = 0; i < types.size(); i++) {
- String type = types[i].lower();
- String description = i < descriptions.size() ? descriptions[i] : "";
- String extensionList = i < extensionLists.size() ? extensionLists[i] : "";
-
- Vector<String> extensionsVector;
- extensionList.split(',', extensionsVector);
-
- // Get rid of the extension list that may be at the end of the description string.
- int pos = description.find("(*");
- if (pos != -1) {
- // There might be a space that we need to get rid of.
- if (pos > 1 && description[pos - 1] == ' ')
- pos--;
- description = description.left(pos);
- }
-
- // Determine the quirks for the MIME types this plug-in supports
- determineQuirks(type);
-
- m_mimeToExtensions.add(type, extensionsVector);
- m_mimeToDescriptions.add(type, description);
- }
-
- return true;
-}
-
-bool PluginPackage::load()
-{
- if (m_freeLibraryTimer.isActive()) {
- ASSERT(m_module);
- m_freeLibraryTimer.stop();
- } else if (m_isLoaded) {
- if (m_quirks.contains(PluginQuirkDontAllowMultipleInstances))
- return false;
- m_loadCount++;
- return true;
- } else {
-#if OS(WINCE)
- m_module = ::LoadLibraryW(m_path.charactersWithNullTermination());
-#else
- WCHAR currentPath[MAX_PATH];
-
- if (!::GetCurrentDirectoryW(MAX_PATH, currentPath))
- return false;
-
- String path = m_path.substring(0, m_path.reverseFind('\\'));
-
- if (!::SetCurrentDirectoryW(path.charactersWithNullTermination()))
- return false;
-
- // Load the library
- m_module = ::LoadLibraryExW(m_path.charactersWithNullTermination(), 0, LOAD_WITH_ALTERED_SEARCH_PATH);
-
- if (!::SetCurrentDirectoryW(currentPath)) {
- if (m_module)
- ::FreeLibrary(m_module);
- return false;
- }
-#endif
- }
-
- if (!m_module)
- return false;
-
- m_isLoaded = true;
-
- NP_GetEntryPointsFuncPtr NP_GetEntryPoints = 0;
- NP_InitializeFuncPtr NP_Initialize = 0;
- NPError npErr;
-
-#if OS(WINCE)
- NP_Initialize = (NP_InitializeFuncPtr)GetProcAddress(m_module, L"NP_Initialize");
- NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)GetProcAddress(m_module, L"NP_GetEntryPoints");
- m_NPP_Shutdown = (NPP_ShutdownProcPtr)GetProcAddress(m_module, L"NP_Shutdown");
-#else
- NP_Initialize = (NP_InitializeFuncPtr)GetProcAddress(m_module, "NP_Initialize");
- NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)GetProcAddress(m_module, "NP_GetEntryPoints");
- m_NPP_Shutdown = (NPP_ShutdownProcPtr)GetProcAddress(m_module, "NP_Shutdown");
-#endif
-
- if (!NP_Initialize || !NP_GetEntryPoints || !m_NPP_Shutdown)
- goto abort;
-
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
-
- npErr = NP_GetEntryPoints(&m_pluginFuncs);
- LOG_NPERROR(npErr);
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- initializeBrowserFuncs();
-
- npErr = NP_Initialize(&m_browserFuncs);
- LOG_NPERROR(npErr);
-
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- m_loadCount++;
- return true;
-
-abort:
- unloadWithoutShutdown();
- return false;
-}
-
-unsigned PluginPackage::hash() const
-{
- const unsigned hashCodes[] = {
- m_name.impl()->hash(),
- m_description.impl()->hash(),
- m_mimeToExtensions.size()
- };
-
- return WTF::StringHasher::createBlobHash<sizeof(hashCodes)>(hashCodes);
-}
-
-bool PluginPackage::equal(const PluginPackage& a, const PluginPackage& b)
-{
- if (a.m_name != b.m_name)
- return false;
-
- if (a.m_description != b.m_description)
- return false;
-
- if (a.m_mimeToExtensions.size() != b.m_mimeToExtensions.size())
- return false;
-
- MIMEToExtensionsMap::const_iterator::Keys end = a.m_mimeToExtensions.end().keys();
- for (MIMEToExtensionsMap::const_iterator::Keys it = a.m_mimeToExtensions.begin().keys(); it != end; ++it) {
- if (!b.m_mimeToExtensions.contains(*it))
- return false;
- }
-
- return true;
-}
-
-uint16_t PluginPackage::NPVersion() const
-{
- return NP_VERSION_MINOR;
-}
-}
diff --git a/WebCore/plugins/win/PluginViewWin.cpp b/WebCore/plugins/win/PluginViewWin.cpp
deleted file mode 100644
index 758d90a..0000000
--- a/WebCore/plugins/win/PluginViewWin.cpp
+++ /dev/null
@@ -1,1080 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora Ltd. All rights reserved.
- * Copyright (C) 2008-2009 Torch Mobile, Inc. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
- */
-
-#include "config.h"
-#include "PluginView.h"
-
-#include "BitmapImage.h"
-#include "Bridge.h"
-#include "Chrome.h"
-#include "ChromeClient.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Element.h"
-#include "EventNames.h"
-#include "FocusController.h"
-#include "Frame.h"
-#include "FrameLoadRequest.h"
-#include "FrameLoader.h"
-#include "FrameTree.h"
-#include "FrameView.h"
-#include "GraphicsContext.h"
-#include "HTMLNames.h"
-#include "HTMLPlugInElement.h"
-#include "HostWindow.h"
-#include "Image.h"
-#include "JSDOMBinding.h"
-#include "JSDOMWindow.h"
-#include "KeyboardEvent.h"
-#include "LocalWindowsContext.h"
-#include "MIMETypeRegistry.h"
-#include "MouseEvent.h"
-#include "Page.h"
-#include "PlatformMouseEvent.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include "PluginMainThreadScheduler.h"
-#include "PluginMessageThrottlerWin.h"
-#include "PluginPackage.h"
-#include "RenderWidget.h"
-#include "ScriptController.h"
-#include "Settings.h"
-#include "WebCoreInstanceHandle.h"
-#include "c_instance.h"
-#include "npruntime_impl.h"
-#include "runtime_root.h"
-#include <runtime/JSLock.h>
-#include <runtime/JSValue.h>
-#include <wtf/ASCIICType.h>
-
-#if !PLATFORM(WX)
-#include "BitmapInfo.h"
-#endif
-
-#if OS(WINCE)
-#undef LOG_NPERROR
-#define LOG_NPERROR(x)
-#undef LOG_PLUGIN_NET_ERROR
-#define LOG_PLUGIN_NET_ERROR()
-#endif
-
-#if PLATFORM(CAIRO)
-#include <cairo-win32.h>
-#endif
-
-#if PLATFORM(QT)
-#include "QWebPageClient.h"
-#include <QWidget>
-#endif
-
-#if PLATFORM(WX)
-#include <wx/defs.h>
-#include <wx/window.h>
-#endif
-
-static inline HWND windowHandleForPageClient(PlatformPageClient client)
-{
-#if PLATFORM(QT)
- if (!client)
- return 0;
- if (QWidget* pluginParent = qobject_cast<QWidget*>(client->pluginParent()))
- return pluginParent->winId();
- return 0;
-#elif PLATFORM(WX)
- if (!client)
- return 0;
- return (HWND)client->GetHandle();
-#else
- return client;
-#endif
-}
-
-using JSC::ExecState;
-using JSC::JSLock;
-using JSC::JSObject;
-using JSC::UString;
-
-using std::min;
-
-using namespace WTF;
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-const LPCWSTR kWebPluginViewdowClassName = L"WebPluginView";
-const LPCWSTR kWebPluginViewProperty = L"WebPluginViewProperty";
-
-#if !OS(WINCE)
-// The code used to hook BeginPaint/EndPaint originally came from
-// <http://www.fengyuan.com/article/wmprint.html>.
-// Copyright (C) 2000 by Feng Yuan (www.fengyuan.com).
-
-static unsigned beginPaintSysCall;
-static BYTE* beginPaint;
-
-static unsigned endPaintSysCall;
-static BYTE* endPaint;
-
-typedef HDC (WINAPI *PtrBeginPaint)(HWND, PAINTSTRUCT*);
-typedef BOOL (WINAPI *PtrEndPaint)(HWND, const PAINTSTRUCT*);
-
-#if OS(WINDOWS) && CPU(X86_64) && COMPILER(MSVC)
-extern "C" HDC __stdcall _HBeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
-extern "C" BOOL __stdcall _HEndPaint(HWND hWnd, const PAINTSTRUCT* lpPaint);
-#endif
-
-HDC WINAPI PluginView::hookedBeginPaint(HWND hWnd, PAINTSTRUCT* lpPaint)
-{
- PluginView* pluginView = reinterpret_cast<PluginView*>(GetProp(hWnd, kWebPluginViewProperty));
- if (pluginView && pluginView->m_wmPrintHDC) {
- // We're secretly handling WM_PRINTCLIENT, so set up the PAINTSTRUCT so
- // that the plugin will paint into the HDC we provide.
- memset(lpPaint, 0, sizeof(PAINTSTRUCT));
- lpPaint->hdc = pluginView->m_wmPrintHDC;
- GetClientRect(hWnd, &lpPaint->rcPaint);
- return pluginView->m_wmPrintHDC;
- }
-
-#if COMPILER(GCC)
- HDC result;
- asm ("push %2\n"
- "push %3\n"
- "call *%4\n"
- : "=a" (result)
- : "a" (beginPaintSysCall), "g" (lpPaint), "g" (hWnd), "m" (beginPaint)
- : "memory"
- );
- return result;
-#elif defined(_M_IX86)
- // Call through to the original BeginPaint.
- __asm mov eax, beginPaintSysCall
- __asm push lpPaint
- __asm push hWnd
- __asm call beginPaint
-#else
- return _HBeginPaint(hWnd, lpPaint);
-#endif
-}
-
-BOOL WINAPI PluginView::hookedEndPaint(HWND hWnd, const PAINTSTRUCT* lpPaint)
-{
- PluginView* pluginView = reinterpret_cast<PluginView*>(GetProp(hWnd, kWebPluginViewProperty));
- if (pluginView && pluginView->m_wmPrintHDC) {
- // We're secretly handling WM_PRINTCLIENT, so we don't have to do any
- // cleanup.
- return TRUE;
- }
-
-#if COMPILER(GCC)
- BOOL result;
- asm ("push %2\n"
- "push %3\n"
- "call *%4\n"
- : "=a" (result)
- : "a" (endPaintSysCall), "g" (lpPaint), "g" (hWnd), "m" (endPaint)
- );
- return result;
-#elif defined (_M_IX86)
- // Call through to the original EndPaint.
- __asm mov eax, endPaintSysCall
- __asm push lpPaint
- __asm push hWnd
- __asm call endPaint
-#else
- return _HEndPaint(hWnd, lpPaint);
-#endif
-}
-
-static void hook(const char* module, const char* proc, unsigned& sysCallID, BYTE*& pProc, const void* pNewProc)
-{
- // See <http://www.fengyuan.com/article/wmprint.html> for an explanation of
- // how this function works.
-
- HINSTANCE hMod = GetModuleHandleA(module);
-
- pProc = reinterpret_cast<BYTE*>(reinterpret_cast<ptrdiff_t>(GetProcAddress(hMod, proc)));
-
-#if COMPILER(GCC) || defined(_M_IX86)
- if (pProc[0] != 0xB8)
- return;
-
- // FIXME: Should we be reading the bytes one-by-one instead of doing an
- // unaligned read?
- sysCallID = *reinterpret_cast<unsigned*>(pProc + 1);
-
- DWORD flOldProtect;
- if (!VirtualProtect(pProc, 5, PAGE_EXECUTE_READWRITE, &flOldProtect))
- return;
-
- pProc[0] = 0xE9;
- *reinterpret_cast<unsigned*>(pProc + 1) = reinterpret_cast<intptr_t>(pNewProc) - reinterpret_cast<intptr_t>(pProc + 5);
-
- pProc += 5;
-#else
- /* Disassembly of BeginPaint()
- 00000000779FC5B0 4C 8B D1 mov r10,rcx
- 00000000779FC5B3 B8 17 10 00 00 mov eax,1017h
- 00000000779FC5B8 0F 05 syscall
- 00000000779FC5BA C3 ret
- 00000000779FC5BB 90 nop
- 00000000779FC5BC 90 nop
- 00000000779FC5BD 90 nop
- 00000000779FC5BE 90 nop
- 00000000779FC5BF 90 nop
- 00000000779FC5C0 90 nop
- 00000000779FC5C1 90 nop
- 00000000779FC5C2 90 nop
- 00000000779FC5C3 90 nop
- */
- // Check for the signature as in the above disassembly
- DWORD guard = 0xB8D18B4C;
- if (*reinterpret_cast<DWORD*>(pProc) != guard)
- return;
-
- DWORD flOldProtect;
- VirtualProtect(pProc, 12, PAGE_EXECUTE_READWRITE, & flOldProtect);
- pProc[0] = 0x48; // mov rax, this
- pProc[1] = 0xb8;
- *(__int64*)(pProc+2) = (__int64)pNewProc;
- pProc[10] = 0xff; // jmp rax
- pProc[11] = 0xe0;
-#endif
-}
-
-static void setUpOffscreenPaintingHooks(HDC (WINAPI*hookedBeginPaint)(HWND, PAINTSTRUCT*), BOOL (WINAPI*hookedEndPaint)(HWND, const PAINTSTRUCT*))
-{
- static bool haveHooked = false;
- if (haveHooked)
- return;
- haveHooked = true;
-
- // Most (all?) windowed plugins don't seem to respond to WM_PRINTCLIENT, so
- // we hook into BeginPaint/EndPaint to allow their normal WM_PAINT handling
- // to draw into a given HDC. Note that this hooking affects the entire
- // process.
- hook("user32.dll", "BeginPaint", beginPaintSysCall, beginPaint, reinterpret_cast<const void *>(reinterpret_cast<ptrdiff_t>(hookedBeginPaint)));
- hook("user32.dll", "EndPaint", endPaintSysCall, endPaint, reinterpret_cast<const void *>(reinterpret_cast<ptrdiff_t>(hookedEndPaint)));
-
-}
-#endif
-
-static bool registerPluginView()
-{
- static bool haveRegisteredWindowClass = false;
- if (haveRegisteredWindowClass)
- return true;
-
- haveRegisteredWindowClass = true;
-
-#if PLATFORM(QT)
- WebCore::setInstanceHandle((HINSTANCE)(qWinAppInst()));
-#endif
-
- ASSERT(WebCore::instanceHandle());
-
-#if OS(WINCE)
- WNDCLASS wcex = { 0 };
-#else
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.hIconSm = 0;
-#endif
-
- wcex.style = CS_DBLCLKS;
-#if OS(WINCE)
- wcex.style |= CS_PARENTDC;
-#endif
- wcex.lpfnWndProc = DefWindowProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = WebCore::instanceHandle();
- wcex.hIcon = 0;
- wcex.hCursor = LoadCursor(0, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)COLOR_WINDOW;
- wcex.lpszMenuName = 0;
- wcex.lpszClassName = kWebPluginViewdowClassName;
-
-#if OS(WINCE)
- return !!RegisterClass(&wcex);
-#else
- return !!RegisterClassEx(&wcex);
-#endif
-}
-
-LRESULT CALLBACK PluginView::PluginViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- PluginView* pluginView = reinterpret_cast<PluginView*>(GetProp(hWnd, kWebPluginViewProperty));
-
- return pluginView->wndProc(hWnd, message, wParam, lParam);
-}
-
-static bool isWindowsMessageUserGesture(UINT message)
-{
- switch (message) {
- case WM_LBUTTONUP:
- case WM_MBUTTONUP:
- case WM_RBUTTONUP:
- case WM_KEYUP:
- return true;
- default:
- return false;
- }
-}
-
-LRESULT
-PluginView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- // <rdar://5711136> Sometimes Flash will call SetCapture before creating
- // a full-screen window and will not release it, which causes the
- // full-screen window to never receive mouse events. We set/release capture
- // on mouse down/up before sending the event to the plug-in to prevent that.
- switch (message) {
- case WM_LBUTTONDOWN:
- case WM_MBUTTONDOWN:
- case WM_RBUTTONDOWN:
- ::SetCapture(hWnd);
- break;
- case WM_LBUTTONUP:
- case WM_MBUTTONUP:
- case WM_RBUTTONUP:
- ::ReleaseCapture();
- break;
- }
-
- if (message == m_lastMessage &&
- m_plugin->quirks().contains(PluginQuirkDontCallWndProcForSameMessageRecursively) &&
- m_isCallingPluginWndProc)
- return 1;
-
- if (message == WM_USER + 1 &&
- m_plugin->quirks().contains(PluginQuirkThrottleWMUserPlusOneMessages)) {
- if (!m_messageThrottler)
- m_messageThrottler.set(new PluginMessageThrottlerWin(this));
-
- m_messageThrottler->appendMessage(hWnd, message, wParam, lParam);
- return 0;
- }
-
- m_lastMessage = message;
- m_isCallingPluginWndProc = true;
-
- // If the plug-in doesn't explicitly support changing the pop-up state, we enable
- // popups for all user gestures.
- // Note that we need to pop the state in a timer, because the Flash plug-in
- // pops up windows in response to a posted message.
- if (m_plugin->pluginFuncs()->version < NPVERS_HAS_POPUPS_ENABLED_STATE &&
- isWindowsMessageUserGesture(message) && !m_popPopupsStateTimer.isActive()) {
-
- pushPopupsEnabledState(true);
-
- m_popPopupsStateTimer.startOneShot(0);
- }
-
-#if !OS(WINCE)
- if (message == WM_PRINTCLIENT) {
- // Most (all?) windowed plugins don't respond to WM_PRINTCLIENT, so we
- // change the message to WM_PAINT and rely on our hooked versions of
- // BeginPaint/EndPaint to make the plugin draw into the given HDC.
- message = WM_PAINT;
- m_wmPrintHDC = reinterpret_cast<HDC>(wParam);
- }
-#endif
-
- // Call the plug-in's window proc.
- LRESULT result = ::CallWindowProc(m_pluginWndProc, hWnd, message, wParam, lParam);
-
- m_wmPrintHDC = 0;
-
- m_isCallingPluginWndProc = false;
-
- return result;
-}
-
-void PluginView::updatePluginWidget()
-{
- if (!parent())
- return;
-
- ASSERT(parent()->isFrameView());
- FrameView* frameView = static_cast<FrameView*>(parent());
-
- IntRect oldWindowRect = m_windowRect;
- IntRect oldClipRect = m_clipRect;
-
-#if OS(WINCE)
- m_windowRect = frameView->contentsToWindow(frameRect());
-#else
- m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
-#endif
- m_clipRect = windowClipRect();
- m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
-
- if (platformPluginWidget() && (!m_haveUpdatedPluginWidget || m_windowRect != oldWindowRect || m_clipRect != oldClipRect)) {
- HRGN rgn;
-
- setCallingPlugin(true);
-
- // To prevent flashes while scrolling, we disable drawing during the window
- // update process by clipping the window to the zero rect.
-
- bool clipToZeroRect = !m_plugin->quirks().contains(PluginQuirkDontClipToZeroRectWhenScrolling);
-
- if (clipToZeroRect) {
- rgn = ::CreateRectRgn(0, 0, 0, 0);
- ::SetWindowRgn(platformPluginWidget(), rgn, FALSE);
- } else {
- rgn = ::CreateRectRgn(m_clipRect.x(), m_clipRect.y(), m_clipRect.right(), m_clipRect.bottom());
- ::SetWindowRgn(platformPluginWidget(), rgn, TRUE);
- }
-
- if (!m_haveUpdatedPluginWidget || m_windowRect != oldWindowRect)
- ::MoveWindow(platformPluginWidget(), m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height(), TRUE);
-
- if (clipToZeroRect) {
- rgn = ::CreateRectRgn(m_clipRect.x(), m_clipRect.y(), m_clipRect.right(), m_clipRect.bottom());
- ::SetWindowRgn(platformPluginWidget(), rgn, TRUE);
- }
-
- setCallingPlugin(false);
-
- m_haveUpdatedPluginWidget = true;
- }
-}
-
-void PluginView::setFocus(bool focused)
-{
- if (focused && platformPluginWidget())
- SetFocus(platformPluginWidget());
-
- Widget::setFocus(focused);
-}
-
-void PluginView::show()
-{
- setSelfVisible(true);
-
- if (isParentVisible() && platformPluginWidget())
- ShowWindow(platformPluginWidget(), SW_SHOWNA);
-
- Widget::show();
-}
-
-void PluginView::hide()
-{
- setSelfVisible(false);
-
- if (isParentVisible() && platformPluginWidget())
- ShowWindow(platformPluginWidget(), SW_HIDE);
-
- Widget::hide();
-}
-
-bool PluginView::dispatchNPEvent(NPEvent& npEvent)
-{
- if (!m_plugin->pluginFuncs()->event)
- return true;
-
- bool shouldPop = false;
-
- if (m_plugin->pluginFuncs()->version < NPVERS_HAS_POPUPS_ENABLED_STATE && isWindowsMessageUserGesture(npEvent.event)) {
- pushPopupsEnabledState(true);
- shouldPop = true;
- }
-
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
- bool result = m_plugin->pluginFuncs()->event(m_instance, &npEvent);
- setCallingPlugin(false);
-
- if (shouldPop)
- popPopupsEnabledState();
-
- return result;
-}
-
-void PluginView::paintIntoTransformedContext(HDC hdc)
-{
- if (m_isWindowed) {
-#if !OS(WINCE)
- SendMessage(platformPluginWidget(), WM_PRINTCLIENT, reinterpret_cast<WPARAM>(hdc), PRF_CLIENT | PRF_CHILDREN | PRF_OWNED);
-#endif
- return;
- }
-
- m_npWindow.type = NPWindowTypeDrawable;
- m_npWindow.window = hdc;
-
- WINDOWPOS windowpos = { 0, 0, 0, 0, 0, 0, 0 };
-
- IntRect r = static_cast<FrameView*>(parent())->contentsToWindow(frameRect());
-
- windowpos.x = r.x();
- windowpos.y = r.y();
- windowpos.cx = r.width();
- windowpos.cy = r.height();
-
- NPEvent npEvent;
- npEvent.event = WM_WINDOWPOSCHANGED;
- npEvent.lParam = reinterpret_cast<uintptr_t>(&windowpos);
- npEvent.wParam = 0;
-
- dispatchNPEvent(npEvent);
-
- setNPWindowRect(frameRect());
-
- npEvent.event = WM_PAINT;
- npEvent.wParam = reinterpret_cast<uintptr_t>(hdc);
-
- // This is supposed to be a pointer to the dirty rect, but it seems that the Flash plugin
- // ignores it so we just pass null.
- npEvent.lParam = 0;
-
- dispatchNPEvent(npEvent);
-}
-
-void PluginView::paintWindowedPluginIntoContext(GraphicsContext* context, const IntRect& rect)
-{
-#if !OS(WINCE)
- ASSERT(m_isWindowed);
- ASSERT(context->shouldIncludeChildWindows());
-
- ASSERT(parent()->isFrameView());
- IntPoint locationInWindow = static_cast<FrameView*>(parent())->contentsToWindow(frameRect().location());
-
- LocalWindowsContext windowsContext(context, frameRect(), false);
-
-#if PLATFORM(CAIRO)
- // Must flush drawings up to this point to the backing metafile, otherwise the
- // plugin region will be overwritten with any clear regions specified in the
- // cairo-controlled portions of the rendering.
- PlatformGraphicsContext* ctx = context->platformContext();
- cairo_show_page(ctx);
-#endif
-
- HDC hdc = windowsContext.hdc();
- XFORM originalTransform;
- GetWorldTransform(hdc, &originalTransform);
-
- // The plugin expects the DC to be in client coordinates, so we translate
- // the DC to make that so.
- AffineTransform ctm = context->getCTM();
- ctm.translate(locationInWindow.x(), locationInWindow.y());
- XFORM transform = static_cast<XFORM>(ctm.toTransformationMatrix());
-
- SetWorldTransform(hdc, &transform);
-
- paintIntoTransformedContext(hdc);
-
- SetWorldTransform(hdc, &originalTransform);
-#endif
-}
-
-void PluginView::paint(GraphicsContext* context, const IntRect& rect)
-{
- if (!m_isStarted) {
- // Draw the "missing plugin" image
- paintMissingPluginIcon(context, rect);
- return;
- }
-
- if (context->paintingDisabled())
- return;
-
- // Ensure that we have called SetWindow before we try to paint.
- if (!m_haveCalledSetWindow)
- setNPWindowRect(frameRect());
-
- if (m_isWindowed) {
-#if !OS(WINCE)
- if (context->shouldIncludeChildWindows())
- paintWindowedPluginIntoContext(context, rect);
-#endif
- return;
- }
-
- ASSERT(parent()->isFrameView());
- IntRect rectInWindow = static_cast<FrameView*>(parent())->contentsToWindow(frameRect());
- LocalWindowsContext windowsContext(context, rectInWindow, m_isTransparent);
-
- // On Safari/Windows without transparency layers the GraphicsContext returns the HDC
- // of the window and the plugin expects that the passed in DC has window coordinates.
- // In the Qt port we always draw in an offscreen buffer and therefore need to preserve
- // the translation set in getWindowsContext.
-#if !PLATFORM(QT) && !OS(WINCE)
- if (!context->inTransparencyLayer()) {
- XFORM transform;
- GetWorldTransform(windowsContext.hdc(), &transform);
- transform.eDx = 0;
- transform.eDy = 0;
- SetWorldTransform(windowsContext.hdc(), &transform);
- }
-#endif
-
- paintIntoTransformedContext(windowsContext.hdc());
-}
-
-void PluginView::handleKeyboardEvent(KeyboardEvent* event)
-{
- NPEvent npEvent;
-
- npEvent.wParam = event->keyCode();
-
- if (event->type() == eventNames().keydownEvent) {
- npEvent.event = WM_KEYDOWN;
- npEvent.lParam = 0;
- } else if (event->type() == eventNames().keyupEvent) {
- npEvent.event = WM_KEYUP;
- npEvent.lParam = 0x8000;
- }
-
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- if (!dispatchNPEvent(npEvent))
- event->setDefaultHandled();
-}
-
-#if !OS(WINCE)
-extern bool ignoreNextSetCursor;
-#endif
-
-void PluginView::handleMouseEvent(MouseEvent* event)
-{
- NPEvent npEvent;
-
- IntPoint p = static_cast<FrameView*>(parent())->contentsToWindow(IntPoint(event->pageX(), event->pageY()));
-
- npEvent.lParam = MAKELPARAM(p.x(), p.y());
- npEvent.wParam = 0;
-
- if (event->ctrlKey())
- npEvent.wParam |= MK_CONTROL;
- if (event->shiftKey())
- npEvent.wParam |= MK_SHIFT;
-
- if (event->type() == eventNames().mousemoveEvent ||
- event->type() == eventNames().mouseoutEvent ||
- event->type() == eventNames().mouseoverEvent) {
- npEvent.event = WM_MOUSEMOVE;
- if (event->buttonDown())
- switch (event->button()) {
- case LeftButton:
- npEvent.wParam |= MK_LBUTTON;
- break;
- case MiddleButton:
- npEvent.wParam |= MK_MBUTTON;
- break;
- case RightButton:
- npEvent.wParam |= MK_RBUTTON;
- break;
- }
- }
- else if (event->type() == eventNames().mousedownEvent) {
- focusPluginElement();
- switch (event->button()) {
- case 0:
- npEvent.event = WM_LBUTTONDOWN;
- break;
- case 1:
- npEvent.event = WM_MBUTTONDOWN;
- break;
- case 2:
- npEvent.event = WM_RBUTTONDOWN;
- break;
- }
- } else if (event->type() == eventNames().mouseupEvent) {
- switch (event->button()) {
- case 0:
- npEvent.event = WM_LBUTTONUP;
- break;
- case 1:
- npEvent.event = WM_MBUTTONUP;
- break;
- case 2:
- npEvent.event = WM_RBUTTONUP;
- break;
- }
- } else
- return;
-
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- if (!dispatchNPEvent(npEvent))
- event->setDefaultHandled();
-
-#if !PLATFORM(QT) && !PLATFORM(WX) && !OS(WINCE)
- // Currently, Widget::setCursor is always called after this function in EventHandler.cpp
- // and since we don't want that we set ignoreNextSetCursor to true here to prevent that.
- ignoreNextSetCursor = true;
- if (Page* page = m_parentFrame->page())
- page->chrome()->client()->setLastSetCursorToCurrentCursor();
-#endif
-}
-
-void PluginView::setParent(ScrollView* parent)
-{
- Widget::setParent(parent);
-
-#if OS(WINCE)
- if (parent) {
- init();
- if (parent->isVisible())
- show();
- else
- hide();
- }
-#else
- if (parent)
- init();
- else {
- if (!platformPluginWidget())
- return;
-
- // If the plug-in window or one of its children have the focus, we need to
- // clear it to prevent the web view window from being focused because that can
- // trigger a layout while the plugin element is being detached.
- HWND focusedWindow = ::GetFocus();
- if (platformPluginWidget() == focusedWindow || ::IsChild(platformPluginWidget(), focusedWindow))
- ::SetFocus(0);
- }
-#endif
-}
-
-void PluginView::setParentVisible(bool visible)
-{
- if (isParentVisible() == visible)
- return;
-
- Widget::setParentVisible(visible);
-
- if (isSelfVisible() && platformPluginWidget()) {
- if (visible)
- ShowWindow(platformPluginWidget(), SW_SHOWNA);
- else
- ShowWindow(platformPluginWidget(), SW_HIDE);
- }
-}
-
-void PluginView::setNPWindowRect(const IntRect& rect)
-{
- if (!m_isStarted)
- return;
-
-#if OS(WINCE)
- IntRect r = static_cast<FrameView*>(parent())->contentsToWindow(rect);
- m_npWindow.x = r.x();
- m_npWindow.y = r.y();
-
- m_npWindow.width = r.width();
- m_npWindow.height = r.height();
-
- m_npWindow.clipRect.right = r.width();
- m_npWindow.clipRect.bottom = r.height();
-#else
- IntPoint p = static_cast<FrameView*>(parent())->contentsToWindow(rect.location());
- m_npWindow.x = p.x();
- m_npWindow.y = p.y();
-
- m_npWindow.width = rect.width();
- m_npWindow.height = rect.height();
-
- m_npWindow.clipRect.right = rect.width();
- m_npWindow.clipRect.bottom = rect.height();
-#endif
- m_npWindow.clipRect.left = 0;
- m_npWindow.clipRect.top = 0;
-
- if (m_plugin->pluginFuncs()->setwindow) {
- JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
- setCallingPlugin(true);
- m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
- setCallingPlugin(false);
-
- m_haveCalledSetWindow = true;
-
- if (!m_isWindowed)
- return;
-
- ASSERT(platformPluginWidget());
-
-#if OS(WINCE)
- if (!m_pluginWndProc) {
- WNDPROC currentWndProc = (WNDPROC)GetWindowLong(platformPluginWidget(), GWL_WNDPROC);
- if (currentWndProc != PluginViewWndProc)
- m_pluginWndProc = (WNDPROC)SetWindowLong(platformPluginWidget(), GWL_WNDPROC, (LONG)PluginViewWndProc);
- }
-#else
- WNDPROC currentWndProc = (WNDPROC)GetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC);
- if (currentWndProc != PluginViewWndProc)
- m_pluginWndProc = (WNDPROC)SetWindowLongPtr(platformPluginWidget(), GWLP_WNDPROC, (LONG_PTR)PluginViewWndProc);
-#endif
- }
-}
-
-NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
-{
- String filename(buf, len);
-
- if (filename.startsWith("file:///"))
- filename = filename.substring(8);
-
- // Get file info
- WIN32_FILE_ATTRIBUTE_DATA attrs;
- if (GetFileAttributesExW(filename.charactersWithNullTermination(), GetFileExInfoStandard, &attrs) == 0)
- return NPERR_FILE_NOT_FOUND;
-
- if (attrs.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- return NPERR_FILE_NOT_FOUND;
-
- HANDLE fileHandle = CreateFileW(filename.charactersWithNullTermination(), FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
-
- if (fileHandle == INVALID_HANDLE_VALUE)
- return NPERR_FILE_NOT_FOUND;
-
- buffer.resize(attrs.nFileSizeLow);
-
- DWORD bytesRead;
- int retval = ReadFile(fileHandle, buffer.data(), attrs.nFileSizeLow, &bytesRead, 0);
-
- CloseHandle(fileHandle);
-
- if (retval == 0 || bytesRead != attrs.nFileSizeLow)
- return NPERR_FILE_NOT_FOUND;
-
- return NPERR_NO_ERROR;
-}
-
-bool PluginView::platformGetValueStatic(NPNVariable, void*, NPError*)
-{
- return false;
-}
-
-bool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result)
-{
- switch (variable) {
- case NPNVnetscapeWindow: {
- HWND* w = reinterpret_cast<HWND*>(value);
- *w = windowHandleForPageClient(parent() ? parent()->hostWindow()->platformPageClient() : 0);
- *result = NPERR_NO_ERROR;
- return true;
- }
-
- case NPNVSupportsWindowless: {
- NPBool* flag = reinterpret_cast<NPBool*>(value);
- *flag = TRUE;
- *result = NPERR_NO_ERROR;
- return true;
- }
-
- default:
- return false;
- }
-}
-
-void PluginView::invalidateRect(const IntRect& rect)
-{
- if (m_isWindowed) {
- RECT invalidRect = { rect.x(), rect.y(), rect.right(), rect.bottom() };
- ::InvalidateRect(platformPluginWidget(), &invalidRect, false);
- return;
- }
-
- invalidateWindowlessPluginRect(rect);
-}
-
-void PluginView::invalidateRect(NPRect* rect)
-{
- if (!rect) {
- invalidate();
- return;
- }
-
- IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
-
- if (m_isWindowed) {
- RECT invalidRect = { r.x(), r.y(), r.right(), r.bottom() };
- InvalidateRect(platformPluginWidget(), &invalidRect, FALSE);
- } else {
- if (m_plugin->quirks().contains(PluginQuirkThrottleInvalidate)) {
- m_invalidRects.append(r);
- if (!m_invalidateTimer.isActive())
- m_invalidateTimer.startOneShot(0.001);
- } else
- invalidateRect(r);
- }
-}
-
-void PluginView::invalidateRegion(NPRegion region)
-{
- if (m_isWindowed)
- return;
-
- RECT r;
-
- if (GetRgnBox(region, &r) == 0) {
- invalidate();
- return;
- }
-
- IntRect rect(IntPoint(r.left, r.top), IntSize(r.right-r.left, r.bottom-r.top));
- invalidateRect(rect);
-}
-
-void PluginView::forceRedraw()
-{
- if (m_isWindowed)
- ::UpdateWindow(platformPluginWidget());
- else
- ::UpdateWindow(windowHandleForPageClient(parent() ? parent()->hostWindow()->platformPageClient() : 0));
-}
-
-bool PluginView::platformStart()
-{
- ASSERT(m_isStarted);
- ASSERT(m_status == PluginStatusLoadedSuccessfully);
-
- if (m_isWindowed) {
- registerPluginView();
-#if !OS(WINCE)
- setUpOffscreenPaintingHooks(hookedBeginPaint, hookedEndPaint);
-#endif
-
- DWORD flags = WS_CHILD;
- if (isSelfVisible())
- flags |= WS_VISIBLE;
-
- HWND parentWindowHandle = windowHandleForPageClient(m_parentFrame->view()->hostWindow()->platformPageClient());
- HWND window = ::CreateWindowEx(0, kWebPluginViewdowClassName, 0, flags,
- 0, 0, 0, 0, parentWindowHandle, 0, WebCore::instanceHandle(), 0);
-
-#if OS(WINDOWS) && (PLATFORM(QT) || PLATFORM(WX))
- m_window = window;
-#else
- setPlatformWidget(window);
-#endif
-
- // Calling SetWindowLongPtrA here makes the window proc ASCII, which is required by at least
- // the Shockwave Director plug-in.
-#if OS(WINDOWS) && CPU(X86_64)
- ::SetWindowLongPtrA(platformPluginWidget(), GWLP_WNDPROC, (LONG_PTR)DefWindowProcA);
-#elif OS(WINCE)
- ::SetWindowLong(platformPluginWidget(), GWL_WNDPROC, (LONG)DefWindowProc);
-#else
- ::SetWindowLongPtrA(platformPluginWidget(), GWL_WNDPROC, (LONG)DefWindowProcA);
-#endif
- SetProp(platformPluginWidget(), kWebPluginViewProperty, this);
-
- m_npWindow.type = NPWindowTypeWindow;
- m_npWindow.window = platformPluginWidget();
- } else {
- m_npWindow.type = NPWindowTypeDrawable;
- m_npWindow.window = 0;
- }
-
- updatePluginWidget();
-
- if (!m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))
- setNPWindowRect(frameRect());
-
- return true;
-}
-
-void PluginView::platformDestroy()
-{
- if (!platformPluginWidget())
- return;
-
- DestroyWindow(platformPluginWidget());
- setPlatformPluginWidget(0);
-}
-
-PassRefPtr<Image> PluginView::snapshot()
-{
-#if !PLATFORM(WX) && !OS(WINCE)
- OwnPtr<HDC> hdc(CreateCompatibleDC(0));
-
- if (!m_isWindowed) {
- // Enable world transforms.
- SetGraphicsMode(hdc.get(), GM_ADVANCED);
-
- XFORM transform;
- GetWorldTransform(hdc.get(), &transform);
-
- // Windowless plug-ins assume that they're drawing onto the view's DC.
- // Translate the context so that the plug-in draws at (0, 0).
- ASSERT(parent()->isFrameView());
- IntPoint position = static_cast<FrameView*>(parent())->contentsToWindow(frameRect()).location();
- transform.eDx = -position.x();
- transform.eDy = -position.y();
- SetWorldTransform(hdc.get(), &transform);
- }
-
- void* bits;
- BitmapInfo bmp = BitmapInfo::createBottomUp(frameRect().size());
- OwnPtr<HBITMAP> hbmp(CreateDIBSection(0, &bmp, DIB_RGB_COLORS, &bits, 0, 0));
-
- HBITMAP hbmpOld = static_cast<HBITMAP>(SelectObject(hdc.get(), hbmp.get()));
-
- paintIntoTransformedContext(hdc.get());
-
- SelectObject(hdc.get(), hbmpOld);
-
- return BitmapImage::create(hbmp.get());
-#else
- return 0;
-#endif
-}
-
-void PluginView::halt()
-{
- ASSERT(!m_isHalted);
- ASSERT(m_isStarted);
-
-#if !PLATFORM(QT)
- // Show a screenshot of the plug-in.
- toRenderWidget(m_element->renderer())->showSubstituteImage(snapshot());
-#endif
-
- m_isHalted = true;
- m_hasBeenHalted = true;
-
- stop();
- platformDestroy();
-}
-
-void PluginView::restart()
-{
- ASSERT(!m_isStarted);
- ASSERT(m_isHalted);
-
- // Clear any substitute image.
- toRenderWidget(m_element->renderer())->showSubstituteImage(0);
-
- m_isHalted = false;
- m_haveUpdatedPluginWidget = false;
- start();
-}
-
-} // namespace WebCore
diff --git a/WebCore/plugins/wx/PluginDataWx.cpp b/WebCore/plugins/wx/PluginDataWx.cpp
deleted file mode 100644
index a595c82..0000000
--- a/WebCore/plugins/wx/PluginDataWx.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2008 Kevin Ollivier <kevino@theolliviers.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 APPLE INC. ``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 APPLE INC. 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.
- */
-
-
-#include "config.h"
-#include "PluginData.h"
-
-#include "NotImplemented.h"
-#include "PluginDatabase.h"
-#include "PluginPackage.h"
-
-namespace WebCore {
-
-void PluginData::initPlugins()
-{
- PluginDatabase* db = PluginDatabase::installedPlugins();
- const Vector<PluginPackage*> &plugins = db->plugins();
-
- for (unsigned int i = 0; i < plugins.size(); ++i) {
- PluginInfo info;
- PluginPackage* package = plugins[i];
-
- info.name = package->name();
- info.file = package->fileName();
- info.desc = package->description();
-
- const MIMEToDescriptionsMap& mimeToDescriptions = package->mimeToDescriptions();
- MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
- for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
- MimeClassInfo mime;
-
- mime.type = it->first;
- mime.desc = it->second;
- mime.extensions = package->mimeToExtensions().get(mime.type);
-
- info.mimes.append(mime);
- }
-
- m_plugins.append(info);
- }
-}
-
-void PluginData::refresh()
-{
- notImplemented();
-}
-
-};