Как обойти одно и то же нарушение политики происхождения для одного локального файла в другом?
Я пытаюсь воссоздать демонстрационное использование Mozilla JavaScript + <video>
+ <canvas>
с файлами, которые не размещены на сервере.
При загрузке моего документа консоль ошибок сообщает об этой ошибке:
Ошибка: необработанное исключение: [Исключение... "Ошибка безопасности" код: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "file:///media/disk/javascript/html5/chromakey/chromakey1.htm Строка: 23"]
Вот строка 23:
this.referenceImageData = this.bCtx.getImageData(0, 0, this.bufferCanvas.width, this.bufferCanvas.height);
Он пытается получить данные изображения с холста, на который я ранее скопировал кадр видео следующим образом:
this.bCtx.drawImage(this.inputElement,
0, 0,
this.inputElement.width, this.inputElement.height,
0, 0,
this.bufferCanvas.width, this.bufferCanvas.height
);
куда this.inputElement
ссылается на этот (довольно скучный) элемент:
<video id="MainInput" src="320x240.ogg" width="320" height="240"></video>
Есть ли способ обойти эту ошибку, не подписывая мой код с помощью JAR?
Я думаю, что это связано с той же самой политикой происхождения Firefox ( https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript), имеющей проблему с локальным доступом к файлам, но я не могу понять, куда идти дальше.
3 ответа
Из файловой системы каждый файл имеет различное происхождение (это предотвращает доступ, например, /etc/passwd
- скажем, используя XMLHttpRequest
или iframe
, а затем передать данные на некоторый сервер в Интернете, используя строку запроса при загрузке <img>
или автоматическая отправка формы через JavaScript). См. http://tools.ietf.org/html/draft-abarth-origin (здесь говорится о "значении, определяемом реализацией", и проще всего иметь отдельный источник для каждого файла)
Самый простой способ обойти вашу проблему - запустить HTTP-сервер.
Возможно, есть решение, использующее "разрешение на файл" в Firefox, но я не уверен, что оно действительно того стоит, учитывая, как дешево запускать локальный HTTP-сервер... (YMMV)
Исходную политику Firefox для доступа к файлам можно изменить в "about:config". Чтобы устранить ту же политику происхождения в файле: URI, измените "true" значение security.fileuri.strict_origin_policy на false. Mozilla; о:config; настройка origin_policy
Вам нужно получить доступ к файлу из того же источника, и я думаю, что протокол file:// очень ограничен по очевидным причинам безопасности.
Только расширения могут получить доступ к этим файлам с большими привилегиями.