Home | History | Annotate | Download | only in renderer
      1 // Copyright 2014 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 "extensions/renderer/logging_native_handler.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/strings/stringprintf.h"
      9 
     10 namespace extensions {
     11 
     12 LoggingNativeHandler::LoggingNativeHandler(ScriptContext* context)
     13     : ObjectBackedNativeHandler(context) {
     14   RouteFunction(
     15       "DCHECK",
     16       base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this)));
     17   RouteFunction(
     18       "CHECK",
     19       base::Bind(&LoggingNativeHandler::Check, base::Unretained(this)));
     20   RouteFunction(
     21       "DCHECK_IS_ON",
     22       base::Bind(&LoggingNativeHandler::DcheckIsOn, base::Unretained(this)));
     23   RouteFunction("LOG",
     24                 base::Bind(&LoggingNativeHandler::Log, base::Unretained(this)));
     25   RouteFunction(
     26       "WARNING",
     27       base::Bind(&LoggingNativeHandler::Warning, base::Unretained(this)));
     28 }
     29 
     30 LoggingNativeHandler::~LoggingNativeHandler() {}
     31 
     32 void LoggingNativeHandler::Check(
     33     const v8::FunctionCallbackInfo<v8::Value>& args) {
     34   bool check_value;
     35   std::string error_message;
     36   ParseArgs(args, &check_value, &error_message);
     37   CHECK(check_value) << error_message;
     38 }
     39 
     40 void LoggingNativeHandler::Dcheck(
     41     const v8::FunctionCallbackInfo<v8::Value>& args) {
     42   bool check_value;
     43   std::string error_message;
     44   ParseArgs(args, &check_value, &error_message);
     45   DCHECK(check_value) << error_message;
     46 }
     47 
     48 void LoggingNativeHandler::DcheckIsOn(
     49     const v8::FunctionCallbackInfo<v8::Value>& args) {
     50   args.GetReturnValue().Set(DCHECK_IS_ON);
     51 }
     52 
     53 void LoggingNativeHandler::Log(
     54     const v8::FunctionCallbackInfo<v8::Value>& args) {
     55   CHECK_EQ(1, args.Length());
     56   LOG(INFO) << *v8::String::Utf8Value(args[0]);
     57 }
     58 
     59 void LoggingNativeHandler::Warning(
     60     const v8::FunctionCallbackInfo<v8::Value>& args) {
     61   CHECK_EQ(1, args.Length());
     62   LOG(WARNING) << *v8::String::Utf8Value(args[0]);
     63 }
     64 
     65 void LoggingNativeHandler::ParseArgs(
     66     const v8::FunctionCallbackInfo<v8::Value>& args,
     67     bool* check_value,
     68     std::string* error_message) {
     69   CHECK_LE(args.Length(), 2);
     70   *check_value = args[0]->BooleanValue();
     71   if (args.Length() == 2) {
     72     *error_message = "Error: " + std::string(*v8::String::Utf8Value(args[1]));
     73   }
     74 
     75   v8::Handle<v8::StackTrace> stack_trace =
     76       v8::StackTrace::CurrentStackTrace(args.GetIsolate(), 10);
     77   if (stack_trace.IsEmpty() || stack_trace->GetFrameCount() <= 0) {
     78     *error_message += "\n    <no stack trace>";
     79   } else {
     80     for (size_t i = 0; i < (size_t)stack_trace->GetFrameCount(); ++i) {
     81       v8::Handle<v8::StackFrame> frame = stack_trace->GetFrame(i);
     82       CHECK(!frame.IsEmpty());
     83       *error_message += base::StringPrintf(
     84           "\n    at %s (%s:%d:%d)",
     85           ToStringOrDefault(frame->GetFunctionName(), "<anonymous>").c_str(),
     86           ToStringOrDefault(frame->GetScriptName(), "<anonymous>").c_str(),
     87           frame->GetLineNumber(),
     88           frame->GetColumn());
     89     }
     90   }
     91 }
     92 
     93 std::string LoggingNativeHandler::ToStringOrDefault(
     94     const v8::Handle<v8::String>& v8_string,
     95     const std::string& dflt) {
     96   if (v8_string.IsEmpty())
     97     return dflt;
     98   std::string ascii_value = *v8::String::Utf8Value(v8_string);
     99   return ascii_value.empty() ? dflt : ascii_value;
    100 }
    101 
    102 }  // namespace extensions
    103