| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 using sessions::SerializedNavigationEntryTestHelper; | 32 using sessions::SerializedNavigationEntryTestHelper; |
| 33 using syncer::DeviceInfo; | 33 using syncer::DeviceInfo; |
| 34 using syncer::LocalDeviceInfoProvider; | 34 using syncer::LocalDeviceInfoProvider; |
| 35 using syncer::LocalDeviceInfoProviderMock; | 35 using syncer::LocalDeviceInfoProviderMock; |
| 36 using syncer::SyncChange; | 36 using syncer::SyncChange; |
| 37 using syncer::SyncChangeList; | 37 using syncer::SyncChangeList; |
| 38 using syncer::SyncData; | 38 using syncer::SyncData; |
| 39 using syncer::SyncDataList; | 39 using syncer::SyncDataList; |
| 40 using syncer::SyncDataLocal; | 40 using syncer::SyncDataLocal; |
| 41 using syncer::SyncError; | 41 using syncer::SyncError; |
| 42 using testing::ElementsAre; | |
| 43 | 42 |
| 44 namespace sync_sessions { | 43 namespace sync_sessions { |
| 45 | 44 |
| 46 namespace { | 45 namespace { |
| 47 | 46 |
| 48 const char kTitle[] = "title"; | 47 const char kTitle[] = "title"; |
| 49 const char kFoo1[] = "http://foo1/"; | 48 const char kFoo1[] = "http://foo1/"; |
| 50 const char kFoo2[] = "http://foo2/"; | 49 const char kFoo2[] = "http://foo2/"; |
| 51 const char kBar1[] = "http://bar1/"; | 50 const char kBar1[] = "http://bar1/"; |
| 52 const char kBar2[] = "http://bar2/"; | 51 const char kBar2[] = "http://bar2/"; |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 int http_count = 0; | 204 int http_count = 0; |
| 206 for (auto& entry : entries_) { | 205 for (auto& entry : entries_) { |
| 207 if (!entry->virtual_url().is_valid()) | 206 if (!entry->virtual_url().is_valid()) |
| 208 return false; | 207 return false; |
| 209 if (entry->virtual_url().SchemeIsHTTPOrHTTPS()) | 208 if (entry->virtual_url().SchemeIsHTTPOrHTTPS()) |
| 210 http_count++; | 209 http_count++; |
| 211 } | 210 } |
| 212 return http_count > 0; | 211 return http_count > 0; |
| 213 } | 212 } |
| 214 | 213 |
| 215 SessionID::id_type GetSourceTabID() const override { return source_tab_id_; } | 214 SessionID::id_type GetSourceTabID() const override { return kInvalidTabID; } |
| 216 void SetSourceTabID(SessionID::id_type source_tab_id) { | |
| 217 source_tab_id_ = source_tab_id; | |
| 218 } | |
| 219 | 215 |
| 220 void AppendEntry(std::unique_ptr<sessions::SerializedNavigationEntry> entry) { | 216 void AppendEntry(std::unique_ptr<sessions::SerializedNavigationEntry> entry) { |
| 221 entries_.push_back(std::move(entry)); | 217 entries_.push_back(std::move(entry)); |
| 222 } | 218 } |
| 223 | 219 |
| 224 void set_current_entry_index(int i) { current_entry_index_ = i; } | 220 void set_current_entry_index(int i) { current_entry_index_ = i; } |
| 225 | 221 |
| 226 void SetWindowId(SessionID::id_type window_id) { | 222 void SetWindowId(SessionID::id_type window_id) { |
| 227 window_id_.set_id(window_id); | 223 window_id_.set_id(window_id); |
| 228 } | 224 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 242 current_entry_index_ = 0; | 238 current_entry_index_ = 0; |
| 243 sync_id_ = TabNodePool::kInvalidTabNodeID; | 239 sync_id_ = TabNodePool::kInvalidTabNodeID; |
| 244 entries_.clear(); | 240 entries_.clear(); |
| 245 } | 241 } |
| 246 | 242 |
| 247 private: | 243 private: |
| 248 int current_entry_index_ = -1; | 244 int current_entry_index_ = -1; |
| 249 bool is_supervised_ = false; | 245 bool is_supervised_ = false; |
| 250 int sync_id_ = kInvalidTabID; | 246 int sync_id_ = kInvalidTabID; |
| 251 SessionID tab_id_; | 247 SessionID tab_id_; |
| 252 SessionID::id_type source_tab_id_ = kInvalidTabID; | |
| 253 SessionID window_id_; | 248 SessionID window_id_; |
| 254 std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> | 249 std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> |
| 255 blocked_navigations_; | 250 blocked_navigations_; |
| 256 std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> | 251 std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> |
| 257 entries_; | 252 entries_; |
| 258 }; | 253 }; |
| 259 | 254 |
| 260 // A placeholder delegate. These delegates have no WebContents, simulating a tab | 255 // A placeholder delegate. These delegates have no WebContents, simulating a tab |
| 261 // that has been restored without bringing its state fully into memory (for | 256 // that has been restored without bringing its state fully into memory (for |
| 262 // example on Android), or where the tab's contents have been evicted from | 257 // example on Android), or where the tab's contents have been evicted from |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 | 677 |
| 683 SyncData CreateRemoteData(const sync_pb::EntitySpecifics& entity, | 678 SyncData CreateRemoteData(const sync_pb::EntitySpecifics& entity, |
| 684 base::Time mtime = base::Time()) const { | 679 base::Time mtime = base::Time()) const { |
| 685 // The server ID is never relevant to these tests, so just use 1. | 680 // The server ID is never relevant to these tests, so just use 1. |
| 686 return SyncData::CreateRemoteData( | 681 return SyncData::CreateRemoteData( |
| 687 1, entity, mtime, syncer::AttachmentIdList(), | 682 1, entity, mtime, syncer::AttachmentIdList(), |
| 688 syncer::AttachmentServiceProxyForTest::Create(), | 683 syncer::AttachmentServiceProxyForTest::Create(), |
| 689 SessionsSyncManager::TagHashFromSpecifics(entity.session())); | 684 SessionsSyncManager::TagHashFromSpecifics(entity.session())); |
| 690 } | 685 } |
| 691 | 686 |
| 692 // Creates a new tab within the window specified by |window_id| and from the | 687 // Creates a new tab within the window specified by |window_id|, and points it |
| 693 // source tab |source_tab_id|, and points it at |url|. Returns the newly | 688 // at |url|. Returns the newly created TestSyncedTabDelegate (not owned). |
| 694 // created TestSyncedTabDelegate (not owned). | |
| 695 TestSyncedTabDelegate* AddTab(SessionID::id_type window_id, | 689 TestSyncedTabDelegate* AddTab(SessionID::id_type window_id, |
| 696 const std::string& url, | 690 const std::string& url, |
| 697 SessionID::id_type source_tab_id, | |
| 698 base::Time time) { | 691 base::Time time) { |
| 699 tabs_.push_back(base::MakeUnique<TestSyncedTabDelegate>()); | 692 tabs_.push_back(base::MakeUnique<TestSyncedTabDelegate>()); |
| 700 for (auto& window : windows_) { | 693 for (auto& window : windows_) { |
| 701 if (window->GetSessionId() == window_id) { | 694 if (window->GetSessionId() == window_id) { |
| 702 int tab_index = window->GetTabCount(); | 695 int tab_index = window->GetTabCount(); |
| 703 window->OverrideTabAt(tab_index, tabs_.back().get()); | 696 window->OverrideTabAt(tab_index, tabs_.back().get()); |
| 704 } | 697 } |
| 705 } | 698 } |
| 706 tabs_.back()->SetSourceTabID(source_tab_id); | |
| 707 | 699 |
| 708 // Simulate the browser firing a tab parented notification, ahead of the | 700 // Simulate the browser firing a tab parented notification, ahead of the |
| 709 // actual navigation. | 701 // actual navigation. |
| 710 router_->NotifyNav(tabs_.back().get()); | 702 router_->NotifyNav(tabs_.back().get()); |
| 711 | 703 |
| 712 // Now do the actual navigation. | 704 // Now do the actual navigation. |
| 713 if (source_tab_id != kInvalidTabID) { | 705 NavigateTab(tabs_.back().get(), url, time); |
| 714 NavigateTab(tabs_.back().get(), url, time, ui::PAGE_TRANSITION_LINK); | |
| 715 } else { | |
| 716 NavigateTab(tabs_.back().get(), url, time); | |
| 717 } | |
| 718 return tabs_.back().get(); | 706 return tabs_.back().get(); |
| 719 } | 707 } |
| 720 TestSyncedTabDelegate* AddTab(SessionID::id_type window_id, | 708 TestSyncedTabDelegate* AddTab(SessionID::id_type window_id, |
| 721 const std::string& url, | |
| 722 base::Time time) { | |
| 723 return AddTab(window_id, url, kInvalidTabID, time); | |
| 724 } | |
| 725 TestSyncedTabDelegate* AddTab(SessionID::id_type window_id, | |
| 726 const std::string& url, | |
| 727 SessionID::id_type source_tab_id) { | |
| 728 return AddTab(window_id, url, source_tab_id, base::Time::Now()); | |
| 729 } | |
| 730 TestSyncedTabDelegate* AddTab(SessionID::id_type window_id, | |
| 731 const std::string& url) { | 709 const std::string& url) { |
| 732 return AddTab(window_id, url, kInvalidTabID); | 710 return AddTab(window_id, url, base::Time::Now()); |
| 733 } | 711 } |
| 734 | 712 |
| 735 void NavigateTab(TestSyncedTabDelegate* delegate, | 713 void NavigateTab(TestSyncedTabDelegate* delegate, |
| 736 const std::string& url, | 714 const std::string& url, |
| 737 base::Time time, | 715 base::Time time, |
| 738 ui::PageTransition transition) { | 716 ui::PageTransition transition) { |
| 739 auto entry = base::MakeUnique<sessions::SerializedNavigationEntry>( | 717 auto entry = base::MakeUnique<sessions::SerializedNavigationEntry>( |
| 740 SerializedNavigationEntryTestHelper::CreateNavigation(url, kTitle)); | 718 SerializedNavigationEntryTestHelper::CreateNavigation(url, kTitle)); |
| 741 SerializedNavigationEntryTestHelper::SetTimestamp(time, entry.get()); | 719 SerializedNavigationEntryTestHelper::SetTimestamp(time, entry.get()); |
| 742 SerializedNavigationEntryTestHelper::SetTransitionType(transition, | 720 SerializedNavigationEntryTestHelper::SetTransitionType(transition, |
| (...skipping 1866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2609 tab = SyncDataLocal(changes[3].sync_data()).GetSpecifics().session().tab(); | 2587 tab = SyncDataLocal(changes[3].sync_data()).GetSpecifics().session().tab(); |
| 2610 EXPECT_EQ(tab.navigation_size(), 2); | 2588 EXPECT_EQ(tab.navigation_size(), 2); |
| 2611 EXPECT_EQ(tab.navigation(0).global_id(), tab.navigation(0).task_id()); | 2589 EXPECT_EQ(tab.navigation(0).global_id(), tab.navigation(0).task_id()); |
| 2612 EXPECT_TRUE(tab.navigation(0).ancestor_task_id().empty()); | 2590 EXPECT_TRUE(tab.navigation(0).ancestor_task_id().empty()); |
| 2613 EXPECT_EQ(tab.navigation(1).global_id(), tab.navigation(1).task_id()); | 2591 EXPECT_EQ(tab.navigation(1).global_id(), tab.navigation(1).task_id()); |
| 2614 // navigation(1) is a subtask of navigation(0). | 2592 // navigation(1) is a subtask of navigation(0). |
| 2615 EXPECT_EQ(tab.navigation(1).ancestor_task_id_size(), 1); | 2593 EXPECT_EQ(tab.navigation(1).ancestor_task_id_size(), 1); |
| 2616 EXPECT_EQ(tab.navigation(1).ancestor_task_id(0), tab.navigation(0).task_id()); | 2594 EXPECT_EQ(tab.navigation(1).ancestor_task_id(0), tab.navigation(0).task_id()); |
| 2617 } | 2595 } |
| 2618 | 2596 |
| 2619 // Tests that task ids are generated for navigations on multiple local tabs. | |
| 2620 TEST_F(SessionsSyncManagerTest, TrackTasksOnMultipleTabs) { | |
| 2621 SyncChangeList changes; | |
| 2622 TestSyncedWindowDelegate* window = AddWindow(); | |
| 2623 InitWithSyncDataTakeOutput(SyncDataList(), &changes); | |
| 2624 SessionID::id_type window_id = window->GetSessionId(); | |
| 2625 ASSERT_FALSE(manager()->current_machine_tag().empty()); | |
| 2626 changes.clear(); | |
| 2627 | |
| 2628 // Tab 1 | |
| 2629 TestSyncedTabDelegate* tab1 = AddTab(window_id, kFoo1); | |
| 2630 NavigateTab(tab1, kFoo2, ui::PAGE_TRANSITION_LINK); | |
| 2631 // Tab 2 from Tab 1. | |
| 2632 TestSyncedTabDelegate* tab2 = AddTab(window_id, kBar1, tab1->GetSessionId()); | |
| 2633 NavigateTab(tab2, kBar2, ui::PAGE_TRANSITION_LINK); | |
| 2634 // Tab 3 from Tab 2. | |
| 2635 TestSyncedTabDelegate* tab3 = AddTab(window_id, kBaz1, tab2->GetSessionId()); | |
| 2636 NavigateTab(tab3, kBaz2, ui::PAGE_TRANSITION_LINK); | |
| 2637 | |
| 2638 // We only test changes for tab add and tab update, and ignore header updates. | |
| 2639 FilterOutLocalHeaderChanges(&changes); | |
| 2640 // Sync data of updating Tab 1 change | |
| 2641 sync_pb::SessionTab sync_data_tab1 = | |
| 2642 SyncDataLocal(changes[1].sync_data()).GetSpecifics().session().tab(); | |
| 2643 ASSERT_EQ(2, sync_data_tab1.navigation_size()); | |
| 2644 | |
| 2645 // Sync data of updating Tab 2 change | |
| 2646 sync_pb::SessionTab sync_data_tab2 = | |
| 2647 SyncDataLocal(changes[3].sync_data()).GetSpecifics().session().tab(); | |
| 2648 ASSERT_EQ(2, sync_data_tab1.navigation_size()); | |
| 2649 | |
| 2650 // Sync data of adding Tab 3 change | |
| 2651 sync_pb::SessionTab sync_data_tab3 = | |
| 2652 SyncDataLocal(changes[4].sync_data()).GetSpecifics().session().tab(); | |
| 2653 ASSERT_EQ(1, sync_data_tab3.navigation_size()); | |
| 2654 EXPECT_EQ(sync_data_tab3.navigation(0).global_id(), | |
| 2655 sync_data_tab3.navigation(0).task_id()); | |
| 2656 EXPECT_THAT(sync_data_tab3.navigation(0).ancestor_task_id(), | |
| 2657 ElementsAre(sync_data_tab1.navigation(0).task_id(), | |
| 2658 sync_data_tab1.navigation(1).task_id(), | |
| 2659 sync_data_tab2.navigation(0).task_id(), | |
| 2660 sync_data_tab2.navigation(1).task_id())); | |
| 2661 | |
| 2662 // Sync data of adding Tab 3 change | |
| 2663 sync_data_tab3 = | |
| 2664 SyncDataLocal(changes[5].sync_data()).GetSpecifics().session().tab(); | |
| 2665 ASSERT_EQ(2, sync_data_tab3.navigation_size()); | |
| 2666 EXPECT_EQ(sync_data_tab3.navigation(0).global_id(), | |
| 2667 sync_data_tab3.navigation(0).task_id()); | |
| 2668 EXPECT_THAT(sync_data_tab3.navigation(0).ancestor_task_id(), | |
| 2669 ElementsAre(sync_data_tab1.navigation(0).task_id(), | |
| 2670 sync_data_tab1.navigation(1).task_id(), | |
| 2671 sync_data_tab2.navigation(0).task_id(), | |
| 2672 sync_data_tab2.navigation(1).task_id())); | |
| 2673 EXPECT_EQ(sync_data_tab3.navigation(1).global_id(), | |
| 2674 sync_data_tab3.navigation(1).task_id()); | |
| 2675 EXPECT_THAT(sync_data_tab3.navigation(1).ancestor_task_id(), | |
| 2676 ElementsAre(sync_data_tab1.navigation(0).task_id(), | |
| 2677 sync_data_tab1.navigation(1).task_id(), | |
| 2678 sync_data_tab2.navigation(0).task_id(), | |
| 2679 sync_data_tab2.navigation(1).task_id(), | |
| 2680 sync_data_tab3.navigation(0).task_id())); | |
| 2681 } | |
| 2682 | |
| 2683 } // namespace sync_sessions | 2597 } // namespace sync_sessions |
| OLD | NEW |