分类
联系方式
  1. 新浪微博
  2. E-mail

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 全屏模式