firefox 扩展通过 sdk 工作,但在浏览器中安装时不能 - 兼容性问题?

Posted

技术标签:

【中文标题】firefox 扩展通过 sdk 工作,但在浏览器中安装时不能 - 兼容性问题?【英文标题】:firefox extension works through sdk but not when installed in browser - compatibility issue? 【发布时间】:2015-08-13 12:14:01 【问题描述】:

---更新----

在对此进行了更多试验后,我确定我编写的 contentScript 不是这里的问题。例如,如果我将扩展简化为:

var buttons = require('sdk/ui/button/action');
var data = require("sdk/self").data;
var self = require("sdk/self");


var button = buttons.ActionButton(
id: "library-link",
label: "External Resource Locator",
icon: self.data.url("icon-16.png"),
  );

当我通过 SDK 运行扩展时,该按钮仍会出现,但当我在当前的 firefox 浏览器(版本 38,在某些平台上)中安装 xpi 时不会出现。这个问题似乎发生在他们设计过程中的一个非常基本的层面。


我正在尝试为 firefox 编写一个简单的扩展,它将一个表单附加到当前页面并将数据发布到另一个站点。它可以通过操作按钮或上下文菜单项调用。

我一直在使用附加 sdk 进行开发,当我使用 cfx run 对其进行测试时,它运行良好。但是,在执行cfx xpi 并将扩展安装到我的Firefox 浏览器之后,它根本不起作用。操作按钮和上下文菜单项不会出现,虽然扩展显示在 add-ons -> extensions as installed and enabled,但不会显示任何与 xpi 打包的图像。

我不确定是什么原因造成的,而且我的代码相当简短,所以我将添加整个 main.js:

var buttons = require('sdk/ui/button/action');
var data = require("sdk/self").data;
var contextMenu = require("sdk/context-menu");
var self = require("sdk/self");

var menuItem = contextMenu.Item(
                            label: "Look for selected text in the Library of Babel",
                            context: contextMenu.SelectionContext(),
                             contentScript: 'self.on("click", function () ' +
                            'var text = window.getSelection().toString();' +
                            'var formext = document.createElement("form");' +
                            'formext.setAttribute("method", "POST");' +
                            'formext.setAttribute("action", "https://libraryofbabel.info/resourcelocator.cgi");' +
                            'var hiddenField = document.createElement("input");' +
                            ' hiddenField.setAttribute("type", "hidden");' +
                             'hiddenField.setAttribute("name", "extension");' +
                            ' hiddenField.setAttribute("value", window.getSelection().toString());' +
                            ' formext.appendChild(hiddenField);' +
                            ' document.body.appendChild(formext);' +
                            ' formext.submit();' +
                            ');',
                            image: self.data.url("icon-16.png")
                            );

var button = buttons.ActionButton(
id: "library-link",
label: "External Resource Locator",

icon: 
"16": "./icon-16.png",
"32": "./icon-32.png",
"64": "./icon-64.png"
,
onClick: function() 
 require("sdk/tabs").activeTab.attach(
                              contentScriptFile: data.url("form.js")
                               );
                              
                              );

我注意到,当我运行cfx xpi 时,自动生成的 install.rdf 文件显示兼容性的最高版本是 30.0。但是,我还发现在某些运行 38 及以下版本的 firefox 的计算机上,它可以完美运行。此代码中是否有任何内容会阻止与较新版本的 Firefox 兼容?我将添加 ContentScriptFile 以防万一:

function getSelectedText() 
var text = "";
if (window.getSelection) 
    text = window.getSelection().toString();
 else if (document.selection && document.selection.type != "Control") 
    text = document.selection.createRange().text;

return text;


var bodytext = document.getElementsByTagName("BODY")[0];
var formext = document.createElement("form");
formext.setAttribute("method", "POST");
formext.setAttribute("action", "https://libraryofbabel.info/resourcelocator.cgi");
//formext.setAttribute("target","_blank");

var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "extension");
hiddenField.setAttribute("value", getSelectedText() || document.body.innerhtml); // take selected text OR bodytext

formext.appendChild(hiddenField);
document.body.appendChild(formext);
formext.submit();

【问题讨论】:

你有完整插件的 github 存储库吗?我想自己安装插件看看 感谢您查看它 - 您可以从这里安装插件:addons.mozilla.org/en-US/firefox/addon/lobthis - 或从这里下载 xpi:libraryofbabel.info/lobthis.xpi 要更新,我现在已经在许多不同的平台上进行了尝试,并且无法识别导致它失败的模式 - 我已经尝试了两台 Windows 7 机器,但它没有工作,但在一台 Windows 8 机器上取得了成功。结果也与 OS X 混合在一起。 只有 main.js 和 from.js 有你的代码吗? 是的 - 存档中唯一的其他内容是图标和cfx xpi 生成的文件,例如 install.rdf。 【参考方案1】:
    打开图标所在工具栏上的上下文菜单,选择Customize...。在打开的窗口中,您可以在“其他工具和功能”中看到您的图标吗?如果是,则意味着 Firefox 在您开发插件时记住了该图标的缺失。您可以手动将图标放到工具栏上。我相信普通用户不会遇到这个问题。 在install.rdf 中手动更改您的em:maxVersion

    按照Setting up an extension development environment 中的说明配置您的 Firefox,即,至少这些:

    javascript.options.showInConsole = true 在 F12 控制台中显示插件错误 javascript.options.strict = true 在控制台中显示更多警告 extensions.logging.enabled = true 在控制台中出现安装/更新问题。

    之后,重新启动 Firefox 并查看是否可以从控制台获取任何有用的信息。禁用其他插件以消除噪音。

    尝试备份并删除整个firefox's profile folder,让Firefox 100% 干净。它有帮助吗?如果是,则将问题缩小到配置文件中的某些内容。 尝试更改插件的所有标识符(包括插件名称、ID、描述、按钮 ID 和描述等),从而制作一个新的重复插件。这有帮助吗?如果是,那很可能意味着 Firefox 在您使用插件时记住了一些设置。

【讨论】:

不,我的图标没有出现在其他工具和功能下 更新:添加了更多故障排除 谢谢你,@Codeguard - 有趣的是,当我创建一个单独的开发配置文件并从命令行启动浏览器时,如您提供的扩展程序链接中所述。但是,当浏览器正常打开时,它仍然无法从我的默认配置文件中工作。当我启用扩展时,唯一类似于错误的事情是:TypeError: "Services" is read-only 当我禁用时,它说ReferenceError: reference to undefined property cuddlefishSandbox.xulappSandbox bootstrap.js:344:2 还有NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXPCComponents_Utils.nukeSandbox] bootstrap.js:290:0 - 我不确定这些是否相关 - 如果您认为有帮助,我可以从控制台提供其他信息 请继续执行第 4 步和第 5 步。由于控制台上没有错误(希望您正确配置了设置),可能是由于某些设置,Firefox 隐藏了您的图标,并且不会失败。

以上是关于firefox 扩展通过 sdk 工作,但在浏览器中安装时不能 - 兼容性问题?的主要内容,如果未能解决你的问题,请参考以下文章

来自 Java 客户端的 SSL 错误,但在 Firefox 中以 POSTER 形式工作

Firefox 和 Chrome 下架流行扩展 Stylish

Firefox 浏览器中的 SVG 路径元素缩放转换错误

Geolocation html5 在网络浏览器上工作,但在 iPhone 浏览器上不工作

JSONP 在 Chrome 中工作但在 Firefox/IE 中不工作?

表格宽度在 Firefox html 上无法按预期工作