1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file. 4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_ 7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string> 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/compiler_specific.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/macros.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/ref_counted.h" 13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/values.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_handler.h" 180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/invalidation_logger.h" 190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/invalidation_service.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/invalidator_registrar.h" 210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/ticl_settings_provider.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gaia/identity_provider.h" 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/backoff_entry.h" 26a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace gcm { 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GCMDriver; 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace net { 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass URLRequestContextGetter; 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace syncer { 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass InvalidationStateTracker; 37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class Invalidator; 38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace invalidation { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GCMInvalidationBridge; 42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// This InvalidationService wraps the C++ Invalidation Client (TICL) library. 44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// It provides invalidations for desktop platforms (Win, Mac, Linux). 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TiclInvalidationService : public base::NonThreadSafe, 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public InvalidationService, 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public OAuth2TokenService::Consumer, 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public OAuth2TokenService::Observer, 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public IdentityProvider::Observer, 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public TiclSettingsProvider::Observer, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public syncer::InvalidationHandler { 52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enum InvalidationNetworkChannel { 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PUSH_CLIENT_CHANNEL = 0, 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GCM_NETWORK_CHANNEL = 1, 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This enum is used in UMA_HISTOGRAM_ENUMERATION. Insert new values above 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // this line. 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NETWORK_CHANNELS_COUNT = 2 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TiclInvalidationService( 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& user_agent, 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<IdentityProvider> identity_provider, 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TiclSettingsProvider> settings_provider, 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::GCMDriver* gcm_driver, 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const scoped_refptr<net::URLRequestContextGetter>& request_context); 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual ~TiclInvalidationService(); 69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void Init( 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker); 72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // InvalidationService implementation. 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // It is an error to have registered handlers when the service is destroyed. 75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void RegisterInvalidationHandler( 76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) syncer::InvalidationHandler* handler) OVERRIDE; 77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void UpdateRegisteredInvalidationIds( 78a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) syncer::InvalidationHandler* handler, 79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const syncer::ObjectIdSet& ids) OVERRIDE; 80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void UnregisterInvalidationHandler( 81a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) syncer::InvalidationHandler* handler) OVERRIDE; 82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE; 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual std::string GetInvalidatorClientId() const OVERRIDE; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE; 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void RequestDetailedStatus( 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Callback<void(const base::DictionaryValue&)> caller) const OVERRIDE; 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual IdentityProvider* GetIdentityProvider() OVERRIDE; 88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void RequestAccessToken(); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // OAuth2TokenService::Consumer implementation 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnGetTokenSuccess( 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OAuth2TokenService::Request* request, 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& access_token, 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Time& expiration_time) OVERRIDE; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnGetTokenFailure( 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OAuth2TokenService::Request* request, 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GoogleServiceAuthError& error) OVERRIDE; 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // OAuth2TokenService::Observer implementation 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE; 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // IdentityProvider::Observer implementation. 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void OnActiveAccountLogout() OVERRIDE; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TiclSettingsProvider::Observer implementation. 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void OnUseGCMChannelChanged() OVERRIDE; 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // syncer::InvalidationHandler implementation. 111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void OnInvalidatorStateChange( 112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) syncer::InvalidatorState state) OVERRIDE; 113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void OnIncomingInvalidation( 114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetOwnerName() const OVERRIDE; 116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected: 118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Initializes with an injected invalidator. 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void InitForTest( 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker, 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch syncer::Invalidator* invalidator); 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) friend class TiclInvalidationServiceTestDelegate; 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu friend class TiclProfileSettingsProviderTest; 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool IsReadyToStart(); 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool IsStarted() const; 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StartInvalidator(InvalidationNetworkChannel network_channel); 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void UpdateInvalidationNetworkChannel(); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void UpdateInvalidatorCredentials(); 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void StopInvalidator(); 134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string user_agent_; 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<IdentityProvider> identity_provider_; 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TiclSettingsProvider> settings_provider_; 139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<syncer::InvalidatorRegistrar> invalidator_registrar_; 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker_; 142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<syncer::Invalidator> invalidator_; 143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TiclInvalidationService needs to remember access token in order to 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // invalidate it with OAuth2TokenService. 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string access_token_; 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TiclInvalidationService needs to hold reference to access_token_request_ 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // for the duration of request in order to receive callbacks. 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<OAuth2TokenService::Request> access_token_request_; 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::OneShotTimer<TiclInvalidationService> request_access_token_retry_timer_; 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::BackoffEntry request_access_token_backoff_; 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InvalidationNetworkChannel network_channel_type_; 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::GCMDriver* gcm_driver_; 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<GCMInvalidationBridge> gcm_invalidation_bridge_; 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_refptr<net::URLRequestContextGetter> request_context_; 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The invalidation logger object we use to record state changes 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and invalidations. 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InvalidationLogger logger_; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Keep a copy of the important parameters used in network channel creation 16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // for debugging. 16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::DictionaryValue network_channel_options_; 16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TiclInvalidationService); 168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace invalidation 171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_ 173