如何使用Web扩展将焦点设置到Firefox窗口

时间:2017-11-13 22:54:07

标签: javascript firefox firefox-webextensions

我正在尝试创建一个Firefox插件,无论何时触发某个事件,都会将浏览器窗口置于最前端。

这是我的清单:

{
  "manifest_version": 2,
  "name": "Test Extension",
  "version": "1.0",
  "description": "Test browser extension",

  "content_scripts": [{
    "matches": ["http://*/*", "https://*/*"],
    "js": ["content.js"]
  }],

  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },

  "permissions": [
    "notifications",
    "activeTab"
  ]
}

Content.js:

'use strict';

document.addEventListener('newOrderEvent', function() {
  console.log('New Order event received');
  browser.runtime.sendMessage('new-order-event');
});

Background.js:

'use strict';

var windowId;

function newOrderListener(message) {
  if (message === 'new-order-event') {
    console.log('Received event!');
    browser.windows.update(windowId, {
      drawAttention: true,
      focused: true,
      state: 'maximized'
    });
  }
}

browser.windows.getCurrent().then(function(window) {
  windowId = window.id;
});

browser.runtime.onMessage.addListener(newOrderListener);

newOrderEvent是由我的应用程序的网页生成的,并且始终在正确的时间调用它,但有时浏览器会出现在前台,有时则不会出现,我不明白为什么。此外,来自background.js的控制台输出未被浏览器注册。

我做错了什么?

注意:我使用的是Firefox 52和Windows 10。

1 个答案:

答案 0 :(得分:0)

如果您想要的是TAB使自己专注,那么您错误的是windowId。 WindowId将是窗口的ID,而不是选项卡的ID,以及您设置它的方式,它只会是单个值,加载扩展时的第一个windowID

如果您将background.js更改为以下

function newOrderListener(message, sender) {
    if (message === 'new-order-event') {
        console.log('Received event for window %s, tab %s', sender.tab.windowId, sender.tab.id);
        browser.windows.update(sender.tab.windowId, {
            drawAttention: true, 
            focused: true, 
            state: 'maximized'}
        ).then(() => browser.tabs.update(sender.tab.id, {
            active: true
        }));
    }
}
browser.runtime.onMessage.addListener(newOrderListener);

然后任何加载了内容脚本的选项卡(基本上是代码中的每个选项卡)都可以通过

来关注自己
document.dispatchEvent(new Event("newOrderEvent"))