1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SESSIONS_TAB_RESTORE_SERVICE_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SESSIONS_TAB_RESTORE_SERVICE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <list>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/base_session_service.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/session_id.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/session_types.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/in_process_webkit/session_storage_namespace.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NavigationController;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TabRestoreServiceDelegate;
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TabRestoreServiceObserver;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct SessionWindow;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TabRestoreService is responsible for maintaining the most recently closed
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tabs and windows. When a tab is closed
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TabRestoreService::CreateHistoricalTab is invoked and a Tab is created to
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// represent the tab. Similarly, when a browser is closed, BrowserClosing is
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// invoked and a Window is created to represent the window.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To restore a tab/window from the TabRestoreService invoke RestoreEntryById
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// or RestoreMostRecentEntry.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To listen for changes to the set of entries managed by the TabRestoreService
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// add an observer.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabRestoreService : public BaseSessionService {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Interface used to allow the test to provide a custom time.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class TimeFactory {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~TimeFactory();
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual base::Time TimeNow() = 0;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The type of entry.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Type {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TAB,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WINDOW
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Entry {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Entry();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    explicit Entry(Type type);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Entry();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Unique id for this entry. The id is guaranteed to be unique for a
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // session.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SessionID::id_type id;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The type of the entry.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Type type;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The time when the window or tab was closed.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::Time timestamp;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Is this entry from the last session? This is set to true for entries that
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // were closed during the last session, and false for entries that were
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // closed during this session.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool from_last_session;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Represents a previously open tab.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Tab : public Entry {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Tab();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Tab();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool has_browser() const { return browser_id > 0; }
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The navigations.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<TabNavigation> navigations;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Index of the selected navigation in navigations.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int current_navigation_index;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The ID of the browser to which this tab belonged, so it can be restored
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // there. May be 0 (an invalid SessionID) when restoring an entire session.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SessionID::id_type browser_id;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Index within the tab strip. May be -1 for an unknown index.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int tabstrip_index;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // True if the tab was pinned.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool pinned;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If non-empty gives the id of the extension for the tab.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string extension_app_id;
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // The associated session storage namespace (if any).
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<SessionStorageNamespace> session_storage_namespace;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Represents a previously open window.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Window : public Entry {
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Window();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Window();
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The tabs that comprised the window, in order.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<Tab> tabs;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Index of the selected tab.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int selected_tab_index;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::list<Entry*> Entries;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a new TabRestoreService and provides an object that provides the
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // current time. The TabRestoreService does not take ownership of the
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |time_factory_|.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit TabRestoreService(Profile* profile,
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             TimeFactory* time_factory_ = NULL);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds/removes an observer. TabRestoreService does not take ownership of
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the observer.
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void AddObserver(TabRestoreServiceObserver* observer);
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void RemoveObserver(TabRestoreServiceObserver* observer);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a Tab to represent |tab| and notifies observers the list of
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // entries has changed.
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CreateHistoricalTab(NavigationController* tab, int index);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Invoked when a browser is closing. If |delegate| is a tabbed browser with
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // at least one tab, a Window is created, added to entries and observers are
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notified.
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void BrowserClosing(TabRestoreServiceDelegate* delegate);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when the browser is done closing.
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void BrowserClosed(TabRestoreServiceDelegate* delegate);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes all entries from the list and notifies observers the list
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of tabs has changed.
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ClearEntries();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the entries, ordered with most recently closed entries at the
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // front.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const Entries& entries() const;
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restores the most recently closed entry. Does nothing if there are no
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // entries to restore. If the most recently restored entry is a tab, it is
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // added to |delegate|.
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RestoreMostRecentEntry(TabRestoreServiceDelegate* delegate);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restores an entry by id. If there is no entry with an id matching |id|,
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this does nothing. If |replace_existing_tab| is true and id identifies a
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // tab, the newly created tab replaces the selected tab in |delegate|. If
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // |delegate| is NULL, this creates a new window for the entry.
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RestoreEntryById(TabRestoreServiceDelegate* delegate,
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        SessionID::id_type id,
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        bool replace_existing_tab);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Loads the tabs and previous session. This does nothing if the tabs
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from the previous session have already been loaded.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LoadTabsFromLastSession();
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Max number of entries we'll keep around.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const size_t kMaxEntries;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Creates and add entries to |entries| for each of the windows in |windows|.
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void CreateEntriesFromWindows(std::vector<SessionWindow*>* windows,
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                std::vector<Entry*>* entries);
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Save();
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~TabRestoreService();
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to indicate what has loaded.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum LoadState {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Indicates we haven't loaded anything.
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOT_LOADED           = 1 << 0,
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Indicates we've asked for the last sessions and tabs but haven't gotten
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the result back yet.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOADING              = 1 << 2,
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Indicates we finished loading the last tabs (but not necessarily the
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // last session).
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOADED_LAST_TABS     = 1 << 3,
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Indicates we finished loading the last session (but not necessarily the
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // last tabs).
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOADED_LAST_SESSION  = 1 << 4
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Populates the tab's navigations from the NavigationController, and its
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // browser_id and pinned state from the browser.
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PopulateTab(Tab* tab,
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   int index,
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   TabRestoreServiceDelegate* delegate,
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NavigationController* controller);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifies observers the tabs have changed.
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyTabsChanged();
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Adds |entry| to the list of entries and takes ownership. If |prune| is true
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |PruneAndNotify| is invoked. If |to_front| is true the entry is added to
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // the front, otherwise the back. Normal closes go to the front, but
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // tab/window closes from the previous session are added to the back.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddEntry(Entry* entry, bool prune, bool to_front);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Prunes entries_ to contain only kMaxEntries and invokes NotifyTabsChanged.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PruneAndNotify();
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns an iterator into entries_ whose id matches |id|. If |id| identifies
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a Window, then its iterator position will be returned. If it identifies a
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tab, then the iterator position of the Window in which the Tab resides is
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returned.
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Entries::iterator GetEntryIteratorById(SessionID::id_type id);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules the commands for a window close.
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleCommandsForWindow(const Window& window);
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Schedules the commands for a tab close. |selected_index| gives the
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // index of the selected navigation.
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleCommandsForTab(const Tab& tab, int selected_index);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a window close command.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SessionCommand* CreateWindowCommand(SessionID::id_type id,
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      int selected_tab_index,
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      int num_tabs,
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      base::Time timestamp);
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a tab close command.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SessionCommand* CreateSelectedNavigationInTabCommand(
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SessionID::id_type tab_id,
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int32 index,
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base::Time timestamp);
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a restore command.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SessionCommand* CreateRestoredEntryCommand(SessionID::id_type entry_id);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the index to persist as the selected index. This is the same
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // as |tab.current_navigation_index| unless the entry at
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |tab.current_navigation_index| shouldn't be persisted. Returns -1 if
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // no valid navigation to persist.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetSelectedNavigationIndexToPersist(const Tab& tab);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when we've loaded the session commands that identify the
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // previously closed tabs. This creates entries, adds them to
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // staging_entries_, and invokes LoadState.
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnGotLastSessionCommands(
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Handle handle,
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      scoped_refptr<InternalGetCommandsRequest> request);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Populates |loaded_entries| with Entries from |request|.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CreateEntriesFromCommands(
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      scoped_refptr<InternalGetCommandsRequest> request,
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::vector<Entry*>* loaded_entries);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is a helper function for RestoreEntryById() for restoring a single
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tab. If |replace_existing_tab| is true, the newly created tab replaces the
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // selected tab in |delegate|. If |delegate| is NULL, this creates a new
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // window for the entry. This returns the TabRestoreServiceDelegate into which
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the tab was restored.
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabRestoreServiceDelegate* RestoreTab(const Tab& tab,
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        TabRestoreServiceDelegate* delegate,
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        bool replace_existing_tab);
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if |tab| has more than one navigation. If |tab| has more
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // than one navigation |tab->current_navigation_index| is constrained based
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // on the number of navigations.
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ValidateTab(Tab* tab);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Validates all entries in |entries|, deleting any with no navigations.
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This also deletes any entries beyond the max number of entries we can
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // hold.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ValidateAndDeleteEmptyEntries(std::vector<Entry*>* entries);
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Finds tab entries with the old browser_id and sets it to the new one.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateTabBrowserIDs(SessionID::id_type old_id,
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           SessionID::id_type new_id);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback from SessionService when we've received the windows from the
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // previous session. This creates and add entries to |staging_entries_|
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and invokes LoadStateChanged.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnGotPreviousSession(Handle handle,
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            std::vector<SessionWindow*>* windows);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts a SessionWindow into a Window, returning true on success. We use 0
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // as the timestamp here since we do not know when the window/tab was closed.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ConvertSessionWindowToWindow(
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SessionWindow* session_window,
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Window* window);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when previous tabs or session is loaded. If both have finished
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loading the entries in staging_entries_ are added to entries_ and
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // observers are notified.
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LoadStateChanged();
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the current time. This uses the time_factory_ if there is one.
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time TimeNow() const;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set of entries.
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Entries entries_;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we've loaded the last session.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int load_state_;
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Are we restoring a tab? If this is true we ignore requests to create a
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // historical tab.
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool restoring_;
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Have the max number of entries ever been created?
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reached_max_;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The number of entries to write.
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int entries_to_write_;
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Number of entries we've written.
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int entries_written_;
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ObserverList<TabRestoreServiceObserver> observer_list_;
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set of delegates that we've received a BrowserClosing method for but no
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // corresponding BrowserClosed. We cache the set of delegates closing to
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // avoid creating historical tabs for them.
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::set<TabRestoreServiceDelegate*> closing_delegates_;
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used when loading previous tabs/session.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumer load_consumer_;
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Results from previously closed tabs/sessions is first added here. When
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the results from both us and the session restore service have finished
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loading LoadStateChanged is invoked, which adds these entries to
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // entries_.
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<Entry*> staging_entries_;
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TimeFactory* time_factory_;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TabRestoreService);
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_SESSIONS_TAB_RESTORE_SERVICE_H_
345