Использование WebAssembly в расширении Chrome

У меня есть расширение Chrome, которое включает сложную функцию comp_func(data), которая требует много ресурсов процессора, выполняя множество побитовых операций. Из-за этого я пытаюсь использовать WebAssembly.

Я пробовал следовать нескольким руководствам, например это one и это one.

Первая ссылка говорит:

fetch('simple.wasm').then(response =>
  response.arrayBuffer()
).then(bytes =>
  WebAssembly.instantiate(bytes, importObject)
).then(results => {
  results.instance.exports.exported_func();
});

но я получаю сообщение об ошибке:

Uncaught (in promise) TypeError: WebAssembly Instantiation: Import #0 module = "env" error: module is not an object or function

Я много пробовал использовать этот подход, но он не работал. Я не могу понять, как использовать WebAssembly, загруженный из файла .wasm.

Итак, я попробовал более простой подход: Вторая ссылка говорит, что нужно поместить эту строку в html-файл:

<script src = "index.js"></script>

а затем просто используйте экспортированную функцию:

var result = _roll_dice();

НО, я в расширении, поэтому у меня есть только файл background.html. Итак, я ищу способ получить доступ к модулю, который был загружен в фоновом файле. И все становится сложнее, потому что функция comp_func(data) вызывается из Рабочий.

Вот что я пробовал до сих пор:

Если я позвоню chrome.extension.getBackgroundPage(), я могу получить доступ к модулю но я не могу отправить его Рабочему:

Failed to execute 'postMessage' on 'Worker': # could not be cloned.

И если я попробую сначала записать stringify:

Uncaught TypeError: Converting circular structure to JSON

(Я попытался разобрать его, не сработало ...)

И я не могу вызвать chrome.extension.getBackgroundPage() из Worker, потому что я не могу получить оттуда доступ к Chrome API.

Итак, мои вопросы:

  1. Кто-то устал загружать файл .wasm в расширении chrome, и он работал? Второй подход (загрузка файла js) звучит проще, но если у вас есть рабочий пример для этого подхода, это будет здорово.

или 2. как получить доступ к модулю, который был загружен в background.html (из второго примера)?

или 3. как передать нужные мне функции из js файла в Worker (через postMessage)?

Подводя итог, кто-то пытался использовать WebAssembly в расширении Chrome и выжил, чтобы сказать?

РЕДАКТИРОВАТЬ: В конце концов я отказался от подхода WebAssembly. Я также разместил этот вопрос на жуки-хром, и через несколько месяцев получил ответ. Не уверен, что это действительно работает, но, возможно, это, вместе с отмеченным ответом, кому-то поможет.

Я думаю, возможно, расширения еще не могут запускать wasm. Что касается части обмена сообщениями: 1) с помощью chrome API можно передавать только простые данные, то есть числа, строки, логические значения, массивы и объекты, которые состоят из таких простых данных, 2) Рабочие также могут передавать несколько конкретных типов, 3) функции не подлежат передаче.

wOxxOm 02.04.2018 14:55

Ты хоть представляешь, как я могу убедиться, что расширения не могут запускать wasm?

Nagmon 02.04.2018 15:11

Вы можете спросить на crbug.com и / или Chromium-Extensions-Объявление.

wOxxOm 02.04.2018 15:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
28
3
8 019
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Недавно я возился с WebAssembly и нашел способ заставить его работать. Вот файлы сценария:

main.js

chrome.browserAction.onClicked.addListener(function(tab) {
 chrome.tabs.executeScript(null, {file: "content_script.js"});
});

content_script.js

  var importObject = { imports: { imported_func: arg => console.info(arg) } };
  url = 'data:application/wasm;base64,' + "AGFzbQEAAAABCAJgAX8AYAAAAhkBB2ltcG9ydHMNaW1wb3J0ZWRfZnVuYwAAAwIBAQcRAQ1leHBvcnRlZF9mdW5jAAEKCAEGAEEqEAAL";
  WebAssembly.instantiateStreaming(fetch(url), importObject)
  .then(obj => obj.instance.exports.exported_func());

URL-адрес данных принадлежит общему образцу wasm учебника (simple.wasm), который записывает 42 на консоли.


PS. If it seems like cheating or bad practice to you, this content_script.js also works:
var importObject = {
   imports: {
    imported_func: function(arg) {
    console.info(arg);
    }
   }
 };

var response = null;
var bytes = null;
var results = null;


var wasmPath = chrome.runtime.getURL("simple.wasm");
fetch(wasmPath).then(response =>
    response.arrayBuffer()
    ).then(bytes =>
       WebAssembly.instantiate(bytes, importObject)
        ).then(results => {
        results.instance.exports.exported_func();
  });

Только если вы включите файлы кода в раздел web_accessible_resources в manifest.json, однако:

    ...
    "web_accessible_resources": [
     "content_script.js",
     "main.js",
     "simple.wasm"
    ],
    ...

Github: https://github.com/inflatablegrade/Extension-with-WASM

Другие вопросы по теме