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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/policy/cloud/user_cloud_policy_invalidator.h" 6 7 #include "base/bind.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/time/default_clock.h" 11 #include "chrome/browser/chrome_notification_types.h" 12 #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 13 #include "components/invalidation/profile_invalidation_provider.h" 14 #include "components/policy/core/common/cloud/cloud_policy_manager.h" 15 #include "content/public/browser/notification_source.h" 16 17 namespace policy { 18 19 UserCloudPolicyInvalidator::UserCloudPolicyInvalidator( 20 Profile* profile, 21 CloudPolicyManager* policy_manager) 22 : CloudPolicyInvalidator(GetPolicyType(), 23 policy_manager->core(), 24 base::MessageLoopProxy::current(), 25 scoped_ptr<base::Clock>(new base::DefaultClock()), 26 0 /* highest_handled_invalidation_version */), 27 profile_(profile) { 28 DCHECK(profile); 29 30 // Register for notification that profile creation is complete. The 31 // invalidator must not be initialized before then because the invalidation 32 // service cannot be started because it depends on components initialized 33 // after this object is instantiated. 34 // TODO(stepco): Delayed initialization can be removed once the request 35 // context can be accessed during profile-keyed service creation. Tracked by 36 // bug 286209. 37 registrar_.Add(this, 38 chrome::NOTIFICATION_PROFILE_ADDED, 39 content::Source<Profile>(profile)); 40 } 41 42 // static 43 enterprise_management::DeviceRegisterRequest::Type 44 UserCloudPolicyInvalidator::GetPolicyType() { 45 #if defined(OS_CHROMEOS) 46 return enterprise_management::DeviceRegisterRequest::USER; 47 #elif defined(OS_ANDROID) 48 return enterprise_management::DeviceRegisterRequest::ANDROID_BROWSER; 49 #elif defined(OS_IOS) 50 return enterprise_management::DeviceRegisterRequest::IOS_BROWSER; 51 #else 52 return enterprise_management::DeviceRegisterRequest::BROWSER; 53 #endif 54 } 55 56 void UserCloudPolicyInvalidator::Shutdown() { 57 CloudPolicyInvalidator::Shutdown(); 58 } 59 60 void UserCloudPolicyInvalidator::Observe( 61 int type, 62 const content::NotificationSource& source, 63 const content::NotificationDetails& details) { 64 // Initialize now that profile creation is complete and the invalidation 65 // service can safely be initialized. 66 DCHECK(type == chrome::NOTIFICATION_PROFILE_ADDED); 67 invalidation::ProfileInvalidationProvider* invalidation_provider = 68 invalidation::ProfileInvalidationProviderFactory::GetForProfile(profile_); 69 if (invalidation_provider) 70 Initialize(invalidation_provider->GetInvalidationService()); 71 } 72 73 } // namespace policy 74