2012-01-16 18 views
20

È possibile controllare a livello di programmazione se Chrome Sync è configurato in Google Chrome?Controllo Google Chrome Sync se abilitato tramite API/Estensione?

La ragione per cui chiedo è che sto codificando un'estensione per Chrome che dipende da Chrome Sync e vorrei controllare/informare l'utente se non è configurato.

Prima di pubblicare questa domanda ho controllato i luoghi ovvi (API di Chrome Extension, StackExchange e Google), ma finora non ho avuto fortuna.

Se qualcuno ha un'idea/soluzione, apprezzerei l'aiuto.

Cheers.

risposta

1

Non ho provato questo, è solo un'idea. Come te, non sono stato in grado di trovare alcuna documentazione.

La documentazione a https://developer.chrome.com/extensions/storage.html stato che:

Anche se un utente disattiva la sincronizzazione, storage.sync continuerà a funzionare. In questo caso, si comporterà in modo identico a storage.local.

Tuttavia, storage.sync e storage.local hanno diversi QUOTA_BYTES limiti; 102.400 e 5.242.880 rispettivamente. Secondo i documenti;

Gli aggiornamenti che causano il superamento di questo limite vengono a mancare immediatamente e impostare runtime.lastError.

Quindi, cosa succede se si tenta di impostare un oggetto di, ad esempio, 200.000 byte in storage.sync? Se la sincronizzazione è abilitata, dovrebbe fallire, ma se la sincronizzazione è disabilitata e quindi storage.sync si comporta come storage.local, avrà successo? Se ciò accade, puoi semplicemente provare a impostare un oggetto molto grande in sincronizzazione, controllare se ha avuto successo, quindi rimuoverlo e determinare se la sincronizzazione è abilitata in base a ciò.

+0

Buona idea ... ma non funziona. Il limite dimensionale rimane lo stesso –

+1

Oeh mi piace questo =) Non funziona, ma è molto intelligente! – Rudie

5

Google ha una pagina per vedere lo stato del tuo account sincronizzato; l'URL di quella pagina è https://www.google.com/settings/chrome/sync. Qualcosa che puoi fare per vedere se un account è sincronizzato sta aprendo quella pagina di stato utilizzando le connessioni tra domini che Google consente di estensioni (se non restituisce nemmeno lo stato 200-OK non è sincronizzato) e quindi usi un piccolo JavaScript per estrarre la data "Ultima sincronizzazione" da quella pagina; dopo di ciò basta salvarlo usando l'API chrome.storage.sync e poi qualche secondo dopo ricontrollare la data di "Ultima sincronizzazione", se è cambiato allora puoi essere sicuro al 99% è sincronizzato (o se vuoi coprire il caso delle sincronizzazioni lente usa solo setInterval aspettarlo).

È possibile utilizzare il seguente JavaScript per estrarre la data:

NodeList.prototype.forEach = Array.prototype.forEach; 
var date = null; 
document.querySelectorAll("*").forEach(function(ele){ 
    var matches = ele.innerText.match(/\b\d{4}\s\d{2}:\d{2}:\d{2}\b.*/); 
    if (matches) date = matches[0]; 
}); 

La prima volta che si salva il valore

chrome.storage.sync.set({date: date}); 

E la seconda volta che si deve confrontare entrambi i valori aggiungendo qualcosa di simile a questo:

chrome.storage.sync.get("date", function (old) { 
    if (date !== old) { 
     // Is sync! 
    } else { 
     // not sync. 
    } 
}); 

Buona fortuna.

+3

Cosa succede se l'utente si è disconnesso? –

+1

Si controlla se lo stato della risposta ajax è 200-OK, se è qualsiasi altra cosa (ad esempio 302-Redirect) l'utente si è disconnesso e non è possibile essere sincronizzato se non si è effettuato il login. –

+1

Il browser Chrome può essere loggato, ma ciò non significa che i cookie per quell'utente siano presenti? Attualmente sto utilizzando il mio browser Chrome sincronizzato usando l'account A, e ho effettuato l'accesso a google.com tramite l'account B. – WouterH

0

modo alternativo per trovare se il servizio è sincronizzato o no:

Get https://www.google.com/settings/chrome/sync?hl=en con la lingua impostata en, e poi:

var is_sync = 0; 
NodeList.prototype.forEach = Array.prototype.forEach; 
document.querySelectorAll(".Tda.CP").forEach(function(ele){ 
    if(ele.innerHTML == 'Omnibox History') 
    is_sync = parseInt(ele.parentElement.querySelector('.FP.Uda').innerHTML); 
}); 

Si prega di notare che si consiglia di verificare la data dell'ultima sincronizzazione, che è .zU.EP arco, ho qualcosa di simile:

Last time synced on Wednesday, November 12, 2014 at 1:03:29 PM UTC+1

Questa è la funzione che ho scritto per convertire che in tanto:

last_sync = new Date(document.querySelector('.zU.EP').innerHTML.replace('Last time synced on ','').match(/.*\sat/)[0].replace(' at','')).getTime(); 
non

Forse il migliore, ma funziona, e dà un'idea.

0

C'è una richiesta di funzionalità attiva che ho fatto per questo:

https://code.google.com/p/chromium/issues/detail?id=361109

Tuttavia, fino a quando questo viene implementato, non c'è modo di dire. La sincronizzazione può essere abilitata per l'account, ma disabilitata su una particolare macchina o disabilitata solo per le estensioni/app.

0

Chrome ora fornisce chrome.identity.getProfileUserInfo api. È possibile utilizzare questa API per controllare se l'utente è iscritto in Chrome o meno. Sarà necessario aggiungere identity il permesso nel vostro manifest.json (anche se non chiederà all'utente alcuna autorizzazione in più e credo che sia perché non abbiamo effettivamente utilizzare OAuth)

Ecco il frammento di codice:

manifest.json

.... 
"permissions": [ 
    "identity" 
] 
.... 

sfondo della pagina

chrome.identity.getProfileUserInfo(function(data) { 
    if (data.id) { 
     alert("User is signed in to chrome!"); 
    } 
    else 
    { 
     alert("User is not signed in to chrome."); 
    } 
}); 

È possibile che l'utente abbia eseguito l'accesso a Chrome ma abbia disattivato la sincronizzazione in modo specifico, ma tali casi saranno molto rari. Questo è il metodo più vicino che potrei trovare.

Problemi correlati