6

Mam problem z uzyskaniem new Function do pracy w Web Worker. Mam stronę HTML, która spawns Web Worker. Ten pracownik sieci Web wykonuje kod przez new Function(str). Próbuję użyć tego w pakiecie aplikacji Chrome, która wymaga strony, która jest jawnie wymieniona jako strona piaskownicy w manifeście.Włączanie "nowej funkcji" w module Web Worker z CSP

Obecnie istnieją dwie opcje:

  • uwagi notować strony do piaskownicy. Jeśli to zrobię, mogę użyć new Function, ale nie mogę odrodzić pracownika sieci Web, ponieważ nie mogę wysyłać żadnych żądań (strona piaskownicy ma unikatowe pochodzenie). new Worker(...) wyrzuca SECURITY_ERR.
    • new Function działa w piaskownicy
    • new Worker zawodzi w piaskownicy ze względu na unikalną pochodzenia
  • Czy nie notować strony do piaskownicy. Jeśli to zrobię, mogę odrodzić pracownika sieci Web, ale pracownik nie może użyć new Function, ponieważ nie jest on piaskownicą. new Function(...) rzuca EvalError narzeka na korzystanie z niego.
    • new Function nie powiedzie się w non-piaskownicy z powodu bycia eval -jak
    • new Worker prace w non-piaskownicy

Moja CSP jest następujący:

sandbox allow-scripts script-src 'self' 'unsafe-eval'; object-src 'self' 

co mogę zrobić, aby uzyskać new Function pracę w Web Worker?

Odpowiedz

5

Istnieje technika zwana pracownikami liniowymi, sugerowałbym użycie tej metody.

  • Tworzenie obiektu blob, który zawiera kod źródłowy dla pracownika
  • przekonwertować go na „dataurl”
  • instancję pracownika z tego dataurl

ten jest opisany z przykładowym kodem na strona HTML5 rocks w ich WebWorkers tutorial. W ten sposób możesz umieścić witrynę jako piaskownicę, ale ponieważ nie ma potrzeby wykonywania zewnętrznych żądań, powinna również działać w trybie piaskownicy.

+0

Okazało się, że adresy URL 'data:' nie działają z powodu problemów o tym samym pochodzeniu, ale adresy URL 'createObjectURL' z obiektów typu blob (z artykułu) działają. Nie jest zbyt wygodne wstawianie całego skryptu roboczego na stronę główną, ale wydaje się, że jest to jedyny sposób na sprawne działanie. Dzięki. – pimvdb

+0

Och, widzę teraz, że użyłem URL danych zamiast adresu URL obiektu w odpowiedzi, przepraszam za to. Możesz zrobić krok konstrukcyjny, aby był bardziej wygodny. – molnarg