No recente evento “all hands” da Mozilla no Havaí, eu me propus a criar minha primeira extensão da Web; eu queria que a extensão fosse útil, mas simples, algo com um caso de uso real. No final, criei uma extensão da Web muito simples que monitora continuamente o document.title para substituir palavras obscenas por asteriscos, uma medida de segurança para evitar constrangimento ao compartilhar sua tela ou ter pessoas olhando por cima do seu ombro. Deixe-me mostrar ao senhor como é simples criar uma extensão básica da Web!
Estrutura da extensão
A extensão deve estar contida em um único diretório – é assim que recomendo que a extensão simples seja estruturada:
+ foulmouth-filter // (name of your plugin here)
+ icons
- 48.png
- filter.js
- manifest.json
Todos os nomes de arquivos e subdiretórios podem ser nomeados como o senhor quiser, com exceção de manifest.json; esse é um nome de arquivo padrão que deve estar na raiz da extensão. Quanto mais complexa for a extensão, mais arquivos e estrutura provavelmente serão necessários.
manifest.json
O manifest.json contém todas as propriedades da extensão, inclusive imagens, título, descrição, permissões solicitadas, quais scripts devem ser executados em quais nomes de host e muito mais. A seguir, o manifesto muito simples que usei para minha extensão:
{
"manifest_version": 2,
"name": "Foulmouth Filter",
"version": "0.1",
"icons": {
"48": "icons/48.png"
},
"description": "Filters out filthy words from document titles",
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["filter.js"]
}
]
}
O content_scripts é importante, pois lista os arquivos JavaScript a serem incluídos em quais nomes de host. Para essa simples extensão da Web, quero que ela seja carregada em todos os nomes de host, e a parte principal da extensão ficará em filter.js.
filter.js
O filter.js contém toda a lógica da extensão da Web. O código a seguir pesquisa o arquivo document.title em busca de palavras ruins e as substitui por asteriscos:
// Google's bad word filter:
// https://gist.githubusercontent.com/jamiew/1112488/raw/7ca9b1669e1c24b27c66174762cb04e14cf05aa7/google_twunter_lol
let badWords = "w3schools|david|walsh|jquery.....".split('|') // loool
// Runs cleanup on the document title
let cleanup = word => {
document.title = document.title.split(' ').map(word => {
return badWords.indexOf(word.toLowerCase()) != -1 ? '*'.repeat(word.length) : word
}).join(' ')
}
// Set up a mutation observer to listen for title changes
// Will fire if framework AJAX stuff switches page title
let createObserver = function() {
let observer = new MutationObserver((mutations) => {
// Disconnect the MO so there isn't an infinite title update loop
// Run title cleanup again
// Create a new MO to listen for more changes
console.log('Mutations!', mutations)
observer.disconnect()
observer = null
cleanup()
createObserver()
})
observer.observe(
document.querySelector('title'),
{ subtree: true, characterData: true, childList: true }
)
}
createObserver()
// Kick off initial page load check
cleanup()
Observação: Os senhores perceberão que tentei usar o API MutationObserver para ouvir com eficiência as alterações no document.title mas o uso de um MutationObserver fez com que o navegador travasse, portanto, precisarei pesquisar mais sobre como evitar isso — setInterval é, infelizmente, o caminho de menor resistência. Estou confiante de que meu uso do MutationObserver é o problema, e não um problema do navegador.
Instalando a extensão da Web para teste
Para instalar e testar a extensão da Web no Chrome:
- Abrir
Chrome > Preferences - Clique no botão
Extensionsaba - Clique em
Load Unpacked Extension, navegue até seu diretório de extensão e clique emSelect
Para instalar e testar a extensão da Web no Firefox:
- Navegue até
about:debugging - Selecione o
Add-onsguia - Clique em
Load Temporary Add-on, navegue até seu diretório de extensão e selecione qualquer arquivo dentro do diretório de extensão


A extensão será carregada em cada navegador e em cada nova guia do document.title de cada nova guia será verificada quanto a palavrões. Cada navegador tem regras diferentes para o tempo em que a extensão descompactada ficará ativa, portanto, se o senhor encerrar uma sessão, talvez seja necessário ativar a extensão local novamente. O senhor pode saber mais sobre como publicar sua extensão da Web aqui.
Ideias para aprimoramento
Aqui estão algumas adições que tornariam essa extensão ainda mais incrível:
- Capacidade de adicionar palavras personalizadas, não apenas palavras ruins do Google (para usuários, não para o desenvolvedor que está criando a extensão)
- Capacidade de ativar e desativar a extensão rapidamente, de modo que o senhor só filtre palavras quando estiver no horário de trabalho, por exemplo
- Publique-a nos diretórios de complementos do Chrome e do Firefox!
Recursos
O melhor recurso para aprender tudo o que há para saber sobre extensões da Web é a MDN. A extensão da Web que criamos aqui é muito simples e não toca em nenhuma permissão ou APIs de extensão interna avançada, portanto, certifique-se de ler esta página para obter uma visão geral completa, do início ao fim, para criar extensões da Web completas e avançadas.
Aí está: as extensões da Web não são tão complicadas ou intimidadoras como costumavam ser. Essa extensão levou cerca de 30 minutos para ser criada, portanto, se o senhor tiver alguns minutos livres, experimente a criação de extensões da Web. O senhor ficará surpreso com o fato de os complementos para vários navegadores terem se tornado tão fáceis de criar!
Como criar um RetroPie no Raspberry Pi – Guia gráfico
Hoje em dia, podemos jogar jogos incríveis em nossos consoles de jogos superpotentes, PCs, headsets de RV e até mesmo em dispositivos móveis. Embora eu goste de jogar novos jogos hoje em dia, tenho saudades dos sistemas de jogos retrô que eu tinha quando era criança: o Nintendo original…
Ser um pai desenvolvedor
Todos os dias me fazem muitas perguntas, mas sempre me surpreendo com o fato de que raramente são perguntas sobre código ou até mesmo sobre tecnologia – muitas das perguntas que recebo são mais sobre coisas não relacionadas a desenvolvimento, como como é o meu escritório, que software eu uso e, muitas vezes…

Criar um Acordeão Dojo Simples
Sejamos honestos: apesar de todos nós darmos risada do quanto os acordeões JavaScript se tornaram uma emoção barata na Web, eles continuam sendo um widget útil e eficaz. Muito conteúdo, pouco espaço. A biblioteca Dijit do Dojo fornece um método incrivelmente simples pelo qual o senhor pode…