diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index eb67cf091..3964472df 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -632,6 +632,9 @@ class AbstractElements: def find_css(self, selector, callback, *, only_visible=False): """Find all HTML elements matching a given selector async. + If there's an error, the callback is called with a webelem.Error + instance. + Args: callback: The callback to be called when the search finished. selector: The CSS selector to search for. diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index dfeef48ed..05833be80 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -601,8 +601,12 @@ class HintManager(QObject): return if elems is None: - message.error("There was an error while getting hint elements") + message.error("Unknown error while getting hint elements.") return + elif isinstance(elems, webelem.Error): + message.error(str(elems)) + return + if not elems: message.error("No elements found.") return diff --git a/qutebrowser/browser/navigate.py b/qutebrowser/browser/navigate.py index f3da0c18e..69660e746 100644 --- a/qutebrowser/browser/navigate.py +++ b/qutebrowser/browser/navigate.py @@ -21,6 +21,7 @@ import posixpath +from qutebrowser.browser import webelem from qutebrowser.config import config from qutebrowser.utils import objreg, urlutils, log, message, qtutils from qutebrowser.mainwindow import mainwindow @@ -116,7 +117,10 @@ def prevnext(*, browsertab, win_id, baseurl, prev=False, """ def _prevnext_cb(elems): if elems is None: - message.error("There was an error while getting hint elements") + message.error("Unknown error while getting hint elements") + return + elif isinstance(elems, webelem.Error): + message.error(str(elems)) return elem = _find_prevnext(prev, elems) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index db3bdf6e2..944c4ce6d 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -596,9 +596,12 @@ class WebEngineElements(browsertab.AbstractElements): if js_elems is None: callback(None) return + elif not js_elems['success']: + callback(webelem.Error(js_elems['error'])) + return elems = [] - for js_elem in js_elems: + for js_elem in js_elems['result']: elem = webengineelem.WebEngineElement(js_elem, tab=self._tab) elems.append(elem) callback(elems) diff --git a/qutebrowser/javascript/webelem.js b/qutebrowser/javascript/webelem.js index 55b2f96c4..c9d2d09a6 100644 --- a/qutebrowser/javascript/webelem.js +++ b/qutebrowser/javascript/webelem.js @@ -214,7 +214,14 @@ window._qutebrowser.webelem = (function() { } funcs.find_css = (selector, only_visible) => { - const elems = document.querySelectorAll(selector); + let elems; + + try { + elems = document.querySelectorAll(selector); + } catch (ex) { + return {"success": false, "error": ex.toString()}; + } + const subelem_frames = window.frames; const out = []; @@ -239,7 +246,7 @@ window._qutebrowser.webelem = (function() { } } - return out; + return {"success": true, "result": out}; }; // Runs a function in a frame until the result is not null, then return diff --git a/tests/end2end/features/hints.feature b/tests/end2end/features/hints.feature index 2cb6dee4c..1ecc70966 100644 --- a/tests/end2end/features/hints.feature +++ b/tests/end2end/features/hints.feature @@ -213,6 +213,13 @@ Feature: Using hints And I hint with args "custom" and follow a Then the javascript message "beep!" should be logged + @qtwebkit_skip + Scenario: Invalid custom selector + When I open data/hints/custom_group.html + And I set hints.selectors to {"custom":["@"]} + And I run :hint custom + Then the error "SyntaxError: Failed to execute 'querySelectorAll' on 'Document': '@' is not a valid selector." should be shown + # https://github.com/qutebrowser/qutebrowser/issues/1613 Scenario: Hinting inputs with padding When I open data/hints/input.html diff --git a/tests/end2end/features/navigate.feature b/tests/end2end/features/navigate.feature index a65e4f5d1..23d8dd732 100644 --- a/tests/end2end/features/navigate.feature +++ b/tests/end2end/features/navigate.feature @@ -75,6 +75,11 @@ Feature: Using :navigate And I run :navigate next Then data/navigate/next.html should be loaded + Scenario: Navigating with invalid selector + When I set hints.selectors to {"links": ["@"]} + And I run :navigate next + Then the error "SyntaxError: Failed to execute 'querySelectorAll' on 'Document': '@' is not a valid selector." should be shown + # increment/decrement Scenario: Incrementing number in URL