1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/signin_error_notifier_ash.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shell.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shell_delegate.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/system_notifier.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string16.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/browser_process.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/notifications/notification.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/notifications/notification_delegate.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/ash/multi_user/multi_user_util.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/url_constants.h" 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h" 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/theme_resources.h" 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/WebKit/public/web/WebTextDirection.h" 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/message_center/notification.h" 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/message_center/notification_delegate.h" 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/chromeos/login/user_flow.h" 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h" 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kProfileSigninNotificationId[] = "chrome://settings/signin/"; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// A notification delegate for the sign-out button. 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SigninNotificationDelegate : public NotificationDelegate { 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninNotificationDelegate(const std::string& id, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // NotificationDelegate: 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Display() OVERRIDE; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Error() OVERRIDE; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Close(bool by_user) OVERRIDE; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool HasClickedListener() OVERRIDE; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Click() OVERRIDE; 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void ButtonClick(int button_index) OVERRIDE; 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string id() const OVERRIDE; 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual content::WebContents* GetWebContents() const OVERRIDE; 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~SigninNotificationDelegate(); 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FixSignIn(); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Unique id of the notification. 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string id_; 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile_; 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SigninNotificationDelegate); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SigninNotificationDelegate::SigninNotificationDelegate( 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& id, 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : id_(id), 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_(profile) { 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SigninNotificationDelegate::~SigninNotificationDelegate() { 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninNotificationDelegate::Display() { 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninNotificationDelegate::Error() { 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninNotificationDelegate::Close(bool by_user) { 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SigninNotificationDelegate::HasClickedListener() { 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninNotificationDelegate::Click() { 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FixSignIn(); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninNotificationDelegate::ButtonClick(int button_index) { 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FixSignIn(); 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string SigninNotificationDelegate::id() const { 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return id_; 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcontent::WebContents* SigninNotificationDelegate::GetWebContents() const { 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NULL; 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SigninNotificationDelegate::FixSignIn() { 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_CHROMEOS) 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::AttemptUserExit(); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoginUIService* login_ui = LoginUIServiceFactory::GetForProfile(profile_); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (login_ui->current_login_ui()) { 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) login_ui->current_login_ui()->FocusUI(); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Find a browser instance or create one. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::ScopedTabbedBrowserDisplayer browser_displayer( 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_, chrome::HOST_DESKTOP_TYPE_ASH); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Navigate to the sync setup subpage, which will launch a login page. 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::ShowSettingsSubPage(browser_displayer.browser(), 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::kSyncSetupSubPage); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SigninErrorNotifier::SigninErrorNotifier(SigninErrorController* controller, 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile) 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : error_controller_(controller), 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_(profile) { 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Create a unique notification ID for this profile. 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) notification_id_ = kProfileSigninNotificationId + profile->GetProfileName(); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) error_controller_->AddObserver(this); 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnErrorChanged(); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SigninErrorNotifier::~SigninErrorNotifier() { 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!error_controller_) 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "SigninErrorNotifier::Shutdown() was not called"; 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninErrorNotifier::Shutdown() { 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) error_controller_->RemoveObserver(this); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) error_controller_ = NULL; 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninErrorNotifier::OnErrorChanged() { 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotificationUIManager* notification_ui_manager = 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_browser_process->notification_ui_manager(); 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // notification_ui_manager() may return NULL when shutting down. 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!notification_ui_manager) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!error_controller_->HasError()) { 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_browser_process->notification_ui_manager()->CancelById(notification_id_); 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (user_manager::UserManager::IsInitialized()) { 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::UserFlow* user_flow = 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) chromeos::ChromeUserManager::Get()->GetCurrentUserFlow(); 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Check whether Chrome OS user flow allows launching browser. 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Example: Supervised user creation flow which handles token invalidation 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // itself and notifications should be suppressed. http://crbug.com/359045 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!user_flow->ShouldLaunchBrowser()) 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Add an accept button to sign the user out. 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message_center::RichNotificationData data; 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data.buttons.push_back(message_center::ButtonInfo( 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_SYNC_RELOGIN_LINK_LABEL))); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Set the delegate for the notification's sign-out button. 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninNotificationDelegate* delegate = 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new SigninNotificationDelegate(notification_id_, profile_); 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch message_center::NotifierId notifier_id( 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch message_center::NotifierId::SYSTEM_COMPONENT, 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kProfileSigninNotificationId); 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Set |profile_id| for multi-user notification blocker. 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch notifier_id.profile_id = multi_user_util::GetUserIDFromProfile(profile_); 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Notification notification( 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message_center::NOTIFICATION_TYPE_SIMPLE, 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL(notification_id_), 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch l10n_util::GetStringUTF16(IDS_SIGNIN_ERROR_BUBBLE_VIEW_TITLE), 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetMessageBody(), 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetImageNamed( 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_NOTIFICATION_ALERT), 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebTextDirectionDefault, 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch notifier_id, 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16(), // display_source 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(notification_id_), 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data, 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate); 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Update or add the notification. 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (notification_ui_manager->FindById(notification_id_)) 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) notification_ui_manager->Update(notification, profile_); 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) notification_ui_manager->Add(notification, profile_); 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::string16 SigninErrorNotifier::GetMessageBody() const { 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (error_controller_->auth_error().state()) { 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(rogerta): use account id in error messages. 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // User credentials are invalid (bad acct, etc). 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case GoogleServiceAuthError::SERVICE_ERROR: 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case GoogleServiceAuthError::ACCOUNT_DELETED: 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case GoogleServiceAuthError::ACCOUNT_DISABLED: 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringUTF16( 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDS_SYNC_SIGN_IN_ERROR_BUBBLE_VIEW_MESSAGE); 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sync service is not available for this account's domain. 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case GoogleServiceAuthError::SERVICE_UNAVAILABLE: 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringUTF16( 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDS_SYNC_UNAVAILABLE_ERROR_BUBBLE_VIEW_MESSAGE); 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Generic message for "other" errors. 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringUTF16( 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDS_SYNC_OTHER_SIGN_IN_ERROR_BUBBLE_VIEW_MESSAGE); 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 246