53 #include <kparts/browseropenorsavequestion.h>
56 #include <QtCore/QPointer>
57 #include <QtCore/QFileInfo>
58 #include <QtCore/QCoreApplication>
59 #include <QtWebKit/QWebFrame>
60 #include <QtNetwork/QNetworkReply>
63 #define QL1S(x) QLatin1String(x)
64 #define QL1C(x) QLatin1Char(x)
68 QNetworkRequest req (reply->request());
69 req.setRawHeader(
"x-kdewebkit-ignore-disposition",
"true");
71 QWebFrame* frame = qobject_cast<QWebFrame*> (req.originatingObject());
85 const QString& appName = QCoreApplication::applicationName();
91 if (appName ==
QL1S(
"konqueror") && offer->
exec().trimmed().startsWith(
QL1S(
"kfmclient")))
101 if (metaData.contains(
QL1S(
"content-type")))
102 mimeType = metaData.value(
QL1S(
"content-type"));
104 if (!mimeType.isEmpty())
107 if (!reply->hasRawHeader(
"Content-Type"))
110 const QString value (
QL1S(reply->rawHeader(
"Content-Type").simplified().constData()));
111 const int index = value.indexOf(
QL1C(
';'));
112 mimeType = ((index == -1) ? value : value.left(index));
118 const QString fileName = suggestedName.isEmpty() ? srcUrl.
fileName() : suggestedName;
121 if (!destUrl.isValid())
125 KIO::Job *job = KIO::copy(srcUrl, destUrl);
127 if (!metaData.isEmpty())
128 job->setMetaData(metaData);
130 job->addMetaData(
QL1S(
"MaxCacheSize"),
QL1S(
"0"));
131 job->addMetaData(
QL1S(
"cache"),
QL1S(
"cache"));
132 job->ui()->setWindow((parent ? parent->window() : 0));
133 job->ui()->setAutoErrorHandlingEnabled(
true);
139 if (!reply || reply->error() != QNetworkReply::NoError)
143 const QString scheme = reply->url().scheme();
144 if (scheme.startsWith(QLatin1String(
"http"), Qt::CaseInsensitive) ||
145 scheme.startsWith(QLatin1String(
"webdav"), Qt::CaseInsensitive)) {
147 const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(&ok);
148 if (!ok || statusCode < 200 || statusCode > 299)
155 class KWebPage::KWebPagePrivate
160 , inPrivateBrowsingMode(false)
166 return (window ? window.data() : q->view());
169 void _k_copyResultToTempFile(
KJob* job)
172 if (cJob && !cJob->
error() ) {
181 if (tJob && !tJob->
error()) {
186 const QString suggestedFileName (tJob->queryMetaData(
QL1S(
"content-disposition-filename")));
188 (void)
downloadResource(tJob->url(), suggestedFileName, window, tJob->metaData());
192 void _k_contentTypeCheckFailed(
KJob* job)
196 if (tJob && tJob->
error()) {
202 QPointer<QWidget> window;
204 QPointer<KWebWallet>
wallet;
205 bool inPrivateBrowsingMode;
211 action->setIcon(icon);
218 action->setShortcuts(shortcut.
toList());
223 :
QWebPage(parent), d(new KWebPagePrivate(this))
230 d->window = (parentWidget ? parentWidget->window() : 0);
234 KIO::Integration::AccessManager *manager =
new KIO::Integration::AccessManager(
this);
236 manager->setCache(0);
237 manager->setWindow(d->window);
238 manager->setEmitReadyReadOnMetaDataChange(
true);
239 setNetworkAccessManager(manager);
269 settings()->setWebGraphic(QWebSettings::MissingPluginGraphic,
KIcon(
"preferences-plugin").pixmap(32, 32));
270 settings()->setWebGraphic(QWebSettings::MissingImageGraphic,
KIcon(
"image-missing").pixmap(32, 32));
271 settings()->setWebGraphic(QWebSettings::DefaultFrameIconGraphic,
KIcon(
"applications-internet").pixmap(32, 32));
313 if (d->wallet &&
this == d->wallet->parent())
319 d->wallet->setParent(
this);
330 job->addMetaData(
QL1S(
"MaxCacheSize"),
QL1S(
"0"));
331 job->addMetaData(
QL1S(
"cache"),
QL1S(
"cache"));
332 job->ui()->setWindow(d->windowWidget());
348 KIO::Integration::AccessManager::putReplyOnHold(reply);
357 const KUrl replyUrl (reply->url());
360 if (mimeType.isEmpty()) {
361 (void)
new KRun(replyUrl, d->windowWidget(), 0 , replyUrl.isLocalFile());
366 if (mimeType.startsWith(
QL1S(
"inode/"), Qt::CaseInsensitive) &&
367 KRun::runUrl(replyUrl, mimeType, d->windowWidget(),
false,
false,
368 metaData.value(
QL1S(
"content-disposition-filename")))) {
377 KIO::Integration::AccessManager *manager = qobject_cast<KIO::Integration::AccessManager *>(networkAccessManager());
379 value = manager->sessionMetaData().value(key);
388 KIO::Integration::AccessManager *manager = qobject_cast<KIO::Integration::AccessManager *>(networkAccessManager());
390 value = manager->requestMetaData().value(key);
397 KIO::Integration::AccessManager *manager = qobject_cast<KIO::Integration::AccessManager *>(networkAccessManager());
399 manager->sessionMetaData()[key] = value;
404 KIO::Integration::AccessManager *manager = qobject_cast<KIO::Integration::AccessManager *>(networkAccessManager());
406 manager->requestMetaData()[key] = value;
411 KIO::Integration::AccessManager *manager = qobject_cast<KIO::Integration::AccessManager *>(networkAccessManager());
413 manager->sessionMetaData().remove(key);
418 KIO::Integration::AccessManager *manager = qobject_cast<KIO::Integration::AccessManager *>(networkAccessManager());
420 manager->requestMetaData().remove(key);
425 const KUrl url(_url);
429 return QWebPage::userAgentForUrl(_url);
447 kDebug(800) <<
"url:" << request.url() <<
", type:" << type <<
", frame:" << frame;
449 if (frame && d->wallet && type == QWebPage::NavigationTypeFormSubmitted)
450 d->wallet->saveFormData(frame);
453 if (settings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) {
454 if (!d->inPrivateBrowsingMode) {
457 d->inPrivateBrowsingMode =
true;
460 if (d->inPrivateBrowsingMode) {
463 d->inPrivateBrowsingMode =
false;
471 if (frame == mainFrame() && type != QWebPage::NavigationTypeReload)
474 return QWebPage::acceptNavigationRequest(frame, request, type);
480 const KUrl replyUrl (reply->url());
484 const QString suggestedFileName = data.value(
QL1S(
"content-disposition-filename"));
493 *contentType = mimeType;
497 if (mimeType.isEmpty() || mimeType.startsWith(
QL1S(
"inode/"), Qt::CaseInsensitive)) {
502 if (KParts::BrowserRun::isTextExecutable(mimeType))
503 mimeType =
QL1S(
"text/plain");
511 KParts::BrowserOpenOrSaveQuestion::Result result;
512 KParts::BrowserOpenOrSaveQuestion dlg(d->windowWidget(), replyUrl, mimeType);
513 dlg.setSuggestedFileName(suggestedFileName);
514 dlg.setFeatures(KParts::BrowserOpenOrSaveQuestion::ServiceSelection);
515 result = dlg.askOpenOrSave();
518 case KParts::BrowserOpenOrSaveQuestion::Open:
520 if (reply->operation() == QNetworkAccessManager::PostOperation) {
521 d->mimeType = mimeType;
522 QFileInfo finfo (suggestedFileName.isEmpty() ? replyUrl.fileName() : suggestedFileName);
525 tempFile.setAutoRemove(
false);
528 destUrl.
setPath(tempFile.fileName());
529 KIO::Job *job = KIO::file_copy(replyUrl, destUrl, 0600, KIO::Overwrite);
530 job->ui()->setWindow(d->windowWidget());
531 job->ui()->setAutoErrorHandlingEnabled(
true);
532 connect(job, SIGNAL(result(
KJob*)),
533 this, SLOT(_k_copyResultToTempFile(
KJob*)));
538 if (KParts::BrowserRun::allowExecution(mimeType, replyUrl)) {
549 list.append(replyUrl);
550 bool success =
false;
553 success =
KRun::run(*offer, list, d->windowWidget() ,
false, suggestedFileName);
560 if (!success || (offer && !offer->
categories().contains(
QL1S(
"KDE")))) {
561 KIO::SimpleJob::removeOnHold();
569 case KParts::BrowserOpenOrSaveQuestion::Save:
571 if (!replyUrl.isLocalFile()) {
572 QString downloadCmd (reply->property(
"DownloadManagerExe").toString());
573 if (!downloadCmd.isEmpty()) {
574 downloadCmd += QLatin1Char(
' ');
575 downloadCmd += KShell::quoteArg(replyUrl.url());
576 if (!suggestedFileName.isEmpty()) {
577 downloadCmd += QLatin1Char(
' ');
578 downloadCmd += KShell::quoteArg(suggestedFileName);
588 case KParts::BrowserOpenOrSaveQuestion::Cancel:
590 KIO::SimpleJob::removeOnHold();
605 #include "kwebpage.moc"