OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/sessions_sync_manager.h" | 5 #include "components/sync_sessions/sessions_sync_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
13 #include "base/metrics/field_trial.h" | 13 #include "base/metrics/field_trial.h" |
14 #include "base/metrics/histogram_macros.h" | 14 #include "base/metrics/histogram_macros.h" |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
17 #include "components/sync/base/hash_util.h" | 17 #include "components/sync/base/hash_util.h" |
18 #include "components/sync/device_info/local_device_info_provider.h" | 18 #include "components/sync/device_info/local_device_info_provider.h" |
19 #include "components/sync/model/sync_error.h" | 19 #include "components/sync/model/sync_error.h" |
20 #include "components/sync/model/sync_error_factory.h" | 20 #include "components/sync/model/sync_error_factory.h" |
21 #include "components/sync/model/sync_merge_result.h" | 21 #include "components/sync/model/sync_merge_result.h" |
22 #include "components/sync/model/time.h" | 22 #include "components/sync/model/time.h" |
23 #include "components/sync_sessions/sync_sessions_client.h" | 23 #include "components/sync_sessions/sync_sessions_client.h" |
24 #include "components/sync_sessions/synced_tab_delegate.h" | 24 #include "components/sync_sessions/synced_tab_delegate.h" |
25 #include "components/sync_sessions/synced_window_delegate.h" | 25 #include "components/sync_sessions/synced_window_delegate.h" |
26 #include "components/sync_sessions/synced_window_delegates_getter.h" | 26 #include "components/sync_sessions/synced_window_delegates_getter.h" |
27 #include "components/sync_sessions/tab_node_pool.h" | 27 #include "components/sync_sessions/tab_node_pool.h" |
28 #include "components/variations/variations_associated_data.h" | |
29 | 28 |
30 using sessions::SerializedNavigationEntry; | 29 using sessions::SerializedNavigationEntry; |
31 using syncer::DeviceInfo; | 30 using syncer::DeviceInfo; |
32 using syncer::LocalDeviceInfoProvider; | 31 using syncer::LocalDeviceInfoProvider; |
33 using syncer::SyncChange; | 32 using syncer::SyncChange; |
34 using syncer::SyncData; | 33 using syncer::SyncData; |
35 | 34 |
36 namespace sync_sessions { | 35 namespace sync_sessions { |
37 | 36 |
38 namespace { | 37 namespace { |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 session_tracker_.GetTab(current_machine_tag(), tab_id); | 383 session_tracker_.GetTab(current_machine_tag(), tab_id); |
385 | 384 |
386 // Get the previously synced url. | 385 // Get the previously synced url. |
387 int old_index = session_tab->normalized_navigation_index(); | 386 int old_index = session_tab->normalized_navigation_index(); |
388 GURL old_url; | 387 GURL old_url; |
389 if (session_tab->navigations.size() > static_cast<size_t>(old_index)) | 388 if (session_tab->navigations.size() > static_cast<size_t>(old_index)) |
390 old_url = session_tab->navigations[old_index].virtual_url(); | 389 old_url = session_tab->navigations[old_index].virtual_url(); |
391 | 390 |
392 // Update the tracker's session representation. | 391 // Update the tracker's session representation. |
393 SetSessionTabFromDelegate(*tab_delegate, base::Time::Now(), session_tab); | 392 SetSessionTabFromDelegate(*tab_delegate, base::Time::Now(), session_tab); |
394 SetVariationIds(session_tab); | |
395 session_tracker_.GetSession(current_machine_tag())->modified_time = | 393 session_tracker_.GetSession(current_machine_tag())->modified_time = |
396 base::Time::Now(); | 394 base::Time::Now(); |
397 | 395 |
398 // Write to the sync model itself. | 396 // Write to the sync model itself. |
399 sync_pb::EntitySpecifics specifics; | 397 sync_pb::EntitySpecifics specifics; |
400 specifics.mutable_session()->CopyFrom( | 398 specifics.mutable_session()->CopyFrom( |
401 SessionTabToSpecifics(*session_tab, current_machine_tag(), tab_node_id)); | 399 SessionTabToSpecifics(*session_tab, current_machine_tag(), tab_node_id)); |
402 syncer::SyncData data = syncer::SyncData::CreateLocalData( | 400 syncer::SyncData data = syncer::SyncData::CreateLocalData( |
403 TabNodeIdToTag(current_machine_tag(), tab_node_id), current_session_name_, | 401 TabNodeIdToTag(current_machine_tag(), tab_node_id), current_session_name_, |
404 specifics); | 402 specifics); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 syncer::SyncDataList list; | 503 syncer::SyncDataList list; |
506 const SyncedSession* session = nullptr; | 504 const SyncedSession* session = nullptr; |
507 if (!session_tracker_.LookupLocalSession(&session)) | 505 if (!session_tracker_.LookupLocalSession(&session)) |
508 return syncer::SyncDataList(); | 506 return syncer::SyncDataList(); |
509 | 507 |
510 // First construct the header node. | 508 // First construct the header node. |
511 sync_pb::EntitySpecifics header_entity; | 509 sync_pb::EntitySpecifics header_entity; |
512 header_entity.mutable_session()->set_session_tag(current_machine_tag()); | 510 header_entity.mutable_session()->set_session_tag(current_machine_tag()); |
513 sync_pb::SessionHeader* header_specifics = | 511 sync_pb::SessionHeader* header_specifics = |
514 header_entity.mutable_session()->mutable_header(); | 512 header_entity.mutable_session()->mutable_header(); |
515 header_specifics->MergeFrom(session->ToSessionHeader()); | 513 header_specifics->MergeFrom(session->ToSyncSessionHeaderPB()); |
516 syncer::SyncData data = syncer::SyncData::CreateLocalData( | 514 syncer::SyncData data = syncer::SyncData::CreateLocalData( |
517 current_machine_tag(), current_session_name_, header_entity); | 515 current_machine_tag(), current_session_name_, header_entity); |
518 list.push_back(data); | 516 list.push_back(data); |
519 | 517 |
520 for (auto& win_iter : session->windows) { | 518 for (auto& win_iter : session->windows) { |
521 for (auto& tab : win_iter.second->tabs) { | 519 for (auto& tab : win_iter.second->wrapped_window.tabs) { |
522 // TODO(zea): replace with with the correct tab node id once there's a | 520 // TODO(zea): replace with with the correct tab node id once there's a |
523 // sync specific wrapper for SessionTab. This method is only used in | 521 // sync specific wrapper for SessionTab. This method is only used in |
524 // tests though, so it's fine for now. crbug.com/662597 | 522 // tests though, so it's fine for now. crbug.com/662597 |
525 int tab_node_id = 0; | 523 int tab_node_id = 0; |
526 sync_pb::EntitySpecifics entity; | 524 sync_pb::EntitySpecifics entity; |
527 entity.mutable_session()->CopyFrom( | 525 entity.mutable_session()->CopyFrom( |
528 SessionTabToSpecifics(*tab, current_machine_tag(), tab_node_id)); | 526 SessionTabToSpecifics(*tab, current_machine_tag(), tab_node_id)); |
529 syncer::SyncData data = syncer::SyncData::CreateLocalData( | 527 syncer::SyncData data = syncer::SyncData::CreateLocalData( |
530 TabNodeIdToTag(current_machine_tag(), tab_node_id), | 528 TabNodeIdToTag(current_machine_tag(), tab_node_id), |
531 current_session_name_, entity); | 529 current_session_name_, entity); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 } | 858 } |
861 session_header->modified_time = | 859 session_header->modified_time = |
862 std::max(mtime, session_header->modified_time); | 860 std::max(mtime, session_header->modified_time); |
863 } | 861 } |
864 | 862 |
865 // static | 863 // static |
866 void SessionsSyncManager::BuildSyncedSessionFromSpecifics( | 864 void SessionsSyncManager::BuildSyncedSessionFromSpecifics( |
867 const std::string& session_tag, | 865 const std::string& session_tag, |
868 const sync_pb::SessionWindow& specifics, | 866 const sync_pb::SessionWindow& specifics, |
869 base::Time mtime, | 867 base::Time mtime, |
870 sessions::SessionWindow* session_window) { | 868 SyncedSessionWindow* synced_session_window) { |
| 869 sessions::SessionWindow* session_window = |
| 870 &synced_session_window->wrapped_window; |
871 if (specifics.has_window_id()) | 871 if (specifics.has_window_id()) |
872 session_window->window_id.set_id(specifics.window_id()); | 872 session_window->window_id.set_id(specifics.window_id()); |
873 if (specifics.has_selected_tab_index()) | 873 if (specifics.has_selected_tab_index()) |
874 session_window->selected_tab_index = specifics.selected_tab_index(); | 874 session_window->selected_tab_index = specifics.selected_tab_index(); |
| 875 synced_session_window->window_type = specifics.browser_type(); |
875 if (specifics.has_browser_type()) { | 876 if (specifics.has_browser_type()) { |
876 // TODO(skuhne): Sync data writes |BrowserType| not | |
877 // |SessionWindow::WindowType|. This should get changed. | |
878 if (specifics.browser_type() == | 877 if (specifics.browser_type() == |
879 sync_pb::SessionWindow_BrowserType_TYPE_TABBED) { | 878 sync_pb::SessionWindow_BrowserType_TYPE_TABBED) { |
880 session_window->type = sessions::SessionWindow::TYPE_TABBED; | 879 session_window->type = sessions::SessionWindow::TYPE_TABBED; |
881 } else { | 880 } else { |
882 // Note: custom tabs are treated like popup windows on restore, as you can | 881 // Note: custom tabs are treated like popup windows on restore, as you can |
883 // restore a custom tab on a platform that doesn't support them. | 882 // restore a custom tab on a platform that doesn't support them. |
884 session_window->type = sessions::SessionWindow::TYPE_POPUP; | 883 session_window->type = sessions::SessionWindow::TYPE_POPUP; |
885 } | 884 } |
886 } | 885 } |
887 session_window->timestamp = mtime; | 886 session_window->timestamp = mtime; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 session_tab->navigations.push_back(*blocked_navigations[i]); | 1085 session_tab->navigations.push_back(*blocked_navigations[i]); |
1087 session_tab->navigations.back().set_index(offset + i); | 1086 session_tab->navigations.back().set_index(offset + i); |
1088 session_tab->navigations.back().set_blocked_state( | 1087 session_tab->navigations.back().set_blocked_state( |
1089 SerializedNavigationEntry::STATE_BLOCKED); | 1088 SerializedNavigationEntry::STATE_BLOCKED); |
1090 // TODO(bauerb): Add categories | 1089 // TODO(bauerb): Add categories |
1091 } | 1090 } |
1092 } | 1091 } |
1093 session_tab->session_storage_persistent_id.clear(); | 1092 session_tab->session_storage_persistent_id.clear(); |
1094 } | 1093 } |
1095 | 1094 |
1096 // static | |
1097 void SessionsSyncManager::SetVariationIds(sessions::SessionTab* session_tab) { | |
1098 base::FieldTrial::ActiveGroups active_groups; | |
1099 base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups); | |
1100 for (const base::FieldTrial::ActiveGroup& group : active_groups) { | |
1101 const variations::VariationID id = variations::GetGoogleVariationID( | |
1102 variations::CHROME_SYNC_SERVICE, group.trial_name, group.group_name); | |
1103 if (id != variations::EMPTY_ID) | |
1104 session_tab->variation_ids.push_back(id); | |
1105 } | |
1106 } | |
1107 | |
1108 FaviconCache* SessionsSyncManager::GetFaviconCache() { | 1095 FaviconCache* SessionsSyncManager::GetFaviconCache() { |
1109 return &favicon_cache_; | 1096 return &favicon_cache_; |
1110 } | 1097 } |
1111 | 1098 |
1112 SyncedWindowDelegatesGetter* | 1099 SyncedWindowDelegatesGetter* |
1113 SessionsSyncManager::synced_window_delegates_getter() const { | 1100 SessionsSyncManager::synced_window_delegates_getter() const { |
1114 return sessions_client_->GetSyncedWindowDelegatesGetter(); | 1101 return sessions_client_->GetSyncedWindowDelegatesGetter(); |
1115 } | 1102 } |
1116 | 1103 |
1117 void SessionsSyncManager::DoGarbageCollection() { | 1104 void SessionsSyncManager::DoGarbageCollection() { |
(...skipping 21 matching lines...) Expand all Loading... |
1139 } | 1126 } |
1140 | 1127 |
1141 // static | 1128 // static |
1142 std::string SessionsSyncManager::TagHashFromSpecifics( | 1129 std::string SessionsSyncManager::TagHashFromSpecifics( |
1143 const sync_pb::SessionSpecifics& specifics) { | 1130 const sync_pb::SessionSpecifics& specifics) { |
1144 return syncer::GenerateSyncableHash(syncer::SESSIONS, | 1131 return syncer::GenerateSyncableHash(syncer::SESSIONS, |
1145 TagFromSpecifics(specifics)); | 1132 TagFromSpecifics(specifics)); |
1146 } | 1133 } |
1147 | 1134 |
1148 }; // namespace sync_sessions | 1135 }; // namespace sync_sessions |
OLD | NEW |