summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2023-12-21Update changelog for 7955maint/unstable_mesa_error_logstoofar
2023-12-21Merge pull request #7955 from arza-zara/search_any_ordertoofar
A few more completions will now match search terms in any order: `:quickmark-*`, `:bookmark-*`, `:tab-take` and `:tab-select` (for the quick and bookmark categories).
2023-12-21Merge pull request #8042 from ↵toofar
qutebrowser/dependabot/github_actions/actions/upload-artifact-4 build(deps): bump actions/upload-artifact from 3 to 4
2023-12-21Merge pull request #8041 from ↵toofar
qutebrowser/dependabot/github_actions/github/codeql-action-3 build(deps): bump github/codeql-action from 2 to 3
2023-12-18build(deps): bump actions/upload-artifact from 3 to 4dependabot/github_actions/actions/upload-artifact-4dependabot[bot]
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18build(deps): bump github/codeql-action from 2 to 3dependabot/github_actions/github/codeql-action-3dependabot[bot]
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18Merge pull request #8038 from qutebrowser/update-dependenciesFlorian Bruhin
Update dependencies
2023-12-18Update dependenciesqutebrowser bot
2023-12-12Add placeholder changelog entries for next two releasestoofar
I would like to make merging PRs lower friction. One aspect of that for me is having to think about where to add the changelog info, whether it should go in an existing section, whether I should create a new section, what the format changelog is supposed to be in. These questions are a bit coupled with the decision of whether to backport a change or not. Those aren't hard questions but I don't usually have a long stretch of time for open source work. So making it so I don't have to make those decisions at merge time makes it easier for me to fit that work into my day. Previously it seemed to me that the norm was to only have a future changelog entry for the next patch release. Occasionally I would merge stuff and add it to the patch release changelog entry and then think about how I would have made getting any security fixes out harder or how it would have to be corrected at backport time. So this is kind of a pre-commitment that yes, we are going to be merging stuff to main that won't make it to the next release. A lot, but not all, of the above rambling will also be mitigated by adopting a fragment based changelog management system (#7101), because that means that more of the stuff we have to worry about when merging is only in the context of the PR. Eg just describe that the change does, don't worry too much about where that description is going to end up. Other follow up stuff we could do if norms are established or need re-enforcing: * update contributor docs to describe more of the branching strategy as it applies to merging * update contributor docs to describe backporting steps and philosophy * link changelog entries to milestones?
2023-12-12Merge pull request #8029 from ↵toofar
qutebrowser/dependabot/github_actions/actions/setup-python-5 build(deps): bump actions/setup-python from 4 to 5
2023-12-12Merge pull request #8028 from qutebrowser/update-dependenciestoofar
Update dependencies
2023-12-11build(deps): bump actions/setup-python from 4 to 5dependabot/github_actions/actions/setup-python-5dependabot[bot]
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11Regenerate pylint requirements with isort pinnedtoofar
I added isort!=5.13.0 in misc/requirements/requirements-pylint.txt and ran `python3 scripts/dev/recompile_requirements.py pylint` in `docker run -v `pwd`:/work -w /work -it python:3.8-bookworm bash` based off of main. Then reverted the relevant part of the update dependencies commit with `git show HEAD misc/requirements/requirements-pylint.txt | patch -R -p 1` and manually updated the two deps from the local update run :) diff --git i/misc/requirements/requirements-pylint.txt w/misc/requirements/requirements-pylint.txt index 80319adc03a7..1c8fa33e623a 100644 --- i/misc/requirements/requirements-pylint.txt +++ w/misc/requirements/requirements-pylint.txt @@ -11,7 +11,7 @@ idna==3.6 isort==5.12.0 mccabe==0.7.0 pefile==2023.2.7 -platformdirs==4.0.0 +platformdirs==4.1.0 pycparser==2.21 PyJWT==2.8.0 pylint==3.0.2 @@ -21,6 +21,6 @@ requests==2.31.0 six==1.16.0 tomli==2.0.1 tomlkit==0.12.3 -typing_extensions==4.8.0 +typing_extensions==4.9.0 uritemplate==4.1.1 # urllib3==2.1.0 ref: https://github.com/qutebrowser/qutebrowser/pull/8028#issuecomment-1849363267
2023-12-11Update dependenciesqutebrowser bot
2023-12-08Release v3.1.0v3.1.0v3.1.xqutebrowser bot
2023-12-08Upgrade release Python to 3.12Florian Bruhin
2023-12-08Merge branch 'explicit-focus-handling'Florian Bruhin
2023-12-08Add birthday pageFlorian Bruhin
2023-12-07Explicitly handle focus before hiding UI elementsexplicit-focus-handlingFlorian Bruhin
Almost 7 years ago, it was observed that hiding the status bar causes some websites being scrolled to the top: #2236. Back then, it never really was clear why this happens. However, with the v3.0.0 release, we had a regression causing the same thing to happen when leaving prompt mode: #7885. Thanks to "git bisect", the culprit was found to be 8e152aa, "Don't give keyboard focus to tab bar", which was a fix for #7820. However, it still wasn't clear why this phenomenon happens. What made things clearer to me was a combination of debugging and an old comment by pevu: https://github.com/qutebrowser/qutebrowser/issues/2236#issuecomment-337882102 > Chromium-browser has the same issue. When you open lipsum.com, scroll down, > then focus the location bar (url box), then press Tab, it will jump to the > top of the page and focus the first link. This doesn't happen when you > switch focus using the mouse. > > It seems to be an issue of how the view containing the website is focused > when all qutebrowser ui elements disappear. And indeed, tabbing into the web contents from the UI elements via the tab key in Chromium causes the website to start at the top, presumably as an accessibility feature? Essentially, this is also what happens in qutebrowser when an UI element is hidden while it still has focus: In QWidget::hide() (or, rather, QWidgetPrivate::hide_helper()), Qt moves the focus to the next widget by calling focusPrevNextChild(true): https://github.com/qt/qtbase/blob/v6.6.1/src/widgets/kernel/qwidget.cpp#L8259-L8271 And apparently, focusPrevNextChild() basically does the same thing as pressing the tab key, to the point that there is some code in Qt Declarative actually making tab keypresses out of it (which I'm still not sure is related, or maybe just the cause of #4579): https://github.com/qt/qtdeclarative/blob/v6.6.1/src/quickwidgets/qquickwidget.cpp#L1415-L1429 Some debugging confirms that this is exactly what happening: 1) We hide the status bar (or prompt) which has keyboard focus 2) Qt focuses the web view, which triggers the Chromium feature (?) scrolling it to the very top. 3) Only then, in TabbedBrowser.on_mod_left(), we noticed that the command or prompt mode was left, and reassign focus to the web view properly. In step 2), before this change, Qt happened to focus the tab bar (before we set the focus manually to the web contents), and thus this didn't happen. Not sure why it didn't focus the tab bar when we hid the status bar (maybe because how our widget hierarchy works with TabbedBrowser?). Python stacktrace of hiding prompt: Traceback (most recent call first): <built-in method hide of DownloadFilenamePrompt object at remote 0x7fffb8bc65f0> File ".../qutebrowser/mainwindow/prompt.py", line 204, in _on_mode_left self.show_prompts.emit(None) File ".../qutebrowser/keyinput/modeman.py", line 434, in leave self.left.emit(mode, self.mode, self._win_id) File ".../qutebrowser/keyinput/modeman.py", line 445, in mode_leave self.leave(self.mode, 'leave current') C++ stacktrace, with the focus change presumably being passed of to Chromium here: https://github.com/qt/qtwebengine/blob/dev/src/core/render_widget_host_view_qt_delegate_client.cpp#L714 #0 QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::handleFocusEvent(QFocusEvent*) () at /usr/src/debug/qt6-webengine/qtwebengine-everywhere-src-6.6.0/src/core/render_widget_host_view_qt_delegate_client.cpp:708 #1 QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::handleFocusEvent(QFocusEvent*) () at /usr/src/debug/qt6-webengine/qtwebengine-everywhere-src-6.6.0/src/core/render_widget_host_view_qt_delegate_client.cpp:705 #2 0x00007fffe5fea70c in QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::forwardEvent(QEvent*) () at /usr/src/debug/qt6-webengine/qtwebengine-everywhere-src-6.6.0/src/core/render_widget_host_view_qt_delegate_client.cpp:300 #3 0x00007fffe4dd5c79 in QQuickItem::event(QEvent*) (this=0x555556b6cd20, ev=0x7fffffffa320) at /usr/src/debug/qt6-declarative/qtdeclarative-everywhere-src-6.6.0/src/quick/items/qquickitem.cpp:8871 #4 0x00007ffff1f7318b in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x555556b6cd20, e=0x7fffffffa320) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qapplication.cpp:3290 #5 0x00007ffff295e4a7 in () at /usr/lib/python3.11/site-packages/PyQt6/QtWidgets.abi3.so #6 0x00007ffff59626d8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x555556b6cd20, event=0x7fffffffa320) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/corelib/kernel/qcoreapplication.cpp:1118 #7 0x00007ffff596271d in QCoreApplication::sendEvent(QObject*, QEvent*) (receiver=<optimized out>, event=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/corelib/kernel/qcoreapplication.cpp:1536 #8 0x00007fffe4f33f15 in QQuickDeliveryAgentPrivate::setFocusInScope(QQuickItem*, QQuickItem*, Qt::FocusReason, QFlags<QQuickDeliveryAgentPrivate::FocusOption>) (this=<optimized out>, scope=<optimized out>, item=<optimized out>, reason=<optimized out>, options=...) at /usr/src/debug/qt6-declarative/qtdeclarative-everywhere-src-6.6.0/src/quick/util/qquickdeliveryagent.cpp:439 #9 0x00007fffe4dd348a in QQuickItem::setFocus(bool, Qt::FocusReason) (this=0x555556b724d0, focus=<optimized out>, reason=Qt::TabFocusReason) at /usr/include/qt6/QtCore/qflags.h:73 #10 0x00007fffe4e7239b in QQuickWindow::focusInEvent(QFocusEvent*) (this=<optimized out>, ev=<optimized out>) at /usr/src/debug/qt6-declarative/qtdeclarative-everywhere-src-6.6.0/src/quick/items/qquickwindow.cpp:231 #11 0x00007ffff1fc3a05 in QWidget::event(QEvent*) (this=0x555556457b50, event=0x7fffffffa770) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qwidget.cpp:9111 #12 0x00007ffff1f7318b in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=<optimized out>, receiver=0x555556457b50, e=0x7fffffffa770) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qapplication.cpp:3290 #13 0x00007ffff295e4a7 in () at /usr/lib/python3.11/site-packages/PyQt6/QtWidgets.abi3.so #14 0x00007ffff59626d8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x555556457b50, event=0x7fffffffa770) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/corelib/kernel/qcoreapplication.cpp:1118 #15 0x00007ffff596271d in QCoreApplication::sendEvent(QObject*, QEvent*) (receiver=<optimized out>, event=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/corelib/kernel/qcoreapplication.cpp:1536 #16 0x00007ffff1f7f1b2 in QApplicationPrivate::setFocusWidget(QWidget*, Qt::FocusReason) (focus=0x555556457b50, reason=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qapplication.cpp:1538 #17 0x00007ffff1fca29d in QWidget::setFocus(Qt::FocusReason) (this=0x555556b1ceb0, reason=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qwidget.cpp:6580 #18 0x00007ffff1fb4f1b in QWidget::focusNextPrevChild(bool) (this=<optimized out>, next=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qwidget.cpp:6844 #19 0x00007ffff298d0ac in () at /usr/lib/python3.11/site-packages/PyQt6/QtWidgets.abi3.so #20 0x00007ffff298d0ac in () at /usr/lib/python3.11/site-packages/PyQt6/QtWidgets.abi3.so #21 0x00007ffff298d0ac in () at /usr/lib/python3.11/site-packages/PyQt6/QtWidgets.abi3.so #22 0x00007ffff1fbdb76 in QWidgetPrivate::hide_helper() (this=this@entry=0x55555646a360) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qwidget.cpp:8271 #23 0x00007ffff1fbf158 in QWidgetPrivate::setVisible(bool) (this=0x55555646a360, visible=<optimized out>) at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.0/src/widgets/kernel/qwidget.cpp:8447 [...] We fix this problem by explicitly handling focus before hiding the UI elements. This is done with a new TabbedBrowser.on_release_focus() slot, which is bound to signals emitted just before things are hidden: The existing Command.hide_cmd() for the status bar, and a new release_focus() signal for prompts. Additionally, we make sure to not double-handle hiding in the statusbar code when it's already handled separately for comamnd mode. Unfortunately, no tests for this, as application window focus is required to reproduce the issue. In theory, a test in scroll.feature could be added though, which loads simple.html, scrolls down, shows/hides a prompt or the status bar, and then checks the vertical scroll position is != 0. Fixes #2236 Fixes #7885
2023-12-05Avoid calling DownloadItem.origin() if unneededFlorian Bruhin
See #7854
2023-12-05Extend pakjoy to Qt 6.5.0/.1/.2 with dark modeFlorian Bruhin
See #7837
2023-12-04Fix lint and testsFlorian Bruhin
2023-12-04Merge pull request #8016 from arza-zara/docstringsFlorian Bruhin
Fix docstrings
2023-12-04Fix docstringsarza
2023-12-04Add content.javascript.legacy_touch_events settingFlorian Bruhin
Closes #7814
2023-12-04Fix lint and testsFlorian Bruhin
2023-12-04Fix lint and derpFlorian Bruhin
2023-12-04Upgrade changelog and changelog URLsFlorian Bruhin
2023-12-04Merge remote-tracking branch 'origin/pr/8015'Florian Bruhin
2023-12-04Support QWebEngineSettings.WebAttribute.ReadingFromCanvasEnabledFlorian Bruhin
See #7646
2023-12-04qtargs: Supply values with lambda instead of keysFlorian Bruhin
Makes the lambdas more flexible, e.g. mapping a single key to a different flag depending on Chromium version. Ended up being unneeded for reading from canvas flag, but still useful.
2023-12-04Expose QtWebEngine 6.6 dark mode image classifier policyFlorian Bruhin
Implemented as a separate setting in Chromium, but exposed to qutebrowser users as a value for `policy.images`, as it's a simple toggle that does not have any effect when `policy.images` is not set to `smart` anyways. To support this, the _Settings.mapping value now supports None values, which leads to _Setting.chromium_tuple to return None, which means that no switch is added in this case. See #7646
2023-12-04Remove dark mode settings removed from ChromiumFlorian Bruhin
Closes #7929
2023-12-04Update dark mode docsFlorian Bruhin
2023-12-04Update dependenciesqutebrowser bot
2023-12-04Update changelogFlorian Bruhin
2023-12-04Merge remote-tracking branch 'origin/pr/7935'Florian Bruhin
2023-12-04Update changelogFlorian Bruhin
2023-12-04Merge branch 'pdfjs-fix'Florian Bruhin
2023-12-04Simplify get_pdfjs testFlorian Bruhin
Given that the two branches share rather little, it seems simpler to separate the two tests. Also use monkeypatch, since we don't use any of unittest.mock's complexity
2023-12-04update changelog for accel 2d canvas take 2toofar
2023-12-03tweak savefile_open type hintstoofar
This was fixed up in https://github.com/qutebrowser/qutebrowser/pull/8006 after a mypy update caused us to examine the typing.AnyStr thing a bit more. But both overloads got set to have a `str` return type, so the possible bytes return type got lost. Mypy didn't pick that up because `binary=True` is only used in `qutebrowser/browser/webkit/cookies.py` which probably isn't being type checked. I had to remove the default from the binary arg of the bytes version (the ` = ...` bit) because if both overloads have the kwarg as optional mypy doesn't know which to match a call with just one positional argument against. Eg `savefile_open('some_file')` would match both. I checked with reveal_type: diff --git i/qutebrowser/utils/qtutils.py w/qutebrowser/utils/qtutils.py index 89175ca4ee60..5b86e441a1bc 100644 --- i/qutebrowser/utils/qtutils.py +++ w/qutebrowser/utils/qtutils.py @@ -290,6 +290,20 @@ def savefile_open( raise QtOSError(f, msg="Commit failed!") +def test_savefile_types() -> None: + from typing_extensions import reveal_type + + maybe_str_default = savefile_open("/tmp/string_file") + # note: Revealed type is "contextlib._GeneratorContextManager[typing.IO[builtins.str]]" + reveal_type(maybe_str_default) + maybe_str_explicit = savefile_open("/tmp/string_file", binary=False) + # note: Revealed type is "contextlib._GeneratorContextManager[typing.IO[builtins.str]]" + reveal_type(maybe_str_explicit) + maybe_bytes = savefile_open("/tmp/bytes_file", binary=True) + # note: Revealed type is "contextlib._GeneratorContextManager[typing.IO[builtins.bytes]]" + reveal_type(maybe_bytes) + + def qcolor_to_qsscolor(c: QColor) -> str: """Convert a QColor to a string that can be used in a QStyleSheet.""" ensure_valid(c)
2023-12-02Merge branch 'main' into pr/7992toofar
This is just to get the CI to re-trigger. Apparently the checkout action doesn't actually checkout the branch being proposed for merge but checks out an actual merge commit. So if you push a PR while main is broken it'll say changes from main are on your branch. That's a little unexpected. main is fixed now and I tried re-running the CI jobs from the web UI but they are still failing with the same errors. Hence this merge of main just to get a change on the branch. I could have gone and found a typo to fix instead. I know I've left enough of them around. ref: https://github.com/actions/checkout/issues/881
2023-12-02Always disable accelerated canvas if set to auto on Qt6toofar
We thought #7489 would be fixed on chrome 112 but it appears to still be an issue. As discussed on the issue, it's not clear how many workflows would be affected by accelerated 2d canvas and we don't have enough data to detect the affected graphics configurations. So lets just disable accelerated 2d canvas by default and users who want it turned on can do so via the setting. If some major use case pops up to enable this by default where possible we can revisit and think of more nuanced feature detection. I've kept the handling of callable values of `_WEBENGINE_SETTINGS` because I don't like have to have something like `--disable-accelerated-2d-canvas` written in code twice. The setting above this one could probably be changed to use it too.
2023-12-02pakjoy: fix happy path testtoofar
read back the manifest inside the context manager so we can find the work dir.
2023-12-02Add test for get_pdfjs_js_path()toofar
2023-12-01Remove unused fixtureFlorian Bruhin
2023-12-01pdfjs: Simplify logicFlorian Bruhin
Makes things easier if we get build/ right with the return value
2023-12-01Remove unused varsFlorian Bruhin
2023-12-01pdfjs: Fix :version crash with no pdf.jsFlorian Bruhin
pdfjs.get_pdf_basename() returned None, causing in a TypeError. Instead of throwing mocker.patch at it, fix the underlying issue. Given we made the same mistake in three places: - :version - test_real_file for PDF.js - is_available() in pdfjs.py (calls the function but doesn't use the result, so is a nop now, even if PDF.js wasn't found) ...evidently we need to change the API so it still raises an exception if no PDF.js is available. Amends 0144ae3576aaecde295d40e22d636f04240d6761.