1

J'ai une application AngularJS très simple que j'utilise pour tester la création d'une nouvelle extension Safari. Quand je l'exécute à partir de localhost dans une page Safari normale tout fonctionne, mais quand je cours le même code dans le contexte d'un prolongement d'extension ne fonctionne pas. J'ai passé du temps à tracer le code de routage angulaire dans les deux scénarios (ce qui est plutôt amusant) pour essayer de trouver des différences, mais je n'ai pas pu le faire sauf le chemin de redirection (http://localhost/.../helloworld.html#/login vs safari-extension://com.yourcompany.../helloworld.html#/login). Le fait de cliquer sur le chemin d'extension directement dans une fenêtre de navigateur rend la même chose que dans l'extension: la fonctionnalité de base AngularJS fonctionne (mise à jour de "sometext") mais pas de routage (la spécification d'itinéraire ne remplace pas ng-view). Aucune erreur n'est lancée.Le routage AngularJS ne fonctionne pas dans Safari Extension

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 
    } 
]); 

login.html

HERE I AM! 

MISE À JOUR:

Il a quelque chose à voir avec la demande XHR pour obtenir la page de routage - à partir d'une page Web régulière du XHR.send() retourne readyState = 4 et status = 200, à partir de l'extension, il renvoie readyState = 3 et status = 0 (quand il passe à readyState = 4 status est toujours 0). Il me fait suspecter des restrictions XMLHTTPRequest d'origine croisée mais il demande définitivement la page du même domaine exact (safari-extension: // ...)

AIDE! :-)

Répondre

0

Je réponds à ma propre question ici car il me semble que c'est comme ça que je vais devoir procéder, mais si quelqu'un a une meilleure idée, faites-le nous savoir.

J'ai piraté la bibliothèque de base AngularJS (ugh) pour retourner un état de 200 s'il y a une réponse à la requête sous la condition que le protocole de localisation soit "safari-extension" (sinon retourner 404). Les auteurs ont fait de même pour l'état du protocole étant "fichier", car il renvoie aussi toujours un statut 0 dans ce cas aussi, donc je ne me sens pas trop mal.

Je vais voir si je peux attirer l'attention de Google, que ce soit pour qu'ils puissent m'éclairer sur ce qui me manque ou peut-être pour qu'ils l'ajoutent dans un futur rev.

MISE À JOUR:

En regardant l'histoire de ce code dans le projet GitHub je vois qu'ils mis en œuvre le correctif identique que je vais proposer dans une version ultérieure de AngularJS. :-)

Questions connexes