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)
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)
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)
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)
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)
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)
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)
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)
def set_muted(self, muted: bool): raise browsertab.WebTabError('Muting is not supported on QtWebKit!')
def check_preview_support(self): raise browsertab.WebTabError( "Print previews are unsupported with QtWebEngine")
def check_printer_support(self): if not hasattr(self._widget.page(), 'print'): raise browsertab.WebTabError( "Printing is unsupported with QtWebEngine on Qt < 5.8")
def check_printer_support(self): raise browsertab.WebTabError( "Printing is unsupported with QtWebEngine")
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")
def set_muted(self, muted: bool, override: bool = False) -> None: raise browsertab.WebTabError('Muting is not supported on QtWebKit!')
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!")