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.