Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/sync/sessions2/sessions_sync_manager.h" | 5 #include "chrome/browser/sync/sessions2/sessions_sync_manager.h" |
| 6 | 6 |
| 7 #include "chrome/browser/chrome_notification_types.h" | 7 #include "chrome/browser/chrome_notification_types.h" |
| 8 #if !defined(OS_ANDROID) | 8 #if !defined(OS_ANDROID) |
| 9 #include "chrome/browser/network_time/navigation_time_helper.h" | 9 #include "chrome/browser/network_time/navigation_time_helper.h" |
| 10 #endif | 10 #endif |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 | 30 |
| 31 namespace browser_sync { | 31 namespace browser_sync { |
| 32 | 32 |
| 33 // Maximum number of favicons to sync. | 33 // Maximum number of favicons to sync. |
| 34 // TODO(zea): pull this from the server. | 34 // TODO(zea): pull this from the server. |
| 35 static const int kMaxSyncFavicons = 200; | 35 static const int kMaxSyncFavicons = 200; |
| 36 | 36 |
| 37 // The maximum number of navigations in each direction we care to sync. | 37 // The maximum number of navigations in each direction we care to sync. |
| 38 static const int kMaxSyncNavigationCount = 6; | 38 static const int kMaxSyncNavigationCount = 6; |
| 39 | 39 |
| 40 // The URL at which the set of synced tabs is displayed. We treat it differently | |
| 41 // from all other URL's as accessing it triggers a sync refresh of Sessions. | |
| 42 static const char kNTPOpenTabSyncURL[] = "chrome://newtab/#open_tabs"; | |
| 43 | |
| 40 SessionsSyncManager::SessionsSyncManager( | 44 SessionsSyncManager::SessionsSyncManager( |
| 41 Profile* profile, | 45 Profile* profile, |
| 42 SyncInternalApiDelegate* delegate) | 46 SyncInternalApiDelegate* delegate, |
| 47 scoped_ptr<LocalEventRouter> router) | |
| 43 : favicon_cache_(profile, kMaxSyncFavicons), | 48 : favicon_cache_(profile, kMaxSyncFavicons), |
| 44 sync_prefs_(profile->GetPrefs()), | 49 sync_prefs_(profile->GetPrefs()), |
| 45 profile_(profile), | 50 profile_(profile), |
| 46 delegate_(delegate), | 51 delegate_(delegate), |
| 47 local_session_header_node_id_(TabNodePool2::kInvalidTabNodeID) { | 52 local_session_header_node_id_(TabNodePool2::kInvalidTabNodeID), |
| 53 local_event_router_(router.Pass()) { | |
| 48 } | 54 } |
| 49 | 55 |
| 50 SessionsSyncManager::~SessionsSyncManager() { | 56 SessionsSyncManager::~SessionsSyncManager() { |
| 51 } | 57 } |
| 52 | 58 |
| 53 // Returns the GUID-based string that should be used for | 59 // Returns the GUID-based string that should be used for |
| 54 // |SessionsSyncManager::current_machine_tag_|. | 60 // |SessionsSyncManager::current_machine_tag_|. |
| 55 static std::string BuildMachineTag(const std::string& cache_guid) { | 61 static std::string BuildMachineTag(const std::string& cache_guid) { |
| 56 std::string machine_tag = "session_sync"; | 62 std::string machine_tag = "session_sync"; |
| 57 machine_tag.append(cache_guid); | 63 machine_tag.append(cache_guid); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 delegate_->GetLocalSyncCacheGUID())); | 115 delegate_->GetLocalSyncCacheGUID())); |
| 110 if (current_machine_tag_.compare(sync_machine_tag) != 0) | 116 if (current_machine_tag_.compare(sync_machine_tag) != 0) |
| 111 DeleteForeignSessionInternal(sync_machine_tag, &new_changes); | 117 DeleteForeignSessionInternal(sync_machine_tag, &new_changes); |
| 112 #endif | 118 #endif |
| 113 | 119 |
| 114 // Check if anything has changed on the local client side. | 120 // Check if anything has changed on the local client side. |
| 115 AssociateWindows(RELOAD_TABS, &new_changes); | 121 AssociateWindows(RELOAD_TABS, &new_changes); |
| 116 | 122 |
| 117 merge_result.set_error( | 123 merge_result.set_error( |
| 118 sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes)); | 124 sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes)); |
| 125 | |
| 126 local_event_router_->StartRoutingTo(this); | |
| 119 return merge_result; | 127 return merge_result; |
| 120 } | 128 } |
| 121 | 129 |
| 122 void SessionsSyncManager::AssociateWindows( | 130 void SessionsSyncManager::AssociateWindows( |
| 123 ReloadTabsOption option, | 131 ReloadTabsOption option, |
| 124 syncer::SyncChangeList* change_output) { | 132 syncer::SyncChangeList* change_output) { |
| 125 const std::string local_tag = current_machine_tag(); | 133 const std::string local_tag = current_machine_tag(); |
| 126 sync_pb::SessionSpecifics specifics; | 134 sync_pb::SessionSpecifics specifics; |
| 127 specifics.set_session_tag(local_tag); | 135 specifics.set_session_tag(local_tag); |
| 128 sync_pb::SessionHeader* header_s = specifics.mutable_header(); | 136 sync_pb::SessionHeader* header_s = specifics.mutable_header(); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 const GURL new_url = GetCurrentVirtualURL(*tab); | 294 const GURL new_url = GetCurrentVirtualURL(*tab); |
| 287 if (new_url != tab_link->url()) { | 295 if (new_url != tab_link->url()) { |
| 288 tab_link->set_url(new_url); | 296 tab_link->set_url(new_url); |
| 289 favicon_cache_.OnFaviconVisited(new_url, GetCurrentFaviconURL(*tab)); | 297 favicon_cache_.OnFaviconVisited(new_url, GetCurrentFaviconURL(*tab)); |
| 290 } | 298 } |
| 291 | 299 |
| 292 session_tracker_.GetSession(current_machine_tag())->modified_time = | 300 session_tracker_.GetSession(current_machine_tag())->modified_time = |
| 293 base::Time::Now(); | 301 base::Time::Now(); |
| 294 } | 302 } |
| 295 | 303 |
| 296 void SessionsSyncManager::OnLocalTabModified( | 304 void SessionsSyncManager::OnLocalTabModified(SyncedTabDelegate* modified_tab) { |
| 297 const SyncedTabDelegate& modified_tab, syncer::SyncError* error) { | 305 const content::NavigationEntry* entry = modified_tab->GetActiveEntry(); |
| 298 NOTIMPLEMENTED() << "TODO(tim): SessionModelAssociator::Observe equivalent."; | 306 if (!modified_tab->IsBeingDestroyed() && |
| 307 entry && | |
| 308 entry->GetVirtualURL().is_valid() && | |
| 309 entry->GetVirtualURL().spec() == kNTPOpenTabSyncURL) { | |
| 310 DVLOG(1) << "Triggering sync refresh for sessions datatype."; | |
| 311 const syncer::ModelTypeSet types(syncer::SESSIONS); | |
| 312 content::NotificationService::current()->Notify( | |
| 313 chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, | |
| 314 content::Source<Profile>(profile_), | |
| 315 content::Details<const syncer::ModelTypeSet>(&types)); | |
| 316 } | |
| 317 | |
| 318 syncer::SyncChangeList changes; | |
| 319 // Associate tabs first so the synced session tracker is aware of them. | |
| 320 AssociateTab(modified_tab, &changes); | |
| 321 // Note, we always associate windows because it's possible a tab became | |
| 322 // "interesting" by going to a valid URL, in which case it needs to be added | |
| 323 // to the window's tab information. | |
| 324 AssociateWindows(DONT_RELOAD_TABS, &changes); | |
| 325 | |
| 326 syncer::SyncError error = | |
| 327 sync_processor_->ProcessSyncChanges(FROM_HERE, changes); | |
| 328 if (error.IsSet()) { | |
|
Nicolas Zea
2013/11/21 02:34:52
not necessarily for this patch, but I suspect trig
tim (not reviewing)
2013/11/21 21:38:59
Hm. Right. Well, in the old code, we'd re-associat
Nicolas Zea
2013/11/22 23:34:51
Yeah, the old version was kind of violating some l
| |
| 329 // Note that if we fail to associate, it means something has gone wrong, | |
| 330 // such as our local session being deleted, so we disassociate and | |
| 331 // associate again. | |
| 332 NOTIMPLEMENTED() << "TODO(tim): Bug 98892. Full re-association."; | |
| 333 } | |
| 299 } | 334 } |
| 300 | 335 |
| 301 void SessionsSyncManager::OnBrowserOpened() { | 336 void SessionsSyncManager::OnBrowserOpened() { |
| 302 NOTIMPLEMENTED() << "TODO(tim): SessionModelAssociator::Observe equivalent."; | 337 syncer::SyncChangeList changes; |
| 338 AssociateWindows(DONT_RELOAD_TABS, &changes); | |
| 339 syncer::SyncError error = | |
| 340 sync_processor_->ProcessSyncChanges(FROM_HERE, changes); | |
|
Nicolas Zea
2013/11/21 02:34:52
nit: fits on one line?
tim (not reviewing)
2013/11/21 21:38:59
nope
| |
| 341 if (error.IsSet()) { | |
|
Nicolas Zea
2013/11/21 02:34:52
nit: remove curly brace
tim (not reviewing)
2013/11/21 21:38:59
I'm with you, although as a rule of thumb we try t
Nicolas Zea
2013/11/22 23:34:51
I think we can probably ignore the error result. S
| |
| 342 NOTIMPLEMENTED() << "TODO(tim): Bug 98892. Full re-association."; | |
| 343 } | |
| 344 } | |
| 345 | |
| 346 void SessionsSyncManager::OnFaviconPageUrlsUpdated( | |
| 347 const std::set<GURL>& updated_favicon_page_urls) { | |
| 348 // TODO(zea): consider a separate container for tabs with outstanding favicon | |
| 349 // loads so we don't have to iterate through all tabs comparing urls. | |
| 350 for (std::set<GURL>::const_iterator i = updated_favicon_page_urls.begin(); | |
| 351 i != updated_favicon_page_urls.end(); ++i) { | |
| 352 for (TabLinksMap::iterator tab_iter = local_tab_map_.begin(); | |
| 353 tab_iter != local_tab_map_.end(); | |
| 354 ++tab_iter) { | |
| 355 if (tab_iter->second->url() == *i) | |
| 356 favicon_cache_.OnPageFaviconUpdated(*i); | |
| 357 } | |
| 358 } | |
| 303 } | 359 } |
| 304 | 360 |
| 305 bool SessionsSyncManager::ShouldSyncTab(const SyncedTabDelegate& tab) const { | 361 bool SessionsSyncManager::ShouldSyncTab(const SyncedTabDelegate& tab) const { |
| 306 if (tab.profile() != profile_) | 362 if (tab.profile() != profile_) |
| 307 return false; | 363 return false; |
| 308 | 364 |
| 309 if (SyncedWindowDelegate::FindSyncedWindowDelegateWithId( | 365 if (SyncedWindowDelegate::FindSyncedWindowDelegateWithId( |
| 310 tab.GetWindowId()) == NULL) { | 366 tab.GetWindowId()) == NULL) { |
| 311 return false; | 367 return false; |
| 312 } | 368 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 338 } | 394 } |
| 339 | 395 |
| 340 // static. | 396 // static. |
| 341 bool SessionsSyncManager::ShouldSyncWindow( | 397 bool SessionsSyncManager::ShouldSyncWindow( |
| 342 const SyncedWindowDelegate* window) { | 398 const SyncedWindowDelegate* window) { |
| 343 if (window->IsApp()) | 399 if (window->IsApp()) |
| 344 return false; | 400 return false; |
| 345 return window->IsTypeTabbed() || window->IsTypePopup(); | 401 return window->IsTypeTabbed() || window->IsTypePopup(); |
| 346 } | 402 } |
| 347 | 403 |
| 348 void SessionsSyncManager::ForwardRelevantFaviconUpdatesToFaviconCache( | |
| 349 const std::set<GURL>& updated_favicon_page_urls) { | |
| 350 // TODO(zea): consider a separate container for tabs with outstanding favicon | |
| 351 // loads so we don't have to iterate through all tabs comparing urls. | |
| 352 for (std::set<GURL>::const_iterator i = updated_favicon_page_urls.begin(); | |
| 353 i != updated_favicon_page_urls.end(); ++i) { | |
| 354 for (TabLinksMap::iterator tab_iter = local_tab_map_.begin(); | |
| 355 tab_iter != local_tab_map_.end(); | |
| 356 ++tab_iter) { | |
| 357 if (tab_iter->second->url() == *i) | |
| 358 favicon_cache_.OnPageFaviconUpdated(*i); | |
| 359 } | |
| 360 } | |
| 361 } | |
| 362 | |
| 363 void SessionsSyncManager::StopSyncing(syncer::ModelType type) { | 404 void SessionsSyncManager::StopSyncing(syncer::ModelType type) { |
| 364 NOTIMPLEMENTED(); | 405 NOTIMPLEMENTED(); |
| 365 } | 406 } |
| 366 | 407 |
| 367 syncer::SyncDataList SessionsSyncManager::GetAllSyncData( | 408 syncer::SyncDataList SessionsSyncManager::GetAllSyncData( |
| 368 syncer::ModelType type) const { | 409 syncer::ModelType type) const { |
| 369 NOTIMPLEMENTED(); | 410 NOTIMPLEMENTED(); |
| 370 return syncer::SyncDataList(); | 411 return syncer::SyncDataList(); |
| 371 } | 412 } |
| 372 | 413 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 389 it->sync_data().GetSpecifics().session(); | 430 it->sync_data().GetSpecifics().session(); |
| 390 switch (it->change_type()) { | 431 switch (it->change_type()) { |
| 391 case syncer::SyncChange::ACTION_DELETE: | 432 case syncer::SyncChange::ACTION_DELETE: |
| 392 // Deletions are all or nothing (since we only ever delete entire | 433 // Deletions are all or nothing (since we only ever delete entire |
| 393 // sessions). Therefore we don't care if it's a tab node or meta node, | 434 // sessions). Therefore we don't care if it's a tab node or meta node, |
| 394 // and just ensure we've disassociated. | 435 // and just ensure we've disassociated. |
| 395 if (current_machine_tag() == session.session_tag()) { | 436 if (current_machine_tag() == session.session_tag()) { |
| 396 // Another client has attempted to delete our local data (possibly by | 437 // Another client has attempted to delete our local data (possibly by |
| 397 // error or a clock is inaccurate). Just ignore the deletion for now | 438 // error or a clock is inaccurate). Just ignore the deletion for now |
| 398 // to avoid any possible ping-pong delete/reassociate sequence. | 439 // to avoid any possible ping-pong delete/reassociate sequence. |
| 440 // TODO(tim): Bug 98892. This corrupts TabNodePool. Perform full | |
| 441 // re-association. | |
| 399 LOG(WARNING) << "Local session data deleted. Ignoring until next " | 442 LOG(WARNING) << "Local session data deleted. Ignoring until next " |
| 400 << "local navigation event."; | 443 << "local navigation event."; |
| 401 } else if (session.has_header()) { | 444 } else if (session.has_header()) { |
| 402 // Disassociate only when header node is deleted. For tab node | 445 // Disassociate only when header node is deleted. For tab node |
| 403 // deletions, the header node will be updated and foreign tab will | 446 // deletions, the header node will be updated and foreign tab will |
| 404 // get deleted. | 447 // get deleted. |
| 405 DisassociateForeignSession(session.session_tag()); | 448 DisassociateForeignSession(session.session_tag()); |
| 406 } | 449 } |
| 407 continue; | 450 continue; |
| 408 case syncer::SyncChange::ACTION_ADD: | 451 case syncer::SyncChange::ACTION_ADD: |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 861 SerializedNavigationEntry::FromNavigationEntry( | 904 SerializedNavigationEntry::FromNavigationEntry( |
| 862 i + offset, *blocked_navigations[i])); | 905 i + offset, *blocked_navigations[i])); |
| 863 session_tab->navigations.back().set_blocked_state( | 906 session_tab->navigations.back().set_blocked_state( |
| 864 SerializedNavigationEntry::STATE_BLOCKED); | 907 SerializedNavigationEntry::STATE_BLOCKED); |
| 865 // TODO(bauerb): Add categories | 908 // TODO(bauerb): Add categories |
| 866 } | 909 } |
| 867 } | 910 } |
| 868 session_tab->session_storage_persistent_id.clear(); | 911 session_tab->session_storage_persistent_id.clear(); |
| 869 } | 912 } |
| 870 | 913 |
| 871 | |
| 872 FaviconCache* SessionsSyncManager::GetFaviconCache() { | 914 FaviconCache* SessionsSyncManager::GetFaviconCache() { |
| 873 return &favicon_cache_; | 915 return &favicon_cache_; |
| 874 } | 916 } |
| 875 | 917 |
| 876 }; // namespace browser_sync | 918 }; // namespace browser_sync |
| OLD | NEW |