1

私の 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/22chrome:// プロトコルを Angular で信頼できるものとして追加するために、application.js で次のことを行いました。

angular.module('student', []).
  config(['$routeProvider','$compileProvider', 
    function($routeProvider,$compileProvider) {
      $compileProvider.urlSanitizationWhitelist(/^\s*(chrome|file):/);

へのリンクのみを開くようになりましchrome://path/filefile://path/file

4

1 に答える 1