OnHistoryStateUpdated过滤器未按预期工作

时间:2017-08-18 15:31:26

标签: javascript firefox-webextensions

我正在开发一个Firefox附加组件,我想在YouTube上观看视频时添加pageAction。我的background script效果很好,直到您从YouTube视频转到任何其他YouTube页面,pageAction不会消失。这是我的代码:

var filter = {
  url:[
    {
      pathContains: "watch",
      hostSuffix: "youtube.com"
    }
  ]
}
function showPageAction(details) {
  browser.pageAction.show(details.tabId);
}

browser.webNavigation.onCommitted.addListener(showPageAction, filter);
browser.webNavigation.onHistoryStateUpdated.addListener(showPageAction, filter);

第一次从YouTube视频页面(历史记录,主要频道,频道等)按任何其他YouTube链接时,就会发生这种情况,因为当您从第一次点击进入另一个YouTube页面时,它就会消失。 类似的东西:

  1. 打开新标签
  2. 直接访问www.youtube.com(未出现)
  3. 按任意视频(按预期显示)
  4. 按任意其他链接到YouTube页面(主页,历史记录,通道)(它仍在那里,不会消失吗?)
  5. 再次按下与视频不同的任何其他链接(最终消失)
  6. 我想在showPageAction函数中添加一个过滤器,但是,不是onHistoryStateUpdated的过滤器应该这样做吗?

1 个答案:

答案 0 :(得分:0)

过滤器按预期工作;这是默认的重置行为。

基于历史状态更新的导航点是没有发生实际导航(与onCommitted事件不同)。这意味着FF不会自动隐藏它。

这意味着您必须在导致非观看页面的导航中处理它。

最好的办法是在听众中过滤:

// Since history manipulation must preserve origin,
//  you can limit to YouTube domains for performance
const hostFilter = {
  url: [{hostSuffix: "youtube.com"}]
}

function updatePageAction(details) {
  if (details.url.includes("watch")) {
    browser.pageAction.show(details.tabId);
  } else {
    browser.pageAction.hide(details.tabId);
  }
}

browser.webNavigation.onHistoryStateUpdated.addListener(
  updatePageAction,
  hostFilter
);