diff --git a/bridge/bindings/jsc/DOM/text_node.cc b/bridge/bindings/jsc/DOM/text_node.cc index 5203d03864..bc77a8b194 100644 --- a/bridge/bindings/jsc/DOM/text_node.cc +++ b/bridge/bindings/jsc/DOM/text_node.cc @@ -9,7 +9,7 @@ namespace kraken::binding::jsc { void bindTextNode(std::unique_ptr &context) { auto textNode = JSTextNode::instance(context.get()); - JSC_GLOBAL_SET_PROPERTY(context, "TextNode", textNode->classObject); + JSC_GLOBAL_SET_PROPERTY(context, "Text", textNode->classObject); } std::unordered_map JSTextNode::instanceMap{}; @@ -24,7 +24,7 @@ JSTextNode::~JSTextNode() { instanceMap.erase(context); } -JSTextNode::JSTextNode(JSContext *context) : JSNode(context, "TextNode") {} +JSTextNode::JSTextNode(JSContext *context) : JSNode(context, "Text") {} JSObjectRef JSTextNode::instanceConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef *arguments, JSValueRef *exception) { @@ -53,6 +53,7 @@ JSValueRef JSTextNode::TextNodeInstance::getProperty(std::string &name, JSValueR auto property = propertyMap[name]; switch (property) { + case TextNodeProperty::nodeValue: case TextNodeProperty::textContent: case TextNodeProperty::data: { return m_data.makeString(); @@ -65,7 +66,7 @@ JSValueRef JSTextNode::TextNodeInstance::getProperty(std::string &name, JSValueR } bool JSTextNode::TextNodeInstance::setProperty(std::string &name, JSValueRef value, JSValueRef *exception) { - if (name == "data") { + if (name == "data" || name == "nodeValue") { JSStringRef data = JSValueToStringCopy(_hostClass->ctx, value, exception); m_data.setString(data); diff --git a/bridge/bindings/jsc/DOM/text_node.h b/bridge/bindings/jsc/DOM/text_node.h index c823a83cb3..40697e4e5c 100644 --- a/bridge/bindings/jsc/DOM/text_node.h +++ b/bridge/bindings/jsc/DOM/text_node.h @@ -25,7 +25,7 @@ class JSTextNode : public JSNode { class TextNodeInstance : public NodeInstance { public: - DEFINE_OBJECT_PROPERTY(TextNode, 3, data, textContent, nodeName) + DEFINE_OBJECT_PROPERTY(TextNode, 4, data, textContent, nodeValue, nodeName) TextNodeInstance() = delete; ~TextNodeInstance(); diff --git a/integration_tests/snapshots/dom/nodes/textNode.ts.6a131c581.png b/integration_tests/snapshots/dom/nodes/textNode.ts.6a131c581.png new file mode 100644 index 0000000000..bafa7751a9 Binary files /dev/null and b/integration_tests/snapshots/dom/nodes/textNode.ts.6a131c581.png differ diff --git a/integration_tests/specs/dom/nodes/textNode.ts b/integration_tests/specs/dom/nodes/textNode.ts index 425301c403..bb00bdec47 100644 --- a/integration_tests/specs/dom/nodes/textNode.ts +++ b/integration_tests/specs/dom/nodes/textNode.ts @@ -108,4 +108,16 @@ describe('TextNode', () => { await snapshot(); }); + + describe('nodeValue', () => { + it('assign nodeValue to update.', async () => { + const text = document.createTextNode(''); + document.body.appendChild(text); + + const TEXT = 'HELLO WORLD!'; + text.nodeValue = TEXT; + await snapshot(); + expect(text.nodeValue).toEqual(TEXT); + }); + }); }); diff --git a/kraken/example/lib/main.dart b/kraken/example/lib/main.dart index 0a600f0e7b..37fee36556 100644 --- a/kraken/example/lib/main.dart +++ b/kraken/example/lib/main.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:kraken/kraken.dart'; -import 'dart:ui'; import 'package:kraken_websocket/kraken_websocket.dart'; +import 'dart:ui'; void main() { KrakenWebsocket.initialize(); diff --git a/kraken/lib/src/dom/element_manager.dart b/kraken/lib/src/dom/element_manager.dart index 18537aa615..e5916634fd 100644 --- a/kraken/lib/src/dom/element_manager.dart +++ b/kraken/lib/src/dom/element_manager.dart @@ -295,10 +295,10 @@ class ElementManager implements WidgetsBindingObserver, ElementsBindingObserver assert(target != null); if (target is Element) { - // Only Element has properties + // Only Element has properties. target.setProperty(key, value); - } else if (target is TextNode && key == 'data') { - target.data = value; + } else if (target is TextNode && key == 'data' || key == 'nodeValue') { + (target as TextNode).data = value; } else { debugPrint('Only element has properties, try setting $key to Node(#$targetId).'); } @@ -312,8 +312,11 @@ class ElementManager implements WidgetsBindingObserver, ElementsBindingObserver if (target is Element) { // Only Element has properties return target.getProperty(key); + } else if (target is TextNode && key == 'data' || key == 'nodeValue') { + return (target as TextNode).data; + } else { + return null; } - return null; } void removeProperty(int targetId, String key) { @@ -323,6 +326,8 @@ class ElementManager implements WidgetsBindingObserver, ElementsBindingObserver if (target is Element) { target.removeProperty(key); + } else if (target is TextNode && key == 'data' || key == 'nodeValue') { + (target as TextNode).data = ''; } else { debugPrint('Only element has properties, try removing $key from Node(#$targetId).'); }