| 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..533c52747e4ab9586251ac7f7f3e720153795ff7 100644
|
| --- a/components/sync_sessions/task_tracker.cc
|
| +++ b/components/sync_sessions/task_tracker.cc
|
| @@ -17,6 +17,18 @@ int kMaxNumTasksPerTab = 100;
|
|
|
| TabTasks::TabTasks() {}
|
|
|
| +TabTasks::TabTasks(const TabTasks* source_tab) {
|
| + if (source_tab->current_navigation_index_ >= 0) {
|
| + std::vector<int64_t> source_tab_task_ids =
|
| + source_tab->GetTaskIdsForNavigation(
|
| + source_tab->current_navigation_index_);
|
| + for (auto source_tab_task_id : source_tab_task_ids)
|
| + task_ids_.push_back({0, source_tab_task_id});
|
| +
|
| + source_tab_task_num_ = source_tab_task_ids.size();
|
| + }
|
| +}
|
| +
|
| TabTasks::~TabTasks() {}
|
|
|
| std::vector<int64_t> TabTasks::GetTaskIdsForNavigation(
|
| @@ -26,7 +38,8 @@ std::vector<int64_t> TabTasks::GetTaskIdsForNavigation(
|
|
|
| std::vector<int64_t> root_to_self_task_ids;
|
| // Position of the navigation in task_ids_ vector.
|
| - int navigation_position = navigation_index - excluded_navigation_num_;
|
| + int navigation_position =
|
| + GetTaskIdPositionFromNavigationIndex(navigation_index);
|
|
|
| // If navigation_index is an excluded ancestor task, returns empty.
|
| if (navigation_position < 0)
|
| @@ -53,7 +66,7 @@ std::vector<int64_t> TabTasks::GetTaskIdsForNavigation(
|
| }
|
|
|
| int TabTasks::GetNavigationsCount() const {
|
| - return excluded_navigation_num_ + task_ids_.size();
|
| + return GetNavigationIndexFromTaskIdPosition(task_ids_.size());
|
| }
|
|
|
| void TabTasks::UpdateWithNavigation(int navigation_index,
|
| @@ -78,25 +91,26 @@ void TabTasks::UpdateWithNavigation(int navigation_index,
|
| }
|
|
|
| // A new task for the new navigation.
|
| - int root_navigation_index = navigation_index;
|
| - if (current_navigation_index_ != -1 &&
|
| - (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK) ||
|
| - ui::PageTransitionCoreTypeIs(transition,
|
| - ui::PAGE_TRANSITION_AUTO_SUBFRAME) ||
|
| - ui::PageTransitionCoreTypeIs(transition,
|
| - ui::PAGE_TRANSITION_MANUAL_SUBFRAME) ||
|
| - ui::PageTransitionCoreTypeIs(transition,
|
| - ui::PAGE_TRANSITION_FORM_SUBMIT) ||
|
| - transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK)) {
|
| - // Creating a sub-task with navigation at current_navigation_index as
|
| - // parent.
|
| + int root_navigation_index = source_tab_task_num_ + navigation_index;
|
| + if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK) ||
|
| + ui::PageTransitionCoreTypeIs(transition,
|
| + ui::PAGE_TRANSITION_AUTO_SUBFRAME) ||
|
| + ui::PageTransitionCoreTypeIs(transition,
|
| + ui::PAGE_TRANSITION_MANUAL_SUBFRAME) ||
|
| + ui::PageTransitionCoreTypeIs(transition,
|
| + ui::PAGE_TRANSITION_FORM_SUBMIT) ||
|
| + transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) {
|
| + // Creating a sub-task with navigation at current_navigation_index_ as
|
| + // parent. If current_navigation_index_ == -1, the parent is the last task
|
| + // from source tab.
|
| DVLOG(1) << "Creating a sub-task with navigation_index: "
|
| << navigation_index << " of transition: " << transition
|
| << " under navigation_index: " << current_navigation_index_;
|
| - // Position in task_id_.
|
| + // Position of current_navigation_index_ in task_id_
|
| int current_navigation_position =
|
| - current_navigation_index_ - excluded_navigation_num_;
|
| - // If current/parent task is excluded, consider the new task as a root task.
|
| + GetTaskIdPositionFromNavigationIndex(current_navigation_index_);
|
| + // If current task, which is parent task of navigation_index, is excluded,
|
| + // consider the new task as a root task.
|
| if (current_navigation_position >= 0) {
|
| CHECK_LT(current_navigation_position,
|
| base::checked_cast<int>(task_ids_.size()));
|
| @@ -115,22 +129,23 @@ void TabTasks::UpdateWithNavigation(int navigation_index,
|
| }
|
|
|
| // In most cases navigation_index == excluded_navigation_num_ +
|
| - // task_ids_.size() if the previous navigation is end of chain, or
|
| - // navigation_index < excluded_navigation_num_ + task_ids_.size() otherwise.
|
| - // In few case navigation_index > excluded_navigation_num_ + task_ids_.size(),
|
| - // we fill task_ids_ with invalid contents. A known case is the first
|
| - // navigation after newtab.
|
| - for (int i = task_ids_.size() + excluded_navigation_num_;
|
| + // task_ids_.size() - source_tab_task_num_ if the previous navigation is end
|
| + // of chain, or navigation_index < excluded_navigation_num_ + task_ids_.size()
|
| + // otherwise. In few case navigation_index > excluded_navigation_num_ +
|
| + // task_ids_.size(), we fill task_ids_ with invalid contents. A known case is
|
| + // the first navigation after newtab.
|
| + for (int i = GetNavigationIndexFromTaskIdPosition(task_ids_.size());
|
| i < navigation_index; i++) {
|
| task_ids_.push_back({-1, -1});
|
| }
|
|
|
| + int new_task_id_position =
|
| + GetTaskIdPositionFromNavigationIndex(navigation_index);
|
| // Erase all task ids associated with an outdated forward navigation stack.
|
| - if (navigation_index > excluded_navigation_num_) {
|
| - int new_task_id_position = navigation_index - excluded_navigation_num_;
|
| + if (new_task_id_position > 0) {
|
| task_ids_.erase(task_ids_.begin() + new_task_id_position, task_ids_.end());
|
| } else {
|
| - excluded_navigation_num_ = navigation_index;
|
| + excluded_navigation_num_ = navigation_index + source_tab_task_num_;
|
| // new task id position is 0
|
| task_ids_.clear();
|
| }
|
| @@ -152,6 +167,14 @@ void TabTasks::UpdateWithNavigation(int navigation_index,
|
| return;
|
| }
|
|
|
| +int TabTasks::GetTaskIdPositionFromNavigationIndex(int navigation_index) const {
|
| + return source_tab_task_num_ + navigation_index - excluded_navigation_num_;
|
| +}
|
| +
|
| +int TabTasks::GetNavigationIndexFromTaskIdPosition(int task_id_position) const {
|
| + return excluded_navigation_num_ + task_id_position - source_tab_task_num_;
|
| +}
|
| +
|
| TaskTracker::TaskTracker() {}
|
|
|
| TaskTracker::~TaskTracker() {}
|
| @@ -163,6 +186,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 source_tab_iter = local_tab_tasks_map_.find(source_tab_id);
|
| + if (source_tab_iter != local_tab_tasks_map_.end()) {
|
| + local_tab_tasks_map_[tab_id] =
|
| + base::MakeUnique<TabTasks>(source_tab_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()) {
|
|
|