From 253a0b2547c98d4c5c150d1b9a10f00759bf7b2a Mon Sep 17 00:00:00 2001 From: Darin Dimitrov Date: Thu, 10 May 2018 19:06:20 +0300 Subject: [PATCH] Add backendNodeId property in the ChildNodeInserted callback --- .../main/cpp/DOMDomainCallbackHandlers.cpp | 6 +- .../src/inspector/v8-dom-agent-impl.cpp | 78 ++++++++++--------- .../src/inspector/v8-dom-agent-impl.h | 1 + 3 files changed, 48 insertions(+), 37 deletions(-) diff --git a/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp b/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp index 5a8361c0f..ec075f30c 100644 --- a/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp +++ b/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp @@ -39,7 +39,10 @@ void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCall auto lastId = args[1]->ToNumber(isolate); auto node = args[2]->ToString(isolate); - auto nodeJson = protocol::StringUtil::parseJSON(v8_inspector::toProtocolString(node)); + auto resultString = V8DOMAgentImpl::AddBackendNodeIdProperty(isolate, node); + auto resultUtf16Data = resultString.data(); + + auto nodeJson = protocol::StringUtil::parseJSON(String16((const uint16_t*) resultUtf16Data)); protocol::ErrorSupport errorSupport; auto domNode = protocol::DOM::Node::fromValue(nodeJson.get(), &errorSupport); @@ -48,6 +51,7 @@ void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCall if (!errorSupportString.empty()) { auto errorMessage = "Error while parsing debug `DOM Node` object. "; DEBUG_WRITE_FORCE("%s Error: %s", errorMessage, errorSupportString.c_str()); + return; } domAgentInstance->m_frontend.childNodeInserted(parentId->Int32Value(), lastId->Int32Value(), std::move(domNode)); diff --git a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp b/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp index 99ad95f4e..0d655323e 100644 --- a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp +++ b/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp @@ -95,42 +95,7 @@ DispatchResponse V8DOMAgentImpl::getDocument(Maybe in_depth, Maybe in if (!outResult->ToObject()->Has(context, ArgConverter::ConvertToV8String(isolate, "backendNodeId")).FromMaybe(false)) { // Using an older version of the modules which doesn't set the backendNodeId required property - auto scriptSource = - "(function () {" - " function addBackendNodeId(node) {" - " if (!node.backendNodeId) {" - " node.backendNodeId = 0;" - " }" - " if (node.children) {" - " for (var i = 0; i < node.children.length; i++) {" - " addBackendNodeId(node.children[i]);" - " }" - " }" - " }" - " return function(stringifiedNode) {" - " try {" - " const node = JSON.parse(stringifiedNode);" - " addBackendNodeId(node);" - " return JSON.stringify(node);" - " } catch (e) {" - " return stringifiedNode;" - " }" - " }" - "})()"; - - auto source = ArgConverter::ConvertToV8String(isolate, scriptSource); - v8::Local script; - v8::Script::Compile(context, source).ToLocal(&script); - - v8::Local result; - script->Run(context).ToLocal(&result); - auto addBackendNodeIdFunction = result.As(); - - v8::Local args[] = { outResult }; - v8::Local scriptResult; - addBackendNodeIdFunction->Call(context, context->Global(), 1, args).ToLocal(&scriptResult); - - resultString = ArgConverter::ConvertToUtf16String(scriptResult->ToString()); + resultString = AddBackendNodeIdProperty(isolate, outResult); } auto resultUtf16Data = resultString.data(); @@ -363,5 +328,46 @@ DispatchResponse V8DOMAgentImpl::getFrameOwner(const String& in_frameId, int* ou return utils::Common::protocolCommandNotSupportedDispatchResponse(); } +std::u16string V8DOMAgentImpl::AddBackendNodeIdProperty(v8::Isolate* isolate, v8::Local jsonInput) { + auto scriptSource = + "(function () {" + " function addBackendNodeId(node) {" + " if (!node.backendNodeId) {" + " node.backendNodeId = 0;" + " }" + " if (node.children) {" + " for (var i = 0; i < node.children.length; i++) {" + " addBackendNodeId(node.children[i]);" + " }" + " }" + " }" + " return function(stringifiedNode) {" + " try {" + " const node = JSON.parse(stringifiedNode);" + " addBackendNodeId(node);" + " return JSON.stringify(node);" + " } catch (e) {" + " return stringifiedNode;" + " }" + " }" + "})()"; + + auto source = ArgConverter::ConvertToV8String(isolate, scriptSource); + v8::Local script; + auto context = isolate->GetCurrentContext(); + v8::Script::Compile(context, source).ToLocal(&script); + + v8::Local result; + script->Run(context).ToLocal(&result); + auto addBackendNodeIdFunction = result.As(); + + v8::Local funcArguments[] = { jsonInput }; + v8::Local scriptResult; + addBackendNodeIdFunction->Call(context, context->Global(), 1, funcArguments).ToLocal(&scriptResult); + + auto resultString = ArgConverter::ConvertToUtf16String(scriptResult->ToString()); + return resultString; +} + V8DOMAgentImpl* V8DOMAgentImpl::Instance = 0; } diff --git a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h b/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h index 6c5593f72..a08a545ae 100644 --- a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h +++ b/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h @@ -69,6 +69,7 @@ class V8DOMAgentImpl : public protocol::DOM::Backend { static V8DOMAgentImpl* Instance; protocol::DOM::Frontend m_frontend; + static std::u16string AddBackendNodeIdProperty(v8::Isolate* isolate, v8::Local jsonInput); private: V8InspectorSessionImpl* m_session; protocol::DictionaryValue* m_state;