2009-06-24 14 views
3

Je suis en train de recréer l'utilisation demo de Mozilla de JavaScript + <video> + <canvas> avec des fichiers qui ne sont pas hébergés sur un serveur.Comment contourner une violation de la même règle d'origine pour un fichier local à un autre?

Chargement mon document, la console d'erreur pour signaler cette erreur:

Error: uncaught exception: [Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "file:///media/disk/javascript/html5/chromakey/chromakey1.htm Line: 23"]

ligne est ici 23:

this.referenceImageData = this.bCtx.getImageData(0, 0, this.bufferCanvas.width, this.bufferCanvas.height); 

Il essaie d'obtenir les données d'image d'une toile à laquelle je l'ai déjà copié un image de la vidéo comme ceci:

this.bCtx.drawImage(this.inputElement, 
    0, 0, 
    this.inputElement.width, this.inputElement.height, 
    0, 0, 
    this.bufferCanvas.width, this.bufferCanvas.height 
); 

this.inputElement ref Ørences cet élément (assez ennuyeux):

<video id="MainInput" src="320x240.ogg" width="320" height="240"></video> 

Est-il possible de franchir cette erreur sans signer mon code avec un JAR?

Je pense que cela a à voir avec la même politique d'origine de Firefox (https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript) ayant un problème d'accès au fichier local, mais je ne peux pas savoir où aller à partir de là.

Répondre

1

Vous devez accéder au fichier de la même origine, et je pense que le protocole file: // est très restreint pour des raisons évidentes de sécurité.

Seules les extensions peuvent accéder à ces fichiers, avec plus de privilèges.

4

du système de fichiers, chaque fichier est dans une autre origine (cela empêche l'accès par exemple /etc/passwd -LET de dire en utilisant un XMLHttpRequest ou un iframe, puis transmettre des données à un serveur sur le Web en utilisant la chaîne de requête lors du chargement d'un <img> ou envoyer automatiquement un formulaire par javascript). Voir http://tools.ietf.org/html/draft-abarth-origin (il est question de "valeur définie par l'implémentation", et le plus simple est d'avoir une origine distincte par fichier)

La façon la plus simple de contourner votre problème est d'exécuter un serveur HTTP.

Il pourrait y avoir une solution à l'aide Firefox's "per-file permission" mais je ne suis pas sûr qu'il vaut vraiment la peine étant donné la pas cher, il est d'exécuter un serveur HTTP local ... (YMMV)

0

politique d'origine de Firefox pour l'accès aux fichiers peut être changé dans "about: config". Pour éliminer la même règle d'origine dans le fichier: URI, remplacez la valeur "true" security.fileuri.strict_origin_policy par false. Mozilla;about:config;origin_policy setting