Могат ли/трябва ли 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 заобиколни решения. Очертах метода на петна по-горе, но можем да използваме и importScripts(). Ако не можете да модифицирате самия Worker, вероятно бихте могли да направите shell Worker, който просто имплементира Worker-а, който всъщност искате.

person JScott    schedule 25.08.2014