summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <git@the-compiler.org>2018-06-07 14:27:53 +0200
committerFlorian Bruhin <git@the-compiler.org>2018-06-07 14:36:12 +0200
commitd1cced0da44cdaff6e1a39979a312a8d403bb626 (patch)
tree8e038ca3b1d9ee6e6f72f3399357e55f779ca62e
parent22644c41da6ed1bc1a9692e30bc4b20d7e0e3200 (diff)
downloadqutebrowser-d1cced0da44cdaff6e1a39979a312a8d403bb626.tar.gz
qutebrowser-d1cced0da44cdaff6e1a39979a312a8d403bb626.zip
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)
-rw-r--r--qutebrowser/browser/webelem.py6
-rw-r--r--qutebrowser/browser/webengine/webengineelem.py9
-rw-r--r--qutebrowser/browser/webkit/webkitelem.py3
-rw-r--r--qutebrowser/utils/urlutils.py15
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.