Add error handling for invalid selectors
This commit is contained in:
parent
6d4c8f5b13
commit
121483aa90
@ -632,6 +632,9 @@ class AbstractElements:
|
|||||||
def find_css(self, selector, callback, *, only_visible=False):
|
def find_css(self, selector, callback, *, only_visible=False):
|
||||||
"""Find all HTML elements matching a given selector async.
|
"""Find all HTML elements matching a given selector async.
|
||||||
|
|
||||||
|
If there's an error, the callback is called with a webelem.Error
|
||||||
|
instance.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
callback: The callback to be called when the search finished.
|
callback: The callback to be called when the search finished.
|
||||||
selector: The CSS selector to search for.
|
selector: The CSS selector to search for.
|
||||||
|
@ -601,8 +601,12 @@ class HintManager(QObject):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if elems is None:
|
if elems is None:
|
||||||
message.error("There was an error while getting hint elements")
|
message.error("Unknown error while getting hint elements.")
|
||||||
return
|
return
|
||||||
|
elif isinstance(elems, webelem.Error):
|
||||||
|
message.error(str(elems))
|
||||||
|
return
|
||||||
|
|
||||||
if not elems:
|
if not elems:
|
||||||
message.error("No elements found.")
|
message.error("No elements found.")
|
||||||
return
|
return
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
import posixpath
|
import posixpath
|
||||||
|
|
||||||
|
from qutebrowser.browser import webelem
|
||||||
from qutebrowser.config import config
|
from qutebrowser.config import config
|
||||||
from qutebrowser.utils import objreg, urlutils, log, message, qtutils
|
from qutebrowser.utils import objreg, urlutils, log, message, qtutils
|
||||||
from qutebrowser.mainwindow import mainwindow
|
from qutebrowser.mainwindow import mainwindow
|
||||||
@ -116,7 +117,10 @@ def prevnext(*, browsertab, win_id, baseurl, prev=False,
|
|||||||
"""
|
"""
|
||||||
def _prevnext_cb(elems):
|
def _prevnext_cb(elems):
|
||||||
if elems is None:
|
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
|
return
|
||||||
|
|
||||||
elem = _find_prevnext(prev, elems)
|
elem = _find_prevnext(prev, elems)
|
||||||
|
@ -596,9 +596,12 @@ class WebEngineElements(browsertab.AbstractElements):
|
|||||||
if js_elems is None:
|
if js_elems is None:
|
||||||
callback(None)
|
callback(None)
|
||||||
return
|
return
|
||||||
|
elif not js_elems['success']:
|
||||||
|
callback(webelem.Error(js_elems['error']))
|
||||||
|
return
|
||||||
|
|
||||||
elems = []
|
elems = []
|
||||||
for js_elem in js_elems:
|
for js_elem in js_elems['result']:
|
||||||
elem = webengineelem.WebEngineElement(js_elem, tab=self._tab)
|
elem = webengineelem.WebEngineElement(js_elem, tab=self._tab)
|
||||||
elems.append(elem)
|
elems.append(elem)
|
||||||
callback(elems)
|
callback(elems)
|
||||||
|
@ -214,7 +214,14 @@ window._qutebrowser.webelem = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
funcs.find_css = (selector, only_visible) => {
|
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 subelem_frames = window.frames;
|
||||||
const out = [];
|
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
|
// Runs a function in a frame until the result is not null, then return
|
||||||
|
@ -213,6 +213,13 @@ Feature: Using hints
|
|||||||
And I hint with args "custom" and follow a
|
And I hint with args "custom" and follow a
|
||||||
Then the javascript message "beep!" should be logged
|
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
|
# https://github.com/qutebrowser/qutebrowser/issues/1613
|
||||||
Scenario: Hinting inputs with padding
|
Scenario: Hinting inputs with padding
|
||||||
When I open data/hints/input.html
|
When I open data/hints/input.html
|
||||||
|
@ -75,6 +75,11 @@ Feature: Using :navigate
|
|||||||
And I run :navigate next
|
And I run :navigate next
|
||||||
Then data/navigate/next.html should be loaded
|
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
|
# increment/decrement
|
||||||
|
|
||||||
Scenario: Incrementing number in URL
|
Scenario: Incrementing number in URL
|
||||||
|
Loading…
Reference in New Issue
Block a user