我想只使用PHP(通过本地AMPPS服务器)来生成我的所有XUL。看来XULrunner不允许加载“远程”URL(即http://mylocaldomain.com
)。
我已经做了相当多的搜索,我看到答案看起来像一个答案,但它们模糊或相当陈旧,我无法让它们工作。我认为相关的答案是使用nsIPermissionManager,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.js
以及main.js
的开头,但都无效。如果我将它放在我的main.js
文件中,则XULrunner中的错误控制台会出现此错误
错误:NS_ERROR_XPC_BAD_CONVERT_JS:无法转换JavaScript参数arg 0 [nsIPermissionManager.add]
如果我在Firefox中运行它,我会收到此错误
TypeError:Components.classes未定义
我也在这里发现了这篇帖子,Is it possible to reference remote content from chrome.manifest? (XULRunner)基本上可以让您将application.ini
和defaults\preferences\prefs.js
放在您的服务器上并从那里运行它们。因此,如果我使用"...\xulrunner.exe" -app http://www.mylocaldomain.com/application.ini -jsconsole
运行我的应用程序XULrunner只是说它无法解析application.ini
。
那么问题是如何在XULrunner中设置允许使用远程URL?
编辑:第2轮(更像是第50轮,但是谁在计算)
令人惊讶的是,远程XUL没有一个教程。我在整本书中买了一本关于远程XUL的书Introductory XUL。是的,我本可以买一本不同的书,但随着年龄的增长,名单上的下一个是从2007年开始的,之后Mozilla将XULrunner毁掉了。
由于书的想法失败了,我虽然有一个附加组件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");
但是在XULrunner中运行时我得到了这个错误
和以前一样。所以有点谷歌搜索,我发现我需要这个TypeError:Components.utils未定义
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
因此我将其添加到我的代码顶部并收到此错误
TypeError:netscape.security.PrivilegeManager未定义
如果你google for xulrunner "netscape.security.PrivilegeManager is undefined"
你会得到4个结果(我想这个帖子现在是5)。幸运的是,如果删除xulrunner
,您会获得更多结果并在行之间略微阅读netscape.security.PrivilegeManager
已过时(obsolete reference)。
在我的一次搜索中xulrunner "Components.utils is undefined"
(再次有4个结果)在SO上发布了一条帖子Firefox Add-on SDK and js-ctypes。基于此我尝试了这个
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
我认为这样做是可能的,因为有一个附加组件可以做到这一点,看起来只有几行,但这些线看起来是一个秘密,更密切地保护核发射代码。
回到追捕每一条小兔子的踪迹,发现更多的死胡同,至少在有人愿意把豆子洒了之前。
答案 0 :(得分:0)
<?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个额外选项。我甚至会删除样式表,但目前看起来有一个错误会在我删除它时强制XULrunner进入全屏模式。
我一直在研究这个问题,并在过去的2个多月里一直在努力。我无法相信我曾经浪费在一些有这么简单解决方案的东西上。