Index: content/renderer/memory_benchmarking_extension.cc |
diff --git a/content/renderer/memory_benchmarking_extension.cc b/content/renderer/memory_benchmarking_extension.cc |
index 50d5dcc436e107195562a792f9341be54e85b55a..b8dd4b479e1575ad3518648a7a508bec17a122fb 100644 |
--- a/content/renderer/memory_benchmarking_extension.cc |
+++ b/content/renderer/memory_benchmarking_extension.cc |
@@ -4,84 +4,85 @@ |
#include "content/renderer/memory_benchmarking_extension.h" |
-#include "base/strings/string_util.h" |
#include "content/common/memory_benchmark_messages.h" |
#include "content/renderer/render_thread_impl.h" |
+#include "gin/arguments.h" |
+#include "gin/handle.h" |
+#include "gin/object_template_builder.h" |
+#include "third_party/WebKit/public/web/WebFrame.h" |
+#include "third_party/WebKit/public/web/WebKit.h" |
#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) |
- |
#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" |
+#endif |
-namespace { |
- |
-const char kMemoryBenchmarkingExtensionName[] = "v8/MemoryBenchmarking"; |
+namespace content { |
+gin::WrapperInfo MemoryBenchmarkingExtension::kWrapperInfo = { |
+ gin::kEmbedderNativeGin}; |
+ |
+// static |
+void MemoryBenchmarkingExtension::Install(blink::WebFrame* frame) { |
+ v8::Isolate* isolate = blink::mainThreadIsolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); |
+ if (context.IsEmpty()) |
+ return; |
+ |
+ v8::Context::Scope context_scope(context); |
+ gin::Handle<MemoryBenchmarkingExtension> controller = |
+ gin::CreateHandle(isolate, new MemoryBenchmarkingExtension()); |
+ v8::Handle<v8::Object> global = context->Global(); |
+ v8::Handle<v8::Object> chrome = |
+ global->Get(gin::StringToV8(isolate, "chrome"))->ToObject(); |
+ if (chrome.IsEmpty()) { |
+ chrome = v8::Object::New(isolate); |
+ global->Set(gin::StringToV8(isolate, "chrome"), chrome); |
+ } |
+ chrome->Set(gin::StringToV8(isolate, "memoryBenchmarking"), |
+ controller.ToV8()); |
} |
-namespace { |
+MemoryBenchmarkingExtension::MemoryBenchmarkingExtension() {} |
-class MemoryBenchmarkingWrapper : public v8::Extension { |
- public: |
- MemoryBenchmarkingWrapper() : |
- v8::Extension(kMemoryBenchmarkingExtensionName, |
- "if (typeof(chrome) == 'undefined') {" |
- " chrome = {};" |
- "};" |
- "if (typeof(chrome.memoryBenchmarking) == 'undefined') {" |
- " chrome.memoryBenchmarking = {};" |
- "};" |
- "chrome.memoryBenchmarking.isHeapProfilerRunning = function() {" |
- " native function IsHeapProfilerRunning();" |
- " return IsHeapProfilerRunning();" |
- "};" |
- "chrome.memoryBenchmarking.heapProfilerDump = " |
- " function(process_type, reason) {" |
- " native function HeapProfilerDump();" |
- " HeapProfilerDump(process_type, reason);" |
- "};" |
- ) {} |
+MemoryBenchmarkingExtension::~MemoryBenchmarkingExtension() {} |
- virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( |
- v8::Isolate* isolate, |
- v8::Handle<v8::String> name) OVERRIDE { |
- if (name->Equals(v8::String::NewFromUtf8(isolate, "IsHeapProfilerRunning"))) |
- return v8::FunctionTemplate::New(isolate, IsHeapProfilerRunning); |
- else if (name->Equals(v8::String::NewFromUtf8(isolate, "HeapProfilerDump"))) |
- return v8::FunctionTemplate::New(isolate, HeapProfilerDump); |
+gin::ObjectTemplateBuilder |
+MemoryBenchmarkingExtension::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
+ return gin::Wrappable<MemoryBenchmarkingExtension>::GetObjectTemplateBuilder( |
+ isolate) |
+ .SetMethod("isHeapProfilerRunning", |
+ &MemoryBenchmarkingExtension::IsHeapProfilerRunning) |
+ .SetMethod("heapProfilerDump", |
+ &MemoryBenchmarkingExtension::HeapProfilerDump); |
+} |
- return v8::Handle<v8::FunctionTemplate>(); |
- } |
+bool MemoryBenchmarkingExtension::IsHeapProfilerRunning() { |
+#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) |
+ return ::IsHeapProfilerRunning(); |
+#else |
+ return false; |
+#endif |
+} |
- static void IsHeapProfilerRunning( |
- const v8::FunctionCallbackInfo<v8::Value>& args) { |
- args.GetReturnValue().Set(::IsHeapProfilerRunning()); |
- } |
+void MemoryBenchmarkingExtension::HeapProfilerDump(gin::Arguments* args) { |
+ std::string process_type; |
+ std::string reason("benchmarking_extension"); |
- static void HeapProfilerDump( |
- const v8::FunctionCallbackInfo<v8::Value>& args) { |
- std::string process_type; |
- if (args.Length() && args[0]->IsString()) |
- process_type = *v8::String::Utf8Value(args[0]); |
- std::string reason("benchmarking_extension"); |
- if (args.Length() > 1 && args[1]->IsString()) |
- reason = *v8::String::Utf8Value(args[1]); |
- if (process_type == "browser") { |
- content::RenderThreadImpl::current()->Send( |
- new MemoryBenchmarkHostMsg_HeapProfilerDump(reason)); |
- } else { |
- ::HeapProfilerDump(reason.c_str()); |
- } |
+ if (args->PeekNext()->IsString()) { |
+ args->GetNext(&process_type); |
+ if (args->PeekNext()->IsString()) |
+ args->GetNext(&reason); |
} |
-}; |
- |
-} // namespace |
- |
-namespace content { |
-v8::Extension* MemoryBenchmarkingExtension::Get() { |
- return new MemoryBenchmarkingWrapper(); |
+#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) |
+ if (process_type == "browser") { |
+ content::RenderThreadImpl::current()->Send( |
+ new MemoryBenchmarkHostMsg_HeapProfilerDump(reason)); |
+ } else { |
+ ::HeapProfilerDump(reason.c_str()); |
+ } |
+#endif |
} |
} // namespace content |
- |
-#endif // defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) |