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

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

Issue 2753753005: [sync] WebContentsObserver based sessions notifications (Closed)
Patch Set: use base:MakeUnique, alphabetize Created 3 years, 9 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/synced_session_tracker.h" 5 #include "components/sync_sessions/synced_session_tracker.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "components/sync_sessions/sync_sessions_client.h" 12 #include "components/sync_sessions/sync_sessions_client.h"
13 13 #include "components/sync_sessions/synced_tab_delegate.h"
14 namespace sync_sessions { 14 namespace sync_sessions {
15 15
16 namespace { 16 namespace {
17 17
18 // Helper for iterating through all tabs within a window, and all navigations 18 // Helper for iterating through all tabs within a window, and all navigations
19 // within a tab, to find if there's a valid syncable url. 19 // within a tab, to find if there's a valid syncable url.
20 bool ShouldSyncSessionWindow(SyncSessionsClient* sessions_client, 20 bool ShouldSyncSessionWindow(SyncSessionsClient* sessions_client,
21 const sessions::SessionWindow& window) { 21 const sessions::SessionWindow& window) {
22 for (const auto& tab : window.tabs) { 22 for (const auto& tab : window.tabs) {
23 for (const sessions::SerializedNavigationEntry& navigation : 23 for (const sessions::SerializedNavigationEntry& navigation :
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 for (const auto& window_pair : iter->second->windows) 85 for (const auto& window_pair : iter->second->windows)
86 windows->push_back(window_pair.second.get()); 86 windows->push_back(window_pair.second.get());
87 87
88 return true; 88 return true;
89 } 89 }
90 90
91 bool SyncedSessionTracker::LookupSessionTab( 91 bool SyncedSessionTracker::LookupSessionTab(
92 const std::string& tag, 92 const std::string& tag,
93 SessionID::id_type tab_id, 93 SessionID::id_type tab_id,
94 const sessions::SessionTab** tab) const { 94 const sessions::SessionTab** tab) const {
95 if (tab_id == TabNodePool::kInvalidTabID) 95 if (tab_id == kInvalidTabID)
96 return false; 96 return false;
97 97
98 DCHECK(tab); 98 DCHECK(tab);
99 auto tab_map_iter = synced_tab_map_.find(tag); 99 auto tab_map_iter = synced_tab_map_.find(tag);
100 if (tab_map_iter == synced_tab_map_.end()) { 100 if (tab_map_iter == synced_tab_map_.end()) {
101 // We have no record of this session. 101 // We have no record of this session.
102 *tab = nullptr; 102 *tab = nullptr;
103 return false; 103 return false;
104 } 104 }
105 auto tab_iter = tab_map_iter->second.find(tab_id); 105 auto tab_iter = tab_map_iter->second.find(tab_id);
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 bool reused_existing_tab = 375 bool reused_existing_tab =
376 local_tab_pool_.GetTabNodeForTab(tab_id, tab_node_id); 376 local_tab_pool_.GetTabNodeForTab(tab_id, tab_node_id);
377 DCHECK_NE(TabNodePool::kInvalidTabNodeID, *tab_node_id); 377 DCHECK_NE(TabNodePool::kInvalidTabNodeID, *tab_node_id);
378 GetSession(local_session_tag_)->tab_node_ids.insert(*tab_node_id); 378 GetSession(local_session_tag_)->tab_node_ids.insert(*tab_node_id);
379 return reused_existing_tab; 379 return reused_existing_tab;
380 } 380 }
381 381
382 bool SyncedSessionTracker::IsLocalTabNodeAssociated(int tab_node_id) { 382 bool SyncedSessionTracker::IsLocalTabNodeAssociated(int tab_node_id) {
383 if (tab_node_id == TabNodePool::kInvalidTabNodeID) 383 if (tab_node_id == TabNodePool::kInvalidTabNodeID)
384 return false; 384 return false;
385 return local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id) != 385 return local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id) != kInvalidTabID;
386 TabNodePool::kInvalidTabID;
387 } 386 }
388 387
389 void SyncedSessionTracker::ReassociateLocalTab(int tab_node_id, 388 void SyncedSessionTracker::ReassociateLocalTab(int tab_node_id,
390 SessionID::id_type new_tab_id) { 389 SessionID::id_type new_tab_id) {
391 DCHECK(!local_session_tag_.empty()); 390 DCHECK(!local_session_tag_.empty());
392 DCHECK_NE(TabNodePool::kInvalidTabNodeID, tab_node_id); 391 DCHECK_NE(TabNodePool::kInvalidTabNodeID, tab_node_id);
393 DCHECK_NE(TabNodePool::kInvalidTabID, new_tab_id); 392 DCHECK_NE(kInvalidTabID, new_tab_id);
394 393
395 SessionID::id_type old_tab_id = 394 SessionID::id_type old_tab_id =
396 local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id); 395 local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id);
397 local_tab_pool_.ReassociateTabNode(tab_node_id, new_tab_id); 396 local_tab_pool_.ReassociateTabNode(tab_node_id, new_tab_id);
398 397
399 sessions::SessionTab* tab_ptr = nullptr; 398 sessions::SessionTab* tab_ptr = nullptr;
400 399
401 auto old_tab_iter = synced_tab_map_[local_session_tag_].find(old_tab_id); 400 auto old_tab_iter = synced_tab_map_[local_session_tag_].find(old_tab_id);
402 if (old_tab_id != TabNodePool::kInvalidTabID && 401 if (old_tab_id != kInvalidTabID &&
403 old_tab_iter != synced_tab_map_[local_session_tag_].end()) { 402 old_tab_iter != synced_tab_map_[local_session_tag_].end()) {
404 tab_ptr = old_tab_iter->second; 403 tab_ptr = old_tab_iter->second;
405 // Remove the tab from the synced tab map under the old id. 404 // Remove the tab from the synced tab map under the old id.
406 synced_tab_map_[local_session_tag_].erase(old_tab_iter); 405 synced_tab_map_[local_session_tag_].erase(old_tab_iter);
407 } else { 406 } else {
408 // It's possible a placeholder is already in place for the new tab. If so, 407 // It's possible a placeholder is already in place for the new tab. If so,
409 // reuse it, otherwise create a new one (which will default to unmapped). 408 // reuse it, otherwise create a new one (which will default to unmapped).
410 tab_ptr = GetTab(local_session_tag_, new_tab_id); 409 tab_ptr = GetTab(local_session_tag_, new_tab_id);
411 } 410 }
412 411
413 // If the old tab is unmapped, update the tab id under which it is indexed. 412 // If the old tab is unmapped, update the tab id under which it is indexed.
414 auto unmapped_tabs_iter = unmapped_tabs_[local_session_tag_].find(old_tab_id); 413 auto unmapped_tabs_iter = unmapped_tabs_[local_session_tag_].find(old_tab_id);
415 if (old_tab_id != TabNodePool::kInvalidTabID && 414 if (old_tab_id != kInvalidTabID &&
416 unmapped_tabs_iter != unmapped_tabs_[local_session_tag_].end()) { 415 unmapped_tabs_iter != unmapped_tabs_[local_session_tag_].end()) {
417 std::unique_ptr<sessions::SessionTab> tab = 416 std::unique_ptr<sessions::SessionTab> tab =
418 std::move(unmapped_tabs_iter->second); 417 std::move(unmapped_tabs_iter->second);
419 DCHECK_EQ(tab_ptr, tab.get()); 418 DCHECK_EQ(tab_ptr, tab.get());
420 unmapped_tabs_[local_session_tag_].erase(unmapped_tabs_iter); 419 unmapped_tabs_[local_session_tag_].erase(unmapped_tabs_iter);
421 unmapped_tabs_[local_session_tag_][new_tab_id] = std::move(tab); 420 unmapped_tabs_[local_session_tag_][new_tab_id] = std::move(tab);
422 } 421 }
423 422
424 // Update the tab id. 423 // Update the tab id.
425 if (old_tab_id != TabNodePool::kInvalidTabID) { 424 if (old_tab_id != kInvalidTabID) {
426 DVLOG(1) << "Remapped tab " << old_tab_id << " with node " << tab_node_id 425 DVLOG(1) << "Remapped tab " << old_tab_id << " with node " << tab_node_id
427 << " to tab " << new_tab_id; 426 << " to tab " << new_tab_id;
428 } else { 427 } else {
429 DVLOG(1) << "Mapped new tab node " << tab_node_id << " to tab " 428 DVLOG(1) << "Mapped new tab node " << tab_node_id << " to tab "
430 << new_tab_id; 429 << new_tab_id;
431 } 430 }
432 tab_ptr->tab_id.set_id(new_tab_id); 431 tab_ptr->tab_id.set_id(new_tab_id);
433 432
434 // Add the tab back into the tab map with the new id. 433 // Add the tab back into the tab map with the new id.
435 synced_tab_map_[local_session_tag_][new_tab_id] = tab_ptr; 434 synced_tab_map_[local_session_tag_][new_tab_id] = tab_ptr;
(...skipping 11 matching lines...) Expand all
447 // Get rid of our convenience maps (does not delete the actual Window/Tabs 446 // Get rid of our convenience maps (does not delete the actual Window/Tabs
448 // themselves; they should have all been deleted above). 447 // themselves; they should have all been deleted above).
449 synced_window_map_.clear(); 448 synced_window_map_.clear();
450 synced_tab_map_.clear(); 449 synced_tab_map_.clear();
451 450
452 local_tab_pool_.Clear(); 451 local_tab_pool_.Clear();
453 local_session_tag_.clear(); 452 local_session_tag_.clear();
454 } 453 }
455 454
456 } // namespace sync_sessions 455 } // namespace sync_sessions
OLDNEW
« no previous file with comments | « components/sync_sessions/sync_sessions_client.h ('k') | components/sync_sessions/synced_session_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698