10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/sync/sessions/session_data_type_controller.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/synced_window_delegate.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/sessions/synced_window_delegates_getter.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_details.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_service.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_source.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserThread;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace browser_sync {
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
230529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSessionDataTypeController::SessionDataTypeController(
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    sync_driver::SyncApiComponentFactory* sync_factory,
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Profile* profile,
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SyncedWindowDelegatesGetter* synced_window_getter,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sync_driver::LocalDeviceInfoProvider* local_device)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : UIDataTypeController(
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&ChromeReportUnrecoverableError),
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          syncer::SESSIONS,
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          sync_factory),
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      profile_(profile),
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      synced_window_getter_(synced_window_getter),
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      local_device_(local_device),
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      waiting_on_session_restore_(false),
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      waiting_on_local_device_info_(false) {
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(local_device_);
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pref_registrar_.Init(profile->GetPrefs());
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pref_registrar_.Add(
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prefs::kSavingBrowserHistoryDisabled,
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&SessionDataTypeController::OnSavingBrowserHistoryPrefChanged,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
460529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSessionDataTypeController::~SessionDataTypeController() {}
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool SessionDataTypeController::StartModels() {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::set<browser_sync::SyncedWindowDelegate*> window =
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      synced_window_getter_->GetSyncedWindowDelegates();
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (std::set<browser_sync::SyncedWindowDelegate*>::const_iterator i =
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window.begin(); i != window.end(); ++i) {
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if ((*i)->IsSessionRestoreInProgress()) {
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      notification_registrar_.Add(
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          this,
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          chrome::NOTIFICATION_SESSION_RESTORE_COMPLETE,
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          content::Source<Profile>(profile_));
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      waiting_on_session_restore_ = true;
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!local_device_->GetLocalDeviceInfo()) {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    subscription_ = local_device_->RegisterOnInitializedCallback(
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::Bind(&SessionDataTypeController::OnLocalDeviceInfoInitialized,
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   this));
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    waiting_on_local_device_info_ = true;
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return !IsWaiting();
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SessionDataTypeController::StopModels() {
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  notification_registrar_.RemoveAll();
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool SessionDataTypeController::ReadyForStart() const {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !profile_->GetPrefs()->GetBoolean(
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prefs::kSavingBrowserHistoryDisabled);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SessionDataTypeController::IsWaiting() {
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return waiting_on_session_restore_ || waiting_on_local_device_info_;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SessionDataTypeController::MaybeCompleteLoading() {
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (state_ == MODEL_STARTING && !IsWaiting()) {
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    OnModelLoaded();
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SessionDataTypeController::Observe(
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int type,
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const content::NotificationSource& source,
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const content::NotificationDetails& details) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK_EQ(chrome::NOTIFICATION_SESSION_RESTORE_COMPLETE, type);
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK_EQ(profile_, content::Source<Profile>(source).ptr());
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  notification_registrar_.RemoveAll();
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  waiting_on_session_restore_ = false;
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MaybeCompleteLoading();
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SessionDataTypeController::OnLocalDeviceInfoInitialized() {
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  subscription_.reset();
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  waiting_on_local_device_info_ = false;
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MaybeCompleteLoading();
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SessionDataTypeController::OnSavingBrowserHistoryPrefChanged() {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (profile_->GetPrefs()->GetBoolean(prefs::kSavingBrowserHistoryDisabled)) {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // If history and tabs persistence is turned off then generate an
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // unrecoverable error. SESSIONS won't be a registered type on the next
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Chrome restart.
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (state() != NOT_RUNNING && state() != STOPPING) {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      syncer::SyncError error(
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FROM_HERE,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          syncer::SyncError::DATATYPE_POLICY_ERROR,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "History and tab saving is now disabled by policy.",
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          syncer::SESSIONS);
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OnSingleDataTypeUnrecoverableError(error);
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace browser_sync
133