• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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]").
SummarizeV8Value(v8::Isolate * isolate,v8::Handle<v8::Object> object)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 
ActivityLogConverterStrategy()50 ActivityLogConverterStrategy::ActivityLogConverterStrategy() {}
51 
~ActivityLogConverterStrategy()52 ActivityLogConverterStrategy::~ActivityLogConverterStrategy() {}
53 
FromV8Object(v8::Handle<v8::Object> value,base::Value ** out,v8::Isolate * isolate,const FromV8ValueCallback & callback) const54 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 
FromV8Array(v8::Handle<v8::Array> value,base::Value ** out,v8::Isolate * isolate,const FromV8ValueCallback & callback) const62 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 
FromV8Internal(v8::Handle<v8::Object> value,base::Value ** out,v8::Isolate * isolate,const FromV8ValueCallback & callback) const70 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