Home | History | Annotate | Download | only in devtools
      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