0

크롬 확장 개발을 처음 사용했습니다. 나는 튜토리얼을 따라 갔고 나중에는 extension으로 게임을했다. 이 확장 프로그램을 저에게 괴롭히는 무언가가 있습니다.크롬 확장 개발에서 선택된 탭으로의 통신 제한

단계 재현 :

  • 은 옆에 두 페이지 측면의 DevTools로를 열
  • 은 GitHub의 페이지에 언급 된 단계를 수행합니다.
  • 패널의 '삽입 버튼을 클릭하여 페이지에서 devtools로 메시지를 보내려면'버튼을 클릭하면 Html 페이지가 변경되었음을 알 수 있습니다.
  • 페이지에 표시된 버튼을 클릭하십시오. 두 패널 모두에서 버튼/텍스트가 변경되었음을 알 수 있습니다.

제한을 두거나 클릭 한 페이지의 버튼/텍스트 만 변경하는 필터가 있습니까? background.js 페이지의 port.postMessage(message); 때문에이 문제가 발생했다는 것을 알고 있습니다.

나는 this을 찾았지만 제대로 작동하지 못했습니다.

어떤 도움을 주시면 감사하겠습니다 :)

+2

코드는 * 세 *의 onMessage 리스너를 추가 chrome.extension.onMessage를 대신하는 실제적이고 선호되는 API. 세 개의 수신기 중 두 개는 devtools 패널에 메시지를 보내고 두 개의 수신기는 탭의 메시지에 의해 트리거됩니다. 코드를 다시 작성하십시오. – wOxxOm

+0

@wOxxOm 제안에 감사드립니다. 이 글을 처음 접했을 때 좀 더 힌트를 주시겠습니까? 코드는 저에게 쓰여진 것이 아니라 단지 사용하고있는 예제/참고서 일뿐입니다. – stafan

+0

나는 그것이 어떻게 끝났는지 싫어하기 때문에 그것을 다시 써야 할 것이다. [메시징 설명서] (https://developer.chrome.com/extensions/messaging)를 읽으셨습니까? 구현은 간단합니다. – wOxxOm

답변

2

통신 방식은 간단하다 :

  1. 당신의 DevTools로 패널은 배경 페이지
  2. 배경 페이지가 해당 포트에서 수신
  3. 과에 포트를 엽니 다 TabId - 포트 매핑의 조회 테이블을 저장합니다.
  4. 배경 페이지는 콘텐츠 스크립트의 메시지를 수신하고 위의 조회 테이블을 사용하여 메시지를 chrome.runtime.onMessage는이 때문에

DevTools로 - panel.js 포트 채널을 대응

var port = chrome.runtime.connect(); 

port.onMessage.addListener(message => { 
    $id('insertmessagebutton').innerHTML = message.content; 
}); 

$id('executescript').onclick =() => 
    runContentScript({code: "console.log('Content script executed')"}); 

$id('insertscript').onclick =() => 
    runContentScript({file: "inserted-script.js"}); 

$id('insertmessagebutton').onclick =() => { 
    runContentScript({code: "document.body.innerHTML='<button>Send to panel</button>'"}); 
    runContentScript({file: "messageback-script.js"}); 
}; 

function runContentScript(params) { 
    port.postMessage(
     Object.assign({ 
      tabId: chrome.devtools.inspectedWindow.tabId, 
     }, params) 
    ); 
} 

function $id(id) { 
    return document.getElementById(id); 
} 

background.js

var tabPorts = {}; 

chrome.runtime.onConnect.addListener(port => { 
    let tabId; 
    port.onMessage.addListener(message => { 
     if (!tabId) { 
      // this is a first message from devtools so let's set the tabId-port mapping 
      tabId = message.tabId; 
      tabPorts[tabId] = port; 
     } 
     if (message.code || message.file) { 
      delete message.tabId; 
      chrome.tabs.executeScript(tabId, message); 
     } 
    }); 
    port.onDisconnect.addListener(() => { 
     delete tabPorts[tabId]; 
    }); 
}); 

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 
    const port = sender.tab && tabPorts[sender.tab.id]; 
    if (port) { 
     port.postMessage(message); 
    } 
}); 

chrome.tabs.onRemoved.addListener(tabId => { 
    delete tabPorts[tabId]; 
}); 

chrome.tabs.onReplaced.addListener((newTabId, oldTabId) => { 
    delete tabPorts[oldTabId]; 
}); 
관련 문제