From cf29f305e108b836c5f3ed4ffaa751255ba56089 Mon Sep 17 00:00:00 2001 From: toofar Date: Sat, 17 May 2025 17:14:43 +1200 Subject: [PATCH] Don't apply lifecycle rules to pinned tabs I want to make sure tabs in the background that might show notifications or update their favicons or whatever can keep running if I want them to, and not get frozen. Previous iterations of this feature have re-used the pinned state to demark tabs that shouldn't be frozen. So that's what I've implemented here. What could go wrong? If kept the same "do act on the state change if we are transitioning to an active state" check from the top of the function for consistency, but neither check is needed. Qt will put tabs into the Active state when they are shown without anything needed from our code. I also haven't implemented a lifecycle change when you un-pin a tab. It'll get picked up when you switch away from the tab. --- qutebrowser/browser/webengine/webenginetab.py | 3 +++ tests/unit/browser/webengine/test_webenginetab.py | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 8d6d6b8b6..0959bc67e 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1764,6 +1764,9 @@ class WebEngineTab(browsertab.AbstractTab): if delay < 0: return + if self.data.pinned and recommended_state != QWebEnginePage.LifecycleState.Active: + return + log.webview.debug(f"Scheduling recommended lifecycle change {delay=} {recommended_state=} tab={self}") self._lifecycle_timer.timeout.connect(lambda: self._set_lifecycle_state(recommended_state)) self._lifecycle_timer.start(delay) diff --git a/tests/unit/browser/webengine/test_webenginetab.py b/tests/unit/browser/webengine/test_webenginetab.py index dc7ef6d19..bc0deac4d 100644 --- a/tests/unit/browser/webengine/test_webenginetab.py +++ b/tests/unit/browser/webengine/test_webenginetab.py @@ -347,6 +347,17 @@ class TestPageLifecycle: webengine_tab._on_recommended_state_changed(QWebEnginePage.LifecycleState.Frozen) assert not webengine_tab._lifecycle_timer.isActive() + def test_pinned_tabs_untouched( + self, + webengine_tab: webenginetab.WebEngineTab, + monkeypatch, + config_stub, + ): + """Don't change lifecycle state for a pinned tab.""" + webengine_tab.set_pinned(True) + webengine_tab._on_recommended_state_changed(QWebEnginePage.LifecycleState.Frozen) + assert not webengine_tab._lifecycle_timer.isActive() + def test_timer_interrupted( self, webengine_tab: webenginetab.WebEngineTab,