// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/ash/chrome_new_window_delegate.h" #include "ash/wm/window_util.h" #include "base/macros.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/ui/ash/chrome_shell_delegate.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "components/sessions/core/tab_restore_service.h" #include "components/sessions/core/tab_restore_service_observer.h" namespace { void RestoreTabUsingProfile(Profile* profile) { sessions::TabRestoreService* service = TabRestoreServiceFactory::GetForProfile(profile); service->RestoreMostRecentEntry(NULL, chrome::HOST_DESKTOP_TYPE_ASH); } // Returns the browser for the active window, if any. Browser* GetBrowserForActiveWindow() { return chrome::FindBrowserWithWindow(ash::wm::GetActiveWindow()); } } // namespace ChromeNewWindowDelegate::ChromeNewWindowDelegate() {} ChromeNewWindowDelegate::~ChromeNewWindowDelegate() {} // TabRestoreHelper is used to restore a tab. In particular when the user // attempts to a restore a tab if the TabRestoreService hasn't finished loading // this waits for it. Once the TabRestoreService finishes loading the tab is // restored. class ChromeNewWindowDelegate::TabRestoreHelper : public sessions::TabRestoreServiceObserver { public: TabRestoreHelper(ChromeNewWindowDelegate* delegate, Profile* profile, sessions::TabRestoreService* service) : delegate_(delegate), profile_(profile), tab_restore_service_(service) { tab_restore_service_->AddObserver(this); } ~TabRestoreHelper() override { tab_restore_service_->RemoveObserver(this); } sessions::TabRestoreService* tab_restore_service() { return tab_restore_service_; } void TabRestoreServiceChanged(sessions::TabRestoreService* service) override { } void TabRestoreServiceDestroyed( sessions::TabRestoreService* service) override { // This destroys us. delegate_->tab_restore_helper_.reset(); } void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override { RestoreTabUsingProfile(profile_); // This destroys us. delegate_->tab_restore_helper_.reset(); } private: ChromeNewWindowDelegate* delegate_; Profile* profile_; sessions::TabRestoreService* tab_restore_service_; DISALLOW_COPY_AND_ASSIGN(TabRestoreHelper); }; void ChromeNewWindowDelegate::NewTab() { Browser* browser = GetBrowserForActiveWindow(); if (browser && browser->is_type_tabbed()) { chrome::NewTab(browser); return; } // Display a browser, setting the focus to the location bar after it is shown. { chrome::ScopedTabbedBrowserDisplayer displayer( ProfileManager::GetActiveUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH); browser = displayer.browser(); chrome::NewTab(browser); } browser->SetFocusToLocationBar(false); } void ChromeNewWindowDelegate::NewWindow(bool is_incognito) { Profile* profile = ProfileManager::GetActiveUserProfile(); chrome::NewEmptyWindow( is_incognito ? profile->GetOffTheRecordProfile() : profile, chrome::HOST_DESKTOP_TYPE_ASH); } void ChromeNewWindowDelegate::RestoreTab() { if (tab_restore_helper_.get()) { DCHECK(!tab_restore_helper_->tab_restore_service()->IsLoaded()); return; } Browser* browser = GetBrowserForActiveWindow(); Profile* profile = browser ? browser->profile() : NULL; if (!profile) profile = ProfileManager::GetActiveUserProfile(); if (profile->IsOffTheRecord()) return; sessions::TabRestoreService* service = TabRestoreServiceFactory::GetForProfile(profile); if (!service) return; if (service->IsLoaded()) { RestoreTabUsingProfile(profile); } else { tab_restore_helper_.reset(new TabRestoreHelper(this, profile, service)); service->LoadTabsFromLastSession(); } } void ChromeNewWindowDelegate::ShowTaskManager() { chrome::OpenTaskManager(NULL); } void ChromeNewWindowDelegate::OpenFeedbackPage() { chrome::OpenFeedbackDialog(GetBrowserForActiveWindow()); }