QObject* KWebPluginFactory::create(const QString& _mimeType, const QUrl& url, const QStringList& argumentNames, const QStringList& argumentValues) const { // Only attempt to find a KPart for the supported mime types... QVariantList arguments; const int count = argumentNames.count(); for (int i = 0; i < count; ++i) { arguments << QString(argumentNames.at(i) + QL1S("=\"") + argumentValues.at(i) + QL1C('\"')); } QString mimeType (_mimeType.trimmed()); // If no mimetype is provided, we do our best to correctly determine it here... if (mimeType.isEmpty()) { kDebug(800) << "Looking up missing mimetype for plugin resource:" << url; const KUrl reqUrl (url); KMimeType::Ptr ptr = KMimeType::findByUrl(reqUrl, 0, reqUrl.isLocalFile()); if (ptr->isDefault()) mimeType = ptr->name(); // Disregard inode/* mime-types... if (mimeType.startsWith(QLatin1String("inode/"), Qt::CaseInsensitive)) mimeType.clear(); kDebug(800) << "Updated mimetype to" << mimeType; } KParts::ReadOnlyPart* part = 0; // Defer handling of flash content to QtWebKit's builtin viewer. // If you want to use/test KDE's nspluginviewer, comment out the // if statement below. if (!mimeType.isEmpty() && !excludedMimeType(mimeType)) part = KMimeTypeTrader::createPartInstanceFromQuery<KParts::ReadOnlyPart>(mimeType, 0, parent(), QString(), arguments); kDebug(800) << "Asked for" << mimeType << "plugin, got" << part; if (part) { QMap<QString, QString> metaData = part->arguments().metaData(); QString urlStr = url.toString(QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); metaData.insert("PropagateHttpHeader", "true"); metaData.insert("referrer", urlStr); metaData.insert("cross-domain", urlStr); metaData.insert("main_frame_request", "TRUE"); metaData.insert("ssl_activate_warnings", "TRUE"); KWebPage *page = qobject_cast<KWebPage *>(parent()); if (page) { const QString scheme = page->mainFrame()->url().scheme(); if (page && (QString::compare(scheme, QL1S("https"), Qt::CaseInsensitive) == 0 || QString::compare(scheme, QL1S("webdavs"), Qt::CaseInsensitive) == 0)) metaData.insert("ssl_was_in_use", "TRUE"); else metaData.insert("ssl_was_in_use", "FALSE"); } KParts::OpenUrlArguments openUrlArgs = part->arguments(); openUrlArgs.metaData() = metaData; openUrlArgs.setMimeType(mimeType); part->setArguments(openUrlArgs); part->openUrl(url); return part->widget(); } return 0; }
QObject* WebPluginFactory::create (const QString& _mimeType, const QUrl& url, const QStringList& argumentNames, const QStringList& argumentValues) const { //kDebug() << _mimeType << url << argumentNames; QString mimeType (_mimeType.trimmed()); if (mimeType.isEmpty()) { extractGuessedMimeType (url, &mimeType); } const bool noPluginHandling = WebKitSettings::self()->isInternalPluginHandlingDisabled(); if (!noPluginHandling && WebKitSettings::self()->isLoadPluginsOnDemandEnabled()) { const uint id = pluginId(url, argumentNames, argumentValues); if (!mPluginsLoadedOnDemand.contains(id)) { FakePluginWidget* widget = new FakePluginWidget(id, url, mimeType); connect(widget, SIGNAL(pluginLoaded(uint)), this, SLOT(loadedPlugin(uint))); return widget; } } Q_ASSERT(mPart); // should never happen!! KParts::ReadOnlyPart* part = 0; QWebView* view = (mPart ? mPart->view() : 0); if (noPluginHandling || !excludedMimeType(mimeType)) { QWebFrame* frame = (view ? view->page()->currentFrame() : 0); if (frame) { part = createPartInstanceFrom(mimeType, argumentNames, argumentValues, view, frame); } } kDebug() << "Asked for" << mimeType << "plugin, got" << part; if (part) { connect (part->browserExtension(), SIGNAL (openUrlNotify()), mPart->browserExtension(), SIGNAL (openUrlNotify())); connect (part->browserExtension(), SIGNAL (openUrlRequest (KUrl, KParts::OpenUrlArguments, KParts::BrowserArguments)), mPart->browserExtension(), SIGNAL (openUrlRequest (KUrl, KParts::OpenUrlArguments, KParts::BrowserArguments))); // Check if this part is scriptable KParts::ScriptableExtension* scriptExt = KParts::ScriptableExtension::childObject(part); if (!scriptExt) { // Try to fall back to LiveConnectExtension compat KParts::LiveConnectExtension* lc = KParts::LiveConnectExtension::childObject(part); if (lc) { scriptExt = KParts::ScriptableExtension::adapterFromLiveConnect(part, lc); } } if (scriptExt) { scriptExt->setHost(KParts::ScriptableExtension::childObject(mPart)); } QMap<QString, QString> metaData = part->arguments().metaData(); QString urlStr = url.toString (QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); metaData.insert ("PropagateHttpHeader", "true"); metaData.insert ("referrer", urlStr); metaData.insert ("cross-domain", urlStr); metaData.insert ("main_frame_request", "TRUE"); metaData.insert ("ssl_activate_warnings", "TRUE"); KWebPage *page = (view ? qobject_cast<KWebPage*>(view->page()) : 0); if (page) { const QString scheme = page->currentFrame()->url().scheme(); if (page && (QString::compare (scheme, QL1S ("https"), Qt::CaseInsensitive) == 0 || QString::compare (scheme, QL1S ("webdavs"), Qt::CaseInsensitive) == 0)) metaData.insert ("ssl_was_in_use", "TRUE"); else metaData.insert ("ssl_was_in_use", "FALSE"); } KParts::OpenUrlArguments openUrlArgs = part->arguments(); openUrlArgs.metaData() = metaData; openUrlArgs.setMimeType(mimeType); part->setArguments(openUrlArgs); QMetaObject::invokeMethod(part, "openUrl", Qt::QueuedConnection, Q_ARG(KUrl, KUrl(url))); return part->widget(); } return 0; }