Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / extensions / renderer / activity_log_converter_strategy.cc
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