Chromium Code Reviews| Index: components/sync_sessions/synced_session_tracker.cc |
| diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc |
| index a74b877c085c11e890af5c51567516596c8d01be..52385d70fafa5bf4cbbd906c6ce699223a97f91b 100644 |
| --- a/components/sync_sessions/synced_session_tracker.cc |
| +++ b/components/sync_sessions/synced_session_tracker.cc |
| @@ -339,6 +339,48 @@ sessions::SessionTab* SyncedSessionTracker::GetTabImpl( |
| return tab_ptr; |
| } |
| +bool SyncedSessionTracker::ReassociateTab(const std::string& session_tag, |
|
maxbogue
2016/11/10 06:43:26
So was this entire operation just never done previ
Nicolas Zea
2016/11/10 18:25:36
Yeah, previously at startup we would put the tab e
maxbogue
2016/11/10 22:27:14
So this CL is changing functionality? Could you up
|
| + SessionID::id_type old_tab_id, |
| + SessionID::id_type new_tab_id) { |
| + DCHECK_NE(TabNodePool::kInvalidTabID, old_tab_id); |
| + DCHECK_NE(TabNodePool::kInvalidTabID, new_tab_id); |
| + |
| + sessions::SessionTab* tab_ptr = nullptr; |
| + auto old_tab_iter = synced_tab_map_[session_tag].find(old_tab_id); |
| + if (old_tab_iter == synced_tab_map_[session_tag].end()) |
| + return false; |
| + |
| + // It's possible a placeholder is already in place for the new tab. If that's |
| + // the case, reuse the placeholder SessionTab. Otherwise, reuse the old |
| + // SessionTab. |
| + auto new_tab_iter = synced_tab_map_[session_tag].find(new_tab_id); |
| + if (new_tab_iter != synced_tab_map_[session_tag].end()) { |
| + tab_ptr = new_tab_iter->second; |
| + } else { |
| + tab_ptr = old_tab_iter->second; |
| + } |
| + |
| + // If the old tab is unmapped, update the tab id under which it is indexed. |
| + auto unmapped_tabs_iter = unmapped_tabs_[session_tag].find(old_tab_id); |
| + if (unmapped_tabs_iter != unmapped_tabs_[session_tag].end()) { |
| + std::unique_ptr<sessions::SessionTab> tab = |
| + std::move(unmapped_tabs_iter->second); |
| + unmapped_tabs_[session_tag].erase(unmapped_tabs_iter); |
| + unmapped_tabs_[session_tag][new_tab_id] = std::move(tab); |
| + } |
| + |
| + // Update the tab id. |
| + DVLOG(1) << "Remapped tab " << old_tab_id << " to tab " << new_tab_id; |
| + tab_ptr->tab_id.set_id(new_tab_id); |
| + |
| + // Remove the tab from the synced tab map under the old id. |
| + synced_tab_map_[session_tag].erase(old_tab_iter); |
| + |
| + // Add the tab back into the tab map with the new id. |
| + synced_tab_map_[session_tag][new_tab_id] = tab_ptr; |
| + return true; |
| +} |
| + |
| void SyncedSessionTracker::Clear() { |
| // Cleanup unmapped tabs and windows. |
| unmapped_windows_.clear(); |