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