1 // Copyright 2014 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.
5 #include "base/metrics/user_metrics_action.h"
6 #include "base/supports_user_data.h"
7 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/browser/sessions/tab_restore_service.h"
9 #include "chrome/browser/sessions/tab_restore_service_factory.h"
10 #include "chrome/browser/sessions/tab_restore_service_observer.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/browser_commands.h"
13 #include "chrome/browser/ui/browser_list.h"
14 #include "chrome/browser/ui/browser_list_observer.h"
15 #include "chrome/browser/ui/browser_tab_restore_service_delegate.h"
16 #include "content/public/browser/user_metrics.h"
21 const char kBrowserTabRestorerKey
[] = "BrowserTabRestorer";
23 // BrowserTabRestorer is responsible for restoring a tab when the
24 // TabRestoreService finishes loading. A TabRestoreService is associated with a
25 // single Browser and deletes itself if the Browser is destroyed.
26 // BrowserTabRestorer is installed on the Profile (by way of user data), only
27 // one instance is created per profile at a time.
28 class BrowserTabRestorer
: public TabRestoreServiceObserver
,
29 public chrome::BrowserListObserver
,
30 public base::SupportsUserData::Data
{
32 virtual ~BrowserTabRestorer();
34 static void CreateIfNecessary(Browser
* browser
);
37 explicit BrowserTabRestorer(Browser
* browser
);
39 // TabRestoreServiceObserver:
40 virtual void TabRestoreServiceChanged(TabRestoreService
* service
) OVERRIDE
;
41 virtual void TabRestoreServiceDestroyed(TabRestoreService
* service
) OVERRIDE
;
42 virtual void TabRestoreServiceLoaded(TabRestoreService
* service
) OVERRIDE
;
44 // BrowserListObserver:
45 virtual void OnBrowserRemoved(Browser
* browser
) OVERRIDE
;
48 TabRestoreService
* tab_restore_service_
;
50 DISALLOW_COPY_AND_ASSIGN(BrowserTabRestorer
);
53 BrowserTabRestorer::~BrowserTabRestorer() {
54 tab_restore_service_
->RemoveObserver(this);
55 BrowserList::GetInstance(browser_
->host_desktop_type())->RemoveObserver(this);
59 void BrowserTabRestorer::CreateIfNecessary(Browser
* browser
) {
61 if (browser
->profile()->GetUserData(kBrowserTabRestorerKey
))
62 return; // Only allow one restore for a given profile at a time.
64 // BrowserTabRestorer is deleted at the appropriate time.
65 new BrowserTabRestorer(browser
);
68 BrowserTabRestorer::BrowserTabRestorer(Browser
* browser
)
71 TabRestoreServiceFactory::GetForProfile(browser
->profile())) {
72 DCHECK(tab_restore_service_
);
73 DCHECK(!tab_restore_service_
->IsLoaded());
74 tab_restore_service_
->AddObserver(this);
75 BrowserList::GetInstance(browser
->host_desktop_type())->AddObserver(this);
76 browser_
->profile()->SetUserData(kBrowserTabRestorerKey
, this);
77 tab_restore_service_
->LoadTabsFromLastSession();
80 void BrowserTabRestorer::TabRestoreServiceChanged(TabRestoreService
* service
) {
83 void BrowserTabRestorer::TabRestoreServiceDestroyed(
84 TabRestoreService
* service
) {
87 void BrowserTabRestorer::TabRestoreServiceLoaded(TabRestoreService
* service
) {
90 browser_
->profile()->SetUserData(kBrowserTabRestorerKey
, NULL
);
93 void BrowserTabRestorer::OnBrowserRemoved(Browser
* browser
) {
95 browser_
->profile()->SetUserData(kBrowserTabRestorerKey
, NULL
);
100 void RestoreTab(Browser
* browser
) {
101 content::RecordAction(base::UserMetricsAction("RestoreTab"));
102 TabRestoreService
* service
=
103 TabRestoreServiceFactory::GetForProfile(browser
->profile());
107 if (service
->IsLoaded()) {
108 service
->RestoreMostRecentEntry(browser
->tab_restore_service_delegate(),
109 browser
->host_desktop_type());
113 BrowserTabRestorer::CreateIfNecessary(browser
);
116 } // namespace chrome