Move hint webelem code to utils.webelem
This commit is contained in:
parent
6fb52e610d
commit
b372c23b80
@ -29,6 +29,7 @@ import qutebrowser.config.config as config
|
|||||||
import qutebrowser.utils.message as message
|
import qutebrowser.utils.message as message
|
||||||
import qutebrowser.utils.url as urlutils
|
import qutebrowser.utils.url as urlutils
|
||||||
import qutebrowser.utils.modemanager as modemanager
|
import qutebrowser.utils.modemanager as modemanager
|
||||||
|
import qutebrowser.utils.webelem as webelem
|
||||||
from qutebrowser.utils.keyparser import KeyParser
|
from qutebrowser.utils.keyparser import KeyParser
|
||||||
|
|
||||||
|
|
||||||
@ -86,10 +87,6 @@ class HintManager(QObject):
|
|||||||
"""Manage drawing hints over links or other elements.
|
"""Manage drawing hints over links or other elements.
|
||||||
|
|
||||||
Class attributes:
|
Class attributes:
|
||||||
SELECTORS: CSS selectors for the different highlighting modes.
|
|
||||||
FILTERS: A dictionary of filter functions for the modes.
|
|
||||||
The filter for "links" filters javascript:-links and a-tags
|
|
||||||
without "href".
|
|
||||||
HINT_CSS: The CSS template to use for hints.
|
HINT_CSS: The CSS template to use for hints.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
@ -114,23 +111,6 @@ class HintManager(QObject):
|
|||||||
set_cmd_text: Emitted when the commandline text should be set.
|
set_cmd_text: Emitted when the commandline text should be set.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
SELECTORS = {
|
|
||||||
"all": ("a, textarea, select, input:not([type=hidden]), button, "
|
|
||||||
"frame, iframe, [onclick], [onmousedown], [role=link], "
|
|
||||||
"[role=option], [role=button], img"),
|
|
||||||
"links": "a",
|
|
||||||
"images": "img",
|
|
||||||
"editable": ("input[type=text], input[type=email], input[type=url],"
|
|
||||||
"input[type=tel], input[type=number], "
|
|
||||||
"input[type=password], input[type=search], textarea"),
|
|
||||||
"url": "[src], [href]",
|
|
||||||
}
|
|
||||||
|
|
||||||
FILTERS = {
|
|
||||||
"links": (lambda e: e.hasAttribute("href") and
|
|
||||||
urlutils.qurl(e.attribute("href")).scheme() != "javascript"),
|
|
||||||
}
|
|
||||||
|
|
||||||
HINT_CSS = """
|
HINT_CSS = """
|
||||||
color: {config[colors][hints.fg]};
|
color: {config[colors][hints.fg]};
|
||||||
background: {config[colors][hints.bg]};
|
background: {config[colors][hints.bg]};
|
||||||
@ -355,21 +335,11 @@ class HintManager(QObject):
|
|||||||
self._target = target
|
self._target = target
|
||||||
self._baseurl = baseurl
|
self._baseurl = baseurl
|
||||||
self._frame = frame
|
self._frame = frame
|
||||||
elems = frame.findAllElements(self.SELECTORS[mode])
|
elems = frame.findAllElements(webelem.SELECTORS[mode])
|
||||||
filterfunc = self.FILTERS.get(mode, lambda e: True)
|
filterfunc = webelem.FILTERS.get(mode, lambda e: True)
|
||||||
visible_elems = []
|
visible_elems = []
|
||||||
for e in elems:
|
for e in elems:
|
||||||
if not filterfunc(e):
|
if filterfunc(e) and webelem.is_visible(e, self._frame):
|
||||||
continue
|
|
||||||
rect = e.geometry()
|
|
||||||
if (not rect.isValid()) and rect.x() == 0:
|
|
||||||
# Most likely an invisible link
|
|
||||||
continue
|
|
||||||
framegeom = frame.geometry()
|
|
||||||
framegeom.translate(frame.scrollPosition())
|
|
||||||
if not framegeom.contains(rect.topLeft()):
|
|
||||||
# out of screen
|
|
||||||
continue
|
|
||||||
visible_elems.append(e)
|
visible_elems.append(e)
|
||||||
if not visible_elems:
|
if not visible_elems:
|
||||||
message.error("No elements found.")
|
message.error("No elements found.")
|
||||||
|
74
qutebrowser/utils/webelem.py
Normal file
74
qutebrowser/utils/webelem.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Copyright 2014 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
|
||||||
|
#
|
||||||
|
# This file is part of qutebrowser.
|
||||||
|
#
|
||||||
|
# qutebrowser is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# qutebrowser is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
"""Utilities related to QWebElements.
|
||||||
|
|
||||||
|
Module attributes:
|
||||||
|
SELECTORS: CSS selectors for different groups of elements.
|
||||||
|
FILTERS: A dictionary of filter functions for the modes.
|
||||||
|
The filter for "links" filters javascript:-links and a-tags
|
||||||
|
without "href".
|
||||||
|
"""
|
||||||
|
|
||||||
|
import qutebrowser.utils.url as urlutils
|
||||||
|
|
||||||
|
SELECTORS = {
|
||||||
|
'all': ('a, textarea, select, input:not([type=hidden]), button, '
|
||||||
|
'frame, iframe, [onclick], [onmousedown], [role=link], '
|
||||||
|
'[role=option], [role=button], img'),
|
||||||
|
'links': 'a',
|
||||||
|
'images': 'img',
|
||||||
|
'editable': ('input[type=text], input[type=email], input[type=url], '
|
||||||
|
'input[type=tel], input[type=number], '
|
||||||
|
'input[type=password], input[type=search], textarea'),
|
||||||
|
'url': '[src], [href]',
|
||||||
|
}
|
||||||
|
|
||||||
|
SELECTORS['editable_focused'] = ', '.join(
|
||||||
|
[sel.strip() + ':focus' for sel in SELECTORS['editable'].split(',')])
|
||||||
|
|
||||||
|
FILTERS = {
|
||||||
|
'links': (lambda e: e.hasAttribute('href') and
|
||||||
|
urlutils.qurl(e.attribute('href')).scheme() != 'javascript'),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def is_visible(e, frame=None):
|
||||||
|
"""Check whether the element is currently visible in its frame.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
e: The QWebElement to check.
|
||||||
|
frame: The QWebFrame in which the element should be visible in.
|
||||||
|
If None, the element's frame is used.
|
||||||
|
|
||||||
|
Return:
|
||||||
|
True if the element is visible, False otherwise.
|
||||||
|
"""
|
||||||
|
if e.isNull():
|
||||||
|
raise ValueError("Element is a null-element!")
|
||||||
|
if frame is None:
|
||||||
|
frame = e.webFrame()
|
||||||
|
rect = e.geometry()
|
||||||
|
if (not rect.isValid()) and rect.x() == 0:
|
||||||
|
# Most likely an invisible link
|
||||||
|
return False
|
||||||
|
framegeom = frame.geometry()
|
||||||
|
framegeom.translate(frame.scrollPosition())
|
||||||
|
if not framegeom.contains(rect.topLeft()):
|
||||||
|
# out of screen
|
||||||
|
return False
|
||||||
|
return True
|
@ -29,6 +29,7 @@ import qutebrowser.utils.url as urlutils
|
|||||||
import qutebrowser.config.config as config
|
import qutebrowser.config.config as config
|
||||||
import qutebrowser.utils.message as message
|
import qutebrowser.utils.message as message
|
||||||
import qutebrowser.utils.modemanager as modemanager
|
import qutebrowser.utils.modemanager as modemanager
|
||||||
|
import qutebrowser.utils.webelem as webelem
|
||||||
from qutebrowser.browser.webpage import BrowserPage
|
from qutebrowser.browser.webpage import BrowserPage
|
||||||
from qutebrowser.browser.hints import HintManager
|
from qutebrowser.browser.hints import HintManager
|
||||||
from qutebrowser.utils.signals import SignalCache
|
from qutebrowser.utils.signals import SignalCache
|
||||||
@ -250,8 +251,8 @@ class BrowserTab(QWebView):
|
|||||||
modemanager.maybe_leave("insert")
|
modemanager.maybe_leave("insert")
|
||||||
elif config.get('general', 'auto_insert_mode'):
|
elif config.get('general', 'auto_insert_mode'):
|
||||||
frame = self.page_.currentFrame()
|
frame = self.page_.currentFrame()
|
||||||
# FIXME better selector (from hintmanager)
|
elem = frame.findFirstElement(
|
||||||
elem = frame.findFirstElement('*:focus')
|
webelem.SELECTORS['editable_focused'])
|
||||||
logging.debug("focus element: {}".format(not elem.isNull()))
|
logging.debug("focus element: {}".format(not elem.isNull()))
|
||||||
if elem.isNull():
|
if elem.isNull():
|
||||||
modemanager.maybe_leave("insert")
|
modemanager.maybe_leave("insert")
|
||||||
|
Loading…
Reference in New Issue
Block a user