| Index: components/sync_sessions/sessions_sync_manager_unittest.cc
|
| diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc
|
| index 41c3eada3c6a8e9a64e965130ff97633ca2e2ffa..3ee83cb4fb7f7d86b894cfdc442c9b0afa6f2812 100644
|
| --- a/components/sync_sessions/sessions_sync_manager_unittest.cc
|
| +++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
|
| @@ -39,6 +39,7 @@ using syncer::SyncData;
|
| using syncer::SyncDataList;
|
| using syncer::SyncDataLocal;
|
| using syncer::SyncError;
|
| +using testing::ElementsAre;
|
|
|
| namespace sync_sessions {
|
|
|
| @@ -211,7 +212,10 @@ class TestSyncedTabDelegate : public SyncedTabDelegate {
|
| return http_count > 0;
|
| }
|
|
|
| - SessionID::id_type GetSourceTabID() const override { return kInvalidTabID; }
|
| + SessionID::id_type GetSourceTabID() const override { return source_tab_id_; }
|
| + void SetSourceTabID(SessionID::id_type source_tab_id) {
|
| + source_tab_id_ = source_tab_id;
|
| + }
|
|
|
| void AppendEntry(std::unique_ptr<sessions::SerializedNavigationEntry> entry) {
|
| entries_.push_back(std::move(entry));
|
| @@ -245,6 +249,7 @@ class TestSyncedTabDelegate : public SyncedTabDelegate {
|
| bool is_supervised_ = false;
|
| int sync_id_ = kInvalidTabID;
|
| SessionID tab_id_;
|
| + SessionID::id_type source_tab_id_ = kInvalidTabID;
|
| SessionID window_id_;
|
| std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>
|
| blocked_navigations_;
|
| @@ -684,10 +689,12 @@ class SessionsSyncManagerTest : public testing::Test {
|
| SessionsSyncManager::TagHashFromSpecifics(entity.session()));
|
| }
|
|
|
| - // Creates a new tab within the window specified by |window_id|, and points it
|
| - // at |url|. Returns the newly created TestSyncedTabDelegate (not owned).
|
| + // Creates a new tab within the window specified by |window_id| and from the
|
| + // source tab |source_tab_id|, and points it at |url|. Returns the newly
|
| + // created TestSyncedTabDelegate (not owned).
|
| TestSyncedTabDelegate* AddTab(SessionID::id_type window_id,
|
| const std::string& url,
|
| + SessionID::id_type source_tab_id,
|
| base::Time time) {
|
| tabs_.push_back(base::MakeUnique<TestSyncedTabDelegate>());
|
| for (auto& window : windows_) {
|
| @@ -696,6 +703,7 @@ class SessionsSyncManagerTest : public testing::Test {
|
| window->OverrideTabAt(tab_index, tabs_.back().get());
|
| }
|
| }
|
| + tabs_.back()->SetSourceTabID(source_tab_id);
|
|
|
| // Simulate the browser firing a tab parented notification, ahead of the
|
| // actual navigation.
|
| @@ -705,9 +713,19 @@ class SessionsSyncManagerTest : public testing::Test {
|
| NavigateTab(tabs_.back().get(), url, time);
|
| return tabs_.back().get();
|
| }
|
| + TestSyncedTabDelegate* AddTab(SessionID::id_type window_id,
|
| + const std::string& url,
|
| + base::Time time) {
|
| + return AddTab(window_id, url, kInvalidTabID, time);
|
| + }
|
| + TestSyncedTabDelegate* AddTab(SessionID::id_type window_id,
|
| + const std::string& url,
|
| + SessionID::id_type source_tab_id) {
|
| + return AddTab(window_id, url, source_tab_id, base::Time::Now());
|
| + }
|
| TestSyncedTabDelegate* AddTab(SessionID::id_type window_id,
|
| const std::string& url) {
|
| - return AddTab(window_id, url, base::Time::Now());
|
| + return AddTab(window_id, url, kInvalidTabID);
|
| }
|
|
|
| void NavigateTab(TestSyncedTabDelegate* delegate,
|
| @@ -2594,4 +2612,68 @@ TEST_F(SessionsSyncManagerTest, TrackTasksOnLocalTabModified) {
|
| EXPECT_EQ(tab.navigation(1).ancestor_task_id(0), tab.navigation(0).task_id());
|
| }
|
|
|
| +// Tests that task ids are generated for navigations on multiple local tabs.
|
| +TEST_F(SessionsSyncManagerTest, TrackTasksOnMultipleTabs) {
|
| + SyncChangeList changes;
|
| + TestSyncedWindowDelegate* window = AddWindow();
|
| + InitWithSyncDataTakeOutput(SyncDataList(), &changes);
|
| + SessionID::id_type window_id = window->GetSessionId();
|
| + ASSERT_FALSE(manager()->current_machine_tag().empty());
|
| + changes.clear();
|
| +
|
| + // Tab 1
|
| + TestSyncedTabDelegate* tab1 = AddTab(window_id, kFoo1);
|
| + NavigateTab(tab1, kFoo2, ui::PAGE_TRANSITION_LINK);
|
| + // Tab 2 from Tab 1.
|
| + TestSyncedTabDelegate* tab2 = AddTab(window_id, kBar1, tab1->GetSessionId());
|
| + NavigateTab(tab2, kBar2, ui::PAGE_TRANSITION_LINK);
|
| + // Tab 3 from Tab 2.
|
| + TestSyncedTabDelegate* tab3 = AddTab(window_id, kBaz1, tab2->GetSessionId());
|
| + NavigateTab(tab3, kBaz2, ui::PAGE_TRANSITION_LINK);
|
| +
|
| + // We only test changes for tab add and tab update, and ignore header updates.
|
| + FilterOutLocalHeaderChanges(&changes);
|
| + // Sync data of updating Tab 1 change
|
| + sync_pb::SessionTab sync_data_tab1 =
|
| + SyncDataLocal(changes[1].sync_data()).GetSpecifics().session().tab();
|
| + ASSERT_EQ(2, sync_data_tab1.navigation_size());
|
| +
|
| + // Sync data of updating Tab 2 change
|
| + sync_pb::SessionTab sync_data_tab2 =
|
| + SyncDataLocal(changes[3].sync_data()).GetSpecifics().session().tab();
|
| + ASSERT_EQ(2, sync_data_tab1.navigation_size());
|
| +
|
| + // Sync data of adding Tab 3 change
|
| + sync_pb::SessionTab sync_data_tab3 =
|
| + SyncDataLocal(changes[4].sync_data()).GetSpecifics().session().tab();
|
| + ASSERT_EQ(1, sync_data_tab3.navigation_size());
|
| + EXPECT_EQ(sync_data_tab3.navigation(0).global_id(),
|
| + sync_data_tab3.navigation(0).task_id());
|
| + EXPECT_THAT(sync_data_tab3.navigation(0).ancestor_task_id(),
|
| + ElementsAre(sync_data_tab1.navigation(0).task_id(),
|
| + sync_data_tab1.navigation(1).task_id(),
|
| + sync_data_tab2.navigation(0).task_id(),
|
| + sync_data_tab2.navigation(1).task_id()));
|
| +
|
| + // Sync data of adding Tab 3 change
|
| + sync_data_tab3 =
|
| + SyncDataLocal(changes[5].sync_data()).GetSpecifics().session().tab();
|
| + ASSERT_EQ(2, sync_data_tab3.navigation_size());
|
| + EXPECT_EQ(sync_data_tab3.navigation(0).global_id(),
|
| + sync_data_tab3.navigation(0).task_id());
|
| + EXPECT_THAT(sync_data_tab3.navigation(0).ancestor_task_id(),
|
| + ElementsAre(sync_data_tab1.navigation(0).task_id(),
|
| + sync_data_tab1.navigation(1).task_id(),
|
| + sync_data_tab2.navigation(0).task_id(),
|
| + sync_data_tab2.navigation(1).task_id()));
|
| + EXPECT_EQ(sync_data_tab3.navigation(1).global_id(),
|
| + sync_data_tab3.navigation(1).task_id());
|
| + EXPECT_THAT(sync_data_tab3.navigation(1).ancestor_task_id(),
|
| + ElementsAre(sync_data_tab1.navigation(0).task_id(),
|
| + sync_data_tab1.navigation(1).task_id(),
|
| + sync_data_tab2.navigation(0).task_id(),
|
| + sync_data_tab2.navigation(1).task_id(),
|
| + sync_data_tab3.navigation(0).task_id()));
|
| +}
|
| +
|
| } // namespace sync_sessions
|
|
|