Chromium Code Reviews| Index: chrome/browser/ui/webui/signin/user_manager_screen_handler.cc |
| diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc |
| index 91a5bce179edad88405345fd32f252e11d843bb6..4f430fc424c11d817f15621fbd90225dee7aa50c 100644 |
| --- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc |
| +++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc |
| @@ -21,10 +21,12 @@ |
| #include "chrome/browser/profiles/profile_window.h" |
| #include "chrome/browser/profiles/profiles_state.h" |
| #include "chrome/browser/signin/local_auth.h" |
| +#include "chrome/browser/ui/app_list/app_list_service.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/browser_dialogs.h" |
| #include "chrome/browser/ui/browser_finder.h" |
| #include "chrome/browser/ui/browser_list.h" |
| +#include "chrome/browser/ui/browser_list_observer.h" |
| #include "chrome/browser/ui/chrome_pages.h" |
| #include "chrome/browser/ui/singleton_tabs.h" |
| #include "chrome/browser/ui/user_manager.h" |
| @@ -143,6 +145,67 @@ bool IsAddPersonEnabled() { |
| return service->GetBoolean(prefs::kBrowserAddPersonEnabled); |
| } |
| +// Executes the action specified by the URL's Hash parameter, if any. Deletes |
| +// itself after the action would be performed. |
| +class UrlHashHelper : public chrome::BrowserListObserver { |
| + public: |
| + UrlHashHelper(Browser* browser, const std::string& hash); |
| + ~UrlHashHelper() override; |
| + |
| + void ExecuteUrlHash(); |
| + |
| + // chrome::BrowserListObserver overrides: |
| + void OnBrowserRemoved(Browser* browser) override; |
| + |
| + private: |
| + Browser* browser_; |
| + Profile* profile_; |
| + chrome::HostDesktopType desktop_type_; |
| + const std::string& hash_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(UrlHashHelper); |
| +}; |
| + |
| +UrlHashHelper::UrlHashHelper(Browser* browser, const std::string& hash) |
| + : browser_(browser), |
| + profile_(browser->profile()), |
| + desktop_type_(browser->host_desktop_type()), |
| + hash_(hash) { |
| + BrowserList::AddObserver(this); |
| +} |
| + |
| +UrlHashHelper::~UrlHashHelper() { |
| + BrowserList::RemoveObserver(this); |
| +} |
| + |
| +void UrlHashHelper::OnBrowserRemoved(Browser* browser) { |
| + if (browser == browser_) |
| + browser_ = nullptr; |
| +} |
| + |
| +void UrlHashHelper::ExecuteUrlHash() { |
| + if (hash_ == profiles::kUserManagerSelectProfileAppLauncher) { |
| + AppListService* app_list_service = AppListService::Get(desktop_type_); |
| + app_list_service->ShowForProfile(profile_); |
| + return; |
| + } |
| + |
| + if (!browser_) { |
| + browser_ = chrome::FindLastActiveWithProfile(profile_, desktop_type_); |
|
sky
2015/01/27 17:54:31
nit: seems safer to introduce a local rather than
Mike Lerman
2015/01/27 18:26:11
Really? This UrlHashHelper object will be deleted
sky
2015/01/27 21:54:27
This object is temporary, but by changing browser_
Mike Lerman
2015/01/27 21:58:49
Okay. Done.
|
| + if (!browser_) |
| + return; |
| + } |
| + |
| + if (hash_ == profiles::kUserManagerSelectProfileTaskManager) |
| + chrome::OpenTaskManager(browser_); |
| + else if (hash_ == profiles::kUserManagerSelectProfileAboutChrome) |
| + chrome::ShowAboutChrome(browser_); |
| + else if (hash_ == profiles::kUserManagerSelectProfileChromeSettings) |
| + chrome::ShowSettings(browser_); |
| + else if (hash_ == profiles::kUserManagerSelectProfileChromeMemory) |
| + chrome::ShowMemory(browser_); |
| +} |
| + |
| } // namespace |
| // ProfileUpdateObserver ------------------------------------------------------ |
| @@ -714,18 +777,11 @@ void UserManagerScreenHandler::OnBrowserWindowReady(Browser* browser) { |
| info_cache.SetProfileSigninRequiredAtIndex(index, false); |
| } |
| - if (url_hash_ == profiles::kUserManagerSelectProfileTaskManager) { |
| - base::MessageLoop::current()->PostTask( |
| - FROM_HERE, base::Bind(&chrome::OpenTaskManager, browser)); |
| - } else if (url_hash_ == profiles::kUserManagerSelectProfileAboutChrome) { |
| - base::MessageLoop::current()->PostTask( |
| - FROM_HERE, base::Bind(&chrome::ShowAboutChrome, browser)); |
| - } else if (url_hash_ == profiles::kUserManagerSelectProfileChromeSettings) { |
| - base::MessageLoop::current()->PostTask( |
| - FROM_HERE, base::Bind(&chrome::ShowSettings, browser)); |
| - } else if (url_hash_ == profiles::kUserManagerSelectProfileChromeMemory) { |
| + if (!url_hash_.empty()) { |
| base::MessageLoop::current()->PostTask( |
| - FROM_HERE, base::Bind(&chrome::ShowMemory, browser)); |
| + FROM_HERE, |
| + base::Bind(&UrlHashHelper::ExecuteUrlHash, |
| + base::Owned(new UrlHashHelper(browser, url_hash_)))); |
| } |
| // This call is last as it deletes this object. |