Como uma extensão pode descobrir que está sendo executada pela primeira vez ou que acabou de ser atualizada, para que a extensão possa realizar algumas ações específicas? (por exemplo, abrir uma página de ajuda ou atualizar as configurações)
Como uma extensão pode descobrir que está sendo executada pela primeira vez ou que acabou de ser atualizada, para que a extensão possa realizar algumas ações específicas? (por exemplo, abrir uma página de ajuda ou atualizar as configurações)
Respostas:
Nas versões mais recentes do Chrome (desde o Chrome 22), você pode usar o chrome.runtime.onInstalled
evento, que é muito mais limpo.
Exemplo:
// Check whether new version is installed
chrome.runtime.onInstalled.addListener(function(details){
if(details.reason == "install"){
console.log("This is a first install!");
}else if(details.reason == "update"){
var thisVersion = chrome.runtime.getManifest().version;
console.log("Updated from " + details.previousVersion + " to " + thisVersion + "!");
}
});
Resposta atualizada para refletir a v3 do manifesto:
O Chromium agora tem um conjunto de APIs chrome.runtime , que permite que você busque a versão da extensão.
Para obter a versão atual:
chrome.runtime.getManifest().version
Para ouvir quando a extensão foi instalada pela primeira vez, quando a extensão é atualizada para uma nova versão e quando o Chromium é atualizado para uma nova versão, você pode usar o onInstalled
evento.
chrome.runtime.onInstalled.addListener((details) => {
const currentVersion = chrome.runtime.getManifest().version
const previousVersion = details.previousVersion
const reason = details.reason
console.log('Previous Version: ${previousVersion }')
console.log('Current Version: ${currentVersion }')
switch (reason) {
case 'install':
console.log('New User installed the extension.')
break;
case 'update':
console.log('User has updated their extension.')
break;
case 'chrome_update':
case 'shared_module_update':
default:
console.log('Other install events within the browser')
break;
}
})
Isso é tudo!
Resposta antiga, antes de 2011
Se você deseja verificar se a extensão foi instalada ou atualizada, você pode fazer algo assim:
function onInstall() {
console.log("Extension Installed");
}
function onUpdate() {
console.log("Extension Updated");
}
function getVersion() {
var details = chrome.app.getDetails();
return details.version;
}
// Check if the version has changed.
var currVersion = getVersion();
var prevVersion = localStorage['version']
if (currVersion != prevVersion) {
// Check if we just installed this extension.
if (typeof prevVersion == 'undefined') {
onInstall();
} else {
onUpdate();
}
localStorage['version'] = currVersion;
}
prevVersion == 'undefined'
... ele está verificando typeof prevVersion == 'undefined'
. É muito mais robusto para usar typeof
ao verificar se uma variável é indefinida ... veja aqui para saber o porquê: stackoverflow.com/a/3550319/130691
Felizmente, agora existem eventos para isso (desde a versão 22 do Chrome e 25 para eventos de atualização).
Para um evento instalado:
chrome.runtime.onInstalled.addListener(function() {...});
Para um evento OnUpdateAvailable:
chrome.runtime.onUpdateAvailable.addListener(function() {...});
Um trecho importante sobre OnUpdateAvailable da documentação do desenvolvedor diz:
Disparado quando uma atualização está disponível, mas não é instalado imediatamente porque o aplicativo está em execução. Se você não fizer nada, a atualização será instalada na próxima vez que a página de plano de fundo for descarregada. Se você quiser que ela seja instalada antes, chame o chrome.runtime.reload () explicitamente.
Simples. Quando a extensão é executada pela primeira vez, olocalStorage
está vazio. Na primeira execução, você pode escrever um sinalizador lá para marcar todas as execuções subsequentes como não primeiras.
Exemplo, em background.htm:
var first_run = false;
if (!localStorage['ran_before']) {
first_run = true;
localStorage['ran_before'] = '1';
}
if (first_run) alert('This is the first run!');
EDITAR: Para verificar se a extensão acabou de ser atualizada, armazene a versão em vez de um sinalizador simples na primeira execução, então, quando a versão da extensão atual (pegue XmlHttpRequest
no manifesto) não for igual à armazenada em localStorage
, a extensão foi foi atualizado.
localStorage
está de fato em sua própria janela separada e não é compartilhado com outro código e extensões na página como @huyz mencionou. Para extensões, no entanto, esse não é o caso.