History.replaceState не работает для приложений и плагинов XUL?

У меня есть объект браузера в моем приложении 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 frame:: chrome://myapp/content/index.html:::: строка 11"данные: нет]

Я пытался использовать Angularjs в элементе browser, но, поскольку он полагается на history.replaceState, он делает то, что должен делать, что не получается в приложении XUL.

[Обновить]

при установке типа элемента браузера на content-primary, location.replaceState не выдает исключение.

  <browser type="content-primary"
    src="chrome://myapp/content/index.html" flex="1"/>

[Обновить]

XMLHttpRequest проблема Статус возвращает 0 и угловые проверки для if(status... В Firefox при открытии файла с диска он по-прежнему возвращает статус 200, но не в XUL. Это приводит к тому, что шаблоны не загружаются.

Изменение возврата в isSuccess в угловом источнике на return (200 <= status && status < 300)||status===0; сейчас загружает шаблон.

[Обновить]

При нажатии на ссылку я вижу, что ссылка, как #/students/22 становится unsafe:chrome://myapp/content/index.html#/students/22 в итоге я узнал, что небезопасно - это не зарегистрированный протокол, это не проблема XUL. Чтобы добавить протокол chrome: // как доверенный в Angular, я сделал следующее в моем application.js:

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

Теперь он будет открывать только ссылки на chrome://path/file или же file://path/file

1 ответ

Тип установки browser элемент к content-primary Кажется, исправить ошибку location.replaceState.

Другие вопросы по тегам