12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/metrics_private/metrics_private_api.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/metrics/field_trial.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/metrics/sparse_histogram.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/metrics_private.h" 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/variations_associated_data.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/user_metrics.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace GetIsCrashReportingEnabled = 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) api::metrics_private::GetIsCrashReportingEnabled; 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace GetVariationParams = api::metrics_private::GetVariationParams; 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace GetFieldTrial = api::metrics_private::GetFieldTrial; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordUserAction = api::metrics_private::RecordUserAction; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordValue = api::metrics_private::RecordValue; 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace RecordSparseValue = api::metrics_private::RecordSparseValue; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordPercentage = api::metrics_private::RecordPercentage; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordCount = api::metrics_private::RecordCount; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordSmallCount = api::metrics_private::RecordSmallCount; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordMediumCount = api::metrics_private::RecordMediumCount; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordTime = api::metrics_private::RecordTime; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordMediumTime = api::metrics_private::RecordMediumTime; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordLongTime = api::metrics_private::RecordLongTime; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxBuckets = 10000; // We don't ever want more than these many 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buckets; there is no real need for them 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and would cause crazy memory usage 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateGetIsCrashReportingEnabledFunction::RunSync() { 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetResult(new base::FundamentalValue( 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ChromeMetricsServiceAccessor::IsCrashReportingEnabled())); 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateGetFieldTrialFunction::RunSync() { 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string name; 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &name)); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetResult(new base::StringValue(base::FieldTrialList::FindFullName(name))); 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateGetVariationParamsFunction::RunSync() { 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<GetVariationParams::Params> params( 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetVariationParams::Params::Create(*args_)); 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXTENSION_FUNCTION_VALIDATE(params.get()); 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetVariationParams::Results::Params result; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (variations::GetVariationParams(params->name, 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &result.additional_properties)) { 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetResult(result.ToValue().release()); 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return true; 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordUserActionFunction::RunSync() { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordUserAction::Params> params( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordUserAction::Params::Create(*args_)); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RecordComputedAction(params->name); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MetricsHistogramHelperFunction::RecordValue( 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramType type, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min, int max, size_t buckets, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int sample) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure toxic values don't get to internal code. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fix for maximums 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min = std::min(min, INT_MAX - 3); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max = std::min(max, INT_MAX - 3); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buckets = std::min(buckets, kMaxBuckets); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fix for minimums. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min = std::max(min, 1); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max = std::max(max, min + 1); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buckets = std::max(buckets, static_cast<size_t>(3)); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Trim buckets down to a maximum of the given range + over/underflow buckets 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (buckets > static_cast<size_t>(max - min + 2)) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buckets = max - min + 2; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase* counter; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == base::LINEAR_HISTOGRAM) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counter = base::LinearHistogram::FactoryGet( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name, min, max, buckets, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase::kUmaTargetedHistogramFlag); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counter = base::Histogram::FactoryGet( 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name, min, max, buckets, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase::kUmaTargetedHistogramFlag); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The histogram can be NULL if it is constructed with bad arguments. Ignore 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // that data for this API. An error message will be logged. 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (counter) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) counter->Add(sample); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordValueFunction::RunSync() { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordValue::Params> params(RecordValue::Params::Create(*args_)); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the histogram parameters from the metric type object. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string type = api::metrics_private::MetricType::ToString( 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->metric.type); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramType histogram_type(type == "histogram-linear" ? 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::LINEAR_HISTOGRAM : base::HISTOGRAM); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric.metric_name, histogram_type, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->metric.min, params->metric.max, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->metric.buckets, params->value); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordSparseValueFunction::RunSync() { 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<RecordSparseValue::Params> params( 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RecordSparseValue::Params::Create(*args_)); 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXTENSION_FUNCTION_VALIDATE(params.get()); 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This particular UMA_HISTOGRAM_ macro is okay for 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // non-runtime-constant strings. 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_SPARSE_SLOWLY(params->metric_name, params->value); 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordPercentageFunction::RunSync() { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordPercentage::Params> params( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordPercentage::Params::Create(*args_)); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::LINEAR_HISTOGRAM, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 101, 102, params->value); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordCountFunction::RunSync() { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordCount::Params> params(RecordCount::Params::Create(*args_)); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::HISTOGRAM, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 1000000, 50, params->value); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordSmallCountFunction::RunSync() { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordSmallCount::Params> params( 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordSmallCount::Params::Create(*args_)); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::HISTOGRAM, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 100, 50, params->value); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordMediumCountFunction::RunSync() { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordMediumCount::Params> params( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordMediumCount::Params::Create(*args_)); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::HISTOGRAM, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 10000, 50, params->value); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordTimeFunction::RunSync() { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordTime::Params> params(RecordTime::Params::Create(*args_)); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const int kTenSecMs = 10 * 1000; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::HISTOGRAM, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, kTenSecMs, 50, params->value); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordMediumTimeFunction::RunSync() { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordMediumTime::Params> params( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordMediumTime::Params::Create(*args_)); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const int kThreeMinMs = 3 * 60 * 1000; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::HISTOGRAM, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, kThreeMinMs, 50, params->value); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordLongTimeFunction::RunSync() { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RecordLongTime::Params> params( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordLongTime::Params::Create(*args_)); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const int kOneHourMs = 60 * 60 * 1000; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RecordValue(params->metric_name, base::HISTOGRAM, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, kOneHourMs, 50, params->value); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 197