Index: components/sync_sessions/task_tracker.cc |
diff --git a/components/sync_sessions/task_tracker.cc b/components/sync_sessions/task_tracker.cc |
index 0f8902e2905383a98113746e138927b4909e1d7c..6eb618e108585c70b2969a2a88e8d01d9a92c3ed 100644 |
--- a/components/sync_sessions/task_tracker.cc |
+++ b/components/sync_sessions/task_tracker.cc |
@@ -17,6 +17,13 @@ int kMaxNumTasksPerTab = 100; |
TabTasks::TabTasks() {} |
+TabTasks::TabTasks(const TabTasks* source_tab) { |
+ if (source_tab->current_navigation_index_ >= 0) { |
+ source_tab_task_ids_ = source_tab->GetTaskIdsForNavigation( |
+ source_tab->current_navigation_index_); |
+ } |
+} |
+ |
TabTasks::~TabTasks() {} |
std::vector<int64_t> TabTasks::GetTaskIdsForNavigation( |
@@ -44,6 +51,20 @@ std::vector<int64_t> TabTasks::GetTaskIdsForNavigation( |
task_id_and_root.root_navigation_index > excluded_navigation_num_ |
? task_id_and_root.root_navigation_index - excluded_navigation_num_ |
: 0; |
+ // Only consider tasks from source tab when no tasks in current tab is |
+ // excluded because max number per tab limit. |
+ if (excluded_navigation_num_ == 0) { |
+ int first_task_of_tab_position = 0; |
+ // skipping invalid heading tasks |
+ for (; first_task_of_tab_position < navigation_position && |
+ task_ids_[first_task_of_tab_position].root_navigation_index < 0; |
+ first_task_of_tab_position++) { |
+ } |
+ // If task of current navigation can track back to the first task of the |
+ // tab, then consider the source tab. |
+ if (task_id_and_root.root_navigation_index == first_task_of_tab_position) |
+ root_to_self_task_ids = source_tab_task_ids_; |
+ } |
for (int i = root_navigation_index; i <= navigation_position; i++) { |
// Fills the vector with valid tasks. |
if (task_ids_[i].root_navigation_index >= 0) |
@@ -163,6 +184,20 @@ TabTasks* TaskTracker::GetTabTasks(SessionID::id_type tab_id) { |
return local_tab_tasks_map_[tab_id].get(); |
} |
+TabTasks* TaskTracker::GetTabTasks(SessionID::id_type tab_id, |
+ SessionID::id_type source_tab_id) { |
+ if (local_tab_tasks_map_.find(tab_id) == local_tab_tasks_map_.end()) { |
+ auto iter = local_tab_tasks_map_.find(source_tab_id); |
+ if (iter != local_tab_tasks_map_.end()) { |
+ local_tab_tasks_map_[tab_id] = |
+ base::MakeUnique<TabTasks>(iter->second.get()); |
+ } else { |
+ local_tab_tasks_map_[tab_id] = base::MakeUnique<TabTasks>(); |
+ } |
+ } |
+ return local_tab_tasks_map_[tab_id].get(); |
+} |
+ |
void TaskTracker::CleanTabTasks(SessionID::id_type tab_id) { |
auto iter = local_tab_tasks_map_.find(tab_id); |
if (iter != local_tab_tasks_map_.end()) { |