Chromium Code Reviews| Index: third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp |
| diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp |
| index 6ff055bc552c07f3e38d545c7eea0b865e35c07f..b15db44c21703288b4e6047b7c00da5fb2eee47f 100644 |
| --- a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp |
| +++ b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp |
| @@ -45,7 +45,6 @@ v8::Local<v8::Object> V8InjectedScriptHost::create(v8::Local<v8::Context> contex |
| v8::Local<v8::External> debuggerExternal = v8::External::New(isolate, debugger); |
| setFunctionProperty(context, injectedScriptHost, "internalConstructorName", V8InjectedScriptHost::internalConstructorNameCallback, debuggerExternal); |
| setFunctionProperty(context, injectedScriptHost, "formatAccessorsAsProperties", V8InjectedScriptHost::formatAccessorsAsProperties, debuggerExternal); |
| - setFunctionProperty(context, injectedScriptHost, "isTypedArray", V8InjectedScriptHost::isTypedArrayCallback, debuggerExternal); |
| setFunctionProperty(context, injectedScriptHost, "subtype", V8InjectedScriptHost::subtypeCallback, debuggerExternal); |
| setFunctionProperty(context, injectedScriptHost, "collectionEntries", V8InjectedScriptHost::collectionEntriesCallback, debuggerExternal); |
| setFunctionProperty(context, injectedScriptHost, "getInternalProperties", V8InjectedScriptHost::getInternalPropertiesCallback, debuggerExternal); |
| @@ -54,6 +53,8 @@ v8::Local<v8::Object> V8InjectedScriptHost::create(v8::Local<v8::Context> contex |
| setFunctionProperty(context, injectedScriptHost, "setNonEnumProperty", V8InjectedScriptHost::setNonEnumPropertyCallback, debuggerExternal); |
| setFunctionProperty(context, injectedScriptHost, "bind", V8InjectedScriptHost::bindCallback, debuggerExternal); |
| setFunctionProperty(context, injectedScriptHost, "proxyTargetValue", V8InjectedScriptHost::proxyTargetValueCallback, debuggerExternal); |
| + setFunctionProperty(context, injectedScriptHost, "ownPropertyNames", V8InjectedScriptHost::ownPropertyNamesCallback, debuggerExternal); |
| + setFunctionProperty(context, injectedScriptHost, "prototype", V8InjectedScriptHost::prototypeCallback, debuggerExternal); |
| return injectedScriptHost; |
| } |
| @@ -74,14 +75,6 @@ void V8InjectedScriptHost::formatAccessorsAsProperties(const v8::FunctionCallbac |
| info.GetReturnValue().Set(unwrapDebugger(info)->client()->formatAccessorsAsProperties(info[0])); |
| } |
| -void V8InjectedScriptHost::isTypedArrayCallback(const v8::FunctionCallbackInfo<v8::Value>& info) |
| -{ |
| - if (info.Length() < 1) |
| - return; |
| - |
| - info.GetReturnValue().Set(info[0]->IsTypedArray()); |
| -} |
| - |
| void V8InjectedScriptHost::subtypeCallback(const v8::FunctionCallbackInfo<v8::Value>& info) |
| { |
| if (info.Length() < 1) |
| @@ -270,6 +263,71 @@ void V8InjectedScriptHost::proxyTargetValueCallback(const v8::FunctionCallbackIn |
| info.GetReturnValue().Set(target); |
| } |
| +static uint32_t objectLength(v8::Local<v8::Object> object) |
| +{ |
| + if (object->IsString()) { |
|
pfeldman
2016/05/04 23:01:48
We only use length to detect array, you should not
|
| + int length = object.As<v8::String>()->Length(); |
| + return length > 0 ? static_cast<uint32_t>(object.As<v8::String>()->Length()) : 0; |
| + } |
| + if (object->IsArray()) |
| + return object.As<v8::Array>()->Length(); |
| + if (object->IsTypedArray()) |
| + return object.As<v8::TypedArray>()->Length(); |
| + return 0; |
| +} |
| + |
| +void V8InjectedScriptHost::ownPropertyNamesCallback(const v8::FunctionCallbackInfo<v8::Value>& info) |
| +{ |
| + ASSERT(info.Length() > 0 && info[0]->IsObject()); |
| + |
| + v8::Isolate* isolate = info.GetIsolate(); |
| + v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| + info.GetReturnValue().Set(v8::Array::New(isolate)); |
| + v8::Local<v8::Object> object = info[0].As<v8::Object>(); |
| + |
| + if (object->IsProxy()) |
| + return; |
| + |
| + size_t length = objectLength(object); |
| + const int kMaxIndexPropertyCount = 9999; |
| + if (length > kMaxIndexPropertyCount) { |
| + v8::Local<v8::Array> indexes = v8::Array::New(isolate, kMaxIndexPropertyCount); |
| + for (size_t i = 0; i < kMaxIndexPropertyCount; ++i) { |
| + if (!indexes->Set(context, i, v8::Integer::NewFromUnsigned(isolate, i)).FromMaybe(false)) |
| + return; |
| + } |
| + info.GetReturnValue().Set(indexes); |
| + return; |
| + } |
| + |
| + v8::PropertyFilter filters[] = { |
| + static_cast<v8::PropertyFilter>(v8::PropertyFilter::ONLY_ENUMERABLE | v8::PropertyFilter::SKIP_SYMBOLS), |
| + static_cast<v8::PropertyFilter>(v8::PropertyFilter::ALL_PROPERTIES | v8::PropertyFilter::SKIP_SYMBOLS), |
| + v8::PropertyFilter::ALL_PROPERTIES |
| + }; |
| + |
| + v8::Local<v8::Set> output = v8::Set::New(isolate); |
| + for (size_t i = 0; i < WTF_ARRAY_LENGTH(filters); ++i) { |
| + v8::Local<v8::Array> properties; |
| + if (!object->GetOwnPropertyNames(context, filters[i]).ToLocal(&properties)) |
| + return; |
| + for (size_t i = 0; i < properties->Length(); ++i) { |
| + v8::Local<v8::Value> value; |
| + if (!properties->Get(context, i).ToLocal(&value)) |
| + return; |
| + if (!output->Add(context, value).ToLocal(&output)) |
| + return; |
| + } |
| + } |
| + info.GetReturnValue().Set(output->AsArray()); |
| +} |
| + |
| +void V8InjectedScriptHost::prototypeCallback(const v8::FunctionCallbackInfo<v8::Value>& info) |
| +{ |
| + ASSERT(info.Length() > 0 && info[0]->IsObject()); |
| + info.GetReturnValue().Set(info[0].As<v8::Object>()->GetPrototype()); |
| +} |
| + |
| v8::Local<v8::Private> V8Debugger::scopeExtensionPrivate(v8::Isolate* isolate) |
| { |
| return v8::Private::ForApi(isolate, toV8StringInternalized(isolate, "V8Debugger#scopeExtension")); |