From 9d91c222364330aafb9e8be923a8b81f30dfb916 Mon Sep 17 00:00:00 2001 From: cauimsouza Date: Tue, 4 Sep 2018 04:25:37 +0200 Subject: Allow tabs be muted by default --- qutebrowser/browser/browsertab.py | 3 ++- qutebrowser/browser/webengine/webenginetab.py | 8 +++++++- qutebrowser/browser/webkit/webkittab.py | 2 +- qutebrowser/config/configdata.yml | 8 ++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 087834e53..9c27e470e 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -666,9 +666,10 @@ class AbstractAudio(QObject): muted_changed = pyqtSignal(bool) recently_audible_changed = pyqtSignal(bool) - def __init__(self, parent=None): + def __init__(self, tab, parent=None): super().__init__(parent) self._widget = None + self._tab = tab def set_muted(self, muted: bool): """Set this tab as muted or not.""" diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index cfb809097..5a3042ba9 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -638,6 +638,7 @@ class WebEngineAudio(browsertab.AbstractAudio): page = self._widget.page() page.audioMutedChanged.connect(self.muted_changed) page.recentlyAudibleChanged.connect(self.recently_audible_changed) + self._tab.url_changed.connect(self._on_url_changed) def set_muted(self, muted: bool): page = self._widget.page() @@ -651,6 +652,11 @@ class WebEngineAudio(browsertab.AbstractAudio): page = self._widget.page() return page.recentlyAudible() + def _on_url_changed(self): + urlstr = self._tab.url().toString(QUrl.RemoveUserInfo) + muted_url = config.instance.get('content.mute', url=urlstr) + self.set_muted(muted_url is not None) + class _WebEnginePermissions(QObject): @@ -995,7 +1001,7 @@ class WebEngineTab(browsertab.AbstractTab): self.printing = WebEnginePrinting(tab=self) self.elements = WebEngineElements(tab=self) self.action = WebEngineAction(tab=self) - self.audio = WebEngineAudio(parent=self) + self.audio = WebEngineAudio(tab=self, parent=self) self._permissions = _WebEnginePermissions(tab=self, parent=self) self._scripts = _WebEngineScripts(tab=self, parent=self) # We're assigning settings in _set_widget diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 7b7ad0c7d..28d27f919 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -661,7 +661,7 @@ class WebKitTab(browsertab.AbstractTab): self.printing = WebKitPrinting(tab=self) self.elements = WebKitElements(tab=self) self.action = WebKitAction(tab=self) - self.audio = WebKitAudio(parent=self) + self.audio = WebKitAudio(tab=self, parent=self) # We're assigning settings in _set_widget self.settings = webkitsettings.WebKitSettings(settings=None) self._set_widget(widget) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 7d39bded8..bde38cbb8 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -746,6 +746,14 @@ content.xss_auditing: Suspicious scripts will be blocked and reported in the inspector's JavaScript console. +content.mute: + default: null + type: + name: String + none_ok: true + supports_pattern: true + desc: List of URLs muted by default. + # emacs: ' ## completion -- cgit v1.2.3-54-g00ecf From d32444803942022fddfdb07ac85648461f76e64d Mon Sep 17 00:00:00 2001 From: cauimsouza Date: Tue, 4 Sep 2018 16:40:05 +0200 Subject: Fix mute_per_domain feature Users can allow sounds to be played by default while specifying domains not allowed to play sounds, or the opposite. --- qutebrowser/browser/webengine/webenginetab.py | 6 +++--- qutebrowser/config/configdata.yml | 10 ++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 5a3042ba9..33f91850a 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -653,9 +653,9 @@ class WebEngineAudio(browsertab.AbstractAudio): return page.recentlyAudible() def _on_url_changed(self): - urlstr = self._tab.url().toString(QUrl.RemoveUserInfo) - muted_url = config.instance.get('content.mute', url=urlstr) - self.set_muted(muted_url is not None) + url = self._tab.url() + is_audible = config.instance.get('content.audible_default', url=url) + self.set_muted(not is_audible) class _WebEnginePermissions(QObject): diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index bde38cbb8..73af245c0 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -746,13 +746,11 @@ content.xss_auditing: Suspicious scripts will be blocked and reported in the inspector's JavaScript console. -content.mute: - default: null - type: - name: String - none_ok: true +content.audible_default: + default: true + type: Bool + desc: Play sounds automatically in web pages. supports_pattern: true - desc: List of URLs muted by default. # emacs: ' -- cgit v1.2.3-54-g00ecf From fc1d1928803de89f1c8dc5ecdf6aa824d895a288 Mon Sep 17 00:00:00 2001 From: cauimsouza Date: Wed, 5 Sep 2018 02:24:15 +0200 Subject: Pass url as second argument to slot --- qutebrowser/browser/webengine/webenginetab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 33f91850a..e3e8520c2 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -652,8 +652,8 @@ class WebEngineAudio(browsertab.AbstractAudio): page = self._widget.page() return page.recentlyAudible() - def _on_url_changed(self): - url = self._tab.url() + @pyqtSlot(QUrl) + def _on_url_changed(self, url): is_audible = config.instance.get('content.audible_default', url=url) self.set_muted(not is_audible) -- cgit v1.2.3-54-g00ecf From a742f03bca4dfe1a24caec4f77f3f728be196814 Mon Sep 17 00:00:00 2001 From: cauimsouza Date: Wed, 5 Sep 2018 02:59:03 +0200 Subject: Change setting name --- qutebrowser/browser/webengine/webenginetab.py | 4 ++-- qutebrowser/config/configdata.yml | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index e3e8520c2..e962f8f29 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -654,8 +654,8 @@ class WebEngineAudio(browsertab.AbstractAudio): @pyqtSlot(QUrl) def _on_url_changed(self, url): - is_audible = config.instance.get('content.audible_default', url=url) - self.set_muted(not is_audible) + mute = config.instance.get('content.mute', url=url) + self.set_muted(mute) class _WebEnginePermissions(QObject): diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 73af245c0..51dae63f5 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -746,11 +746,16 @@ content.xss_auditing: Suspicious scripts will be blocked and reported in the inspector's JavaScript console. -content.audible_default: - default: true +content.mute: + default: false type: Bool - desc: Play sounds automatically in web pages. supports_pattern: true + desc: >- + Mute new web pages. + + It's off by default meaning that new web pages might play sounds. + It's possible to set this configuration differently for different + URLs. # emacs: ' -- cgit v1.2.3-54-g00ecf From 71781b3f43e2ca9c402b599ec5730ab00a2c5c8b Mon Sep 17 00:00:00 2001 From: cauimsouza Date: Fri, 7 Sep 2018 21:44:17 +0200 Subject: Update fake object instantiation --- tests/helpers/stubs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 84e5b0125..b9a113b30 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -257,7 +257,7 @@ class FakeWebTab(browsertab.AbstractTab): self.history = FakeWebTabHistory(self, can_go_back=can_go_back, can_go_forward=can_go_forward) self.scroller = FakeWebTabScroller(self, scroll_pos_perc) - self.audio = FakeWebTabAudio() + self.audio = FakeWebTabAudio(self) wrapped = QWidget() self._layout.wrap(self, wrapped) -- cgit v1.2.3-54-g00ecf From 4a8d8688cb19aecc0b18ae4888c187229e6c322a Mon Sep 17 00:00:00 2001 From: cauimsouza Date: Fri, 7 Sep 2018 21:46:03 +0200 Subject: Improve configuration description --- qutebrowser/config/configdata.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 51dae63f5..cfdf3e5e7 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -750,12 +750,7 @@ content.mute: default: false type: Bool supports_pattern: true - desc: >- - Mute new web pages. - - It's off by default meaning that new web pages might play sounds. - It's possible to set this configuration differently for different - URLs. + desc: Automatically mute tabs. # emacs: ' -- cgit v1.2.3-54-g00ecf From 6b358fe95507360c8a9891f10f87e6e721d0eb02 Mon Sep 17 00:00:00 2001 From: Thomas Fischer Date: Sat, 8 Sep 2018 00:59:41 -0700 Subject: (QtWebEngine) Unhide scrollbar on search result --- qutebrowser/browser/shared.py | 4 ++-- qutebrowser/browser/webengine/webenginetab.py | 21 ++++++++++++--------- qutebrowser/config/configdata.yml | 11 ++++++++--- qutebrowser/config/configfiles.py | 1 + 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py index 2398ca2e4..7dfcda4bd 100644 --- a/qutebrowser/browser/shared.py +++ b/qutebrowser/browser/shared.py @@ -274,7 +274,7 @@ def get_tab(win_id, target): return tabbed_browser.tabopen(url=None, background=bg_tab) -def get_user_stylesheet(): +def get_user_stylesheet(searching=False): """Get the combined user-stylesheet.""" css = '' stylesheets = config.val.content.user_stylesheets @@ -283,7 +283,7 @@ def get_user_stylesheet(): with open(filename, 'r', encoding='utf-8') as f: css += f.read() - if not config.val.scrolling.bar: + if not (config.val.scrolling.bar == 'always' or config.val.scrolling.bar == 'when_searching' and searching): css += '\nhtml > ::-webkit-scrollbar { width: 0px; height: 0px; }' return css diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index cfb809097..d6a89f072 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -163,10 +163,11 @@ class WebEngineSearch(browsertab.AbstractSearch): back yet. """ - def __init__(self, parent=None): + def __init__(self, tab, parent=None): super().__init__(parent) self._flags = QWebEnginePage.FindFlags(0) self._pending_searches = 0 + self._tab = tab def _find(self, text, flags, callback, caller): """Call findText on the widget.""" @@ -194,6 +195,7 @@ class WebEngineSearch(browsertab.AbstractSearch): .strip()) if callback is not None: callback(found) + self._tab.scripts.update_stylesheet(searching=found) self._widget.findText(text, flags, wrapped_callback) def search(self, text, *, ignore_case='never', reverse=False, @@ -216,6 +218,7 @@ class WebEngineSearch(browsertab.AbstractSearch): def clear(self): self.search_displayed = False self._widget.findText('') + self._tab.scripts.update_stylesheet(searching=False) def prev_result(self, *, result_cb=None): # The int() here makes sure we get a copy of the flags. @@ -813,11 +816,11 @@ class _WebEngineScripts(QObject): def _on_config_changed(self, option): if option in ['scrolling.bar', 'content.user_stylesheets']: self._init_stylesheet() - self._update_stylesheet() + self.update_stylesheet() - def _update_stylesheet(self): + def update_stylesheet(self, searching=False): """Update the custom stylesheet in existing tabs.""" - css = shared.get_user_stylesheet() + css = shared.get_user_stylesheet(searching=searching) code = javascript.assemble('stylesheet', 'set_css', css) self._tab.run_js_async(code) @@ -991,13 +994,13 @@ class WebEngineTab(browsertab.AbstractTab): self.caret = WebEngineCaret(mode_manager=mode_manager, tab=self, parent=self) self.zoom = WebEngineZoom(tab=self, parent=self) - self.search = WebEngineSearch(parent=self) + self.search = WebEngineSearch(tab=self, parent=self) self.printing = WebEnginePrinting(tab=self) self.elements = WebEngineElements(tab=self) self.action = WebEngineAction(tab=self) self.audio = WebEngineAudio(parent=self) self._permissions = _WebEnginePermissions(tab=self, parent=self) - self._scripts = _WebEngineScripts(tab=self, parent=self) + self.scripts = _WebEngineScripts(tab=self, parent=self) # We're assigning settings in _set_widget self.settings = webenginesettings.WebEngineSettings(settings=None) self._set_widget(widget) @@ -1006,13 +1009,13 @@ class WebEngineTab(browsertab.AbstractTab): self._child_event_filter = None self._saved_zoom = None self._reload_url = None - self._scripts.init() + self.scripts.init() def _set_widget(self, widget): # pylint: disable=protected-access super()._set_widget(widget) self._permissions._widget = widget - self._scripts._widget = widget + self.scripts._widget = widget def _install_event_filter(self): fp = self._widget.focusProxy() @@ -1405,7 +1408,7 @@ class WebEngineTab(browsertab.AbstractTab): # pylint: disable=protected-access self.audio._connect_signals() self._permissions.connect_signals() - self._scripts.connect_signals() + self.scripts.connect_signals() def event_target(self): return self._widget.render_widget() diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 7d39bded8..1dc008a1b 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1191,9 +1191,14 @@ prompt.radius: ## scrolling scrolling.bar: - type: Bool - default: false - desc: Show a scrollbar. + type: + name: String + valid_values: + - always: Always show the scrollbar. + - never: Never show the scrollbar. + - when_searching: Show the scrollbar when searching for text in the webpage. + default: when_searching + desc: When to show the scrollbar. scrolling.smooth: type: Bool diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index a2c88d311..46d9946da 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -277,6 +277,7 @@ class YamlConfig(QObject): self._mark_changed() self._migrate_bool(settings, 'tabs.favicons.show', 'always', 'never') + self._migrate_bool(settings, 'scrolling.bar', 'when_searching', 'never') self._migrate_bool(settings, 'qt.force_software_rendering', 'software-opengl', 'none') -- cgit v1.2.3-54-g00ecf From e01682f51d247f138d503c1cc37975e77166d20d Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Wed, 26 Sep 2018 21:01:21 -0700 Subject: Add tabs.max_width setting --- qutebrowser/config/configdata.yml | 17 +++++++++++++++++ qutebrowser/mainwindow/tabwidget.py | 3 +++ tests/unit/mainwindow/test_tabwidget.py | 19 ++++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 88f8f7995..289fd7b41 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1602,6 +1602,23 @@ tabs.min_width: This setting does not apply to pinned tabs, unless `tabs.pinned.shrink` is False. +tabs.max_width: + default: -1 + type: + name: Int + minval: -1 + maxval: maxint + desc: >- + Maximum width (in pixels) of tabs (-1 for no maximum). + + This setting only applies when tabs are horizontal. + + This setting does not apply to pinned tabs, unless `tabs.pinned.shrink` is + False. + + This setting may not apply properly if max_width is smaller than the + minimum size of tab contents, or smaller than tabs.min_width. + tabs.width.indicator: renamed: tabs.indicator.width diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index 154c93bfd..a2de308da 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -610,6 +610,9 @@ class TabBar(QTabBar): # Request as much space as possible so we fill the tabbar, let # Qt shrink us down width = self.width() + max_width = config.cache['tabs.max_width'] + if max_width > 0: + width = min(max_width, width) # If we don't have enough space, we return the minimum size width = max(width, minimum_size.width()) diff --git a/tests/unit/mainwindow/test_tabwidget.py b/tests/unit/mainwindow/test_tabwidget.py index d16d31e01..d29c61c0f 100644 --- a/tests/unit/mainwindow/test_tabwidget.py +++ b/tests/unit/mainwindow/test_tabwidget.py @@ -38,6 +38,7 @@ class TestTabWidget: qtbot.addWidget(w) monkeypatch.setattr(tabwidget.objects, 'backend', usertypes.Backend.QtWebKit) + monkeypatch.setattr(w.tabBar(), 'width', w.width) return w @pytest.fixture @@ -108,7 +109,7 @@ class TestTabWidget: for i in range(num_tabs): if i in pinned_num and shrink_pinned and not vertical: - assert (first_size.width() < + assert (first_size.width() > widget.tabBar().tabSizeHint(i).width()) assert (first_size_min.width() < widget.tabBar().minimumTabSizeHint(i).width()) @@ -128,6 +129,22 @@ class TestTabWidget: benchmark(widget.update_tab_titles) + def test_tab_min_width(self, widget, fake_web_tab, config_stub): + """Ensure by default, all tab sizes are the same.""" + widget.addTab(fake_web_tab(), 'foobar') + normal_size = widget.tabBar().minimumTabSizeHint(0).width() + normal_size += 100 + config_stub.val.tabs.min_width = normal_size + assert widget.tabBar().minimumTabSizeHint(0).width() == normal_size + + def test_tab_max_width(self, widget, fake_web_tab, config_stub): + """Ensure by default, all tab sizes are the same.""" + widget.addTab(fake_web_tab(), 'foobar') + normal_size = widget.tabBar().tabSizeHint(0).width() + normal_size -= 10 + config_stub.val.tabs.max_width = normal_size + assert widget.tabBar().tabSizeHint(0).width() == normal_size + @pytest.mark.parametrize("num_tabs", [4, 10]) def test_add_remove_tab_benchmark(self, benchmark, browser, qtbot, fake_web_tab, num_tabs): -- cgit v1.2.3-54-g00ecf From 232574212d9a2448ccdf5109ce65e32e9a013609 Mon Sep 17 00:00:00 2001 From: Viacheslav Chimishuk Date: Thu, 27 Sep 2018 23:54:13 +0300 Subject: Add zoom, zoom-in and zoom-out --quiet option support. --- doc/help/commands.asciidoc | 15 ++++++++++++++- qutebrowser/browser/commands.py | 21 +++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 51d3b30a9..eb7338fac 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -1413,7 +1413,7 @@ Yank something to the clipboard or primary selection. [[zoom]] === zoom -Syntax: +:zoom ['zoom']+ +Syntax: +:zoom [*--quiet*] ['zoom']+ Set the zoom level for the current tab. @@ -1422,20 +1422,33 @@ The zoom can be given as argument or as [count]. If neither is given, the zoom i ==== positional arguments * +'zoom'+: The zoom percentage to set. +==== optional arguments +* +*-q*+, +*--quiet*+: Don't show information message with result. + ==== count The zoom percentage to set. [[zoom-in]] === zoom-in +Syntax: +:zoom-in [*--quiet*]+ + Increase the zoom level for the current tab. +==== optional arguments +* +*-q*+, +*--quiet*+: Don't show information message with result. + ==== count How many steps to zoom in. [[zoom-out]] === zoom-out +Syntax: +:zoom-out [*--quiet*]+ + Decrease the zoom level for the current tab. +==== optional arguments +* +*-q*+, +*--quiet*+: Don't show information message with result. + ==== count How many steps to zoom out. diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index a66a8fdea..3d7746e73 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -870,37 +870,44 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - def zoom_in(self, count=1): + @cmdutils.argument('quiet', flag='q') + def zoom_in(self, count=1, quiet=False): """Increase the zoom level for the current tab. Args: count: How many steps to zoom in. + quiet: Don't show information message with result. """ tab = self._current_widget() try: perc = tab.zoom.offset(count) except ValueError as e: raise cmdexc.CommandError(e) - message.info("Zoom level: {}%".format(int(perc)), replace=True) + if not quiet: + message.info("Zoom level: {}%".format(int(perc)), replace=True) @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - def zoom_out(self, count=1): + @cmdutils.argument('quiet', flag='q') + def zoom_out(self, count=1, quiet=False): """Decrease the zoom level for the current tab. Args: count: How many steps to zoom out. + quiet: Don't show information message with result. """ tab = self._current_widget() try: perc = tab.zoom.offset(-count) except ValueError as e: raise cmdexc.CommandError(e) - message.info("Zoom level: {}%".format(int(perc)), replace=True) + if not quiet: + message.info("Zoom level: {}%".format(int(perc)), replace=True) @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - def zoom(self, zoom=None, count=None): + @cmdutils.argument('quiet', flag='q') + def zoom(self, zoom=None, count=None, quiet=False): """Set the zoom level for the current tab. The zoom can be given as argument or as [count]. If neither is @@ -910,6 +917,7 @@ class CommandDispatcher: Args: zoom: The zoom percentage to set. count: The zoom percentage to set. + quiet: Don't show information message with result. """ if zoom is not None: try: @@ -927,7 +935,8 @@ class CommandDispatcher: tab.zoom.set_factor(float(level) / 100) except ValueError: raise cmdexc.CommandError("Can't zoom {}%!".format(level)) - message.info("Zoom level: {}%".format(int(level)), replace=True) + if not quiet: + message.info("Zoom level: {}%".format(int(level)), replace=True) @cmdutils.register(instance='command-dispatcher', scope='window') def tab_only(self, prev=False, next_=False, force=False): -- cgit v1.2.3-54-g00ecf From d64771b8e35f8030369bb455cc811cdd98046d6a Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Thu, 27 Sep 2018 18:57:26 -0700 Subject: Clean up tab min/max width tests --- tests/unit/mainwindow/test_tabwidget.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/unit/mainwindow/test_tabwidget.py b/tests/unit/mainwindow/test_tabwidget.py index d29c61c0f..dba9f8f02 100644 --- a/tests/unit/mainwindow/test_tabwidget.py +++ b/tests/unit/mainwindow/test_tabwidget.py @@ -38,7 +38,8 @@ class TestTabWidget: qtbot.addWidget(w) monkeypatch.setattr(tabwidget.objects, 'backend', usertypes.Backend.QtWebKit) - monkeypatch.setattr(w.tabBar(), 'width', w.width) + w.show() + # monkeypatch.setattr(w.tabBar(), 'width', w.width) return w @pytest.fixture @@ -130,20 +131,16 @@ class TestTabWidget: benchmark(widget.update_tab_titles) def test_tab_min_width(self, widget, fake_web_tab, config_stub): - """Ensure by default, all tab sizes are the same.""" widget.addTab(fake_web_tab(), 'foobar') - normal_size = widget.tabBar().minimumTabSizeHint(0).width() - normal_size += 100 + normal_size = widget.tabBar().tabRect(0).width() + 100 config_stub.val.tabs.min_width = normal_size - assert widget.tabBar().minimumTabSizeHint(0).width() == normal_size + assert widget.tabBar().tabRect(0).width() == normal_size def test_tab_max_width(self, widget, fake_web_tab, config_stub): - """Ensure by default, all tab sizes are the same.""" widget.addTab(fake_web_tab(), 'foobar') - normal_size = widget.tabBar().tabSizeHint(0).width() - normal_size -= 10 + normal_size = widget.tabBar().tabRect(0).width() - 10 config_stub.val.tabs.max_width = normal_size - assert widget.tabBar().tabSizeHint(0).width() == normal_size + assert widget.tabBar().tabRect(0).width() == normal_size @pytest.mark.parametrize("num_tabs", [4, 10]) def test_add_remove_tab_benchmark(self, benchmark, browser, -- cgit v1.2.3-54-g00ecf From de148bb778105317b237d783e9f37311386760c8 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Thu, 27 Sep 2018 19:17:46 -0700 Subject: Fix tabwidget tests --- qutebrowser/mainwindow/tabwidget.py | 9 +++------ tests/unit/mainwindow/test_tabwidget.py | 18 +++++++++--------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index 09655a969..d2b0f744e 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -613,15 +613,12 @@ class TabBar(QTabBar): width = self.minimumTabSizeHint(index, ellipsis=False).width() else: # Request as much space as possible so we fill the tabbar, let - # Qt shrink us down - width = self.width() + # Qt shrink us down. If for some reason (tests, bugs) + # self.width() gives 0, use a sane min of 10 px + width = max(self.width(), 10) max_width = config.cache['tabs.max_width'] if max_width > 0: width = min(max_width, width) - - # If for some reason (tests, bugs) self.width() gives 0, use a - # sane min of 10 px - width = max(width, 10) size = QSize(width, height) qtutils.ensure_valid(size) return size diff --git a/tests/unit/mainwindow/test_tabwidget.py b/tests/unit/mainwindow/test_tabwidget.py index dba9f8f02..3b780a3fc 100644 --- a/tests/unit/mainwindow/test_tabwidget.py +++ b/tests/unit/mainwindow/test_tabwidget.py @@ -39,7 +39,6 @@ class TestTabWidget: monkeypatch.setattr(tabwidget.objects, 'backend', usertypes.Backend.QtWebKit) w.show() - # monkeypatch.setattr(w.tabBar(), 'width', w.width) return w @pytest.fixture @@ -130,17 +129,18 @@ class TestTabWidget: benchmark(widget.update_tab_titles) - def test_tab_min_width(self, widget, fake_web_tab, config_stub): + def test_tab_min_width(self, widget, fake_web_tab, config_stub, qtbot): widget.addTab(fake_web_tab(), 'foobar') - normal_size = widget.tabBar().tabRect(0).width() + 100 - config_stub.val.tabs.min_width = normal_size - assert widget.tabBar().tabRect(0).width() == normal_size + widget.addTab(fake_web_tab(), 'foobar1') + min_size = widget.tabBar().tabRect(0).width() + 10 + config_stub.val.tabs.min_width = min_size + assert widget.tabBar().tabRect(0).width() == min_size - def test_tab_max_width(self, widget, fake_web_tab, config_stub): + def test_tab_max_width(self, widget, fake_web_tab, config_stub, qtbot): widget.addTab(fake_web_tab(), 'foobar') - normal_size = widget.tabBar().tabRect(0).width() - 10 - config_stub.val.tabs.max_width = normal_size - assert widget.tabBar().tabRect(0).width() == normal_size + max_size = widget.tabBar().tabRect(0).width() - 10 + config_stub.val.tabs.max_width = max_size + assert widget.tabBar().tabRect(0).width() == max_size @pytest.mark.parametrize("num_tabs", [4, 10]) def test_add_remove_tab_benchmark(self, benchmark, browser, -- cgit v1.2.3-54-g00ecf From 003e007ace8dbf265e80bbb678f656e58d298ef2 Mon Sep 17 00:00:00 2001 From: Viacheslav Chimishuk Date: Fri, 28 Sep 2018 12:09:47 +0300 Subject: Improve functions' documentation. --- qutebrowser/browser/commands.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 3d7746e73..717d4df3f 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -870,13 +870,13 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - @cmdutils.argument('quiet', flag='q') + @cmdutils.argument('quiet') def zoom_in(self, count=1, quiet=False): """Increase the zoom level for the current tab. Args: count: How many steps to zoom in. - quiet: Don't show information message with result. + quiet: Don't show a zoom level message. """ tab = self._current_widget() try: @@ -888,13 +888,13 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - @cmdutils.argument('quiet', flag='q') + @cmdutils.argument('quiet') def zoom_out(self, count=1, quiet=False): """Decrease the zoom level for the current tab. Args: count: How many steps to zoom out. - quiet: Don't show information message with result. + quiet: Don't show a zoom level message. """ tab = self._current_widget() try: @@ -906,7 +906,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - @cmdutils.argument('quiet', flag='q') + @cmdutils.argument('quiet') def zoom(self, zoom=None, count=None, quiet=False): """Set the zoom level for the current tab. @@ -917,7 +917,7 @@ class CommandDispatcher: Args: zoom: The zoom percentage to set. count: The zoom percentage to set. - quiet: Don't show information message with result. + quiet: Don't show a zoom level message. """ if zoom is not None: try: -- cgit v1.2.3-54-g00ecf From 4bd78e4d0d6829cd77cd4e0222cbff272426776d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 12:23:18 +0200 Subject: Update docs --- doc/changelog.asciidoc | 2 ++ doc/help/commands.asciidoc | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index c8bfe5258..a98716cc2 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -73,6 +73,8 @@ Changed - Editing text in an external editor now simulates a JS "input" event, which improves compatibility with websites reacting via JS to input. - The `qute://settings` page is now properly sorted on Python 3.5. +- `:zoom`, `:zoom-in` and `:zoom-out` now have a `--quiet` switch which causes + them to not display a message. Fixed ~~~~~ diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index c3d737f4c..9632f6331 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -1423,7 +1423,7 @@ The zoom can be given as argument or as [count]. If neither is given, the zoom i * +'zoom'+: The zoom percentage to set. ==== optional arguments -* +*-q*+, +*--quiet*+: Don't show information message with result. +* +*-q*+, +*--quiet*+: Don't show a zoom level message. ==== count The zoom percentage to set. @@ -1435,7 +1435,7 @@ Syntax: +:zoom-in [*--quiet*]+ Increase the zoom level for the current tab. ==== optional arguments -* +*-q*+, +*--quiet*+: Don't show information message with result. +* +*-q*+, +*--quiet*+: Don't show a zoom level message. ==== count How many steps to zoom in. @@ -1447,7 +1447,7 @@ Syntax: +:zoom-out [*--quiet*]+ Decrease the zoom level for the current tab. ==== optional arguments -* +*-q*+, +*--quiet*+: Don't show information message with result. +* +*-q*+, +*--quiet*+: Don't show a zoom level message. ==== count How many steps to zoom out. -- cgit v1.2.3-54-g00ecf From ead82d741ac691afd7f82a43c16eaa44c57cfd67 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 12:23:38 +0200 Subject: Remove unneeded decorators --- qutebrowser/browser/commands.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 96db01fd9..bb5a46e9a 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -870,7 +870,6 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - @cmdutils.argument('quiet') def zoom_in(self, count=1, quiet=False): """Increase the zoom level for the current tab. @@ -888,7 +887,6 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - @cmdutils.argument('quiet') def zoom_out(self, count=1, quiet=False): """Decrease the zoom level for the current tab. @@ -906,7 +904,6 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - @cmdutils.argument('quiet') def zoom(self, zoom=None, count=None, quiet=False): """Set the zoom level for the current tab. -- cgit v1.2.3-54-g00ecf From 4d080d320952b0c66797d9d0fbea10e5e65b737e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 12:35:24 +0200 Subject: Update docs --- doc/changelog.asciidoc | 2 ++ doc/help/settings.asciidoc | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index a98716cc2..c4b24640f 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -43,6 +43,8 @@ Added - Running qutebrowser with QtWebKit or Qt < 5.9 now shows a warning (only once), as support for those is going to be removed in a future release. - New t[iI][hHu] default bindings (similar to `tsh` etc.) to toggle images. +- New `tabs.max_width` setting which allows to have a more "normal" look for + tabs. Changed ~~~~~~~ diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index be3ceae77..eb4b7f79c 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -250,6 +250,7 @@ |<>|Padding (in pixels) for tab indicators. |<>|Width (in pixels) of the progress indicator (0 to disable). |<>|How to behave when the last tab is closed. +|<>|Maximum width (in pixels) of tabs (-1 for no maximum). |<>|Minimum width (in pixels) of tabs (-1 for the default minimum size behavior). |<>|When switching tabs, what input mode is applied. |<>|Switch between tabs using the mouse wheel. @@ -3086,6 +3087,17 @@ Valid values: Default: +pass:[ignore]+ +[[tabs.max_width]] +=== tabs.max_width +Maximum width (in pixels) of tabs (-1 for no maximum). +This setting only applies when tabs are horizontal. +This setting does not apply to pinned tabs, unless `tabs.pinned.shrink` is False. +This setting may not apply properly if max_width is smaller than the minimum size of tab contents, or smaller than tabs.min_width. + +Type: <> + +Default: +pass:[-1]+ + [[tabs.min_width]] === tabs.min_width Minimum width (in pixels) of tabs (-1 for the default minimum size behavior). -- cgit v1.2.3-54-g00ecf From f780974d071f663c639e58d1df25c5cf902d0162 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 13:33:42 +0200 Subject: Allow fallback=False with config.get/get_obj --- qutebrowser/config/config.py | 14 ++-- qutebrowser/config/configtypes.py | 116 ++++++++++++++++++++++++++-------- tests/unit/config/test_config.py | 11 ++++ tests/unit/config/test_configtypes.py | 7 +- 4 files changed, 114 insertions(+), 34 deletions(-) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 98f2c67b3..facfcc553 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -312,10 +312,14 @@ class Config(QObject): name, deleted=deleted, renamed=renamed) raise exception from None - def get(self, name, url=None): - """Get the given setting converted for Python code.""" + def get(self, name, url=None, *, fallback=True): + """Get the given setting converted for Python code. + + Args: + fallback: Use the global value if there's no URL-specific one. + """ opt = self.get_opt(name) - obj = self.get_obj(name, url=url) + obj = self.get_obj(name, url=url, fallback=fallback) return opt.typ.to_py(obj) def _maybe_copy(self, value): @@ -329,14 +333,14 @@ class Config(QObject): assert value.__hash__ is not None, value return value - def get_obj(self, name, *, url=None): + def get_obj(self, name, *, url=None, fallback=True): """Get the given setting as object (for YAML/config.py). Note that the returned values are not watched for mutation. If a URL is given, return the value which should be used for that URL. """ self.get_opt(name) # To make sure it exists - value = self._values[name].get_for_url(url) + value = self._values[name].get_for_url(url, fallback=fallback) return self._maybe_copy(value) def get_obj_for_pattern(self, name, *, pattern): diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 1c3bff8fb..f2bd12a74 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -60,7 +60,7 @@ from PyQt5.QtGui import QColor, QFont from PyQt5.QtWidgets import QTabWidget, QTabBar from qutebrowser.commands import cmdutils -from qutebrowser.config import configexc +from qutebrowser.config import configexc, configutils from qutebrowser.utils import standarddir, utils, qtutils, urlutils, urlmatch from qutebrowser.keyinput import keyutils @@ -149,6 +149,9 @@ class BaseType: value: The value to check. pytype: A Python type to check the value against. """ + if value is configutils.UNSET: + return + if (value is None or (pytype == list and value == []) or (pytype == dict and value == {})): if not self.none_ok: @@ -309,7 +312,9 @@ class MappingType(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None self._validate_valid_values(value.lower()) return self.MAPPING[value.lower()] @@ -367,7 +372,9 @@ class String(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None self._validate_encoding(value) @@ -399,7 +406,9 @@ class UniqueCharString(String): def to_py(self, value): value = super().to_py(value) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None # Check for duplicate values @@ -455,7 +464,9 @@ class List(BaseType): def to_py(self, value): self._basic_py_validation(value, list) - if not value: + if value is configutils.UNSET: + return value + elif not value: return [] for val in value: @@ -534,6 +545,9 @@ class ListOrValue(BaseType): return value def to_py(self, value): + if value is configutils.UNSET: + return value + try: return [self.valtype.to_py(value)] except configexc.ValidationError: @@ -577,7 +591,8 @@ class FlagList(List): def to_py(self, value): vals = super().to_py(value) - self._check_duplicates(vals) + if vals is not configutils.UNSET: + self._check_duplicates(vals) return vals def complete(self): @@ -764,7 +779,9 @@ class Perc(_Numeric): def to_py(self, value): self._basic_py_validation(value, (float, int, str)) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None if isinstance(value, str): @@ -907,7 +924,9 @@ class QtColor(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None color = QColor(value) @@ -936,7 +955,9 @@ class QssColor(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None functions = ['rgb', 'rgba', 'hsv', 'hsva', 'qlineargradient', @@ -981,7 +1002,9 @@ class Font(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None if not self.font_regex.fullmatch(value): # pragma: no cover @@ -1000,7 +1023,9 @@ class FontFamily(Font): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None match = self.font_regex.fullmatch(value) @@ -1024,7 +1049,9 @@ class QtFont(Font): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None style_map = { @@ -1136,7 +1163,9 @@ class Regex(BaseType): def to_py(self, value): """Get a compiled regex from either a string or a regex object.""" self._basic_py_validation(value, (str, self._regex_type)) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None elif isinstance(value, str): return self._compile_regex(value) @@ -1214,7 +1243,9 @@ class Dict(BaseType): def to_py(self, value): self._basic_py_validation(value, dict) - if not value: + if value is configutils.UNSET: + return value + elif not value: return self._fill_fixed_keys({}) self._validate_keys(value) @@ -1256,7 +1287,9 @@ class File(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None value = os.path.expanduser(value) @@ -1282,7 +1315,9 @@ class Directory(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None value = os.path.expandvars(value) value = os.path.expanduser(value) @@ -1309,7 +1344,9 @@ class FormatString(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: @@ -1341,7 +1378,9 @@ class ShellCommand(List): def to_py(self, value): value = super().to_py(value) - if not value: + if value is configutils.UNSET: + return value + elif not value: return value if (self.placeholder and @@ -1365,7 +1404,9 @@ class Proxy(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: @@ -1401,7 +1442,9 @@ class SearchEngineUrl(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None if not ('{}' in value or '{0}' in value): @@ -1429,7 +1472,9 @@ class FuzzyUrl(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: @@ -1463,6 +1508,9 @@ class Padding(Dict): def to_py(self, value): d = super().to_py(value) + if d is configutils.UNSET: + return d + return PaddingValues(**d) @@ -1472,7 +1520,9 @@ class Encoding(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: codecs.lookup(value) @@ -1529,7 +1579,9 @@ class Url(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None qurl = QUrl.fromUserInput(value) @@ -1545,7 +1597,9 @@ class SessionName(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None if value.startswith('_'): raise configexc.ValidationError(value, "may not start with '_'!") @@ -1593,7 +1647,7 @@ class ConfirmQuit(FlagList): def to_py(self, value): values = super().to_py(value) - if not values: + if not values or values is configutils.UNSET: return values # Never can't be set with other options @@ -1630,7 +1684,9 @@ class TimestampTemplate(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: @@ -1654,7 +1710,9 @@ class Key(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: @@ -1673,7 +1731,9 @@ class UrlPattern(BaseType): def to_py(self, value): self._basic_py_validation(value, str) - if not value: + if value is configutils.UNSET: + return value + elif not value: return None try: diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index bf4f7c02d..6cef14130 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -480,6 +480,17 @@ class TestConfig: conf.set_obj(name, False, pattern=pattern) assert conf.get(name, url=QUrl('https://example.com/')) is False + @pytest.mark.parametrize('fallback, expected', [ + (True, True), + (False, configutils.UNSET) + ]) + def test_get_for_url_fallback(self, conf, fallback, expected): + """Test conf.get() with an URL and fallback.""" + value = conf.get('content.javascript.enabled', + url=QUrl('https://example.com/'), + fallback=fallback) + assert value is expected + @pytest.mark.parametrize('value', [{}, {'normal': {'a': 'nop'}}]) def test_get_bindings(self, config_stub, conf, value): """Test conf.get() with bindings which have missing keys.""" diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index 46119be7e..ee5223a38 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -34,7 +34,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtGui import QColor, QFont from PyQt5.QtNetwork import QNetworkProxy -from qutebrowser.config import configtypes, configexc +from qutebrowser.config import configtypes, configexc, configutils from qutebrowser.utils import debug, utils, qtutils, urlmatch from qutebrowser.browser.network import pac from qutebrowser.keyinput import keyutils @@ -274,6 +274,11 @@ class TestAll: with pytest.raises(configexc.ValidationError): meth(value) + @pytest.mark.parametrize('none_ok', [True, False]) + def test_unset(self, klass, none_ok): + typ = klass(none_ok=none_ok) + assert typ.to_py(configutils.UNSET) is configutils.UNSET + def test_to_str_none(self, klass): assert klass().to_str(None) == '' -- cgit v1.2.3-54-g00ecf From 6be4ee2ff3cdd0a1bfc20634d8c3b592565cf1d7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 13:53:08 +0200 Subject: configtypes: Be more explicit about None-values --- qutebrowser/config/configtypes.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index f2bd12a74..f4857fc36 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -1381,7 +1381,7 @@ class ShellCommand(List): if value is configutils.UNSET: return value elif not value: - return value + return [] if (self.placeholder and '{}' not in ' '.join(value) and @@ -1647,8 +1647,10 @@ class ConfirmQuit(FlagList): def to_py(self, value): values = super().to_py(value) - if not values or values is configutils.UNSET: + if values is configutils.UNSET: return values + elif not values: + return [] # Never can't be set with other options if 'never' in values and len(values) > 1: -- cgit v1.2.3-54-g00ecf From 18ed790c881185c65cae0c8974368222e5253041 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 16:37:58 +0200 Subject: Don't touch mute status after the user changed it --- qutebrowser/browser/browsertab.py | 14 ++++++++++---- qutebrowser/browser/commands.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 16 ++++++++++++++-- qutebrowser/browser/webkit/webkittab.py | 2 +- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 72c289eca..29970a65d 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -673,16 +673,22 @@ class AbstractAudio(QObject): self._widget = None self._tab = tab - def set_muted(self, muted: bool): - """Set this tab as muted or not.""" + def set_muted(self, muted: bool, override: bool = False): + """Set this tab as muted or not. + + Arguments: + override: If set to True, muting/unmuting was done manually and + overrides future automatic mute/unmute changes based on + the URL. + """ raise NotImplementedError def is_muted(self): """Whether this tab is muted.""" raise NotImplementedError - def toggle_muted(self): - self.set_muted(not self.is_muted()) + def toggle_muted(self, *, override: bool = False): + self.set_muted(not self.is_muted(), override=override) def is_recently_audible(self): """Whether this tab has had audio playing recently.""" diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index bb5a46e9a..d4e896cf7 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -2237,6 +2237,6 @@ class CommandDispatcher: if tab is None: return try: - tab.audio.toggle_muted() + tab.audio.toggle_muted(override=True) except browsertab.WebTabError as e: raise cmdexc.CommandError(e) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index e4bac57b5..b0dba34fa 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -637,7 +637,16 @@ class WebEngineElements(browsertab.AbstractElements): class WebEngineAudio(browsertab.AbstractAudio): - """QtWebEngine implemementations related to audio/muting.""" + """QtWebEngine implemementations related to audio/muting. + + Attributes: + _overridden: Whether the user toggled muting manually. + If that's the case, we leave it alone. + """ + + def __init__(self, tab, parent=None): + super().__init__(tab, parent) + self._overridden = False def _connect_signals(self): page = self._widget.page() @@ -645,7 +654,8 @@ class WebEngineAudio(browsertab.AbstractAudio): page.recentlyAudibleChanged.connect(self.recently_audible_changed) self._tab.url_changed.connect(self._on_url_changed) - def set_muted(self, muted: bool): + def set_muted(self, muted: bool, override: bool = False): + self._overridden = override page = self._widget.page() page.setAudioMuted(muted) @@ -659,6 +669,8 @@ class WebEngineAudio(browsertab.AbstractAudio): @pyqtSlot(QUrl) def _on_url_changed(self, url): + if self._overridden: + return mute = config.instance.get('content.mute', url=url) self.set_muted(mute) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index a2c7ee2a2..1c37649cd 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -637,7 +637,7 @@ class WebKitAudio(browsertab.AbstractAudio): """Dummy handling of audio status for QtWebKit.""" - def set_muted(self, muted: bool): + def set_muted(self, muted: bool, override: bool = False): raise browsertab.WebTabError('Muting is not supported on QtWebKit!') def is_muted(self): -- cgit v1.2.3-54-g00ecf From 29691f302d2cc515cb85e279c87258f270b0d127 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 16:38:10 +0200 Subject: Update mute status if content.mute was changed --- qutebrowser/browser/webengine/webenginetab.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index b0dba34fa..40a7de9c3 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -653,6 +653,7 @@ class WebEngineAudio(browsertab.AbstractAudio): page.audioMutedChanged.connect(self.muted_changed) page.recentlyAudibleChanged.connect(self.recently_audible_changed) self._tab.url_changed.connect(self._on_url_changed) + config.instance.changed.connect(self._on_config_changed) def set_muted(self, muted: bool, override: bool = False): self._overridden = override @@ -674,6 +675,10 @@ class WebEngineAudio(browsertab.AbstractAudio): mute = config.instance.get('content.mute', url=url) self.set_muted(mute) + @config.change_filter('content.mute') + def _on_config_changed(self): + self._on_url_changed(self._tab.url()) + class _WebEnginePermissions(QObject): -- cgit v1.2.3-54-g00ecf From 282fbaf447849ea0e8d2bdbf3c4375689e1dcbb6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 16:41:48 +0200 Subject: Update docs --- doc/changelog.asciidoc | 2 ++ doc/help/settings.asciidoc | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index c4b24640f..0b681a546 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -45,6 +45,8 @@ Added - New t[iI][hHu] default bindings (similar to `tsh` etc.) to toggle images. - New `tabs.max_width` setting which allows to have a more "normal" look for tabs. +- New `content.mute` setting which allows to mute pages (or all tabs) by + default. Changed ~~~~~~~ diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index eb4b7f79c..7c49e5364 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -145,6 +145,7 @@ |<>|Enable support for HTML 5 local storage and Web SQL. |<>|Allow websites to record audio/video. |<>|Allow websites to lock your mouse pointer. +|<>|Automatically mute tabs. |<>|Netrc-file for HTTP authentication. |<>|Allow websites to show notifications. |<>|Allow pdf.js to view PDF files in the browser. @@ -1916,6 +1917,16 @@ On QtWebEngine, this setting requires Qt 5.8 or newer. On QtWebKit, this setting is unavailable. +[[content.mute]] +=== content.mute +Automatically mute tabs. + +This setting supports URL patterns. + +Type: <> + +Default: +pass:[false]+ + [[content.netrc_file]] === content.netrc_file Netrc-file for HTTP authentication. -- cgit v1.2.3-54-g00ecf From 2b1ebe2762071e1e8421f8f9fa2f1072d145f64d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 17:36:15 +0200 Subject: Improve content.mute docs --- doc/help/settings.asciidoc | 1 + qutebrowser/config/configdata.yml | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 7c49e5364..721a6685b 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -1920,6 +1920,7 @@ On QtWebKit, this setting is unavailable. [[content.mute]] === content.mute Automatically mute tabs. +Note that if the :tab-mute command is used, the mute status for the affected tab is now controlled manually, and this setting doesn't have any effect. This setting supports URL patterns. diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 8f06814ca..5bd198a75 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -810,7 +810,12 @@ content.mute: default: false type: Bool supports_pattern: true - desc: Automatically mute tabs. + desc: >- + Automatically mute tabs. + + Note that if the `:tab-mute` command is used, the mute status for the + affected tab is now controlled manually, and this setting doesn't have any + effect. # emacs: ' -- cgit v1.2.3-54-g00ecf From 19589c93b5da244b98e3af57c633d02291c98a3a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 18:13:46 +0200 Subject: Only update stylesheet if we actually had a search We call search.clear() a lot, even before the stylesheet JS was initialized. After we've done a search, we can be sure that it is inited, and we only need to hide the scrollbar there. --- qutebrowser/browser/webengine/webenginetab.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index ebb206ddb..4455d3f34 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -215,9 +215,10 @@ class WebEngineSearch(browsertab.AbstractSearch): self._find(text, self._flags, result_cb, 'search') def clear(self): + if self.search_displayed: + self._tab.scripts.update_stylesheet(searching=False) self.search_displayed = False self._widget.findText('') - self._tab.scripts.update_stylesheet(searching=False) def prev_result(self, *, result_cb=None): # The int() here makes sure we get a copy of the flags. -- cgit v1.2.3-54-g00ecf From 628e4e8692449ad61358f6f642073fc614ca47d5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 18:16:13 +0200 Subject: Fix lint --- qutebrowser/browser/shared.py | 3 ++- qutebrowser/config/configfiles.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py index 7dfcda4bd..64fc9c508 100644 --- a/qutebrowser/browser/shared.py +++ b/qutebrowser/browser/shared.py @@ -283,7 +283,8 @@ def get_user_stylesheet(searching=False): with open(filename, 'r', encoding='utf-8') as f: css += f.read() - if not (config.val.scrolling.bar == 'always' or config.val.scrolling.bar == 'when_searching' and searching): + if (config.val.scrolling.bar == 'never' or + config.val.scrolling.bar == 'when_searching' and not searching): css += '\nhtml > ::-webkit-scrollbar { width: 0px; height: 0px; }' return css diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index f49a40265..4d5cb47f8 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -292,7 +292,8 @@ class YamlConfig(QObject): self._mark_changed() self._migrate_bool(settings, 'tabs.favicons.show', 'always', 'never') - self._migrate_bool(settings, 'scrolling.bar', 'when_searching', 'never') + self._migrate_bool(settings, 'scrolling.bar', + 'when_searching', 'never') self._migrate_bool(settings, 'qt.force_software_rendering', 'software-opengl', 'none') -- cgit v1.2.3-54-g00ecf From 6d0d40878589a2c9f5bb90848cfd00ef9dd4035f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 18:16:42 +0200 Subject: Use when-searching, not when_searching --- qutebrowser/browser/shared.py | 2 +- qutebrowser/config/configdata.yml | 4 ++-- qutebrowser/config/configfiles.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py index 64fc9c508..eb222cbe8 100644 --- a/qutebrowser/browser/shared.py +++ b/qutebrowser/browser/shared.py @@ -284,7 +284,7 @@ def get_user_stylesheet(searching=False): css += f.read() if (config.val.scrolling.bar == 'never' or - config.val.scrolling.bar == 'when_searching' and not searching): + config.val.scrolling.bar == 'when-searching' and not searching): css += '\nhtml > ::-webkit-scrollbar { width: 0px; height: 0px; }' return css diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 1b7e26cc3..44c9f2e3d 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1287,8 +1287,8 @@ scrolling.bar: valid_values: - always: Always show the scrollbar. - never: Never show the scrollbar. - - when_searching: Show the scrollbar when searching for text in the webpage. - default: when_searching + - when-searching: Show the scrollbar when searching for text in the webpage. + default: when-searching desc: When to show the scrollbar. scrolling.smooth: diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index 4d5cb47f8..b4c8ea4ec 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -293,7 +293,7 @@ class YamlConfig(QObject): self._migrate_bool(settings, 'tabs.favicons.show', 'always', 'never') self._migrate_bool(settings, 'scrolling.bar', - 'when_searching', 'never') + 'when-searching', 'never') self._migrate_bool(settings, 'qt.force_software_rendering', 'software-opengl', 'none') -- cgit v1.2.3-54-g00ecf From 54c39484d3c981783055ebd69b66835cd1ee2430 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 19:27:03 +0200 Subject: Use signals instead of making scripts public --- qutebrowser/browser/browsertab.py | 8 ++++++++ qutebrowser/browser/webengine/webenginetab.py | 24 ++++++++++++++++-------- qutebrowser/browser/webkit/webkittab.py | 4 ++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 29970a65d..dac8eb9a3 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -248,8 +248,16 @@ class AbstractSearch(QObject): this view. _flags: The flags of the last search (needs to be set by subclasses). _widget: The underlying WebView widget. + + Signals: + finished: Emitted when a search was finished. + arg: True if the text was found, False otherwise. + cleared: Emitted when an existing search was cleared. """ + finished = pyqtSignal(bool) + cleared = pyqtSignal() + def __init__(self, parent=None): super().__init__(parent) self._widget = None diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 4455d3f34..f5933e579 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -192,9 +192,11 @@ class WebEngineSearch(browsertab.AbstractSearch): flag_text = '' log.webview.debug(' '.join([caller, found_text, text, flag_text]) .strip()) + if callback is not None: callback(found) - self._tab.scripts.update_stylesheet(searching=found) + self.finished.emit(found) + self._widget.findText(text, flags, wrapped_callback) def search(self, text, *, ignore_case='never', reverse=False, @@ -216,7 +218,7 @@ class WebEngineSearch(browsertab.AbstractSearch): def clear(self): if self.search_displayed: - self._tab.scripts.update_stylesheet(searching=False) + self.cleared.emit() self.search_displayed = False self._widget.findText('') @@ -839,15 +841,21 @@ class _WebEngineScripts(QObject): self._greasemonkey = objreg.get('greasemonkey') def connect_signals(self): + """Connect signals to our private slots.""" config.instance.changed.connect(self._on_config_changed) + self._tab.search.cleared.connect(functools.partial( + self._update_stylesheet, searching=False)) + self._tab.search.finished.connect(self._update_stylesheet) + @pyqtSlot(str) def _on_config_changed(self, option): if option in ['scrolling.bar', 'content.user_stylesheets']: self._init_stylesheet() - self.update_stylesheet() + self._update_stylesheet() - def update_stylesheet(self, searching=False): + @pyqtSlot(bool) + def _update_stylesheet(self, searching=False): """Update the custom stylesheet in existing tabs.""" css = shared.get_user_stylesheet(searching=searching) code = javascript.assemble('stylesheet', 'set_css', css) @@ -1029,7 +1037,7 @@ class WebEngineTab(browsertab.AbstractTab): self.action = WebEngineAction(tab=self) self.audio = WebEngineAudio(tab=self, parent=self) self._permissions = _WebEnginePermissions(tab=self, parent=self) - self.scripts = _WebEngineScripts(tab=self, parent=self) + self._scripts = _WebEngineScripts(tab=self, parent=self) # We're assigning settings in _set_widget self.settings = webenginesettings.WebEngineSettings(settings=None) self._set_widget(widget) @@ -1038,13 +1046,13 @@ class WebEngineTab(browsertab.AbstractTab): self._child_event_filter = None self._saved_zoom = None self._reload_url = None - self.scripts.init() + self._scripts.init() def _set_widget(self, widget): # pylint: disable=protected-access super()._set_widget(widget) self._permissions._widget = widget - self.scripts._widget = widget + self._scripts._widget = widget def _install_event_filter(self): fp = self._widget.focusProxy() @@ -1437,7 +1445,7 @@ class WebEngineTab(browsertab.AbstractTab): # pylint: disable=protected-access self.audio._connect_signals() self._permissions.connect_signals() - self.scripts.connect_signals() + self._scripts.connect_signals() def event_target(self): return self._widget.render_widget() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 1c37649cd..1d7c842b4 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -115,7 +115,11 @@ class WebKitSearch(browsertab.AbstractSearch): if callback is not None: QTimer.singleShot(0, functools.partial(callback, found)) + self.finished.emit(found) + def clear(self): + if self.search_displayed: + self.cleared.emit() self.search_displayed = False # We first clear the marked text, then the highlights self._widget.findText('') -- cgit v1.2.3-54-g00ecf From 2f121d77dfd08eeaaafa8c3f07c20c4f39094f8f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 19:35:11 +0200 Subject: Update docs --- doc/changelog.asciidoc | 3 +++ doc/help/settings.asciidoc | 16 +++++++++++----- qutebrowser/config/configdata.yml | 3 ++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 0b681a546..28992a1ea 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -79,6 +79,9 @@ Changed - The `qute://settings` page is now properly sorted on Python 3.5. - `:zoom`, `:zoom-in` and `:zoom-out` now have a `--quiet` switch which causes them to not display a message. +- The `scrolling.bar` setting now takes three values instead of being a + boolean: `always`, `never`, and `when-searching` (which only displays it + while a search is active). Fixed ~~~~~ diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 721a6685b..962e9ebae 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -232,7 +232,7 @@ |<>|Turn on Qt HighDPI scaling. |<>|When to use Chromium's low-end device mode. |<>|Which Chromium process model to use. -|<>|Show a scrollbar. +|<>|When to show the scrollbar. |<>|Enable smooth scrolling for web pages. |<>|When to find text on a page case-insensitively. |<>|Find text on a page incrementally, renewing the search for each typed character. @@ -1920,7 +1920,7 @@ On QtWebKit, this setting is unavailable. [[content.mute]] === content.mute Automatically mute tabs. -Note that if the :tab-mute command is used, the mute status for the affected tab is now controlled manually, and this setting doesn't have any effect. +Note that if the `:tab-mute` command is used, the mute status for the affected tab is now controlled manually, and this setting doesn't have any effect. This setting supports URL patterns. @@ -2828,11 +2828,17 @@ This setting is only available with the QtWebEngine backend. [[scrolling.bar]] === scrolling.bar -Show a scrollbar. +When to show the scrollbar. -Type: <> +Type: <> -Default: +pass:[false]+ +Valid values: + + * +always+: Always show the scrollbar. + * +never+: Never show the scrollbar. + * +when-searching+: Show the scrollbar when searching for text in the webpage. With the QtWebKit backend, this is equal to `never`. + +Default: +pass:[when-searching]+ [[scrolling.smooth]] === scrolling.smooth diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 44c9f2e3d..ae9351899 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1287,7 +1287,8 @@ scrolling.bar: valid_values: - always: Always show the scrollbar. - never: Never show the scrollbar. - - when-searching: Show the scrollbar when searching for text in the webpage. + - when-searching: Show the scrollbar when searching for text in the + webpage. With the QtWebKit backend, this is equal to `never`. default: when-searching desc: When to show the scrollbar. -- cgit v1.2.3-54-g00ecf From 2630f779cdbeadaf0438718dd27bcd975deccd7f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 28 Sep 2018 19:48:24 +0200 Subject: Make tab attributes more consistent --- qutebrowser/browser/browsertab.py | 3 ++- qutebrowser/browser/webengine/webenginetab.py | 7 +++---- qutebrowser/browser/webkit/webkittab.py | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index dac8eb9a3..eb67cf091 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -258,8 +258,9 @@ class AbstractSearch(QObject): finished = pyqtSignal(bool) cleared = pyqtSignal() - def __init__(self, parent=None): + def __init__(self, tab, parent=None): super().__init__(parent) + self._tab = tab self._widget = None self.text = None self.search_displayed = False diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index f5933e579..3b72719e7 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -163,10 +163,9 @@ class WebEngineSearch(browsertab.AbstractSearch): """ def __init__(self, tab, parent=None): - super().__init__(parent) + super().__init__(tab, parent) self._flags = QWebEnginePage.FindFlags(0) self._pending_searches = 0 - self._tab = tab def _find(self, text, flags, callback, caller): """Call findText on the widget.""" @@ -1026,8 +1025,8 @@ class WebEngineTab(browsertab.AbstractTab): private=private, parent=parent) widget = webview.WebEngineView(tabdata=self.data, win_id=win_id, private=private) - self.history = WebEngineHistory(self) - self.scroller = WebEngineScroller(self, parent=self) + self.history = WebEngineHistory(tab=self) + self.scroller = WebEngineScroller(tab=self, parent=self) self.caret = WebEngineCaret(mode_manager=mode_manager, tab=self, parent=self) self.zoom = WebEngineZoom(tab=self, parent=self) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 1d7c842b4..2edea1777 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -84,8 +84,8 @@ class WebKitSearch(browsertab.AbstractSearch): """QtWebKit implementations related to searching on the page.""" - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, tab, parent=None): + super().__init__(tab, parent) self._flags = QWebPage.FindFlags(0) def _call_cb(self, callback, found, text, flags, caller): @@ -662,12 +662,12 @@ class WebKitTab(browsertab.AbstractTab): private=private, tab=self) if private: self._make_private(widget) - self.history = WebKitHistory(self) - self.scroller = WebKitScroller(self, parent=self) + self.history = WebKitHistory(tab=self) + self.scroller = WebKitScroller(tab=self, parent=self) self.caret = WebKitCaret(mode_manager=mode_manager, tab=self, parent=self) self.zoom = WebKitZoom(tab=self, parent=self) - self.search = WebKitSearch(parent=self) + self.search = WebKitSearch(tab=self, parent=self) self.printing = WebKitPrinting(tab=self) self.elements = WebKitElements(tab=self) self.action = WebKitAction(tab=self) -- cgit v1.2.3-54-g00ecf