OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sessions/persistent_tab_restore_service.h" | 5 #include "chrome/browser/sessions/persistent_tab_restore_service.h" |
6 | 6 |
7 #include <cstring> // memcpy | 7 #include <cstring> // memcpy |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/memory/scoped_vector.h" | 16 #include "base/memory/scoped_vector.h" |
17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
18 #include "base/task/cancelable_task_tracker.h" | 18 #include "base/task/cancelable_task_tracker.h" |
19 #include "base/time/time.h" | 19 #include "base/time/time.h" |
20 #include "chrome/browser/profiles/profile.h" | |
21 #include "chrome/browser/sessions/base_session_service_delegate_impl.h" | 20 #include "chrome/browser/sessions/base_session_service_delegate_impl.h" |
22 #include "components/sessions/base_session_service.h" | 21 #include "components/sessions/base_session_service.h" |
23 #include "components/sessions/base_session_service_commands.h" | 22 #include "components/sessions/base_session_service_commands.h" |
24 #include "components/sessions/core/session_constants.h" | 23 #include "components/sessions/core/session_constants.h" |
25 #include "components/sessions/session_command.h" | 24 #include "components/sessions/session_command.h" |
26 #include "content/public/browser/session_storage_namespace.h" | 25 #include "content/public/browser/session_storage_namespace.h" |
27 | 26 |
28 namespace { | 27 namespace { |
29 | 28 |
30 // Only written if the tab is pinned. | 29 // Only written if the tab is pinned. |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 } // namespace | 110 } // namespace |
112 | 111 |
113 // PersistentTabRestoreService::Delegate --------------------------------------- | 112 // PersistentTabRestoreService::Delegate --------------------------------------- |
114 | 113 |
115 // This restore service will create and own a BaseSessionService and implement | 114 // This restore service will create and own a BaseSessionService and implement |
116 // the required BaseSessionServiceDelegateImpl. | 115 // the required BaseSessionServiceDelegateImpl. |
117 class PersistentTabRestoreService::Delegate | 116 class PersistentTabRestoreService::Delegate |
118 : public BaseSessionServiceDelegateImpl, | 117 : public BaseSessionServiceDelegateImpl, |
119 public TabRestoreServiceHelper::Observer { | 118 public TabRestoreServiceHelper::Observer { |
120 public: | 119 public: |
121 Delegate(Profile* profile, sessions::TabRestoreServiceClient* client); | 120 explicit Delegate(sessions::TabRestoreServiceClient* client); |
122 | 121 |
123 ~Delegate() override; | 122 ~Delegate() override; |
124 | 123 |
125 // BaseSessionServiceDelegateImpl: | 124 // BaseSessionServiceDelegateImpl: |
126 void OnWillSaveCommands() override; | 125 void OnWillSaveCommands() override; |
127 | 126 |
128 // TabRestoreServiceHelper::Observer: | 127 // TabRestoreServiceHelper::Observer: |
129 void OnClearEntries() override; | 128 void OnClearEntries() override; |
130 void OnRestoreEntryById(SessionID::id_type id, | 129 void OnRestoreEntryById(SessionID::id_type id, |
131 Entries::const_iterator entry_iterator) override; | 130 Entries::const_iterator entry_iterator) override; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 // If |id_to_entry| contains an entry for |id| the corresponding entry is | 215 // If |id_to_entry| contains an entry for |id| the corresponding entry is |
217 // deleted and removed from both |id_to_entry| and |entries|. This is used | 216 // deleted and removed from both |id_to_entry| and |entries|. This is used |
218 // when creating entries from the backend file. | 217 // when creating entries from the backend file. |
219 void RemoveEntryByID(SessionID::id_type id, | 218 void RemoveEntryByID(SessionID::id_type id, |
220 IDToEntry* id_to_entry, | 219 IDToEntry* id_to_entry, |
221 std::vector<TabRestoreService::Entry*>* entries); | 220 std::vector<TabRestoreService::Entry*>* entries); |
222 | 221 |
223 private: | 222 private: |
224 scoped_ptr<sessions::BaseSessionService> base_session_service_; | 223 scoped_ptr<sessions::BaseSessionService> base_session_service_; |
225 | 224 |
226 // The associated profile. | |
227 Profile* profile_; | |
228 | |
229 // The associated client. | 225 // The associated client. |
230 sessions::TabRestoreServiceClient* client_; | 226 sessions::TabRestoreServiceClient* client_; |
231 | 227 |
232 TabRestoreServiceHelper* tab_restore_service_helper_; | 228 TabRestoreServiceHelper* tab_restore_service_helper_; |
233 | 229 |
234 // The number of entries to write. | 230 // The number of entries to write. |
235 int entries_to_write_; | 231 int entries_to_write_; |
236 | 232 |
237 // Number of entries we've written. | 233 // Number of entries we've written. |
238 int entries_written_; | 234 int entries_written_; |
239 | 235 |
240 // Whether we've loaded the last session. | 236 // Whether we've loaded the last session. |
241 int load_state_; | 237 int load_state_; |
242 | 238 |
243 // Results from previously closed tabs/sessions is first added here. When the | 239 // Results from previously closed tabs/sessions is first added here. When the |
244 // results from both us and the session restore service have finished loading | 240 // results from both us and the session restore service have finished loading |
245 // LoadStateChanged is invoked, which adds these entries to entries_. | 241 // LoadStateChanged is invoked, which adds these entries to entries_. |
246 ScopedVector<Entry> staging_entries_; | 242 ScopedVector<Entry> staging_entries_; |
247 | 243 |
248 // Used when loading previous tabs/session and open tabs/session. | 244 // Used when loading previous tabs/session and open tabs/session. |
249 base::CancelableTaskTracker cancelable_task_tracker_; | 245 base::CancelableTaskTracker cancelable_task_tracker_; |
250 | 246 |
251 DISALLOW_COPY_AND_ASSIGN(Delegate); | 247 DISALLOW_COPY_AND_ASSIGN(Delegate); |
252 }; | 248 }; |
253 | 249 |
254 PersistentTabRestoreService::Delegate::Delegate( | 250 PersistentTabRestoreService::Delegate::Delegate( |
255 Profile* profile, | |
256 sessions::TabRestoreServiceClient* client) | 251 sessions::TabRestoreServiceClient* client) |
257 : BaseSessionServiceDelegateImpl(true), | 252 : BaseSessionServiceDelegateImpl(true), |
258 base_session_service_(new sessions::BaseSessionService( | 253 base_session_service_(new sessions::BaseSessionService( |
259 sessions::BaseSessionService::TAB_RESTORE, | 254 sessions::BaseSessionService::TAB_RESTORE, |
260 profile->GetPath(), | 255 client->GetPathToSaveTo(), |
261 this)), | 256 this)), |
262 profile_(profile), | |
263 client_(client), | 257 client_(client), |
264 tab_restore_service_helper_(NULL), | 258 tab_restore_service_helper_(NULL), |
265 entries_to_write_(0), | 259 entries_to_write_(0), |
266 entries_written_(0), | 260 entries_written_(0), |
267 load_state_(NOT_LOADED) { | 261 load_state_(NOT_LOADED) {} |
268 // We should never be created when incognito. | |
269 DCHECK(!profile->IsOffTheRecord()); | |
270 } | |
271 | 262 |
272 PersistentTabRestoreService::Delegate::~Delegate() {} | 263 PersistentTabRestoreService::Delegate::~Delegate() {} |
273 | 264 |
274 void PersistentTabRestoreService::Delegate::OnWillSaveCommands() { | 265 void PersistentTabRestoreService::Delegate::OnWillSaveCommands() { |
275 const Entries& entries = tab_restore_service_helper_->entries(); | 266 const Entries& entries = tab_restore_service_helper_->entries(); |
276 int to_write_count = std::min(entries_to_write_, | 267 int to_write_count = std::min(entries_to_write_, |
277 static_cast<int>(entries.size())); | 268 static_cast<int>(entries.size())); |
278 entries_to_write_ = 0; | 269 entries_to_write_ = 0; |
279 if (entries_written_ + to_write_count > kEntriesPerReset) { | 270 if (entries_written_ + to_write_count > kEntriesPerReset) { |
280 to_write_count = entries.size(); | 271 to_write_count = entries.size(); |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 } | 911 } |
921 } | 912 } |
922 | 913 |
923 // PersistentTabRestoreService ------------------------------------------------- | 914 // PersistentTabRestoreService ------------------------------------------------- |
924 | 915 |
925 PersistentTabRestoreService::PersistentTabRestoreService( | 916 PersistentTabRestoreService::PersistentTabRestoreService( |
926 Profile* profile, | 917 Profile* profile, |
927 scoped_ptr<sessions::TabRestoreServiceClient> client, | 918 scoped_ptr<sessions::TabRestoreServiceClient> client, |
928 TimeFactory* time_factory) | 919 TimeFactory* time_factory) |
929 : client_(client.Pass()), | 920 : client_(client.Pass()), |
930 delegate_(new Delegate(profile, client_.get())), | 921 delegate_(new Delegate(client_.get())), |
931 helper_(this, delegate_.get(), profile, time_factory) { | 922 helper_(this, delegate_.get(), profile, client_.get(), time_factory) { |
932 delegate_->set_tab_restore_service_helper(&helper_); | 923 delegate_->set_tab_restore_service_helper(&helper_); |
933 } | 924 } |
934 | 925 |
935 PersistentTabRestoreService::~PersistentTabRestoreService() {} | 926 PersistentTabRestoreService::~PersistentTabRestoreService() {} |
936 | 927 |
937 void PersistentTabRestoreService::AddObserver( | 928 void PersistentTabRestoreService::AddObserver( |
938 TabRestoreServiceObserver* observer) { | 929 TabRestoreServiceObserver* observer) { |
939 helper_.AddObserver(observer); | 930 helper_.AddObserver(observer); |
940 } | 931 } |
941 | 932 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1005 delegate_->LoadTabsFromLastSession(); | 996 delegate_->LoadTabsFromLastSession(); |
1006 } | 997 } |
1007 | 998 |
1008 TabRestoreService::Entries* PersistentTabRestoreService::mutable_entries() { | 999 TabRestoreService::Entries* PersistentTabRestoreService::mutable_entries() { |
1009 return &helper_.entries_; | 1000 return &helper_.entries_; |
1010 } | 1001 } |
1011 | 1002 |
1012 void PersistentTabRestoreService::PruneEntries() { | 1003 void PersistentTabRestoreService::PruneEntries() { |
1013 helper_.PruneEntries(); | 1004 helper_.PruneEntries(); |
1014 } | 1005 } |
OLD | NEW |