6

Il mio primo post qui =].Chrome extension setTimeout non funziona correttamente

Sto costruendo un'estensione chrome e sto utilizzando un setTimeout in modo ricorsivo. Ho notato che se l'ho impostato su fino a 13 secondi, funziona, ma se lo imposto su 14secs + non funzionerà.

Questo è un esempio che è sul mio background.js

function start() { 

    var timeout = setTimeout(function() { start(); }, 1000*15); 
    alert('test'); 
} 

chrome.webNavigation.onCompleted.addListener(function(o) { 

    start(); 

    }, { 
     url: [ 
     {urlContains: 'http://www.example.com/in.php'}, 
     {urlContains: 'http://www.example.com/out.php'} 
     ] 
    } 
); 

Se si riduce che timeout a 1000 * 13, funziona.

Questo è il mio manifest.json

{ 
    "name": "Extension", 
    "version": "0.0.7", 
    "manifest_version": 2, 
    "description": "Keeps proxy session alive", 
    "homepage_url": "http://www.example.com", 
    "icons": { 
    "16": "icons/icon16-on.png", 
    "48": "icons/icon48-on.png", 
    "128": "icons/icon128-on.png" 
    }, 
    "default_locale": "en", 
    "background": { 
    "scripts": [ 
     "src/bg/background.js" 
    ], 
    "persistent": false 
    }, 
    "browser_action": { 
    "default_icon": "icons/icon19.png", 
    "default_title": "Example - Off", 
    "default_popup": "" 
    }, 
"permissions": [ 
    "webNavigation", 
    "*://*/*", 
    "https://*/*" 
    ] 
} 

Qualche idea su che cosa potrebbe causare questa stranezza? Lo sto testando in modalità sviluppatore, BTW.

Grazie in anticipo!

EDIT

codice fisso:

manifest.json

ho aggiunto "allarmi" per i permessi

background.js

Aggiunto Thi s evento per ascoltare l'alarms.create:

chrome.alarms.onAlarm.addListener(function(alarm){ 
    start(); 
}); 

sostituito la funzione setTimeout con la linea sotto

chrome.alarms.create("Start", {periodInMinutes:1}); 

Spero che questo aiuti!

risposta

12

Sospetto che il problema potrebbe verificarsi con la sospensione automatica delle pagine degli eventi dopo un certo periodo di inattività. Sulla mia macchina, onSuspend sembra richiamare dopo ~ 10 secondi.

https://developer.chrome.com/extensions/event_pages#lifetime note

Una volta che la pagina dell'evento è stato inattivo un breve periodo di tempo (pochi secondi), l'evento runtime.onSuspend viene inviato. La pagina dell'evento ha ancora qualche secondi per gestire questo evento prima che venga scaricato forzatamente.

Quindi, che può farti più circa 13 secondi prima che la pagina venga effettivamente scaricato (dando un po 'di tempo di pulizia in onSuspend, mi sa). Quindi la tua pagina viene scaricata e il codice avviato da lì non viene più eseguito.

https://developer.chrome.com/extensions/event_pages#transition dice di utilizzare alarms api per le pagine degli eventi anziché setTimeout.

+0

Sì !! Spot on !! Molto bene! Voterò su questo una volta che avrò abbastanza reputazione. Grazie mille, amico. – badcom