// 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 "base/strings/string_util.h"
#include "content/common/memory_benchmark_messages.h"
#include "content/renderer/render_thread_impl.h"

#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID))

#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h"

namespace {

const char kMemoryBenchmarkingExtensionName[] = "v8/MemoryBenchmarking";

}

namespace {

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);"
        "};"
        ) {}

  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
      v8::Handle<v8::String> name) OVERRIDE {
    if (name->Equals(v8::String::New("IsHeapProfilerRunning")))
      return v8::FunctionTemplate::New(IsHeapProfilerRunning);
    else if (name->Equals(v8::String::New("HeapProfilerDump")))
      return v8::FunctionTemplate::New(HeapProfilerDump);

    return v8::Handle<v8::FunctionTemplate>();
  }

  static void IsHeapProfilerRunning(
      const v8::FunctionCallbackInfo<v8::Value>& args) {
    args.GetReturnValue().Set(::IsHeapProfilerRunning());
  }

  static void HeapProfilerDump(
      const v8::FunctionCallbackInfo<v8::Value>& args) {
    std::string process_type;
    if (args.Length() && args[0]->IsString())
      process_type = *v8::String::AsciiValue(args[0]);
    std::string reason("benchmarking_extension");
    if (args.Length() > 1 && args[1]->IsString())
      reason = *v8::String::AsciiValue(args[1]);
    if (process_type == "browser") {
      content::RenderThreadImpl::current()->Send(
          new MemoryBenchmarkHostMsg_HeapProfilerDump(reason));
    } else {
      ::HeapProfilerDump(reason.c_str());
    }
  }
};

}  // namespace

namespace content {

v8::Extension* MemoryBenchmarkingExtension::Get() {
  return new MemoryBenchmarkingWrapper();
}

}  // namespace content

#endif  // defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID))
