DEV Community

Beatriz813
Beatriz813

Posted on • Edited on

Como criar uma extensão para contabilizar o tempo que você passa em páginas Web

  • O intuito deste tutorial é incentivar você que é iniciante, e que está sem ideias para criar projetos, a exercitar seus conhecimentos em Javascript. 💙

Obs.: Recomendo que você visite as documentações das tecnologias usadas.

O código deste projeto está disponível no github

Resultado da extensão

Tecnologias usadas

Explicando a ideia da extensão

A ideia é criar uma extensão para o Google Chrome visando contabilizar quanto tempo uma página Web (site) fica aberta em nossos navegadores. Vamos partir do princípio que o tempo passado em uma página Web deve ser contabilizado desde o momento em que ela é carregada/inicializada até o momento que mudamos para outro site dentro da mesma aba ou a fechamos.

O Código

Primeiro de tudo devemos criar o arquivo manifest.json, nele iremos declarar informações sobre a nossa extensão e também alguns arquivos que iremos utilizar.

 { "manifest_version": 2, "name": "Monitor de sites", "version": "0.0.1", "content_scripts": [ { "matches": [ "<all_urls>" ] } ], "background": { "scripts": ["background.js"], }, "permissions": [ "tabs" ], "browser_action": { "default_popup": "index.html", "default_icon": "work.png", "title": "Monitor de sites" } } 
Enter fullscreen mode Exit fullscreen mode

Irei explicar algumas propriedades desse arquivo que acho relevante saber para esse projeto. (Se quiser saber mais sobre o manifest.json acesse a documentação do google)

  • A propriedade background é onde definimos o nosso script principal que mantém todo o gerenciamento de tempo em cada aba.
  • A propriedade permissions serve para nos dar acesso a APIs que iremos utilizar na nossa extensão
  • A propriedade browser_action define como o icone da nossa extensão será mostrado no canto superior direito do navegador e também qual conteúdo será apresentado para o usuário quando clicado.

Arquivo background.js

Aqui temos acesso à API do chrome. Nele vamos "escutar" o objeto tabs, quando ele for atualizado e quando for fechado.

chrome.tabs.onUpdated.addListener(tabAtualizada) chrome.tabs.onRemoved.addListener(tabFechada) 
Enter fullscreen mode Exit fullscreen mode

A função de callback tabAtualizada recebe três parâmetros de entrada tabId, changeInfo, tab onde:

  • tabId é o id da tab atualizada
  • changeInfo contém informações sobre o status da aba (se ela ja carregou ou se está carregando)
  • Objeto tab que traz algumas informações referentes ao conteúdo carregado na aba.

Já a função de callback tabFechada traz apenas o id da aba fechada.

Na função tabAtualizada é preciso verificar se o status da página está como "complete" (se ela carregou) e também se a url da aba é diferente de "chrome://" pois o tempo em páginas referentes ao navegador não nos é interessante.
Para melhorar a visualização do algoritmo observe este fluxograma:

abrir aba

Já na função tabFechada seguiremos esta linha de pensamento:

fechar aba

Todo o tempo passado nos sites é guardado em um array no localStorage. Quando vamos no arquivo principal.js e recuperamos essas informações do localStorage, é preciso:

  • Criar um array com o nome dos sites acessados
for(dado of dadosNavegacao) { sites.push(dado.titulo) let temp = dado.tempo / 60000 temp = temp.toFixed(2) tempo.push(temp) } 
Enter fullscreen mode Exit fullscreen mode
  • Criar um array de cores de acordo com a quantidade de sites armazenados
for (let i = 0; i <= Math.ceil(sites.length/6); i++) { cores = [...cores, ...coresPadrao] coresBorda = [...coresBorda, ...coresBordaPadrao] } 
Enter fullscreen mode Exit fullscreen mode
  • Criar o gráfico
Chart.Bar('myChart', { data: { labels: sites, datasets: [{ label: 'Tempo nos Sites (em minutos)', data: tempo, backgroundColor: cores, borderColor: coresBorda, borderWidth: 1 }] }, options: { maintainAspectRatio: false, tooltips: {}, scales: { yAxes: [{ ticks: { beginAtZero: true } }], xAxes: [{ ticks: { display: false, beginAtZero: true } }] } } }) 
Enter fullscreen mode Exit fullscreen mode

Espero que este tutorial tenha incentivado e ajudado você a criar uma extensão para o Google Chrome.
😘 🌈

Top comments (0)