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/activity_log_converter_strategy.h" 6 7 #include "base/logging.h" 8 #include "base/values.h" 9 #include "v8/include/v8.h" 10 11 namespace extensions { 12 13 namespace { 14 15 // Summarize a V8 value. This performs a shallow conversion in all cases, and 16 // returns only a string with a description of the value (e.g., 17 // "[HTMLElement]"). 18 scoped_ptr<base::Value> SummarizeV8Value(v8::Isolate* isolate, 19 v8::Handle<v8::Object> object) { 20 v8::TryCatch try_catch; 21 v8::Isolate::DisallowJavascriptExecutionScope scope( 22 isolate, v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); 23 v8::Local<v8::String> name = v8::String::NewFromUtf8(isolate, "["); 24 if (object->IsFunction()) { 25 name = 26 v8::String::Concat(name, v8::String::NewFromUtf8(isolate, "Function")); 27 v8::Local<v8::Value> fname = 28 v8::Handle<v8::Function>::Cast(object)->GetName(); 29 if (fname->IsString() && v8::Handle<v8::String>::Cast(fname)->Length()) { 30 name = v8::String::Concat(name, v8::String::NewFromUtf8(isolate, " ")); 31 name = v8::String::Concat(name, v8::Handle<v8::String>::Cast(fname)); 32 name = v8::String::Concat(name, v8::String::NewFromUtf8(isolate, "()")); 33 } 34 } else { 35 name = v8::String::Concat(name, object->GetConstructorName()); 36 } 37 name = v8::String::Concat(name, v8::String::NewFromUtf8(isolate, "]")); 38 39 if (try_catch.HasCaught()) { 40 return scoped_ptr<base::Value>( 41 new base::StringValue("[JS Execution Exception]")); 42 } 43 44 return scoped_ptr<base::Value>( 45 new base::StringValue(std::string(*v8::String::Utf8Value(name)))); 46 } 47 48 } // namespace 49 50 ActivityLogConverterStrategy::ActivityLogConverterStrategy() {} 51 52 ActivityLogConverterStrategy::~ActivityLogConverterStrategy() {} 53 54 bool ActivityLogConverterStrategy::FromV8Object( 55 v8::Handle<v8::Object> value, 56 base::Value** out, 57 v8::Isolate* isolate, 58 const FromV8ValueCallback& callback) const { 59 return FromV8Internal(value, out, isolate, callback); 60 } 61 62 bool ActivityLogConverterStrategy::FromV8Array( 63 v8::Handle<v8::Array> value, 64 base::Value** out, 65 v8::Isolate* isolate, 66 const FromV8ValueCallback& callback) const { 67 return FromV8Internal(value, out, isolate, callback); 68 } 69 70 bool ActivityLogConverterStrategy::FromV8Internal( 71 v8::Handle<v8::Object> value, 72 base::Value** out, 73 v8::Isolate* isolate, 74 const FromV8ValueCallback& callback) const { 75 scoped_ptr<base::Value> parsed_value; 76 parsed_value = SummarizeV8Value(isolate, value); 77 *out = parsed_value.release(); 78 79 return true; 80 } 81 82 } // namespace extensions 83