Пример #1
0
    def follow_selected(self, *, tab=False):
        if not self.has_selection():
            return
        if QWebSettings.globalSettings().testAttribute(
                QWebSettings.JavascriptEnabled):
            if tab:
                self._tab.data.override_target = usertypes.ClickTarget.tab
            self._tab.run_js_async(
                'window.getSelection().anchorNode.parentNode.click()')
        else:
            selection = self.selection(html=True)
            try:
                selected_element = xml.etree.ElementTree.fromstring(
                    '<html>{}</html>'.format(selection)).find('a')
            except xml.etree.ElementTree.ParseError:
                raise browsertab.WebTabError('Could not parse selected '
                                             'element!')

            if selected_element is not None:
                try:
                    url = selected_element.attrib['href']
                except KeyError:
                    raise browsertab.WebTabError('Anchor element without '
                                                 'href!')
                url = self._tab.url().resolved(QUrl(url))
                if tab:
                    self._tab.new_tab_requested.emit(url)
                else:
                    self._tab.openurl(url)
Пример #2
0
 def serialize(self):
     # WORKAROUND (remove this when we bump the requirements to 5.9)
     # https://bugreports.qt.io/browse/QTBUG-59599
     if self._history.count() == 0:
         raise browsertab.WebTabError("Can't serialize page without "
                                      "history!")
     # WORKAROUND (FIXME: remove this when we bump the requirements to 5.9?)
     # https://github.com/qutebrowser/qutebrowser/issues/2289
     scheme = self._history.currentItem().url().scheme()
     if scheme in ['view-source', 'chrome']:
         raise browsertab.WebTabError("Can't serialize special URL!")
     return qtutils.serialize(self._history)
Пример #3
0
def init():
    """Initialize QtWebEngine-specific modules."""
    # For some reason we need to keep a reference, otherwise the scheme handler
    # won't work...
    # https://www.riverbankcomputing.com/pipermail/pyqt/2016-September/038075.html
    global _qute_scheme_handler
    app = QApplication.instance()

    software_rendering = os.environ.get('LIBGL_ALWAYS_SOFTWARE') == '1'
    if version.opengl_vendor() == 'nouveau' and not software_rendering:
        # FIXME:qtwebengine display something more sophisticated here
        raise browsertab.WebTabError(
            "QtWebEngine is not supported with Nouveau graphics (unless "
            "LIBGL_ALWAYS_SOFTWARE is set as environment variable).")

    log.init.debug("Initializing qute://* handler...")
    _qute_scheme_handler = webenginequtescheme.QuteSchemeHandler(parent=app)
    _qute_scheme_handler.install(webenginesettings.default_profile)
    _qute_scheme_handler.install(webenginesettings.private_profile)

    log.init.debug("Initializing request interceptor...")
    host_blocker = objreg.get('host-blocker')
    req_interceptor = interceptor.RequestInterceptor(host_blocker, parent=app)
    req_interceptor.install(webenginesettings.default_profile)
    req_interceptor.install(webenginesettings.private_profile)

    log.init.debug("Initializing QtWebEngine downloads...")
    download_manager = webenginedownloads.DownloadManager(parent=app)
    download_manager.install(webenginesettings.default_profile)
    download_manager.install(webenginesettings.private_profile)
    objreg.register('webengine-download-manager', download_manager)
Пример #4
0
 def serialize(self):
     # WORKAROUND for https://github.com/qutebrowser/qutebrowser/issues/2289
     # FIXME:qtwebengine can we get rid of this with Qt 5.8.1?
     scheme = self._history.currentItem().url().scheme()
     if scheme in ['view-source', 'chrome']:
         raise browsertab.WebTabError("Can't serialize special URL!")
     return qtutils.serialize(self._history)
Пример #5
0
 def serialize(self):
     if not qtutils.version_check('5.9'):
         # WORKAROUND for
         # https://github.com/qutebrowser/qutebrowser/issues/2289
         # Don't use the history's currentItem here, because of
         # https://bugreports.qt.io/browse/QTBUG-59599 and because it doesn't
         # contain view-source.
         scheme = self._tab.url().scheme()
         if scheme in ['view-source', 'chrome']:
             raise browsertab.WebTabError("Can't serialize special URL!")
     return qtutils.serialize(self._history)
Пример #6
0
    def follow_selected(self, *, tab=False):
        if QWebSettings.globalSettings().testAttribute(
                QWebSettings.JavascriptEnabled):
            if tab:
                self._tab.data.override_target = usertypes.ClickTarget.tab
            self._tab.run_js_async("""
                const aElm = document.activeElement;
                if (window.getSelection().anchorNode) {
                    window.getSelection().anchorNode.parentNode.click();
                } else if (aElm && aElm !== document.body) {
                    aElm.click();
                }
            """)
        else:
            selection = self._widget.selectedHtml()
            if not selection:
                # Getting here may mean we crashed, but we can't do anything
                # about that until this commit is released:
                # https://github.com/annulen/webkit/commit/0e75f3272d149bc64899c161f150eb341a2417af
                # TODO find a way to check if something is focused
                self._follow_enter(tab)
                return
            try:
                selected_element = xml.etree.ElementTree.fromstring(
                    '<html>{}</html>'.format(selection)).find('a')
            except xml.etree.ElementTree.ParseError:
                raise browsertab.WebTabError('Could not parse selected '
                                             'element!')

            if selected_element is not None:
                try:
                    url = selected_element.attrib['href']
                except KeyError:
                    raise browsertab.WebTabError('Anchor element without '
                                                 'href!')
                url = self._tab.url().resolved(QUrl(url))
                if tab:
                    self._tab.new_tab_requested.emit(url)
                else:
                    self._tab.openurl(url)
Пример #7
0
    def find_css(self, selector, callback, *, only_visible=False):
        mainframe = self._widget.page().mainFrame()
        if mainframe is None:
            raise browsertab.WebTabError("No frame focused!")

        elems = []
        frames = webkitelem.get_child_frames(mainframe)
        for f in frames:
            for elem in f.findAllElements(selector):
                elems.append(webkitelem.WebKitElement(elem, tab=self._tab))

        if only_visible:
            elems = [e for e in elems if e.is_visible(mainframe)]

        callback(elems)
Пример #8
0
    def find_css(self, selector, callback, error_cb, *, only_visible=False):
        utils.unused(error_cb)
        mainframe = self._widget.page().mainFrame()
        if mainframe is None:
            raise browsertab.WebTabError("No frame focused!")

        elems = []
        frames = webkitelem.get_child_frames(mainframe)
        for f in frames:
            for elem in f.findAllElements(selector):
                elems.append(webkitelem.WebKitElement(elem, tab=self._tab))

        if only_visible:
            # pylint: disable=protected-access
            elems = [e for e in elems if e._is_visible(mainframe)]
            # pylint: enable=protected-access

        callback(elems)
Пример #9
0
 def set_muted(self, muted: bool):
     raise browsertab.WebTabError('Muting is not supported on QtWebKit!')
Пример #10
0
 def check_preview_support(self):
     raise browsertab.WebTabError(
         "Print previews are unsupported with QtWebEngine")
Пример #11
0
 def check_printer_support(self):
     if not hasattr(self._widget.page(), 'print'):
         raise browsertab.WebTabError(
             "Printing is unsupported with QtWebEngine on Qt < 5.8")
Пример #12
0
 def check_printer_support(self):
     raise browsertab.WebTabError(
         "Printing is unsupported with QtWebEngine")
Пример #13
0
 def check_pdf_support(self):
     if not hasattr(self._widget.page(), 'printToPdf'):
         raise browsertab.WebTabError(
             "Printing to PDF is unsupported with QtWebEngine on Qt < 5.7")
Пример #14
0
 def set_muted(self, muted: bool, override: bool = False) -> None:
     raise browsertab.WebTabError('Muting is not supported on QtWebKit!')
Пример #15
0
 def _do_check(self):
     if not qtutils.check_print_compat():
         # WORKAROUND (remove this when we bump the requirements to 5.3.0)
         raise browsertab.WebTabError(
             "Printing on Qt < 5.3.0 on Windows is broken, please upgrade!")