Merge remote-tracking branch 'origin/master' into 4nd3r/hostblock_subdomains
This commit is contained in:
commit
00a394506f
|
|
@ -1,5 +1,5 @@
|
|||
[bumpversion]
|
||||
current_version = 2.2.2
|
||||
current_version = 2.2.3
|
||||
commit = True
|
||||
message = Release v{new_version}
|
||||
tag = True
|
||||
|
|
|
|||
|
|
@ -101,16 +101,16 @@ jobs:
|
|||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.tests.result == 'success' && needs.pyinstaller.result == 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00033Success:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})"
|
||||
- name: Send non-success IRC notification
|
||||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.tests.result != 'success' || needs.pyinstaller.result != 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00034FAIL:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})\n
|
||||
tests: ${{ needs.tests.result }}, pyinstaller: ${{ needs.pyinstaller.result }}"
|
||||
|
|
|
|||
|
|
@ -215,16 +215,16 @@ jobs:
|
|||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.linters.result == 'success' && needs.tests.result == 'success' && needs.tests-docker.result == 'success' && needs.codeql.result == 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00033Success:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})"
|
||||
- name: Send failure IRC notification
|
||||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.linters.result == 'failure' || needs.tests.result == 'failure' || needs.tests-docker.result == 'failure' || needs.codeql.result == 'failure'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00034FAIL:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})\n
|
||||
linters: ${{ needs.linters.result }}, tests: ${{ needs.tests.result }}, tests-docker: ${{ needs.tests-docker.result }}, codeql: ${{ needs.codeql.result }}"
|
||||
|
|
@ -232,16 +232,16 @@ jobs:
|
|||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.linters.result == 'skipped' || needs.tests.result == 'skipped' || needs.tests-docker.result == 'skipped' || needs.codeql.result == 'skipped'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00038Skipped:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})"
|
||||
- name: Send cancelled IRC notification
|
||||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.linters.result == 'cancelled' || needs.tests.result == 'cancelled' || needs.tests-docker.result == 'cancelled' || needs.codeql.result == 'cancelled'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u000314Cancelled:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})\n
|
||||
linters: ${{ needs.linters.result }}, tests: ${{ needs.tests.result }}, tests-docker: ${{ needs.tests-docker.result }}, codeql: ${{ needs.codeql.result }}"
|
||||
|
|
|
|||
|
|
@ -47,15 +47,15 @@ jobs:
|
|||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.docker.result == 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00033Success:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})"
|
||||
- name: Send non-success IRC notification
|
||||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.docker.result != 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00034FAIL:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})"
|
||||
|
|
|
|||
|
|
@ -77,16 +77,16 @@ jobs:
|
|||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.update.result == 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00033Success:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})"
|
||||
- name: Send non-success IRC notification
|
||||
uses: Gottox/irc-message-action@v1
|
||||
if: "needs.update.result != 'success'"
|
||||
with:
|
||||
server: chat.freenode.net
|
||||
channel: '#qutebrowser-dev'
|
||||
server: irc.libera.chat
|
||||
channel: '#qutebrowser-bots'
|
||||
nickname: qutebrowser-bot
|
||||
message: "[${{ github.workflow }}] \u00034FAIL:\u0003 ${{ github.ref }} https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} (@${{ github.actor }})\n
|
||||
linters: ${{ needs.linters.result }}, tests: ${{ needs.tests.result }}, tests-docker: ${{ needs.tests-docker.result }}, codeql: ${{ needs.codeql.result }}"
|
||||
|
|
|
|||
|
|
@ -22,8 +22,42 @@ v2.3.0 (unreleased)
|
|||
Changed
|
||||
~~~~~~~
|
||||
|
||||
The `fonts.web.*` settings now support URL patterns.
|
||||
- The `fonts.web.*` settings now support URL patterns.
|
||||
|
||||
[[v2.2.3]]
|
||||
v2.2.3 (2021-06-01)
|
||||
-------------------
|
||||
|
||||
Fixed
|
||||
~~~~~
|
||||
|
||||
- Logging into Google accounts or sharing the camera on macOS 10.14+ crashed,
|
||||
which is now fixed.
|
||||
- The Windows installer now correctly aborts the installation on Windows 7
|
||||
(rather than attempting an install which won't work, since Windows 7 is
|
||||
unsupported since the v2.0.0 release).
|
||||
- Using `--json-logging` without `--debug` caused qutebrowser to crash since the
|
||||
v1.13.0 release. It now works correctly again.
|
||||
- Mixing Qt 5.14+ with QtWebEngine 5.12 caused a crash related to qutebrowser's
|
||||
notification support, which is now fixed.
|
||||
- The documentation now points to the new IRC channels on irc.libera.chat
|
||||
instead of the defunct Freenode channels (due to a hostile takeover by
|
||||
Freenode staff).
|
||||
- Setting `content.headers.user_agent` or `.accept_language` to a value
|
||||
containing non-ascii characters was permitted by qutebrowser, but resulted in
|
||||
a crash when loading a page. Such values are now rejected properly.
|
||||
- When quitting qutebrowser on the `qute://settings` page, a crash could happen, which is now fixed.
|
||||
- When `:edit-text` is used, but the existing text in the input isn't
|
||||
representable in the configured encoding (`editor.encoding`), qutebrowser would
|
||||
crash. It now shows a proper error instead.
|
||||
- The testsuite should now work properly on aarch64.
|
||||
- When QtWebEngine is in a "stuck" state while `:selection-follow` was used,
|
||||
this could cause a crash in qutebrowser. This is now fixed (speculatively, due
|
||||
to lack of a reproducer).
|
||||
- When the brave adblock data (`adblock-cache.dat`) got corrupted, qutebrowser
|
||||
would crash when trying to load it. It now displays an error instead.
|
||||
- Combining `/S` (silent) and `/allusers` when uninstalling via the Windows
|
||||
installer now works properly.
|
||||
|
||||
[[v2.2.2]]
|
||||
v2.2.2 (2021-05-20)
|
||||
|
|
|
|||
|
|
@ -26,9 +26,9 @@ several ways:
|
|||
(optionally
|
||||
https://lists.schokokeks.org/mailman/listinfo.cgi/qutebrowser[subscribe]
|
||||
first).
|
||||
* Join the IRC channel irc://irc.freenode.org/#qutebrowser[`#qutebrowser`] on
|
||||
https://freenode.net/[Freenode]
|
||||
(https://webchat.freenode.net/?channels=#qutebrowser[webchat]).
|
||||
* Join the IRC channel link:ircs://irc.libera.chat:6697/#qutebrowser[`#qutebrowser`] on
|
||||
https://libera.chat/[Libera Chat] (https://web.libera.chat/#qutebrowser[webchat],
|
||||
https://matrix.to/#qutebrowser:libera.chat[via Matrix]).
|
||||
|
||||
Finding something to work on
|
||||
----------------------------
|
||||
|
|
@ -567,25 +567,33 @@ Chrome URLs
|
|||
With the QtWebEngine backend, qutebrowser supports several chrome:// urls which
|
||||
can be useful for debugging:
|
||||
|
||||
- chrome://accessibility/
|
||||
- chrome://appcache-internals/
|
||||
- chrome://blob-internals/
|
||||
- chrome://gpu/
|
||||
- chrome://histograms/
|
||||
- chrome://indexeddb-internals/
|
||||
- chrome://media-internals/
|
||||
- chrome://network-errors/
|
||||
- chrome://serviceworker-internals/
|
||||
- chrome://webrtc-internals/
|
||||
- chrome://conversion-internals/ (QtWebEngine 5.15.3+)
|
||||
- chrome://crash/ (crashes the current renderer process!)
|
||||
- chrome://kill/ (kills the current renderer process!)
|
||||
- chrome://gpu/
|
||||
- chrome://gpuclean/ (crashes the current renderer process!)
|
||||
- chrome://gpucrash/ (crashes qutebrowser!)
|
||||
- chrome://gpuhang/ (hangs qutebrowser!)
|
||||
- chrome://gpuclean/ (crashes the current renderer process!)
|
||||
- chrome://histograms/
|
||||
- chrome://indexeddb-internals/
|
||||
- chrome://kill/ (kills the current renderer process!)
|
||||
- chrome://media-internals/
|
||||
- chrome://net-internals/ (QtWebEngine 5.15.4+)
|
||||
- chrome://network-errors/
|
||||
- chrome://ppapiflashcrash/
|
||||
- chrome://ppapiflashhang/
|
||||
- chrome://process-internals/
|
||||
- chrome://quota-internals/
|
||||
- chrome://taskscheduler-internals/
|
||||
- chrome://sandbox/ (Linux only)
|
||||
- chrome://serviceworker-internals/
|
||||
- chrome://taskscheduler-internals/ (removed in QtWebEngine 5.14)
|
||||
- chrome://tracing/ (QtWebEngine 5.15.3+)
|
||||
- chrome://ukm/ (QtWebEngine 5.15.3+)
|
||||
- chrome://user-actions/ (QtWebEngine 5.15.3+)
|
||||
- chrome://webrtc-internals/
|
||||
- chrome://webrtc-logs/ (QtWebEngine 5.15.3+)
|
||||
|
||||
QtWebEngine internals
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
|||
|
|
@ -22,10 +22,10 @@ Getting help
|
|||
------------
|
||||
|
||||
You can get help in the IRC channel
|
||||
irc://irc.freenode.org/#qutebrowser[`#qutebrowser`] on
|
||||
http://freenode.net/[Freenode]
|
||||
(https://webchat.freenode.net/?channels=#qutebrowser[webchat]), or by writing a
|
||||
message to the
|
||||
link:ircs://irc.libera.chat:6697/#qutebrowser[`#qutebrowser`] on
|
||||
https://libera.chat/[Libera Chat]
|
||||
(https://web.libera.chat/#qutebrowser[webchat], https://matrix.to/#qutebrowser:libera.chat[via Matrix]),
|
||||
or by writing a message to the
|
||||
https://lists.schokokeks.org/mailman/listinfo.cgi/qutebrowser[mailinglist] at
|
||||
mailto:qutebrowser@lists.qutebrowser.org[].
|
||||
|
||||
|
|
|
|||
|
|
@ -46,9 +46,9 @@ If you get stuck, you can get help in multiple ways:
|
|||
* The `:help` command inside qutebrowser shows the built-in documentation.
|
||||
Additionally, each command can be started with a `--help` flag to show its
|
||||
help.
|
||||
* Chat via the IRC channel: irc://irc.freenode.org/#qutebrowser[`#qutebrowser`] on
|
||||
https://freenode.net/[Freenode]
|
||||
(https://webchat.freenode.net/?channels=#qutebrowser[webchat])
|
||||
* Chat via the IRC channel: link:ircs://irc.libera.chat:6697/#qutebrowser[`#qutebrowser`] on
|
||||
https://libera.chat/[Libera Chat] (https://web.libera.chat/#qutebrowser[webchat],
|
||||
or https://matrix.to/#qutebrowser:libera.chat[via Matrix])
|
||||
* On Reddit: https://www.reddit.com/r/qutebrowser/[/r/qutebrowser]
|
||||
* Via https://github.com/qutebrowser/qutebrowser/discussions[GitHub Discussions]
|
||||
* Using the mailinglist: mailto:qutebrowser@lists.qutebrowser.org[]
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ environment, the directories configured there are used instead of the above
|
|||
defaults.
|
||||
|
||||
== BUGS
|
||||
Bugs are tracked in the Github issue tracker at
|
||||
Bugs are tracked in the Github issue tracker at
|
||||
https://github.com/qutebrowser/qutebrowser/issues.
|
||||
|
||||
If you found a bug, use the built-in ':report' command to create a bug report
|
||||
|
|
@ -152,8 +152,9 @@ this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
https://lists.schokokeks.org/mailman/listinfo.cgi/qutebrowser
|
||||
* Announce-only mailinglist: mailto:qutebrowser-announce@lists.qutebrowser.org[] /
|
||||
https://lists.schokokeks.org/mailman/listinfo.cgi/qutebrowser-announce
|
||||
* IRC: irc://irc.freenode.org/#qutebrowser[`#qutebrowser`] on
|
||||
https://freenode.net/[Freenode]
|
||||
* IRC: link:ircs://irc.libera.chat:6697/#qutebrowser[`#qutebrowser`] on
|
||||
https://libera.chat/[Libera Chat] (https://web.libera.chat/#qutebrowser[webchat],
|
||||
https://matrix.to/#qutebrowser:libera.chat[via Matrix])
|
||||
* Github: https://github.com/qutebrowser/qutebrowser
|
||||
|
||||
== AUTHOR
|
||||
|
|
|
|||
|
|
@ -2570,7 +2570,7 @@
|
|||
id="flowPara5604"
|
||||
style="font-size:13.8667px;line-height:1.25;font-family:sans-serif;stroke-width:1.06667">Website: https://www.qutebrowser.org/ </flowPara><flowPara
|
||||
id="flowPara5595"
|
||||
style="font-size:13.8667px;line-height:1.25;font-family:sans-serif;stroke-width:1.06667">IRC: #qutebrowser on Freenode</flowPara><flowPara
|
||||
style="font-size:13.8667px;line-height:1.25;font-family:sans-serif;stroke-width:1.06667">IRC: #qutebrowser on Libera Chat (irc.libera.chat)</flowPara><flowPara
|
||||
id="flowPara5597"
|
||||
style="font-size:13.8667px;line-height:1.25;font-family:sans-serif;stroke-width:1.06667">Mailinglist: qutebrowser@lists.qutebrowser.org</flowPara></flowRoot>
|
||||
<text
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 175 KiB |
|
|
@ -22,7 +22,7 @@
|
|||
; NsisMultiUser optional defines
|
||||
!define MULTIUSER_INSTALLMODE_ALLOW_BOTH_INSTALLATIONS 0
|
||||
!define MULTIUSER_INSTALLMODE_ALLOW_ELEVATION 1
|
||||
!define MULTIUSER_INSTALLMODE_ALLOW_ELEVATION_IF_SILENT 0
|
||||
!define MULTIUSER_INSTALLMODE_ALLOW_ELEVATION_IF_SILENT 1
|
||||
!define MULTIUSER_INSTALLMODE_DEFAULT_ALLUSERS 1
|
||||
!if ${PLATFORM} == "win64"
|
||||
!define MULTIUSER_INSTALLMODE_64_BIT 1
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ ShowUninstDetails hide
|
|||
!define CONTACT "mail@qutebrowser.org"
|
||||
!define COMMENTS "A keyboard-driven, vim-like browser based on PyQt5."
|
||||
!define LANGID "1033" ; U.S. English
|
||||
!define MIN_WIN_VER "XP"
|
||||
!define MIN_WIN_VER "8"
|
||||
!define SETUP_MUTEX "${PRODUCT_NAME} Setup Mutex" ; do not change this between program versions!
|
||||
!define APP_MUTEX "${PRODUCT_NAME} App Mutex" ; do not change this between program versions!
|
||||
!define REG_UN "Software\Microsoft\Windows\CurrentVersion\Uninstall"
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
</content_rating>
|
||||
<releases>
|
||||
<!-- Add new releases here -->
|
||||
<release version="2.2.3" date="2021-06-01"/>
|
||||
<release version="2.2.2" date="2021-05-20"/>
|
||||
<release version="2.2.1" date="2021-04-29"/>
|
||||
<release version="2.2.0" date="2021-04-13"/>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
build==0.3.1.post1
|
||||
build==0.4.0
|
||||
check-manifest==0.46
|
||||
packaging==20.9
|
||||
pep517==0.10.0
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
bump2version==1.0.1
|
||||
certifi==2020.12.5
|
||||
certifi==2021.5.30
|
||||
cffi==1.14.5
|
||||
chardet==4.0.0
|
||||
cryptography==3.4.7
|
||||
|
|
@ -21,4 +21,4 @@ sip==6.1.0
|
|||
six==1.16.0
|
||||
toml==0.10.2
|
||||
uritemplate==3.0.1
|
||||
# urllib3==1.26.4
|
||||
# urllib3==1.26.5
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ flake8-tuple==0.4.1
|
|||
mccabe==0.6.1
|
||||
pep8-naming==0.11.1
|
||||
pycodestyle==2.7.0
|
||||
pydocstyle==6.0.0
|
||||
pydocstyle==6.1.1
|
||||
pyflakes==2.3.1
|
||||
six==1.16.0
|
||||
snowballstemmer==2.1.0
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
chardet==4.0.0
|
||||
diff-cover==5.1.1
|
||||
importlib-metadata==4.0.1
|
||||
importlib-resources==5.1.3
|
||||
diff-cover==5.1.2
|
||||
importlib-metadata==4.3.1
|
||||
importlib-resources==5.1.4
|
||||
inflect==5.3.0
|
||||
Jinja2==3.0.0
|
||||
Jinja2==3.0.1
|
||||
jinja2-pluralize==0.3.0
|
||||
lxml==4.6.3
|
||||
MarkupSafe==2.0.0
|
||||
MarkupSafe==2.0.1
|
||||
mypy==0.812
|
||||
mypy-extensions==0.4.3
|
||||
pluggy==0.13.1
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
astroid==2.3.3 # rq.filter: < 2.4
|
||||
certifi==2020.12.5
|
||||
certifi==2021.5.30
|
||||
cffi==1.14.5
|
||||
chardet==4.0.0
|
||||
cryptography==3.4.7
|
||||
|
|
@ -12,7 +12,7 @@ isort==4.3.21
|
|||
jwcrypto==0.8
|
||||
lazy-object-proxy==1.4.3
|
||||
mccabe==0.6.1
|
||||
pefile==2021.5.13
|
||||
pefile==2021.5.24
|
||||
pycparser==2.20
|
||||
pylint==2.4.4 # rq.filter: < 2.5
|
||||
python-dateutil==2.8.1
|
||||
|
|
@ -21,5 +21,5 @@ requests==2.25.1
|
|||
six==1.16.0
|
||||
typed-ast==1.4.3 ; python_version<"3.8"
|
||||
uritemplate==3.0.1
|
||||
# urllib3==1.26.4
|
||||
# urllib3==1.26.5
|
||||
wrapt==1.11.2
|
||||
|
|
|
|||
|
|
@ -2,24 +2,24 @@
|
|||
|
||||
alabaster==0.7.12
|
||||
Babel==2.9.1
|
||||
certifi==2020.12.5
|
||||
certifi==2021.5.30
|
||||
chardet==4.0.0
|
||||
docutils==0.17.1
|
||||
idna==2.10
|
||||
imagesize==1.2.0
|
||||
Jinja2==2.11.3
|
||||
MarkupSafe==1.1.1
|
||||
Jinja2==3.0.1
|
||||
MarkupSafe==2.0.1
|
||||
packaging==20.9
|
||||
Pygments==2.9.0
|
||||
pyparsing==2.4.7
|
||||
pytz==2021.1
|
||||
requests==2.25.1
|
||||
snowballstemmer==2.1.0
|
||||
Sphinx==4.0.1
|
||||
Sphinx==4.0.2
|
||||
sphinxcontrib-applehelp==1.0.2
|
||||
sphinxcontrib-devhelp==1.0.2
|
||||
sphinxcontrib-htmlhelp==1.0.3
|
||||
sphinxcontrib-htmlhelp==2.0.0
|
||||
sphinxcontrib-jsmath==1.0.1
|
||||
sphinxcontrib-qthelp==1.0.3
|
||||
sphinxcontrib-serializinghtml==1.1.4
|
||||
urllib3==1.26.4
|
||||
sphinxcontrib-serializinghtml==1.1.5
|
||||
urllib3==1.26.5
|
||||
|
|
|
|||
|
|
@ -3,28 +3,28 @@
|
|||
apipkg==1.5
|
||||
attrs==21.2.0
|
||||
beautifulsoup4==4.9.3
|
||||
certifi==2020.12.5
|
||||
certifi==2021.5.30
|
||||
chardet==4.0.0
|
||||
cheroot==8.5.2
|
||||
click==8.0.0
|
||||
click==8.0.1
|
||||
coverage==5.5
|
||||
EasyProcess==0.3
|
||||
execnet==1.8.0
|
||||
execnet==1.8.1
|
||||
filelock==3.0.12
|
||||
Flask==2.0.0
|
||||
Flask==2.0.1
|
||||
glob2==0.7
|
||||
hunter==3.3.3
|
||||
hypothesis==6.12.0
|
||||
hypothesis==6.13.10
|
||||
icdiff==1.9.1
|
||||
idna==2.10
|
||||
iniconfig==1.1.1
|
||||
itsdangerous==2.0.0
|
||||
itsdangerous==2.0.1
|
||||
jaraco.functools==3.3.0
|
||||
# Jinja2==3.0.0
|
||||
# Jinja2==3.0.1
|
||||
Mako==1.1.4
|
||||
manhole==1.8.0
|
||||
# MarkupSafe==2.0.0
|
||||
more-itertools==8.7.0
|
||||
# MarkupSafe==2.0.1
|
||||
more-itertools==8.8.0
|
||||
packaging==20.9
|
||||
parse==1.19.0
|
||||
parse-type==0.5.2
|
||||
|
|
@ -44,10 +44,10 @@ pytest-instafail==0.4.2
|
|||
pytest-mock==3.6.1
|
||||
pytest-qt==3.3.0
|
||||
pytest-repeat==0.9.1
|
||||
pytest-rerunfailures==9.1.1
|
||||
pytest-rerunfailures==10.0
|
||||
pytest-xdist==2.2.1
|
||||
pytest-xvfb==2.0.0
|
||||
PyVirtualDisplay==2.1
|
||||
PyVirtualDisplay==2.2
|
||||
requests==2.25.1
|
||||
requests-file==1.5.1
|
||||
six==1.16.0
|
||||
|
|
@ -55,6 +55,6 @@ sortedcontainers==2.4.0
|
|||
soupsieve==2.2.1
|
||||
tldextract==3.1.0
|
||||
toml==0.10.2
|
||||
urllib3==1.26.4
|
||||
urllib3==1.26.5
|
||||
vulture==2.3
|
||||
Werkzeug==2.0.0
|
||||
Werkzeug==2.0.1
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
# This file is automatically generated by scripts/dev/recompile_requirements.py
|
||||
|
||||
appdirs==1.4.4
|
||||
distlib==0.3.1
|
||||
distlib==0.3.2
|
||||
filelock==3.0.12
|
||||
packaging==20.9
|
||||
pip==21.1.1
|
||||
pip==21.1.2
|
||||
pluggy==0.13.1
|
||||
py==1.10.0
|
||||
pyparsing==2.4.7
|
||||
setuptools==56.2.0
|
||||
setuptools==57.0.0
|
||||
six==1.16.0
|
||||
toml==0.10.2
|
||||
tox==3.23.1
|
||||
virtualenv==20.4.6
|
||||
virtualenv==20.4.7
|
||||
wheel==0.36.2
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
# - It comes in handy if you enable downloads.remove_finished. If you want to
|
||||
# see the recent downloads, just press "sd".
|
||||
#
|
||||
# Thorsten Wißmann, 2015 (thorsten` on freenode)
|
||||
# Thorsten Wißmann, 2015 (thorsten` on Libera Chat)
|
||||
# Any feedback is welcome!
|
||||
|
||||
set -e
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ cat <<EOF
|
|||
This script can only be used as a userscript for qutebrowser
|
||||
2015, Thorsten Wißmann <edu _at_ thorsten-wissmann _dot_ de>
|
||||
In case of questions or suggestions, do not hesitate to send me an E-Mail or to
|
||||
directly ask me via IRC (nickname thorsten\`) in #qutebrowser on freenode.
|
||||
directly ask me via IRC (nickname thorsten\`) in #qutebrowser on Libera Chat.
|
||||
|
||||
$blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset
|
||||
WARNING: the passwords are stored in qutebrowser's
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
# (comments and video suggestions), i.e. only the videos should disappear
|
||||
# when mpv is started. And that's precisely what the present script does.
|
||||
#
|
||||
# Thorsten Wißmann, 2015 (thorsten` on freenode)
|
||||
# Thorsten Wißmann, 2015 (thorsten` on Libera Chat)
|
||||
# Any feedback is welcome!
|
||||
|
||||
set -e
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ __copyright__ = "Copyright 2014-2021 Florian Bruhin (The Compiler)"
|
|||
__license__ = "GPL"
|
||||
__maintainer__ = __author__
|
||||
__email__ = "mail@qutebrowser.org"
|
||||
__version__ = "2.2.2"
|
||||
__version__ = "2.2.3"
|
||||
__version_info__ = tuple(int(part) for part in __version__.split('.'))
|
||||
__description__ = "A keyboard-driven, vim-like browser based on PyQt5."
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ from qutebrowser.browser import pdfjs, downloads, history
|
|||
from qutebrowser.config import config, configdata, configexc
|
||||
from qutebrowser.utils import (version, utils, jinja, log, message, docutils,
|
||||
resources, objreg, standarddir)
|
||||
from qutebrowser.misc import guiprocess
|
||||
from qutebrowser.misc import guiprocess, quitter
|
||||
from qutebrowser.qt import sip
|
||||
|
||||
|
||||
|
|
@ -452,6 +452,9 @@ def qute_settings(url: QUrl) -> _HandlerRet:
|
|||
if url.password() != csrf_token:
|
||||
message.error("Invalid CSRF token for qute://settings!")
|
||||
raise RequestDeniedError("Invalid CSRF token!")
|
||||
if quitter.instance.is_shutting_down:
|
||||
log.config.debug("Ignoring /set request during shutdown")
|
||||
return 'text/html', b'error: ignored'
|
||||
return _qute_settings_set(url)
|
||||
|
||||
# Requests to qute://settings/set should only be allowed from
|
||||
|
|
|
|||
|
|
@ -65,12 +65,18 @@ if TYPE_CHECKING:
|
|||
|
||||
from qutebrowser.config import config
|
||||
from qutebrowser.misc import objects
|
||||
from qutebrowser.utils import qtutils, log, utils, debug, message
|
||||
from qutebrowser.utils import qtutils, log, utils, debug, message, version
|
||||
|
||||
|
||||
bridge: Optional['NotificationBridgePresenter'] = None
|
||||
|
||||
|
||||
def _notifications_supported() -> bool:
|
||||
"""Check whether the current QtWebEngine version has notification support."""
|
||||
versions = version.qtwebengine_versions(avoid_init=True)
|
||||
return versions.webengine >= utils.VersionNumber(5, 14)
|
||||
|
||||
|
||||
def init() -> None:
|
||||
"""Initialize the DBus notification presenter, if applicable.
|
||||
|
||||
|
|
@ -84,7 +90,8 @@ def init() -> None:
|
|||
# at a later point in time. However, doing so is probably too complex compared
|
||||
# to its usefulness.
|
||||
return
|
||||
if not qtutils.version_check('5.14'):
|
||||
|
||||
if not _notifications_supported():
|
||||
return
|
||||
|
||||
global bridge
|
||||
|
|
@ -163,7 +170,7 @@ class NotificationBridgePresenter(QObject):
|
|||
|
||||
def __init__(self, parent: QObject = None) -> None:
|
||||
super().__init__(parent)
|
||||
assert qtutils.version_check('5.14')
|
||||
assert _notifications_supported()
|
||||
|
||||
self._active_notifications: Dict[int, 'QWebEngineNotification'] = {}
|
||||
self._adapter: Optional[AbstractNotificationAdapter] = None
|
||||
|
|
@ -709,8 +716,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
|
|||
|
||||
def __init__(self, parent: QObject = None) -> None:
|
||||
super().__init__(bridge)
|
||||
if not qtutils.version_check('5.14'):
|
||||
raise Error("Notifications are not supported on Qt < 5.14")
|
||||
assert _notifications_supported()
|
||||
|
||||
if utils.is_windows:
|
||||
# The QDBusConnection destructor seems to cause error messages (and
|
||||
|
|
@ -778,7 +784,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
|
|||
self,
|
||||
name: str,
|
||||
vendor: str,
|
||||
version: str,
|
||||
ver: str,
|
||||
) -> Optional[_ServerQuirks]:
|
||||
"""Find quirks to use based on the server information."""
|
||||
if (name, vendor) == ("notify-osd", "Canonical Ltd"):
|
||||
|
|
@ -791,15 +797,15 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
|
|||
# Still in active development but doesn't implement spec 1.2:
|
||||
# https://github.com/mate-desktop/mate-notification-daemon/issues/132
|
||||
quirks = _ServerQuirks(spec_version="1.1")
|
||||
if utils.VersionNumber.parse(version) <= utils.VersionNumber(1, 24):
|
||||
if utils.VersionNumber.parse(ver) <= utils.VersionNumber(1, 24):
|
||||
# https://github.com/mate-desktop/mate-notification-daemon/issues/118
|
||||
quirks.avoid_body_hyperlinks = True
|
||||
return quirks
|
||||
elif (name, vendor) == ("naughty", "awesome") and version != "devel":
|
||||
elif (name, vendor) == ("naughty", "awesome") and ver != "devel":
|
||||
# Still in active development but spec 1.0/1.2 support isn't
|
||||
# released yet:
|
||||
# https://github.com/awesomeWM/awesome/commit/e076bc664e0764a3d3a0164dabd9b58d334355f4
|
||||
parsed_version = utils.VersionNumber.parse(version.lstrip('v'))
|
||||
parsed_version = utils.VersionNumber.parse(ver.lstrip('v'))
|
||||
if parsed_version <= utils.VersionNumber(4, 3):
|
||||
return _ServerQuirks(spec_version="1.0")
|
||||
elif (name, vendor) == ("twmnd", "twmnd"):
|
||||
|
|
@ -810,7 +816,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
|
|||
return _ServerQuirks(skip_capabilities=True)
|
||||
elif (name, vendor) == ("lxqt-notificationd", "lxqt.org"):
|
||||
quirks = _ServerQuirks()
|
||||
parsed_version = utils.VersionNumber.parse(version)
|
||||
parsed_version = utils.VersionNumber.parse(ver)
|
||||
if parsed_version <= utils.VersionNumber(0, 16):
|
||||
# https://github.com/lxqt/lxqt-notificationd/issues/253
|
||||
quirks.escape_title = True
|
||||
|
|
@ -843,13 +849,13 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
|
|||
"""Query notification server information and set quirks."""
|
||||
reply = self.interface.call(QDBus.BlockWithGui, "GetServerInformation")
|
||||
self._verify_message(reply, "ssss", QDBusMessage.ReplyMessage)
|
||||
name, vendor, version, spec_version = reply.arguments()
|
||||
name, vendor, ver, spec_version = reply.arguments()
|
||||
|
||||
log.misc.debug(
|
||||
f"Connected to notification server: {name} {version} by {vendor}, "
|
||||
f"Connected to notification server: {name} {ver} by {vendor}, "
|
||||
f"implementing spec {spec_version}")
|
||||
|
||||
quirks = self._find_quirks(name, vendor, version)
|
||||
quirks = self._find_quirks(name, vendor, ver)
|
||||
if quirks is not None:
|
||||
log.misc.debug(f"Enabling quirks {quirks}")
|
||||
self._quirks = quirks
|
||||
|
|
@ -857,7 +863,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
|
|||
expected_spec_version = self._quirks.spec_version or self.SPEC_VERSION
|
||||
if spec_version != expected_spec_version:
|
||||
log.misc.warning(
|
||||
f"Notification server ({name} {version} by {vendor}) implements "
|
||||
f"Notification server ({name} {ver} by {vendor}) implements "
|
||||
f"spec {spec_version}, but {expected_spec_version} was expected. "
|
||||
f"If {name} is up to date, please report a qutebrowser bug.")
|
||||
|
||||
|
|
|
|||
|
|
@ -401,6 +401,16 @@ class WebEngineCaret(browsertab.AbstractCaret):
|
|||
self._js_call('reverseSelection')
|
||||
|
||||
def _follow_selected_cb_wrapped(self, js_elem, tab):
|
||||
if sip.isdeleted(self):
|
||||
# Sometimes, QtWebEngine JS callbacks seem to be stuck, and will
|
||||
# later get executed when the tab is closed. However, at this point,
|
||||
# the WebEngineCaret is already gone.
|
||||
log.webview.warning(
|
||||
"Got follow_selected callback for deleted WebEngineCaret. "
|
||||
"This is most likely due to a QtWebEngine bug, please report a "
|
||||
"qutebrowser issue if you know a way to reproduce this.")
|
||||
return
|
||||
|
||||
try:
|
||||
self._follow_selected_cb(js_elem, tab)
|
||||
finally:
|
||||
|
|
@ -1593,7 +1603,9 @@ class WebEngineTab(browsertab.AbstractTab):
|
|||
up doing it twice.
|
||||
"""
|
||||
super()._on_url_changed(url)
|
||||
if url.isValid() and qtutils.version_check('5.13'):
|
||||
if (url.isValid() and
|
||||
qtutils.version_check('5.13') and
|
||||
not qtutils.version_check('5.14')):
|
||||
self.settings.update_for_url(url)
|
||||
|
||||
@pyqtSlot(usertypes.NavigationRequest)
|
||||
|
|
|
|||
|
|
@ -211,7 +211,15 @@ class BraveAdBlocker:
|
|||
|
||||
if cache_exists:
|
||||
logger.debug("Loading cached adblock data: %s", self._cache_path)
|
||||
self._engine.deserialize_from_file(str(self._cache_path))
|
||||
try:
|
||||
self._engine.deserialize_from_file(str(self._cache_path))
|
||||
except ValueError as e:
|
||||
if str(e) != "DeserializationError":
|
||||
# All Rust exceptions get turned into a ValueError by
|
||||
# python-adblock
|
||||
raise
|
||||
message.error("Reading adblock filter data failed (corrupted data?). "
|
||||
"Please run :adblock-update.")
|
||||
else:
|
||||
if (
|
||||
config.val.content.blocking.adblock.lists
|
||||
|
|
|
|||
|
|
@ -582,6 +582,7 @@ content.headers.accept_language:
|
|||
type:
|
||||
name: String
|
||||
none_ok: true
|
||||
encoding: ascii
|
||||
supports_pattern: true
|
||||
default: en-US,en;q=0.9
|
||||
desc: >-
|
||||
|
|
@ -643,6 +644,7 @@ content.headers.user_agent:
|
|||
Safari/{webkit_version}'
|
||||
type:
|
||||
name: FormatString
|
||||
encoding: ascii
|
||||
fields:
|
||||
- os_info
|
||||
- webkit_version
|
||||
|
|
|
|||
|
|
@ -86,6 +86,21 @@ _UnsetNone = Union[None, usertypes.Unset]
|
|||
_StrUnsetNone = Union[str, _UnsetNone]
|
||||
|
||||
|
||||
def _validate_encoding(encoding: Optional[str], value: str) -> None:
|
||||
"""Check if the given value fits into the given encoding.
|
||||
|
||||
Raises ValidationError if not.
|
||||
"""
|
||||
if encoding is None:
|
||||
return
|
||||
|
||||
try:
|
||||
value.encode(encoding)
|
||||
except UnicodeEncodeError as e:
|
||||
msg = f"{value!r} contains non-{encoding} characters: {e}"
|
||||
raise configexc.ValidationError(value, msg)
|
||||
|
||||
|
||||
class ValidValues:
|
||||
|
||||
"""Container for valid values for a given type.
|
||||
|
|
@ -377,6 +392,7 @@ class String(BaseType):
|
|||
maxlen: Maximum length (inclusive).
|
||||
forbidden: Forbidden chars in the string.
|
||||
regex: A regex used to validate the string.
|
||||
encoding: The encoding the value needs to fit in.
|
||||
completions: completions to be used, or None
|
||||
"""
|
||||
|
||||
|
|
@ -407,24 +423,6 @@ class String(BaseType):
|
|||
self.encoding = encoding
|
||||
self.regex = regex
|
||||
|
||||
def _validate_encoding(self, value: str) -> None:
|
||||
"""Check if the given value fits into the configured encoding.
|
||||
|
||||
Raises ValidationError if not.
|
||||
|
||||
Args:
|
||||
value: The value to check.
|
||||
"""
|
||||
if self.encoding is None:
|
||||
return
|
||||
|
||||
try:
|
||||
value.encode(self.encoding)
|
||||
except UnicodeEncodeError as e:
|
||||
msg = "{!r} contains non-{} characters: {}".format(
|
||||
value, self.encoding, e)
|
||||
raise configexc.ValidationError(value, msg)
|
||||
|
||||
def to_py(self, value: _StrUnset) -> _StrUnsetNone:
|
||||
self._basic_py_validation(value, str)
|
||||
if isinstance(value, usertypes.Unset):
|
||||
|
|
@ -432,7 +430,7 @@ class String(BaseType):
|
|||
elif not value:
|
||||
return None
|
||||
|
||||
self._validate_encoding(value)
|
||||
_validate_encoding(self.encoding, value)
|
||||
self._validate_valid_values(value)
|
||||
|
||||
if self.forbidden is not None and any(c in value
|
||||
|
|
@ -1544,6 +1542,7 @@ class FormatString(BaseType):
|
|||
|
||||
Attributes:
|
||||
fields: Which replacements are allowed in the format string.
|
||||
encoding: Which encoding the string should fit into.
|
||||
completions: completions to be used, or None
|
||||
"""
|
||||
|
||||
|
|
@ -1551,11 +1550,13 @@ class FormatString(BaseType):
|
|||
self, *,
|
||||
fields: Iterable[str],
|
||||
none_ok: bool = False,
|
||||
encoding: str = None,
|
||||
completions: _Completions = None,
|
||||
) -> None:
|
||||
super().__init__(
|
||||
none_ok=none_ok, completions=completions)
|
||||
self.fields = fields
|
||||
self.encoding = encoding
|
||||
self._completions = completions
|
||||
|
||||
def to_py(self, value: _StrUnset) -> _StrUnsetNone:
|
||||
|
|
@ -1565,6 +1566,8 @@ class FormatString(BaseType):
|
|||
elif not value:
|
||||
return None
|
||||
|
||||
_validate_encoding(self.encoding, value)
|
||||
|
||||
try:
|
||||
value.format(**{k: '' for k in self.fields})
|
||||
except (KeyError, IndexError, AttributeError) as e:
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ class ExternalEditor(QObject):
|
|||
raise ValueError("Already editing a file!")
|
||||
try:
|
||||
self._filename = self._create_tempfile(text, 'qutebrowser-editor-')
|
||||
except OSError as e:
|
||||
except (OSError, UnicodeEncodeError) as e:
|
||||
message.error("Failed to create initial file: {}".format(e))
|
||||
return
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ class Quitter(QObject):
|
|||
|
||||
Attributes:
|
||||
quit_status: The current quitting status.
|
||||
_is_shutting_down: Whether we're currently shutting down.
|
||||
is_shutting_down: Whether we're currently shutting down.
|
||||
_args: The argparse namespace.
|
||||
"""
|
||||
|
||||
|
|
@ -69,7 +69,7 @@ class Quitter(QObject):
|
|||
'tabs': False,
|
||||
'main': False,
|
||||
}
|
||||
self._is_shutting_down = False
|
||||
self.is_shutting_down = False
|
||||
self._args = args
|
||||
|
||||
def on_last_window_closed(self) -> None:
|
||||
|
|
@ -214,9 +214,9 @@ class Quitter(QObject):
|
|||
closing.
|
||||
is_restart: If we're planning to restart.
|
||||
"""
|
||||
if self._is_shutting_down:
|
||||
if self.is_shutting_down:
|
||||
return
|
||||
self._is_shutting_down = True
|
||||
self.is_shutting_down = True
|
||||
log.destroy.debug("Shutting down with status {}, session {}...".format(
|
||||
status, session))
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ import json
|
|||
import inspect
|
||||
import argparse
|
||||
from typing import (TYPE_CHECKING, Any, Iterator, Mapping, MutableSequence,
|
||||
Optional, Set, Tuple, Union, cast)
|
||||
Optional, Set, Tuple, Union)
|
||||
|
||||
from PyQt5 import QtCore
|
||||
# Optional imports
|
||||
|
|
@ -363,12 +363,16 @@ def change_console_formatter(level: int) -> None:
|
|||
level: The numeric logging level
|
||||
"""
|
||||
assert console_handler is not None
|
||||
old_formatter = console_handler.formatter
|
||||
|
||||
old_formatter = cast(ColoredFormatter, console_handler.formatter)
|
||||
console_fmt = get_console_format(level)
|
||||
console_formatter = ColoredFormatter(console_fmt, DATEFMT, '{',
|
||||
use_colors=old_formatter.use_colors)
|
||||
console_handler.setFormatter(console_formatter)
|
||||
if isinstance(old_formatter, ColoredFormatter):
|
||||
console_fmt = get_console_format(level)
|
||||
console_formatter = ColoredFormatter(
|
||||
console_fmt, DATEFMT, '{', use_colors=old_formatter.use_colors)
|
||||
console_handler.setFormatter(console_formatter)
|
||||
else:
|
||||
# Same format for all levels
|
||||
assert isinstance(old_formatter, JSONFormatter), old_formatter
|
||||
|
||||
|
||||
def qt_message_handler(msg_type: QtCore.QtMsgType,
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@
|
|||
adblock==0.4.4
|
||||
colorama==0.4.4
|
||||
dataclasses==0.6 ; python_version<"3.7"
|
||||
importlib-metadata==4.0.1 ; python_version<"3.8"
|
||||
importlib-resources==5.1.3 ; python_version<"3.9"
|
||||
Jinja2==3.0.0
|
||||
MarkupSafe==2.0.0
|
||||
importlib-metadata==4.3.1 ; python_version<"3.8"
|
||||
importlib-resources==5.1.4 ; python_version<"3.9"
|
||||
Jinja2==3.0.1
|
||||
MarkupSafe==2.0.1
|
||||
Pygments==2.9.0
|
||||
PyYAML==5.4.1
|
||||
typing-extensions==3.10.0.0
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
* CYCLE_INPUTS = "jseval -q -f ~/.config/qutebrowser/cycle-inputs.js"
|
||||
* config.bind('gi', CYCLE_INPUTS)
|
||||
*
|
||||
* By dive on freenode <dave@dawoodfall.net>
|
||||
* By dive <dave@dawoodfall.net>
|
||||
*/
|
||||
|
||||
(function() {
|
||||
|
|
|
|||
|
|
@ -269,7 +269,22 @@ INFO_PLIST_UPDATES = {
|
|||
"CFBundleTypeMIMETypes": ["text/xhtml"],
|
||||
"CFBundleTypeName": "XHTML document",
|
||||
"CFBundleTypeRole": "Viewer",
|
||||
}]
|
||||
}],
|
||||
|
||||
# https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos
|
||||
#
|
||||
# Keys based on Google Chrome's .app, except Bluetooth keys which seem to
|
||||
# be iOS-only.
|
||||
#
|
||||
# If we don't do this, we get a SIGABRT from macOS when those permissions
|
||||
# are used, and even in some other situations (like logging into Google
|
||||
# accounts)...
|
||||
'NSCameraUsageDescription':
|
||||
'A website in qutebrowser wants to use the camera.',
|
||||
'NSLocationUsageDescription':
|
||||
'A website in qutebrowser wants to use your location information.',
|
||||
'NSMicrophoneUsageDescription':
|
||||
'A website in qutebrowser wants to use your microphone.',
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@
|
|||
|
||||
<div class="dyk">
|
||||
...the IRC channel for qutebrowser is <code>#qutebrowser</code> on
|
||||
irc.freenode.net
|
||||
irc.libera.chat
|
||||
</div>
|
||||
|
||||
<div class="dyk">
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ aster/doc/contributing.asciidoc">
|
|||
=20
|
||||
<div class=3D"dyk">
|
||||
...the IRC channel for qutebrowser is <code>#qutebrowser</code> on
|
||||
irc.freenode.net
|
||||
irc.libera.chat
|
||||
</div>
|
||||
=20
|
||||
<div class=3D"dyk">
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import warnings
|
|||
import dataclasses
|
||||
|
||||
import pytest
|
||||
import pytestqt.plugin
|
||||
import pytestqt.wait_signal
|
||||
from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QProcess, QObject,
|
||||
QElapsedTimer, QProcessEnvironment)
|
||||
from PyQt5.QtTest import QSignalSpy
|
||||
|
|
@ -198,8 +198,7 @@ class Process(QObject):
|
|||
|
||||
Should be used in a contextmanager.
|
||||
"""
|
||||
blocker = pytestqt.plugin.SignalBlocker(timeout=timeout,
|
||||
raising=raising)
|
||||
blocker = pytestqt.wait_signal.SignalBlocker(timeout=timeout, raising=raising)
|
||||
blocker.connect(signal)
|
||||
return blocker
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import logging
|
|||
import importlib
|
||||
import re
|
||||
import json
|
||||
import platform
|
||||
|
||||
import pytest
|
||||
from PyQt5.QtCore import QProcess, QPoint
|
||||
|
|
@ -39,6 +40,14 @@ ascii_locale = pytest.mark.skipif(sys.hexversion >= 0x03070000,
|
|||
"locale with LC_ALL=C")
|
||||
|
||||
|
||||
# For some reason (some floating point rounding differences?), color values are
|
||||
# slightly different (and wrong!) on ARM machines. We adjust our expected values
|
||||
# accordingly, since we don't really care about the exact value, we just want to
|
||||
# know that the underlying Chromium is respecting our preferences.
|
||||
# FIXME what to do about 32-bit ARM?
|
||||
IS_ARM = platform.machine() == 'aarch64'
|
||||
|
||||
|
||||
def _base_args(config):
|
||||
"""Get the arguments to pass with every invocation."""
|
||||
args = ['--debug', '--json-logging', '--no-err-windows']
|
||||
|
|
@ -55,7 +64,16 @@ def _base_args(config):
|
|||
|
||||
|
||||
@pytest.fixture
|
||||
def temp_basedir_env(tmp_path, short_tmpdir):
|
||||
def runtime_tmpdir(short_tmpdir):
|
||||
"""A directory suitable for XDG_RUNTIME_DIR."""
|
||||
runtime_dir = short_tmpdir / 'rt'
|
||||
runtime_dir.ensure(dir=True)
|
||||
runtime_dir.chmod(0o700)
|
||||
return runtime_dir
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def temp_basedir_env(tmp_path, runtime_tmpdir):
|
||||
"""Return a dict of environment variables that fakes --temp-basedir.
|
||||
|
||||
We can't run --basedir or --temp-basedir for some tests, so we mess with
|
||||
|
|
@ -63,12 +81,8 @@ def temp_basedir_env(tmp_path, short_tmpdir):
|
|||
"""
|
||||
data_dir = tmp_path / 'data'
|
||||
config_dir = tmp_path / 'config'
|
||||
runtime_dir = short_tmpdir / 'rt'
|
||||
cache_dir = tmp_path / 'cache'
|
||||
|
||||
runtime_dir.ensure(dir=True)
|
||||
runtime_dir.chmod(0o700)
|
||||
|
||||
lines = [
|
||||
'[general]',
|
||||
'quickstart-done = 1',
|
||||
|
|
@ -83,7 +97,7 @@ def temp_basedir_env(tmp_path, short_tmpdir):
|
|||
env = {
|
||||
'XDG_DATA_HOME': str(data_dir),
|
||||
'XDG_CONFIG_HOME': str(config_dir),
|
||||
'XDG_RUNTIME_DIR': str(runtime_dir),
|
||||
'XDG_RUNTIME_DIR': str(runtime_tmpdir),
|
||||
'XDG_CACHE_HOME': str(cache_dir),
|
||||
}
|
||||
return env
|
||||
|
|
@ -512,7 +526,8 @@ def test_preferred_colorscheme_with_dark_mode(
|
|||
# No workaround known.
|
||||
expected_text = 'Light preference detected.'
|
||||
# light website color, inverted by darkmode
|
||||
expected_color = testutils.Color(127, 127, 127)
|
||||
expected_color = (testutils.Color(123, 125, 123) if IS_ARM
|
||||
else testutils.Color(127, 127, 127))
|
||||
xfail = "Chromium bug 1177973"
|
||||
elif qtwe_version == utils.VersionNumber(5, 15, 2):
|
||||
# Our workaround breaks when dark mode is enabled...
|
||||
|
|
@ -524,7 +539,8 @@ def test_preferred_colorscheme_with_dark_mode(
|
|||
# Qt 5.14 and 5.15.0/.1 work correctly.
|
||||
# Hopefully, so does Qt 6.x in the future?
|
||||
expected_text = 'Dark preference detected.'
|
||||
expected_color = testutils.Color(34, 34, 34) # dark website color
|
||||
expected_color = (testutils.Color(33, 32, 33) if IS_ARM
|
||||
else testutils.Color(34, 34, 34)) # dark website color
|
||||
xfail = False
|
||||
|
||||
pos = QPoint(0, 0)
|
||||
|
|
@ -625,30 +641,51 @@ def test_cookies_store(quteproc_new, request, short_tmpdir, store):
|
|||
quteproc_new.wait_for_quit()
|
||||
|
||||
|
||||
# The 'colors' dictionaries in the parametrize decorator below have (QtWebEngine
|
||||
# version, CPU architecture) as keys. Either of those (or both) can be None to
|
||||
# say "on all other Qt versions" or "on all other CPU architectures".
|
||||
@pytest.mark.parametrize('filename, algorithm, colors', [
|
||||
(
|
||||
'blank',
|
||||
'lightness-cielab',
|
||||
{
|
||||
'5.15': testutils.Color(18, 18, 18),
|
||||
'5.14': testutils.Color(27, 27, 27),
|
||||
None: testutils.Color(0, 0, 0),
|
||||
('5.15', None): testutils.Color(18, 18, 18),
|
||||
('5.15', 'aarch64'): testutils.Color(16, 16, 16),
|
||||
('5.14', None): testutils.Color(27, 27, 27),
|
||||
('5.14', 'aarch64'): testutils.Color(24, 24, 24),
|
||||
(None, None): testutils.Color(0, 0, 0),
|
||||
}
|
||||
),
|
||||
('blank', 'lightness-hsl', {None: testutils.Color(0, 0, 0)}),
|
||||
('blank', 'brightness-rgb', {None: testutils.Color(0, 0, 0)}),
|
||||
('blank', 'lightness-hsl', {(None, None): testutils.Color(0, 0, 0)}),
|
||||
('blank', 'brightness-rgb', {(None, None): testutils.Color(0, 0, 0)}),
|
||||
|
||||
(
|
||||
'yellow',
|
||||
'lightness-cielab',
|
||||
{
|
||||
'5.15': testutils.Color(35, 34, 0),
|
||||
'5.14': testutils.Color(35, 34, 0),
|
||||
None: testutils.Color(204, 204, 0),
|
||||
('5.15', None): testutils.Color(35, 34, 0),
|
||||
('5.15', 'aarch64'): testutils.Color(33, 32, 0),
|
||||
('5.14', None): testutils.Color(35, 34, 0),
|
||||
('5.14', 'aarch64'): testutils.Color(33, 32, 0),
|
||||
(None, None): testutils.Color(204, 204, 0),
|
||||
}
|
||||
),
|
||||
(
|
||||
'yellow',
|
||||
'lightness-hsl',
|
||||
{
|
||||
(None, None): testutils.Color(204, 204, 0),
|
||||
(None, 'aarch64'): testutils.Color(206, 207, 0),
|
||||
},
|
||||
),
|
||||
(
|
||||
'yellow',
|
||||
'brightness-rgb',
|
||||
{
|
||||
(None, None): testutils.Color(0, 0, 204),
|
||||
(None, 'aarch64'): testutils.Color(0, 0, 206),
|
||||
}
|
||||
),
|
||||
('yellow', 'lightness-hsl', {None: testutils.Color(204, 204, 0)}),
|
||||
('yellow', 'brightness-rgb', {None: testutils.Color(0, 0, 204)}),
|
||||
])
|
||||
def test_dark_mode(webengine_versions, quteproc_new, request,
|
||||
filename, algorithm, colors):
|
||||
|
|
@ -664,7 +701,17 @@ def test_dark_mode(webengine_versions, quteproc_new, request,
|
|||
|
||||
ver = webengine_versions.webengine
|
||||
minor_version = str(ver.strip_patch())
|
||||
expected = colors.get(minor_version, colors[None])
|
||||
|
||||
arch = platform.machine()
|
||||
for key in [
|
||||
(minor_version, arch),
|
||||
(minor_version, None),
|
||||
(None, arch),
|
||||
(None, None),
|
||||
]:
|
||||
if key in colors:
|
||||
expected = colors[key]
|
||||
break
|
||||
|
||||
quteproc_new.open_path(f'data/darkmode/{filename}.html')
|
||||
|
||||
|
|
@ -691,9 +738,11 @@ def test_dark_mode_mathml(quteproc_new, request, qtbot):
|
|||
quteproc_new.wait_for_js('Image loaded')
|
||||
|
||||
# First make sure loading finished by looking outside of the image
|
||||
expected = testutils.Color(0, 0, 206) if IS_ARM else testutils.Color(0, 0, 204)
|
||||
|
||||
quteproc_new.get_screenshot(
|
||||
probe_pos=QPoint(105, 0),
|
||||
probe_color=testutils.Color(0, 0, 204),
|
||||
probe_color=expected,
|
||||
)
|
||||
|
||||
# Then get the actual formula color, probing again in case it's not displayed yet...
|
||||
|
|
@ -743,3 +792,14 @@ def test_unavailable_backend(request, quteproc_new):
|
|||
message=('*qutebrowser tried to start with the Qt* backend but failed '
|
||||
'because * could not be imported.*'))
|
||||
line.expected = True
|
||||
|
||||
|
||||
def test_json_logging_without_debug(request, quteproc_new, runtime_tmpdir):
|
||||
args = _base_args(request.config) + ['--temp-basedir', ':quit']
|
||||
args.remove('--debug')
|
||||
args.remove('about:blank') # interfers with :quit at the end
|
||||
|
||||
quteproc_new.exit_expected = True
|
||||
quteproc_new.start(args, env={'XDG_RUNTIME_DIR': str(runtime_tmpdir)})
|
||||
assert not quteproc_new.is_running()
|
||||
assert not quteproc_new.captured_log
|
||||
|
|
|
|||
|
|
@ -1839,6 +1839,11 @@ class TestFormatString:
|
|||
with pytest.raises(configexc.ValidationError):
|
||||
typ.to_py(val)
|
||||
|
||||
def test_invalid_encoding(self, klass):
|
||||
typ = klass(fields=[], encoding='ascii')
|
||||
with pytest.raises(configexc.ValidationError):
|
||||
typ.to_py('fooäbar')
|
||||
|
||||
@pytest.mark.parametrize('value', [
|
||||
None,
|
||||
['one', 'two'],
|
||||
|
|
|
|||
|
|
@ -382,5 +382,9 @@ class TestFontFamilies:
|
|||
if info.family() == fallback_family:
|
||||
return
|
||||
|
||||
if info.family() == 'Noto Sans Mono':
|
||||
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-94090
|
||||
return
|
||||
|
||||
# If we didn't fall back, we should've gotten a fixed-pitch font.
|
||||
assert info.fixedPitch(), info.family()
|
||||
|
|
|
|||
|
|
@ -148,6 +148,17 @@ class TestFileHandling:
|
|||
assert msg.text.startswith("Failed to create initial file: ")
|
||||
assert editor._proc is None
|
||||
|
||||
def test_encode_error(self, message_mock, editor, caplog, config_stub):
|
||||
"""Test file handling when the initial text can't be encoded."""
|
||||
config_stub.val.editor.encoding = 'ascii'
|
||||
|
||||
with caplog.at_level(logging.ERROR):
|
||||
editor.edit("fooäbar")
|
||||
|
||||
msg = message_mock.getmsg(usertypes.MessageLevel.error)
|
||||
assert msg.text.startswith("Failed to create initial file: ")
|
||||
assert editor._proc is None
|
||||
|
||||
def test_double_edit(self, editor):
|
||||
editor.edit("")
|
||||
with pytest.raises(ValueError):
|
||||
|
|
|
|||
Loading…
Reference in New Issue