Firefox Webextension工具栏按钮可切换侧边栏



由于Firefox Australis接口,没有更多的工具栏按钮可以单击一键切换书签和历史小范。有"显示侧栏"工具栏按钮,但它显示一个动画弹出窗口,需要2个点击。

因此,我正在尝试创建一个webextension来实现这些按钮。

  • 给定的webextension只能添加一个工具栏按钮,因此我必须创建两个单独的扩展名。这开始好...但是,我会处理的。
  • sidebar_action不添加工具栏按钮,因此它排除了此方法。
  • 这使我与browser_action

我尝试了很多事情,没有成功:

  • 在背景中调用SidebarUI.toggle("viewBookmarksSidebar");
  • chrome://browser/content/bookmarks/bookmarksPanel.xul URL,但我缺少将其加载到的侧边栏。
  • 我尝试结合sidebar_actionbrowser_action,但这是不可能的。

browserAction按钮打开自己的侧边栏

您可以拥有一个browserAction工具栏按钮,该按钮打开您自己的 sidebar。您可以通过在您的清单中定义 sidebar_actionbrowser_action来做到这一点。

当问这个问题时,不可能将sidebar_actionbrowser_action同时组合在清单中。我不确定何时实际变化,但是截至这一点(在FF71上进行了测试(,您可以同时使用。

以下是将执行此操作的示例代码:

sustest.json:

{
    "manifest_version": 2,
    "name": "Button opens sidebar",
    "description": "Open the sidebar with a toolbar button.",
    "version": "1.0",
    "browser_action": {
        "default_icon": "icon.png",
        "default_title": "Open Sidebar"
    },
    "background": {
        "scripts":[
            "background.js"
        ]
    },
    "sidebar_action": {
        "default_icon": "icon.png",
        "default_title": "Example Sidebar",
        "default_panel": "sidebar.html",
        "open_at_install": false
    }
}

background.js:

//The manifest.json entry must be a file in your extension, but you can change it to
//  an external site in your background.js:
browser.sidebarAction.setPanel({panel: 'https://example.org/'});
//Open the sidebar when the browserAction button is clicked.
browser.browserAction.onClicked.addListener(() => {
  browser.sidebarAction.open();
});

sidebar.html

<html>
  <body>
    <div>Example text</div>
  </body>
</html>

打开侧边栏开放/关闭

我尝试实现该按钮的幼稚实现实际切换侧边栏:

背景.js

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.isOpen({}).then((isOpen) =>  {
        if (isOpen) {
            browser.sidebarAction.close();
        } else {
            browser.sidebarAction.open();
        }
    });
});

不幸的是,这是错误的失败:

Error: sidebarAction.open may only be called from a user input handler

使用第二个浏览

您可以利用一个事实,即通过在接近侧栏中添加一个附加的browserAction.onClicked侦听器来通过在后台上下文中显示HTML的侧栏正在运行。

背景.js

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.open();
});

sidebar.js

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.close();
});

sidebar.html

<html>
  <head>
    <script src="sidebar.js"></script>
  </head>
  <body>
    <div>Example text</div>
  </body>
</html>

事件侦听器按添加的顺序执行,因此关闭侧边栏的sidebar.js添加的侦听器是按照background.js中的一个添加的,它打开了侧栏。因此,当侧栏打开时,它在单击的浏览按钮时将其关闭。

无法打开实际书签或历史栏

Webextensions不可能特别想要打开实际书签或历史栏的实际书签或历史栏。您能做的就是自己实施类似的侧边栏。

我确实尝试将侧边栏URL更改为chrome:// URL:

browser.sidebarAction.setPanel({panel: 'chrome://browser/content/aboutDialog.xul'});

不幸的是,这导致错误:

Error: Access denied for URL chrome://browser/content/aboutDialog.xul

如果您希望某种方法可以编程打开实际的书签或历史栏栏,那么您将需要提交一个请求该功能的错误。或者,您还可以创建一个Webextension实验,该实验在安装Webexension实验时将功能添加到Webextensions API中。Webextension实验不会自动集成到Firefox中,但可能性可能是。

firefox⩾73

自Firefox 73以来,您可以简单地使用:

browser.browserAction.onClicked.addListener(() => {
    browser.sidebarAction.toggle();
});

MDN上的文档

Firefox&lt;73

如果您需要支持旧的Firefox版本,尤其是ESR,则可以跟踪哪个侧边栏是打开的。这是我为一个插件之一开发的方法,也是我知道的唯一一种与几个窗口一起使用的方法。

在您的背景脚本中:

let openedSidebarWindows = {};
browser.runtime.onConnect.addListener(port => onConnect(port));
browser.browserAction.onClicked.addListener(tab => this.onClick(tab));
function onConnect(port) {
  const windowId = parseInt(port.name);
  openedSidebarWindows[windowId] = port;
  port.onDisconnect.addListener(port => {
    delete openedSidebarWindows[parseInt(port.name)];
  });
}
function onClick({ windowId }) {
  if (openedSidebarWindows[windowId] !== undefined) {
    browser.sidebarAction.close();
  } else {
    browser.sidebarAction.open();
  }
}

在您的侧栏脚本中:

browser.runtime.connect({ name: windowId.toString() });

最新更新