Index: chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc |
diff --git a/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc b/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc |
deleted file mode 100644 |
index 5fa78ffb1a5a31cd59e9ff8d5a28b2ccd886c64a..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.cc |
+++ /dev/null |
@@ -1,573 +0,0 @@ |
-// Copyright (c) 2012 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 "chrome/browser/ui/webui/performance_monitor/performance_monitor_handler.h" |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/command_line.h" |
-#include "base/time/time.h" |
-#include "base/values.h" |
-#include "chrome/browser/performance_monitor/database.h" |
-#include "chrome/browser/performance_monitor/event.h" |
-#include "chrome/browser/performance_monitor/metric.h" |
-#include "chrome/browser/performance_monitor/performance_monitor.h" |
-#include "chrome/browser/performance_monitor/performance_monitor_util.h" |
-#include "chrome/browser/ui/webui/performance_monitor/performance_monitor_l10n.h" |
-#include "chrome/browser/ui/webui/performance_monitor/performance_monitor_ui_constants.h" |
-#include "chrome/browser/ui/webui/performance_monitor/performance_monitor_ui_util.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/web_ui.h" |
-#include "extensions/common/value_builder.h" |
- |
-using content::BrowserThread; |
- |
-namespace performance_monitor { |
-namespace { |
- |
-std::set<MetricType> GetMetricSetForCategory(MetricCategory category) { |
- std::set<MetricType> metric_set; |
- switch (category) { |
- case METRIC_CATEGORY_CPU: |
- metric_set.insert(METRIC_CPU_USAGE); |
- break; |
- case METRIC_CATEGORY_MEMORY: |
- metric_set.insert(METRIC_SHARED_MEMORY_USAGE); |
- metric_set.insert(METRIC_PRIVATE_MEMORY_USAGE); |
- break; |
- case METRIC_CATEGORY_TIMING: |
- metric_set.insert(METRIC_STARTUP_TIME); |
- metric_set.insert(METRIC_TEST_STARTUP_TIME); |
- metric_set.insert(METRIC_SESSION_RESTORE_TIME); |
- metric_set.insert(METRIC_PAGE_LOAD_TIME); |
- break; |
- case METRIC_CATEGORY_NETWORK: |
- metric_set.insert(METRIC_NETWORK_BYTES_READ); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- return metric_set; |
-} |
- |
-std::set<EventType> GetEventSetForCategory(EventCategory category) { |
- std::set<EventType> event_set; |
- switch (category) { |
- case EVENT_CATEGORY_EXTENSIONS: |
- event_set.insert(EVENT_EXTENSION_INSTALL); |
- event_set.insert(EVENT_EXTENSION_UNINSTALL); |
- event_set.insert(EVENT_EXTENSION_UPDATE); |
- event_set.insert(EVENT_EXTENSION_ENABLE); |
- event_set.insert(EVENT_EXTENSION_DISABLE); |
- break; |
- case EVENT_CATEGORY_CHROME: |
- event_set.insert(EVENT_CHROME_UPDATE); |
- break; |
- case EVENT_CATEGORY_EXCEPTIONS: |
- event_set.insert(EVENT_RENDERER_HANG); |
- event_set.insert(EVENT_RENDERER_CRASH); |
- event_set.insert(EVENT_RENDERER_KILLED); |
- event_set.insert(EVENT_UNCLEAN_EXIT); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- return event_set; |
-} |
- |
-Unit GetUnitForMetricCategory(MetricCategory category) { |
- switch (category) { |
- case METRIC_CATEGORY_CPU: |
- return UNIT_PERCENT; |
- case METRIC_CATEGORY_MEMORY: |
- return UNIT_MEGABYTES; |
- case METRIC_CATEGORY_TIMING: |
- return UNIT_SECONDS; |
- case METRIC_CATEGORY_NETWORK: |
- return UNIT_MEGABYTES; |
- default: |
- NOTREACHED(); |
- } |
- return UNIT_UNDEFINED; |
-} |
- |
-MetricCategory GetCategoryForMetric(MetricType type) { |
- switch (type) { |
- case METRIC_CPU_USAGE: |
- return METRIC_CATEGORY_CPU; |
- case METRIC_SHARED_MEMORY_USAGE: |
- case METRIC_PRIVATE_MEMORY_USAGE: |
- return METRIC_CATEGORY_MEMORY; |
- case METRIC_STARTUP_TIME: |
- case METRIC_TEST_STARTUP_TIME: |
- case METRIC_SESSION_RESTORE_TIME: |
- case METRIC_PAGE_LOAD_TIME: |
- return METRIC_CATEGORY_TIMING; |
- case METRIC_NETWORK_BYTES_READ: |
- return METRIC_CATEGORY_NETWORK; |
- default: |
- NOTREACHED(); |
- } |
- return METRIC_CATEGORY_NUMBER_OF_CATEGORIES; |
-} |
- |
-Unit GetUnitForMetricType(MetricType type) { |
- switch (type) { |
- case METRIC_CPU_USAGE: |
- return UNIT_PERCENT; |
- case METRIC_SHARED_MEMORY_USAGE: |
- case METRIC_PRIVATE_MEMORY_USAGE: |
- case METRIC_NETWORK_BYTES_READ: |
- return UNIT_BYTES; |
- case METRIC_STARTUP_TIME: |
- case METRIC_TEST_STARTUP_TIME: |
- case METRIC_SESSION_RESTORE_TIME: |
- case METRIC_PAGE_LOAD_TIME: |
- return UNIT_MICROSECONDS; |
- default: |
- NOTREACHED(); |
- } |
- return UNIT_UNDEFINED; |
-} |
- |
-// Returns a dictionary for the aggregation method. Aggregation strategies |
-// contain an id representing the method, and localized strings for the |
-// method name and method description. |
-scoped_ptr<base::DictionaryValue> GetAggregationMethod( |
- AggregationMethod method) { |
- scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); |
- value->SetInteger("id", method); |
- value->SetString("name", GetLocalizedStringFromAggregationMethod(method)); |
- value->SetString( |
- "description", |
- GetLocalizedStringForAggregationMethodDescription(method)); |
- return value.Pass(); |
-} |
- |
-// Returns a list of metric details, with one entry per metric. Metric details |
-// are dictionaries which contain the id representing the metric and localized |
-// strings for the metric name and metric description. |
-scoped_ptr<base::ListValue> GetMetricDetailsForCategory( |
- MetricCategory category) { |
- scoped_ptr<base::ListValue> value(new base::ListValue()); |
- std::set<MetricType> metric_set = GetMetricSetForCategory(category); |
- for (std::set<MetricType>::const_iterator iter = metric_set.begin(); |
- iter != metric_set.end(); ++iter) { |
- base::DictionaryValue* metric_details = new base::DictionaryValue(); |
- metric_details->SetInteger("metricId", *iter); |
- metric_details->SetString( |
- "name", GetLocalizedStringFromMetricType(*iter)); |
- metric_details->SetString( |
- "description", GetLocalizedStringForMetricTypeDescription(*iter)); |
- value->Append(metric_details); |
- } |
- return value.Pass(); |
-} |
- |
-// Returns a dictionary for the metric category. Metric categories contain |
-// an id representing the category; localized strings for the category name, |
-// the default unit in which the category is measured, and the category's |
-// description; and the metric details for each metric type in the category. |
-scoped_ptr<base::DictionaryValue> GetMetricCategory(MetricCategory category) { |
- scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); |
- value->SetInteger("metricCategoryId", category); |
- value->SetString( |
- "name", GetLocalizedStringFromMetricCategory(category)); |
- value->SetString( |
- "unit", |
- GetLocalizedStringFromUnit(GetUnitForMetricCategory(category))); |
- value->SetString( |
- "description", |
- GetLocalizedStringForMetricCategoryDescription(category)); |
- value->Set("details", GetMetricDetailsForCategory(category).release()); |
- return value.Pass(); |
-} |
- |
-// Returns a list of event types, with one entry per event. Event types |
-// are dictionaries which contain the id representing the event and localized |
-// strings for the event name, event description, and a title suitable for a |
-// mouseover popup. |
-scoped_ptr<base::ListValue> GetEventTypesForCategory(EventCategory category) { |
- scoped_ptr<base::ListValue> value(new base::ListValue()); |
- std::set<EventType> event_set = GetEventSetForCategory(category); |
- for (std::set<EventType>::const_iterator iter = event_set.begin(); |
- iter != event_set.end(); ++iter) { |
- base::DictionaryValue* event_details = new base::DictionaryValue(); |
- event_details->SetInteger("eventId", *iter); |
- event_details->SetString( |
- "name", GetLocalizedStringFromEventType(*iter)); |
- event_details->SetString( |
- "description", GetLocalizedStringForEventTypeDescription(*iter)); |
- event_details->SetString( |
- "popupTitle", GetLocalizedStringForEventTypeMouseover(*iter)); |
- value->Append(event_details); |
- } |
- return value.Pass(); |
-} |
- |
-// Returns a dictionary for the event category. Event categories contain an |
-// id representing the category, localized strings for the event name and |
-// event description, and event details for each event type in the category. |
-scoped_ptr<base::DictionaryValue> GetEventCategory(EventCategory category) { |
- scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); |
- value->SetInteger("eventCategoryId", category); |
- value->SetString( |
- "name", GetLocalizedStringFromEventCategory(category)); |
- value->SetString( |
- "description", |
- GetLocalizedStringForEventCategoryDescription(category)); |
- value->Set("details", GetEventTypesForCategory(category).release()); |
- return value.Pass(); |
-} |
- |
-// Queries the performance monitor database for active intervals between |
-// |start| and |end| times and appends the results to |results|. |
-void DoGetActiveIntervals(base::ListValue* results, |
- const base::Time& start, |
- const base::Time& end) { |
- Database* db = PerformanceMonitor::GetInstance()->database(); |
- if (db == NULL) |
- return; |
- |
- std::vector<TimeRange> intervals = db->GetActiveIntervals(start, end); |
- |
- for (std::vector<TimeRange>::iterator it = intervals.begin(); |
- it != intervals.end(); ++it) { |
- base::DictionaryValue* interval_value = new base::DictionaryValue(); |
- interval_value->SetDouble("start", it->start.ToJsTime()); |
- interval_value->SetDouble("end", it->end.ToJsTime()); |
- results->Append(interval_value); |
- } |
-} |
- |
-// Queries the PerformanceMonitor database for events of type |event_type| |
-// between |start| and |end| times, creates a new event with localized keys |
-// for display, and appends the results to |results|. |
-void DoGetEvents(base::ListValue* results, |
- const std::set<EventType>& event_types, |
- const base::Time& start, |
- const base::Time& end) { |
- Database* db = PerformanceMonitor::GetInstance()->database(); |
- if (db == NULL) |
- return; |
- |
- for (std::set<EventType>::const_iterator iter = event_types.begin(); |
- iter != event_types.end(); ++iter) { |
- base::DictionaryValue* event_results = new base::DictionaryValue(); |
- event_results->SetInteger("eventId", static_cast<int>(*iter)); |
- base::ListValue* events = new base::ListValue(); |
- event_results->Set("events", events); |
- results->Append(event_results); |
- |
- Database::EventVector event_vector = db->GetEvents(*iter, start, end); |
- |
- for (Database::EventVector::iterator event = event_vector.begin(); |
- event != event_vector.end(); ++event) { |
- base::DictionaryValue* localized_event = new base::DictionaryValue(); |
- |
- for (base::DictionaryValue::Iterator data(*(*event)->data()); |
- !data.IsAtEnd(); |
- data.Advance()) { |
- base::Value* value = NULL; |
- |
- // The property 'eventType' is set in HandleGetEvents as part of the |
- // entire result set, so we don't need to include this here in the |
- // event. |
- if (data.key() == "eventType") { |
- continue; |
- } else if (data.key() == "time") { |
- // The property 'time' is also used computationally, but must be |
- // converted to JS-style time. |
- double time = 0.0; |
- if (!data.value().GetAsDouble(&time)) { |
- LOG(ERROR) << "Failed to get 'time' field from event."; |
- continue; |
- } |
- value = new base::FundamentalValue( |
- base::Time::FromInternalValue(static_cast<int64>(time)) |
- .ToJsTime()); |
- } else { |
- // All other values are user-facing, so we create a new value for |
- // localized display. |
- base::DictionaryValue* localized_value = new base::DictionaryValue(); |
- localized_value->SetString( |
- "label", |
- GetLocalizedStringFromEventProperty(data.key())); |
- localized_value->SetWithoutPathExpansion("value", |
- data.value().DeepCopy()); |
- value = localized_value; |
- } |
- |
- localized_event->SetWithoutPathExpansion(data.key(), value); |
- } |
- events->Append(localized_event); |
- } |
- } |
-} |
- |
-// Populates results with a dictionary for each metric requested. The dictionary |
-// includes a metric id, the maximum value for the metric, and a list of lists |
-// of metric points, with each sublist containing the aggregated data for an |
-// interval for which PerformanceMonitor was active. This will also convert |
-// time to JS-style time. |
-void DoGetMetrics(base::ListValue* results, |
- const std::set<MetricType>& metric_types, |
- const base::Time& start, |
- const base::Time& end, |
- const base::TimeDelta& resolution, |
- AggregationMethod aggregation_method) { |
- Database* db = PerformanceMonitor::GetInstance()->database(); |
- if (db == NULL) |
- return; |
- |
- std::vector<TimeRange> intervals = db->GetActiveIntervals(start, end); |
- |
- // For each metric type, populate a new dictionary and append it to results. |
- for (std::set<MetricType>::const_iterator metric_type = metric_types.begin(); |
- metric_type != metric_types.end(); ++metric_type) { |
- double conversion_factor = |
- GetConversionFactor(*GetUnitDetails(GetUnitForMetricType(*metric_type)), |
- *GetUnitDetails(GetUnitForMetricCategory( |
- GetCategoryForMetric(*metric_type)))); |
- |
- base::DictionaryValue* metric_set = new base::DictionaryValue(); |
- metric_set->SetInteger("metricId", static_cast<int>(*metric_type)); |
- metric_set->SetDouble( |
- "maxValue", |
- db->GetMaxStatsForActivityAndMetric(*metric_type) * conversion_factor); |
- |
- // Retrieve all metrics in the database, and aggregate them into a series |
- // of points for each active interval. |
- scoped_ptr<Database::MetricVector> metric_vector = |
- db->GetStatsForActivityAndMetric(*metric_type, start, end); |
- |
- scoped_ptr<VectorOfMetricVectors> aggregated_metrics = |
- AggregateMetric(*metric_type, |
- metric_vector.get(), |
- start, |
- intervals, |
- resolution, |
- aggregation_method); |
- |
- // The JS-side expects a list to be present, even if there are no metrics. |
- if (!aggregated_metrics) { |
- metric_set->Set("metrics", new base::ListValue()); |
- results->Append(metric_set); |
- continue; |
- } |
- |
- base::ListValue* metric_points_by_interval = new base::ListValue(); |
- |
- // For each metric point, record it in the expected format for the JS-side |
- // (a dictionary of time and value, with time as a JS-style time), and |
- // convert the values to be display-friendly. |
- for (VectorOfMetricVectors::const_iterator metric_series = |
- aggregated_metrics->begin(); |
- metric_series != aggregated_metrics->end(); ++metric_series) { |
- base::ListValue* series_value = new base::ListValue(); |
- for (Database::MetricVector::const_iterator metric_point = |
- metric_series->begin(); |
- metric_point != metric_series->end(); ++metric_point) { |
- base::DictionaryValue* point_value = new base::DictionaryValue(); |
- point_value->SetDouble("time", metric_point->time.ToJsTime()); |
- point_value->SetDouble("value", |
- metric_point->value * conversion_factor); |
- series_value->Append(point_value); |
- } |
- metric_points_by_interval->Append(series_value); |
- } |
- |
- metric_set->Set("metrics", metric_points_by_interval); |
- results->Append(metric_set); |
- } |
-} |
- |
-} // namespace |
- |
-PerformanceMonitorHandler::PerformanceMonitorHandler() { |
-} |
- |
-PerformanceMonitorHandler::~PerformanceMonitorHandler() {} |
- |
-void PerformanceMonitorHandler::RegisterMessages() { |
- web_ui()->RegisterMessageCallback( |
- "getActiveIntervals", |
- base::Bind(&PerformanceMonitorHandler::HandleGetActiveIntervals, |
- AsWeakPtr())); |
- web_ui()->RegisterMessageCallback( |
- "getFlagEnabled", |
- base::Bind(&PerformanceMonitorHandler::HandleGetFlagEnabled, |
- AsWeakPtr())); |
- web_ui()->RegisterMessageCallback( |
- "getAggregationTypes", |
- base::Bind(&PerformanceMonitorHandler::HandleGetAggregationTypes, |
- AsWeakPtr())); |
- web_ui()->RegisterMessageCallback( |
- "getEventTypes", |
- base::Bind(&PerformanceMonitorHandler::HandleGetEventTypes, |
- AsWeakPtr())); |
- web_ui()->RegisterMessageCallback( |
- "getEvents", |
- base::Bind(&PerformanceMonitorHandler::HandleGetEvents, |
- AsWeakPtr())); |
- web_ui()->RegisterMessageCallback( |
- "getMetricTypes", |
- base::Bind(&PerformanceMonitorHandler::HandleGetMetricTypes, |
- AsWeakPtr())); |
- web_ui()->RegisterMessageCallback( |
- "getMetrics", |
- base::Bind(&PerformanceMonitorHandler::HandleGetMetrics, |
- AsWeakPtr())); |
-} |
- |
-void PerformanceMonitorHandler::ReturnResults(const std::string& function, |
- const base::Value* results) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- web_ui()->CallJavascriptFunction(function, *results); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetActiveIntervals( |
- const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(2u, args->GetSize()); |
- double double_time = 0.0; |
- CHECK(args->GetDouble(0, &double_time)); |
- base::Time start = base::Time::FromJsTime(double_time); |
- CHECK(args->GetDouble(1, &double_time)); |
- base::Time end = base::Time::FromJsTime(double_time); |
- |
- base::ListValue* results = new base::ListValue(); |
- util::PostTaskToDatabaseThreadAndReply( |
- FROM_HERE, |
- base::Bind(&DoGetActiveIntervals, results, start, end), |
- base::Bind(&PerformanceMonitorHandler::ReturnResults, AsWeakPtr(), |
- "PerformanceMonitor.getActiveIntervalsCallback", |
- base::Owned(results))); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetFlagEnabled( |
- const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(0u, args->GetSize()); |
- base::FundamentalValue value( |
- CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kPerformanceMonitorGathering)); |
- ReturnResults("PerformanceMonitor.getFlagEnabledCallback", &value); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetAggregationTypes( |
- const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(0u, args->GetSize()); |
- base::ListValue results; |
- for (int i = 0; i < AGGREGATION_METHOD_NUMBER_OF_METHODS; ++i) { |
- results.Append( |
- GetAggregationMethod(static_cast<AggregationMethod>(i)).release()); |
- } |
- |
- ReturnResults( |
- "PerformanceMonitor.getAggregationTypesCallback", &results); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetEventTypes( |
- const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(0u, args->GetSize()); |
- base::ListValue results; |
- for (int i = 0; i < EVENT_CATEGORY_NUMBER_OF_CATEGORIES; ++i) |
- results.Append(GetEventCategory(static_cast<EventCategory>(i)).release()); |
- |
- ReturnResults("PerformanceMonitor.getEventTypesCallback", &results); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetEvents(const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(3u, args->GetSize()); |
- |
- const base::ListValue* event_type_list; |
- CHECK(args->GetList(0, &event_type_list)); |
- std::set<EventType> event_types; |
- for (base::ListValue::const_iterator iter = event_type_list->begin(); |
- iter != event_type_list->end(); ++iter) { |
- double event_type_double = 0.0; |
- CHECK((*iter)->GetAsDouble(&event_type_double)); |
- CHECK(event_type_double < EVENT_NUMBER_OF_EVENTS && |
- event_type_double > EVENT_UNDEFINED); |
- event_types.insert( |
- static_cast<EventType>(static_cast<int>(event_type_double))); |
- } |
- |
- double double_time = 0.0; |
- CHECK(args->GetDouble(1, &double_time)); |
- base::Time start = base::Time::FromJsTime(double_time); |
- CHECK(args->GetDouble(2, &double_time)); |
- base::Time end = base::Time::FromJsTime(double_time); |
- |
- base::ListValue* results = new base::ListValue(); |
- util::PostTaskToDatabaseThreadAndReply( |
- FROM_HERE, |
- base::Bind(&DoGetEvents, results, event_types, start, end), |
- base::Bind(&PerformanceMonitorHandler::ReturnResults, AsWeakPtr(), |
- "PerformanceMonitor.getEventsCallback", |
- base::Owned(results))); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetMetricTypes( |
- const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(0u, args->GetSize()); |
- base::ListValue results; |
- for (int i = 0; i < METRIC_CATEGORY_NUMBER_OF_CATEGORIES; ++i) |
- results.Append(GetMetricCategory(static_cast<MetricCategory>(i)).release()); |
- |
- ReturnResults("PerformanceMonitor.getMetricTypesCallback", &results); |
-} |
- |
-void PerformanceMonitorHandler::HandleGetMetrics(const base::ListValue* args) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- CHECK_EQ(5u, args->GetSize()); |
- |
- const base::ListValue* metric_type_list; |
- CHECK(args->GetList(0, &metric_type_list)); |
- std::set<MetricType> metric_types; |
- for (base::ListValue::const_iterator iter = metric_type_list->begin(); |
- iter != metric_type_list->end(); ++iter) { |
- double metric_type_double = 0.0; |
- CHECK((*iter)->GetAsDouble(&metric_type_double)); |
- CHECK(metric_type_double < METRIC_NUMBER_OF_METRICS && |
- metric_type_double > METRIC_UNDEFINED); |
- metric_types.insert( |
- static_cast<MetricType>(static_cast<int>(metric_type_double))); |
- } |
- |
- double time_double = 0.0; |
- CHECK(args->GetDouble(1, &time_double)); |
- base::Time start = base::Time::FromJsTime(time_double); |
- CHECK(args->GetDouble(2, &time_double)); |
- base::Time end = base::Time::FromJsTime(time_double); |
- |
- double resolution_in_milliseconds = 0.0; |
- CHECK(args->GetDouble(3, &resolution_in_milliseconds)); |
- base::TimeDelta resolution = |
- base::TimeDelta::FromMilliseconds(resolution_in_milliseconds); |
- |
- double aggregation_double = 0.0; |
- CHECK(args->GetDouble(4, &aggregation_double)); |
- CHECK(aggregation_double < AGGREGATION_METHOD_NUMBER_OF_METHODS && |
- aggregation_double >= 0); |
- AggregationMethod aggregation_method = |
- static_cast<AggregationMethod>(static_cast<int>(aggregation_double)); |
- |
- base::ListValue* results = new base::ListValue(); |
- util::PostTaskToDatabaseThreadAndReply( |
- FROM_HERE, |
- base::Bind(&DoGetMetrics, results, metric_types, |
- start, end, resolution, aggregation_method), |
- base::Bind(&PerformanceMonitorHandler::ReturnResults, AsWeakPtr(), |
- "PerformanceMonitor.getMetricsCallback", |
- base::Owned(results))); |
-} |
- |
-} // namespace performance_monitor |