私の XUL アプリケーションには次のようなブラウザ オブジェクトがあります。
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window title="Students"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
width="800px"
height="500px">
<groupbox flex="1">
<caption label="Students"/>
<browser type="chrome" src="chrome://myapp/content/index.html" flex="1"/>
</groupbox>
</window>
そして index.html は次のとおりです。
<!DOCTYPE html>
<html>
<head>
<title>Student page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>Something wrong with history.replaceState</h1>
<script>
try{
history.replaceState(null, '', 'chrome://myapp/content/another.html');
}catch(e){
//not sure how to log stuff in XUL without creating helper functions
alert(e);
}
</script>
</body>
</html>
エラーで開きます:
[例外...「コンポーネントがエラー コードを返しました: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMHistory.replaceState]」 nsresult: 「0x80004005 (NS_ERROR_FAILURE)」場所: 「JS フレーム :: chrome://myapp/content/index.html :: : : 11 行目データ: なし]
私はブラウザー要素で Angularjs を使用しようとしていましたが、history.replaceState に依存しているため、XUL アプリケーションでは失敗します。
[アップデート]
ブラウザー要素のタイプを content-primary に設定すると、location.replaceState は例外をスローしません。
<browser type="content-primary"
src="chrome://myapp/content/index.html" flex="1"/>
[アップデート]
XMLHttpRequest の問題
ステータスが 0 を返し、Angular がif(status...
ディスクからファイルを開くときに Firefox でチェックすると、ステータス 200 が返されますが、XUL では返されません。これにより、テンプレートが読み込まれません。
angular ソースの isSuccess の return を に変更するとreturn (200 <= status && status < 300)||status===0;
、テンプレートが読み込まれるようになりました。
[アップデート]
リンクをクリックすると、危険なプロトコルは登録されたプロトコルではなく、これは XUL の問題ではないことを知らせる警告が表示される#/students/22
ようなリンクが表示されます。unsafe:chrome://myapp/content/index.html#/students/22
chrome:// プロトコルを Angular で信頼できるものとして追加するために、application.js で次のことを行いました。
angular.module('student', []).
config(['$routeProvider','$compileProvider',
function($routeProvider,$compileProvider) {
$compileProvider.urlSanitizationWhitelist(/^\s*(chrome|file):/);
へのリンクのみを開くようになりましchrome://path/file
たfile://path/file