| 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() {
 | 
| 
 |