firefox插件:无法使用Web扩展名更新选项卡URL

时间:2018-11-25 00:44:45

标签: javascript firefox-addon

我想知道如何使用Web Extensions在Firefox中更新URL地址。

我正在尝试将使用Chrome API创建的简单扩展移植到Firefox,但是我并不真正了解Firefox中的制表符URL机制。

此扩展程序是通过单击在YouTube桌面/电视版本之间切换的。

它在Chrome上运行良好,但我不知道为什么它在Firefox上无法运行。

更新1 :放置与问题相关的最重要的代码块:

chromeApi.browserAction.onClicked.addListener(function(tab) {
  var actionUrl = '';
  var tabUrl = tab.url;

  if (getCurrentPageVersion(tabUrl) !== undefined) {
    actionUrl = getConvertedActionUrl(tabUrl);
    if (actionUrl !== tabUrl) {
      chromeApi.tabs.update(tab.id, {url: actionUrl});
    }
  }

});

完整来源

(function(chromeApi) {

  getCurrentPageVersion = function (tabUrl) {
    var ytValidRegex = /^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)/g;
    var ytValidStdPageRegex = /^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)?(\/watch\?v=).+$/g;
    var ytValidTvPageRegex = /^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)?(\/tv#\/watch(\/video)?\/(idle|control)\?v=).+$/g;

    if (!ytValidRegex.test(tabUrl)) {
      return undefined;
    } else if (ytValidStdPageRegex.test(tabUrl)) {
      return "std";
    } else if (ytValidTvPageRegex.test(tabUrl)) {
      return "tv";
    }

    return undefined;
  };

  getConvertedActionUrl = function (tabUrl) {
    var result = '';

    var shortStdYtUrlRegex = /\/watch\?v=.+/g;
    var shortTvYtUrlRegex = /\/tv#\/watch\/video\/(idle|control)\?v=.+/g;
    var shortStdYtUrlReplaceRegex = /\/watch\?v=/g;
    var shortTvYtUrlReplaceRegex = /\/tv#\/watch\/video\/(idle|control)\?v=/g;

    if (shortStdYtUrlRegex.test(tabUrl)) {
      result = tabUrl.replace(shortStdYtUrlReplaceRegex, '/tv#/watch/idle?v=');
    }

    else {
      result = tabUrl.replace(shortTvYtUrlReplaceRegex, '/watch?v=');
    }

    // YouTube standard website video url
    //https://www.youtube.com/watch?v=9tRDQK2MtRs
    // YouTube TV url
    //https://www.youtube.com/tv#/watch/video/idle?v=9tRDQK2MtRs
    return result;
  }

  onInit = function () {

  };

  // Called when the user clicks on the browser action.
  chromeApi.browserAction.onClicked.addListener(function(tab) {
    var actionUrl = '';
    var tabUrl = tab.url;

    if (getCurrentPageVersion(tabUrl) !== undefined) {
      actionUrl = getConvertedActionUrl(tabUrl);
      if (actionUrl !== tabUrl) {
        chromeApi.tabs.update(tab.id, {url: actionUrl});
      }
    }

  });

  chromeApi.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
    if(!changeInfo.url) return; // URL did not change
    // Might be better to analyze the URL to exclude things like anchor changes
    var pageVersion = getCurrentPageVersion(tab.url);
    if (pageVersion === undefined) return;

    /* ... */
    chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
  });

  chromeApi.tabs.onCreated.addListener(function(tab){
    var pageVersion = getCurrentPageVersion(tab.url);
    if (pageVersion === undefined) return;

    /* ... */
    chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
  });

})(chrome);

如果您注意的话,每当您单击加载项/扩展名按钮时,核心功能就会发生在chromeApi.browserAction.onClicked事件上。

该扩展程序可以在Chrome中的每个YouTube版本之间正确更新,但是在Firefox中,无论您单击多少次,该版本都会重定向到YouTube TV一次,并且永远不会返回到桌面版本。

但是Firefox中有些奇怪的地方:只要调用tab.update方法,浏览器的历史记录就可以正确更新,但是它会自己再次重定向到电视版本。

重要:两个Firefox / Chrome扩展程序都使用currentTab权限,因此它本身不是扩展程序问题。

Extension on GitHub

更新2(2018-11-25):我已根据先前的反馈更新了源代码

0 个答案:

没有答案