def pytest_collection_modifyitems(config, items): """Apply @qtwebengine_* markers; skip unittests with QUTE_BDD_WEBENGINE.""" markers = [ ('qtwebengine_todo', 'QtWebEngine TODO', pytest.mark.xfail, config.webengine), ('qtwebengine_skip', 'Skipped with QtWebEngine', pytest.mark.skipif, config.webengine), ('qtwebkit_skip', 'Skipped with QtWebKit', pytest.mark.skipif, not config.webengine), ('qtwebkit_ng_xfail', 'Failing with QtWebKit-NG', pytest.mark.xfail, not config.webengine and qtutils.is_qtwebkit_ng()), ('qtwebkit_ng_skip', 'Skipped with QtWebKit-NG', pytest.mark.skipif, not config.webengine and qtutils.is_qtwebkit_ng()), ('qtwebengine_flaky', 'Flaky with QtWebEngine', pytest.mark.skipif, config.webengine), ('qtwebengine_mac_xfail', 'Fails on macOS with QtWebEngine', pytest.mark.xfail, config.webengine and sys.platform == 'darwin'), ] for item in items: for name, prefix, pytest_mark, condition in markers: marker = item.get_marker(name) if marker and condition: if marker.args: text = '{}: {}'.format(prefix, marker.args[0]) else: text = prefix item.add_marker( pytest_mark(condition, reason=text, **marker.kwargs))
def pytest_collection_modifyitems(config, items): """Apply @qtwebengine_* markers; skip unittests with QUTE_BDD_WEBENGINE.""" markers = [ ('qtwebengine_todo', 'QtWebEngine TODO', pytest.mark.xfail, config.webengine), ('qtwebengine_skip', 'Skipped with QtWebEngine', pytest.mark.skipif, config.webengine), ('qtwebkit_skip', 'Skipped with QtWebKit', pytest.mark.skipif, not config.webengine), ('qtwebkit_ng_xfail', 'Failing with QtWebKit-NG', pytest.mark.xfail, not config.webengine and qtutils.is_qtwebkit_ng()), ('qtwebkit_ng_skip', 'Skipped with QtWebKit-NG', pytest.mark.skipif, not config.webengine and qtutils.is_qtwebkit_ng()), ('qtwebengine_flaky', 'Flaky with QtWebEngine', pytest.mark.skipif, config.webengine), ('qtwebengine_osx_xfail', 'Fails on OS X with QtWebEngine', pytest.mark.xfail, config.webengine and sys.platform == 'darwin'), ] for item in items: for name, prefix, pytest_mark, condition in markers: marker = item.get_marker(name) if marker and condition: if marker.args: text = '{}: {}'.format(prefix, marker.args[0]) else: text = prefix item.add_marker(pytest_mark(condition, reason=text, **marker.kwargs))
def _init_private_browsing(): if config.get('general', 'private-browsing'): if qtutils.is_qtwebkit_ng(qWebKitVersion()): message.warning("Private browsing is not fully implemented by " "QtWebKit-NG!") QWebSettings.setIconDatabasePath('') else: QWebSettings.setIconDatabasePath(standarddir.cache())
def _backend(): """Get the backend line with relevant information.""" if objects.backend == usertypes.Backend.QtWebKit: return 'QtWebKit{} (WebKit {})'.format( '-NG' if qtutils.is_qtwebkit_ng() else '', qWebKitVersion()) else: webengine = usertypes.Backend.QtWebEngine assert objects.backend == webengine, objects.backend return 'QtWebEngine (Chromium {})'.format(_chromium_version())
def _backend(): """Get the backend line with relevant information.""" if objects.backend == usertypes.Backend.QtWebKit: return 'QtWebKit{} (WebKit {})'.format( '-NG' if qtutils.is_qtwebkit_ng() else '', qWebKitVersion()) else: webengine = usertypes.Backend.QtWebEngine assert objects.backend == webengine, objects.backend return 'QtWebEngine (Chromium {})'.format(_chromium_version())
def qute_history(url): """Handler for qute://history. Display and serve history.""" if url.path() == '/data': try: offset = QUrlQuery(url).queryItemValue("offset") offset = int(offset) if offset else None except ValueError as e: raise QuteSchemeError("Query parameter offset is invalid", e) # Use start_time in query or current time. try: start_time = QUrlQuery(url).queryItemValue("start_time") start_time = float(start_time) if start_time else time.time() except ValueError as e: raise QuteSchemeError("Query parameter start_time is invalid", e) return 'text/html', json.dumps(history_data(start_time, offset)) else: if (config.get('content', 'allow-javascript') and (objects.backend == usertypes.Backend.QtWebEngine or qtutils.is_qtwebkit_ng())): return 'text/html', jinja.render('history.html', title='History', session_interval=config.get( 'ui', 'history-session-interval')) else: # Get current date from query parameter, if not given choose today. curr_date = datetime.date.today() try: query_date = QUrlQuery(url).queryItemValue("date") if query_date: curr_date = datetime.datetime.strptime( query_date, "%Y-%m-%d").date() except ValueError: log.misc.debug("Invalid date passed to qute:history: " + query_date) one_day = datetime.timedelta(days=1) next_date = curr_date + one_day prev_date = curr_date - one_day # start_time is the last second of curr_date start_time = time.mktime(next_date.timetuple()) - 1 history = [(i["url"], i["title"], datetime.datetime.fromtimestamp(i["time"]), QUrl(i["url"]).host()) for i in history_data(start_time)] return 'text/html', jinja.render( 'history_nojs.html', title='History', history=history, curr_date=curr_date, next_date=next_date, prev_date=prev_date, today=datetime.date.today(), )
def qute_history(url): """Handler for qute://history. Display and serve history.""" if url.path() == '/data': # Use start_time in query or current time. try: start_time = QUrlQuery(url).queryItemValue("start_time") start_time = float(start_time) if start_time else time.time() except ValueError as e: raise QuteSchemeError("Query parameter start_time is invalid", e) return 'text/html', json.dumps(history_data(start_time)) else: if ( config.get('content', 'allow-javascript') and (objects.backend == usertypes.Backend.QtWebEngine or qtutils.is_qtwebkit_ng()) ): return 'text/html', jinja.render( 'history.html', title='History', session_interval=config.get('ui', 'history-session-interval') ) else: # Get current date from query parameter, if not given choose today. curr_date = datetime.date.today() try: query_date = QUrlQuery(url).queryItemValue("date") if query_date: curr_date = datetime.datetime.strptime(query_date, "%Y-%m-%d").date() except ValueError: log.misc.debug("Invalid date passed to qute:history: " + query_date) one_day = datetime.timedelta(days=1) next_date = curr_date + one_day prev_date = curr_date - one_day # start_time is the last second of curr_date start_time = time.mktime(next_date.timetuple()) - 1 history = [ (i["url"], i["title"], datetime.datetime.fromtimestamp(i["time"]/1000), QUrl(i["url"]).host()) for i in history_data(start_time) if "next" not in i ] return 'text/html', jinja.render( 'history_nojs.html', title='History', history=history, curr_date=curr_date, next_date=next_date, prev_date=prev_date, today=datetime.date.today(), )
def serialize(items): """Serialize a list of QWebHistoryItems to a data stream. Args: items: An iterable of WebHistoryItems. Return: A (stream, data, user_data) tuple. stream: The reset QDataStream. data: The QByteArray with the raw data. user_data: A list with each item's user data. Warning: If 'data' goes out of scope, reading from 'stream' will result in a segfault! """ data = QByteArray() stream = QDataStream(data, QIODevice.ReadWrite) user_data = [] current_idx = None for i, item in enumerate(items): if item.active: if current_idx is not None: raise ValueError("Multiple active items ({} and {}) " "found!".format(current_idx, i)) else: current_idx = i if items: if current_idx is None: raise ValueError("No active item found!") else: current_idx = 0 if qtutils.is_qtwebkit_ng(): _serialize_ng(items, current_idx, stream) else: _serialize_old(items, current_idx, stream) user_data += [item.user_data for item in items] stream.device().reset() qtutils.check_qdatastream(stream) return stream, data, user_data
def pytest_collection_modifyitems(config, items): """Apply @qtwebengine_* markers; skip unittests with QUTE_BDD_WEBENGINE.""" if config.webengine: qtwebkit_ng_used = False else: try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: qtwebkit_ng_used = False else: qtwebkit_ng_used = qtutils.is_qtwebkit_ng(qWebKitVersion()) markers = [ ('qtwebengine_todo', 'QtWebEngine TODO', pytest.mark.xfail, config.webengine), ('qtwebengine_skip', 'Skipped with QtWebEngine', pytest.mark.skipif, config.webengine), ('qtwebkit_skip', 'Skipped with QtWebKit', pytest.mark.skipif, not config.webengine), ('qtwebkit_ng_xfail', 'Failing with QtWebKit-NG', pytest.mark.xfail, qtwebkit_ng_used), ('qtwebkit_ng_skip', 'Skipped with QtWebKit-NG', pytest.mark.skipif, qtwebkit_ng_used), ('qtwebengine_flaky', 'Flaky with QtWebEngine', pytest.mark.skipif, config.webengine), ('qtwebengine_osx_xfail', 'Fails on OS X with QtWebEngine', pytest.mark.xfail, config.webengine and sys.platform == 'darwin'), ] for item in items: for name, prefix, pytest_mark, condition in markers: marker = item.get_marker(name) if marker and condition: if marker.args: text = '{}: {}'.format(prefix, marker.args[0]) else: text = prefix item.add_marker( pytest_mark(condition, reason=text, **marker.kwargs))
def _open_special_pages(args): """Open special notification pages which are only shown once. Currently this is: - Quickstart page if it's the first start. - Legacy QtWebKit warning if needed. Args: args: The argparse namespace. """ if args.basedir is not None: # With --basedir given, don't open anything. return state_config = objreg.get('state-config') tabbed_browser = objreg.get('tabbed-browser', scope='window', window='last-focused') # Legacy QtWebKit warning needs_warning = (objects.backend == usertypes.Backend.QtWebKit and not qtutils.is_qtwebkit_ng()) warning_shown = state_config['general'].get('backend-warning-shown') == '1' if not warning_shown and needs_warning: tabbed_browser.tabopen(QUrl('qute://backend-warning'), background=False) state_config['general']['backend-warning-shown'] = '1' # Quickstart page quickstart_done = state_config['general'].get('quickstart-done') == '1' if not quickstart_done: tabbed_browser.tabopen( QUrl('https://www.qutebrowser.org/quickstart.html')) state_config['general']['quickstart-done'] = '1'
def _open_special_pages(args): """Open special notification pages which are only shown once. Currently this is: - Quickstart page if it's the first start. - Legacy QtWebKit warning if needed. Args: args: The argparse namespace. """ if args.basedir is not None: # With --basedir given, don't open anything. return state_config = objreg.get('state-config') tabbed_browser = objreg.get('tabbed-browser', scope='window', window='last-focused') # Legacy QtWebKit warning needs_warning = (objects.backend == usertypes.Backend.QtWebKit and not qtutils.is_qtwebkit_ng()) warning_shown = state_config['general'].get('backend-warning-shown') == '1' if not warning_shown and needs_warning: tabbed_browser.tabopen(QUrl('qute://backend-warning'), background=False) state_config['general']['backend-warning-shown'] = '1' # Quickstart page quickstart_done = state_config['general'].get('quickstart-done') == '1' if not quickstart_done: tabbed_browser.tabopen( QUrl('https://www.qutebrowser.org/quickstart.html')) state_config['general']['quickstart-done'] = '1'
def version(): """Return a string with various version informations.""" lines = ["qutebrowser v{}".format(qutebrowser.__version__)] gitver = _git_str() if gitver is not None: lines.append("Git commit: {}".format(gitver)) backend = objects.backend.name if (qWebKitVersion is not None and objects.backend == usertypes.Backend.QtWebKit and qtutils.is_qtwebkit_ng(qWebKitVersion())): backend = 'QtWebKit-NG' lines.append("Backend: {}".format(backend)) if qVersion() != QT_VERSION_STR: qt_version = 'Qt: {} (compiled {})'.format(qVersion(), QT_VERSION_STR) else: qt_version = 'Qt: {}'.format(qVersion()) lines += [ '', '{}: {}'.format(platform.python_implementation(), platform.python_version()), qt_version, 'PyQt: {}'.format(PYQT_VERSION_STR), '', ] lines += _module_versions() lines += ['pdf.js: {}'.format(_pdfjs_version())] if qWebKitVersion is None: lines.append('Webkit: no') else: lines.append('Webkit: {}'.format(qWebKitVersion())) lines += [ 'SSL: {}'.format(QSslSocket.sslLibraryVersionString()), '', ] qapp = QApplication.instance() if qapp: style = qapp.style() lines.append('Style: {}'.format(style.metaObject().className())) importpath = os.path.dirname(os.path.abspath(qutebrowser.__file__)) lines += [ 'Platform: {}, {}'.format(platform.platform(), platform.architecture()[0]), 'Frozen: {}'.format(hasattr(sys, 'frozen')), "Imported from {}".format(importpath), ] lines += _os_info() lines += [ '', 'Paths:', ] for name, path in _path_info().items(): lines += ['{}: {}'.format(name, path)] return '\n'.join(lines)
def test_is_qtwebkit_ng(monkeypatch, version, ng): monkeypatch.setattr(qtutils, 'qWebKitVersion', lambda: version) assert qtutils.is_qtwebkit_ng() == ng
def test_is_qtwebkit_ng(version, ng): assert qtutils.is_qtwebkit_ng(version) == ng
def test_is_qtwebkit_ng(monkeypatch, version, ng): monkeypatch.setattr(qtutils, 'qWebKitVersion', lambda: version) assert qtutils.is_qtwebkit_ng() == ng