diff options
author | Andrea Diamantini <adjam7@gmail.com> | 2011-03-03 12:04:14 +0100 |
---|---|---|
committer | Andrea Diamantini <adjam7@gmail.com> | 2011-03-03 12:04:14 +0100 |
commit | 6f36358bd4ffd696b2e627b92e74ed302fb22e7f (patch) | |
tree | 01a08f764ebf94b0bb343f0fc72fe1fc4a712db6 /src | |
parent | Prevent crashes on history models updating... (diff) | |
download | rekonq-6f36358bd4ffd696b2e627b92e74ed302fb22e7f.tar.xz |
Clean up the "rekonq handling chain" to work as:
1. preHandling: about, javascript, abp protocols. Stops if protocol is NOT known
2. WebKit handling: Allow WebKit to try doing its job
3. postHandling / unsupported content handling: try what is possible to let users see it :)
This also prevents some possible infinite loop on opening...
BUG:267201
Diffstat (limited to 'src')
-rw-r--r-- | src/protocolhandler.cpp | 36 | ||||
-rw-r--r-- | src/webpage.cpp | 28 |
2 files changed, 18 insertions, 46 deletions
diff --git a/src/protocolhandler.cpp b/src/protocolhandler.cpp index 2c5f2ada..36efe2a7 100644 --- a/src/protocolhandler.cpp +++ b/src/protocolhandler.cpp @@ -101,22 +101,6 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra _url = request.url(); _frame = frame; - // rekonq can handle http/s browsing easily - if (_url.protocol() == QL1S("http") || _url.protocol() == QL1S("https")) - return false; - - // rekonq can handle file & ftp schemes, if you like,, - if (_url.protocol() == QL1S("ftp") || _url.protocol() == QL1S("file")) - return false; - - // rekonq can handle kde documentation protocol - if (_url.protocol() == QL1S("man") || _url.protocol() == QL1S("help") || _url.protocol() == QL1S("info")) - return false; - - // relative urls - if (_url.isRelative()) - return false; - // javascript handling if (_url.protocol() == QL1S("javascript")) { @@ -140,9 +124,6 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra return true; } - // NOTE - // handle here "custom" rekonq protocols - // "abp" handling if (_url.protocol() == QL1S("abp")) { @@ -192,18 +173,17 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra return true; } - // If rekonq cannot handle a protocol by itself, it will hand it over to KDE via KRun + // let webkit try to load a known (or missing) protocol... if (KProtocolInfo::isKnownProtocol(_url)) - { - new KRun(_url, rApp->mainWindow()); // No need to delete KRun, it autodeletes itself - return true; - } - - // Error Message, for those protocols even KDE cannot handle + return false; + + // Error Message, for those protocols we cannot handle + // FIXME change this sentence AFTER STRING FREEZE to: "rekonq doesn't know how to handle this protocol: _url.protocol()" KMessageBox::error(rApp->mainWindow(), i18nc("@info", "rekonq cannot handle this URL. \ - Please use an appropriate application to open it.")); - return false; + Please use an appropriate application to open it.")); + + return true; } diff --git a/src/webpage.cpp b/src/webpage.cpp index 036e9db1..cc89a57d 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -66,6 +66,8 @@ #include <KService> #include <KToolInvocation> #include <KWebWallet> +#include <KProtocolInfo> +#include <KRun> #include <kparts/browseropenorsavequestion.h> @@ -403,6 +405,14 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply) // get reply url... KUrl replyUrl = reply->url(); + bool isLocal = replyUrl.isLocalFile(); + if(isLocal && KProtocolInfo::isKnownProtocol(replyUrl)) + { + kDebug() << "WARNING: launching a new app..."; + new KRun(replyUrl, rApp->mainWindow()); // No need to delete KRun, it autodeletes itself + return; + } + // Get suggested file name... extractSuggestedFileName(reply, _suggestedFileName); @@ -419,8 +429,6 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply) KService::Ptr appService = KMimeTypeTrader::self()->preferredService(_mimeType); - bool isLocal = replyUrl.isLocalFile(); - if (appService.isNull()) // no service can handle this. We can just download it.. { kDebug() << "no service can handle this. We can just download it.."; @@ -471,22 +479,6 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply) return; } - // HACK: The check below is necessary to break an infinite - // recursion that occurs whenever this function is called as a result - // of receiving content that can be rendered by the app using this engine. - // For example a text/html header that containing a content-disposition - // header is received by the app using this class. - const QString& appName = QCoreApplication::applicationName(); - - if (appName == appService->desktopEntryName() || appService->exec().trimmed().startsWith(appName)) - { - kDebug() << "SELF..."; - QNetworkRequest req(reply->request()); - req.setRawHeader("x-kdewebkit-ignore-disposition", "true"); - currentFrame()->load(req); - return; - } - // case KParts::BrowserRun::Embed KParts::ReadOnlyPart *pa = KMimeTypeTrader::createPartInstanceFromQuery<KParts::ReadOnlyPart>(_mimeType, view(), this, QString()); if (pa) |