1 // Copyright 2014 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/ui/webui/invalidations_message_handler.h" 6 7 #include "base/bind.h" 8 #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 9 #include "chrome/browser/profiles/profile.h" 10 #include "components/invalidation/invalidation_handler.h" 11 #include "components/invalidation/invalidation_logger.h" 12 #include "components/invalidation/invalidation_service.h" 13 #include "components/invalidation/profile_invalidation_provider.h" 14 #include "content/public/browser/web_ui.h" 15 16 namespace invalidation { 17 class InvalidationLogger; 18 } // namespace invalidation 19 20 namespace syncer { 21 class ObjectIdInvalidationMap; 22 } // namespace syncer 23 24 InvalidationsMessageHandler::InvalidationsMessageHandler() 25 : logger_(NULL), weak_ptr_factory_(this) {} 26 27 InvalidationsMessageHandler::~InvalidationsMessageHandler() { 28 if (logger_) 29 logger_->UnregisterObserver(this); 30 } 31 32 void InvalidationsMessageHandler::RegisterMessages() { 33 web_ui()->RegisterMessageCallback( 34 "doneLoading", 35 base::Bind(&InvalidationsMessageHandler::UIReady, 36 base::Unretained(this))); 37 web_ui()->RegisterMessageCallback( 38 "requestDetailedStatus", 39 base::Bind(&InvalidationsMessageHandler::HandleRequestDetailedStatus, 40 base::Unretained(this))); 41 } 42 43 void InvalidationsMessageHandler::UIReady(const base::ListValue* args) { 44 invalidation::ProfileInvalidationProvider* invalidation_provider = 45 invalidation::ProfileInvalidationProviderFactory::GetForProfile( 46 Profile::FromWebUI(web_ui())); 47 if (invalidation_provider) { 48 logger_ = invalidation_provider->GetInvalidationService()-> 49 GetInvalidationLogger(); 50 } 51 if (logger_ && !logger_->IsObserverRegistered(this)) 52 logger_->RegisterObserver(this); 53 UpdateContent(args); 54 } 55 56 void InvalidationsMessageHandler::HandleRequestDetailedStatus( 57 const base::ListValue* args) { 58 invalidation::ProfileInvalidationProvider* invalidation_provider = 59 invalidation::ProfileInvalidationProviderFactory::GetForProfile( 60 Profile::FromWebUI(web_ui())); 61 if (invalidation_provider) { 62 invalidation_provider->GetInvalidationService()->RequestDetailedStatus( 63 base::Bind(&InvalidationsMessageHandler::OnDetailedStatus, 64 weak_ptr_factory_.GetWeakPtr())); 65 } 66 } 67 68 void InvalidationsMessageHandler::UpdateContent(const base::ListValue* args) { 69 if (logger_) 70 logger_->EmitContent(); 71 } 72 73 void InvalidationsMessageHandler::OnRegistrationChange( 74 const std::multiset<std::string>& registered_handlers) { 75 base::ListValue list_of_handlers; 76 for (std::multiset<std::string>::const_iterator it = 77 registered_handlers.begin(); 78 it != registered_handlers.end(); ++it) { 79 list_of_handlers.Append(new base::StringValue(*it)); 80 } 81 web_ui()->CallJavascriptFunction("chrome.invalidations.updateHandlers", 82 list_of_handlers); 83 } 84 85 void InvalidationsMessageHandler::OnStateChange( 86 const syncer::InvalidatorState& new_state, 87 const base::Time& last_changed_timestamp) { 88 std::string state(syncer::InvalidatorStateToString(new_state)); 89 web_ui()->CallJavascriptFunction( 90 "chrome.invalidations.updateInvalidatorState", base::StringValue(state), 91 base::FundamentalValue(last_changed_timestamp.ToJsTime())); 92 } 93 94 void InvalidationsMessageHandler::OnUpdateIds( 95 const std::string& handler_name, 96 const syncer::ObjectIdCountMap& ids) { 97 base::ListValue list_of_objects; 98 for (syncer::ObjectIdCountMap::const_iterator it = ids.begin(); 99 it != ids.end(); 100 ++it) { 101 scoped_ptr<base::DictionaryValue> dic(new base::DictionaryValue()); 102 dic->SetString("name", (it->first).name()); 103 dic->SetInteger("source", (it->first).source()); 104 dic->SetInteger("totalCount", it->second); 105 list_of_objects.Append(dic.release()); 106 } 107 web_ui()->CallJavascriptFunction("chrome.invalidations.updateIds", 108 base::StringValue(handler_name), 109 list_of_objects); 110 } 111 void InvalidationsMessageHandler::OnDebugMessage( 112 const base::DictionaryValue& details) {} 113 114 void InvalidationsMessageHandler::OnInvalidation( 115 const syncer::ObjectIdInvalidationMap& new_invalidations) { 116 scoped_ptr<base::ListValue> invalidations_list = new_invalidations.ToValue(); 117 web_ui()->CallJavascriptFunction("chrome.invalidations.logInvalidations", 118 *invalidations_list); 119 } 120 121 void InvalidationsMessageHandler::OnDetailedStatus( 122 const base::DictionaryValue& network_details) { 123 web_ui()->CallJavascriptFunction("chrome.invalidations.updateDetailedStatus", 124 network_details); 125 } 126