Маршрутизация AngularJS не работает в расширении Safari

У меня есть очень простое приложение AngularJS, которое я использую для тестирования создания нового расширения Safari. Когда я запускаю его с локального хоста на обычной странице Safari, все работает, но когда я запускаю тот же код в контексте расширения, маршрутизация не работает.

Я потратил некоторое время на отслеживание кода маршрутизации Angular в обоих сценариях (что довольно забавно), чтобы попытаться найти различия, но не смог, кроме пути перенаправления (http://localhost/.../helloworld.html#/login против safari-extension://com.yourcompany.../helloworld.html#/login). Нажатие на путь расширения непосредственно в окне браузера отображает то же самое, что я вижу в расширении: основные функции AngularJS работают (обновление «sometext»), но маршрутизация — нет (спецификация маршрута не заменяет ng-view). Никакие ошибки не вылетают.

helloworld.html

<!DOCTYPE html>
<html ng-app="obApp">
<head>
  <title>Hello World, AngularJS</title>
  <script type="text/javascript" src="angular.js"></script> 
  <script type="text/javascript" src="angular-route.js"></script> 
  <script type="text/javascript" src="app.js"></script> 
  <script type="text/javascript" src="controllers.js"></script> 
</head>
<body>
  Write some text in textbox:
  <input type="text" ng-model="sometext" />

  <h1>Hello {{ sometext }}</h1>

  <div ng-view></div>
</body>
</html>

app.js

var obApp = angular.module('obApp', ['ngRoute', 'obControllers']);

obApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
        when('/login', {
            templateUrl: 'login.html',
            controller: 'LoginCtrl'
        }).
        otherwise({
            redirectTo: '/login'
        });
}]);

controllers.js

var obControllers = angular.module('obControllers', []);

obControllers.controller('LoginCtrl', ['$scope',
    function($scope) {
        // do stuff
    }
]);

логин.html

HERE I AM!

ОБНОВЛЕНИЕ:

Это как-то связано с запросом XHR для получения страницы маршрутизации - с обычной веб-страницы XHR.send() возвращает readyState=4 и status=200, из расширения он возвращает readyState=3 и status=0 (когда он переходит в состояние readyState=4, статус по-прежнему равен 0). Это заставляет меня подозревать ограничения XMLHTTPRequest из разных источников, но он определенно запрашивает страницу из того же домена (safari-extension://...)

ПОМОЩЬ! :-)


person Abe Hendlish    schedule 29.06.2014    source источник


Ответы (1)


Я отвечаю на свой вопрос здесь, потому что похоже, что мне нужно действовать именно так, но если у кого-то есть идея получше, сообщите нам об этом.

Я взломал базовую библиотеку AngularJS (тьфу), чтобы возвращать статус 200, если есть ответ на запрос при условии, что протокол определения местоположения является «расширением Safari» (в противном случае возвращается 404). Авторы сделали то же самое для условия, что протокол является «файлом», потому что он также всегда возвращает статус 0 и в этом случае, так что я не чувствую себя слишком плохо.

Я посмотрю, смогу ли я привлечь к этому внимание Google, либо чтобы они могли просветить меня относительно того, что мне не хватает, либо, возможно, чтобы они добавили это в будущей версии.

ОБНОВЛЕНИЕ:

Глядя на историю этого кода в проекте GitHub, я вижу, что они реализовали то же самое исправление, которое я собирался предложить в более поздней версии AngularJS. :-)

person Abe Hendlish    schedule 30.06.2014