2012-01-16 2 views
20

Можно ли программно проверить, настроен ли Chrome Sync в Google Chrome?Проверка синхронизации Google Chrome, если включена через API/расширение?

Причина, по которой я спрашиваю, что я кодирую расширение для Chrome, которое зависит от Chrome Sync, и хотел бы проверить/проинформировать пользователя, если он не настроен.

Перед публикацией этого вопроса я проверил очевидные места (API расширения Chrome, StackExchange и Google), но до сих пор мне не повезло.

Если у кого-то есть идея/решение, я был бы признателен за помощь.

Cheers.

ответ

1

Я не проверял это, это всего лишь идея. Как и вы, я не смог найти никакой документации.

Документов в https://developer.chrome.com/extensions/storage.html состояния, что:

Даже если пользователь отключает синхронизацию, storage.sync все равно будут работать. В этом случае он будет вести себя одинаково с storage.local.

Однако storage.sync и storage.local имеют разные пределы QUOTA_BYTES; 102 400 и 5 242 880 соответственно. Согласно документам;

Обновления, которые могут привести к превышению этого предела, немедленно прекращаются и устанавливают runtime.lastError.

Итак, что произойдет, если вы попытаетесь установить объект, скажем, 200 000 байт в storage.sync? Если синхронизация включена, она должна выйти из строя, но если синхронизация отключена, и, следовательно, storage.sync ведет себя как storage.local, будет ли она успешной? Если это удастся, вы можете просто попытаться установить очень большой объект в синхронизацию, проверить, удалось ли это, затем удалить его и определить, включена ли синхронизация на основе этого.

+0

Хорошая идея ... но это не сработает. Ограничение по размеру остается неизменным –

+1

Oeh Мне нравится этот =) Это не работает, но это очень умно! – Rudie

5

У Google есть страница, чтобы просмотреть статус вашей синхронизированной учетной записи; URL этой страницы: https://www.google.com/settings/chrome/sync. Что-то, что вы можете сделать, чтобы увидеть, синхронизируется ли учетная запись, открывает эту страницу состояния с использованием междоменных подключений, которые Google разрешает для расширений (если он даже не возвращает статус 200-OK, не синхронизирован), а затем вы используете небольшой JavaScript для извлеките дату последней синхронизации с этой страницы; после этого просто сохраните его с помощью API chrome.storage.sync, а затем через несколько секунд снова проверьте дату «Последняя синхронизация», если она изменилась, вы можете быть уверены, что 99% синхронизировано (или если вы хотите закрыть случай медленной синхронизации, просто используйте setInterval, чтобы дождаться его).

Вы можете использовать следующий JavaScript для извлечения даты:

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

Первый раз, когда вы сохраните, что ценностные

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

и во второй раз, вы должны сравнить оба значение добавляющего что-то вроде этого:

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

Удачи.

+3

Что делать, если пользователь выходил из системы? –

+1

Вы проверяете, является ли статус ответа ajax 200-OK, если есть какая-либо другая вещь (например, 302-Redirect), пользователь выходил из системы, и вы не можете синхронизироваться, если вы не вошли в систему. –

+1

Браузер Chrome может войти в систему, но это не означает, что файлы cookie для этого пользователя присутствуют? В настоящее время я использую мой браузер Chrome, синхронизированный с использованием учетной записи A, и я вошел в систему на google.com с помощью учетной записи B. – WouterH

0

Альтернативный способ найти, если служба синхронизируется или нет:

Получить https://www.google.com/settings/chrome/sync?hl=en с языком, установленным в en, а затем:

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

Пожалуйста, обратите внимание, что вы можете проверить дату последней синхронизации, что это .zU.EP пядь, я получил что-то вроде этого:

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

Это функция, которую я написал, чтобы преобразовать, что время:

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

Может быть, не самое лучшее, но работает, и дает представление.

0

Существует активный запрос особенность, которую я сделал для этого:

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

Однако, пока это не будет реализован, нет никакого способа узнать. Синхронизация может быть включена для учетной записи, но отключена на определенном компьютере или отключена только для расширений/приложений.

0

В настоящее время Chrome предоставляет chrome.identity.getProfileUserInfo api. Вы можете использовать этот api, чтобы проверить, подписан ли пользователь на хром или нет. Вам нужно будет добавить identity разрешение в вашем manifest.json (хотя он не запрашивает у пользователя каких-либо дополнительных разрешения, и я думаю, что это потому, что мы на самом деле не использовать OAuth)

Вот фрагмент кода:

manifest.json

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

фона страницы

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

Возможно, что пользователь выполнил вход в хром, но специально отключил синхронизацию, но такие случаи будут очень редкими. Это самый близкий метод, который я мог найти.

Смежные вопросы