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 19namespace { 20 21void 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. 27Browser* GetBrowserForActiveWindow() { 28 return chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow()); 29} 30 31} // namespace 32 33ChromeNewWindowDelegate::ChromeNewWindowDelegate() {} 34ChromeNewWindowDelegate::~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. 40class 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 80void 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 93void 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 100void 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 125void ChromeNewWindowDelegate::ShowTaskManager() { 126 chrome::OpenTaskManager(NULL); 127} 128 129void ChromeNewWindowDelegate::OpenFeedbackPage() { 130 chrome::OpenFeedbackDialog(GetBrowserForActiveWindow()); 131} 132