2012-01-16 21 views
20

¿Es posible verificar mediante programación si Chrome Sync está configurado en Google Chrome?Google Chrome Sync check si está habilitado a través de API/Extensión?

La razón por la que pregunto es que estoy codificando una extensión para Chrome que depende de Chrome Sync, y me gustaría verificar/informar al usuario si no está configurado.

Antes de publicar esta pregunta, verifiqué los lugares obvios (API de extensión de Chrome, StackExchange y Google), pero hasta ahora no he tenido suerte.

Si alguien tiene una idea/solución, agradecería la ayuda.

Saludos.

Respuesta

1

No he probado esto, es solo una idea. Al igual que usted, no he podido encontrar ninguna documentación.

Los documentos en https://developer.chrome.com/extensions/storage.html estado que:

Incluso si un usuario desactiva la sincronización, storage.sync seguirá funcionando. En este caso, se comportará de manera idéntica a storage.local.

Sin embargo, storage.sync y storage.local tienen diferentes QUOTA_BYTES límites; 102,400 y 5,242,880 respectivamente. De acuerdo con los documentos;

actualizaciones que podrían causar que se exceda este límite fallan inmediatamente y establecer runtime.lastError.

Entonces, ¿qué sucede si intentas establecer un objeto de, digamos, 200,000 bytes en storage.sync? Si la sincronización está habilitada, debería fallar, pero si la sincronización está deshabilitada y, por lo tanto, storage.sync se comporta como storage.local, ¿tendrá éxito? Si eso tiene éxito, entonces simplemente puede tratar de establecer un objeto muy grande en sincronización, verificar si tuvo éxito, luego eliminarlo, y determinar si la sincronización está habilitada en función de eso.

+0

Buena idea ... pero no funciona. El límite de tamaño se mantiene igual –

+1

Oye me gusta este =) No funciona, pero es muy inteligente! – Rudie

5

Google tiene una página para ver el estado de su cuenta sincronizada; la URL de esa página es https://www.google.com/settings/chrome/sync. Algo que puede hacer para ver si una cuenta está sincronizada es abrir esa página de estado usando conexiones de dominios cruzados que Google permite para extensiones (si ni siquiera devuelve el estado 200-OK no está sincronizado) y luego usa un poco de JavaScript para extraer la fecha de "Última sincronización" de esa página; después de eso solo guárdalo usando la API chrome.storage.sync y luego, unos segundos más tarde, comprueba nuevamente la fecha de "Última sincronización", si cambió, puedes estar 99% seguro sincronizado (o si quieres cubrir el caso de sincronizaciones lentas solo usa setInterval esperarlo).

Se puede utilizar el siguiente JavaScript para extraer la fecha:

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 primera vez que se guarda ese valor

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

Y la segunda vez que se debe comparar ambos valores añadiendo algo como esto:

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

Buena suerte.

+3

¿Qué sucede si el usuario se desconectó? –

+1

Verifica si el estado de la respuesta ajax es 200-OK, si hay alguna otra cosa (por ejemplo, 302-Redirect) el usuario se desconectó y no se puede sincronizar si no has iniciado sesión. –

+1

El navegador Chrome puede iniciar sesión, pero eso no significa que las cookies para ese usuario estén presentes ¿verdad? Actualmente estoy usando mi navegador Chrome sincronizado con la cuenta A, y estoy conectado a google.com usando la cuenta B. – WouterH

0

Una forma alternativa de encontrar si el servicio está sincronizado o no:

Get https://www.google.com/settings/chrome/sync?hl=en con el lenguaje establecido en en, y luego:

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); 
}); 

Tenga en cuenta que es posible que desee comprobar la última fecha de sincronización, que está .zU.EP lapso, tengo algo como esto:

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

Esta es la función que escribí para convertir eso a tiempo:

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

el mejor, pero funciona y da una idea.

0

Hay una solicitud de función activa que hice para esto:

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

Sin embargo, hasta que esto se lleva a cabo, no hay forma de saber. La sincronización puede estar habilitada para la cuenta, pero deshabilitada en una máquina en particular o deshabilitada solo para extensiones/aplicaciones.

0

Chrome ahora proporciona chrome.identity.getProfileUserInfo api. Puede usar esta API para verificar si el usuario está conectado a Chrome o no. Usted tendrá que añadir identity permiso en su manifest.json (a pesar de que no le pedirá el permiso del usuario para cualquier extra y creo que es porque no utilizan OAuth)

He aquí el fragmento de código:

manifest.json

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

página de fondo

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

Es posible que el usuario haya accedido a Chrome pero haya inhabilitado específicamente la sincronización, pero estos casos serán muy raros. Este es el método más cercano que pude encontrar.

Cuestiones relacionadas