XULrunner加载远程XUL的权限

时间:2015-02-06 07:46:27

标签: xulrunner

我想只使用PHP(通过本地AMPPS服务器)来生成我的所有XUL。看来XULrunner不允许加载“远程”URL(即http://mylocaldomain.com)。

我已经做了相当多的搜索,我看到答案看起来像一个答案,但它们模糊或相当陈旧,我无法让它们工作。我认为相关的答案是使用nsIPermissionManagerhttps://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.inidefaults\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

我认为这样做是可能的,因为有一个附加组件可以做到这一点,看起来只有几行,但这些线看起来是一个秘密,更密切地保护核发射代码。

回到追捕每一条小兔子的踪迹,发现更多的死胡同,至少在有人愿意把豆子洒了之前。

1 个答案:

答案 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个多月里一直在努力。我无法相信我曾经浪费在一些有这么简单解决方案的东西上。