Могут ли/должны ли веб-воркеры HTML5 использовать CORS для перекрестного происхождения?

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

Мой сервер настроен с соответствующими заголовками CORS для доставки рабочих файлов JS и может быть получен с помощью объекта XMLHttpRequest. Однако, когда URL-адрес передается new Worker(), он не строится, ссылаясь на источник проблемы. Похоже, это проблема как в Firefox, так и в Chrome. Проверьте это сами и мой обходной путь здесь: http://jsfiddle.net/5ag42hb1/11/

Разве это не странное поведение? Документы Mozilla говорят, что веб-воркеры должны подчиняться политике одинакового происхождения и использовать CORS для обеспечения доступа между источниками.

У скрипки есть обходной путь: сохранить файл в большом двоичном объекте и вместо этого передать его работнику. Однако это кажется менее чем идеальным, поскольку вносит много ненужной сложности. Может ли кто-нибудь придумать более чистое решение? Есть ли хороший канал для правильной реализации этого?


person JScott    schedule 23.08.2014    source источник
comment
Так что же должно произойти в вашей скрипке? Я получаю 2 успешных сообщения.   -  person spender    schedule 23.08.2014
comment
3 успешных сообщения. Он отлично получает его с помощью AJAX, и если вы передаете его как большой двоичный объект, он работает, но если вы передаете URL-адрес рабочему процессу, он, похоже, игнорирует CORS и терпит неудачу. Я хотел отдельную скрипку для обходного пути, но у меня недостаточно репутации, поэтому я втиснул все это в одну.   -  person JScott    schedule 24.08.2014


Ответы (1)


Я много копался и спрашивал на IRC-каналах. Я получил довольно хорошие ответы благодаря ребятам из #developers в сети Mozilla. Надеюсь, это поможет любому в той же ситуации, что и я.

Подводя итог, спецификация HTML указывает, что запуск new Worker('http://remoteorigin.com/worker.js') должен выполнять рабочий процесс с контекстом безопасности удаленного источника. Что-то похожее на CORS, но не совсем потому, что это права на выполнение, а не на чтение.

Так почему же сейчас это не так? Потому что браузеры еще не реализовали полную спецификацию. Считайте это чем-то, чего можно с нетерпением ждать.

До тех пор на самом деле есть 2 обходных пути. Я описал метод blob выше, но мы также можем использовать importScripts(). Если вы не можете изменить сам Worker, вы, вероятно, могли бы создать Worker оболочки, который просто реализует Worker, который вам действительно нужен.

person JScott    schedule 25.08.2014