| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "components/sync_sessions/sessions_sync_manager.h" | 5 #include "components/sync_sessions/sessions_sync_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 15 #include "chrome/browser/sessions/session_tab_helper.h" | 15 #include "chrome/browser/sessions/session_tab_helper.h" |
| 16 #include "chrome/browser/sync/chrome_sync_client.h" | 16 #include "chrome/browser/sync/chrome_sync_client.h" |
| 17 #include "chrome/browser/sync/glue/session_sync_test_helper.h" | |
| 18 #include "chrome/browser/sync/sessions/notification_service_sessions_router.h" | 17 #include "chrome/browser/sync/sessions/notification_service_sessions_router.h" |
| 19 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h" | 18 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h" |
| 20 #include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" | 19 #include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" |
| 21 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 22 #include "chrome/test/base/browser_with_test_window_test.h" | 21 #include "chrome/test/base/browser_with_test_window_test.h" |
| 23 #include "components/sessions/content/content_serialized_navigation_builder.h" | 22 #include "components/sessions/content/content_serialized_navigation_builder.h" |
| 24 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" | 23 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" |
| 25 #include "components/sessions/core/session_id.h" | 24 #include "components/sessions/core/session_id.h" |
| 26 #include "components/sessions/core/session_types.h" | 25 #include "components/sessions/core/session_types.h" |
| 27 #include "components/sync/api/attachments/attachment_id.h" | 26 #include "components/sync/api/attachments/attachment_id.h" |
| 28 #include "components/sync/api/sync_error_factory_mock.h" | 27 #include "components/sync/api/sync_error_factory_mock.h" |
| 29 #include "components/sync/core/attachments/attachment_service_proxy_for_test.h" | 28 #include "components/sync/core/attachments/attachment_service_proxy_for_test.h" |
| 30 #include "components/sync/device_info/device_info.h" | 29 #include "components/sync/device_info/device_info.h" |
| 31 #include "components/sync/device_info/local_device_info_provider_mock.h" | 30 #include "components/sync/device_info/local_device_info_provider_mock.h" |
| 32 #include "components/sync/driver/sync_api_component_factory.h" | 31 #include "components/sync/driver/sync_api_component_factory.h" |
| 32 #include "components/sync_sessions/session_sync_test_helper.h" |
| 33 #include "components/sync_sessions/sync_sessions_client.h" | 33 #include "components/sync_sessions/sync_sessions_client.h" |
| 34 #include "components/sync_sessions/synced_tab_delegate.h" | 34 #include "components/sync_sessions/synced_tab_delegate.h" |
| 35 #include "components/sync_sessions/synced_window_delegate.h" | 35 #include "components/sync_sessions/synced_window_delegate.h" |
| 36 #include "components/sync_sessions/synced_window_delegates_getter.h" | 36 #include "components/sync_sessions/synced_window_delegates_getter.h" |
| 37 #include "content/public/browser/navigation_entry.h" | 37 #include "content/public/browser/navigation_entry.h" |
| 38 #include "content/public/browser/web_contents.h" | 38 #include "content/public/browser/web_contents.h" |
| 39 #include "testing/gmock/include/gmock/gmock.h" | 39 #include "testing/gmock/include/gmock/gmock.h" |
| 40 #include "testing/gtest/include/gtest/gtest.h" | 40 #include "testing/gtest/include/gtest/gtest.h" |
| 41 | 41 |
| 42 using content::WebContents; | 42 using content::WebContents; |
| 43 using sessions::SerializedNavigationEntry; | 43 using sessions::SerializedNavigationEntry; |
| 44 using sessions::SerializedNavigationEntryTestHelper; | 44 using sessions::SerializedNavigationEntryTestHelper; |
| 45 using sync_driver::DeviceInfo; | 45 using sync_driver::DeviceInfo; |
| 46 using sync_driver::LocalDeviceInfoProvider; | 46 using sync_driver::LocalDeviceInfoProvider; |
| 47 using sync_driver::LocalDeviceInfoProviderMock; | 47 using sync_driver::LocalDeviceInfoProviderMock; |
| 48 using sync_driver::SyncedSession; | |
| 49 using syncer::SyncChange; | 48 using syncer::SyncChange; |
| 50 using syncer::SyncData; | 49 using syncer::SyncData; |
| 51 | 50 |
| 52 namespace browser_sync { | 51 namespace sync_sessions { |
| 53 | 52 |
| 54 namespace { | 53 namespace { |
| 55 | 54 |
| 56 class SessionNotificationObserver { | 55 class SessionNotificationObserver { |
| 57 public: | 56 public: |
| 58 SessionNotificationObserver() | 57 SessionNotificationObserver() |
| 59 : notified_of_update_(false), notified_of_refresh_(false) {} | 58 : notified_of_update_(false), notified_of_refresh_(false) {} |
| 60 void NotifyOfUpdate() { notified_of_update_ = true; } | 59 void NotifyOfUpdate() { notified_of_update_ = true; } |
| 61 void NotifyOfRefresh() { notified_of_refresh_ = true; } | 60 void NotifyOfRefresh() { notified_of_refresh_ = true; } |
| 62 | 61 |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 } | 202 } |
| 204 | 203 |
| 205 int CountIfTagMatches(const syncer::SyncChangeList& changes, | 204 int CountIfTagMatches(const syncer::SyncChangeList& changes, |
| 206 const std::string& tag) { | 205 const std::string& tag) { |
| 207 return std::count_if( | 206 return std::count_if( |
| 208 changes.begin(), changes.end(), [&tag](const syncer::SyncChange& change) { | 207 changes.begin(), changes.end(), [&tag](const syncer::SyncChange& change) { |
| 209 return change.sync_data().GetSpecifics().session().session_tag() == tag; | 208 return change.sync_data().GetSpecifics().session().session_tag() == tag; |
| 210 }); | 209 }); |
| 211 } | 210 } |
| 212 | 211 |
| 213 int CountIfTagMatches( | 212 int CountIfTagMatches(const std::vector<const SyncedSession*>& sessions, |
| 214 const std::vector<const sync_driver::SyncedSession*>& sessions, | 213 const std::string& tag) { |
| 215 const std::string& tag) { | |
| 216 return std::count_if(sessions.begin(), sessions.end(), | 214 return std::count_if(sessions.begin(), sessions.end(), |
| 217 [&tag](const sync_driver::SyncedSession* session) { | 215 [&tag](const SyncedSession* session) { |
| 218 return session->session_tag == tag; | 216 return session->session_tag == tag; |
| 219 }); | 217 }); |
| 220 } | 218 } |
| 221 | 219 |
| 222 // Creates a field trial with the specified |trial_name| and |group_name| and | 220 // Creates a field trial with the specified |trial_name| and |group_name| and |
| 223 // registers an associated |variation_id| for it for the given |service|. | 221 // registers an associated |variation_id| for it for the given |service|. |
| 224 void CreateAndActivateFieldTrial(const std::string& trial_name, | 222 void CreateAndActivateFieldTrial(const std::string& trial_name, |
| 225 const std::string& group_name, | 223 const std::string& group_name, |
| 226 variations::VariationID variation_id, | 224 variations::VariationID variation_id, |
| 227 variations::IDCollectionKey service) { | 225 variations::IDCollectionKey service) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 238 void StartRoutingTo(LocalSessionEventHandler* handler) override {} | 236 void StartRoutingTo(LocalSessionEventHandler* handler) override {} |
| 239 void Stop() override {} | 237 void Stop() override {} |
| 240 }; | 238 }; |
| 241 | 239 |
| 242 std::unique_ptr<LocalSessionEventRouter> NewDummyRouter() { | 240 std::unique_ptr<LocalSessionEventRouter> NewDummyRouter() { |
| 243 return std::unique_ptr<LocalSessionEventRouter>(new DummyRouter()); | 241 return std::unique_ptr<LocalSessionEventRouter>(new DummyRouter()); |
| 244 } | 242 } |
| 245 | 243 |
| 246 // Provides ability to override SyncedWindowDelegatesGetter. | 244 // Provides ability to override SyncedWindowDelegatesGetter. |
| 247 // All other calls are passed through to the original SyncSessionsClient. | 245 // All other calls are passed through to the original SyncSessionsClient. |
| 248 class SyncSessionsClientShim : public sync_sessions::SyncSessionsClient { | 246 class SyncSessionsClientShim : public SyncSessionsClient { |
| 249 public: | 247 public: |
| 250 SyncSessionsClientShim( | 248 explicit SyncSessionsClientShim(SyncSessionsClient* sync_sessions_client) |
| 251 sync_sessions::SyncSessionsClient* sync_sessions_client) | |
| 252 : sync_sessions_client_(sync_sessions_client), | 249 : sync_sessions_client_(sync_sessions_client), |
| 253 synced_window_getter_(nullptr) {} | 250 synced_window_getter_(nullptr) {} |
| 254 ~SyncSessionsClientShim() override {} | 251 ~SyncSessionsClientShim() override {} |
| 255 | 252 |
| 256 bookmarks::BookmarkModel* GetBookmarkModel() override { | 253 bookmarks::BookmarkModel* GetBookmarkModel() override { |
| 257 return sync_sessions_client_->GetBookmarkModel(); | 254 return sync_sessions_client_->GetBookmarkModel(); |
| 258 } | 255 } |
| 259 | 256 |
| 260 favicon::FaviconService* GetFaviconService() override { | 257 favicon::FaviconService* GetFaviconService() override { |
| 261 return sync_sessions_client_->GetFaviconService(); | 258 return sync_sessions_client_->GetFaviconService(); |
| 262 } | 259 } |
| 263 | 260 |
| 264 history::HistoryService* GetHistoryService() override { | 261 history::HistoryService* GetHistoryService() override { |
| 265 return sync_sessions_client_->GetHistoryService(); | 262 return sync_sessions_client_->GetHistoryService(); |
| 266 } | 263 } |
| 267 | 264 |
| 268 bool ShouldSyncURL(const GURL& url) const override { | 265 bool ShouldSyncURL(const GURL& url) const override { |
| 269 return sync_sessions_client_->ShouldSyncURL(url); | 266 return sync_sessions_client_->ShouldSyncURL(url); |
| 270 } | 267 } |
| 271 | 268 |
| 272 browser_sync::SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter() | 269 SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter() override { |
| 273 override { | |
| 274 // The idea here is to allow the test code override the default | 270 // The idea here is to allow the test code override the default |
| 275 // SyncedWindowDelegatesGetter provided by |sync_sessions_client_|. | 271 // SyncedWindowDelegatesGetter provided by |sync_sessions_client_|. |
| 276 // If |synced_window_getter_| is explicitly set, return it; otherwise return | 272 // If |synced_window_getter_| is explicitly set, return it; otherwise return |
| 277 // the default one provided by |sync_sessions_client_|. | 273 // the default one provided by |sync_sessions_client_|. |
| 278 return synced_window_getter_ | 274 return synced_window_getter_ |
| 279 ? synced_window_getter_ | 275 ? synced_window_getter_ |
| 280 : sync_sessions_client_->GetSyncedWindowDelegatesGetter(); | 276 : sync_sessions_client_->GetSyncedWindowDelegatesGetter(); |
| 281 } | 277 } |
| 282 | 278 |
| 283 std::unique_ptr<browser_sync::LocalSessionEventRouter> | 279 std::unique_ptr<LocalSessionEventRouter> GetLocalSessionEventRouter() |
| 284 GetLocalSessionEventRouter() override { | 280 override { |
| 285 return sync_sessions_client_->GetLocalSessionEventRouter(); | 281 return sync_sessions_client_->GetLocalSessionEventRouter(); |
| 286 } | 282 } |
| 287 | 283 |
| 288 void set_synced_window_getter( | 284 void set_synced_window_getter( |
| 289 browser_sync::SyncedWindowDelegatesGetter* synced_window_getter) { | 285 SyncedWindowDelegatesGetter* synced_window_getter) { |
| 290 synced_window_getter_ = synced_window_getter; | 286 synced_window_getter_ = synced_window_getter; |
| 291 } | 287 } |
| 292 | 288 |
| 293 private: | 289 private: |
| 294 sync_sessions::SyncSessionsClient* const sync_sessions_client_; | 290 SyncSessionsClient* const sync_sessions_client_; |
| 295 browser_sync::SyncedWindowDelegatesGetter* synced_window_getter_; | 291 SyncedWindowDelegatesGetter* synced_window_getter_; |
| 296 }; | 292 }; |
| 297 | 293 |
| 298 } // namespace | 294 } // namespace |
| 299 | 295 |
| 300 class SessionsSyncManagerTest | 296 class SessionsSyncManagerTest |
| 301 : public BrowserWithTestWindowTest { | 297 : public BrowserWithTestWindowTest { |
| 302 protected: | 298 protected: |
| 303 SessionsSyncManagerTest() | 299 SessionsSyncManagerTest() |
| 304 : test_processor_(NULL) { | 300 : test_processor_(NULL) { |
| 305 local_device_.reset(new LocalDeviceInfoProviderMock( | 301 local_device_.reset(new LocalDeviceInfoProviderMock( |
| 306 "cache_guid", | 302 "cache_guid", |
| 307 "Wayne Gretzky's Hacking Box", | 303 "Wayne Gretzky's Hacking Box", |
| 308 "Chromium 10k", | 304 "Chromium 10k", |
| 309 "Chrome 10k", | 305 "Chrome 10k", |
| 310 sync_pb::SyncEnums_DeviceType_TYPE_LINUX, | 306 sync_pb::SyncEnums_DeviceType_TYPE_LINUX, |
| 311 "device_id")); | 307 "device_id")); |
| 312 } | 308 } |
| 313 | 309 |
| 314 void SetUp() override { | 310 void SetUp() override { |
| 315 BrowserWithTestWindowTest::SetUp(); | 311 BrowserWithTestWindowTest::SetUp(); |
| 316 sync_client_.reset(new browser_sync::ChromeSyncClient(profile())); | 312 sync_client_.reset(new browser_sync::ChromeSyncClient(profile())); |
| 317 sessions_client_shim_.reset( | 313 sessions_client_shim_.reset( |
| 318 new SyncSessionsClientShim(sync_client_->GetSyncSessionsClient())); | 314 new SyncSessionsClientShim(sync_client_->GetSyncSessionsClient())); |
| 319 browser_sync::NotificationServiceSessionsRouter* router( | 315 NotificationServiceSessionsRouter* router( |
| 320 new browser_sync::NotificationServiceSessionsRouter( | 316 new NotificationServiceSessionsRouter( |
| 321 profile(), GetSyncSessionsClient(), | 317 profile(), GetSyncSessionsClient(), |
| 322 syncer::SyncableService::StartSyncFlare())); | 318 syncer::SyncableService::StartSyncFlare())); |
| 323 sync_prefs_.reset(new sync_driver::SyncPrefs(profile()->GetPrefs())); | 319 sync_prefs_.reset(new sync_driver::SyncPrefs(profile()->GetPrefs())); |
| 324 manager_.reset(new SessionsSyncManager( | 320 manager_.reset(new SessionsSyncManager( |
| 325 GetSyncSessionsClient(), sync_prefs_.get(), local_device_.get(), | 321 GetSyncSessionsClient(), sync_prefs_.get(), local_device_.get(), |
| 326 std::unique_ptr<LocalSessionEventRouter>(router), | 322 std::unique_ptr<LocalSessionEventRouter>(router), |
| 327 base::Bind(&SessionNotificationObserver::NotifyOfUpdate, | 323 base::Bind(&SessionNotificationObserver::NotifyOfUpdate, |
| 328 base::Unretained(&observer_)), | 324 base::Unretained(&observer_)), |
| 329 base::Bind(&SessionNotificationObserver::NotifyOfRefresh, | 325 base::Bind(&SessionNotificationObserver::NotifyOfRefresh, |
| 330 base::Unretained(&observer_)))); | 326 base::Unretained(&observer_)))); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 it = list->erase(it); | 381 it = list->erase(it); |
| 386 found = true; | 382 found = true; |
| 387 } else { | 383 } else { |
| 388 ++it; | 384 ++it; |
| 389 } | 385 } |
| 390 } | 386 } |
| 391 EXPECT_TRUE(found); | 387 EXPECT_TRUE(found); |
| 392 return list; | 388 return list; |
| 393 } | 389 } |
| 394 | 390 |
| 395 sync_sessions::SyncSessionsClient* GetSyncSessionsClient() { | 391 SyncSessionsClient* GetSyncSessionsClient() { |
| 396 return sessions_client_shim_.get(); | 392 return sessions_client_shim_.get(); |
| 397 } | 393 } |
| 398 | 394 |
| 399 sync_driver::SyncPrefs* sync_prefs() { return sync_prefs_.get(); } | 395 sync_driver::SyncPrefs* sync_prefs() { return sync_prefs_.get(); } |
| 400 | 396 |
| 401 browser_sync::SyncedWindowDelegatesGetter* get_synced_window_getter() { | 397 SyncedWindowDelegatesGetter* get_synced_window_getter() { |
| 402 return manager()->synced_window_delegates_getter(); | 398 return manager()->synced_window_delegates_getter(); |
| 403 } | 399 } |
| 404 | 400 |
| 405 void set_synced_window_getter( | 401 void set_synced_window_getter( |
| 406 browser_sync::SyncedWindowDelegatesGetter* synced_window_getter) { | 402 SyncedWindowDelegatesGetter* synced_window_getter) { |
| 407 sessions_client_shim_->set_synced_window_getter(synced_window_getter); | 403 sessions_client_shim_->set_synced_window_getter(synced_window_getter); |
| 408 } | 404 } |
| 409 | 405 |
| 410 syncer::SyncChange MakeRemoteChange( | 406 syncer::SyncChange MakeRemoteChange( |
| 411 const sync_pb::SessionSpecifics& specifics, | 407 const sync_pb::SessionSpecifics& specifics, |
| 412 SyncChange::SyncChangeType type) const { | 408 SyncChange::SyncChangeType type) const { |
| 413 return syncer::SyncChange(FROM_HERE, type, CreateRemoteData(specifics)); | 409 return syncer::SyncChange(FROM_HERE, type, CreateRemoteData(specifics)); |
| 414 } | 410 } |
| 415 | 411 |
| 416 void AddTabsToChangeList(const std::vector<sync_pb::SessionSpecifics>& batch, | 412 void AddTabsToChangeList(const std::vector<sync_pb::SessionSpecifics>& batch, |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 blocked_navigations_.size(), *entry); | 567 blocked_navigations_.size(), *entry); |
| 572 blocked_navigations_.push_back(serialized_entry.release()); | 568 blocked_navigations_.push_back(serialized_entry.release()); |
| 573 } | 569 } |
| 574 } | 570 } |
| 575 bool IsPlaceholderTab() const override { return true; } | 571 bool IsPlaceholderTab() const override { return true; } |
| 576 | 572 |
| 577 // Session sync related methods. | 573 // Session sync related methods. |
| 578 int GetSyncId() const override { return sync_id_; } | 574 int GetSyncId() const override { return sync_id_; } |
| 579 void SetSyncId(int sync_id) override { sync_id_ = sync_id; } | 575 void SetSyncId(int sync_id) override { sync_id_ = sync_id; } |
| 580 | 576 |
| 581 bool ShouldSync(sync_sessions::SyncSessionsClient* sessions_client) override { | 577 bool ShouldSync(SyncSessionsClient* sessions_client) override { |
| 582 return false; | 578 return false; |
| 583 } | 579 } |
| 584 | 580 |
| 585 void reset() { | 581 void reset() { |
| 586 current_entry_index_ = 0; | 582 current_entry_index_ = 0; |
| 587 sync_id_ = -1; | 583 sync_id_ = -1; |
| 588 entries_.clear(); | 584 entries_.clear(); |
| 589 } | 585 } |
| 590 | 586 |
| 591 private: | 587 private: |
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1774 1, entity, base::Time(), syncer::AttachmentIdList(), | 1770 1, entity, base::Time(), syncer::AttachmentIdList(), |
| 1775 syncer::AttachmentServiceProxyForTest::Create(), "bad_tab_tag_hash")); | 1771 syncer::AttachmentServiceProxyForTest::Create(), "bad_tab_tag_hash")); |
| 1776 | 1772 |
| 1777 syncer::SyncChangeList output; | 1773 syncer::SyncChangeList output; |
| 1778 InitWithSyncDataTakeOutput(foreign_data, &output); | 1774 InitWithSyncDataTakeOutput(foreign_data, &output); |
| 1779 ASSERT_EQ(2U, FilterOutLocalHeaderChanges(&output)->size()); | 1775 ASSERT_EQ(2U, FilterOutLocalHeaderChanges(&output)->size()); |
| 1780 ExpectAllOfChangesType(output, SyncChange::ACTION_DELETE); | 1776 ExpectAllOfChangesType(output, SyncChange::ACTION_DELETE); |
| 1781 EXPECT_EQ(1, CountIfTagMatches(output, bad_header_tag)); | 1777 EXPECT_EQ(1, CountIfTagMatches(output, bad_header_tag)); |
| 1782 EXPECT_EQ(1, CountIfTagMatches(output, bad_tab_tag)); | 1778 EXPECT_EQ(1, CountIfTagMatches(output, bad_tab_tag)); |
| 1783 | 1779 |
| 1784 std::vector<const sync_driver::SyncedSession*> sessions; | 1780 std::vector<const SyncedSession*> sessions; |
| 1785 manager()->session_tracker_.LookupAllForeignSessions( | 1781 manager()->session_tracker_.LookupAllForeignSessions( |
| 1786 &sessions, SyncedSessionTracker::RAW); | 1782 &sessions, SyncedSessionTracker::RAW); |
| 1787 ASSERT_EQ(2U, sessions.size()); | 1783 ASSERT_EQ(2U, sessions.size()); |
| 1788 EXPECT_EQ(1, CountIfTagMatches(sessions, good_header_tag)); | 1784 EXPECT_EQ(1, CountIfTagMatches(sessions, good_header_tag)); |
| 1789 EXPECT_EQ(1, CountIfTagMatches(sessions, good_tag_tab)); | 1785 EXPECT_EQ(1, CountIfTagMatches(sessions, good_tag_tab)); |
| 1790 } | 1786 } |
| 1791 | 1787 |
| 1792 // Test that things work if a tab is initially ignored. | 1788 // Test that things work if a tab is initially ignored. |
| 1793 TEST_F(SessionsSyncManagerTest, AssociateWindowsDontReloadTabs) { | 1789 TEST_F(SessionsSyncManagerTest, AssociateWindowsDontReloadTabs) { |
| 1794 syncer::SyncChangeList out; | 1790 syncer::SyncChangeList out; |
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2599 ASSERT_EQ(tab_list1.size() + tab_list2.size(), tabs.size()); | 2595 ASSERT_EQ(tab_list1.size() + tab_list2.size(), tabs.size()); |
| 2600 base::Time last_time; | 2596 base::Time last_time; |
| 2601 for (size_t i = 0; i < tabs.size(); ++i) { | 2597 for (size_t i = 0; i < tabs.size(); ++i) { |
| 2602 base::Time this_time = tabs[i]->timestamp; | 2598 base::Time this_time = tabs[i]->timestamp; |
| 2603 if (i > 0) | 2599 if (i > 0) |
| 2604 ASSERT_GE(last_time, this_time); | 2600 ASSERT_GE(last_time, this_time); |
| 2605 last_time = tabs[i]->timestamp; | 2601 last_time = tabs[i]->timestamp; |
| 2606 } | 2602 } |
| 2607 } | 2603 } |
| 2608 | 2604 |
| 2609 } // namespace browser_sync | 2605 } // namespace sync_sessions |
| OLD | NEW |