Rafael Almeida
Feb 23, 2017 · 3 min read

Passagem de mensagens em plugins para o Google Chrome

O problema: duas janelas abertas lado a lado, pretendia-se passar o valor de uma input da janela 1 para outra input da janela 2 e posteriormente clicar no botão da janela 2.

Mas então, como é que é suposto conseguirmos isto?

Fácil! Com…

Passagem de mensagens em plugins para o Chrome

Neste post vou dar o exemplo em concreto para o plugin que construí, mas, penso que conseguirão usar para outros exemplos!

O meu ficheiro manifest.json tem o seguinte aspecto:

{
“name”: “Message passing”,
“version”: “1.0”,
“manifest_version”: 2,
“description”: “Passing text from one window to the other”,
“icons”: {
“16”: “img/icon-16.png”,
“128”: “img/icon-128.png”
},
“permissions”: [
“contextMenus”, “tabs”
],
“background”: {
“scripts”: [
“js/background.js”
]
},
“content_scripts”: [{
“matches”: [“https://urlHere/*"],
“js”: [“js/message.js”]
},
{
“matches”: [“https://urlHere/*"],
“js”: [“js/dom.js”]
}]
}

Vou focar-me apenas nos ficheiros background.js, message.js e dom.js.

O ficheiro background.js, segundo a documentação do Chrome, é onde devemos ter toda a lógica “pesada” do nosso plugin. Este tem o seguinte aspecto:

chrome.contextMenus.create({
‘title’: ‘Send message to other window’,
‘contexts’: [‘all’],
‘onclick’: onClickHandler
});
function onClickHandler(info) {
chrome.tabs.query({}, function(tabs) {
var message = {giveMeDom: “now”};
for (var i=0; i<tabs.length; ++i) {
try {
chrome.tabs.sendMessage(tabs[i].id, message, function(response) {
message = {value: response.response};
for (var i=0; i<tabs.length; ++i) {
chrome.tabs.sendMessage(tabs[i].id, message);
}
});
} catch(err){ }
}
});
}

Basicamente, o que estamos a fazer é o seguinte:

  • Mandamos uma mensagem para todas as Tabs abertas, uma vez que não sabemos em que Tab está injectado o ficheiro Javascript responsável por nos responder
  • Assim que os content scripts apanham a tentativa de envio de mensagem, o respectivo handler é ativado, tendo funções e comportamentos distintos nos dois scripts. Passo a explicar abaixo!

Passagem de mensagens em plugins para o Chrome, lembram-se? 🙂

O ficheiro dom.js vai ser “injectado” na página 1, podemos especificar isto no manifest.json, é neste ficheiro que, quando executo a função de enviar mensagem para a janela 2, no context menu, é responsável por ficar à escuta da mensagem e fica encarregue de mandar a resposta com o valor do input que pretendo. Este tem o seguinte aspecto:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if(message.giveMeDom == “now”) {
var val = document.getElementById(“elementIDHere”).value;
sendResponse({
response: val
});
}
});

O ficheiro message.js vai ser “injectado” na página 2 e, à semelhança do dom.js, também podemos especificar isto no manifest.json, este é o ficheiro que, quando quando a mensagem é enviada, é responsável por ficar à escuta da mensagem e fica encarregue de colocar no input o respectivo valor e, posteriormente, clicar no botão. Este tem o seguinte aspecto:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
document.getElementById(“txbcampaignid”).value = message.value;
document.getElementById(“btnfind”).click();
});

Podemos, desta forma, passar mensagens entre ficheiros que constituem a extensão para extender as funcionalidades do browser.

Na documentação oficial, podemos ficar a saber mais sobre como extender a passagem de mensagens em plugins para o Chrome.

Rafael Almeida

Written by

Hey! I write about several stuff, mostly technical or software development related, often switching from Portuguese to English. Doing stuff at @swordhealth

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade