我正在尝试使用一个简单的 Angular 页面(除了加载模板外没有 xhr(,到目前为止这并不容易。
不知何故,Firefox 如何运行脚本/渲染 html 和 XUL 的方式存在差异。据我所知,这些差异没有记录在案,因为我一直在寻找最后一个小时左右的时间,以弄清楚为什么链接会在它之前unsafe:
。可以猜测这是因为内容被认为是不安全的,但找不到任何文档。
我的主html页面位于XUL浏览器元素内,其类型设置为content-primary
,源代码设置为chrome://myapp/content/index.html
主页和首次加载的模板中的直接链接工作:
<a href='#/students/JON'>link in the template</a>
我可以单击它,它将加载详细信息模板并显示数据。
当我让 Angular 在 ng-repeat 中生成链接时,它不再起作用:
<a href="#/students/{{student.name}}">{{student.name}}</a>
此链接的 href 更改为:unsafe:chrome://myapp/content/index.html#/students/JON
以下内容也发生了变化:
<a href='#/students/{{"JON"}}'>messed with by angular</a>
这表明JS生成的href被认为是不安全的,但以下工作正常:
var a=document.createElement("a");
a.href="#/students/JON";
a.innerHTML="dynamic added link same url";
document.body.appendChild(a);
单击该链接时,将加载详细信息模板并显示详细信息。
所以我的问题是:我怎样才能防止XUL认为这些链接是不安全的?它们都指向chrome://myapp/content/
中的本地资源,并且将链接设置为chrome://myapp/content/index.html#/sudents/JON
也不起作用(仍然不安全(。
另一个是:有没有关于XUL渲染和JS与Firefox不同的良好文档?如果有这样的文档,那么它肯定包含不安全的部分,可能还有我将要遇到的其他内容。
[更新]多亏了迈尔先生,我发现这根本不是XUL的问题。由于在XUL拒绝chrome内容的location.replaceState之前,然后返回状态为0而不是200(就像在Firefox中一样(,我认为它也与XUL相关。应该知道它是 Angular,因为添加 dom 元素有效(angular 不知道我添加了它们(并且未由 angular 处理的链接有效。为了将 chrome://协议添加为受信任协议,我做了以下操作:
angular.module('student', []).
config(['$routeProvider','$compileProvider',
function($routeProvider,$compileProvider) {
$compileProvider.urlSanitizationWhitelist(/^s*(chrome|file):/);
稍后将删除文件,因为我目前正在使用它从Firefox中的磁盘打开文件,以查看是否一切正常
与XUL本身无关。这是一个 AngularJS 功能(使用(,显然无法按预期在chrome:
工作。您必须解决此问题,例如将chrome:
协议列入白名单。
在链接的 href 属性中使用绑定时,应使用 ng-href 而不是 href,以便评估绑定。
<a ng-href="#/students/{{student.name}}">{{student.name}}</a>
而不是
<a href="#/students/{{student.name}}">{{student.name}}</a>
请参阅 http://docs.angularjs.org/api/ng.directive:ngHref