From c79c1f950a263a4b573cfde6325d4e850a65a948 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 25 Oct 2014 23:51:22 +0200 Subject: [PATCH] Open unknown protocols with external viewer. Closes #210. --- qutebrowser/browser/webpage.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webpage.py b/qutebrowser/browser/webpage.py index c81f5829c..c57bb7897 100644 --- a/qutebrowser/browser/webpage.py +++ b/qutebrowser/browser/webpage.py @@ -22,7 +22,8 @@ import functools import sip -from PyQt5.QtCore import pyqtSignal, pyqtSlot, PYQT_VERSION, Qt +from PyQt5.QtCore import pyqtSignal, pyqtSlot, PYQT_VERSION, Qt, QUrl +from PyQt5.QtGui import QDesktopServices from PyQt5.QtNetwork import QNetworkReply from PyQt5.QtWidgets import QFileDialog from PyQt5.QtPrintSupport import QPrintDialog @@ -100,7 +101,19 @@ class BrowserPage(QWebPage): errpage = sip.cast(out, QWebPage.ErrorPageExtensionReturn) errpage.baseUrl = info.url urlstr = info.url.toDisplayString() - if (info.domain, info.error) in ignored_errors: + if (info.domain, info.error) == (QWebPage.QtNetwork, + QNetworkReply.ProtocolUnknownError): + # For some reason, we get a segfault when we use + # QDesktopServices::openUrl with info.url directly - however it + # works when we construct a copy of it. + url = QUrl(info.url) + msg = "Open external application for {}-link?\nURL: {}".format( + url.scheme(), url.toDisplayString()) + message.confirm_async( + self._win_id, msg, + functools.partial(QDesktopServices.openUrl, url)) + return True + elif (info.domain, info.error) in ignored_errors: log.webview.debug("Ignored error on {}: {} (error domain: {}, " "error code: {})".format( urlstr, info.errorString, info.domain,