DEV Community

Beatriz813
Beatriz813

Posted on • Edited on

6 3

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.
😘 🌈

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

Top comments (0)

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay