无法在除我之外的其他浏览器/机器上运行我的 chrome 扩展:未打包的发行版中有些不匹配?

Posted

技术标签:

【中文标题】无法在除我之外的其他浏览器/机器上运行我的 chrome 扩展:未打包的发行版中有些不匹配?【英文标题】:Cannot run my chrome extension in other broswer/machine except mine : some mismatch in unpacked distribution? 【发布时间】:2019-12-16 21:16:27 【问题描述】:

对不起,我的英语不好,我希望你能理解这个问题。

我是 chrome 扩展开发的新手,在我的代码中肯定有很多 改变或优化的东西; 无论如何,我已经编写了一个简单的代码,(似乎)至少可以从我的 chrome 中工作。

代码在特定页面中每 X 分钟点击一次按钮,然后等待并解析页面中的结果。

我已经:

一个内容脚本(从 manifest.json 加载),它在页面中“注入”一些按钮和文本输入框,因此用户可以在单击“开始按钮”之前设置一些“过滤参数”;开始按钮然后 sendMessage() 到 background.js 为点击设置警报事件;

一个事件页面(实际上设置为持久真),它处理来自标签的请求并为每个标签设置倒计时警报;当 X min 被传递时,会向感兴趣的选项卡发送一条消息;

我还有一个 popup.html e popup.js 在这里并不重要(我认为)。

我必须手动分发这个扩展,所以我会分发一个用户可以使用“开发者模式”加载的 zip。

*现在的问题是:为什么代码只能在我的 Chrome 上运行? *

我用 Chrome 和其他 2-3 台笔记本电脑测试过,后台脚本已加载(我可以看到后台页面 printint 控制台日志)

但在网页中,contents.js 似乎无法执行。

在我的 chrome 中运行良好:我可以在控制台中看到一些初始输出(我打印要检查的 dir 扩展名)和 页面中动态创建的元素(按钮、输入框等)。

一切正常,我可以触发开始按钮并接收解析结果。

在开发过程中,我从未在其他机器上运行过扩展。昨天我已经成功地在 2-3 台笔记本电脑上进行了测试。然后我只做了很少的改变,但没有什么严重的。

今天我只能在我的 chrome 中运行。

在其他电脑上什么都没有,简单的console.log也不输出第一行脚本。

我可以在控制台日志中阅读: “未经检查的 runtime.lastError:无法建立连接。接收端不存在。” 但这也是我在笔记本电脑 chrome 上工作时的情况。

zip文件一样,解压好,其实我可以加载扩展,看到后台页面调试console.log()语句

在某些情况下,在它不起作用的笔记本电脑中,我收到了一条与 jQuery 相关的消息,并且没有定义 chrome.runtime.sendMessage() 的事实;它指向网页中的代码,而不是我的。

我在网页代码中看到了类似的内容:

 var extid = "mcmhdskbnejjjdjsdkksmeadjaibo";
          var extVer = "1.5";
          var extStatus = 0;
   $(document).ready(function ()  
///...
  chrome.runtime.sendMessage(extid, message: "version",
                  function (reply) 
                      if (reply) 
                          if (reply.version) 
                              if (reply.version == extVer) 
                                  if (reply.gminfo != 'OK') 
                                      extStatus = 1; /// ...

好像chrome.runtime是未定义的,网页无法调用sendMessage()。 编辑:这个未定义仅在我的扩展加载时发生

也许当我加载我的扩展时有一些冲突?但在我的 chrome 浏览器中工作...

专家能否指出我要调查的方向?

非常感谢您的任何建议。

我的 Manifest.json :

  "manifest_version": 2,
  "name": "myAlarm",
  "description": "This extension alerts.",
  "version": "0.1",
   "permissions": [
   "alarms",
   "system.cpu",
   "storage",
   "tabs",
    "webNavigation",
   "https://www.mytargetsite.com/subUrl/"
     ],

   "web_accessible_resources": [
   "icon.png",
   "vanillaSelectBox.css"],

    "content_scripts": [
    
    "matches": ["https://www.mytargetsite.com/subUrl/"],
     "css": ["vanillaSelectBox.css"],
     "js": ["jquery-3.3.1.min.js","vanillaSelectBox.js","taffy-min.js","content.js"],
     "run_at": "document_end"
     
      ],

    "background": 
    "scripts": ["eventPage.js"],
    "persistent": true
     ,

     "browser_action": 
    "default_icon": "icon.png",
    "default_popup": "popup.html"
      ,

   "icons": 
     ....
      
      

我的内容,js(剥离):

     chrome.runtime.onMessage.addListener(
            function(request, sender) 
          // here i parse message "time'up" from background js    
              );

    window.addEventListener('load', function() 
     var pt=chrome.runtime.getURL('filterOff.wav'); 
      var p=pt.split("/");

      console.log("[myAlarm v0.1] started" );
      console.log("[myAlarm v0.1] folder : ("+p[2]+")");
       // here i start an active wait for the presence in page of button with ID= btntarget_id
      waitForElementToDisplay("#btntarget_id", 500); //when function find button then create and add button and input text to webpage
         );

我的 eventPage.js :

            var curr_alarms =[];
             chrome.extension.onMessage.addListener(function(request, sender)
                 /// here receive start countdown message from content.js and set alarm  ...
               


            chrome.alarms.onAlarm.addListener(function(alarm) 
              /// here i manage each alarm for each tab
              );

              chrome.tabs.onRemoved.addListener(function(tabid, removed)  
                //  ...
             );

            chrome.tabs.onUpdated.addListener(function
             (tabId, changeInfo, tab) 
               //
               );

编辑:在它不起作用的浏览器中我也可以阅读:

从源“https://mytargetsite.com”访问“https://mytargetsite.com/suburl/grid.php”处的 XMLHttpRequest(从“https://mytargetsite.com/suburl/grid.php”重定向)已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:重定向未通过允许预检请求。

【问题讨论】:

【参考方案1】:

    声明的内容脚本是否运行,应通过在 devtools => 源子选项卡 => 内容脚本子子选项卡中检查来验证。如果它真的没有运行,可能只有两种解释:URL 不同(例如不是https)或扩展被其域管理员通过 runtime_blocked_hosts 阻止,您可以在 chrome://policy 中看到。

    除非您在 manifest.json 中 pin it by adding a "key",否则您的开发模式扩展程序的 id 在不同的机器上会有所不同

    1234563

    CORS 错误可能与您的代码无关(您可以通过在 devtools 控制台中展开错误的调用堆栈来调查错误的来源)。

【讨论】:

1- 你是对的!我花了几个小时然后发现 302 重定向 url 在加载时出现了一些不匹配!所以这是真正的问题。 2-我抓住了这一刻:我有点困惑......添加密钥是严格需要“手动”分发我的解压扩展程序? (我的意思是,我会向用户发送一个 zip 文件;然后他们提取并加载.. 可以吗?还是我遗漏了什么?)

以上是关于无法在除我之外的其他浏览器/机器上运行我的 chrome 扩展:未打包的发行版中有些不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 视频播放器在除 Safari 之外的所有浏览器中都没有声音

无法让 QtPrintSupport 工作

在日历中的特定日期显示背景颜色的问题,在除移动 Safari 之外的所有浏览器上都可以正常工作

如何在除 Localhost 之外的特定 IP 上运行 Geoserver?

Meteor JS 可以在除 iOS 设备之外的所有设备上连接到 compose.io 吗?

UIRefreshControl 将在除 iPhone 6+ 之外的所有手机上关闭