/
text_node.cc
114 lines (92 loc) · 3.82 KB
/
text_node.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
* Copyright (C) 2020 Alibaba Inc. All rights reserved.
* Author: Kraken Team.
*/
#include "text_node.h"
namespace kraken::binding::jsc {
void bindTextNode(std::unique_ptr<JSContext> &context) {
auto textNode = JSTextNode::instance(context.get());
JSC_GLOBAL_SET_PROPERTY(context, "Text", textNode->classObject);
}
std::unordered_map<JSContext *, JSTextNode *> JSTextNode::instanceMap{};
JSTextNode *JSTextNode::instance(JSContext *context) {
if (instanceMap.count(context) == 0) {
instanceMap[context] = new JSTextNode(context);
}
return instanceMap[context];
}
JSTextNode::~JSTextNode() {
instanceMap.erase(context);
}
JSTextNode::JSTextNode(JSContext *context) : JSNode(context, "Text") {}
JSObjectRef JSTextNode::instanceConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount,
const JSValueRef *arguments, JSValueRef *exception) {
const JSValueRef dataValueRef = arguments[0];
auto textNode = new TextNodeInstance(this, JSValueToStringCopy(ctx, dataValueRef, exception));
return textNode->object;
}
JSTextNode::TextNodeInstance::TextNodeInstance(JSTextNode *jsTextNode, JSStringRef data)
: NodeInstance(jsTextNode, NodeType::TEXT_NODE), nativeTextNode(new NativeTextNode(nativeNode)) {
m_data.setString(data);
NativeString args_01{};
buildUICommandArgs(data, args_01);
foundation::UICommandTaskMessageQueue::instance(_hostClass->contextId)
->registerCommand(eventTargetId, UICommand::createTextNode, args_01, nativeTextNode);
}
JSValueRef JSTextNode::TextNodeInstance::getProperty(std::string &name, JSValueRef *exception) {
auto propertyMap = getTextNodePropertyMap();
if (propertyMap.count(name) == 0) {
return NodeInstance::getProperty(name, exception);
}
auto property = propertyMap[name];
switch (property) {
case TextNodeProperty::nodeValue:
case TextNodeProperty::textContent:
case TextNodeProperty::data: {
return m_data.makeString();
}
case TextNodeProperty::nodeName: {
JSStringRef nodeName = JSStringCreateWithUTF8CString("#text");
return JSValueMakeString(_hostClass->ctx, nodeName);
}
}
}
bool JSTextNode::TextNodeInstance::setProperty(std::string &name, JSValueRef value, JSValueRef *exception) {
if (name == "data" || name == "nodeValue") {
JSStringRef data = JSValueToStringCopy(_hostClass->ctx, value, exception);
m_data.setString(data);
std::string dataString = JSStringToStdString(data);
NativeString args_01{};
NativeString args_02{};
buildUICommandArgs(name, dataString, args_01, args_02);
foundation::UICommandTaskMessageQueue::instance(_hostClass->contextId)
->registerCommand(eventTargetId, UICommand::setProperty, args_01, args_02, nullptr);
return true;
} else {
return NodeInstance::setProperty(name, value, exception);
}
}
void JSTextNode::TextNodeInstance::getPropertyNames(JSPropertyNameAccumulatorRef accumulator) {
NodeInstance::getPropertyNames(accumulator);
for (auto &property : getTextNodePropertyNames()) {
JSPropertyNameAccumulatorAddName(accumulator, property);
}
}
std::string JSTextNode::TextNodeInstance::internalGetTextContent() {
return m_data.string();
}
JSTextNode::TextNodeInstance::~TextNodeInstance() {
foundation::UICommandCallbackQueue::instance()->registerCallback([](void *ptr) {
delete reinterpret_cast<NativeTextNode *>(ptr);
}, nativeTextNode);
}
void JSTextNode::TextNodeInstance::internalSetTextContent(JSStringRef content, JSValueRef *exception) {
m_data.setString(content);
std::string key = "data";
NativeString args_01{};
NativeString args_02{};
buildUICommandArgs(key, content, args_01, args_02);
foundation::UICommandTaskMessageQueue::instance(context->getContextId())
->registerCommand(eventTargetId, UICommand::setProperty, args_01, args_02, nullptr);
}
} // namespace kraken::binding::jsc