Ejemplo n.º 1
0
    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))
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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")
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 def delete(self, elem: webelem.AbstractWebElement,
            _context: HintContext) -> None:
     elem.delete()