Ошибка порта: не удалось установить соединение. Приемного конца не существует. В Chromiume

Я разрабатываю расширение в Chrome, и возникает проблема. В моем inject.js я делаю запрос типа:

chrome.extension.sendRequest({command:'skip'},callback)

, а в моем `background.js я просто добавляю прослушиватель запросов, например:

chrome.extension.onrequest.addListener(function(req,sender,res){console.log("procession"})

Но есть ошибка:

Ошибка порта: Не удалось установить соединение. Конец приема не существует

Кажется ошибка в хроме? PS:
часть моего manifest.json

"background": {
    "scripts": ["background.js"]
  },
  "content_scripts": [
    {
      "matches": ["&lt all_urls &gt"], 
      "js": ["inject.js"]
    }
  ],

Я использую Chromium 17, и я попытался перезагрузить расширение, повторно открыв браузер ... ничего не произошло
у кого-нибудь есть идеи?

52
задан Benjamin 7 December 2013 в 08:28
поделиться

1 ответ

Некоторые из других ответов здесь имеют хороший совет отладки или маленькие части загадки, однако если Вы хотите ввести в (третью сторону) веб-страницы как я, затем никакие ответы здесь не перечислили корректные компоненты.

существует 4 шага:

  • внешний второстепенный слушатель,
  • приоритетный отправитель сообщения,
  • вводящий дополнительный идентификатор для отправителя сообщения
  • и правило в декларации для соединения всего.

пример ниже должен быть всем, что необходимо позволить Вам вводить js, который отправляет сообщения от любой страницы на google.com к Вашему собственному расширению

Сначала в manifest.json, необходимо добавить обменивающиеся сообщениями правила, которые являются описаны здесь :

"externally_connectable": {
    "matches": ["*://*.google.com/*"]
}

Затем в Вашем фоновый сценарий или страница, Вам нужно внешний слушатель ( Не регулярный chrome.runtime.onMessage.addListener, который был упомянут в ответах msot) , это описано здесь :

chrome.runtime.onMessageExternal.addListener( (request, sender, sendResponse) => {
    console.log("Received message from " + sender + ": ", request);
    sendResponse({ received: true }); //respond however you like
});

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

chrome.runtime.sendMessage(myExtId, { /* whatever you want to send goes here */ },
    response => {
         /* handle the response from background here */
    }
);

, Если Вы не знаете, как получить внешний идентификатор, который я использовал в качестве первого параметрического усилителя, Вы можете вводить свой дополнительный идентификатор как ниже. Это требуется потому что chrome.runtime.id и @@ extension_id оба сбоя для работы во введенных сценариях:

//create a script tag to inject, then set a variable with the id in that script
let idScript = document.createElement("script");
idScript.setAttribute("type", "application/javascript");
idScript.textContent = 'var myExtId = "' + chrome.runtime.id +'";';
let parent = ( document.head || document.documentElement );
parent.insertBefore( idScript, parent.firstChild );

//inject and run your other script here

idScript.remove(); //then cleanup 

, поскольку мы устанавливаем его как var, другой сценарий может непосредственно получить доступ к значению теперь

0
ответ дан 7 November 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: