From 199eac2db879c103b0ccfbc75bad6d75b339329a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=A4rehag?= Date: Tue, 24 Apr 2018 14:05:53 +0200 Subject: [PATCH 1/4] window.print() support for WebEngine --- qutebrowser/browser/webengine/webenginetab.py | 6 +++++ qutebrowser/browser/webengine/webview.py | 15 +++++++++--- qutebrowser/javascript/print.js | 24 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 qutebrowser/javascript/print.js diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 145bc9c44..dfa5ed6bc 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -700,6 +700,12 @@ class WebEngineTab(browsertab.AbstractTab): self._inject_early_js('js', js_code, subframes=True) self._init_stylesheet() + js_code_print = utils.read_file('javascript/print.js') + self._inject_early_js('js', + js_code_print, + subframes=True, + world=QWebEngineScript.MainWorld) + greasemonkey = objreg.get('greasemonkey') greasemonkey.scripts_reloaded.connect(self._inject_userscripts) self._inject_userscripts() diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py index 70cd11e0d..8483610d1 100644 --- a/qutebrowser/browser/webengine/webview.py +++ b/qutebrowser/browser/webengine/webview.py @@ -48,7 +48,7 @@ class WebEngineView(QWebEngineView): else: profile = webenginesettings.default_profile page = WebEnginePage(theme_color=theme_color, profile=profile, - parent=self) + parent=self, win_id=win_id) self.setPage(page) def shutdown(self): @@ -130,7 +130,7 @@ class WebEnginePage(QWebEnginePage): shutting_down = pyqtSignal() navigation_request = pyqtSignal(usertypes.NavigationRequest) - def __init__(self, *, theme_color, profile, parent=None): + def __init__(self, *, theme_color, profile, win_id, parent=None): super().__init__(profile, parent) self._is_shutting_down = False self.featurePermissionRequested.connect( @@ -138,6 +138,7 @@ class WebEnginePage(QWebEnginePage): self._theme_color = theme_color self._set_bg_color() config.instance.changed.connect(self._set_bg_color) + self._win_id = win_id self.urlChanged.connect(self._inject_userjs) @config.change_filter('colors.webpage.bg') @@ -310,9 +311,17 @@ class WebEnginePage(QWebEnginePage): QWebEnginePage.NavigationTypeOther: usertypes.NavigationRequest.Type.other, } + accept_request = True + if(url.scheme() == "qute" and url.path() == "print"): + command_dispatcher = objreg.get('command-dispatcher', + scope='window', + window=self._win_id) + command_dispatcher.printpage() + accept_request = False navigation = usertypes.NavigationRequest(url=url, navigation_type=type_map[typ], - is_main_frame=is_main_frame) + is_main_frame=is_main_frame, + accepted=accept_request) self.navigation_request.emit(navigation) return navigation.accepted diff --git a/qutebrowser/javascript/print.js b/qutebrowser/javascript/print.js new file mode 100644 index 000000000..20e1dadce --- /dev/null +++ b/qutebrowser/javascript/print.js @@ -0,0 +1,24 @@ +/** + * Copyright 2018 Florian Bruhin (The Compiler) + * + * This file is part of qutebrowser. + * + * qutebrowser is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * qutebrowser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with qutebrowser. If not, see . + */ + +"use strict"; + +window.print = function() { + window.location = "qute:print"; +}; From 0e756d2f68027d8c9cf6847b91c3263bbeb337b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=A4rehag?= Date: Wed, 9 May 2018 14:36:03 +0200 Subject: [PATCH 2/4] changes to pull request 3864, window.print for webengine --- qutebrowser/browser/webengine/webenginetab.py | 26 ++++++++++--------- qutebrowser/javascript/print.js | 8 +++++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index dfa5ed6bc..8b34b20f6 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -696,16 +696,14 @@ class WebEngineTab(browsertab.AbstractTab): utils.read_file('javascript/webelem.js'), utils.read_file('javascript/caret.js'), ) + self._inject_early_js('js', + utils.read_file('javascript/print.js'), + subframes=True, + world=QWebEngineScript.MainWorld) # FIXME:qtwebengine what about subframes=True? self._inject_early_js('js', js_code, subframes=True) self._init_stylesheet() - js_code_print = utils.read_file('javascript/print.js') - self._inject_early_js('js', - js_code_print, - subframes=True, - world=QWebEngineScript.MainWorld) - greasemonkey = objreg.get('greasemonkey') greasemonkey.scripts_reloaded.connect(self._inject_userscripts) self._inject_userscripts() @@ -761,9 +759,7 @@ class WebEngineTab(browsertab.AbstractTab): scripts.insert(new_script) def _install_event_filter(self): - fp = self._widget.focusProxy() - if fp is not None: - fp.installEventFilter(self._mouse_event_filter) + self._widget.focusProxy().installEventFilter(self._mouse_event_filter) self._child_event_filter = mouse.ChildEventFilter( eventfilter=self._mouse_event_filter, widget=self._widget, parent=self) @@ -1052,6 +1048,14 @@ class WebEngineTab(browsertab.AbstractTab): @pyqtSlot(usertypes.NavigationRequest) def _on_navigation_request(self, navigation): super()._on_navigation_request(navigation) + + if navigation.url == QUrl('qute://print'): + command_dispatcher = objreg.get('command-dispatcher', + scope='window', + window=self.win_id) + command_dispatcher.printpage() + navigation.accepted = False + if not navigation.accepted or not navigation.is_main_frame: return @@ -1110,6 +1114,4 @@ class WebEngineTab(browsertab.AbstractTab): self.predicted_navigation.connect(self._on_predicted_navigation) def event_target(self): - fp = self._widget.focusProxy() - assert fp is not None - return fp + return self._widget.focusProxy() diff --git a/qutebrowser/javascript/print.js b/qutebrowser/javascript/print.js index 20e1dadce..922d1c59e 100644 --- a/qutebrowser/javascript/print.js +++ b/qutebrowser/javascript/print.js @@ -17,8 +17,14 @@ * along with qutebrowser. If not, see . */ +/* + * this is a hack based on the QupZilla solution, https://github.com/QupZilla/qupzilla/commit/d3f0d766fb052dc504de2426d42f235d96b5eb60 + * + * We go to a qute://print which triggers the print, then we cancel the request. + */ + "use strict"; window.print = function() { - window.location = "qute:print"; + window.location = "qute://print"; }; From 72c2962908a85cefaed552dae43c6965e656b593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=A4rehag?= Date: Wed, 9 May 2018 15:52:22 +0200 Subject: [PATCH 3/4] removed trailing whitespace --- qutebrowser/javascript/print.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/javascript/print.js b/qutebrowser/javascript/print.js index 922d1c59e..ceb34aa65 100644 --- a/qutebrowser/javascript/print.js +++ b/qutebrowser/javascript/print.js @@ -17,10 +17,10 @@ * along with qutebrowser. If not, see . */ -/* +/* * this is a hack based on the QupZilla solution, https://github.com/QupZilla/qupzilla/commit/d3f0d766fb052dc504de2426d42f235d96b5eb60 * - * We go to a qute://print which triggers the print, then we cancel the request. + * We go to a qute://print which triggers the print, then we cancel the request. */ "use strict"; From dc7f39514d3eeac1d322989fd7f2dbe988b375c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=A4rehag?= Date: Wed, 9 May 2018 18:28:52 +0200 Subject: [PATCH 4/4] pull request #3864, reverted webview changes, fixed regression --- qutebrowser/browser/webengine/webenginetab.py | 4 +++- qutebrowser/browser/webengine/webview.py | 15 +++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 55a349ae8..a9a7c269d 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -768,7 +768,9 @@ class WebEngineTab(browsertab.AbstractTab): scripts.insert(new_script) def _install_event_filter(self): - self._widget.focusProxy().installEventFilter(self._mouse_event_filter) + fp = self._widget.focusProxy() + if fp is not None: + fp.installEventFilter(self._mouse_event_filter) self._child_event_filter = mouse.ChildEventFilter( eventfilter=self._mouse_event_filter, widget=self._widget, parent=self) diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py index 8483610d1..70cd11e0d 100644 --- a/qutebrowser/browser/webengine/webview.py +++ b/qutebrowser/browser/webengine/webview.py @@ -48,7 +48,7 @@ class WebEngineView(QWebEngineView): else: profile = webenginesettings.default_profile page = WebEnginePage(theme_color=theme_color, profile=profile, - parent=self, win_id=win_id) + parent=self) self.setPage(page) def shutdown(self): @@ -130,7 +130,7 @@ class WebEnginePage(QWebEnginePage): shutting_down = pyqtSignal() navigation_request = pyqtSignal(usertypes.NavigationRequest) - def __init__(self, *, theme_color, profile, win_id, parent=None): + def __init__(self, *, theme_color, profile, parent=None): super().__init__(profile, parent) self._is_shutting_down = False self.featurePermissionRequested.connect( @@ -138,7 +138,6 @@ class WebEnginePage(QWebEnginePage): self._theme_color = theme_color self._set_bg_color() config.instance.changed.connect(self._set_bg_color) - self._win_id = win_id self.urlChanged.connect(self._inject_userjs) @config.change_filter('colors.webpage.bg') @@ -311,17 +310,9 @@ class WebEnginePage(QWebEnginePage): QWebEnginePage.NavigationTypeOther: usertypes.NavigationRequest.Type.other, } - accept_request = True - if(url.scheme() == "qute" and url.path() == "print"): - command_dispatcher = objreg.get('command-dispatcher', - scope='window', - window=self._win_id) - command_dispatcher.printpage() - accept_request = False navigation = usertypes.NavigationRequest(url=url, navigation_type=type_map[typ], - is_main_frame=is_main_frame, - accepted=accept_request) + is_main_frame=is_main_frame) self.navigation_request.emit(navigation) return navigation.accepted