Compare commits
30 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
ee13dac738 | |
|
|
c3ec186aaf | |
|
|
405215eb44 | |
|
|
dcd26a978e | |
|
|
54b3953f18 | |
|
|
b2c5d5fa0d | |
|
|
73ae3abfc2 | |
|
|
e8af559bd7 | |
|
|
9816e176a7 | |
|
|
f7e7f8b168 | |
|
|
7dc9768976 | |
|
|
dd790c3b72 | |
|
|
f6aa7f6ba8 | |
|
|
4367cc65fe | |
|
|
22335c849a | |
|
|
56548455d5 | |
|
|
4c6f9b4255 | |
|
|
300b075d79 | |
|
|
b723a02087 | |
|
|
86ed433b97 | |
|
|
0c34bf2f79 | |
|
|
f86728e972 | |
|
|
2e5f805cce | |
|
|
155b5cb241 | |
|
|
0deadea17f | |
|
|
b3377fccff | |
|
|
11acdd2fdf | |
|
|
8f4e6ec06e | |
|
|
52fd43c95e | |
|
|
26df4ce7e3 |
|
|
@ -48,7 +48,7 @@ jobs:
|
|||
shell: bash
|
||||
if: failure()
|
||||
- name: Upload screenshots
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: "end2end-screenshots-${{ steps.info.outputs.date }}-${{ steps.info.outputs.sha_short }}-${{ matrix.image }}"
|
||||
path: |
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ jobs:
|
|||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/cache@v5
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
.mypy_cache
|
||||
|
|
@ -47,7 +47,7 @@ jobs:
|
|||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: '22.x'
|
||||
if: "matrix.testenv == 'eslint'"
|
||||
|
|
@ -121,7 +121,7 @@ jobs:
|
|||
shell: bash
|
||||
if: failure()
|
||||
- name: Upload screenshots
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: "end2end-screenshots-${{ steps.info.outputs.date }}-${{ steps.info.outputs.sha_short }}-${{ matrix.image }}"
|
||||
path: |
|
||||
|
|
@ -198,16 +198,16 @@ jobs:
|
|||
- testenv: py314-pyqt610
|
||||
os: ubuntu-24.04
|
||||
python: "3.14"
|
||||
### macOS Ventura
|
||||
- testenv: py314-pyqt610
|
||||
os: macos-13
|
||||
python: "3.14"
|
||||
args: "tests/unit" # Only run unit tests on macOS
|
||||
### macOS Sonoma (M1 runner)
|
||||
- testenv: py314-pyqt610
|
||||
os: macos-14
|
||||
python: "3.14"
|
||||
args: "tests/unit" # Only run unit tests on macOS
|
||||
### macOS Sequoia (Intel runner)
|
||||
- testenv: py314-pyqt610
|
||||
os: macos-15-intel
|
||||
python: "3.14"
|
||||
args: "tests/unit" # Only run unit tests on macOS
|
||||
### Windows
|
||||
- testenv: py314-pyqt610
|
||||
os: windows-2022
|
||||
|
|
@ -220,7 +220,7 @@ jobs:
|
|||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/cache@v5
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
.mypy_cache
|
||||
|
|
@ -269,7 +269,7 @@ jobs:
|
|||
shell: bash
|
||||
if: failure()
|
||||
- name: Upload screenshots
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: "end2end-screenshots-${{ steps.info.outputs.date }}-${{ steps.info.outputs.sha_short }}-${{ matrix.testenv }}-${{ matrix.os }}"
|
||||
path: |
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: macos-15-intel
|
||||
- os: macos-13
|
||||
toxenv: build-release
|
||||
name: macos-intel
|
||||
- os: macos-14
|
||||
|
|
@ -23,7 +23,7 @@ jobs:
|
|||
- os: windows-latest
|
||||
toxenv: build-release
|
||||
name: windows
|
||||
- os: macos-15-intel
|
||||
- os: macos-13
|
||||
args: --debug
|
||||
toxenv: build-release
|
||||
name: macos-debug-intel
|
||||
|
|
@ -72,7 +72,7 @@ jobs:
|
|||
echo "sha_short=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT"
|
||||
shell: bash
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: "qutebrowser-nightly-${{ steps.info.outputs.date }}-${{ steps.info.outputs.sha_short }}-${{ matrix.name }}"
|
||||
path: |
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ jobs:
|
|||
- name: Run qutebrowser smoke test
|
||||
run: "xvfb-run .venv/bin/python3 -m qutebrowser --no-err-windows --nowindow --temp-basedir about:blank ':later 500 quit'"
|
||||
- name: Create pull request
|
||||
uses: peter-evans/create-pull-request@v8
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
committer: qutebrowser bot <bot@qutebrowser.org>
|
||||
author: qutebrowser bot <bot@qutebrowser.org>
|
||||
|
|
|
|||
|
|
@ -154,8 +154,8 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- os: macos-14-large # Intel
|
||||
- os: macos-14 # Apple Silicon
|
||||
- os: macos-13
|
||||
- os: macos-14
|
||||
- os: windows-2022
|
||||
- os: ubuntu-24.04
|
||||
runs-on: "${{ matrix.os }}"
|
||||
|
|
|
|||
|
|
@ -15,17 +15,6 @@ breaking changes (such as renamed commands) can happen in minor releases.
|
|||
// `Fixed` for any bug fixes.
|
||||
// `Security` to invite users to upgrade in case of vulnerabilities.
|
||||
|
||||
[[v3.6.4]]
|
||||
v3.6.4 (unreleased)
|
||||
-------------------
|
||||
|
||||
Fixed
|
||||
~~~~~
|
||||
|
||||
- datalist dropdowns not opening correctly on Wayland/Sway (#8831).
|
||||
This was caused by an old workaround for a different QtWebEngine issue,
|
||||
which is now disabled for QtWebEngine 6.6.3 and newer.
|
||||
|
||||
[[v3.6.3]]
|
||||
v3.6.3 (2025-11-30)
|
||||
-------------------
|
||||
|
|
|
|||
|
|
@ -602,7 +602,6 @@ Info pages:
|
|||
- chrome://device-log/ (QtWebEngine >= 6.3)
|
||||
- chrome://gpu/
|
||||
- chrome://sandbox/ (Linux only)
|
||||
- chrome://qt/ (QtWebEngine >= 6.7)
|
||||
|
||||
Misc. / Debugging pages:
|
||||
|
||||
|
|
@ -613,7 +612,6 @@ Misc. / Debugging pages:
|
|||
- chrome://ukm/ (QtWebEngine >= 5.15.3)
|
||||
- chrome://user-actions/ (QtWebEngine >= 5.15.3)
|
||||
- chrome://webrtc-logs/ (QtWebEngine >= 5.15.3)
|
||||
- chrome://extensions/ (QtWebEngine >= 6.10)
|
||||
|
||||
Internals pages:
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
annotated-types==0.7.0
|
||||
anyio==4.12.0
|
||||
anyio==4.11.0
|
||||
autocommand==2.2.2
|
||||
backports.tarfile==1.2.0
|
||||
bracex==2.6
|
||||
build==1.3.0
|
||||
bump-my-version==1.2.5
|
||||
certifi==2025.11.12
|
||||
bump-my-version==1.2.4
|
||||
certifi==2025.10.5
|
||||
cffi==2.0.0
|
||||
charset-normalizer==3.4.4
|
||||
click==8.1.8
|
||||
cryptography==46.0.3
|
||||
docutils==0.22.3
|
||||
exceptiongroup==1.3.1
|
||||
docutils==0.22.2
|
||||
exceptiongroup==1.3.0
|
||||
github3.py==4.0.1
|
||||
h11==0.16.0
|
||||
httpcore==1.0.9
|
||||
|
|
@ -30,36 +30,37 @@ jaraco.context==6.0.1
|
|||
jaraco.functools==4.0.1
|
||||
jaraco.text==3.12.1
|
||||
jeepney==0.9.0
|
||||
keyring==25.7.0
|
||||
keyring==25.6.0
|
||||
manhole==1.8.1
|
||||
markdown-it-py==3.0.0
|
||||
mdurl==0.1.2
|
||||
more-itertools==10.8.0
|
||||
nh3==0.3.2
|
||||
nh3==0.3.1
|
||||
packaging==25.0
|
||||
platformdirs==4.4.0
|
||||
prompt_toolkit==3.0.52
|
||||
pycparser==2.23
|
||||
pydantic==2.12.5
|
||||
pydantic==2.12.3
|
||||
pydantic-settings==2.11.0
|
||||
pydantic_core==2.41.5
|
||||
pydantic_core==2.41.4
|
||||
Pygments==2.19.2
|
||||
PyJWT==2.10.1
|
||||
Pympler==1.1
|
||||
pyproject_hooks==1.2.0
|
||||
PyQt-builder==1.19.1
|
||||
PyQt-builder==1.19.0
|
||||
python-dateutil==2.9.0.post0
|
||||
python-dotenv==1.2.1
|
||||
python-dotenv==1.1.1
|
||||
questionary==2.1.1
|
||||
readme_renderer==44.0
|
||||
requests==2.32.5
|
||||
requests-toolbelt==1.0.0
|
||||
rfc3986==2.0.0
|
||||
rich==14.2.0
|
||||
rich-click==1.9.4
|
||||
rich-click==1.9.3
|
||||
SecretStorage==3.3.3
|
||||
sip==6.14.0
|
||||
six==1.17.0
|
||||
sniffio==1.3.1
|
||||
tomli==2.3.0
|
||||
tomlkit==0.13.3
|
||||
twine==6.2.0
|
||||
|
|
@ -67,7 +68,7 @@ typeguard==4.3.0
|
|||
typing-inspection==0.4.2
|
||||
typing_extensions==4.15.0
|
||||
uritemplate==4.2.0
|
||||
# urllib3==2.6.2
|
||||
# urllib3==2.5.0
|
||||
wcmatch==10.1
|
||||
wcwidth==0.2.14
|
||||
zipp==3.23.0
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
chardet==5.2.0
|
||||
diff_cover==10.0.0
|
||||
diff_cover==9.7.1
|
||||
Jinja2==3.1.6
|
||||
librt==0.7.3
|
||||
lxml==6.0.2
|
||||
MarkupSafe==3.0.3
|
||||
mypy==1.19.0
|
||||
mypy==1.18.2
|
||||
mypy_extensions==1.1.0
|
||||
pathspec==0.12.1
|
||||
pluggy==1.6.0
|
||||
|
|
@ -14,7 +13,7 @@ Pygments==2.19.2
|
|||
PyQt5-stubs==5.15.6.0
|
||||
tomli==2.3.0
|
||||
types-colorama==0.4.15.20250801
|
||||
types-docutils==0.22.3.20251115
|
||||
types-Pygments==2.19.0.20251121
|
||||
types-docutils==0.22.2.20251006
|
||||
types-Pygments==2.19.0.20250809
|
||||
types-PyYAML==6.0.12.20250915
|
||||
typing_extensions==4.15.0
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
altgraph==0.17.5
|
||||
altgraph==0.17.4
|
||||
importlib_metadata==8.7.0
|
||||
packaging==25.0
|
||||
pyinstaller==6.17.0
|
||||
pyinstaller-hooks-contrib==2025.10
|
||||
pyinstaller==6.16.0
|
||||
pyinstaller-hooks-contrib==2025.9
|
||||
zipp==3.23.0
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
astroid==3.3.11
|
||||
certifi==2025.11.12
|
||||
certifi==2025.10.5
|
||||
cffi==2.0.0
|
||||
charset-normalizer==3.4.4
|
||||
cryptography==46.0.3
|
||||
|
|
@ -24,5 +24,5 @@ tomli==2.3.0
|
|||
tomlkit==0.13.3
|
||||
typing_extensions==4.15.0
|
||||
uritemplate==4.2.0
|
||||
# urllib3==2.6.2
|
||||
# urllib3==2.5.0
|
||||
zipp==3.23.0
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
PyQt5==5.15.11 # rq.filter: < 5.16
|
||||
PyQt5-Qt5==5.15.18
|
||||
PyQt5-Qt5==5.15.17
|
||||
PyQt5_sip==12.17.1
|
||||
PyQtWebEngine==5.15.7 # rq.filter: < 5.16
|
||||
PyQtWebEngine-Qt5==5.15.18
|
||||
PyQtWebEngine-Qt5==5.15.17
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
PyQt5==5.15.11
|
||||
PyQt5-Qt5==5.15.18
|
||||
PyQt5-Qt5==5.15.17
|
||||
PyQt5_sip==12.17.1
|
||||
PyQtWebEngine==5.15.7
|
||||
PyQtWebEngine-Qt5==5.15.18
|
||||
PyQtWebEngine-Qt5==5.15.17
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
PyQt6==6.10.1
|
||||
PyQt6==6.10.0
|
||||
PyQt6-Qt6==6.10.1
|
||||
PyQt6-WebEngine==6.10.0
|
||||
PyQt6-WebEngine-Qt6==6.10.1
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
PyQt6==6.10.1
|
||||
PyQt6==6.10.0
|
||||
PyQt6-Qt6==6.10.1
|
||||
PyQt6-WebEngine==6.10.0
|
||||
PyQt6-WebEngine-Qt6==6.10.1
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
PyQt6==6.10.1
|
||||
PyQt6==6.10.0
|
||||
PyQt6-Qt6==6.10.1
|
||||
PyQt6-WebEngine==6.10.0
|
||||
PyQt6-WebEngine-Qt6==6.10.1
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
build==1.3.0
|
||||
certifi==2025.11.12
|
||||
certifi==2025.10.5
|
||||
charset-normalizer==3.4.4
|
||||
check-manifest==0.51
|
||||
docutils==0.22.3
|
||||
docutils==0.22.2
|
||||
idna==3.11
|
||||
importlib_metadata==8.7.0
|
||||
packaging==25.0
|
||||
Pygments==2.19.2
|
||||
pyproject_hooks==1.2.0
|
||||
pyroma==5.0.1
|
||||
pyroma==5.0
|
||||
requests==2.32.5
|
||||
tomli==2.3.0
|
||||
trove-classifiers==2025.12.1.14
|
||||
urllib3==2.6.2
|
||||
trove-classifiers==2025.9.11.17
|
||||
urllib3==2.5.0
|
||||
zipp==3.23.0
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
alabaster==0.7.16
|
||||
babel==2.17.0
|
||||
certifi==2025.11.12
|
||||
certifi==2025.10.5
|
||||
charset-normalizer==3.4.4
|
||||
docutils==0.21.2
|
||||
idna==3.11
|
||||
|
|
@ -22,5 +22,5 @@ sphinxcontrib-jsmath==1.0.1
|
|||
sphinxcontrib-qthelp==2.0.0
|
||||
sphinxcontrib-serializinghtml==2.0.0
|
||||
tomli==2.3.0
|
||||
urllib3==2.6.2
|
||||
urllib3==2.5.0
|
||||
zipp==3.23.0
|
||||
|
|
|
|||
|
|
@ -3,15 +3,15 @@
|
|||
attrs==25.4.0
|
||||
autocommand==2.2.2
|
||||
backports.tarfile==1.2.0
|
||||
beautifulsoup4==4.14.3
|
||||
beautifulsoup4==4.14.2
|
||||
blinker==1.9.0
|
||||
certifi==2025.11.12
|
||||
certifi==2025.10.5
|
||||
charset-normalizer==3.4.4
|
||||
cheroot==11.1.2
|
||||
cheroot==11.0.0
|
||||
click==8.1.8
|
||||
coverage==7.10.7
|
||||
exceptiongroup==1.3.1
|
||||
execnet==2.1.2
|
||||
exceptiongroup==1.3.0
|
||||
execnet==2.1.1
|
||||
filelock==3.19.1
|
||||
Flask==3.1.2
|
||||
gherkin-official==29.0.0
|
||||
|
|
@ -42,7 +42,7 @@ py-cpuinfo==9.0.0
|
|||
Pygments==2.19.2
|
||||
pytest==8.4.2
|
||||
pytest-bdd==8.1.0
|
||||
pytest-benchmark==5.2.3
|
||||
pytest-benchmark==5.1.0
|
||||
pytest-cov==7.0.0
|
||||
pytest-instafail==0.5.0
|
||||
pytest-mock==3.15.1
|
||||
|
|
@ -61,7 +61,7 @@ tldextract==5.3.0
|
|||
tomli==2.3.0
|
||||
typeguard==4.3.0
|
||||
typing_extensions==4.15.0
|
||||
urllib3==2.6.2
|
||||
urllib3==2.5.0
|
||||
vulture==2.14
|
||||
Werkzeug==3.1.4
|
||||
Werkzeug==3.1.3
|
||||
zipp==3.23.0
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
cachetools==6.2.3
|
||||
cachetools==6.2.1
|
||||
chardet==5.2.0
|
||||
colorama==0.4.6
|
||||
distlib==0.4.0
|
||||
filelock==3.19.1
|
||||
packaging==25.0
|
||||
pip==25.3
|
||||
pip==25.2
|
||||
platformdirs==4.4.0
|
||||
pluggy==1.6.0
|
||||
pyproject-api==1.9.1
|
||||
|
|
@ -14,6 +14,6 @@ setuptools==80.9.0
|
|||
tomli==2.3.0
|
||||
tox==4.30.3 ; python_full_version!="3.14.0b1"
|
||||
typing_extensions==4.15.0
|
||||
virtualenv==20.35.4
|
||||
virtualenv==20.35.3
|
||||
wheel==0.45.1
|
||||
tox @ git+https://github.com/tox-dev/tox ; python_full_version=="3.14.0b1"
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ from qutebrowser.qt.gui import QKeyEvent
|
|||
from qutebrowser.qt.widgets import QWidget
|
||||
|
||||
from qutebrowser.config import config
|
||||
from qutebrowser.utils import log, message, usertypes, qtutils, version, utils
|
||||
from qutebrowser.utils import log, message, usertypes, qtutils
|
||||
from qutebrowser.keyinput import modeman, keyutils
|
||||
|
||||
|
||||
|
|
@ -55,16 +55,16 @@ class ChildEventFilter(QObject):
|
|||
# - This is a child event filter on a tab (self._widget is not None)
|
||||
# - We find an old existing child which is a QQuickWidget and is
|
||||
# currently focused.
|
||||
# - We're using an affected QtWebEngine version
|
||||
# - We're using QtWebEngine >= 6.4 (older versions are not affected)
|
||||
children = [
|
||||
c for c in self._widget.findChildren(
|
||||
QWidget, "", Qt.FindChildOption.FindDirectChildrenOnly)
|
||||
if c is not child and
|
||||
c.hasFocus() and
|
||||
c.metaObject() is not None and
|
||||
c.metaObject().className() == "QQuickWidget" # Qt 6.4+
|
||||
c.metaObject().className() == "QQuickWidget"
|
||||
]
|
||||
if children and version.qtwebengine_versions().webengine < utils.VersionNumber(6, 6, 3):
|
||||
if children:
|
||||
log.misc.debug("Focusing new child")
|
||||
child.setFocus()
|
||||
|
||||
|
|
|
|||
|
|
@ -333,13 +333,8 @@ class Config(QObject):
|
|||
pattern, hide_userconfig=hide_userconfig)
|
||||
|
||||
self.changed.emit(opt.name)
|
||||
|
||||
if pattern is not None:
|
||||
log.config.debug("Config option changed: {} = {} for {}".format(
|
||||
opt.name, value, pattern))
|
||||
else:
|
||||
log.config.debug("Config option changed: {} = {}".format(
|
||||
opt.name, value))
|
||||
log.config.debug("Config option changed: {} = {}".format(
|
||||
opt.name, value))
|
||||
|
||||
def _check_yaml(self, opt: 'configdata.Option', save_yaml: bool) -> None:
|
||||
"""Make sure the given option may be set in autoconfig.yml."""
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ import datetime
|
|||
from typing import NoReturn
|
||||
try:
|
||||
import tkinter
|
||||
import tkinter.messagebox
|
||||
except ImportError:
|
||||
tkinter = None # type: ignore[assignment]
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,11 @@ def _load_library(name: str) -> ctypes.CDLL:
|
|||
raise Error(f"Failed to load {name} library: {e}")
|
||||
|
||||
|
||||
def _load_libwayland_client() -> ctypes.CDLL:
|
||||
"""Load the Wayland client library."""
|
||||
return _load_library("wayland-client")
|
||||
|
||||
|
||||
def _pid_from_fd(fd: int) -> int:
|
||||
"""Get the process ID from a file descriptor using SO_PEERCRED.
|
||||
|
||||
|
|
@ -116,7 +121,7 @@ def wayland_compositor_name() -> str:
|
|||
Approach based on:
|
||||
https://stackoverflow.com/questions/69302630/wayland-client-get-compositor-name
|
||||
"""
|
||||
wayland_client = _load_library("wayland-client")
|
||||
wayland_client = _load_libwayland_client()
|
||||
with _wayland_display(wayland_client) as display:
|
||||
fd = _wayland_get_fd(wayland_client, display)
|
||||
pid = _pid_from_fd(fd)
|
||||
|
|
@ -139,6 +144,11 @@ _X11Display = NewType("_X11Display", "ctypes._Pointer[_X11DisplayStruct]")
|
|||
_X11Window = NewType("_X11Window", int)
|
||||
|
||||
|
||||
def _x11_load_lib() -> ctypes.CDLL:
|
||||
"""Load the X11 library."""
|
||||
return _load_library("X11")
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def _x11_open_display(xlib: ctypes.CDLL) -> Iterator[_X11Display]:
|
||||
"""Open a connection to the X11 display."""
|
||||
|
|
@ -298,7 +308,7 @@ def _x11_get_wm_name(
|
|||
|
||||
def x11_wm_name() -> str:
|
||||
"""Get the name of the running X11 window manager."""
|
||||
xlib = _load_library("X11")
|
||||
xlib = _x11_load_lib()
|
||||
with _x11_open_display(xlib) as display:
|
||||
atoms = _X11Atoms(
|
||||
NET_SUPPORTING_WM_CHECK=_x11_intern_atom(
|
||||
|
|
|
|||
|
|
@ -654,7 +654,6 @@ class WebEngineVersions:
|
|||
utils.VersionNumber(6, 9): (_BASES[130], '133.0.6943.141'), # 2025-02-25
|
||||
utils.VersionNumber(6, 9, 1): (_BASES[130], '136.0.7103.114'), # 2025-05-13
|
||||
utils.VersionNumber(6, 9, 2): (_BASES[130], '139.0.7258.67'), # 2025-07-29
|
||||
utils.VersionNumber(6, 9, 3): (_BASES[130], '140.0.7339.207'), # 2025-09-22
|
||||
|
||||
## Qt 6.10
|
||||
utils.VersionNumber(6, 10): (_BASES[134], '140.0.7339.207'), # 2025-09-22
|
||||
|
|
|
|||
|
|
@ -208,12 +208,8 @@ def smoke_test(executable: pathlib.Path, debug_build: bool) -> None:
|
|||
proc = _smoke_test_run(executable)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Smoke test failed: {e}, running with --debug")
|
||||
smoke_test_debug(
|
||||
executable,
|
||||
original_stdout=e.stdout.decode("utf-8"),
|
||||
original_stderr=e.stderr.decode("utf-8"),
|
||||
issue_description=str(e),
|
||||
)
|
||||
smoke_test_debug(executable, original_stdout=e.stdout.decode('utf-8'),
|
||||
original_stderr=e.stderr.decode('utf-8'))
|
||||
return
|
||||
|
||||
if debug_build:
|
||||
|
|
@ -225,20 +221,11 @@ def smoke_test(executable: pathlib.Path, debug_build: bool) -> None:
|
|||
|
||||
if stdout or stderr:
|
||||
print("Unexpected output, running with --debug")
|
||||
smoke_test_debug(
|
||||
executable,
|
||||
original_stdout=stdout,
|
||||
original_stderr=stderr,
|
||||
issue_description="Unexpected output",
|
||||
)
|
||||
smoke_test_debug(executable, original_stdout=stdout, original_stderr=stderr)
|
||||
|
||||
|
||||
def smoke_test_debug(
|
||||
executable: pathlib.Path,
|
||||
*,
|
||||
original_stdout: str,
|
||||
original_stderr: str,
|
||||
issue_description: str,
|
||||
executable: pathlib.Path, *, original_stdout: str, original_stderr: str
|
||||
) -> None:
|
||||
"""Run smoke test in debug mode to get more output."""
|
||||
proc = _smoke_test_run(executable, '--debug')
|
||||
|
|
@ -246,7 +233,7 @@ def smoke_test_debug(
|
|||
debug_stderr = proc.stderr.decode('utf-8')
|
||||
|
||||
lines = [
|
||||
issue_description,
|
||||
"Unexpected output!",
|
||||
"",
|
||||
]
|
||||
if original_stdout:
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
"Mako": "https://docs.makotemplates.org/en/latest/changelog.html",
|
||||
"hypothesis": "https://hypothesis.readthedocs.io/en/latest/changes.html",
|
||||
"mypy": "https://github.com/python/mypy/blob/master/CHANGELOG.md",
|
||||
"librt": "https://github.com/mypyc/librt/commits/master/",
|
||||
"types-PyYAML": "https://github.com/python/typeshed/commits/main/stubs/PyYAML",
|
||||
"types-colorama": "https://github.com/python/typeshed/commits/main/stubs/colorama",
|
||||
"types-docutils": "https://github.com/python/typeshed/commits/main/stubs/docutils",
|
||||
|
|
@ -102,6 +101,7 @@
|
|||
"h11": "https://h11.readthedocs.io/en/latest/changes.html",
|
||||
"httpcore": "https://github.com/encode/httpcore/blob/master/CHANGELOG.md",
|
||||
"httpx": "https://github.com/encode/httpx/blob/master/CHANGELOG.md",
|
||||
"sniffio": "https://sniffio.readthedocs.io/en/latest/history.html",
|
||||
"six": "https://github.com/benjaminp/six/blob/master/CHANGES",
|
||||
"altgraph": "https://github.com/ronaldoussoren/altgraph/blob/master/doc/changelog.rst",
|
||||
"urllib3": "https://github.com/urllib3/urllib3/blob/main/CHANGES.rst",
|
||||
|
|
|
|||
|
|
@ -263,14 +263,6 @@ def is_ignored_chromium_message(line):
|
|||
"GetGpuDriverOverlayInfo: Failed to retrieve video device",
|
||||
# [1784:7100:1022/150434.202:ERROR:direct_composition_support.cc(1122)]
|
||||
"QueryInterface to IDCompositionDevice4 failed: No such interface supported (0x80004002)",
|
||||
|
||||
# Qt 6.10 on Windows + GitHub Actions
|
||||
# [3508:6056:1103/172403.602:ERROR:cache_util_win.cc(20)]
|
||||
"Unable to move the cache: The system cannot find the file specified. (0x2)",
|
||||
# [3508:5516:1103/172403.608:ERROR:disk_cache.cc(216)]
|
||||
"Unable to create cache",
|
||||
# [3508:5516:1103/172403.608:ERROR:gpu_disk_cache.cc(711)]
|
||||
"Gpu Cache Creation failed: -2",
|
||||
]
|
||||
return any(testutils.pattern_match(pattern=pattern, value=message)
|
||||
for pattern in ignored_messages)
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ from qutebrowser.misc import wmname
|
|||
def test_load_libwayland_client():
|
||||
"""Test loading the Wayland client library, which might or might not exist."""
|
||||
try:
|
||||
wmname._load_library("wayland-client")
|
||||
wmname._load_libwayland_client()
|
||||
except wmname.Error:
|
||||
pass
|
||||
|
||||
|
|
@ -32,7 +32,7 @@ def test_load_libwayland_client_error(mocker: pytest_mock.MockerFixture):
|
|||
mocker.patch("ctypes.CDLL", side_effect=OSError("Library not found"))
|
||||
|
||||
with pytest.raises(wmname.Error, match="Failed to load wayland-client"):
|
||||
wmname._load_library("wayland-client")
|
||||
wmname._load_libwayland_client()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
|
@ -178,7 +178,7 @@ def test_wayland_real():
|
|||
def test_load_xlib():
|
||||
"""Test loading Xlib, which might or might not exist."""
|
||||
try:
|
||||
wmname._load_library("X11")
|
||||
wmname._x11_load_lib()
|
||||
except wmname.Error:
|
||||
pass
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ def test_load_xlib_not_found(monkeypatch: pytest.MonkeyPatch):
|
|||
monkeypatch.setattr(ctypes.util, "find_library", lambda x: None)
|
||||
|
||||
with pytest.raises(wmname.Error, match="X11 library not found"):
|
||||
wmname._load_library("X11")
|
||||
wmname._x11_load_lib()
|
||||
|
||||
|
||||
def test_load_xlib_error(mocker: pytest_mock.MockerFixture):
|
||||
|
|
@ -199,7 +199,7 @@ def test_load_xlib_error(mocker: pytest_mock.MockerFixture):
|
|||
with pytest.raises(
|
||||
wmname.Error, match="Failed to load X11 library: Failed to load library"
|
||||
):
|
||||
wmname._load_library("X11")
|
||||
wmname._x11_load_lib()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
|
@ -290,7 +290,7 @@ def test_x11_get_wm_name(
|
|||
qtbot.add_widget(w)
|
||||
w.setWindowTitle("Test Window")
|
||||
|
||||
xlib = wmname._load_library("X11")
|
||||
xlib = wmname._x11_load_lib()
|
||||
with wmname._x11_open_display(xlib) as display:
|
||||
atoms = wmname._X11Atoms(
|
||||
NET_SUPPORTING_WM_CHECK=-1,
|
||||
|
|
|
|||
Loading…
Reference in New Issue