From 8a4ca25b8d20c614f667cf181527b9c2c0fd6345 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 10 Nov 2016 13:53:13 +0100 Subject: [PATCH] Avoid circular import --- qutebrowser/browser/browsertab.py | 17 ------ .../browser/webengine/certificateerror.py | 45 +++++++++++++++ qutebrowser/browser/webengine/webenginetab.py | 23 +------- qutebrowser/browser/webengine/webview.py | 4 +- .../browser/webkit/certificateerror.py | 55 +++++++++++++++++++ .../browser/webkit/network/networkmanager.py | 4 +- qutebrowser/browser/webkit/webkittab.py | 31 ----------- qutebrowser/utils/usertypes.py | 17 ++++++ tests/end2end/features/test_prompts_bdd.py | 17 ++++++ tests/unit/utils/usertypes/test_misc.py | 27 +++++++++ 10 files changed, 166 insertions(+), 74 deletions(-) create mode 100644 qutebrowser/browser/webengine/certificateerror.py create mode 100644 qutebrowser/browser/webkit/certificateerror.py create mode 100644 tests/unit/utils/usertypes/test_misc.py diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 2589154a5..22f1c7e51 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -75,23 +75,6 @@ class UnsupportedOperationError(WebTabError): """Raised when an operation is not supported with the given backend.""" -class AbstractCertificateErrorWrapper: - - """A wrapper over an SSL/certificate error.""" - - def __init__(self, error): - self._error = error - - def __str__(self): - raise NotImplementedError - - def __repr__(self): - raise NotImplementedError - - def is_overridable(self): - raise NotImplementedError - - class TabData: """A simple namespace with a fixed set of attributes. diff --git a/qutebrowser/browser/webengine/certificateerror.py b/qutebrowser/browser/webengine/certificateerror.py new file mode 100644 index 000000000..dcc791a56 --- /dev/null +++ b/qutebrowser/browser/webengine/certificateerror.py @@ -0,0 +1,45 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2016 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Wrapper over a QWebEngineCertificateError.""" + + +from PyQt5.QtWebEngineWidgets import QWebEngineCertificateError + +from qutebrowser.utils import usertypes, utils, debug + + +class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper): + + """A wrapper over a QWebEngineCertificateError.""" + + def __init__(self, error): + self._error = error + + def __str__(self): + return self._error.errorDescription() + + def __repr__(self): + return utils.get_repr( + self, error=debug.qenum_key(QWebEngineCertificateError, + self._error.error()), + string=str(self)) + + def is_overridable(self): + return self._error.isOverridable() diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 9ec89836a..8a2846999 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -30,8 +30,7 @@ from PyQt5.QtGui import QKeyEvent, QIcon # pylint: disable=no-name-in-module,import-error,useless-suppression from PyQt5.QtWidgets import QOpenGLWidget, QApplication from PyQt5.QtWebEngineWidgets import (QWebEnginePage, QWebEngineScript, - QWebEngineProfile, - QWebEngineCertificateError) + QWebEngineProfile) # pylint: enable=no-name-in-module,import-error,useless-suppression from qutebrowser.browser import browsertab, mouse, shared @@ -79,26 +78,6 @@ _JS_WORLD_MAP = { } -class CertificateErrorWrapper(browsertab.AbstractCertificateErrorWrapper): - - """A wrapper over a QWebEngineCertificateError.""" - - def __init__(self, error): - self._error = error - - def __str__(self): - return self._error.errorDescription() - - def __repr__(self): - return utils.get_repr( - self, error=debug.qenum_key(QWebEngineCertificateError, - self._error.error()), - string=str(self)) - - def is_overridable(self): - return self._error.isOverridable() - - class WebEnginePrinting(browsertab.AbstractPrinting): """QtWebEngine implementations related to printing.""" diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py index a486d40db..020eddf2a 100644 --- a/qutebrowser/browser/webengine/webview.py +++ b/qutebrowser/browser/webengine/webview.py @@ -27,7 +27,7 @@ from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage # pylint: enable=no-name-in-module,import-error,useless-suppression from qutebrowser.browser import shared -from qutebrowser.browser.webengine import webenginetab +from qutebrowser.browser.webengine import webenginetab, certificateerror from qutebrowser.config import config from qutebrowser.utils import log, debug, usertypes, objreg, qtutils, jinja @@ -129,7 +129,7 @@ class WebEnginePage(QWebEnginePage): def certificateError(self, error): self.certificate_error.emit() url = error.url() - error = webenginetab.CertificateErrorWrapper(error) + error = certificateerror.CertificateErrorWrapper(error) log.webview.debug("Certificate error: {}".format(error)) url_string = url.toDisplayString() diff --git a/qutebrowser/browser/webkit/certificateerror.py b/qutebrowser/browser/webkit/certificateerror.py new file mode 100644 index 000000000..14d8ccddd --- /dev/null +++ b/qutebrowser/browser/webkit/certificateerror.py @@ -0,0 +1,55 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2016 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Wrapper over a QSslCertificateError.""" + + +from PyQt5.QtNetwork import QSslError + +from qutebrowser.utils import usertypes, utils, debug + + +class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper): + + """A wrapper over a QSslError.""" + + def __init__(self, error): + self._error = error + + def __str__(self): + return self._error.errorString() + + def __repr__(self): + return utils.get_repr( + self, error=debug.qenum_key(QSslError, self._error.error()), + string=str(self)) + + def __hash__(self): + try: + # Qt >= 5.4 + return hash(self._error) + except TypeError: + return hash((self._error.certificate().toDer(), + self._error.error())) + + def __eq__(self, other): + return self._error == other._error + + def is_overridable(self): + return True diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 6294efc1e..06c33fe7f 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -33,7 +33,7 @@ from qutebrowser.config import config from qutebrowser.utils import (message, log, usertypes, utils, objreg, qtutils, urlutils, debug) from qutebrowser.browser import shared -from qutebrowser.browser.webkit import webkittab +from qutebrowser.browser.webkit import webkittab, certificateerror from qutebrowser.browser.webkit.network import (webkitqutescheme, networkreply, filescheme) @@ -233,7 +233,7 @@ class NetworkManager(QNetworkAccessManager): reply: The QNetworkReply that is encountering the errors. errors: A list of errors. """ - errors = [webkittab.CertificateErrorWrapper(e) for e in errors] + errors = [certificateerror.CertificateErrorWrapper(e) for e in errors] log.webview.debug("Certificate errors: {!r}".format( ' / '.join(str(err) for err in errors))) try: diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index a2bbb2b9a..ded0d6c66 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -30,7 +30,6 @@ from PyQt5.QtWidgets import QApplication from PyQt5.QtWebKitWidgets import QWebPage, QWebFrame from PyQt5.QtWebKit import QWebSettings from PyQt5.QtPrintSupport import QPrinter -from PyQt5.QtNetwork import QSslError from qutebrowser.browser import browsertab from qutebrowser.browser.webkit import webview, tabhistory, webkitelem @@ -50,36 +49,6 @@ def init(): objreg.register('js-bridge', js_bridge) -class CertificateErrorWrapper(browsertab.AbstractCertificateErrorWrapper): - - """A wrapper over a QSslError.""" - - def __init__(self, error): - self._error = error - - def __str__(self): - return self._error.errorString() - - def __repr__(self): - return utils.get_repr( - self, error=debug.qenum_key(QSslError, self._error.error()), - string=str(self)) - - def __hash__(self): - try: - # Qt >= 5.4 - return hash(self._error) - except TypeError: - return hash((self._error.certificate().toDer(), - self._error.error())) - - def __eq__(self, other): - return self._error == other._error - - def is_overridable(self): - return True - - class WebKitPrinting(browsertab.AbstractPrinting): """QtWebKit implementations related to printing.""" diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 1d2788ba1..7ad89b3a2 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -402,3 +402,20 @@ class Timer(QTimer): super().start(msec) else: super().start() + + +class AbstractCertificateErrorWrapper: + + """A wrapper over an SSL/certificate error.""" + + def __init__(self, error): + self._error = error + + def __str__(self): + raise NotImplementedError + + def __repr__(self): + raise NotImplementedError + + def is_overridable(self): + raise NotImplementedError diff --git a/tests/end2end/features/test_prompts_bdd.py b/tests/end2end/features/test_prompts_bdd.py index 2711d3888..6fe1c3e69 100644 --- a/tests/end2end/features/test_prompts_bdd.py +++ b/tests/end2end/features/test_prompts_bdd.py @@ -64,3 +64,20 @@ def ssl_error_page(request, quteproc): "loading page: *'") content = quteproc.get_content().strip() assert "Unable to load page" in content + + +class AbstractCertificateErrorWrapper: + + """A wrapper over an SSL/certificate error.""" + + def __init__(self, error): + self._error = error + + def __str__(self): + raise NotImplementedError + + def __repr__(self): + raise NotImplementedError + + def is_overridable(self): + raise NotImplementedError diff --git a/tests/unit/utils/usertypes/test_misc.py b/tests/unit/utils/usertypes/test_misc.py new file mode 100644 index 000000000..c2c0738e5 --- /dev/null +++ b/tests/unit/utils/usertypes/test_misc.py @@ -0,0 +1,27 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2016 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + + +from qutebrowser.utils import usertypes + + +def test_abstract_certificate_error_wrapper(): + err = object() + wrapper = usertypes.AbstractCertificateErrorWrapper(err) + assert wrapper._error is err