【问题标题】:Firefox WebExtension: Check if MY extension existsFirefox WebExtension:检查我的扩展是否存在
【发布时间】:2017-11-19 10:18:13
【问题描述】:

将扩展从 Chrome 移植到 FF

遵循本教程(在 Chrome 中运行良好):http://www.codingscripts.com/check-whether-user-has-a-chrome-extension-installed/

从网页向扩展发送消息: 在 (web)pagescript.js 中有:

function IsExist(extensionId,callback){
chrome.runtime.sendMessage(extensionId, { message: "installed" },
function (reply) {
   if (reply) {
      callback(true);
   }else{
      callback(false);
   }
});
}

IsExist("Your extension id",function(installed){
if(!installed){
   alert("Please install extension ");
}
});

在扩展中接收来自网页的消息:

chrome.runtime.onMessageExternal.addListener(
function(req, sender, callback) {
if (req) {
if (req.message) {
   if (req.message == "installed") {
    callback(true);
   }
 }
}
return true;
});

我正在努力实现的目标

未安装扩展程序时,我网站上的几个 html 页面需要重定向回主页。因此,这些页面需要能够(自行)确定是否安装了扩展。

我在打开网页时遇到错误

ReferenceError : chrome 未定义。 (我也尝试过 browser.runtime.onMessageExternal 但它抛出“浏览器”未定义)。 有没有办法做到这一点类似于在 Chrome 中可以做到的?

【问题讨论】:

  • 当我将 chrome.runtime.onMessageExternal 更改为 browser.runtime.onMessageExternal 时,我遇到了同样的错误,但使用“浏览器未定义”而不是“chrome 未定义”。
  • 嗯,清单中有“externally_connectable”吗?我不是 FF 方面的专家,所以我只能说它是 not listed in supported keys
  • 是的,我已将我的域添加到“externally_connectable”中。我编辑了我的帖子并添加了“我想要实现的目标”,以更好地说明我的问题的目的以及为什么我需要 browser.runtime.sendMessage 在我的网页中,而不是在扩展内容脚本中。 (因为我知道它在那里工作)
  • 是的,您需要在页面上注入内容脚本以接收消息并发布另一个回复。
  • 使用 document_idledocument_end 使其不确定(在一般情况下)您的网页脚本或您的扩展首先执行,因为那些 run_at 声明没有保证时间(顺序wrt. 页面脚本)它们执行(发生的情况取决于您网页的内容)。在这种情况下,或者至少作为一般建议,我的首选是document_start,因为这样可以保证当您在网页脚本中检查扩展程序的标志时,它会存在。显然,还有其他方法可以保证这一点,但这对我来说是最简单的。

标签: google-chrome-extension firefox-addon-webextensions


【解决方案1】:

感谢所有的 cmets,这就是我想出的。 (我不得不去 document_end(其他 cmets 建议 document_start)因为我在 content_script.js 中还有其他事情发生

在我的插件的 content_script.js 中

document.body.classList.add("plugininstalledblabla");

在我的插件 manifest.json 中

 "content_scripts":
  [
    {
      "matches": ["*://*/*"],
      "all_frames": true,
      "js": ["content_script.js"],
      "run_at": "document_end"
    }
  ]

在我网站的 main.js 脚本中

$(window).on("load", function() { // !! Window onLoad cause : document_end -> DOM should be loaded here

    // Set
    $body = $('body');
    if(document.body.classList.contains("plugininstalledblabla")){
       console.log('addon is installed');
    } 
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2013-05-12
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多