summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.