summaryrefslogtreecommitdiffstats
path: root/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp')
-rw-r--r--WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp b/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp
new file mode 100644
index 0000000..a097bf7
--- /dev/null
+++ b/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 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 "QtPlatformPlugin.h"
+
+#include "qwebkitplatformplugin.h"
+
+#include <QCoreApplication>
+#include <QDir>
+#include <QPluginLoader>
+
+namespace WebCore {
+
+class SelectData : public QWebSelectData {
+public:
+ SelectData(QtAbstractWebPopup* data) : d(data) {}
+
+ virtual ItemType itemType(int) const;
+ virtual QString itemText(int index) const { return d->itemText(index); }
+ virtual QString itemToolTip(int index) const { return d->itemToolTip(index); }
+ virtual bool itemIsEnabled(int index) const { return d->itemIsEnabled(index); }
+ virtual int itemCount() const { return d->itemCount(); }
+ virtual bool itemIsSelected(int index) const { return d->itemIsSelected(index); }
+ virtual bool multiple() const { return d->multiple(); }
+
+private:
+ QtAbstractWebPopup* d;
+};
+
+QWebSelectData::ItemType SelectData::itemType(int index) const
+{
+ switch (d->itemType(index)) {
+ case QtAbstractWebPopup::Separator: return Separator;
+ case QtAbstractWebPopup::Group: return Group;
+ default: return Option;
+ }
+}
+
+SelectInputMethodWrapper::SelectInputMethodWrapper(QWebSelectMethod* plugin)
+ : m_plugin(plugin)
+{
+ m_plugin->setParent(this);
+ connect(m_plugin, SIGNAL(didHide()), this, SLOT(didHide()));
+ connect(m_plugin, SIGNAL(selectItem(int, bool, bool)), this, SLOT(selectItem(int, bool, bool)));
+}
+
+void SelectInputMethodWrapper::show()
+{
+ SelectData data(this);
+ m_plugin->show(data);
+}
+
+void SelectInputMethodWrapper::hide()
+{
+ m_plugin->hide();
+}
+
+void SelectInputMethodWrapper::selectItem(int index, bool allowMultiplySelections, bool shift)
+{
+ QtAbstractWebPopup::selectItem(index, allowMultiplySelections, shift);
+}
+
+void SelectInputMethodWrapper::didHide()
+{
+ QtAbstractWebPopup::popupDidHide();
+}
+
+// QtPlatformPlugin
+
+static QWebKitPlatformPlugin* getPluginObject()
+{
+ const QLatin1String suffix("/webkit/");
+ const QStringList paths = QCoreApplication::libraryPaths();
+ QObject* obj = 0;
+ for (int i = 0; !obj && i < paths.count(); ++i) {
+ const QDir dir(paths[i] + suffix);
+ if (!dir.exists())
+ continue;
+ const QStringList files = dir.entryList(QDir::Files);
+ for (int i = 0; i < files.count(); ++i) {
+ QPluginLoader pluginLoader(dir.absoluteFilePath(files.at(i)));
+ if (!pluginLoader.load())
+ continue;
+ obj = pluginLoader.instance();
+ if (obj) {
+ QWebKitPlatformPlugin* result = qobject_cast<QWebKitPlatformPlugin*>(obj);
+ if (result)
+ return result;
+ delete obj;
+ }
+ pluginLoader.unload();
+ }
+ }
+ return 0;
+}
+
+QtPlatformPlugin::~QtPlatformPlugin()
+{
+ delete m_plugin;
+}
+
+QWebKitPlatformPlugin* QtPlatformPlugin::plugin()
+{
+ if (m_loaded)
+ return m_plugin;
+
+ m_loaded = true;
+ m_plugin = getPluginObject();
+ return m_plugin;
+}
+
+QtAbstractWebPopup* QtPlatformPlugin::createSelectInputMethod()
+{
+ QWebKitPlatformPlugin* p = plugin();
+ if (!p)
+ return 0;
+
+ QWebSelectMethod* selector = p->createSelectInputMethod();
+ if (!selector)
+ return 0;
+
+ return new SelectInputMethodWrapper(selector);
+}
+
+}