SVN commit 957782 by uwolfer: Improve handling of download file names. BUG:186272 M +28 -2 kdewebkit/kwebpage.cpp M +1 -0 kdewebkit/kwebpage.h M +3 -1 part/webpage.cpp --- trunk/playground/libs/webkitkde/kdewebkit/kwebpage.cpp #957781:957782 @@ -95,6 +95,8 @@ { public: KWebPagePrivate() {} + + QString getFileNameForDownload(const QNetworkRequest &request, QNetworkReply *reply) const; #if KDE_IS_VERSION(4, 2, 70) KIO::AccessManager* accessManager; #else @@ -102,6 +104,22 @@ #endif }; +QString KWebPage::KWebPagePrivate::getFileNameForDownload(const QNetworkRequest &request, QNetworkReply *reply) const +{ + QString fileName = KUrl(request.url()).fileName(); + if (reply && reply->hasRawHeader("Content-Disposition")) { // based on code from arora, downloadmanger.cpp + const QString value = QLatin1String(reply->rawHeader("Content-Disposition")); + const int pos = value.indexOf(QLatin1String("filename=")); + if (pos != -1) { + QString name = value.mid(pos + 9); + if (name.startsWith(QLatin1Char('"')) && name.endsWith(QLatin1Char('"'))) + name = name.mid(1, name.size() - 2); + fileName = name; + } + } + return fileName; +} + KWebPage::KWebPage(QObject *parent) : QWebPage(parent), d(new KWebPage::KWebPagePrivate()) { @@ -234,10 +252,10 @@ KParts::BrowserRun::AskSaveResult res = KParts::BrowserRun::askEmbedOrSave( url, reply->header(QNetworkRequest::ContentTypeHeader).toString(), - url.fileName()); + d->getFileNameForDownload(reply->request(), reply)); switch (res) { case KParts::BrowserRun::Save: - slotDownloadRequested(reply->request()); + slotDownloadRequested(reply->request(), reply); return; case KParts::BrowserRun::Cancel: return; @@ -257,11 +275,19 @@ return loader.createWidget(classId, view()); } + void KWebPage::slotDownloadRequested(const QNetworkRequest &request) { + slotDownloadRequested(request, 0); +} + +void KWebPage::slotDownloadRequested(const QNetworkRequest &request, QNetworkReply *reply) +{ const KUrl url(request.url()); kDebug() << url; + const QString fileName = d->getFileNameForDownload(request, reply); + // parts of following code are based on khtml_ext.cpp // DownloadManager <-> konqueror integration // find if the integration is enabled --- trunk/playground/libs/webkitkde/kdewebkit/kwebpage.h #957781:957782 @@ -62,6 +62,7 @@ protected Q_SLOTS: virtual void slotHandleUnsupportedContent(QNetworkReply *reply); virtual void slotDownloadRequested(const QNetworkRequest &request); + virtual void slotDownloadRequested(const QNetworkRequest &request, QNetworkReply *reply); private: class KWebPagePrivate; --- trunk/playground/libs/webkitkde/part/webpage.cpp #957781:957782 @@ -154,7 +154,9 @@ { const KUrl url(reply->request().url()); KParts::OpenUrlArguments args; - args.setMimeType(reply->header(QNetworkRequest::ContentTypeHeader).toString()); + Q_FOREACH (const QByteArray &headerName, reply->rawHeaderList()) { + args.metaData().insert(QString(headerName), QString(reply->rawHeader(headerName))); + } emit m_part->browserExtension()->openUrlRequest(url, args, KParts::BrowserArguments()); }