diff options
Diffstat (limited to 'chrome/browser/sync/engine/syncapi.cc')
-rw-r--r-- | chrome/browser/sync/engine/syncapi.cc | 302 |
1 files changed, 119 insertions, 183 deletions
diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc index df7e7f5..229d342 100644 --- a/chrome/browser/sync/engine/syncapi.cc +++ b/chrome/browser/sync/engine/syncapi.cc @@ -43,9 +43,11 @@ #include "chrome/browser/sync/engine/http_post_provider_factory.h" #include "chrome/browser/sync/js_arg_list.h" #include "chrome/browser/sync/js_backend.h" -#include "chrome/browser/sync/js_transaction_observer.h" #include "chrome/browser/sync/js_event_details.h" -#include "chrome/browser/sync/js_event_router.h" +#include "chrome/browser/sync/js_event_handler.h" +#include "chrome/browser/sync/js_reply_handler.h" +#include "chrome/browser/sync/js_sync_manager_observer.h" +#include "chrome/browser/sync/js_transaction_observer.h" #include "chrome/browser/sync/notifier/sync_notifier.h" #include "chrome/browser/sync/notifier/sync_notifier_observer.h" #include "chrome/browser/sync/protocol/app_specifics.pb.h" @@ -77,6 +79,15 @@ using base::TimeDelta; using browser_sync::AllStatus; using browser_sync::Cryptographer; +using browser_sync::JsArgList; +using browser_sync::JsBackend; +using browser_sync::JsEventDetails; +using browser_sync::JsEventHandler; +using browser_sync::JsReplyHandler; +using browser_sync::JsSyncManagerObserver; +using browser_sync::JsTransactionObserver; +using browser_sync::MakeWeakHandle; +using browser_sync::WeakHandle; using browser_sync::KeyParams; using browser_sync::ModelSafeRoutingInfo; using browser_sync::ModelSafeWorker; @@ -1206,8 +1217,7 @@ syncable::ModelTypeSet GetEncryptedTypes( class SyncManager::SyncInternal : public net::NetworkChangeNotifier::IPAddressObserver, public sync_notifier::SyncNotifierObserver, - public browser_sync::JsBackend, - public browser_sync::JsEventRouter, + public JsBackend, public SyncEngineEventListener, public ServerConnectionEventListener, public syncable::DirectoryChangeDelegate { @@ -1216,12 +1226,10 @@ class SyncManager::SyncInternal public: explicit SyncInternal(const std::string& name) : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), - parent_router_(NULL), registrar_(NULL), initialized_(false), setup_for_test_mode_(false), - observing_ip_address_changes_(false), - js_transaction_observer_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { + observing_ip_address_changes_(false) { // Pre-fill |notification_info_map_|. for (int i = syncable::FIRST_REAL_MODEL_TYPE; i < syncable::MODEL_TYPE_COUNT; ++i) { @@ -1258,6 +1266,7 @@ class SyncManager::SyncInternal } bool Init(const FilePath& database_location, + const WeakHandle<JsEventHandler>& event_handler, const std::string& sync_server_and_path, int port, bool use_ssl, @@ -1405,25 +1414,12 @@ class SyncManager::SyncInternal // ServerConnectionEventListener implementation. virtual void OnServerConnectionEvent(const ServerConnectionEvent& event); - // browser_sync::JsBackend implementation. - virtual void SetParentJsEventRouter( - browser_sync::JsEventRouter* router) OVERRIDE; - virtual void RemoveParentJsEventRouter() OVERRIDE; - virtual const browser_sync::JsEventRouter* - GetParentJsEventRouter() const OVERRIDE; - virtual void ProcessMessage( - const std::string& name, - const browser_sync::JsArgList& args, - const browser_sync::JsEventHandler* sender) OVERRIDE; - - // JsEventRouter implementation. - virtual void RouteJsEvent( - const std::string& name, - const browser_sync::JsEventDetails& details) OVERRIDE; - virtual void RouteJsMessageReply( - const std::string& name, - const browser_sync::JsArgList& args, - const browser_sync::JsEventHandler* target) OVERRIDE; + // JsBackend implementation. + virtual void SetJsEventHandler( + const WeakHandle<JsEventHandler>& event_handler) OVERRIDE; + virtual void ProcessJsMessage( + const std::string& name, const JsArgList& args, + const WeakHandle<JsReplyHandler>& reply_handler) OVERRIDE; private: struct NotificationInfo { @@ -1444,11 +1440,9 @@ class SyncManager::SyncInternal }; typedef std::map<syncable::ModelType, NotificationInfo> NotificationInfoMap; - typedef browser_sync::JsArgList - (SyncManager::SyncInternal::*UnboundJsMessageHandler)( - const browser_sync::JsArgList&); - typedef base::Callback<browser_sync::JsArgList(browser_sync::JsArgList)> - JsMessageHandler; + typedef JsArgList + (SyncManager::SyncInternal::*UnboundJsMessageHandler)(const JsArgList&); + typedef base::Callback<JsArgList(JsArgList)> JsMessageHandler; typedef std::map<std::string, JsMessageHandler> JsMessageHandlerMap; // Helper to call OnAuthError when no authentication credentials are @@ -1550,34 +1544,20 @@ class SyncManager::SyncInternal // Helper function used only by the constructor. void BindJsMessageHandler( - const std::string& name, - UnboundJsMessageHandler unbound_message_handler); + const std::string& name, UnboundJsMessageHandler unbound_message_handler); // Returned pointer is owned by the caller. static DictionaryValue* NotificationInfoToValue( const NotificationInfoMap& notification_info); // JS message handlers. - browser_sync::JsArgList GetNotificationState( - const browser_sync::JsArgList& args); - - browser_sync::JsArgList GetNotificationInfo( - const browser_sync::JsArgList& args); - - browser_sync::JsArgList GetRootNodeDetails( - const browser_sync::JsArgList& args); - - browser_sync::JsArgList GetNodeSummariesById( - const browser_sync::JsArgList& args); - - browser_sync::JsArgList GetNodeDetailsById( - const browser_sync::JsArgList& args); - - browser_sync::JsArgList GetChildNodeIds( - const browser_sync::JsArgList& args); - - browser_sync::JsArgList FindNodesContainingString( - const browser_sync::JsArgList& args); + JsArgList GetNotificationState(const JsArgList& args); + JsArgList GetNotificationInfo(const JsArgList& args); + JsArgList GetRootNodeDetails(const JsArgList& args); + JsArgList GetNodeSummariesById(const JsArgList& args); + JsArgList GetNodeDetailsById(const JsArgList& args); + JsArgList GetChildNodeIds(const JsArgList& args); + JsArgList FindNodesContainingString(const JsArgList& args); const std::string name_; @@ -1594,7 +1574,7 @@ class SyncManager::SyncInternal // we'd have another worker class which implements // HandleCalculateChangesChangeEventFromSyncApi() and we'd pass it a // WeakHandle when we construct it. - browser_sync::WeakHandle<SyncInternal> weak_handle_this_; + WeakHandle<SyncInternal> weak_handle_this_; // We couple the DirectoryManager and username together in a UserShare member // so we can return a handle to share_ to clients of the API for use when @@ -1606,8 +1586,6 @@ class SyncManager::SyncInternal mutable base::Lock observers_lock_; ObserverList<SyncManager::Observer> observers_; - browser_sync::JsEventRouter* parent_router_; - // The ServerConnectionManager used to abstract communication between the // client (the Syncer) and the sync server. scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; @@ -1649,9 +1627,11 @@ class SyncManager::SyncInternal // about:sync page. NotificationInfoMap notification_info_map_; - browser_sync::JsTransactionObserver js_transaction_observer_; - + // These are for interacting with chrome://sync-internals. JsMessageHandlerMap js_message_handlers_; + WeakHandle<JsEventHandler> js_event_handler_; + JsSyncManagerObserver js_sync_manager_observer_; + JsTransactionObserver js_transaction_observer_; }; const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; @@ -1661,21 +1641,24 @@ SyncManager::Observer::~Observer() {} SyncManager::SyncManager(const std::string& name) : data_(new SyncInternal(name)) {} -bool SyncManager::Init(const FilePath& database_location, - const std::string& sync_server_and_path, - int sync_server_port, - bool use_ssl, - HttpPostProviderFactory* post_factory, - ModelSafeWorkerRegistrar* registrar, - const std::string& user_agent, - const SyncCredentials& credentials, - sync_notifier::SyncNotifier* sync_notifier, - const std::string& restored_key_for_bootstrapping, - bool setup_for_test_mode) { +bool SyncManager::Init( + const FilePath& database_location, + const WeakHandle<JsEventHandler>& event_handler, + const std::string& sync_server_and_path, + int sync_server_port, + bool use_ssl, + HttpPostProviderFactory* post_factory, + ModelSafeWorkerRegistrar* registrar, + const std::string& user_agent, + const SyncCredentials& credentials, + sync_notifier::SyncNotifier* sync_notifier, + const std::string& restored_key_for_bootstrapping, + bool setup_for_test_mode) { DCHECK(post_factory); VLOG(1) << "SyncManager starting Init..."; string server_string(sync_server_and_path); return data_->Init(database_location, + event_handler, server_string, sync_server_port, use_ssl, @@ -1759,6 +1742,7 @@ const std::string& SyncManager::GetAuthenticatedUsername() { bool SyncManager::SyncInternal::Init( const FilePath& database_location, + const WeakHandle<JsEventHandler>& event_handler, const std::string& sync_server_and_path, int port, bool use_ssl, @@ -1775,14 +1759,16 @@ bool SyncManager::SyncInternal::Init( VLOG(1) << "Starting SyncInternal initialization."; - weak_handle_this_ = - browser_sync::MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); + weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); registrar_ = model_safe_worker_registrar; setup_for_test_mode_ = setup_for_test_mode; sync_notifier_.reset(sync_notifier); + AddObserver(&js_sync_manager_observer_); + SetJsEventHandler(event_handler); + share_.dir_manager.reset(new DirectoryManager(database_location)); connection_manager_.reset(new SyncAPIServerConnectionManager( @@ -1829,7 +1815,8 @@ bool SyncManager::SyncInternal::Init( ObserverList<SyncManager::Observer> temp_obs_list; CopyObservers(&temp_obs_list); FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, - OnInitializationComplete()); + OnInitializationComplete( + WeakHandle<JsBackend>(weak_ptr_factory_.GetWeakPtr()))); // The following calls check that initialized_ is true. @@ -1912,12 +1899,7 @@ bool SyncManager::SyncInternal::OpenDirectory() { } connection_manager()->set_client_id(lookup->cache_guid()); - - if (parent_router_) { - // Make sure we add the observer at most once. - lookup->RemoveTransactionObserver(&js_transaction_observer_); - lookup->AddTransactionObserver(&js_transaction_observer_); - } + lookup->AddTransactionObserver(&js_transaction_observer_); return true; } @@ -2220,10 +2202,6 @@ void SyncManager::RemoveObserver(Observer* observer) { data_->RemoveObserver(observer); } -browser_sync::JsBackend* SyncManager::GetJsBackend() { - return data_; -} - void SyncManager::RequestEarlyExit() { data_->RequestEarlyExit(); } @@ -2248,6 +2226,9 @@ void SyncManager::SyncInternal::Shutdown() { // Automatically stops the scheduler. scheduler_.reset(); + SetJsEventHandler(WeakHandle<JsEventHandler>()); + RemoveObserver(&js_sync_manager_observer_); + if (sync_notifier_.get()) { sync_notifier_->RemoveObserver(this); } @@ -2262,6 +2243,12 @@ void SyncManager::SyncInternal::Shutdown() { observing_ip_address_changes_ = false; if (dir_manager()) { + syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); + if (lookup.good()) { + lookup->RemoveTransactionObserver(&js_transaction_observer_); + } else { + NOTREACHED(); + } dir_manager()->FinalSaveChangesForAll(); dir_manager()->Close(username_for_share()); } @@ -2271,7 +2258,6 @@ void SyncManager::SyncInternal::Shutdown() { share_.dir_manager.reset(); setup_for_test_mode_ = false; - parent_router_ = NULL; registrar_ = NULL; initialized_ = false; @@ -2643,52 +2629,24 @@ void SyncManager::SyncInternal::OnSyncEngineEvent( } } -void SyncManager::SyncInternal::SetParentJsEventRouter( - browser_sync::JsEventRouter* router) { - DCHECK(router); - parent_router_ = router; - - // We might be called before OpenDirectory() or after shutdown. - if (!dir_manager()) { - return; - } - syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); - if (!lookup.good()) { - return; - } - - // Make sure we add the observer at most once. - lookup->RemoveTransactionObserver(&js_transaction_observer_); - lookup->AddTransactionObserver(&js_transaction_observer_); +void SyncManager::SyncInternal::SetJsEventHandler( + const WeakHandle<JsEventHandler>& event_handler) { + js_event_handler_ = event_handler; + js_sync_manager_observer_.SetJsEventHandler(js_event_handler_); + js_transaction_observer_.SetJsEventHandler(js_event_handler_); } -void SyncManager::SyncInternal::RemoveParentJsEventRouter() { - parent_router_ = NULL; - - // We might be called before OpenDirectory() or after shutdown. - if (!dir_manager()) { - return; - } - syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); - if (!lookup.good()) { +void SyncManager::SyncInternal::ProcessJsMessage( + const std::string& name, const JsArgList& args, + const WeakHandle<JsReplyHandler>& reply_handler) { + if (!initialized_) { + NOTREACHED(); return; } - lookup->RemoveTransactionObserver(&js_transaction_observer_); -} - -const browser_sync::JsEventRouter* - SyncManager::SyncInternal::GetParentJsEventRouter() const { - return parent_router_; -} - -void SyncManager::SyncInternal::ProcessMessage( - const std::string& name, const browser_sync::JsArgList& args, - const browser_sync::JsEventHandler* sender) { - DCHECK(initialized_); - if (!parent_router_) { - VLOG(1) << "No parent router; not replying to message " << name - << " with args " << args.ToString(); + if (!reply_handler.IsInitialized()) { + VLOG(1) << "Uninitialized reply handler; dropping unknown message " + << name << " with args " << args.ToString(); return; } @@ -2699,27 +2657,9 @@ void SyncManager::SyncInternal::ProcessMessage( return; } - parent_router_->RouteJsMessageReply( - name, js_message_handler.Run(args), sender); -} - -void SyncManager::SyncInternal::RouteJsEvent( - const std::string& name, - const browser_sync::JsEventDetails& details) { - if (!parent_router_) { - return; - } - parent_router_->RouteJsEvent(name, details); -} - -void SyncManager::SyncInternal::RouteJsMessageReply( - const std::string& name, - const browser_sync::JsArgList& args, - const browser_sync::JsEventHandler* target) { - if (!parent_router_) { - return; - } - parent_router_->RouteJsMessageReply(name, args, target); + reply_handler.Call(FROM_HERE, + &JsReplyHandler::HandleJsReply, + name, js_message_handler.Run(args)); } void SyncManager::SyncInternal::BindJsMessageHandler( @@ -2743,32 +2683,29 @@ DictionaryValue* SyncManager::SyncInternal::NotificationInfoToValue( return value; } -browser_sync::JsArgList - SyncManager::SyncInternal::GetNotificationState( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::GetNotificationState( + const JsArgList& args) { bool notifications_enabled = allstatus_.status().notifications_enabled; ListValue return_args; return_args.Append(Value::CreateBooleanValue(notifications_enabled)); - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } -browser_sync::JsArgList - SyncManager::SyncInternal::GetNotificationInfo( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::GetNotificationInfo( + const JsArgList& args) { ListValue return_args; return_args.Append(NotificationInfoToValue(notification_info_map_)); - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } -browser_sync::JsArgList - SyncManager::SyncInternal::GetRootNodeDetails( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::GetRootNodeDetails( + const JsArgList& args) { ReadTransaction trans(FROM_HERE, GetUserShare()); ReadNode root(&trans); root.InitByRootLookup(); ListValue return_args; return_args.Append(root.GetDetailsAsValue()); - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } namespace { @@ -2785,10 +2722,9 @@ int64 GetId(const ListValue& ids, int i) { return id; } -browser_sync::JsArgList GetNodeInfoById( - const browser_sync::JsArgList& args, - UserShare* user_share, - DictionaryValue* (BaseNode::*info_getter)() const) { +JsArgList GetNodeInfoById(const JsArgList& args, + UserShare* user_share, + DictionaryValue* (BaseNode::*info_getter)() const) { CHECK(info_getter); ListValue return_args; ListValue* node_summaries = new ListValue(); @@ -2809,26 +2745,23 @@ browser_sync::JsArgList GetNodeInfoById( node_summaries->Append((node.*info_getter)()); } } - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } } // namespace -browser_sync::JsArgList - SyncManager::SyncInternal::GetNodeSummariesById( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::GetNodeSummariesById( + const JsArgList& args) { return GetNodeInfoById(args, GetUserShare(), &BaseNode::GetSummaryAsValue); } -browser_sync::JsArgList - SyncManager::SyncInternal::GetNodeDetailsById( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::GetNodeDetailsById( + const JsArgList& args) { return GetNodeInfoById(args, GetUserShare(), &BaseNode::GetDetailsAsValue); } -browser_sync::JsArgList SyncManager::SyncInternal:: - GetChildNodeIds( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::GetChildNodeIds( + const JsArgList& args) { ListValue return_args; ListValue* child_ids = new ListValue(); return_args.Append(child_ids); @@ -2844,17 +2777,16 @@ browser_sync::JsArgList SyncManager::SyncInternal:: base::Int64ToString(*it))); } } - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } -browser_sync::JsArgList SyncManager::SyncInternal:: - FindNodesContainingString( - const browser_sync::JsArgList& args) { +JsArgList SyncManager::SyncInternal::FindNodesContainingString( + const JsArgList& args) { std::string query; ListValue return_args; if (!args.Get().GetString(0, &query)) { return_args.Append(new ListValue()); - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } // Convert the query string to lower case to perform case insensitive @@ -2878,7 +2810,7 @@ browser_sync::JsArgList SyncManager::SyncInternal:: } } - return browser_sync::JsArgList(&return_args); + return JsArgList(&return_args); } void SyncManager::SyncInternal::OnNotificationStateChange( @@ -2889,11 +2821,13 @@ void SyncManager::SyncInternal::OnNotificationStateChange( if (scheduler()) { scheduler()->set_notifications_enabled(notifications_enabled); } - if (parent_router_) { + if (js_event_handler_.IsInitialized()) { DictionaryValue details; details.Set("enabled", Value::CreateBooleanValue(notifications_enabled)); - parent_router_->RouteJsEvent("onNotificationStateChange", - browser_sync::JsEventDetails(&details)); + js_event_handler_.Call(FROM_HERE, + &JsEventHandler::HandleJsEvent, + "onNotificationStateChange", + JsEventDetails(&details)); } } @@ -2922,7 +2856,7 @@ void SyncManager::SyncInternal::OnIncomingNotification( LOG(WARNING) << "Sync received notification without any type information."; } - if (parent_router_) { + if (js_event_handler_.IsInitialized()) { DictionaryValue details; ListValue* changed_types = new ListValue(); details.Set("changedTypes", changed_types); @@ -2933,8 +2867,10 @@ void SyncManager::SyncInternal::OnIncomingNotification( syncable::ModelTypeToString(it->first); changed_types->Append(Value::CreateStringValue(model_type_str)); } - parent_router_->RouteJsEvent("onIncomingNotification", - browser_sync::JsEventDetails(&details)); + js_event_handler_.Call(FROM_HERE, + &JsEventHandler::HandleJsEvent, + "onIncomingNotification", + JsEventDetails(&details)); } } |