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 "content/browser/devtools/devtools_power_handler.h" 6 7 #include "base/bind.h" 8 #include "base/values.h" 9 #include "content/browser/devtools/devtools_protocol_constants.h" 10 #include "content/browser/power_profiler/power_profiler_service.h" 11 12 namespace content { 13 14 DevToolsPowerHandler::DevToolsPowerHandler() { 15 RegisterCommandHandler(devtools::Power::start::kName, 16 base::Bind(&DevToolsPowerHandler::OnStart, 17 base::Unretained(this))); 18 RegisterCommandHandler(devtools::Power::end::kName, 19 base::Bind(&DevToolsPowerHandler::OnEnd, 20 base::Unretained(this))); 21 RegisterCommandHandler(devtools::Power::canProfilePower::kName, 22 base::Bind(&DevToolsPowerHandler::OnCanProfilePower, 23 base::Unretained(this))); 24 } 25 26 DevToolsPowerHandler::~DevToolsPowerHandler() { 27 PowerProfilerService::GetInstance()->RemoveObserver(this); 28 } 29 30 void DevToolsPowerHandler::OnPowerEvent(const PowerEventVector& events) { 31 base::DictionaryValue* params = new base::DictionaryValue(); 32 base::ListValue* event_list = new base::ListValue(); 33 34 std::vector<PowerEvent>::const_iterator iter; 35 for (iter = events.begin(); iter != events.end(); ++iter) { 36 base::DictionaryValue* event_body = new base::DictionaryValue(); 37 38 DCHECK(iter->type < PowerEvent::ID_COUNT); 39 event_body->SetString("type", kPowerTypeNames[iter->type]); 40 // Use internal value to be consistent with Blink's 41 // monotonicallyIncreasingTime. 42 event_body->SetDouble("timestamp", iter->time.ToInternalValue() / 43 static_cast<double>(base::Time::kMicrosecondsPerMillisecond)); 44 event_body->SetDouble("value", iter->value); 45 event_list->Append(event_body); 46 } 47 48 params->Set(devtools::Power::dataAvailable::kParamValue, event_list); 49 SendNotification(devtools::Power::dataAvailable::kName, params); 50 } 51 52 scoped_refptr<DevToolsProtocol::Response> 53 DevToolsPowerHandler::OnStart( 54 scoped_refptr<DevToolsProtocol::Command> command) { 55 if (PowerProfilerService::GetInstance()->IsAvailable()) { 56 PowerProfilerService::GetInstance()->AddObserver(this); 57 return command->SuccessResponse(NULL); 58 } 59 60 return command->InternalErrorResponse("Power profiler service unavailable"); 61 } 62 63 scoped_refptr<DevToolsProtocol::Response> 64 DevToolsPowerHandler::OnEnd(scoped_refptr<DevToolsProtocol::Command> command) { 65 if (PowerProfilerService::GetInstance()->IsAvailable()) { 66 PowerProfilerService::GetInstance()->RemoveObserver(this); 67 return command->SuccessResponse(NULL); 68 } 69 70 return command->InternalErrorResponse("Power profiler service unavailable"); 71 } 72 73 scoped_refptr<DevToolsProtocol::Response> 74 DevToolsPowerHandler::OnCanProfilePower( 75 scoped_refptr<DevToolsProtocol::Command> command) { 76 base::DictionaryValue* result = new base::DictionaryValue(); 77 result->SetBoolean(devtools::kResult, 78 PowerProfilerService::GetInstance()->IsAvailable()); 79 80 return command->SuccessResponse(result); 81 } 82 83 } // namespace content 84