From d1cced0da44cdaff6e1a39979a312a8d403bb626 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 7 Jun 2018 14:27:53 +0200 Subject: Make sure external schemes are clickable via hints This issue was probably introduced in 545539f28d86c162f0e7f803480ad7fe24b6870f - with JavaScript, we can't "click" on an external link. There might be a better solution using QWebEngineSettings::setUnknownUrlSchemePolicy(QWebEngineSettings::AllowAllUnknownUrlSchemes) temporarily when using hints with PyQt 5.11. Fixes #2833 (cherry picked from commit 89f4333df15d21f223a61abbf6efa6c25e2fa899) --- qutebrowser/browser/webelem.py | 6 +++++- qutebrowser/browser/webengine/webengineelem.py | 9 ++++++++- qutebrowser/browser/webkit/webkitelem.py | 3 +++ qutebrowser/utils/urlutils.py | 15 +++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index dee21c2d6..1d719738b 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -307,6 +307,10 @@ class AbstractWebElement(collections.abc.MutableMapping): href_tags = ['a', 'area', 'link'] return self.tag_name() in href_tags and 'href' in self + def _requires_user_interaction(self): + """Return True if clicking this element needs user interaction.""" + raise NotImplementedError + def _mouse_pos(self): """Get the position to click/hover.""" # Click the center of the largest square fitting into the top/left @@ -405,7 +409,7 @@ class AbstractWebElement(collections.abc.MutableMapping): return if click_target == usertypes.ClickTarget.normal: - if self.is_link(): + if self.is_link() and not self._requires_user_interaction(): log.webelem.debug("Clicking via JS click()") self._click_js(click_target) elif self.is_editable(strict=True): diff --git a/qutebrowser/browser/webengine/webengineelem.py b/qutebrowser/browser/webengine/webengineelem.py index 127b71cf0..01ec7b687 100644 --- a/qutebrowser/browser/webengine/webengineelem.py +++ b/qutebrowser/browser/webengine/webengineelem.py @@ -27,7 +27,7 @@ from PyQt5.QtGui import QMouseEvent from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineSettings -from qutebrowser.utils import log, javascript +from qutebrowser.utils import log, javascript, urlutils from qutebrowser.browser import webelem @@ -198,6 +198,13 @@ class WebEngineElement(webelem.AbstractWebElement): if self.is_text_input() and self.is_editable(): self._js_call('move_cursor_to_end') + def _requires_user_interaction(self): + baseurl = self._tab.url() + url = self.resolve_url(baseurl) + if url is None: + return True + return url.scheme() not in urlutils.WEBENGINE_SCHEMES + def _click_editable(self, click_target): # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58515 ev = QMouseEvent(QMouseEvent.MouseButtonPress, QPoint(0, 0), diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index a7d4f4b3e..7ec979d09 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -305,6 +305,9 @@ class WebKitElement(webelem.AbstractWebElement): if self.is_text_input() and self.is_editable(): self._tab.caret.move_to_end_of_document() + def _requires_user_interaction(self): + return False + def _click_editable(self, click_target): ok = self._elem.evaluateJavaScript('this.focus(); true;') if ok: diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 0c77a5d0f..4dda6b3fc 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -39,6 +39,21 @@ from qutebrowser.browser.network import pac # https://github.com/qutebrowser/qutebrowser/issues/108 +# URL schemes supported by QtWebEngine +WEBENGINE_SCHEMES = [ + 'about', + 'data', + 'file', + 'filesystem', + 'ftp', + 'http', + 'https', + 'javascript', + 'ws', + 'wss', +] + + class InvalidUrlError(ValueError): """Error raised if a function got an invalid URL. -- cgit v1.2.3-54-g00ecf