OnHistoryStateUpdated 过滤器未按预期工作

OnHistoryStateUpdated filter not working as expected

我正在开发一个 Firefox 插件,我想在其中添加一个 pageAction when you are watching a video in YouTube. My 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 link 时发生,因为当您从第一次点击转到另一个 YouTube 页面时,它消失。 类似于:

  1. 打开新标签页
  2. 直接转到 www.youtube.com(没有出现)
  3. 按任意视频(按预期出现)
  4. 按任何其他 link 到 YouTube 页面(主要、历史、频道)(它还在那​​里,应该不会消失?)
  5. 再次按任何其他link不同于视频(它最终消失)

我想在 showPageAction 函数中添加一个过滤器,但是 onHistoryStateUpdated 的过滤器不应该这样做吗?

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

基于历史状态更新的导航的要点是没有实际 导航发生(与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
);