QuteBrowser CommandDispatcher 命令分发器实现原理
介绍
CommandDispatcher 是 TabbedBrowser 的命令分发器。包含了当前 Tab 下可用的所有命令。
Usage
首先看 QuteBrowser 是如何使用这个类的,在 mainwindow 中,专门对其进行了初始化:
def _init_command_dispatcher(self):
# Lazy import to avoid circular imports
from qutebrowser.browser import commands
self._command_dispatcher = commands.CommandDispatcher(
self.win_id, self.tabbed_browser)
objreg.register('command-dispatcher',
self._command_dispatcher,
command_only=True,
scope='window', window=self.win_id)
widget = self.tabbed_browser.widget
widget.destroyed.connect(
functools.partial(objreg.delete, 'command-dispatcher',
scope='window', window=self.win_id))
其中:
- 包括了 CommandDispatcher 的构造方法,传入 window id 和 TabbedBrowser 组件
- TabbedBrowser 是在 Tab 管理下的网页,是 QuteBrowser 的最核心 UI 组件
- objreg 是全局的对象注册表,注册了一个名为 'command-dispatcher' 的对象实例
命令与 CommandDispatcher 的关系
在 qutebrowser\browser\commands.py 中包含大量命令,他们的装饰器中会引用 'command-dispatcher',举例:
@cmdutils.register(instance='command-dispatcher', scope='window')
def set_mark(self, key):
"""Set a mark at the current scroll position in the current tab.
Args:
key: mark identifier; capital indicates a global mark
"""
self._tabbed_browser.set_mark(key)
翻阅 cmdutils.register 的注释,找到 instance 的含义:从对象注册表中获取到实例,用作 self 参数。从而得知,set_mark 中的 self,其实就是 CommandDispatcher,原来这是一种依赖注入方法,非常巧妙。
scope 的含义
命令装饰器中,scope 的含义是什么呢?
这是 objreg 注册表的功能,它有一级 scope 维度划分。
CommandDispatcher 类
该类内包含一些私有方法,同时也包含一些公有命令,这里重点看公开的 API。
命令
命令 | 说明 |
---|---|
tab_close | 关闭 Tab |
tab_pin | 固定 Tab |
openurl | 打开 Url |
tab_clone | 克隆 Tab |
tab_take | 从另一个窗口把一个 Tab 拿到当前窗口 |
tab_give | 把当前 Tab 给到别的窗口 |
back | 后退 |
forward | 前进 |
navigate | 自动跳转上一页、下一页 |
scroll_page | 页面滚动 |
yank | 复制 |
tab_only | 关闭其它 Tab |
undo | 撤销,重新打开关闭的 Tab 或窗口 |
tab_prev | 前一个 Tab |
tab_next | 后一个 Tab |
tab_select | 切第 N 个 Tab |
tab_focus | 切 Tab |
tab_move | 移动 Tab |
spawn | 执行外部命令 |
quickmark_save | 保存 Quickmark |
quickmark_load | 加载 Quickmark |
quickmark_del | 删除 Quickmark |
bookmark_add | 添加书签 |
bookmark_load | 加载书签 |
bookmark_del | 删除书签 |
bookmark_list | 书签列表 |
download | 下载 |
view_source | 查看源码 |
history | 浏览历史 |
show_help | 显示帮助 |
messages | 显示日志 |
edit_text | 打开外部编辑器编辑文本 |
search | 搜索文本 |
search_next | 跳转下一个 |
search_prev | 跳转上一个 |
jseval | 执行 JavaScript 脚本 |
fake_key | 模拟输入 |
edit_url | 编辑 Url |
set_mark | 记录滚动位置 |
jump_mark | 跳转滚动位置 |
fullscreen | 全屏模式 |