Widget* FrameLoaderClientQt::createPlugin(const IntSize& pluginSize, Element* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually) { // qDebug()<<"------ Creating plugin in FrameLoaderClientQt::createPlugin for "<<url.prettyURL() << mimeType; // qDebug()<<"------\t url = "<<url.prettyURL(); if (!m_webFrame) return 0; QStringList params; QStringList values; QString classid(element->getAttribute("classid")); for (int i = 0; i < paramNames.size(); ++i) { params.append(paramNames[i]); if (paramNames[i] == "classid") classid = paramValues[i]; } for (int i = 0; i < paramValues.size(); ++i) values.append(paramValues[i]); QString urlStr(url.string()); QUrl qurl = urlStr; QObject* object = 0; if (mimeType == "application/x-qt-plugin" || mimeType == "application/x-qt-styled-widget") { object = m_webFrame->page()->createPlugin(classid, qurl, params, values); #ifndef QT_NO_STYLE_STYLESHEET QWidget* widget = qobject_cast<QWidget*>(object); if (widget && mimeType == "application/x-qt-styled-widget") { QString styleSheet = element->getAttribute("style"); if (!styleSheet.isEmpty()) styleSheet += QLatin1Char(';'); for (int i = 0; i < numqStyleSheetProperties; ++i) { CSSPropertyID property = qstyleSheetProperties[i]; styleSheet += QString::fromLatin1(::getPropertyName(property)); styleSheet += QLatin1Char(':'); styleSheet += computedStyle(element)->getPropertyValue(property); styleSheet += QLatin1Char(';'); } widget->setStyleSheet(styleSheet); } #endif // QT_NO_STYLE_STYLESHEET } #if QT_VERSION >= 0x040400 if (!object) { QWebPluginFactory* factory = m_webFrame->page()->pluginFactory(); if (factory) object = factory->create(mimeType, qurl, params, values); } #endif if (object) { QWidget* widget = qobject_cast<QWidget*>(object); if (widget) { QWidget* view = m_webFrame->page()->view(); if (view) widget->setParent(view); QtPluginWidget* w = new QtPluginWidget(); w->setPlatformWidget(widget); // Make sure it's invisible until properly placed into the layout w->setFrameRect(IntRect(0, 0, 0, 0)); return w; } // FIXME: make things work for widgetless plugins as well delete object; } else { // NPAPI Plugins PluginView* pluginView = PluginView::create(m_frame, pluginSize, element, url, paramNames, paramValues, mimeType, loadManually); return pluginView; } return 0; }
PassRefPtr<Widget> FrameLoaderClientQt::createPlugin(const IntSize& pluginSize, HTMLPlugInElement* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually) { // qDebug()<<"------ Creating plugin in FrameLoaderClientQt::createPlugin for "<<url.prettyURL() << mimeType; // qDebug()<<"------\t url = "<<url.prettyURL(); if (!m_webFrame) return 0; QStringList params; QStringList values; QString classid(element->getAttribute("classid")); for (unsigned i = 0; i < paramNames.size(); ++i) { params.append(paramNames[i]); if (paramNames[i] == "classid") classid = paramValues[i]; } for (unsigned i = 0; i < paramValues.size(); ++i) values.append(paramValues[i]); QString urlStr(url.string()); QUrl qurl = urlStr; QObject* object = 0; if (mimeType == "application/x-qt-plugin" || mimeType == "application/x-qt-styled-widget") { object = m_webFrame->page()->createPlugin(classid, qurl, params, values); #ifndef QT_NO_STYLE_STYLESHEET QWidget* widget = qobject_cast<QWidget*>(object); if (widget && mimeType == "application/x-qt-styled-widget") { QString styleSheet = element->getAttribute("style"); if (!styleSheet.isEmpty()) styleSheet += QLatin1Char(';'); for (unsigned i = 0; i < numqStyleSheetProperties; ++i) { CSSPropertyID property = qstyleSheetProperties[i]; styleSheet += QString::fromLatin1(::getPropertyName(property)); styleSheet += QLatin1Char(':'); styleSheet += computedStyle(element)->getPropertyValue(property); styleSheet += QLatin1Char(';'); } widget->setStyleSheet(styleSheet); } #endif // QT_NO_STYLE_STYLESHEET } if (!object) { QWebPluginFactory* factory = m_webFrame->page()->pluginFactory(); if (factory) object = factory->create(mimeType, qurl, params, values); } if (object) { QWidget* widget = qobject_cast<QWidget*>(object); if (widget) { QWidget* parentWidget = 0; if (m_webFrame->page()->d->client) parentWidget = qobject_cast<QWidget*>(m_webFrame->page()->d->client->pluginParent()); if (parentWidget) // don't reparent to nothing (i.e. keep whatever parent QWebPage::createPlugin() chose. widget->setParent(parentWidget); widget->hide(); RefPtr<QtPluginWidget> w = adoptRef(new QtPluginWidget()); w->setPlatformWidget(widget); // Make sure it's invisible until properly placed into the layout w->setFrameRect(IntRect(0, 0, 0, 0)); return w; } #if QT_VERSION >= 0x040600 QGraphicsWidget* graphicsWidget = qobject_cast<QGraphicsWidget*>(object); if (graphicsWidget) { QGraphicsObject* parentWidget = 0; if (m_webFrame->page()->d->client) parentWidget = qobject_cast<QGraphicsObject*>(m_webFrame->page()->d->client->pluginParent()); graphicsWidget->hide(); if (parentWidget) // don't reparent to nothing (i.e. keep whatever parent QWebPage::createPlugin() chose. graphicsWidget->setParentItem(parentWidget); RefPtr<QtPluginGraphicsWidget> w = QtPluginGraphicsWidget::create(graphicsWidget); // Make sure it's invisible until properly placed into the layout w->setFrameRect(IntRect(0, 0, 0, 0)); return w; } #endif // FIXME: make things work for widgetless plugins as well delete object; } else { // NPAPI Plugins Vector<String> params = paramNames; Vector<String> values = paramValues; if (mimeType == "application/x-shockwave-flash") { QWebPageClient* client = m_webFrame->page()->d->client; const bool isQWebView = client && qobject_cast<QWidget*>(client->pluginParent()); #if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO == 5) size_t wmodeIndex = params.find("wmode"); if (wmodeIndex == -1) { // Disable XEmbed mode and force it to opaque mode params.append("wmode"); values.append("opaque"); } else if (!isQWebView) { // Disable transparency if client is not a QWebView values[wmodeIndex] = "opaque"; } #else if (!isQWebView) { // inject wmode=opaque when there is no client or the client is not a QWebView size_t wmodeIndex = params.find("wmode"); if (wmodeIndex == -1) { params.append("wmode"); values.append("opaque"); } else values[wmodeIndex] = "opaque"; } #endif } RefPtr<PluginView> pluginView = PluginView::create(m_frame, pluginSize, element, url, params, values, mimeType, loadManually); return pluginView; } return 0; }
void PluginData::initPlugins() { #if QT_VERSION >= 0x040400 QWebPage* webPage = static_cast<ChromeClientQt*>(m_page->chrome()->client())->m_webPage; QWebPluginFactory* factory = webPage->pluginFactory(); if (factory) { QList<QWebPluginFactory::Plugin> qplugins = factory->plugins(); for (int i = 0; i < qplugins.count(); ++i) { const QWebPluginFactory::Plugin& qplugin = qplugins.at(i); PluginInfo* info = new PluginInfo; info->name = qplugin.name; info->desc = qplugin.description; for (int j = 0; j < qplugin.mimeTypes.count(); ++j) { const QWebPluginFactory::MimeType& mimeType = qplugin.mimeTypes.at(j); MimeClassInfo* mimeInfo = new MimeClassInfo; mimeInfo->type = mimeType.name; mimeInfo->desc = mimeType.description; mimeInfo->suffixes = mimeType.fileExtensions.join(QLatin1String("; ")); info->mimes.append(mimeInfo); } m_plugins.append(info); } } #endif PluginDatabase *db = PluginDatabase::installedPlugins(); const Vector<PluginPackage*> &plugins = db->plugins(); for (unsigned int i = 0; i < plugins.size(); ++i) { PluginInfo* info = new PluginInfo; 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 = new MimeClassInfo; info->mimes.append(mime); mime->type = it->first; mime->desc = it->second; mime->plugin = info; Vector<String> extensions = package->mimeToExtensions().get(mime->type); for (unsigned i = 0; i < extensions.size(); i++) { if (i > 0) mime->suffixes += ","; mime->suffixes += extensions[i]; } } m_plugins.append(info); } }