| Index: content/renderer/gpu/gpu_benchmarking_extension.cc | 
| diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc | 
| index e7c61b0602e0c23ad07f07d7eb6bf32bc5458c9a..eeca8c59489f3c9e5ef2f8d2418e6ff9f4ba6ee5 100644 | 
| --- a/content/renderer/gpu/gpu_benchmarking_extension.cc | 
| +++ b/content/renderer/gpu/gpu_benchmarking_extension.cc | 
| @@ -3,14 +3,24 @@ | 
| // found in the LICENSE file. | 
|  | 
| #include "content/renderer/gpu/gpu_benchmarking_extension.h" | 
| + | 
| +#include <string> | 
| + | 
| +#include "base/memory/scoped_vector.h" | 
| +#include "content/public/renderer/render_thread.h" | 
| +#include "content/renderer/all_rendering_benchmarks.h" | 
| +#include "content/renderer/rendering_benchmark.h" | 
| +#include "content/renderer/rendering_benchmark_results.h" | 
| #include "content/renderer/render_view_impl.h" | 
| #include "third_party/WebKit/Source/Platform/chromium/public/WebRenderingStats.h" | 
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebViewBenchmarkSupport.h" | 
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 
| #include "v8/include/v8.h" | 
|  | 
| using WebKit::WebFrame; | 
| +using WebKit::WebPrivatePtr; | 
| +using WebKit::WebViewBenchmarkSupport; | 
| using WebKit::WebRenderingStats; | 
| using WebKit::WebView; | 
|  | 
| @@ -21,6 +31,37 @@ using WebKit::WebView; | 
|  | 
| namespace content { | 
|  | 
| +// Benchmark results object that populates a v8 array. | 
| +class V8BenchmarkResults : public content::RenderingBenchmarkResults { | 
| + public: | 
| +  explicit V8BenchmarkResults() | 
| +    : results_array_(v8::Array::New(0)) { } | 
| +  virtual ~V8BenchmarkResults() {} | 
| + | 
| +  void AddResult(const std::string& benchmark_name, | 
| +                 const std::string& result_name, | 
| +                 const std::string& result_unit, | 
| +                 double result) { | 
| +    v8::Handle<v8::Object> result_object = v8::Object::New(); | 
| +    result_object->Set(v8::String::New("benchmarkName", 13), | 
| +                       v8::String::New(benchmark_name.c_str(), -1)); | 
| +    result_object->Set(v8::String::New("resultName", 10), | 
| +                       v8::String::New(result_name.c_str(), -1)); | 
| +    result_object->Set(v8::String::New("resultUnit", 10), | 
| +                       v8::String::New(result_unit.c_str(), -1)); | 
| +    result_object->Set(v8::String::New("result", 6), v8::Number::New(result)); | 
| + | 
| +    results_array_->Set(results_array_->Length(), result_object); | 
| +  } | 
| + | 
| +  v8::Handle<v8::Array> results_array() { | 
| +    return results_array_; | 
| +  } | 
| + | 
| + private: | 
| +  v8::Handle<v8::Array> results_array_; | 
| +}; | 
| + | 
| class GpuBenchmarkingWrapper : public v8::Extension { | 
| public: | 
| GpuBenchmarkingWrapper() : | 
| @@ -45,6 +86,10 @@ class GpuBenchmarkingWrapper : public v8::Extension { | 
| "  scroll_far = scroll_far || false;" | 
| "  native function BeginSmoothScroll();" | 
| "  return BeginSmoothScroll(false, scroll_far);" | 
| +          "};" | 
| +          "chrome.gpuBenchmarking.runRenderingBenchmarks = function(filter) {" | 
| +          "  native function RunRenderingBenchmarks();" | 
| +          "  return RunRenderingBenchmarks(filter);" | 
| "};") {} | 
|  | 
| virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( | 
| @@ -53,6 +98,8 @@ class GpuBenchmarkingWrapper : public v8::Extension { | 
| return v8::FunctionTemplate::New(GetRenderingStats); | 
| if (name->Equals(v8::String::New("BeginSmoothScroll"))) | 
| return v8::FunctionTemplate::New(BeginSmoothScroll); | 
| +    if (name->Equals(v8::String::New("RunRenderingBenchmarks"))) | 
| +      return v8::FunctionTemplate::New(RunRenderingBenchmarks); | 
|  | 
| return v8::Handle<v8::FunctionTemplate>(); | 
| } | 
| @@ -115,6 +162,56 @@ class GpuBenchmarkingWrapper : public v8::Extension { | 
| render_view_impl->BeginSmoothScroll(scroll_down, scroll_far); | 
| return v8::True(); | 
| } | 
| + | 
| +  static v8::Handle<v8::Value> RunRenderingBenchmarks( | 
| +      const v8::Arguments& args) { | 
| +    // For our name filter, the argument can be undefined or null to run | 
| +    // all benchmarks, or a string for filtering by name. | 
| +    if (!args.Length() || | 
| +        (!args[0]->IsString() && | 
| +         !(args[0]->IsNull() || args[0]->IsUndefined()))) { | 
| +      return v8::Undefined(); | 
| +    } | 
| + | 
| +    std::string name_filter; | 
| +    if (args[0]->IsNull() || args[0]->IsUndefined()) { | 
| +      name_filter = ""; | 
| +    } else { | 
| +      char filter[256]; | 
| +      args[0]->ToString()->WriteAscii(filter, 0, sizeof(filter)-1); | 
| +      name_filter = std::string(filter); | 
| +    } | 
| + | 
| +    WebFrame* web_frame = WebFrame::frameForEnteredContext(); | 
| +    if (!web_frame) | 
| +      return v8::Undefined(); | 
| + | 
| +    WebView* web_view = web_frame->view(); | 
| +    if (!web_view) | 
| +      return v8::Undefined(); | 
| + | 
| +    WebViewBenchmarkSupport* support = web_view->benchmarkSupport(); | 
| +    if (!support) | 
| +      return v8::Undefined(); | 
| + | 
| +    ScopedVector<RenderingBenchmark> benchmarks = AllRenderingBenchmarks(); | 
| + | 
| +    V8BenchmarkResults results; | 
| +    ScopedVector<RenderingBenchmark>::const_iterator it; | 
| +    for (it = benchmarks.begin(); it != benchmarks.end(); it++) { | 
| +      RenderingBenchmark* benchmark = *it; | 
| +      const std::string& name = benchmark->name(); | 
| +      if (name_filter != "" && | 
| +          std::string::npos == name.find(name_filter)) { | 
| +        continue; | 
| +      } | 
| +      benchmark->SetUp(support); | 
| +      benchmark->Run(&results, support); | 
| +      benchmark->TearDown(support); | 
| +    } | 
| + | 
| +    return results.results_array(); | 
| +  } | 
| }; | 
|  | 
| v8::Extension* GpuBenchmarkingExtension::Get() { | 
|  |