// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/renderer/memory_benchmarking_extension.h"

#include "content/common/memory_benchmark_messages.h"
#include "content/renderer/chrome_object_extensions_utils.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 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());
  if (controller.IsEmpty())
    return;

  v8::Handle<v8::Object> chrome = GetOrCreateChromeObject(isolate,
                                                          context->Global());
  chrome->Set(gin::StringToV8(isolate, "memoryBenchmarking"),
              controller.ToV8());
}

MemoryBenchmarkingExtension::MemoryBenchmarkingExtension() {}

MemoryBenchmarkingExtension::~MemoryBenchmarkingExtension() {}

gin::ObjectTemplateBuilder
MemoryBenchmarkingExtension::GetObjectTemplateBuilder(v8::Isolate* isolate) {
  return gin::Wrappable<MemoryBenchmarkingExtension>::GetObjectTemplateBuilder(
             isolate)
      .SetMethod("isHeapProfilerRunning",
                 &MemoryBenchmarkingExtension::IsHeapProfilerRunning)
      .SetMethod("heapProfilerDump",
                 &MemoryBenchmarkingExtension::HeapProfilerDump);
}

bool MemoryBenchmarkingExtension::IsHeapProfilerRunning() {
#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID))
  return ::IsHeapProfilerRunning();
#else
  return false;
#endif
}

void MemoryBenchmarkingExtension::HeapProfilerDump(gin::Arguments* args) {
  std::string process_type;
  std::string reason("benchmarking_extension");

  if (args->PeekNext()->IsString()) {
    args->GetNext(&process_type);
    if (args->PeekNext()->IsString())
      args->GetNext(&reason);
  }

#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
