As extensões do Chrome existem para que possamos criar coisas úteis que melhorem a experiência na navegação ou então nos facilite o acesso às informações das quais precisamos. Extensões como leitores de RSS e alertas de e-mail são as mais comuns.
Nesse artigo, eu vou explicar como criar uma extensão simples que faz o acesso à API do site forecast.io
Os arquivos desse artigo estão disponíveis no meu Github no endereço.
Começando a Chrome extension
Primeiro de tudo, é importante preparar o ambiente para a chrome extension. O arquivo manifest.json é onde ficam as informações básicas para o Chrome carregar a extensão.
Abaixo está o arquivo manifest.json, usado para o projeto.
{
"manifest_version": 2,
"name": "Forecast.io",
"description": "Aqui vai a descrição da sua extensão",
"version": "1.0",
"browser_action": {
"default_icon": "clear-day.png",
"default_popup": "popup.html"
},
"permissions": [
"geolocation",
"alarms",
"<all_urls>"
],
"background": {
"scripts": ["background.js"],
"persistent": false
}
}
Onde:
- manifest_version = Sempre deve ser deixado o valor 2
- name = Nome da sua extensão
- description = Descrição da extensão
- version = Seu controle de versão, posteriormente deverá ser atribuído um novo valor a cada nova versão
- browser_action = Definições do botão de ação que fica na barra de ferramentas
- permissions = Quais permissões serão necessárias para a extensão funcionar
- background = Definições dos arquivos que rodarão em background
As permissões que foram definidas são geolocation, alarms e <all_urls>. A permissão de geolocation possibilita a utilização da API de geolocalização sem que seja necessário solicitar a aprovação do usuário, pois ao instalar a extensão, ele concorda com esse funcionalidade.
A permissão de alarms possibilita a utilização da API chrome.alarms, que é responsável por agendar a execução tarefas na Chrome extension.
A permissão <all_urls> solicita acesso à todas as URL para a Chrome extension. Esse tipo de permissão deve ser usado com moderação, o melhor nesse caso é definir quais urls são autorizadas. Ex: “http://*.google.com/”, você pode conferir os padrões de URL no link https://developer.chrome.com/extensions/match_patterns.
Serviço de background
O serviço de background é onde está toda a programação que busca os dados da API.
O arquivo background.js possui a chave da API, as funções de geo localização e de acesso ao JSON da API e os listeners da Chrome extension.
Abaixo está o arquivo background.js:
var APIKEY = '6ee8de3e1a315894761e9006065cffde';
var latitude = 0;
var longitude = 0;
var lastResult = null;
function getLocation(callback) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition, showError);
}
if (callback) {
callback();
}
}
function showPosition(position) {
latitude = position.coords.latitude;
longitude = position.coords.longitude;
getJSON('https://api.forecast.io/forecast/' + APIKEY + '/' +
latitude + ',' + longitude + '?units=si&lang=pt&exclude=minutely,hourly,daily,alerts,flags',
function(result) {
chrome.browserAction.setIcon({
path: "/" + result.currently.icon + ".png"
});
lastResult = result;
});
}
function getJSON(url, callback) {
var x = new XMLHttpRequest();
x.open('GET', url);
x.responseType = 'json';
x.onload = function() {
callback(x.response);
};
x.send();
}
function showError(error) {
var statusDiv = document.getElementById("status");
switch(error.code) {
case error.PERMISSION_DENIED:
console.log("Usered the request for Geolocation.");
break;
case error.POSITION_UNAVAILABLE:
console.log("Locationrmation is unavailable.");
break;
case error.TIMEOUT:
console.log("Theest to get user location timed out.");
break;
case error.UNKNOWN_ERROR:
console.log("Anown error occurred.");
break;
}
}
chrome.runtime.onInstalled.addListener(function() {
chrome.alarms.create("forecast", {
delayInMinutes: 0,
periodInMinutes: 10
});
});
chrome.alarms.onAlarm.addListener(function( alarm ) {
getLocation();
});
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.action == "getCurrentForecast") {
getLocation(function() {
sendResponse(lastResult);
});
}
});
Nesse arquivo temos alguns listeners que são detalhados abaixo:
onInstalled
Executado quando a extensão é instalada, atualizada ou quando o Chrome é atualizado. Neste listener criamos um alarme para ser executado a cada 10 minutos.
onAlarm
Executado quando um alarme atinge o tempo definido. Neste momento, fazemos uma chamada à função getLocation() que é a responsável por obter a geo localização.
Após encontrar a posição, a função showPosition() é chamada para atualizar o ícone da extensão para o clima atual.
onMessage
Executado quando recebe uma mensagem da popup. Para esta extensão, quando clicamos no ícone, apresentamos um popup que apresenta uma imagem do clima atual, a descrição e a temperatura.
Este fluxo vou explicar mais abaixo na seção do popup.
Popup
A popup é apresentada ao clicar no ícone da extensão. Toda a sua programação é feita utilizando HTML, CSS e Javascript, o que torna bem simples sua construção.
O arquivo popup.html tem um HTML bem simples, que possui uma imagem para o ícone do clima atual, um div para mostrar a descrição e outro div para a temperatura.
Arquivo popup.html abaixo:
<!doctype html> <html> <head> <meta charset="utf-8"> <script src="popup.js"></script> <link href="popup.css" rel="stylesheet"> </head> <body> <img id="ico" /> <div id="status">Carregando...</div> <div id="temperature"></div> </body> </html>
Arquivo popup.css abaixo:
body {
text-align: center;
width: 300px;
height: 300px;
font-size: 18pt;
font-family: Tahoma;
vertical-align: middle;
}
#ico {
display: none;
margin: 0 auto;
}
#temperature {
display: none;
font-size: 26pt;
}
Arquivo popup.js abaixo:
function sendMessage() {
chrome.runtime.sendMessage({action: "getCurrentForecast"}, function(response) {
if (response == null) {
setTimeout(sendMessage, 2000);
} else {
showResult(response);
}
});
}
function showResult(response) {
var statusDiv = document.getElementById("status");
var icoImg = document.getElementById("ico");
var temperatureDiv = document.getElementById("temperature");
statusDiv.textContent = response.currently.summary;
temperatureDiv.style.display = "block";
temperatureDiv.textContent = response.currently.temperature.toString().split('.')[0] + "˚C";
icoImg.style.display = "block";
icoImg.src = chrome.extension.getURL("/" + response.currently.icon + ".png");
}
document.addEventListener('DOMContentLoaded', sendMessage);
O listener que começa esse arquivo serve para saber quando a popup é solicitada pelo usuário.
Quando o popup é aberto, o chrome dispara o evento DOMContentLoaded e é nesse evento que enviamos a mensagem para o background solicitando os dados da última execução para podermos montar uma tela com as informações da temperatura.
Caso não consiga uma resposta (o que indica que ainda não conseguiu o retorno da API), a função espera 2 segundos para tentar novamente.
Caso a resposta esteja disponível, passamos para a função showResult apresentar o resultado na tela.
Instalação da Chrome extension
Para instalar a Chrome extension, você deve abrir o seu Chrome e digitar o endereço chrome://extension.
Será apresentada uma tela com as suas extensões, conforme abaixo:
Para habilitar o modo de desenvolvimento, você deve marcar a caixa Developer mode (no meu caso o Chrome está em inglês).
Agora você deve clicar no botão Load unpacked extension… (ou o equivalente no seu idioma).
Selecione a pasta da extensão onde estão os arquivos. Feito isso, sua extensão deve aparecer no browser e provavelmente já estará funcionando.
Conclusão
A extensão pode ser evoluída para apresentar alertas de temperatura a cada mudança, ou então você pode criar um histórico, ou até mesmo mostrar os dados de máxima e mínima para o dia.
Você pode evoluir a extensão como quiser – se fizer isso, coloque no Github e deixe o link nos comentários.
Caso tenha alguma dúvida ou sugestão, pode deixar seu comentário que eu responderei com prazer.






