Index: chrome/browser/sync/sessions/sessions_sync_manager.cc |
diff --git a/chrome/browser/sync/sessions/sessions_sync_manager.cc b/chrome/browser/sync/sessions/sessions_sync_manager.cc |
index f56a0d610d12893ddb2b401f0cc5f3a6970752b6..7707521cbeaf93a86d8525b6c0c80868b0cd547c 100644 |
--- a/chrome/browser/sync/sessions/sessions_sync_manager.cc |
+++ b/chrome/browser/sync/sessions/sessions_sync_manager.cc |
@@ -13,25 +13,19 @@ |
#include "chrome/browser/history/history_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/search/search.h" |
-#include "chrome/browser/sync/glue/synced_tab_delegate.h" |
-#include "chrome/common/url_constants.h" |
-#include "components/sessions/content/content_serialized_navigation_builder.h" |
#include "components/sync_driver/glue/synced_window_delegate.h" |
#include "components/sync_driver/local_device_info_provider.h" |
#include "components/sync_driver/sessions/synced_window_delegates_getter.h" |
-#include "content/public/browser/favicon_status.h" |
-#include "content/public/browser/navigation_entry.h" |
+#include "components/sync_sessions/sync_sessions_client.h" |
+#include "components/sync_sessions/synced_tab_delegate.h" |
#include "content/public/browser/notification_details.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_source.h" |
-#include "content/public/common/url_constants.h" |
#include "sync/api/sync_error.h" |
#include "sync/api/sync_error_factory.h" |
#include "sync/api/sync_merge_result.h" |
#include "sync/api/time.h" |
-using content::NavigationEntry; |
-using sessions::ContentSerializedNavigationBuilder; |
using sessions::SerializedNavigationEntry; |
using sync_driver::DeviceInfo; |
using sync_driver::LocalDeviceInfoProvider; |
@@ -76,11 +70,13 @@ bool SessionsRecencyComparator(const sync_driver::SyncedSession* s1, |
// |local_device| is owned by ProfileSyncService, its lifetime exceeds |
// lifetime of SessionSyncManager. |
SessionsSyncManager::SessionsSyncManager( |
+ sync_sessions::SyncSessionsClient* sessions_client, |
Profile* profile, |
LocalDeviceInfoProvider* local_device, |
- scoped_ptr<LocalSessionEventRouter> router, |
- scoped_ptr<SyncedWindowDelegatesGetter> synced_window_getter) |
- : favicon_cache_(FaviconServiceFactory::GetForProfile( |
+ scoped_ptr<LocalSessionEventRouter> router) |
+ : sessions_client_(sessions_client), |
+ session_tracker_(sessions_client), |
+ favicon_cache_(FaviconServiceFactory::GetForProfile( |
profile, |
ServiceAccessType::EXPLICIT_ACCESS), |
HistoryServiceFactory::GetForProfile( |
@@ -94,12 +90,14 @@ SessionsSyncManager::SessionsSyncManager( |
local_session_header_node_id_(TabNodePool::kInvalidTabNodeID), |
stale_session_threshold_days_(kDefaultStaleSessionThresholdDays), |
local_event_router_(router.Pass()), |
- synced_window_getter_(synced_window_getter.Pass()), |
page_revisit_broadcaster_(this, |
+ sessions_client, |
HistoryServiceFactory::GetForProfile( |
profile, |
ServiceAccessType::EXPLICIT_ACCESS), |
- BookmarkModelFactory::GetForProfile(profile)) {} |
+ BookmarkModelFactory::GetForProfile(profile)) { |
+ synced_window_getter_ = sessions_client_->GetSyncedWindowDelegatesGetter(); |
+} |
LocalSessionEventRouter::~LocalSessionEventRouter() {} |
@@ -206,7 +204,7 @@ void SessionsSyncManager::AssociateWindows( |
session_tracker_.ResetSessionTracking(local_tag); |
std::set<const SyncedWindowDelegate*> windows = |
- synced_window_getter_->GetSyncedWindowDelegates(); |
+ GetSyncedWindowDelegatesGetter()->GetSyncedWindowDelegates(); |
for (std::set<const SyncedWindowDelegate*>::const_iterator i = |
windows.begin(); i != windows.end(); ++i) { |
@@ -243,7 +241,7 @@ void SessionsSyncManager::AssociateWindows( |
if (!synced_tab) |
continue; |
- if (!synced_tab->HasWebContents()) { |
+ if (synced_tab->IsPlaceholderTab()) { |
// For tabs without WebContents update the |tab_id|, as it could have |
// changed after a session restore. |
// Note: We cannot check if a tab is valid if it has no WebContents. |
@@ -302,10 +300,8 @@ void SessionsSyncManager::AssociateWindows( |
void SessionsSyncManager::AssociateTab(SyncedTabDelegate* const tab, |
syncer::SyncChangeList* change_output) { |
- DCHECK(tab->HasWebContents()); |
+ DCHECK(!tab->IsPlaceholderTab()); |
SessionID::id_type tab_id = tab->GetSessionId(); |
- if (tab->profile() != profile_) |
- return; |
if (tab->IsBeingDestroyed()) { |
// This tab is closing. |
@@ -320,7 +316,7 @@ void SessionsSyncManager::AssociateTab(SyncedTabDelegate* const tab, |
return; |
} |
- if (!tab->ShouldSync()) |
+ if (!tab->ShouldSync(sessions_client_)) |
return; |
TabLinksMap::iterator local_tab_map_iter = local_tab_map_.find(tab_id); |
@@ -360,12 +356,14 @@ void SessionsSyncManager::AssociateTab(SyncedTabDelegate* const tab, |
change_output->push_back(syncer::SyncChange( |
FROM_HERE, syncer::SyncChange::ACTION_UPDATE, data)); |
- const GURL new_url = GetCurrentVirtualURL(*tab); |
+ int current_index = tab->GetCurrentEntryIndex(); |
+ const GURL new_url = tab->GetVirtualURLAtIndex(current_index); |
if (new_url != tab_link->url()) { |
tab_link->set_url(new_url); |
- favicon_cache_.OnFaviconVisited(new_url, GetCurrentFaviconURL(*tab)); |
+ favicon_cache_.OnFaviconVisited(new_url, |
+ tab->GetFaviconURLAtIndex(current_index)); |
page_revisit_broadcaster_.OnPageVisit( |
- new_url, tab->GetCurrentEntryMaybePending()->GetTransitionType()); |
+ new_url, tab->GetTransitionAtIndex(current_index)); |
} |
session_tracker_.GetSession(current_machine_tag())->modified_time = |
@@ -402,11 +400,10 @@ bool SessionsSyncManager::IsValidSessionHeader( |
} |
void SessionsSyncManager::OnLocalTabModified(SyncedTabDelegate* modified_tab) { |
- const content::NavigationEntry* entry = modified_tab->GetActiveEntry(); |
- if (!modified_tab->IsBeingDestroyed() && |
- entry && |
sdefresne
2015/10/28 16:36:30
I think the crash in http://crbug.com/548572 is d
|
- entry->GetVirtualURL().is_valid() && |
- entry->GetVirtualURL().spec() == kNTPOpenTabSyncURL) { |
+ GURL virtual_url = |
+ modified_tab->GetVirtualURLAtIndex(modified_tab->GetCurrentEntryIndex()); |
+ if (!modified_tab->IsBeingDestroyed() && virtual_url.is_valid() && |
+ virtual_url.spec() == kNTPOpenTabSyncURL) { |
DVLOG(1) << "Triggering sync refresh for sessions datatype."; |
const syncer::ModelTypeSet types(syncer::SESSIONS); |
content::NotificationService::current()->Notify( |
@@ -424,11 +421,11 @@ void SessionsSyncManager::OnLocalTabModified(SyncedTabDelegate* modified_tab) { |
} |
syncer::SyncChangeList changes; |
- // Associate tabs first so the synced session tracker is aware of them. |
AssociateTab(modified_tab, &changes); |
// Note, we always associate windows because it's possible a tab became |
// "interesting" by going to a valid URL, in which case it needs to be added |
- // to the window's tab information. |
+ // to the window's tab information. Similarly, if a tab became |
+ // "uninteresting", we remove it from the window's tab information. |
AssociateWindows(DONT_RELOAD_TABS, syncer::SyncDataList(), &changes); |
sync_processor_->ProcessSyncChanges(FROM_HERE, changes); |
} |
@@ -891,24 +888,6 @@ bool SessionsSyncManager::DisassociateForeignSession( |
return session_tracker_.DeleteSession(foreign_session_tag); |
} |
-// static |
-GURL SessionsSyncManager::GetCurrentVirtualURL( |
- const SyncedTabDelegate& tab_delegate) { |
- const NavigationEntry* current_entry = |
- tab_delegate.GetCurrentEntryMaybePending(); |
- return current_entry->GetVirtualURL(); |
-} |
- |
-// static |
-GURL SessionsSyncManager::GetCurrentFaviconURL( |
- const SyncedTabDelegate& tab_delegate) { |
- const NavigationEntry* current_entry = |
- tab_delegate.GetCurrentEntryMaybePending(); |
- return (current_entry->GetFavicon().valid ? |
- current_entry->GetFavicon().url : |
- GURL()); |
-} |
- |
bool SessionsSyncManager::GetForeignSession( |
const std::string& tag, |
std::vector<const sessions::SessionWindow*>* windows) { |
@@ -964,7 +943,8 @@ void SessionsSyncManager::LocalTabDelegateToSpecifics( |
session_tracker_.GetTab(current_machine_tag(), |
tab_delegate.GetSessionId(), |
tab_delegate.GetSyncId()); |
- SetSessionTabFromDelegate(tab_delegate, base::Time::Now(), session_tab); |
+ SetSessionTabFromDelegate(GetSyncedWindowDelegatesGetter(), tab_delegate, |
+ base::Time::Now(), session_tab); |
SetVariationIds(session_tab); |
sync_pb::SessionTab tab_s = session_tab->ToSyncData(); |
specifics->set_session_tag(current_machine_tag_); |
@@ -1022,16 +1002,20 @@ void SessionsSyncManager::AssociateRestoredPlaceholderTab( |
// static |
void SessionsSyncManager::SetSessionTabFromDelegate( |
- const SyncedTabDelegate& tab_delegate, |
- base::Time mtime, |
- sessions::SessionTab* session_tab) { |
+ SyncedWindowDelegatesGetter* synced_window_getter, |
+ const SyncedTabDelegate& tab_delegate, |
+ base::Time mtime, |
+ sessions::SessionTab* session_tab) { |
DCHECK(session_tab); |
session_tab->window_id.set_id(tab_delegate.GetWindowId()); |
session_tab->tab_id.set_id(tab_delegate.GetSessionId()); |
session_tab->tab_visual_index = 0; |
// Use -1 to indicate that the index hasn't been set properly yet. |
session_tab->current_navigation_index = -1; |
- session_tab->pinned = tab_delegate.IsPinned(); |
+ const SyncedWindowDelegate* window_delegate = |
+ synced_window_getter->FindById(tab_delegate.GetWindowId()); |
+ session_tab->pinned = |
+ window_delegate ? window_delegate->IsTabPinned(&tab_delegate) : false; |
session_tab->extension_app_id = tab_delegate.GetExtensionAppId(); |
session_tab->user_agent_override.clear(); |
session_tab->timestamp = mtime; |
@@ -1043,17 +1027,16 @@ void SessionsSyncManager::SetSessionTabFromDelegate( |
session_tab->navigations.clear(); |
for (int i = min_index; i < max_index; ++i) { |
- const NavigationEntry* entry = tab_delegate.GetEntryAtIndexMaybePending(i); |
- DCHECK(entry); |
- if (!entry->GetVirtualURL().is_valid()) |
+ if (!tab_delegate.GetVirtualURLAtIndex(i).is_valid()) |
continue; |
+ sessions::SerializedNavigationEntry serialized_entry; |
+ tab_delegate.GetSerializedNavigationAtIndex(i, &serialized_entry); |
// Set current_navigation_index to the index in navigations. |
if (i == current_index) |
session_tab->current_navigation_index = session_tab->navigations.size(); |
- session_tab->navigations.push_back( |
- ContentSerializedNavigationBuilder::FromNavigationEntry(i, *entry)); |
+ session_tab->navigations.push_back(serialized_entry); |
if (is_supervised) { |
session_tab->navigations.back().set_blocked_state( |
SerializedNavigationEntry::STATE_ALLOWED); |
@@ -1068,13 +1051,12 @@ void SessionsSyncManager::SetSessionTabFromDelegate( |
} |
if (is_supervised) { |
- const std::vector<const NavigationEntry*>& blocked_navigations = |
- *tab_delegate.GetBlockedNavigations(); |
int offset = session_tab->navigations.size(); |
+ const std::vector<const SerializedNavigationEntry*>& blocked_navigations = |
+ *tab_delegate.GetBlockedNavigations(); |
for (size_t i = 0; i < blocked_navigations.size(); ++i) { |
- session_tab->navigations.push_back( |
- ContentSerializedNavigationBuilder::FromNavigationEntry( |
- i + offset, *blocked_navigations[i])); |
+ session_tab->navigations.push_back(*blocked_navigations[i]); |
+ session_tab->navigations.back().set_index(offset + i); |
session_tab->navigations.back().set_blocked_state( |
SerializedNavigationEntry::STATE_BLOCKED); |
// TODO(bauerb): Add categories |
@@ -1102,7 +1084,7 @@ FaviconCache* SessionsSyncManager::GetFaviconCache() { |
SyncedWindowDelegatesGetter* |
SessionsSyncManager::GetSyncedWindowDelegatesGetter() const { |
- return synced_window_getter_.get(); |
+ return synced_window_getter_; |
} |
void SessionsSyncManager::DoGarbageCollection() { |