def call_userscript(self, elem: webelem.AbstractWebElement, context: HintContext) -> None: """Call a userscript from a hint. Args: elem: The QWebElement to use in the userscript. context: The HintContext to use. """ cmd = context.args[0] args = context.args[1:] env = { 'QUTE_MODE': 'hints', 'QUTE_SELECTED_TEXT': str(elem), 'QUTE_SELECTED_HTML': elem.outer_xml(), } url = elem.resolve_url(context.baseurl) if url is not None: flags = QUrl.FullyEncoded env['QUTE_URL'] = url.toString(flags) # type: ignore[arg-type] try: userscripts.run_async(context.tab, cmd, *args, win_id=self._win_id, env=env) except userscripts.Error as e: raise HintingError(str(e))
def click(self, elem: webelem.AbstractWebElement, context: HintContext) -> None: """Click an element.""" target_mapping = { Target.normal: usertypes.ClickTarget.normal, Target.current: usertypes.ClickTarget.normal, Target.tab_fg: usertypes.ClickTarget.tab, Target.tab_bg: usertypes.ClickTarget.tab_bg, Target.window: usertypes.ClickTarget.window, } if config.val.tabs.background: target_mapping[Target.tab] = usertypes.ClickTarget.tab_bg else: target_mapping[Target.tab] = usertypes.ClickTarget.tab if context.target in [Target.normal, Target.current]: # Set the pre-jump mark ', so we can jump back here after following context.tab.scroller.before_jump_requested.emit() try: if context.target == Target.hover: elem.hover() elif context.target == Target.right_click: elem.right_click() elif context.target == Target.current: elem.remove_blank_target() elem.click(target_mapping[context.target]) else: elem.click(target_mapping[context.target]) except webelem.Error as e: raise HintingError(str(e))
def extract_tag_words(self, elem: webelem.AbstractWebElement) -> Iterator[str]: """Extract tag words form the given element.""" _extractor_type = Callable[[webelem.AbstractWebElement], str] attr_extractors: Mapping[str, _extractor_type] = { "alt": lambda elem: elem["alt"], "name": lambda elem: elem["name"], "title": lambda elem: elem["title"], "placeholder": lambda elem: elem["placeholder"], "src": lambda elem: elem["src"].split('/')[-1], "href": lambda elem: elem["href"].split('/')[-1], "text": str, } extractable_attrs = collections.defaultdict( list, { "img": ["alt", "title", "src"], "a": ["title", "href", "text"], "input": ["name", "placeholder"], "textarea": ["name", "placeholder"], "button": ["text"] }) return (attr_extractors[attr](elem) for attr in extractable_attrs[elem.tag_name()] if attr in elem or attr == "text")
def _auto_insert_mode_cb(elem: webelem.AbstractWebElement) -> None: """Called from JS after finding the focused element.""" if elem is None: log.webview.debug("No focused element!") return if elem.is_editable(): modeman.enter(self._tab.win_id, usertypes.KeyMode.insert, 'load finished', only_if_normal=True)
def download(self, elem: webelem.AbstractWebElement, context: HintContext) -> None: """Download a hint URL. Args: elem: The QWebElement to download. _context: The HintContext to use. """ url = elem.resolve_url(context.baseurl) if url is None: raise HintingError("No suitable link found for this element.") prompt = False if context.rapid else None qnam = context.tab.private_api.networkaccessmanager() # FIXME:qtwebengine do this with QtWebEngine downloads? download_manager = objreg.get('qtnetwork-download-manager') download_manager.get(url, qnam=qnam, prompt_download_directory=prompt)
def delete(self, elem: webelem.AbstractWebElement, _context: HintContext) -> None: elem.delete()