From 55e5279aa5c3577fc0dc8b39d56c73be8f14974d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 30 Dec 2020 22:04:49 +0100 Subject: Show renderer process PID in :buffer completion --- doc/changelog.asciidoc | 2 ++ qutebrowser/browser/browsertab.py | 8 ++++++++ qutebrowser/browser/webengine/webenginetab.py | 10 +++++++++- qutebrowser/browser/webkit/webkittab.py | 3 +++ qutebrowser/completion/models/miscmodels.py | 16 +++++++++++----- tests/helpers/stubs.py | 3 +++ 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 5001db304..24005bae3 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -126,6 +126,8 @@ Changed `content.headers.custom`, the custom value is now ignored for XHR (`XMLHttpRequest`) requests. Instead, the sent value is now `*/*` or the header set from JavaScript, as it would be if `content.headers.custom` wasn't set. +- The `:buffer` completion now shows the underlying renderer process PID if + doing so is supported (QtWebEngine 5.15). Fixed ~~~~~ diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index bf25455a6..42ad89e7c 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -1172,6 +1172,14 @@ class AbstractTab(QWidget): self.data.pinned = pinned self.pinned_changed.emit(pinned) + def renderer_process_pid(self) -> Optional[int]: + """Get the PID of the underlying renderer process. + + Returns None if the PID can't be determined or if getting the PID isn't + supported. + """ + raise NotImplementedError + def __repr__(self) -> str: try: qurl = self.url() diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 8e5ea3a52..955be8c22 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -23,7 +23,7 @@ import math import functools import re import html as html_utils -from typing import cast, Union +from typing import cast, Union, Optional from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QPointF, QUrl, QObject from PyQt5.QtNetwork import QAuthenticator @@ -1313,6 +1313,14 @@ class WebEngineTab(browsertab.AbstractTab): def title(self): return self._widget.title() + def renderer_process_pid(self) -> Optional[int]: + page = self._widget.page() + try: + return page.renderProcessPid() + except AttributeError: + # Added in Qt 5.15 + return None + def icon(self): return self._widget.icon() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index c5f78cfe9..a64136707 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -888,6 +888,9 @@ class WebKitTab(browsertab.AbstractTab): def title(self): return self._widget.title() + def renderer_process_pid(self) -> Optional[int]: + return None + @pyqtSlot() def _on_history_trigger(self): url = self.url() diff --git a/qutebrowser/completion/models/miscmodels.py b/qutebrowser/completion/models/miscmodels.py index d9d386365..b6eb54d5a 100644 --- a/qutebrowser/completion/models/miscmodels.py +++ b/qutebrowser/completion/models/miscmodels.py @@ -117,7 +117,7 @@ def _buffer(*, win_id_filter=lambda _win_id: True, add_win_id=True): window=int(win_id)) tabbed_browser.on_tab_close_requested(int(tab_index) - 1) - model = completionmodel.CompletionModel(column_widths=(6, 40, 54)) + model = completionmodel.CompletionModel(column_widths=(6, 40, 46, 8)) tabs_are_windows = config.val.tabs.tabs_are_windows # list storing all single-tabbed windows when tabs_are_windows @@ -131,14 +131,20 @@ def _buffer(*, win_id_filter=lambda _win_id: True, add_win_id=True): window=win_id) if tabbed_browser.is_shutting_down: continue - tabs: List[Tuple[str, str, str]] = [] + tabs: List[Tuple[str, str, str, str]] = [] for idx in range(tabbed_browser.widget.count()): tab = tabbed_browser.widget.widget(idx) tab_str = ("{}/{}".format(win_id, idx + 1) if add_win_id else str(idx + 1)) - tabs.append((tab_str, - tab.url().toDisplayString(), - tabbed_browser.widget.page_title(idx))) + + pid = tab.renderer_process_pid() + + tabs.append(( + tab_str, + tab.url().toDisplayString(), + tabbed_browser.widget.page_title(idx), + "" if pid is None else f"PID {pid}", + )) if tabs_are_windows: windows += tabs diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 725df8fe8..47fb78f85 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -286,6 +286,9 @@ class FakeWebTab(browsertab.AbstractTab): def icon(self): return QIcon() + def renderer_process_pid(self): + return None + class FakeSignal: -- cgit v1.2.3-54-g00ecf