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