// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/devtools/devtools_power_handler.h" #include "base/bind.h" #include "base/values.h" #include "content/browser/devtools/devtools_protocol_constants.h" #include "content/browser/power_profiler/power_profiler_service.h" namespace content { DevToolsPowerHandler::DevToolsPowerHandler() : is_profiling_(false) { RegisterCommandHandler(devtools::Power::start::kName, base::Bind(&DevToolsPowerHandler::OnStart, base::Unretained(this))); RegisterCommandHandler(devtools::Power::end::kName, base::Bind(&DevToolsPowerHandler::OnEnd, base::Unretained(this))); RegisterCommandHandler(devtools::Power::canProfilePower::kName, base::Bind(&DevToolsPowerHandler::OnCanProfilePower, base::Unretained(this))); RegisterCommandHandler(devtools::Power::getAccuracyLevel::kName, base::Bind(&DevToolsPowerHandler::OnGetAccuracyLevel, base::Unretained(this))); } DevToolsPowerHandler::~DevToolsPowerHandler() { if (is_profiling_) PowerProfilerService::GetInstance()->RemoveObserver(this); } void DevToolsPowerHandler::OnPowerEvent(const PowerEventVector& events) { base::DictionaryValue* params = new base::DictionaryValue(); base::ListValue* event_list = new base::ListValue(); std::vector::const_iterator iter; for (iter = events.begin(); iter != events.end(); ++iter) { base::DictionaryValue* event_body = new base::DictionaryValue(); DCHECK(iter->type < PowerEvent::ID_COUNT); event_body->SetString("type", kPowerTypeNames[iter->type]); // Use internal value to be consistent with Blink's // monotonicallyIncreasingTime. event_body->SetDouble("timestamp", iter->time.ToInternalValue() / static_cast(base::Time::kMicrosecondsPerMillisecond)); event_body->SetDouble("value", iter->value); event_list->Append(event_body); } params->Set(devtools::Power::dataAvailable::kParamValue, event_list); SendNotification(devtools::Power::dataAvailable::kName, params); } scoped_refptr DevToolsPowerHandler::OnStart( scoped_refptr command) { if (PowerProfilerService::GetInstance()->IsAvailable()) { PowerProfilerService::GetInstance()->AddObserver(this); is_profiling_ = true; return command->SuccessResponse(NULL); } return command->InternalErrorResponse("Power profiler service unavailable"); } scoped_refptr DevToolsPowerHandler::OnEnd(scoped_refptr command) { if (PowerProfilerService::GetInstance()->IsAvailable()) { PowerProfilerService::GetInstance()->RemoveObserver(this); is_profiling_ = false; return command->SuccessResponse(NULL); } return command->InternalErrorResponse("Power profiler service unavailable"); } scoped_refptr DevToolsPowerHandler::OnCanProfilePower( scoped_refptr command) { base::DictionaryValue* result = new base::DictionaryValue(); result->SetBoolean(devtools::kResult, PowerProfilerService::GetInstance()->IsAvailable()); return command->SuccessResponse(result); } scoped_refptr DevToolsPowerHandler::OnGetAccuracyLevel( scoped_refptr command) { if (PowerProfilerService::GetInstance()->IsAvailable()) { base::DictionaryValue* result = new base::DictionaryValue(); result->SetString( devtools::kResult, PowerProfilerService::GetInstance()->GetAccuracyLevel()); return command->SuccessResponse(result); } return command->InternalErrorResponse("Power profiler service unavailable"); } void DevToolsPowerHandler::OnClientDetached() { if (is_profiling_) PowerProfilerService::GetInstance()->RemoveObserver(this); } } // namespace content