我们正在使用Firefox的自定义纯Java插件,该插件已在我们的某些Intranet网站中使用。该加载项应该从用户的PC加载特定的文本文件,然后将特定的变量公开给我们的某些Intranet页面。

当前实现从FF3到FF28。在FF29中,wrappedJSObject的行为已更改。

这是我在附加代码中得到的:

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

function PrivateClass() {
  this.wrappedJSObject = this;
}

PrivateClass.prototype = {
// Component details
classDescription: "...",
classID:          Components.ID("{...}"),
contractID:       "@foo.bar/PrivateClass;1",
QueryInterface:   XPCOMUtils.generateQI([Ci.nsIClassInfo]),

getInterfaces: function(countRef) {
    var interfaces = [Ci.nsIClassInfo, Ci.nsISupports];
    countRef.value = interfaces.length;
    return interfaces;
},

implementationLanguage: Components.interfaces.nsIProgrammingLanguage.JAVASCRIPT,
flags: Ci.nsIClassInfo.DOM_OBJECT,
getHelperForLanguage: function(count) { return null; },

// We use the default _xpcom_factory

// Categories to register
_xpcom_categories: [{
  category: "JavaScript global property",
  entry: "PrivateClass",          // optional, defaults to the object's classDescription. Needed for FF3.
  value: "@foo.bar/PrivateClass;1",  // optional, defaults to the object's contractID. Needed for FF3.
  service: false
}],

// nsISecurityCheckedComponent permissions
// return "AllAccess"; / return "NoAccess";
canCreateWrapper : function canCreateWrapper(aIID) { return "AllAccess"; },
canCallMethod: function canCallMethod(aIID, methodName) { return "AllAccess"; },
canGetProperty: function canGetProperty(aIID, propertyName) { return "AllAccess"; },  // needed to access wrappedJSObject
canSetProperty: function canSetProperty(aIID, propertyName) { return "NoAccess"; },

getFunctionA : function() { return "This is A"; },
getFunctionB : function() { return "This is B"; },

// New functionality, needed for FF 17+
// https://developer.mozilla.org/en-US/docs/XPConnect_wrappers#__exposedProps__
__exposedProps__ : { getFunctionA : "r", getFunctionB : "r" }
}


并在客户端页面中:

if (typeof PrivateClass != "undefined") {
  var obj = PrivateClass.wrappedJSObject;
  var a = obj.getFunctionA()
  var b = obj.getFunctionB();
}


但是,现在FF在此行中返回Error: Attempt to use .wrappedJSObject in untrusted code

var obj = PrivateClass.wrappedJSObject;


我已经在这篇博客文章中了解到FF30中包装的JSObject即将发生的更改:
https://blog.mozilla.org/addons/2014/04/10/changes-to-unsafewindow-for-the-add-on-sdk/

...但是推荐的解决方案对我不起作用

请注意,包装的JSObject解决方案在Mozilla开发人员的官方文档herehere中。也可以在Internet各处找到它(例如here),但是显然在FF29中它已经以某种方式被破坏/更改,因此这些都不适用。

我已经检查了出色的FF插件jsPrintSetup,它不使用wrappedJSObject(尽管它也具有C ++二进制组件,这也许可以解释这一点)。我已经阅读了很多有关wrappedJSObject的有关此问题的论坛帖子,但找不到有关此行为的特定更改的任何信息。任何人都可以阐明在FF29 +下运行该功能需要做什么吗?

最佳答案

是的,我添加了一项检查不受信任的内容的检查XPCOM组件的内胆,它实际上与业务无关。从特权代码来看,它仍然应该可以正常工作。

Also note that nsISecurityCheckedComponent was removed,因此您不再需要该部分。

通常,将API暴露给内容的最适合未来的方法是使用exportFunction将其直接注入内容范围。

Extra info

08-05 15:54