1// Copyright (c) 2013 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 "chrome/renderer/net_benchmarking_extension.h"
6
7#include "chrome/common/benchmarking_messages.h"
8#include "content/public/renderer/render_thread.h"
9#include "third_party/WebKit/public/web/WebCache.h"
10#include "v8/include/v8.h"
11
12using blink::WebCache;
13
14const char kNetBenchmarkingExtensionName[] = "v8/NetBenchmarking";
15
16namespace extensions_v8 {
17
18class NetBenchmarkingWrapper : public v8::Extension {
19 public:
20  NetBenchmarkingWrapper() :
21      v8::Extension(kNetBenchmarkingExtensionName,
22        "if (typeof(chrome) == 'undefined') {"
23        "  chrome = {};"
24        "};"
25        "if (typeof(chrome.benchmarking) == 'undefined') {"
26        "  chrome.benchmarking = {};"
27        "};"
28        "chrome.benchmarking.clearCache = function() {"
29        "  native function ClearCache();"
30        "  ClearCache();"
31        "};"
32        "chrome.benchmarking.clearHostResolverCache = function() {"
33        "  native function ClearHostResolverCache();"
34        "  ClearHostResolverCache();"
35        "};"
36        "chrome.benchmarking.clearPredictorCache = function() {"
37        "  native function ClearPredictorCache();"
38        "  ClearPredictorCache();"
39        "};"
40        "chrome.benchmarking.closeConnections = function() {"
41        "  native function CloseConnections();"
42        "  CloseConnections();"
43        "};"
44        ) {}
45
46  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
47      v8::Isolate* isolate,
48      v8::Handle<v8::String> name) OVERRIDE {
49    if (name->Equals(v8::String::NewFromUtf8(isolate, "ClearCache"))) {
50      return v8::FunctionTemplate::New(isolate, ClearCache);
51    } else if (name->Equals(v8::String::NewFromUtf8(
52                   isolate, "ClearHostResolverCache"))) {
53      return v8::FunctionTemplate::New(isolate, ClearHostResolverCache);
54    } else if (name->Equals(
55                   v8::String::NewFromUtf8(isolate, "ClearPredictorCache"))) {
56      return v8::FunctionTemplate::New(isolate, ClearPredictorCache);
57    } else if (name->Equals(
58                   v8::String::NewFromUtf8(isolate, "CloseConnections"))) {
59      return v8::FunctionTemplate::New(isolate, CloseConnections);
60    }
61
62    return v8::Handle<v8::FunctionTemplate>();
63  }
64
65  static void ClearCache(const v8::FunctionCallbackInfo<v8::Value>& args) {
66    int rv;
67    content::RenderThread::Get()->Send(new ChromeViewHostMsg_ClearCache(&rv));
68    WebCache::clear();
69  }
70
71  static void ClearHostResolverCache(
72      const v8::FunctionCallbackInfo<v8::Value>& args) {
73    int rv;
74    content::RenderThread::Get()->Send(
75        new ChromeViewHostMsg_ClearHostResolverCache(&rv));
76  }
77
78  static void ClearPredictorCache(
79      const v8::FunctionCallbackInfo<v8::Value>& args) {
80    int rv;
81    content::RenderThread::Get()->Send(
82        new ChromeViewHostMsg_ClearPredictorCache(&rv));
83  }
84
85  static void CloseConnections(
86      const v8::FunctionCallbackInfo<v8::Value>& args) {
87    content::RenderThread::Get()->Send(
88        new ChromeViewHostMsg_CloseCurrentConnections());
89  }
90};
91
92v8::Extension* NetBenchmarkingExtension::Get() {
93  return new NetBenchmarkingWrapper();
94}
95
96}  // namespace extensions_v8
97