diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index f9aaa022e..ce2cceff3 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -562,7 +562,8 @@ class DownloadManager(QAbstractListModel): self._win_id = win_id self.downloads = [] self.questions = [] - self._networkmanager = networkmanager.NetworkManager(win_id, self) + self._networkmanager = networkmanager.NetworkManager( + win_id, None, self) def __repr__(self): return utils.get_repr(self, downloads=len(self.downloads)) diff --git a/qutebrowser/browser/network/networkmanager.py b/qutebrowser/browser/network/networkmanager.py index de0d762c0..a95c64387 100644 --- a/qutebrowser/browser/network/networkmanager.py +++ b/qutebrowser/browser/network/networkmanager.py @@ -47,6 +47,7 @@ class NetworkManager(QNetworkAccessManager): _scheme_handlers: A dictionary (scheme -> handler) of supported custom schemes. _win_id: The window ID this NetworkManager is associated with. + _tab_id: The tab ID this NetworkManager is associated with. Signals: shutting_down: Emitted when the QNAM is shutting down. @@ -54,7 +55,7 @@ class NetworkManager(QNetworkAccessManager): shutting_down = pyqtSignal() - def __init__(self, win_id, parent=None): + def __init__(self, win_id, tab_id, parent=None): log.init.debug("Initializing NetworkManager") with log.disable_qt_msghandler(): # WORKAROUND for a hang when a message is printed - See: @@ -62,6 +63,7 @@ class NetworkManager(QNetworkAccessManager): super().__init__(parent) log.init.debug("NetworkManager init done") self._win_id = win_id + self._tab_id = tab_id self._requests = [] self._scheme_handlers = { 'qute': qutescheme.QuteSchemeHandler(win_id), @@ -123,6 +125,9 @@ class NetworkManager(QNetworkAccessManager): self.shutting_down.connect(q.abort) if owner is not None: owner.destroyed.connect(q.abort) + webview = objreg.get('webview', scope='tab', window=self._win_id, + tab=self._tab_id) + webview.loadStarted.connect(q.abort) bridge = objreg.get('message-bridge', scope='window', window=self._win_id) bridge.ask(q, blocking=True) diff --git a/qutebrowser/browser/webpage.py b/qutebrowser/browser/webpage.py index 824c31f33..2a89f60d9 100644 --- a/qutebrowser/browser/webpage.py +++ b/qutebrowser/browser/webpage.py @@ -47,7 +47,7 @@ class BrowserPage(QWebPage): _ignore_load_started: Whether to ignore the next loadStarted signal. """ - def __init__(self, win_id, parent=None): + def __init__(self, win_id, tab_id, parent=None): super().__init__(parent) self._win_id = win_id self._extension_handlers = { @@ -56,7 +56,8 @@ class BrowserPage(QWebPage): } self._ignore_load_started = False self.error_occured = False - self._networkmanager = networkmanager.NetworkManager(win_id, self) + self._networkmanager = networkmanager.NetworkManager( + win_id, tab_id, self) self.setNetworkAccessManager(self._networkmanager) self.setForwardUnsupportedContent(True) self.printRequested.connect(self.on_print_requested) @@ -72,8 +73,8 @@ class BrowserPage(QWebPage): def javaScriptPrompt(self, _frame, msg, default): """Override javaScriptPrompt to use the statusbar.""" - answer = message.ask(self._win_id, "js: {}".format(msg), - usertypes.PromptMode.text, default) + answer = self._ask("js: {}".format(msg), usertypes.PromptMode.text, + default) if answer is None: return (False, "") else: @@ -157,6 +158,28 @@ class BrowserPage(QWebPage): suggested_file) return True + def _ask(self, text, mode, default=None): + """Ask a blocking question in the statusbar. + + Args: + text: The text to display to the user. + mode: A PromptMode. + default: The default value to display. + + Return: + The answer the user gave or None if the prompt was cancelled. + """ + q = usertypes.Question() + q.text = text + q.mode = mode + q.default = default + self.loadStarted.connect(q.abort) + bridge = objreg.get('message-bridge', scope='window', + window=self._win_id) + bridge.ask(q, blocking=True) + q.deleteLater() + return q.answer + def display_content(self, reply, mimetype): """Display a QNetworkReply with an explicitely set mimetype.""" self.mainFrame().setContent(reply.readAll(), mimetype, reply.url()) @@ -268,13 +291,12 @@ class BrowserPage(QWebPage): def javaScriptAlert(self, _frame, msg): """Override javaScriptAlert to use the statusbar.""" - message.ask(self._win_id, "[js alert] {}".format(msg), - usertypes.PromptMode.alert) + self._ask("[js alert] {}".format(msg), usertypes.PromptMode.alert) def javaScriptConfirm(self, _frame, msg): """Override javaScriptConfirm to use the statusbar.""" - ans = message.ask(self._win_id, "[js confirm] {}".format(msg), - usertypes.PromptMode.yesno) + ans = self._ask("[js confirm] {}".format(msg), + usertypes.PromptMode.yesno) return bool(ans) def javaScriptConsoleMessage(self, msg, line, source): @@ -293,8 +315,8 @@ class BrowserPage(QWebPage): def shouldInterruptJavaScript(self): """Override shouldInterruptJavaScript to use the statusbar.""" - answer = message.ask(self._win_id, "Interrupt long-running " - "javascript?", usertypes.PromptMode.yesno) + answer = self._ask("Interrupt long-running javascript?", + usertypes.PromptMode.yesno) if answer is None: answer = True return answer diff --git a/qutebrowser/browser/webview.py b/qutebrowser/browser/webview.py index d16765ae5..6472694ed 100644 --- a/qutebrowser/browser/webview.py +++ b/qutebrowser/browser/webview.py @@ -113,7 +113,7 @@ class WebView(QWebView): window=win_id) tab_registry[self.tab_id] = self objreg.register('webview', self, registry=self.registry) - page = webpage.BrowserPage(win_id, self) + page = webpage.BrowserPage(win_id, self.tab_id, self) self.setPage(page) hintmanager = hints.HintManager(win_id, self.tab_id, self) hintmanager.mouse_event.connect(self.on_mouse_event)