Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1045)

Side by Side Diff: components/sync_sessions/task_tracker.cc

Issue 2901533003: Revert of Track task ids for navigations cross multiple tabs. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/task_tracker.h" 5 #include "components/sync_sessions/task_tracker.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/numerics/safe_conversions.h" 9 #include "base/numerics/safe_conversions.h"
10 10
11 namespace sync_sessions { 11 namespace sync_sessions {
12 12
13 namespace { 13 namespace {
14 // The maximum number of tasks we track in a tab. 14 // The maximum number of tasks we track in a tab.
15 int kMaxNumTasksPerTab = 100; 15 int kMaxNumTasksPerTab = 100;
16 } 16 }
17 17
18 TabTasks::TabTasks() {} 18 TabTasks::TabTasks() {}
19 19
20 TabTasks::TabTasks(const TabTasks* source_tab) {
21 if (source_tab->current_navigation_index_ >= 0) {
22 std::vector<int64_t> source_tab_task_ids =
23 source_tab->GetTaskIdsForNavigation(
24 source_tab->current_navigation_index_);
25 for (auto source_tab_task_id : source_tab_task_ids)
26 task_ids_.push_back({0, source_tab_task_id});
27
28 source_tab_task_num_ = source_tab_task_ids.size();
29 }
30 }
31
32 TabTasks::~TabTasks() {} 20 TabTasks::~TabTasks() {}
33 21
34 std::vector<int64_t> TabTasks::GetTaskIdsForNavigation( 22 std::vector<int64_t> TabTasks::GetTaskIdsForNavigation(
35 int navigation_index) const { 23 int navigation_index) const {
36 CHECK_LE(0, navigation_index); 24 CHECK_LE(0, navigation_index);
37 CHECK_LT(navigation_index, GetNavigationsCount()); 25 CHECK_LT(navigation_index, GetNavigationsCount());
38 26
39 std::vector<int64_t> root_to_self_task_ids; 27 std::vector<int64_t> root_to_self_task_ids;
40 // Position of the navigation in task_ids_ vector. 28 // Position of the navigation in task_ids_ vector.
41 int navigation_position = 29 int navigation_position = navigation_index - excluded_navigation_num_;
42 GetTaskIdPositionFromNavigationIndex(navigation_index);
43 30
44 // If navigation_index is an excluded ancestor task, returns empty. 31 // If navigation_index is an excluded ancestor task, returns empty.
45 if (navigation_position < 0) 32 if (navigation_position < 0)
46 return root_to_self_task_ids; 33 return root_to_self_task_ids;
47 34
48 TaskIdAndRoot task_id_and_root = task_ids_[navigation_position]; 35 TaskIdAndRoot task_id_and_root = task_ids_[navigation_position];
49 36
50 // If navigation_index is an invalid task, returns empty. 37 // If navigation_index is an invalid task, returns empty.
51 if (task_id_and_root.root_navigation_index < 0) 38 if (task_id_and_root.root_navigation_index < 0)
52 return root_to_self_task_ids; 39 return root_to_self_task_ids;
53 40
54 // The root task can be excluded. If so, consider the oldest ancestor 41 // The root task can be excluded. If so, consider the oldest ancestor
55 // available as root. 42 // available as root.
56 int root_navigation_index = 43 int root_navigation_index =
57 task_id_and_root.root_navigation_index > excluded_navigation_num_ 44 task_id_and_root.root_navigation_index > excluded_navigation_num_
58 ? task_id_and_root.root_navigation_index - excluded_navigation_num_ 45 ? task_id_and_root.root_navigation_index - excluded_navigation_num_
59 : 0; 46 : 0;
60 for (int i = root_navigation_index; i <= navigation_position; i++) { 47 for (int i = root_navigation_index; i <= navigation_position; i++) {
61 // Fills the vector with valid tasks. 48 // Fills the vector with valid tasks.
62 if (task_ids_[i].root_navigation_index >= 0) 49 if (task_ids_[i].root_navigation_index >= 0)
63 root_to_self_task_ids.push_back(task_ids_[i].task_id); 50 root_to_self_task_ids.push_back(task_ids_[i].task_id);
64 } 51 }
65 return root_to_self_task_ids; 52 return root_to_self_task_ids;
66 } 53 }
67 54
68 int TabTasks::GetNavigationsCount() const { 55 int TabTasks::GetNavigationsCount() const {
69 return GetNavigationIndexFromTaskIdPosition(task_ids_.size()); 56 return excluded_navigation_num_ + task_ids_.size();
70 } 57 }
71 58
72 void TabTasks::UpdateWithNavigation(int navigation_index, 59 void TabTasks::UpdateWithNavigation(int navigation_index,
73 ui::PageTransition transition, 60 ui::PageTransition transition,
74 int64_t navigation_id) { 61 int64_t navigation_id) {
75 // Triggered by some notifications on the current page, do nothing. 62 // Triggered by some notifications on the current page, do nothing.
76 if (navigation_index == current_navigation_index_) { 63 if (navigation_index == current_navigation_index_) {
77 DVLOG(1) << "Doing nothing for navigation_index: " << navigation_index 64 DVLOG(1) << "Doing nothing for navigation_index: " << navigation_index
78 << " of transition: " << transition; 65 << " of transition: " << transition;
79 return; 66 return;
80 } 67 }
81 68
82 // Going back/forward to some previous navigation. 69 // Going back/forward to some previous navigation.
83 if (navigation_index < current_navigation_index_ || 70 if (navigation_index < current_navigation_index_ ||
84 (navigation_index > current_navigation_index_ && 71 (navigation_index > current_navigation_index_ &&
85 transition & ui::PAGE_TRANSITION_FORWARD_BACK && 72 transition & ui::PAGE_TRANSITION_FORWARD_BACK &&
86 base::checked_cast<size_t>(navigation_index) < task_ids_.size())) { 73 base::checked_cast<size_t>(navigation_index) < task_ids_.size())) {
87 DVLOG(1) << "Just updating task position with navigation_index: " 74 DVLOG(1) << "Just updating task position with navigation_index: "
88 << navigation_index << " of transition: " << transition; 75 << navigation_index << " of transition: " << transition;
89 current_navigation_index_ = navigation_index; 76 current_navigation_index_ = navigation_index;
90 return; 77 return;
91 } 78 }
92 79
93 // A new task for the new navigation. 80 // A new task for the new navigation.
94 int root_navigation_index = source_tab_task_num_ + navigation_index; 81 int root_navigation_index = navigation_index;
95 if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK) || 82 if (current_navigation_index_ != -1 &&
96 ui::PageTransitionCoreTypeIs(transition, 83 (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK) ||
97 ui::PAGE_TRANSITION_AUTO_SUBFRAME) || 84 ui::PageTransitionCoreTypeIs(transition,
98 ui::PageTransitionCoreTypeIs(transition, 85 ui::PAGE_TRANSITION_AUTO_SUBFRAME) ||
99 ui::PAGE_TRANSITION_MANUAL_SUBFRAME) || 86 ui::PageTransitionCoreTypeIs(transition,
100 ui::PageTransitionCoreTypeIs(transition, 87 ui::PAGE_TRANSITION_MANUAL_SUBFRAME) ||
101 ui::PAGE_TRANSITION_FORM_SUBMIT) || 88 ui::PageTransitionCoreTypeIs(transition,
102 transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) { 89 ui::PAGE_TRANSITION_FORM_SUBMIT) ||
103 // Creating a sub-task with navigation at current_navigation_index_ as 90 transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK)) {
104 // parent. If current_navigation_index_ == -1, the parent is the last task 91 // Creating a sub-task with navigation at current_navigation_index as
105 // from source tab. 92 // parent.
106 DVLOG(1) << "Creating a sub-task with navigation_index: " 93 DVLOG(1) << "Creating a sub-task with navigation_index: "
107 << navigation_index << " of transition: " << transition 94 << navigation_index << " of transition: " << transition
108 << " under navigation_index: " << current_navigation_index_; 95 << " under navigation_index: " << current_navigation_index_;
109 // Position of current_navigation_index_ in task_id_ 96 // Position in task_id_.
110 int current_navigation_position = 97 int current_navigation_position =
111 GetTaskIdPositionFromNavigationIndex(current_navigation_index_); 98 current_navigation_index_ - excluded_navigation_num_;
112 // If current task, which is parent task of navigation_index, is excluded, 99 // If current/parent task is excluded, consider the new task as a root task.
113 // consider the new task as a root task.
114 if (current_navigation_position >= 0) { 100 if (current_navigation_position >= 0) {
115 CHECK_LT(current_navigation_position, 101 CHECK_LT(current_navigation_position,
116 base::checked_cast<int>(task_ids_.size())); 102 base::checked_cast<int>(task_ids_.size()));
117 root_navigation_index = 103 root_navigation_index =
118 task_ids_[current_navigation_position].root_navigation_index; 104 task_ids_[current_navigation_position].root_navigation_index;
119 } else { 105 } else {
120 DVLOG(1) << "Becaue parent task is excluded, consider the sub-task as a " 106 DVLOG(1) << "Becaue parent task is excluded, consider the sub-task as a "
121 "root task."; 107 "root task.";
122 } 108 }
123 } else { 109 } else {
124 // Creating a root task. 110 // Creating a root task.
125 // For now, we don't consider tasks cross tabs, so first navigation of the 111 // For now, we don't consider tasks cross tabs, so first navigation of the
126 // tab always creates a root task. 112 // tab always creates a root task.
127 DVLOG(1) << "Creating a root task with navigation_index: " 113 DVLOG(1) << "Creating a root task with navigation_index: "
128 << navigation_index << " of transition: " << transition; 114 << navigation_index << " of transition: " << transition;
129 } 115 }
130 116
131 // In most cases navigation_index == excluded_navigation_num_ + 117 // In most cases navigation_index == excluded_navigation_num_ +
132 // task_ids_.size() - source_tab_task_num_ if the previous navigation is end 118 // task_ids_.size() if the previous navigation is end of chain, or
133 // of chain, or navigation_index < excluded_navigation_num_ + task_ids_.size() 119 // navigation_index < excluded_navigation_num_ + task_ids_.size() otherwise.
134 // otherwise. In few case navigation_index > excluded_navigation_num_ + 120 // In few case navigation_index > excluded_navigation_num_ + task_ids_.size(),
135 // task_ids_.size(), we fill task_ids_ with invalid contents. A known case is 121 // we fill task_ids_ with invalid contents. A known case is the first
136 // the first navigation after newtab. 122 // navigation after newtab.
137 for (int i = GetNavigationIndexFromTaskIdPosition(task_ids_.size()); 123 for (int i = task_ids_.size() + excluded_navigation_num_;
138 i < navigation_index; i++) { 124 i < navigation_index; i++) {
139 task_ids_.push_back({-1, -1}); 125 task_ids_.push_back({-1, -1});
140 } 126 }
141 127
142 int new_task_id_position =
143 GetTaskIdPositionFromNavigationIndex(navigation_index);
144 // Erase all task ids associated with an outdated forward navigation stack. 128 // Erase all task ids associated with an outdated forward navigation stack.
145 if (new_task_id_position > 0) { 129 if (navigation_index > excluded_navigation_num_) {
130 int new_task_id_position = navigation_index - excluded_navigation_num_;
146 task_ids_.erase(task_ids_.begin() + new_task_id_position, task_ids_.end()); 131 task_ids_.erase(task_ids_.begin() + new_task_id_position, task_ids_.end());
147 } else { 132 } else {
148 excluded_navigation_num_ = navigation_index + source_tab_task_num_; 133 excluded_navigation_num_ = navigation_index;
149 // new task id position is 0 134 // new task id position is 0
150 task_ids_.clear(); 135 task_ids_.clear();
151 } 136 }
152 137
153 // Exclude oldest ancestors if task number reaches the limit. 138 // Exclude oldest ancestors if task number reaches the limit.
154 int more_tasks_number = task_ids_.size() + 1 - kMaxNumTasksPerTab; 139 int more_tasks_number = task_ids_.size() + 1 - kMaxNumTasksPerTab;
155 if (more_tasks_number > 0) { 140 if (more_tasks_number > 0) {
156 task_ids_.erase(task_ids_.begin(), task_ids_.begin() + more_tasks_number); 141 task_ids_.erase(task_ids_.begin(), task_ids_.begin() + more_tasks_number);
157 DVLOG(1) << "Excluding " << more_tasks_number 142 DVLOG(1) << "Excluding " << more_tasks_number
158 << " oldest ancestor(s) from navigation index " 143 << " oldest ancestor(s) from navigation index "
159 << excluded_navigation_num_; 144 << excluded_navigation_num_;
160 excluded_navigation_num_ += more_tasks_number; 145 excluded_navigation_num_ += more_tasks_number;
161 } 146 }
162 147
163 TaskIdAndRoot new_task = {root_navigation_index, navigation_id}; 148 TaskIdAndRoot new_task = {root_navigation_index, navigation_id};
164 // Add the current task at navigation_index. 149 // Add the current task at navigation_index.
165 task_ids_.push_back(new_task); 150 task_ids_.push_back(new_task);
166 current_navigation_index_ = navigation_index; 151 current_navigation_index_ = navigation_index;
167 return; 152 return;
168 } 153 }
169 154
170 int TabTasks::GetTaskIdPositionFromNavigationIndex(int navigation_index) const {
171 return source_tab_task_num_ + navigation_index - excluded_navigation_num_;
172 }
173
174 int TabTasks::GetNavigationIndexFromTaskIdPosition(int task_id_position) const {
175 return excluded_navigation_num_ + task_id_position - source_tab_task_num_;
176 }
177
178 TaskTracker::TaskTracker() {} 155 TaskTracker::TaskTracker() {}
179 156
180 TaskTracker::~TaskTracker() {} 157 TaskTracker::~TaskTracker() {}
181 158
182 TabTasks* TaskTracker::GetTabTasks(SessionID::id_type tab_id) { 159 TabTasks* TaskTracker::GetTabTasks(SessionID::id_type tab_id) {
183 if (local_tab_tasks_map_.find(tab_id) == local_tab_tasks_map_.end()) { 160 if (local_tab_tasks_map_.find(tab_id) == local_tab_tasks_map_.end()) {
184 local_tab_tasks_map_[tab_id] = base::MakeUnique<TabTasks>(); 161 local_tab_tasks_map_[tab_id] = base::MakeUnique<TabTasks>();
185 } 162 }
186 return local_tab_tasks_map_[tab_id].get(); 163 return local_tab_tasks_map_[tab_id].get();
187 } 164 }
188
189 TabTasks* TaskTracker::GetTabTasks(SessionID::id_type tab_id,
190 SessionID::id_type source_tab_id) {
191 if (local_tab_tasks_map_.find(tab_id) == local_tab_tasks_map_.end()) {
192 auto source_tab_iter = local_tab_tasks_map_.find(source_tab_id);
193 if (source_tab_iter != local_tab_tasks_map_.end()) {
194 local_tab_tasks_map_[tab_id] =
195 base::MakeUnique<TabTasks>(source_tab_iter->second.get());
196 } else {
197 local_tab_tasks_map_[tab_id] = base::MakeUnique<TabTasks>();
198 }
199 }
200 return local_tab_tasks_map_[tab_id].get();
201 }
202 165
203 void TaskTracker::CleanTabTasks(SessionID::id_type tab_id) { 166 void TaskTracker::CleanTabTasks(SessionID::id_type tab_id) {
204 auto iter = local_tab_tasks_map_.find(tab_id); 167 auto iter = local_tab_tasks_map_.find(tab_id);
205 if (iter != local_tab_tasks_map_.end()) { 168 if (iter != local_tab_tasks_map_.end()) {
206 local_tab_tasks_map_.erase(iter); 169 local_tab_tasks_map_.erase(iter);
207 } 170 }
208 } 171 }
209 172
210 } // namespace sync_sessions 173 } // namespace sync_sessions
OLDNEW
« no previous file with comments | « components/sync_sessions/task_tracker.h ('k') | components/sync_sessions/task_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698