Skip to content

Commit

Permalink
Merge branch 'main' into feat/DocumentFragment
Browse files Browse the repository at this point in the history
  • Loading branch information
answershuto committed Sep 23, 2021
2 parents a420815 + 28a5c77 commit 700cf64
Show file tree
Hide file tree
Showing 7 changed files with 895 additions and 53 deletions.
38 changes: 36 additions & 2 deletions bridge/bindings/jsc/DOM/document.cc
Original file line number Diff line number Diff line change
Expand Up @@ -398,11 +398,45 @@ JSValueRef JSDocument::getElementsByTagName(JSContextRef ctx, JSObjectRef functi
std::transform(tagName.begin(), tagName.end(), tagName.begin(), ::toupper);

std::vector<ElementInstance *> elements;

traverseNode(document->documentElement, [tagName, &elements](NodeInstance *node) {
if (node->nodeType == NodeType::ELEMENT_NODE) {
auto element = reinterpret_cast<ElementInstance *>(node);
if (element->tagName() == tagName) {
if (element->tagName() == tagName || tagName == "*") {
elements.emplace_back(element);
}
}

return false;
});

JSValueRef elementArguments[elements.size()];

for (int i = 0; i < elements.size(); i++) {
elementArguments[i] = elements[i]->object;
}

return JSObjectMakeArray(ctx, elements.size(), elementArguments, exception);
}

JSValueRef JSDocument::getElementsByClassName(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
size_t argumentCount, const JSValueRef *arguments, JSValueRef *exception) {
if (argumentCount < 1) {
throwJSError(ctx,
"Uncaught TypeError: Failed to execute 'getElementsByClassName' on 'Document': 1 argument required, "
"but only 0 present.",
exception);
return nullptr;
}

auto document = reinterpret_cast<DocumentInstance *>(JSObjectGetPrivate(thisObject));
JSStringRef classNameStringRef = JSValueToStringCopy(ctx, arguments[0], exception);
std::string className = JSStringToStdString(classNameStringRef);
std::vector<ElementInstance *> elements;

traverseNode(document->documentElement, [ctx, exception, className, &elements](NodeInstance *node) {
if (node->nodeType == NodeType::ELEMENT_NODE) {
auto element = reinterpret_cast<ElementInstance *>(node);
if(element->classNames().containsAll(className)) {
elements.emplace_back(element);
}
}
Expand Down
19 changes: 19 additions & 0 deletions bridge/bindings/jsc/DOM/element.cc
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,12 @@ JSValueRef ElementInstance::getProperty(std::string &name, JSValueRef *exception
JSElement::ElementProperty &property = propertyMap[name];

switch (property) {
case JSElement::ElementProperty::className: {
std::string str = "class";
JSValueRef classRef = (*m_attributes)->getProperty(str, exception);
return classRef;
break;
}
case JSElement::ElementProperty::nodeName:
case JSElement::ElementProperty::tagName: {
return JSValueMakeString(_hostClass->ctx, JSStringCreateWithUTF8CString(tagName().c_str()));
Expand Down Expand Up @@ -322,6 +328,11 @@ bool ElementInstance::setProperty(std::string &name, JSValueRef value, JSValueRe
auto &property = propertyMap[name];

switch (property) {
case JSElement::ElementProperty::className: {
std::string str = "class";
(*m_attributes)->setProperty(str, value, exception);
break;
}
case JSElement::ElementProperty::style:
case JSElement::ElementProperty::attributes:
return false;
Expand Down Expand Up @@ -756,6 +767,14 @@ void ElementInstance::setAttributes(JSHostObjectHolder<JSElementAttributes> &att
m_attributes = JSHostObjectHolder<JSElementAttributes>(attributes);
}

SpaceSplitString ElementInstance::classNames() {
std::string str = "className";
JSValueRef classValueRef = getProperty(str, nullptr);
JSStringRef classStringRef = JSValueToStringCopy(ctx, classValueRef, nullptr);
std::string strClass = JSStringToStdString(classStringRef);
return SpaceSplitString(strClass);
}

void ElementInstance::internalSetTextContent(JSStringRef content, JSValueRef *exception) {
auto node = firstChild();
while (node != nullptr) {
Expand Down

0 comments on commit 700cf64

Please sign in to comment.