1 // Copyright 2013 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/renderer/net_benchmarking_extension.h"
7 #include "base/no_destructor.h"
8 #include "chrome/common/net_benchmarking.mojom.h"
9 #include "content/public/renderer/render_thread.h"
10 #include "mojo/public/cpp/bindings/remote.h"
11 #include "third_party/blink/public/platform/web_cache.h"
12 #include "v8/include/v8-extension.h"
13 #include "v8/include/v8-primitive.h"
14 #include "v8/include/v8-template.h"
16 using blink::WebCache;
18 const char kNetBenchmarkingExtensionName[] = "v8/NetBenchmarking";
20 namespace extensions_v8 {
22 class NetBenchmarkingWrapper : public v8::Extension {
24 NetBenchmarkingWrapper() :
25 v8::Extension(kNetBenchmarkingExtensionName,
26 "if (typeof(chrome) == 'undefined') {"
29 "if (typeof(chrome.benchmarking) == 'undefined') {"
30 " chrome.benchmarking = {};"
32 "chrome.benchmarking.clearCache = function() {"
33 " native function ClearCache();"
36 "chrome.benchmarking.clearHostResolverCache = function() {"
37 " native function ClearHostResolverCache();"
38 " ClearHostResolverCache();"
40 "chrome.benchmarking.clearPredictorCache = function() {"
41 " native function ClearPredictorCache();"
42 " ClearPredictorCache();"
44 "chrome.benchmarking.closeConnections = function() {"
45 " native function CloseConnections();"
46 " CloseConnections();"
50 v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate(
52 v8::Local<v8::String> name) override {
53 if (name->StringEquals(
54 v8::String::NewFromUtf8(isolate, "ClearCache",
55 v8::NewStringType::kInternalized)
57 return v8::FunctionTemplate::New(isolate, ClearCache);
58 } else if (name->StringEquals(
59 v8::String::NewFromUtf8(isolate, "ClearHostResolverCache",
60 v8::NewStringType::kInternalized)
62 return v8::FunctionTemplate::New(isolate, ClearHostResolverCache);
63 } else if (name->StringEquals(
64 v8::String::NewFromUtf8(isolate, "ClearPredictorCache",
65 v8::NewStringType::kInternalized)
67 return v8::FunctionTemplate::New(isolate, ClearPredictorCache);
68 } else if (name->StringEquals(
69 v8::String::NewFromUtf8(isolate, "CloseConnections",
70 v8::NewStringType::kInternalized)
72 return v8::FunctionTemplate::New(isolate, CloseConnections);
75 return v8::Local<v8::FunctionTemplate>();
78 static chrome::mojom::NetBenchmarking& GetNetBenchmarking() {
79 static base::NoDestructor<mojo::Remote<chrome::mojom::NetBenchmarking>>
80 net_benchmarking(ConnectToBrowser());
81 return **net_benchmarking;
84 static mojo::Remote<chrome::mojom::NetBenchmarking> ConnectToBrowser() {
85 mojo::Remote<chrome::mojom::NetBenchmarking> net_benchmarking;
86 content::RenderThread::Get()->BindHostReceiver(
87 net_benchmarking.BindNewPipeAndPassReceiver());
88 return net_benchmarking;
91 static void ClearCache(const v8::FunctionCallbackInfo<v8::Value>& args) {
92 GetNetBenchmarking().ClearCache();
96 static void ClearHostResolverCache(
97 const v8::FunctionCallbackInfo<v8::Value>& args) {
98 GetNetBenchmarking().ClearHostResolverCache();
101 static void ClearPredictorCache(
102 const v8::FunctionCallbackInfo<v8::Value>& args) {
103 GetNetBenchmarking().ClearPredictorCache();
106 static void CloseConnections(
107 const v8::FunctionCallbackInfo<v8::Value>& args) {
108 GetNetBenchmarking().CloseCurrentConnections();
112 std::unique_ptr<v8::Extension> NetBenchmarkingExtension::Get() {
113 return std::make_unique<NetBenchmarkingWrapper>();
116 } // namespace extensions_v8