Chrome расширение, как выставить пользовательский API на веб-страницу? - PullRequest
1 голос
/ 14 января 2020

Моему веб-приложению нужен доступ к UDP-сокетам, которые веб-интерфейс не поддерживает, предположительно из соображений безопасности. Я решил создать расширение chrome, которое пользователи должны установить для использования моего веб-приложения, конечно, делая это на свой страх и риск.

Идея состоит в том, чтобы мое расширение открывало пользовательские API-интерфейсы сокетов UDP с помощью добавление глобальной переменной, такой как myExtension.udpSockets, на веб-страницы. Веб-страница может проверить, что window.myExtension существует в первую очередь (расширение установлено), прежде чем пытаться получить доступ к моему API сокета UDP.

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

В настоящее время у меня есть код в скрипте содержимого, например,

function createUDPSocket() {
  // use chrome API
  console.log("Creating a UDP socket!");
}

Я знаю, что могу ввести JavaScript в веб-страницу, изменив DOM.

document.createElement("script");
// etc.

Но как я могу представить свой API на этой веб-странице? Они находятся в отдельных JS контекстах, так что это не сработает. Есть ли какой-то способ связи между ними?


Edt: Кажется, я ищу что-то похожее на exportFunction в Firefox расширениях .

1 Ответ

1 голос
/ 14 января 2020

В Chrome нет функции exportFunction / cloneInto, поэтому вам придется использовать элемент сценария DOM и обмен сообщениями.

Если вы предоставляете API только одному или нескольким URL-адресам, вы можете использовать безопасный расширение обмена сообщениями API через externally_connectable непосредственно к фоновому скрипту (он не может подключиться к скрипту контента). В противном случае для обмена сообщениями DOM я предлагаю использовать CustomEvent с уникальным или даже лучше со случайным идентификатором события, определенно не postMessage, чтобы никакой другой код не мог подслушивать ваш канал (при условии, что вы используете случайный идентификатор события, который может быть передан в Элемент сценария, когда он создан с использованием textContent, см. method 2 ).

При любом способе обмена сообщениями ваши данные должны быть JSON -совместимыми (число, строка, логическое значение, ноль и объекты /). массивы, состоящие из этих типов). Попытка отправить несовместимый объект, такой как функция или элемент DOM, или Map, или типизированный массив, может привести к тому, что все ваше сообщение будет нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...