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/sync/profile_sync_service.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_ui_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_pages.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"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSyncGlobalError::SyncGlobalError(SyncErrorController* error_controller,
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 ProfileSyncService* profile_sync_service)
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : error_controller_(error_controller),
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      service_(profile_sync_service) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(service_);
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  error_controller_->AddObserver(this);
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GlobalErrorServiceFactory::GetForProfile(service_->profile())->
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AddGlobalError(this);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncGlobalError::~SyncGlobalError() {
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(!error_controller_)
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      << "SyncGlobalError::Shutdown() was not called";
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SyncGlobalError::Shutdown() {
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GlobalErrorServiceFactory::GetForProfile(service_->profile())->
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      RemoveGlobalError(this);
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  error_controller_->RemoveObserver(this);
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  error_controller_ = NULL;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasMenuItem() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !menu_label_.empty();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SyncGlobalError::MenuItemCommandID() {
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return IDC_SHOW_SYNC_ERROR;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::MenuItemLabel() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return menu_label_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::ExecuteMenuItem(Browser* browser) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoginUIService* login_ui = LoginUIServiceFactory::GetForProfile(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service_->profile());
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ui->current_login_ui()) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    login_ui->current_login_ui()->FocusUI();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Need to navigate to the settings page and display the UI.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ShowSettingsSubPage(browser, chrome::kSyncSetupSubPage);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasBubbleView() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !bubble_message_.empty() && !bubble_accept_label_.empty();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::GetBubbleViewTitle() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_SYNC_ERROR_BUBBLE_VIEW_TITLE);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<base::string16> SyncGlobalError::GetBubbleViewMessages() {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return std::vector<base::string16>(1, bubble_message_);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::GetBubbleViewAcceptButtonLabel() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bubble_accept_label_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::GetBubbleViewCancelButtonLabel() {
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::OnBubbleViewDidClose(Browser* browser) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::BubbleViewAcceptButtonPressed(Browser* browser) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteMenuItem(browser);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::BubbleViewCancelButtonPressed(Browser* browser) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SyncGlobalError::OnErrorChanged() {
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 menu_label;
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 bubble_message;
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 bubble_accept_label;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_ui_util::GetStatusLabelsForSyncGlobalError(
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      service_, &menu_label, &bubble_message, &bubble_accept_label);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All the labels should be empty or all of them non-empty.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK((menu_label.empty() && bubble_message.empty() &&
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bubble_accept_label.empty()) ||
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (!menu_label.empty() && !bubble_message.empty() &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !bubble_accept_label.empty()));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (menu_label != menu_label_ || bubble_message != bubble_message_ ||
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bubble_accept_label != bubble_accept_label_) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_label_ = menu_label;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_message_ = bubble_message;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_accept_label_ = bubble_accept_label;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Profile can be NULL during tests.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = service_->profile();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (profile) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          profile)->NotifyErrorsChanged(this);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
125