std::unique_ptr<protocol::Runtime::ExceptionDetails> InjectedScript::createExceptionDetails(v8::Local<v8::Message> message) { std::unique_ptr<protocol::Runtime::ExceptionDetails> exceptionDetailsObject = protocol::Runtime::ExceptionDetails::create() .setText(toProtocolString(message->Get())) .setScriptId(String16::fromInteger(message->GetScriptOrigin().ScriptID()->Value())) .setLineNumber(message->GetLineNumber(m_context->context()).FromMaybe(1) - 1) .setColumnNumber(message->GetStartColumn(m_context->context()).FromMaybe(0)) .build(); v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace(); if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) exceptionDetailsObject->setStackTrace(m_context->inspector()->debugger()->createStackTrace(stackTrace)->buildInspectorObjectImpl()); return exceptionDetailsObject; }
std::unique_ptr<protocol::Value> toProtocolValue(v8::Local<v8::Context> context, v8::Local<v8::Value> value, int maxDepth) { if (value.IsEmpty()) { NOTREACHED(); return nullptr; } if (!maxDepth) return nullptr; maxDepth--; if (value->IsNull() || value->IsUndefined()) return protocol::Value::null(); if (value->IsBoolean()) return protocol::FundamentalValue::create(value.As<v8::Boolean>()->Value()); if (value->IsNumber()) return protocol::FundamentalValue::create(value.As<v8::Number>()->Value()); if (value->IsString()) return protocol::StringValue::create(toProtocolString(value.As<v8::String>())); if (value->IsArray()) { v8::Local<v8::Array> array = value.As<v8::Array>(); std::unique_ptr<protocol::ListValue> inspectorArray = protocol::ListValue::create(); uint32_t length = array->Length(); for (uint32_t i = 0; i < length; i++) { v8::Local<v8::Value> value; if (!array->Get(context, i).ToLocal(&value)) return nullptr; std::unique_ptr<protocol::Value> element = toProtocolValue(context, value, maxDepth); if (!element) return nullptr; inspectorArray->pushValue(std::move(element)); } return std::move(inspectorArray); } if (value->IsObject()) { std::unique_ptr<protocol::DictionaryValue> jsonObject = protocol::DictionaryValue::create(); v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); v8::Local<v8::Array> propertyNames; if (!object->GetPropertyNames(context).ToLocal(&propertyNames)) return nullptr; uint32_t length = propertyNames->Length(); for (uint32_t i = 0; i < length; i++) { v8::Local<v8::Value> name; if (!propertyNames->Get(context, i).ToLocal(&name)) return nullptr; // FIXME(yurys): v8::Object should support GetOwnPropertyNames if (name->IsString()) { v8::Maybe<bool> hasRealNamedProperty = object->HasRealNamedProperty(context, v8::Local<v8::String>::Cast(name)); if (!hasRealNamedProperty.IsJust() || !hasRealNamedProperty.FromJust()) continue; } v8::Local<v8::String> propertyName; if (!name->ToString(context).ToLocal(&propertyName)) continue; v8::Local<v8::Value> property; if (!object->Get(context, name).ToLocal(&property)) return nullptr; std::unique_ptr<protocol::Value> propertyValue = toProtocolValue(context, property, maxDepth); if (!propertyValue) return nullptr; jsonObject->setValue(toProtocolString(propertyName), std::move(propertyValue)); } return std::move(jsonObject); } NOTREACHED(); return nullptr; }
String16 toProtocolStringWithTypeCheck(v8::Local<v8::Value> value) { if (value.IsEmpty() || !value->IsString()) return String16(); return toProtocolString(value.As<v8::String>()); }
void V8DebuggerScript::setSource(v8::Isolate* isolate, v8::Local<v8::String> source) { m_source.Reset(isolate, source); m_hash = calculateHash(toProtocolString(source)); }