summaryrefslogtreecommitdiffstats
path: root/chrome/browser/session_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/session_service.cc')
-rw-r--r--chrome/browser/session_service.cc59
1 files changed, 58 insertions, 1 deletions
diff --git a/chrome/browser/session_service.cc b/chrome/browser/session_service.cc
index e90f8b8..6e78f9c 100644
--- a/chrome/browser/session_service.cc
+++ b/chrome/browser/session_service.cc
@@ -149,6 +149,18 @@ SessionService::~SessionService() {
// deleted. Otherwise the backend is deleted after all pending requests on
// the file thread complete, which is done before the process exits.
backend_ = NULL;
+
+ // Unregister our notifications.
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_TAB_PARENTED, NotificationService::AllSources());
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_TAB_CLOSED, NotificationService::AllSources());
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_NAV_LIST_PRUNED, NotificationService::AllSources());
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_NAV_ENTRY_CHANGED, NotificationService::AllSources());
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_NAV_INDEX_CHANGED, NotificationService::AllSources());
}
void SessionService::ResetFromCurrentBrowsers() {
@@ -303,7 +315,8 @@ void SessionService::UpdateTabNavigation(const SessionID& window_id,
const SessionID& tab_id,
int index,
const NavigationEntry& entry) {
- if (!ShouldTrackChangesToWindow(window_id))
+ if (!entry.GetDisplayURL().is_valid() ||
+ !ShouldTrackChangesToWindow(window_id))
return;
if (tab_to_available_range_.find(tab_id.id()) !=
@@ -394,6 +407,18 @@ void SessionService::CopyLastSessionToSavedSession() {
}
void SessionService::Init(const std::wstring& path) {
+ // Register for the notifications we're interested in.
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_TAB_PARENTED, NotificationService::AllSources());
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_TAB_CLOSED, NotificationService::AllSources());
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_NAV_LIST_PRUNED, NotificationService::AllSources());
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_NAV_ENTRY_CHANGED, NotificationService::AllSources());
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_NAV_INDEX_CHANGED, NotificationService::AllSources());
+
DCHECK(!path.empty());
commands_since_reset_ = 0;
backend_ = new SessionBackend(path);
@@ -403,6 +428,38 @@ void SessionService::Init(const std::wstring& path) {
// If backend_thread, backend will init itself as appropriate.
}
+void SessionService::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ // All of our messages have the NavigationController as the source.
+ NavigationController* controller = Source<NavigationController>(source).ptr();
+ switch (type) {
+ case NOTIFY_TAB_PARENTED:
+ SetTabWindow(controller->window_id(), controller->session_id());
+ break;
+ case NOTIFY_TAB_CLOSED:
+ TabClosed(controller->window_id(), controller->session_id());
+ break;
+ case NOTIFY_NAV_LIST_PRUNED:
+ TabNavigationPathPruned(controller->window_id(), controller->session_id(),
+ controller->GetEntryCount());
+ break;
+ case NOTIFY_NAV_ENTRY_CHANGED: {
+ Details<NavigationController::EntryChangedDetails> changed(details);
+ UpdateTabNavigation(controller->window_id(), controller->session_id(),
+ changed->index, *changed->changed_entry);
+ break;
+ }
+ case NOTIFY_NAV_INDEX_CHANGED:
+ SetSelectedNavigationIndex(controller->window_id(),
+ controller->session_id(),
+ controller->GetCurrentEntryIndex());
+ break;
+ default:
+ NOTREACHED();
+ }
+}
+
SessionService::Handle SessionService::GetSessionImpl(
CancelableRequestConsumerBase* consumer,
SavedSessionCallback* callback,