Index: chrome/browser/sessions/persistent_tab_restore_service.cc |
diff --git a/chrome/browser/sessions/persistent_tab_restore_service.cc b/chrome/browser/sessions/persistent_tab_restore_service.cc |
index f0be5620b3c17c876b15f9e72351441ba5563451..9ef3ac16c8736b95fae9e2d96ab0a2588c52d8af 100644 |
--- a/chrome/browser/sessions/persistent_tab_restore_service.cc |
+++ b/chrome/browser/sessions/persistent_tab_restore_service.cc |
@@ -19,6 +19,7 @@ |
#include "base/time/time.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/sessions/base_session_service.h" |
+#include "chrome/browser/sessions/base_session_service_commands.h" |
#include "chrome/browser/sessions/base_session_service_delegate_impl.h" |
#include "chrome/browser/sessions/session_command.h" |
#include "chrome/browser/sessions/session_service.h" |
@@ -113,17 +114,18 @@ const size_t kMaxEntries = TabRestoreServiceHelper::kMaxEntries; |
// PersistentTabRestoreService::Delegate --------------------------------------- |
-// Implements the link between the tab restore service and the session backend. |
+// Implements the link between the tab restore service and BaseSessionService. |
class PersistentTabRestoreService::Delegate |
- : public BaseSessionService, |
+ : public BaseSessionServiceDelegateImpl, |
public TabRestoreServiceHelper::Observer { |
public: |
explicit Delegate(Profile* profile); |
~Delegate() override; |
- // BaseSessionService: |
- void Save() override; |
+ // BaseSessionServiceDelegateImpl: |
+ void OnWillSaveCommands() override; |
+ void OnSavedCommands() override; |
// TabRestoreServiceHelper::Observer: |
void OnClearEntries() override; |
@@ -138,6 +140,8 @@ class PersistentTabRestoreService::Delegate |
void LoadTabsFromLastSession(); |
+ void DeleteLastSession(); |
+ |
bool IsLoaded() const; |
// Creates and add entries to |entries| for each of the windows in |windows|. |
@@ -154,19 +158,19 @@ class PersistentTabRestoreService::Delegate |
void ScheduleCommandsForTab(const Tab& tab, int selected_index); |
// Creates a window close command. |
- static SessionCommand* CreateWindowCommand(SessionID::id_type id, |
- int selected_tab_index, |
- int num_tabs, |
- base::Time timestamp); |
+ static scoped_ptr<SessionCommand> CreateWindowCommand(SessionID::id_type id, |
+ int selected_tab_index, |
+ int num_tabs, |
+ base::Time timestamp); |
// Creates a tab close command. |
- static SessionCommand* CreateSelectedNavigationInTabCommand( |
+ static scoped_ptr<SessionCommand> CreateSelectedNavigationInTabCommand( |
SessionID::id_type tab_id, |
int32 index, |
base::Time timestamp); |
// Creates a restore command. |
- static SessionCommand* CreateRestoredEntryCommand( |
+ static scoped_ptr<SessionCommand> CreateRestoredEntryCommand( |
SessionID::id_type entry_id); |
// Returns the index to persist as the selected index. This is the same as |
@@ -213,6 +217,8 @@ class PersistentTabRestoreService::Delegate |
std::vector<TabRestoreService::Entry*>* entries); |
private: |
+ scoped_ptr<BaseSessionService> base_session_service_; |
+ |
// The associated profile. |
Profile* profile_; |
@@ -239,11 +245,11 @@ class PersistentTabRestoreService::Delegate |
}; |
PersistentTabRestoreService::Delegate::Delegate(Profile* profile) |
- : BaseSessionService( |
- BaseSessionService::TAB_RESTORE, |
- profile->GetPath(), |
- scoped_ptr<BaseSessionServiceDelegate>( |
- new BaseSessionServiceDelegateImpl(true))), |
+ : BaseSessionServiceDelegateImpl(true), |
+ base_session_service_( |
+ new BaseSessionService(BaseSessionService::TAB_RESTORE, |
+ profile->GetPath(), |
+ this)), |
profile_(profile), |
tab_restore_service_helper_(NULL), |
entries_to_write_(0), |
@@ -255,14 +261,14 @@ PersistentTabRestoreService::Delegate::Delegate(Profile* profile) |
PersistentTabRestoreService::Delegate::~Delegate() {} |
-void PersistentTabRestoreService::Delegate::Save() { |
+void PersistentTabRestoreService::Delegate::OnWillSaveCommands() { |
const Entries& entries = tab_restore_service_helper_->entries(); |
int to_write_count = std::min(entries_to_write_, |
static_cast<int>(entries.size())); |
entries_to_write_ = 0; |
if (entries_written_ + to_write_count > kEntriesPerReset) { |
to_write_count = entries.size(); |
- set_pending_reset(true); |
+ base_session_service_->set_pending_reset(true); |
} |
if (to_write_count) { |
// Write the to_write_count most recently added entries out. The most |
@@ -284,25 +290,27 @@ void PersistentTabRestoreService::Delegate::Save() { |
entries_written_++; |
} |
} |
- if (pending_reset()) |
+ if (base_session_service_->pending_reset()) |
entries_written_ = 0; |
- BaseSessionService::Save(); |
} |
+void PersistentTabRestoreService::Delegate::OnSavedCommands() {} |
+ |
void PersistentTabRestoreService::Delegate::OnClearEntries() { |
// Mark all the tabs as closed so that we don't attempt to restore them. |
const Entries& entries = tab_restore_service_helper_->entries(); |
for (Entries::const_iterator i = entries.begin(); i != entries.end(); ++i) |
- ScheduleCommand(CreateRestoredEntryCommand((*i)->id)); |
+ base_session_service_->ScheduleCommand( |
+ CreateRestoredEntryCommand((*i)->id).Pass()); |
entries_to_write_ = 0; |
// Schedule a pending reset so that we nuke the file on next write. |
- set_pending_reset(true); |
+ base_session_service_->set_pending_reset(true); |
// Schedule a command, otherwise if there are no pending commands Save does |
// nothing. |
- ScheduleCommand(CreateRestoredEntryCommand(1)); |
+ base_session_service_->ScheduleCommand(CreateRestoredEntryCommand(1).Pass()); |
} |
void PersistentTabRestoreService::Delegate::OnRestoreEntryById( |
@@ -316,12 +324,12 @@ void PersistentTabRestoreService::Delegate::OnRestoreEntryById( |
if (static_cast<int>(index) < entries_to_write_) |
entries_to_write_--; |
- ScheduleCommand(CreateRestoredEntryCommand(id)); |
+ base_session_service_->ScheduleCommand(CreateRestoredEntryCommand(id).Pass()); |
} |
void PersistentTabRestoreService::Delegate::OnAddEntry() { |
// Start the save timer, when it fires we'll generate the commands. |
- StartSaveTimer(); |
+ base_session_service_->StartSaveTimer(); |
entries_to_write_++; |
} |
@@ -365,11 +373,15 @@ void PersistentTabRestoreService::Delegate::LoadTabsFromLastSession() { |
// Request the tabs closed in the last session. If the last session crashed, |
// this won't contain the tabs/window that were open at the point of the |
// crash (the call to GetLastSession above requests those). |
- ScheduleGetLastSessionCommands( |
+ base_session_service_->ScheduleGetLastSessionCommands( |
base::Bind(&Delegate::OnGotLastSessionCommands, base::Unretained(this)), |
&cancelable_task_tracker_); |
} |
+void PersistentTabRestoreService::Delegate::DeleteLastSession() { |
+ base_session_service_->DeleteLastSession(); |
+} |
+ |
bool PersistentTabRestoreService::Delegate::IsLoaded() const { |
return !(load_state_ & (NOT_LOADED | LOADING)); |
} |
@@ -386,8 +398,7 @@ void PersistentTabRestoreService::Delegate::CreateEntriesFromWindows( |
} |
void PersistentTabRestoreService::Delegate::Shutdown() { |
- if (backend()) |
- Save(); |
+ base_session_service_->SaveNow(); |
} |
void PersistentTabRestoreService::Delegate::ScheduleCommandsForWindow( |
@@ -406,17 +417,18 @@ void PersistentTabRestoreService::Delegate::ScheduleCommandsForWindow( |
if (valid_tab_count == 0) |
return; // No tabs to persist. |
- ScheduleCommand( |
+ base_session_service_->ScheduleCommand( |
CreateWindowCommand(window.id, |
std::min(real_selected_tab, valid_tab_count - 1), |
valid_tab_count, |
- window.timestamp)); |
+ window.timestamp).Pass()); |
if (!window.app_name.empty()) { |
- ScheduleCommand( |
- CreateSetWindowAppNameCommand(kCommandSetWindowAppName, |
- window.id, |
- window.app_name)); |
+ base_session_service_->ScheduleCommand( |
+ BaseSessionServiceCommands::CreateSetWindowAppNameCommand( |
+ kCommandSetWindowAppName, |
+ window.id, |
+ window.app_name).Pass()); |
} |
for (size_t i = 0; i < window.tabs.size(); ++i) { |
@@ -437,7 +449,8 @@ void PersistentTabRestoreService::Delegate::ScheduleCommandsForTab( |
int valid_count_before_selected = 0; |
int first_index_to_persist = selected_index; |
for (int i = selected_index - 1; i >= 0 && |
- valid_count_before_selected < max_persist_navigation_count; --i) { |
+ valid_count_before_selected < |
+ BaseSessionService::max_persist_navigation_count; --i) { |
if (ShouldTrackEntry(navigations[i].virtual_url())) { |
first_index_to_persist = i; |
valid_count_before_selected++; |
@@ -445,44 +458,52 @@ void PersistentTabRestoreService::Delegate::ScheduleCommandsForTab( |
} |
// Write the command that identifies the selected tab. |
- ScheduleCommand( |
+ base_session_service_->ScheduleCommand( |
CreateSelectedNavigationInTabCommand(tab.id, |
valid_count_before_selected, |
- tab.timestamp)); |
+ tab.timestamp).Pass()); |
if (tab.pinned) { |
PinnedStatePayload payload = true; |
- SessionCommand* command = |
- new SessionCommand(kCommandPinnedState, sizeof(payload)); |
+ scoped_ptr<SessionCommand> command( |
+ new SessionCommand(kCommandPinnedState, sizeof(payload))); |
memcpy(command->contents(), &payload, sizeof(payload)); |
- ScheduleCommand(command); |
+ base_session_service_->ScheduleCommand(command.Pass()); |
} |
if (!tab.extension_app_id.empty()) { |
- ScheduleCommand( |
- CreateSetTabExtensionAppIDCommand(kCommandSetExtensionAppID, tab.id, |
- tab.extension_app_id)); |
+ base_session_service_->ScheduleCommand( |
+ BaseSessionServiceCommands::CreateSetTabExtensionAppIDCommand( |
+ kCommandSetExtensionAppID, |
+ tab.id, |
+ tab.extension_app_id).Pass()); |
} |
if (!tab.user_agent_override.empty()) { |
- ScheduleCommand( |
- CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride, |
- tab.id, tab.user_agent_override)); |
+ base_session_service_->ScheduleCommand( |
+ BaseSessionServiceCommands::CreateSetTabUserAgentOverrideCommand( |
+ kCommandSetTabUserAgentOverride, |
+ tab.id, |
+ tab.user_agent_override).Pass()); |
} |
// Then write the navigations. |
for (int i = first_index_to_persist, wrote_count = 0; |
- i < max_index && wrote_count < 2 * max_persist_navigation_count; ++i) { |
+ wrote_count < 2 * BaseSessionService::max_persist_navigation_count && |
+ i < max_index; ++i) { |
if (ShouldTrackEntry(navigations[i].virtual_url())) { |
- ScheduleCommand( |
- CreateUpdateTabNavigationCommand(kCommandUpdateTabNavigation, tab.id, |
- navigations[i])); |
+ base_session_service_->ScheduleCommand( |
+ BaseSessionServiceCommands::CreateUpdateTabNavigationCommand( |
+ kCommandUpdateTabNavigation, |
+ tab.id, |
+ navigations[i])); |
} |
} |
} |
// static |
-SessionCommand* PersistentTabRestoreService::Delegate::CreateWindowCommand( |
+scoped_ptr<SessionCommand> |
+PersistentTabRestoreService::Delegate::CreateWindowCommand( |
SessionID::id_type id, |
int selected_tab_index, |
int num_tabs, |
@@ -496,14 +517,14 @@ SessionCommand* PersistentTabRestoreService::Delegate::CreateWindowCommand( |
payload.num_tabs = num_tabs; |
payload.timestamp = timestamp.ToInternalValue(); |
- SessionCommand* command = |
- new SessionCommand(kCommandWindow, sizeof(payload)); |
+ scoped_ptr<SessionCommand> command( |
+ new SessionCommand(kCommandWindow, sizeof(payload))); |
memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
+ return command.Pass(); |
} |
// static |
-SessionCommand* |
+scoped_ptr<SessionCommand> |
PersistentTabRestoreService::Delegate::CreateSelectedNavigationInTabCommand( |
SessionID::id_type tab_id, |
int32 index, |
@@ -512,21 +533,21 @@ PersistentTabRestoreService::Delegate::CreateSelectedNavigationInTabCommand( |
payload.id = tab_id; |
payload.index = index; |
payload.timestamp = timestamp.ToInternalValue(); |
- SessionCommand* command = |
- new SessionCommand(kCommandSelectedNavigationInTab, sizeof(payload)); |
+ scoped_ptr<SessionCommand> command( |
+ new SessionCommand(kCommandSelectedNavigationInTab, sizeof(payload))); |
memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
+ return command.Pass(); |
} |
// static |
-SessionCommand* |
+scoped_ptr<SessionCommand> |
PersistentTabRestoreService::Delegate::CreateRestoredEntryCommand( |
SessionID::id_type entry_id) { |
RestoredEntryPayload payload = entry_id; |
- SessionCommand* command = |
- new SessionCommand(kCommandRestoredEntry, sizeof(payload)); |
+ scoped_ptr<SessionCommand> command( |
+ new SessionCommand(kCommandRestoredEntry, sizeof(payload))); |
memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
+ return command.Pass(); |
} |
int PersistentTabRestoreService::Delegate::GetSelectedNavigationIndexToPersist( |
@@ -686,8 +707,10 @@ void PersistentTabRestoreService::Delegate::CreateEntriesFromCommands( |
} |
current_tab->navigations.resize(current_tab->navigations.size() + 1); |
SessionID::id_type tab_id; |
- if (!RestoreUpdateTabNavigationCommand( |
- command, ¤t_tab->navigations.back(), &tab_id)) { |
+ if (!BaseSessionServiceCommands::RestoreUpdateTabNavigationCommand( |
+ command, |
+ ¤t_tab->navigations.back(), |
+ &tab_id)) { |
return; |
} |
break; |
@@ -713,8 +736,12 @@ void PersistentTabRestoreService::Delegate::CreateEntriesFromCommands( |
SessionID::id_type window_id; |
std::string app_name; |
- if (!RestoreSetWindowAppNameCommand(command, &window_id, &app_name)) |
+ if (!BaseSessionServiceCommands::RestoreSetWindowAppNameCommand( |
+ command, |
+ &window_id, |
+ &app_name)) { |
return; |
+ } |
current_window->app_name.swap(app_name); |
break; |
@@ -727,8 +754,10 @@ void PersistentTabRestoreService::Delegate::CreateEntriesFromCommands( |
} |
SessionID::id_type tab_id; |
std::string extension_app_id; |
- if (!RestoreSetTabExtensionAppIDCommand(command, &tab_id, |
- &extension_app_id)) { |
+ if (!BaseSessionServiceCommands::RestoreSetTabExtensionAppIDCommand( |
+ command, |
+ &tab_id, |
+ &extension_app_id)) { |
return; |
} |
current_tab->extension_app_id.swap(extension_app_id); |
@@ -742,8 +771,10 @@ void PersistentTabRestoreService::Delegate::CreateEntriesFromCommands( |
} |
SessionID::id_type tab_id; |
std::string user_agent_override; |
- if (!RestoreSetTabUserAgentOverrideCommand(command, &tab_id, |
- &user_agent_override)) { |
+ if (!BaseSessionServiceCommands::RestoreSetTabUserAgentOverrideCommand( |
+ command, |
+ &tab_id, |
+ &user_agent_override)) { |
return; |
} |
current_tab->user_agent_override.swap(user_agent_override); |