用于加载远程 XUL 的 XULrunner 权限

XULrunner permissions for loading remote XUL

我只想使用 PHP(通过本地 AMPPS 服务器)来生成我所有的 XUL。看起来 XUL运行ner 不允许加载 "remote" URL(即 http://mylocaldomain.com)。

我进行了大量搜索,看到看起来像答案的回复,但它们含糊不清或太旧了,我无法让它们发挥作用。我认为相关的答案是使用 nsIPermissionManager, there is an example at https://developer.mozilla.org/en-US/docs/Using_Remote_XUL 但我无法让它工作

Components.classes["@mozilla.org/permissionmanager;1"]
    .getService(Components.interfaces.nsIPermissionManager)
    .add('http://www.mylocaldomain.com/', 'allowXULXBL', Components.interfaces.nsIPermissionManager.ALLOW_ACTION);

我试过在 pref.jsmain.js 的开头加载它,但都不起作用。如果我将它放在我的 main.js 文件中,XUL运行ner 中的错误控制台会给出此错误

Error: NS_ERROR_XPC_BAD_CONVERT_JS: Could not convert JavaScript argument arg 0 [nsIPermissionManager.add]

如果我在 Firefox 中 运行 它,我会得到这个错误

TypeError: Components.classes is undefined

我在这里也找到了这个 post,Is it possible to reference remote content from chrome.manifest? (XULRunner) 基本上看起来你把 application.inidefaults\preferences\prefs.js 放在了你的服务器上,运行他们从那里。因此,如果我 运行 我的应用程序与 "...\xulrunner.exe" -app http://www.mylocaldomain.com/application.ini -jsconsole XUL运行ner 只是说它无法解析 application.ini.

所以问题是如何在 XUL运行ner 中进行设置以允许使用远程 URL?

编辑:第 2 轮(更像是第 50 轮,但谁在计算)

令人惊讶的是,没有关于远程 XUL 的教程。我买了一本书 Introductory XUL 整本书都没有关于远程 XUL 的字眼。是的,我本可以买一本不同的书,但随着年龄的增长,名单上的下一本是 2007 年的,在 Mozilla 破坏 XUL运行ner.

之前

虽然有一个附加组件,但由于本书的想法失败了,Remote XUL Manager。让我们剖析一下。在其近 1000 行代码中,似乎需要 2 行代码来设置远程 URL.

的权限

permissions.js 的第 97 行你有

Services.perms.add(uri, ALLOW_REMOTE_XUL, ALLOW);

第 143 行你有

Services.io.newURI(aDomainString, null, null);

放在一起并替换变量你得到

var uri = Services.io.newURI('http://www.mylocaldomain.com', null, null);
Services.perms.add(uri, "allowXULXBL", 1);

到运行它,貌似你需要在它之前加上这个

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

但是在 运行 在 XUL运行ner 中我得到这个错误

TypeError: Components.utils is undefined

和以前一样。谷歌搜索了一下,我发现我需要这个

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

所以我将它添加到我的代码的顶部并得到了这个错误

TypeError: netscape.security.PrivilegeManager is undefined

如果你 google 得到 xulrunner "netscape.security.PrivilegeManager is undefined" 你会得到 4 个结果(有了这个 post 我猜现在是 5 个)。幸运的是,如果删除 xulrunner 你会得到更多的结果和一些字里行间的阅读,看起来 netscape.security.PrivilegeManager 已经过时了 (obsolete reference).

在我的一次搜索中 xulrunner "Components.utils is undefined"(又是 4 个结果)在 SO Firefox Add-on SDK and js-ctypes 上出现了 post。基于此我尝试了这个

const {Cu} = require('chrome');
Cu.import("resource://gre/modules/Services.jsm");

var uri = Services.io.newURI('http://www.mylocaldomain.com', null, null);
Services.perms.add(uri, "allowXULXBL", 1);

出现这个错误

ReferenceError: require is not defined

我认为这样做是可能的,因为有一个附加组件在做,看起来它只是几行,但这些行似乎是比核发射代码更严密保护的秘密。

所以回到追捕每一条最后的小兔子踪迹并发现更多的死胡同,至少在有人愿意泄露豆子之前。

好吧,这是一个糟糕的时刻。但正如我所看到的,很多 post 都没有得到答复,我将 post 找到答案。

<?xml version="1.0"?>

<?xml-stylesheet href="main.css" type="text/css"?>

<window id="main" title="My App" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <vbox flex="1">
        <browser id="mainbrowser" src="http://www.mylocaldomain.com/main.xul" flex="1" />
    </vbox>

</window>

就是这么简单。 浏览器元素非常强大,可以从任何 URL 运行 XUL,无需额外配置。请注意,上面没有 javascript,至于我的 pref.js,它只是启动本地 main.xul 所需的一个首选项,然后是 5 个有助于调试的额外选项。我什至会删除样式表,但目前,似乎有一个错误会在我删除它时强制 XUL运行ner 进入全屏模式。

在过去的 2 个多月里,我一直在关注这个问题并制定解决方案。我不敢相信我一直浪费在有如此简单解决方案的东西上。