sync_global_error.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_global_error.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/api/sync/profile_sync_service_observer.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_ui_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef GoogleServiceAuthError AuthError;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncGlobalError::SyncGlobalError(ProfileSyncService* service,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 SigninManager* signin)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(service),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signin_(signin) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(service_);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(signin_);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnStateChanged();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncGlobalError::~SyncGlobalError() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasBadge() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !menu_label_.empty();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasMenuItem() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When we're on Chrome OS we need to add a separate menu item to the wrench
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // menu to the show the error. On other platforms we can just reuse the
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Sign in to Chrome..." menu item to show the error.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !menu_label_.empty();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SyncGlobalError::MenuItemCommandID() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IDC_SHOW_SYNC_ERROR;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 SyncGlobalError::MenuItemLabel() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return menu_label_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::ExecuteMenuItem(Browser* browser) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (service_->GetAuthError().state() != AuthError::NONE) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(INFO) << "Signing out the user to fix a sync error.";
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(beng): seems like this could just call browser::AttemptUserExit().
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ExecuteCommand(browser, IDC_EXIT);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUIServiceFactory::GetForProfile(service_->profile())->ShowLoginUI(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasBubbleView() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !bubble_message_.empty() && !bubble_accept_label_.empty();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 SyncGlobalError::GetBubbleViewTitle() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_SYNC_ERROR_BUBBLE_VIEW_TITLE);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 SyncGlobalError::GetBubbleViewMessage() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bubble_message_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 SyncGlobalError::GetBubbleViewAcceptButtonLabel() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bubble_accept_label_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 SyncGlobalError::GetBubbleViewCancelButtonLabel() {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::OnBubbleViewDidClose(Browser* browser) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::BubbleViewAcceptButtonPressed(Browser* browser) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteMenuItem(browser);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::BubbleViewCancelButtonPressed(Browser* browser) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::OnStateChanged() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 menu_label;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 bubble_message;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 bubble_accept_label;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_ui_util::GetStatusLabelsForSyncGlobalError(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service_, *signin_, &menu_label, &bubble_message, &bubble_accept_label);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All the labels should be empty or all of them non-empty.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK((menu_label.empty() && bubble_message.empty() &&
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bubble_accept_label.empty()) ||
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (!menu_label.empty() && !bubble_message.empty() &&
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !bubble_accept_label.empty()));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (menu_label != menu_label_ || bubble_message != bubble_message_ ||
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bubble_accept_label != bubble_accept_label_) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_label_ = menu_label;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_message_ = bubble_message;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_accept_label_ = bubble_accept_label;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Profile can be NULL during tests.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = service_->profile();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (profile) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          profile)->NotifyErrorsChanged(this);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasCustomizedSyncMenuItem() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !menu_label_.empty();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
134