qutebrowser/tests/end2end/features/test_prompts_bdd.py

101 lines
3.8 KiB
Python

# SPDX-FileCopyrightText: Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
import logging
import pytest_bdd as bdd
bdd.scenarios('prompts.feature')
from qutebrowser.utils import qtutils
try:
from qutebrowser.qt.webenginecore import PYQT_WEBENGINE_VERSION
except ImportError:
PYQT_WEBENGINE_VERSION = None
@bdd.when("I load an SSL page")
def load_ssl_page(quteproc, ssl_server):
# We don't wait here as we can get an SSL question.
quteproc.open_path('/', port=ssl_server.port, https=True, wait=False,
new_tab=True)
@bdd.when("I wait until the SSL page finished loading")
def wait_ssl_page_finished_loading(quteproc, ssl_server):
quteproc.wait_for_load_finished('/', port=ssl_server.port, https=True,
load_status='warn')
@bdd.when("I load an SSL resource page")
def load_ssl_resource_page(quteproc, server, ssl_server):
# We don't wait here as we can get an SSL question.
quteproc.open_path(f'https-script/{ssl_server.port}', port=server.port, wait=False)
@bdd.when("I wait until the SSL resource page finished loading")
def wait_ssl_resource_page_finished_loading(quteproc, server, ssl_server):
quteproc.wait_for_load_finished(f'https-script/{ssl_server.port}', port=server.port)
@bdd.when("I wait for a prompt")
def wait_for_prompt(quteproc):
quteproc.wait_for(message='Asking question *')
@bdd.given("I may need a fresh instance")
def fresh_instance(quteproc):
"""Restart qutebrowser to bypass webengine's permission persistance."""
# Qt6.8 by default will remember feature grants or denies. When we are
# on PyQt6.8 we disable that with the new API, otherwise restart the
# browser to make it forget previous prompts.
#
# Starting with Qt 6.10, QtWebEngine unconditionally persists some permissions;
# see https://bugreports.qt.io/browse/QTBUG-140194
if (
qtutils.version_check("6.8", compiled=False)
and PYQT_WEBENGINE_VERSION
and PYQT_WEBENGINE_VERSION < 0x60800
) or qtutils.version_check("6.10", compiled=False):
quteproc.terminate()
quteproc.start()
@bdd.then("no prompt should be shown")
def no_prompt_shown(quteproc):
quteproc.ensure_not_logged(message='Entering mode KeyMode.* (reason: '
'question asked)')
@bdd.then("a SSL error page should be shown")
def ssl_error_page(request, quteproc):
if request.config.webengine:
quteproc.wait_for(message="Certificate error: *")
msg = quteproc.wait_for(message="Load error: *")
msg.expected = True
assert msg.message == 'Load error: ERR_CERT_AUTHORITY_INVALID'
else:
line = quteproc.wait_for(message='Error while loading *: SSL handshake failed')
line.expected = True
quteproc.wait_for(message="Changing title for idx * to 'Error loading page: *'")
content = quteproc.get_content().strip()
assert "Unable to load page" in content
def test_certificate_error_load_status(request, quteproc, ssl_server):
"""If we load the same page twice, we should get a 'warn' status twice."""
quteproc.set_setting('content.tls.certificate_errors', 'load-insecurely')
for i in range(2):
quteproc.open_path('/', port=ssl_server.port, https=True, wait=False,
new_tab=True)
if i == 0 or not request.config.webengine:
# Error is only logged on the first error with QtWebEngine
quteproc.mark_expected(category='message',
loglevel=logging.ERROR,
message="Certificate error: *")
quteproc.wait_for_load_finished('/', port=ssl_server.port, https=True,
load_status='warn')