1 /* 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 * 19 */ 20 21 #include "config.h" 22 #include "QtPlatformPlugin.h" 23 24 #include "qwebkitplatformplugin.h" 25 26 #include <QCoreApplication> 27 #include <QDir> 28 #include <QPluginLoader> 29 30 namespace WebCore { 31 32 bool QtPlatformPlugin::load(const QString& file) 33 { 34 m_loader.setFileName(file); 35 if (!m_loader.load()) 36 return false; 37 38 QObject* obj = m_loader.instance(); 39 if (obj) { 40 m_plugin = qobject_cast<QWebKitPlatformPlugin*>(obj); 41 if (m_plugin) 42 return true; 43 } 44 45 m_loader.unload(); 46 return false; 47 } 48 49 bool QtPlatformPlugin::load() 50 { 51 const QLatin1String suffix("/webkit/"); 52 const QStringList paths = QCoreApplication::libraryPaths(); 53 54 for (int i = 0; i < paths.count(); ++i) { 55 const QDir dir(paths[i] + suffix); 56 if (!dir.exists()) 57 continue; 58 const QStringList files = dir.entryList(QDir::Files); 59 for (int j = 0; j < files.count(); ++j) { 60 if (load(dir.absoluteFilePath(files.at(j)))) 61 return true; 62 } 63 } 64 return false; 65 } 66 67 QtPlatformPlugin::~QtPlatformPlugin() 68 { 69 m_loader.unload(); 70 } 71 72 bool QtPlatformPlugin::loadStaticallyLinkedPlugin() 73 { 74 QObjectList objs = QPluginLoader::staticInstances(); 75 for (int i = 0; i < objs.size(); ++i) { 76 m_plugin = qobject_cast<QWebKitPlatformPlugin*>(objs[i]); 77 if (m_plugin) 78 return true; 79 } 80 return false; 81 } 82 83 QWebKitPlatformPlugin* QtPlatformPlugin::plugin() 84 { 85 if (m_loaded) 86 return m_plugin; 87 m_loaded = true; 88 89 if (loadStaticallyLinkedPlugin()) 90 return m_plugin; 91 92 // Plugin path is stored in a static variable to avoid searching for the plugin 93 // more then once. 94 static QString pluginPath; 95 96 if (pluginPath.isNull()) { 97 if (load()) 98 pluginPath = m_loader.fileName(); 99 } else 100 load(pluginPath); 101 102 return m_plugin; 103 } 104 105 QWebSelectMethod* QtPlatformPlugin::createSelectInputMethod() 106 { 107 QWebKitPlatformPlugin* p = plugin(); 108 return p ? static_cast<QWebSelectMethod*>(p->createExtension(QWebKitPlatformPlugin::MultipleSelections)) : 0; 109 } 110 111 112 QWebNotificationPresenter* QtPlatformPlugin::createNotificationPresenter() 113 { 114 QWebKitPlatformPlugin* p = plugin(); 115 return p ? static_cast<QWebNotificationPresenter*>(p->createExtension(QWebKitPlatformPlugin::Notifications)) : 0; 116 } 117 118 QWebHapticFeedbackPlayer* QtPlatformPlugin::createHapticFeedbackPlayer() 119 { 120 QWebKitPlatformPlugin* p = plugin(); 121 return p ? static_cast<QWebHapticFeedbackPlayer*>(p->createExtension(QWebKitPlatformPlugin::Haptics)) : 0; 122 } 123 124 QWebTouchModifier* QtPlatformPlugin::createTouchModifier() 125 { 126 QWebKitPlatformPlugin* p = plugin(); 127 return p ? static_cast<QWebTouchModifier*>(p->createExtension(QWebKitPlatformPlugin::TouchInteraction)) : 0; 128 } 129 130 #if ENABLE(VIDEO) && USE(QT_MULTIMEDIA) 131 QWebFullScreenVideoHandler* QtPlatformPlugin::createFullScreenVideoHandler() 132 { 133 QWebKitPlatformPlugin* p = plugin(); 134 return p ? static_cast<QWebFullScreenVideoHandler*>(p->createExtension(QWebKitPlatformPlugin::FullScreenVideoPlayer)) : 0; 135 } 136 #endif 137 138 } 139