// Copyright 2014 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 "extensions/renderer/process_info_native_handler.h"

#include "base/bind.h"
#include "base/command_line.h"
#include "extensions/renderer/script_context.h"

namespace extensions {

ProcessInfoNativeHandler::ProcessInfoNativeHandler(
    ScriptContext* context,
    const std::string& extension_id,
    const std::string& context_type,
    bool is_incognito_context,
    bool is_component_extension,
    int manifest_version,
    bool send_request_disabled)
    : ObjectBackedNativeHandler(context),
      extension_id_(extension_id),
      context_type_(context_type),
      is_incognito_context_(is_incognito_context),
      is_component_extension_(is_component_extension),
      manifest_version_(manifest_version),
      send_request_disabled_(send_request_disabled) {
  RouteFunction("GetExtensionId",
                base::Bind(&ProcessInfoNativeHandler::GetExtensionId,
                           base::Unretained(this)));
  RouteFunction("GetContextType",
                base::Bind(&ProcessInfoNativeHandler::GetContextType,
                           base::Unretained(this)));
  RouteFunction("InIncognitoContext",
                base::Bind(&ProcessInfoNativeHandler::InIncognitoContext,
                           base::Unretained(this)));
  RouteFunction("IsComponentExtension",
                base::Bind(&ProcessInfoNativeHandler::IsComponentExtension,
                           base::Unretained(this)));
  RouteFunction("GetManifestVersion",
                base::Bind(&ProcessInfoNativeHandler::GetManifestVersion,
                           base::Unretained(this)));
  RouteFunction("IsSendRequestDisabled",
                base::Bind(&ProcessInfoNativeHandler::IsSendRequestDisabled,
                           base::Unretained(this)));
  RouteFunction(
      "HasSwitch",
      base::Bind(&ProcessInfoNativeHandler::HasSwitch, base::Unretained(this)));
}

void ProcessInfoNativeHandler::GetExtensionId(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  args.GetReturnValue().Set(
      v8::String::NewFromUtf8(args.GetIsolate(), extension_id_.c_str()));
}

void ProcessInfoNativeHandler::GetContextType(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  args.GetReturnValue().Set(
      v8::String::NewFromUtf8(args.GetIsolate(), context_type_.c_str()));
}

void ProcessInfoNativeHandler::InIncognitoContext(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  args.GetReturnValue().Set(is_incognito_context_);
}

void ProcessInfoNativeHandler::IsComponentExtension(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  args.GetReturnValue().Set(is_component_extension_);
}

void ProcessInfoNativeHandler::GetManifestVersion(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  args.GetReturnValue().Set(static_cast<int32_t>(manifest_version_));
}

void ProcessInfoNativeHandler::IsSendRequestDisabled(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  if (send_request_disabled_) {
    args.GetReturnValue().Set(v8::String::NewFromUtf8(
        args.GetIsolate(),
        "sendRequest and onRequest are obsolete."
        " Please use sendMessage and onMessage instead."));
  }
}

void ProcessInfoNativeHandler::HasSwitch(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  CHECK(args.Length() == 1 && args[0]->IsString());
  bool has_switch = base::CommandLine::ForCurrentProcess()->HasSwitch(
      *v8::String::Utf8Value(args[0]));
  args.GetReturnValue().Set(v8::Boolean::New(args.GetIsolate(), has_switch));
}

}  // namespace extensions
