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