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