1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/ash/chrome_new_window_delegate.h" 6 7 #include "ash/wm/window_util.h" 8 #include "chrome/browser/profiles/profile_manager.h" 9 #include "chrome/browser/sessions/tab_restore_service.h" 10 #include "chrome/browser/sessions/tab_restore_service_factory.h" 11 #include "chrome/browser/sessions/tab_restore_service_observer.h" 12 #include "chrome/browser/ui/ash/chrome_shell_delegate.h" 13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser_commands.h" 15 #include "chrome/browser/ui/browser_finder.h" 16 #include "chrome/browser/ui/browser_window.h" 17 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" 18 19 namespace { 20 21 void RestoreTabUsingProfile(Profile* profile) { 22 TabRestoreService* service = TabRestoreServiceFactory::GetForProfile(profile); 23 service->RestoreMostRecentEntry(NULL, chrome::HOST_DESKTOP_TYPE_ASH); 24 } 25 26 // Returns the browser for the active window, if any. 27 Browser* GetBrowserForActiveWindow() { 28 return chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow()); 29 } 30 31 } // namespace 32 33 ChromeNewWindowDelegate::ChromeNewWindowDelegate() {} 34 ChromeNewWindowDelegate::~ChromeNewWindowDelegate() {} 35 36 // TabRestoreHelper is used to restore a tab. In particular when the user 37 // attempts to a restore a tab if the TabRestoreService hasn't finished loading 38 // this waits for it. Once the TabRestoreService finishes loading the tab is 39 // restored. 40 class ChromeNewWindowDelegate::TabRestoreHelper 41 : public TabRestoreServiceObserver { 42 public: 43 TabRestoreHelper(ChromeNewWindowDelegate* delegate, 44 Profile* profile, 45 TabRestoreService* service) 46 : delegate_(delegate), 47 profile_(profile), 48 tab_restore_service_(service) { 49 tab_restore_service_->AddObserver(this); 50 } 51 52 virtual ~TabRestoreHelper() { 53 tab_restore_service_->RemoveObserver(this); 54 } 55 56 TabRestoreService* tab_restore_service() { return tab_restore_service_; } 57 58 virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE { 59 } 60 61 virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE { 62 // This destroys us. 63 delegate_->tab_restore_helper_.reset(); 64 } 65 66 virtual void TabRestoreServiceLoaded(TabRestoreService* service) OVERRIDE { 67 RestoreTabUsingProfile(profile_); 68 // This destroys us. 69 delegate_->tab_restore_helper_.reset(); 70 } 71 72 private: 73 ChromeNewWindowDelegate* delegate_; 74 Profile* profile_; 75 TabRestoreService* tab_restore_service_; 76 77 DISALLOW_COPY_AND_ASSIGN(TabRestoreHelper); 78 }; 79 80 void ChromeNewWindowDelegate::NewTab() { 81 Browser* browser = GetBrowserForActiveWindow(); 82 if (browser && browser->is_type_tabbed()) { 83 chrome::NewTab(browser); 84 return; 85 } 86 87 chrome::ScopedTabbedBrowserDisplayer displayer( 88 ProfileManager::GetActiveUserProfile(), 89 chrome::HOST_DESKTOP_TYPE_ASH); 90 chrome::NewTab(displayer.browser()); 91 } 92 93 void ChromeNewWindowDelegate::NewWindow(bool is_incognito) { 94 Profile* profile = ProfileManager::GetActiveUserProfile(); 95 chrome::NewEmptyWindow( 96 is_incognito ? profile->GetOffTheRecordProfile() : profile, 97 chrome::HOST_DESKTOP_TYPE_ASH); 98 } 99 100 void ChromeNewWindowDelegate::RestoreTab() { 101 if (tab_restore_helper_.get()) { 102 DCHECK(!tab_restore_helper_->tab_restore_service()->IsLoaded()); 103 return; 104 } 105 106 Browser* browser = GetBrowserForActiveWindow(); 107 Profile* profile = browser ? browser->profile() : NULL; 108 if (!profile) 109 profile = ProfileManager::GetActiveUserProfile(); 110 if (profile->IsOffTheRecord()) 111 return; 112 TabRestoreService* service = 113 TabRestoreServiceFactory::GetForProfile(profile); 114 if (!service) 115 return; 116 117 if (service->IsLoaded()) { 118 RestoreTabUsingProfile(profile); 119 } else { 120 tab_restore_helper_.reset(new TabRestoreHelper(this, profile, service)); 121 service->LoadTabsFromLastSession(); 122 } 123 } 124 125 void ChromeNewWindowDelegate::ShowTaskManager() { 126 chrome::OpenTaskManager(NULL); 127 } 128 129 void ChromeNewWindowDelegate::OpenFeedbackPage() { 130 chrome::OpenFeedbackDialog(GetBrowserForActiveWindow()); 131 } 132