Merge remote-tracking branch 'origin/master' into 4nd3r/hostblock_subdomains

This commit is contained in:
Ander Punnar 2021-06-13 21:00:40 +03:00
commit d5433702a5
No known key found for this signature in database
GPG Key ID: 0A2971E562D618F3
24 changed files with 184 additions and 33 deletions

View File

@ -205,6 +205,7 @@ Active
* https://luakit.github.io/luakit/[luakit] (C/Lua, GTK+ with WebKit2)
* https://nyxt.atlas.engineer/[Nyxt browser] (formerly "Next browser", Lisp, Emacs-like but also offers Vim bindings, QtWebKit or GTK+/WebKit2 - note there was a https://jgkamat.gitlab.io/blog/next-rce.html[critical remote code execution] which was handled quite badly)
* https://vieb.dev/[Vieb] (JavaScript, Electron)
* https://surf.suckless.org/[surf] (C, GTK+ with WebKit1/WebKit2)
* Chrome/Chromium addons:
https://vimium.github.io/[Vimium],
https://github.com/dcchambers/vb4c[vb4c] (fork of cVim)
@ -236,7 +237,6 @@ original site is gone but the Arch Linux wiki has some data)
* https://www.uzbl.org/[uzbl] (C, GTK+ with WebKit1/WebKit2)
* https://github.com/conformal/xombrero[xombrero] (C, GTK+ with WebKit1)
* https://github.com/linkdd/cream-browser[Cream Browser] (C, GTK+ with WebKit1)
* https://surf.suckless.org/[surf] (C, GTK+ with WebKit1/WebKit2)
* Firefox addons (not based on WebExtensions or no recent activity):
http://www.vimperator.org/[Vimperator],
http://bug.5digits.org/pentadactyl/index[Pentadactyl],

View File

@ -19,10 +19,18 @@ breaking changes (such as renamed commands) can happen in minor releases.
v2.3.0 (unreleased)
-------------------
Added
~~~~~
- New `content.prefers_reduced_motion` setting to request websites to reduce
non-essential motion/animations.
Changed
~~~~~~~
- The `fonts.web.*` settings now support URL patterns.
- The `:greasemonkey-reload` command now shows a list of loaded scripts and has
a new `--quiet` switch to suppress that message.
[[v2.2.3]]
v2.2.3 (2021-06-01)

View File

@ -577,7 +577,7 @@ Toggle fullscreen mode.
[[greasemonkey-reload]]
=== greasemonkey-reload
Syntax: +:greasemonkey-reload [*--force*]+
Syntax: +:greasemonkey-reload [*--force*] [*--quiet*]+
Re-read Greasemonkey scripts from disk.
@ -586,6 +586,7 @@ The scripts are read from a 'greasemonkey' subdirectory in qutebrowser's data or
==== optional arguments
* +*-f*+, +*--force*+: For any scripts that have required dependencies, re-download them.
* +*-q*+, +*--quiet*+: Suppress message after loading scripts.
[[help]]
=== help

View File

@ -437,3 +437,9 @@ Various emacs/conkeror-like keybinding configs exist:
It's also mostly possible to get rid of modal keybindings by setting
`input.insert_mode.auto_enter` to `false`, and `input.forward_unbound_keys` to
`all`.
Other resources
^^^^^^^^^^^^^^^
- https://www.ii.com/qutebrowser-tips-fragments/[Infinite Ink: qutebrowser Tips and Fragments]
- https://www.ii.com/qutebrowser-configpy/[Infinite Ink: qutebrowsers Template config.py]

View File

@ -52,6 +52,16 @@ ways:
https://lists.schokokeks.org/mailman/listinfo.cgi/qutebrowser[mailinglist] at
mailto:qutebrowser@lists.qutebrowser.org[].
Other resources
---------------
- https://blog.qutebrowser.org/[Development blog]
- https://twitter.com/qutebrowser[Twitter account],
https://fosstodon.org/@qutebrowser[Mastodon account]
- Infinite Ink: https://www.ii.com/qutebrowser-getting-started/[Getting Started
with qutebrowser] and https://www.ii.com/portal/qutebrowser/[other
qutebrowser articles]
License
-------

View File

@ -187,6 +187,7 @@
|<<content.pdfjs,content.pdfjs>>|Allow pdf.js to view PDF files in the browser.
|<<content.persistent_storage,content.persistent_storage>>|Allow websites to request persistent storage quota via `navigator.webkitPersistentStorage.requestQuota`.
|<<content.plugins,content.plugins>>|Enable plugins in Web pages.
|<<content.prefers_reduced_motion,content.prefers_reduced_motion>>|Request websites to minimize non-essentials animations and motion.
|<<content.print_element_backgrounds,content.print_element_backgrounds>>|Draw the background color and images also when the page is printed.
|<<content.private_browsing,content.private_browsing>>|Open new windows in private browsing mode which does not record visited pages.
|<<content.proxy,content.proxy>>|Proxy to use.
@ -2607,6 +2608,22 @@ Type: <<types,Bool>>
Default: +pass:[false]+
[[content.prefers_reduced_motion]]
=== content.prefers_reduced_motion
Request websites to minimize non-essentials animations and motion.
This results in the `prefers-reduced-motion` CSS media query to evaluate to `reduce` (rather than `no-preference`).
On Windows, if this setting is set to False, the system-wide animation setting is considered.
This setting requires a restart.
On QtWebEngine, this setting requires Qt 5.14 or newer.
On QtWebKit, this setting is unavailable.
Type: <<types,Bool>>
Default: +pass:[false]+
[[content.print_element_backgrounds]]
=== content.print_element_backgrounds
Draw the background color and images also when the page is printed.

View File

@ -264,6 +264,10 @@ and QtWebEngine backend is also not available.
On Windows
----------
NOTE: As an additional resource, see
https://www.ii.com/installing-qutebrowser-on-windows/[Infinite Ink: Installing
qutebrowser on Windows].
There are different ways to install qutebrowser on Windows:
Prebuilt binaries

View File

@ -22,7 +22,10 @@ To call a userscript, it needs to be stored in your config or data directory und
`userscripts` (for example: `~/.local/share/qutebrowser/userscripts/myscript`),
or just use an absolute path.
NOTE: On Windows, only userscripts with `com`, `bat`, or `exe` extensions will be launched.
NOTE: On Windows, only userscripts with `com`, `bat`, or `exe` extensions will
be launched. As an additional resource, see
https://www.ii.com/qutebrowser-userscripts-on-windows/[Infinite Ink:
qutebrowser Userscripts on Windows].
Getting information
-------------------

View File

@ -5,10 +5,11 @@ certifi==2021.5.30
cffi==1.14.5
chardet==4.0.0
cryptography==3.4.7
Deprecated==1.2.12
github3.py==2.0.0
hunter==3.3.3
idna==2.10
jwcrypto==0.8
jwcrypto==0.9
manhole==1.8.0
packaging==20.9
pycparser==2.20
@ -22,3 +23,4 @@ six==1.16.0
toml==0.10.2
uritemplate==3.0.1
# urllib3==1.26.5
wrapt==1.12.1

View File

@ -2,7 +2,7 @@
chardet==4.0.0
diff-cover==5.1.2
importlib-metadata==4.3.1
importlib-metadata==4.5.0
importlib-resources==5.1.4
inflect==5.3.0
Jinja2==3.0.1

View File

@ -5,11 +5,12 @@ certifi==2021.5.30
cffi==1.14.5
chardet==4.0.0
cryptography==3.4.7
Deprecated==1.2.12
future==0.18.2
github3.py==2.0.0
idna==2.10
isort==4.3.21
jwcrypto==0.8
jwcrypto==0.9
lazy-object-proxy==1.4.3
mccabe==0.6.1
pefile==2021.5.24

View File

@ -14,7 +14,7 @@ filelock==3.0.12
Flask==2.0.1
glob2==0.7
hunter==3.3.3
hypothesis==6.13.10
hypothesis==6.13.14
icdiff==1.9.1
idna==2.10
iniconfig==1.1.1
@ -37,12 +37,12 @@ pyparsing==2.4.7
pytest==6.2.4
pytest-bdd==4.0.2
pytest-benchmark==3.4.1
pytest-cov==2.12.0
pytest-cov==2.12.1
pytest-forked==1.3.0
pytest-icdiff==0.5
pytest-instafail==0.4.2
pytest-mock==3.6.1
pytest-qt==3.3.0
pytest-qt==4.0.0
pytest-repeat==0.9.1
pytest-rerunfailures==10.0
pytest-xdist==2.2.1

View File

@ -76,7 +76,9 @@ The following userscripts can be found on their own repositories.
Opens DOIs on Sci-Hub.
- [1password](https://github.com/tomoakley/dotfiles/blob/master/qutebrowser/userscripts/1password):
Integration with 1password on macOS.
- [localhost](https://github.com/SidharthArya/.qutebrowser/blob/master/userscripts/localhost):
Quickly navigate to localhost:port. For reference: [A quicker way to reach localhost with qutebrowser](https://sidhartharya.me/a-quicker-way-to-reach-localhost-with-qutebrowser/)
[Zotero]: https://www.zotero.org/
[Pocket]: https://getpocket.com/
[Instapaper]: https://www.instapaper.com/

View File

@ -8,6 +8,7 @@
// # Prerequisites
//
// - Mozilla's readability library (npm install -g @mozilla/readability)
// - Also available in the AUR as nodejs-readability-git
// - jsdom (npm install -g jsdom)
// - qutejs (npm install -g qutejs)
//

View File

@ -32,7 +32,7 @@ from typing import cast, List, Sequence
from PyQt5.QtCore import pyqtSignal, QObject, QUrl
from qutebrowser.utils import (log, standarddir, jinja, objreg, utils,
javascript, urlmatch, version, usertypes)
javascript, urlmatch, version, usertypes, message)
from qutebrowser.api import cmdutils
from qutebrowser.browser import downloads
from qutebrowser.misc import objects
@ -101,6 +101,9 @@ class GreasemonkeyScript:
HEADER_REGEX = r'// ==UserScript==|\n+// ==/UserScript==\n'
PROPS_REGEX = r'// @(?P<prop>[^\s]+)\s*(?P<val>.*)'
def __str__(self):
return self.name
@classmethod
def parse(cls, source, filename=None):
"""GreasemonkeyScript factory.
@ -266,7 +269,7 @@ class GreasemonkeyManager(QObject):
self.load_scripts()
def load_scripts(self, *, force=False):
def load_scripts(self, *, force: bool = False) -> List[GreasemonkeyScript]:
"""Re-read Greasemonkey scripts from disk.
The scripts are read from a 'greasemonkey' subdirectory in
@ -275,14 +278,19 @@ class GreasemonkeyManager(QObject):
Args:
force: For any scripts that have required dependencies,
re-download them.
Return:
A list of loaded scripts.
"""
self._run_start = []
self._run_end = []
self._run_idle = []
scripts = []
for scripts_dir in _scripts_dirs():
scripts_dir = os.path.abspath(scripts_dir)
log.greasemonkey.debug("Reading scripts from: {}".format(scripts_dir))
for script_filename in glob.glob(os.path.join(scripts_dir, '*.js')):
if not os.path.isfile(script_filename):
continue
@ -290,10 +298,12 @@ class GreasemonkeyManager(QObject):
with open(script_path, encoding='utf-8-sig') as script_file:
script = GreasemonkeyScript.parse(script_file.read(),
script_filename)
if not script.name:
script.name = script_filename
assert script.name, script
self.add_script(script, force)
scripts.append(script)
self.scripts_reloaded.emit()
return sorted(scripts, key=str)
def add_script(self, script, force=False):
"""Add a GreasemonkeyScript to this manager.
@ -304,8 +314,7 @@ class GreasemonkeyManager(QObject):
"""
if script.requires:
log.greasemonkey.debug(
"Deferring script until requirements are "
"fulfilled: {}".format(script.name))
f"Deferring script until requirements are fulfilled: {script}")
self._get_required_scripts(script, force)
else:
self._add_script(script)
@ -319,14 +328,13 @@ class GreasemonkeyManager(QObject):
self._run_idle.append(script)
else:
if script.run_at:
log.greasemonkey.warning("Script {} has invalid run-at "
"defined, defaulting to "
"document-end"
.format(script.name))
log.greasemonkey.warning(
f"Script {script} has invalid run-at defined, defaulting to "
"document-end")
# Default as per
# https://wiki.greasespot.net/Metadata_Block#.40run-at
self._run_end.append(script)
log.greasemonkey.debug("Loaded script: {}".format(script.name))
log.greasemonkey.debug(f"Loaded script: {script}")
def _required_url_to_file_path(self, url):
requires_dir = os.path.join(_scripts_dirs()[0], 'requires')
@ -338,9 +346,8 @@ class GreasemonkeyManager(QObject):
self._in_progress_dls.remove(download)
if not self._add_script_with_requires(script):
log.greasemonkey.debug(
"Finished download {} for script {} "
"but some requirements are still pending"
.format(download.basename, script.name))
"Finished download {download.basename} for script {script} "
"but some requirements are still pending")
def _add_script_with_requires(self, script, quiet=False):
"""Add a script with pending downloads to this GreasemonkeyManager.
@ -364,8 +371,7 @@ class GreasemonkeyManager(QObject):
for url in reversed(script.requires):
target_path = self._required_url_to_file_path(url)
log.greasemonkey.debug(
"Adding required script for {} to IIFE: {}"
.format(script.name, url))
f"Adding required script for {script} to IIFE: {url}")
with open(target_path, encoding='utf8') as f:
script.add_required_script(f.read())
@ -426,7 +432,7 @@ class GreasemonkeyManager(QObject):
@cmdutils.register()
def greasemonkey_reload(force=False):
def greasemonkey_reload(force: bool = False, quiet: bool = False) -> None:
"""Re-read Greasemonkey scripts from disk.
The scripts are read from a 'greasemonkey' subdirectory in
@ -435,8 +441,12 @@ def greasemonkey_reload(force=False):
Args:
force: For any scripts that have required dependencies,
re-download them.
quiet: Suppress message after loading scripts.
"""
gm_manager.load_scripts(force=force)
scripts = gm_manager.load_scripts(force=force)
names = '\n'.join(str(script) for script in scripts)
if not quiet:
message.info(f"Loaded scripts:\n\n{names}")
def init():

View File

@ -343,7 +343,7 @@ class BrowserPage(QWebPage):
for script in toload:
if frame is self.mainFrame() or script.runs_on_sub_frames:
log.webview.debug('Running GM script: {}'.format(script.name))
log.webview.debug(f'Running GM script: {script}')
frame.evaluateJavaScript(script.code())
@pyqtSlot('QWebFrame*', 'QWebPage::Feature')

View File

@ -528,6 +528,22 @@ content.frame_flattening:
This will flatten all the frames to become one scrollable page.
content.prefers_reduced_motion:
default: false
type: Bool
backend:
QtWebEngine: Qt 5.14
QtWebKit: false
restart: true
desc: >-
Request websites to minimize non-essentials animations and motion.
This results in the `prefers-reduced-motion` CSS media query to evaluate to
`reduce` (rather than `no-preference`).
On Windows, if this setting is set to False, the system-wide animation
setting is considered.
content.site_specific_quirks:
renamed: content.site_specific_quirks.enabled

View File

@ -334,7 +334,11 @@ def _qtwebengine_settings_args(versions: version.WebEngineVersions) -> Iterator[
},
'content.headers.referer': {
'always': None,
}
},
'content.prefers_reduced_motion': {
True: '--force-prefers-reduced-motion',
False: None,
},
}
qt_514_ver = utils.VersionNumber(5, 14)

View File

@ -3,7 +3,7 @@
adblock==0.4.4
colorama==0.4.4
dataclasses==0.6 ; python_version<"3.7"
importlib-metadata==4.3.1 ; python_version<"3.8"
importlib-metadata==4.5.0 ; python_version<"3.8"
importlib-resources==5.1.4 ; python_version<"3.9"
Jinja2==3.0.1
MarkupSafe==2.0.1

View File

@ -185,6 +185,7 @@ CHANGELOG_URLS = {
'setuptools': 'https://setuptools.readthedocs.io/en/latest/history.html',
'future': 'https://python-future.org/whatsnew.html',
'pefile': 'https://github.com/erocarrera/pefile/commits/master',
'Deprecated': 'https://github.com/tantale/deprecated/blob/master/CHANGELOG.rst',
}

View File

@ -335,7 +335,7 @@ def _find_libs() -> Dict[Tuple[str, str], List[str]]:
for line in ldconfig_proc.stdout.splitlines():
match = pattern.fullmatch(line.strip())
if match is None:
if 'libs found in cache' not in line:
if 'libs found in cache' not in line and 'Cache generated by:' not in line:
utils.print_col(f'Failed to match ldconfig output: {line}', 'yellow')
continue

View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prefers reduced motion test</title>
<style>
#reduce-text {
display: none;
}
#no-preference-text {
display: none;
}
@media (prefers-reduced-motion: no-preference) {
#no-preference-text {
display: inline;
}
#missing-support-text {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
#reduce-text {
display: inline;
}
#missing-support-text {
display: none;
}
}
</style>
</head>
<body>
<p id="reduce-text">Reduced motion preference detected.</p>
<p id="no-preference-text">No preference detected.</p>
<p id="missing-support-text">Preference support missing.</p>
</body>
</html>

View File

@ -229,6 +229,10 @@ def is_ignored_chromium_message(line):
# gpu_process_transport_factory.cc(1019)] Lost UI shared context.
'Lost UI shared context.',
# [20870:20908:0607/081717.652282:ERROR:block_files.cc(465)] Failed to
# open /tmp/qutebrowser-basedir-cg284f_m/data/webengine/GPUCache/data_2
'Failed to open *GPUCache*',
# Qt 5.12
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-70702
# [32123:32123:0923/224739.457307:ERROR:in_progress_cache_impl.cc(192)]

View File

@ -752,6 +752,30 @@ def test_dark_mode_mathml(quteproc_new, request, qtbot):
)
@testutils.qt514
@pytest.mark.parametrize('value, preference', [
('true', 'Reduced motion'),
('false', 'No'),
])
@pytest.mark.skipif(
utils.is_windows,
reason="Outcome on Windows depends on system settings",
)
def test_prefers_reduced_motion(quteproc_new, request, value, preference):
if not request.config.webengine:
pytest.skip("Skipped with QtWebKit")
args = _base_args(request.config) + [
'--temp-basedir',
'-s', 'content.prefers_reduced_motion', value,
]
quteproc_new.start(args)
quteproc_new.open_path('data/prefers_reduced_motion.html')
content = quteproc_new.get_content()
assert content == f"{preference} preference detected."
def test_unavailable_backend(request, quteproc_new):
"""Test starting with a backend which isn't available.
@ -802,4 +826,3 @@ def test_json_logging_without_debug(request, quteproc_new, runtime_tmpdir):
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