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 "content/renderer/memory_benchmarking_extension.h" 6 7#include "content/common/memory_benchmark_messages.h" 8#include "content/renderer/render_thread_impl.h" 9#include "gin/arguments.h" 10#include "gin/handle.h" 11#include "gin/object_template_builder.h" 12#include "third_party/WebKit/public/web/WebFrame.h" 13#include "third_party/WebKit/public/web/WebKit.h" 14 15#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) 16#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" 17#endif 18 19namespace content { 20 21gin::WrapperInfo MemoryBenchmarkingExtension::kWrapperInfo = { 22 gin::kEmbedderNativeGin}; 23 24// static 25void MemoryBenchmarkingExtension::Install(blink::WebFrame* frame) { 26 v8::Isolate* isolate = blink::mainThreadIsolate(); 27 v8::HandleScope handle_scope(isolate); 28 v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); 29 if (context.IsEmpty()) 30 return; 31 32 v8::Context::Scope context_scope(context); 33 gin::Handle<MemoryBenchmarkingExtension> controller = 34 gin::CreateHandle(isolate, new MemoryBenchmarkingExtension()); 35 if (controller.IsEmpty()) 36 return; 37 38 v8::Handle<v8::Object> global = context->Global(); 39 v8::Handle<v8::Object> chrome = 40 global->Get(gin::StringToV8(isolate, "chrome"))->ToObject(); 41 if (chrome.IsEmpty()) { 42 chrome = v8::Object::New(isolate); 43 global->Set(gin::StringToV8(isolate, "chrome"), chrome); 44 } 45 chrome->Set(gin::StringToV8(isolate, "memoryBenchmarking"), 46 controller.ToV8()); 47} 48 49MemoryBenchmarkingExtension::MemoryBenchmarkingExtension() {} 50 51MemoryBenchmarkingExtension::~MemoryBenchmarkingExtension() {} 52 53gin::ObjectTemplateBuilder 54MemoryBenchmarkingExtension::GetObjectTemplateBuilder(v8::Isolate* isolate) { 55 return gin::Wrappable<MemoryBenchmarkingExtension>::GetObjectTemplateBuilder( 56 isolate) 57 .SetMethod("isHeapProfilerRunning", 58 &MemoryBenchmarkingExtension::IsHeapProfilerRunning) 59 .SetMethod("heapProfilerDump", 60 &MemoryBenchmarkingExtension::HeapProfilerDump); 61} 62 63bool MemoryBenchmarkingExtension::IsHeapProfilerRunning() { 64#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) 65 return ::IsHeapProfilerRunning(); 66#else 67 return false; 68#endif 69} 70 71void MemoryBenchmarkingExtension::HeapProfilerDump(gin::Arguments* args) { 72 std::string process_type; 73 std::string reason("benchmarking_extension"); 74 75 if (args->PeekNext()->IsString()) { 76 args->GetNext(&process_type); 77 if (args->PeekNext()->IsString()) 78 args->GetNext(&reason); 79 } 80 81#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID)) 82 if (process_type == "browser") { 83 content::RenderThreadImpl::current()->Send( 84 new MemoryBenchmarkHostMsg_HeapProfilerDump(reason)); 85 } else { 86 ::HeapProfilerDump(reason.c_str()); 87 } 88#endif 89} 90 91} // namespace content 92