Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/document fragment #641

Merged
merged 26 commits into from
Sep 24, 2021
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
f2aa5d0
feat: add JSDocumentFragment
answershuto Aug 27, 2021
a812a99
feat: add flog of node.
answershuto Aug 27, 2021
53dc2d8
feat: append children of document fragment when element is DocumentFr…
answershuto Aug 27, 2021
62a76e4
fix: append children.
answershuto Aug 30, 2021
4751df8
feat: insertBefore support documentFragment.
answershuto Aug 30, 2021
6fb734f
test: add documentFragment test.
answershuto Aug 30, 2021
dcbf753
test: new line.
answershuto Aug 30, 2021
d09f8e6
feat: add document.createDocumentFragment.
answershuto Aug 30, 2021
23938f7
test: add test of document.createDocumentFragment.
answershuto Aug 30, 2021
0135a88
test: delete test images.
answershuto Aug 30, 2021
eebd8c7
Merge branch 'main' into feat/DocumentFragment
answershuto Aug 30, 2021
b9b64a8
fix: DocumentFragment don't need create in dart.
answershuto Aug 31, 2021
d1b451a
feat: add DocumentFragmentElement to dart.
answershuto Aug 31, 2021
eec6198
feat: DocumentFragment should be Node.
answershuto Aug 31, 2021
cdb4cd8
chore: deal with lint.
answershuto Aug 31, 2021
cd8263a
chore: delete invalid import.
answershuto Aug 31, 2021
3c0b25c
feat: modify document.createDocumentFragment
answershuto Aug 31, 2021
c93971c
chore: remove document_fragment.
answershuto Aug 31, 2021
2c527ae
feat: doocument fragment instance should be set flag of IsDocumentFra…
answershuto Sep 1, 2021
c78b259
feat: delete invalid initialization.
answershuto Sep 1, 2021
ef418f4
Merge branch 'main' into feat/DocumentFragment
answershuto Sep 1, 2021
57895e4
Merge branch 'main' into feat/DocumentFragment
answershuto Sep 2, 2021
a420815
Merge branch 'main' into feat/DocumentFragment
answershuto Sep 23, 2021
700cf64
Merge branch 'main' into feat/DocumentFragment
answershuto Sep 23, 2021
5884392
chore: delete useless variables.
answershuto Sep 24, 2021
36e991c
refactor: refactor ensureDetached in node.
andycall Sep 24, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions bridge/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ if ($ENV{KRAKEN_JS_ENGINE} MATCHES "jsc")
bindings/jsc/DOM/elements/object_element.h
bindings/jsc/DOM/elements/svg_element.cc
bindings/jsc/DOM/elements/svg_element.h
bindings/jsc/DOM/elements/document_fragment.cc
bindings/jsc/DOM/elements/document_fragment.h
bindings/jsc/DOM/elements/script_element.cc
bindings/jsc/DOM/elements/script_element.h
bindings/jsc/KOM/performance.cc
Expand Down
6 changes: 6 additions & 0 deletions bridge/bindings/jsc/DOM/document.cc
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ JSValueRef JSDocument::createEvent(JSContextRef ctx, JSObjectRef function, JSObj
}
}

JSValueRef JSDocument::createDocumentFragment(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) {
auto document = static_cast<DocumentInstance *>(JSObjectGetPrivate(thisObject));
auto documentFragment = new JSDocumentFragment::DocumentFragmentInstance(JSDocumentFragment::instance(document->context));
return documentFragment->object;
}

JSValueRef JSDocument::createElement(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) {
Expand Down
1 change: 1 addition & 0 deletions bridge/bindings/jsc/DOM/document.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "bindings/jsc/DOM/elements/input_element.h"
#include "bindings/jsc/DOM/elements/object_element.h"
#include "bindings/jsc/DOM/elements/script_element.h"
#include "bindings/jsc/DOM/elements/document_fragment.h"
#include "bindings/jsc/DOM/events/close_event.h"
#include "bindings/jsc/DOM/events/gesture_event.h"
#include "bindings/jsc/DOM/events/input_event.h"
Expand Down
41 changes: 41 additions & 0 deletions bridge/bindings/jsc/DOM/elements/document_fragment.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright (C) 2021 Alibaba Inc. All rights reserved.
* Author: Kraken Team.
*/

#include "document_fragment.h"

namespace kraken::binding::jsc {

void bindDocumentFragment(std::unique_ptr<JSContext> &context) {
auto DocumentFragment = JSDocumentFragment::instance(context.get());
JSC_GLOBAL_SET_PROPERTY(context, "DocumentFragment", DocumentFragment->classObject);
}

std::unordered_map<JSContext *, JSDocumentFragment *> JSDocumentFragment::instanceMap{};

JSDocumentFragment::~JSDocumentFragment() {
instanceMap.erase(context);
}

JSDocumentFragment::JSDocumentFragment(JSContext *context) : JSNode(context) {}
JSObjectRef JSDocumentFragment::instanceConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount,
const JSValueRef *arguments, JSValueRef *exception) {
auto instance = new DocumentFragmentInstance(this);
return instance->object;
}

JSDocumentFragment::DocumentFragmentInstance::DocumentFragmentInstance(JSDocumentFragment *jsDocumentFragment)
: NodeInstance(jsDocumentFragment, NodeType::DOCUMENT_FRAGMENT_NODE) {
setNodeFlag(DocumentFragmentInstance::NodeFlag::IsDocumentFragment);
std::string tagName = "documentfragment";
NativeString args_01{};
buildUICommandArgs(tagName, args_01);

foundation::UICommandBuffer::instance(context->getContextId())
->addCommand(eventTargetId, UICommand::createDocumentFragment, args_01, nativeNode);
}

JSDocumentFragment::DocumentFragmentInstance::~DocumentFragmentInstance() {}

} // namespace kraken::binding::jsc
45 changes: 45 additions & 0 deletions bridge/bindings/jsc/DOM/elements/document_fragment.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (C) 2021 Alibaba Inc. All rights reserved.
* Author: Kraken Team.
*/

#ifndef KRAKENBRIDGE_DOCUMENT_FRAGMENT_ELEMENT_H
#define KRAKENBRIDGE_DOCUMENT_FRAGMENT_ELEMENT_H

#include "bindings/jsc/DOM/element.h"
#include "bindings/jsc/js_context_internal.h"

namespace kraken::binding::jsc {

void bindDocumentFragment(std::unique_ptr<JSContext> &context);

class JSDocumentFragment : public JSNode {
public:
static std::unordered_map<JSContext *, JSDocumentFragment *> instanceMap;
OBJECT_INSTANCE(JSDocumentFragment)
JSObjectRef instanceConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount,
const JSValueRef *arguments, JSValueRef *exception) override;

class DocumentFragmentInstance : public NodeInstance {
public:

DocumentFragmentInstance() = delete;
~DocumentFragmentInstance();
explicit DocumentFragmentInstance(JSDocumentFragment *JSDocumentFragment);

JSDocumentFragment *nativeDocumentFragment;

private:
JSStringHolder m_data{context, ""};
JSStringHolder m_type{context, ""};
};
protected:
~JSDocumentFragment();
JSDocumentFragment() = delete;
explicit JSDocumentFragment(JSContext *context);
};


} // namespace kraken::binding::jsc

#endif // KRAKENBRIDGE_DOCUMENT_FRAGMENT_ELEMENT_H
17 changes: 15 additions & 2 deletions bridge/bindings/jsc/DOM/node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "node.h"
#include "document.h"
#include "bindings/jsc/DOM/elements/document_fragment.h"

namespace kraken::binding::jsc {

Expand Down Expand Up @@ -269,7 +270,13 @@ JSValueRef JSNode::appendChild(JSContextRef ctx, JSObjectRef function, JSObjectR
return nullptr;
}

selfInstance->internalAppendChild(nodeInstance);
if (nodeInstance->hasNodeFlag(NodeInstance::NodeFlag::IsDocumentFragment)) {
while (nodeInstance->childNodes.size()) {
selfInstance->internalAppendChild(nodeInstance->childNodes[0]);
}
} else {
selfInstance->internalAppendChild(nodeInstance);
}

return nodeValueRef;
}
Expand Down Expand Up @@ -310,7 +317,13 @@ JSValueRef JSNode::insertBefore(JSContextRef ctx, JSObjectRef function, JSObject
return nullptr;
}

selfInstance->internalInsertBefore(nodeInstance, referenceInstance, exception);
if (nodeInstance->hasNodeFlag(NodeInstance::NodeFlag::IsDocumentFragment)) {
while (nodeInstance->childNodes.size()) {
selfInstance->internalInsertBefore(nodeInstance->childNodes[0], referenceInstance, exception);
}
} else {
selfInstance->internalInsertBefore(nodeInstance, referenceInstance, exception);
}

return nullptr;
}
Expand Down
2 changes: 2 additions & 0 deletions bridge/bridge_jsc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "bindings/jsc/DOM/elements/image_element.h"
#include "bindings/jsc/DOM/elements/input_element.h"
#include "bindings/jsc/DOM/elements/svg_element.h"
#include "bindings/jsc/DOM/elements/document_fragment.h"
#include "bindings/jsc/DOM/event.h"
#include "bindings/jsc/DOM/event_target.h"
#include "bindings/jsc/DOM/events/close_event.h"
Expand Down Expand Up @@ -118,6 +119,7 @@ JSBridge::JSBridge(int32_t contextId, const JSExceptionHandler &handler) : conte
bindImageElement(m_context);
bindInputElement(m_context);
bindSVGElement(m_context);
bindDocumentFragment(m_context);
bindWindow(m_context);
bindPerformance(m_context);
bindCSSStyleDeclaration(m_context);
Expand Down
1 change: 1 addition & 0 deletions bridge/include/kraken_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ enum UICommand {
removeProperty,
cloneNode,
removeEvent,
createDocumentFragment,
};

struct KRAKEN_EXPORT UICommandItem {
Expand Down