Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main' into example_build
Browse files Browse the repository at this point in the history
  • Loading branch information
andycall committed Nov 30, 2021
2 parents 2a0fdbb + a62546f commit 76af3c7
Show file tree
Hide file tree
Showing 66 changed files with 765 additions and 383 deletions.
2 changes: 1 addition & 1 deletion bridge/bindings/qjs/dom/comment_node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ PROP_SETTER(CommentInstance, length)(QjsContext* ctx, JSValue this_val, int argc
}

CommentInstance::CommentInstance(Comment* comment) : NodeInstance(comment, NodeType::COMMENT_NODE, DocumentInstance::instance(Document::instance(comment->m_context)), Comment::classId(), "Comment") {
::foundation::UICommandBuffer::instance(m_context->getContextId())->addCommand(eventTargetId, UICommand::createComment, nativeEventTarget);
::foundation::UICommandBuffer::instance(m_context->getContextId())->addCommand(m_eventTargetId, UICommand::createComment, nativeEventTarget);
}

} // namespace kraken::binding::qjs
2 changes: 1 addition & 1 deletion bridge/bindings/qjs/dom/document.cc
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ void DocumentCookie::setCookie(std::string& cookieStr) {
DocumentInstance::DocumentInstance(Document* document) : NodeInstance(document, NodeType::DOCUMENT_NODE, this, Document::classId(), "document") {
m_cookie = std::make_unique<DocumentCookie>();
m_instanceMap[Document::instance(m_context)] = this;
eventTargetId = DOCUMENT_TARGET_ID;
m_eventTargetId = DOCUMENT_TARGET_ID;

JSAtom htmlTagName = JS_NewAtom(m_ctx, "HTML");
JSValue htmlTagValue = JS_AtomToValue(m_ctx, htmlTagName);
Expand Down
2 changes: 1 addition & 1 deletion bridge/bindings/qjs/dom/document_fragment.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ JSValue DocumentFragment::instanceConstructor(QjsContext* ctx, JSValue func_obj,
DocumentFragmentInstance::DocumentFragmentInstance(DocumentFragment* fragment)
: NodeInstance(fragment, NodeType::DOCUMENT_FRAGMENT_NODE, DocumentInstance::instance(Document::instance(fragment->context())), DocumentFragment::classId(), "DocumentFragment") {
setNodeFlag(DocumentFragmentInstance::NodeFlag::IsDocumentFragment);
foundation::UICommandBuffer::instance(m_contextId)->addCommand(eventTargetId, UICommand::createDocumentFragment, nativeEventTarget);
foundation::UICommandBuffer::instance(m_contextId)->addCommand(m_eventTargetId, UICommand::createDocumentFragment, nativeEventTarget);
}
} // namespace kraken::binding::qjs
52 changes: 46 additions & 6 deletions bridge/bindings/qjs/dom/element.cc
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ JSValue Element::instanceConstructor(QjsContext* ctx, JSValue func_obj, JSValue
ElementInstance* element;
if (name == "HTML") {
element = new ElementInstance(this, name, false);
element->eventTargetId = HTML_TARGET_ID;
element->m_eventTargetId = HTML_TARGET_ID;
} else {
// Fallback to default Element class
element = new ElementInstance(this, name, true);
Expand Down Expand Up @@ -214,7 +214,7 @@ JSValue Element::setAttribute(QjsContext* ctx, JSValue this_val, int argc, JSVal
NativeString* args_01 = stringToNativeString(name);
NativeString* args_02 = jsValueToNativeString(ctx, attributeString);

::foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
::foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);

JS_FreeValue(ctx, attributeString);
JS_FreeAtom(ctx, attributeAtom);
Expand Down Expand Up @@ -266,7 +266,7 @@ JSValue Element::removeAttribute(QjsContext* ctx, JSValue this_val, int argc, JS
element->_didModifyAttribute(name, id, JS_ATOM_NULL);

NativeString* args_01 = stringToNativeString(name);
::foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::removeProperty, *args_01, nullptr);
::foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::removeProperty, *args_01, nullptr);
}

return JS_NULL;
Expand Down Expand Up @@ -342,7 +342,7 @@ JSValue Element::toBlob(QjsContext* ctx, JSValue this_val, int argc, JSValue* ar
nullptr, element->m_context, resolving_funcs[0], resolving_funcs[1], promise,
};

getDartMethod()->toBlob(static_cast<void*>(toBlobPromiseContext), element->m_context->getContextId(), blobCallback, element->eventTargetId, devicePixelRatio);
getDartMethod()->toBlob(static_cast<void*>(toBlobPromiseContext), element->m_context->getContextId(), blobCallback, element->m_eventTargetId, devicePixelRatio);
list_add_tail(&toBlobPromiseContext->link, &element->m_context->promise_job_list);

return promise;
Expand Down Expand Up @@ -411,7 +411,7 @@ PROP_SETTER(ElementInstance, className)(QjsContext* ctx, JSValue this_val, int a
element->m_attributes->setAttribute("class", atom);
NativeString* args_01 = stringToNativeString("class");
NativeString* args_02 = jsValueToNativeString(ctx, argv[0]);
::foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
::foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
JS_FreeAtom(ctx, atom);
return JS_NULL;
}
Expand Down Expand Up @@ -544,6 +544,46 @@ PROP_SETTER(ElementInstance, scrollWidth)(QjsContext* ctx, JSValue this_val, int
return JS_NULL;
}

// Definition for firstElementChild
PROP_GETTER(ElementInstance, firstElementChild)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
auto* element = static_cast<ElementInstance*>(JS_GetOpaque(this_val, Element::classId()));
int32_t len = arrayGetLength(ctx, element->childNodes);

for (int i = 0; i < len; i++) {
JSValue v = JS_GetPropertyUint32(ctx, element->childNodes, i);
auto* instance = static_cast<NodeInstance*>(JS_GetOpaque(v, Node::classId(v)));
if (instance->nodeType == NodeType::ELEMENT_NODE) {
return instance->instanceObject;
}
JS_FreeValue(ctx, v);
}

return JS_NULL;
}
PROP_SETTER(ElementInstance, firstElementChild)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
return JS_NULL;
}

// Definition for lastElementChild
PROP_GETTER(ElementInstance, lastElementChild)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
auto* element = static_cast<ElementInstance*>(JS_GetOpaque(this_val, Element::classId()));
int32_t len = arrayGetLength(ctx, element->childNodes);

for (int i = len - 1; i >= 0; i--) {
JSValue v = JS_GetPropertyUint32(ctx, element->childNodes, i);
auto* instance = static_cast<NodeInstance*>(JS_GetOpaque(v, Node::classId(v)));
if (instance->nodeType == NodeType::ELEMENT_NODE) {
return instance->instanceObject;
}
JS_FreeValue(ctx, v);
}

return JS_NULL;
}
PROP_SETTER(ElementInstance, lastElementChild)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
return JS_NULL;
}

PROP_GETTER(ElementInstance, children)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
auto* element = static_cast<ElementInstance*>(JS_GetOpaque(this_val, Element::classId()));
JSValue array = JS_NewArray(ctx);
Expand Down Expand Up @@ -817,7 +857,7 @@ ElementInstance::ElementInstance(Element* element, std::string tagName, bool sho

if (shouldAddUICommand) {
NativeString* args_01 = stringToNativeString(tagName);
::foundation::UICommandBuffer::instance(m_context->getContextId())->addCommand(eventTargetId, UICommand::createElement, *args_01, nativeEventTarget);
::foundation::UICommandBuffer::instance(m_context->getContextId())->addCommand(m_eventTargetId, UICommand::createElement, *args_01, nativeEventTarget);
}
}

Expand Down
4 changes: 3 additions & 1 deletion bridge/bindings/qjs/dom/element.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ class ElementInstance : public NodeInstance {
explicit ElementInstance(Element* element, std::string tagName, bool shouldAddUICommand);

private:
DEFINE_HOST_CLASS_PROPERTY(18,
DEFINE_HOST_CLASS_PROPERTY(20,
nodeName,
tagName,
className,
Expand All @@ -150,6 +150,8 @@ class ElementInstance : public NodeInstance {
scrollLeft,
scrollHeight,
scrollWidth,
firstElementChild,
lastElementChild,
children,
innerHTML,
outerHTML);
Expand Down
8 changes: 4 additions & 4 deletions bridge/bindings/qjs/dom/elements/image_element.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ PROP_SETTER(ImageElementInstance, width)(QjsContext* ctx, JSValue this_val, int
std::string key = "width";
NativeString* args_01 = stringToNativeString(key);
NativeString* args_02 = jsValueToNativeString(ctx, argv[0]);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
return JS_NULL;
}
PROP_GETTER(ImageElementInstance, height)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
Expand All @@ -46,7 +46,7 @@ PROP_SETTER(ImageElementInstance, height)(QjsContext* ctx, JSValue this_val, int
std::string key = "height";
NativeString* args_01 = stringToNativeString(key);
NativeString* args_02 = jsValueToNativeString(ctx, argv[0]);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
return JS_NULL;
}
PROP_GETTER(ImageElementInstance, naturalWidth)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
Expand Down Expand Up @@ -75,7 +75,7 @@ PROP_SETTER(ImageElementInstance, src)(QjsContext* ctx, JSValue this_val, int ar
std::string key = "src";
NativeString* args_01 = stringToNativeString(key);
NativeString* args_02 = jsValueToNativeString(ctx, argv[0]);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
return JS_NULL;
}
PROP_GETTER(ImageElementInstance, loading)(QjsContext* ctx, JSValue this_val, int argc, JSValue* argv) {
Expand All @@ -88,7 +88,7 @@ PROP_SETTER(ImageElementInstance, loading)(QjsContext* ctx, JSValue this_val, in
std::string key = "loading";
NativeString* args_01 = stringToNativeString(key);
NativeString* args_02 = jsValueToNativeString(ctx, argv[0]);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
foundation::UICommandBuffer::instance(element->m_context->getContextId())->addCommand(element->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
return JS_NULL;
}

Expand Down
40 changes: 12 additions & 28 deletions bridge/bindings/qjs/dom/event_target.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,8 @@ JSValue EventTarget::addEventListener(QjsContext* ctx, JSValue this_val, int arg
JSValue eventTypeValue = argv[0];
JSValue callback = argv[1];

if (!JS_IsString(eventTypeValue)) {
return JS_ThrowTypeError(ctx, "Failed to addEventListener: eventName should be an string.");
}

if (!JS_IsObject(callback)) {
return JS_ThrowTypeError(ctx, "Failed to addEventListener: callback should be an function.");
}

if (!JS_IsFunction(ctx, callback)) {
return JS_ThrowTypeError(ctx, "Failed to addEventListener: callback should be an function.");
if (!JS_IsString(eventTypeValue) || !JS_IsObject(callback) || !JS_IsFunction(ctx, callback)) {
return JS_UNDEFINED;
}

JSAtom eventTypeAtom = JS_ValueToAtom(ctx, eventTypeValue);
Expand All @@ -94,7 +86,7 @@ JSValue EventTarget::addEventListener(QjsContext* ctx, JSValue this_val, int arg
NativeString args_01{};
buildUICommandArgs(ctx, eventTypeValue, args_01);

foundation::UICommandBuffer::instance(contextId)->addCommand(eventTargetInstance->eventTargetId, UICommand::addEvent, args_01, nullptr);
foundation::UICommandBuffer::instance(contextId)->addCommand(eventTargetInstance->m_eventTargetId, UICommand::addEvent, args_01, nullptr);
}
arrayPushValue(ctx, eventHandlers, callback);
JS_FreeAtom(ctx, eventTypeAtom);
Expand All @@ -116,18 +108,10 @@ JSValue EventTarget::removeEventListener(QjsContext* ctx, JSValue this_val, int
JSValue eventTypeValue = argv[0];
JSValue callback = argv[1];

if (!JS_IsString(eventTypeValue)) {
if (!JS_IsString(eventTypeValue) || !JS_IsObject(callback) || !JS_IsObject(callback)) {
return JS_ThrowTypeError(ctx, "Failed to removeEventListener: eventName should be an string.");
}

if (!JS_IsObject(callback)) {
return JS_ThrowTypeError(ctx, "Failed to removeEventListener: callback should be an function.");
}

if (!JS_IsFunction(ctx, callback)) {
return JS_ThrowTypeError(ctx, "Failed to removeEventListener: callback should be an function.");
}

JSAtom eventTypeAtom = JS_ValueToAtom(ctx, eventTypeValue);

if (!JS_HasProperty(ctx, eventTargetInstance->m_eventHandlers, eventTypeAtom)) {
Expand All @@ -151,7 +135,7 @@ JSValue EventTarget::removeEventListener(QjsContext* ctx, JSValue this_val, int
NativeString args_01{};
buildUICommandArgs(ctx, eventTypeValue, args_01);

foundation::UICommandBuffer::instance(contextId)->addCommand(eventTargetInstance->eventTargetId, UICommand::removeEvent, args_01, nullptr);
foundation::UICommandBuffer::instance(contextId)->addCommand(eventTargetInstance->m_eventTargetId, UICommand::removeEvent, args_01, nullptr);
}

JS_FreeAtom(ctx, eventTypeAtom);
Expand Down Expand Up @@ -281,23 +265,23 @@ JSValue EventTarget::__kraken_clear_event_listener(QjsContext* ctx, JSValue this

EventTargetInstance::EventTargetInstance(EventTarget* eventTarget, JSClassID classId, JSClassExoticMethods& exoticMethods, std::string name)
: Instance(eventTarget, name, &exoticMethods, classId, finalize) {
eventTargetId = globalEventTargetId++;
m_eventTargetId = globalEventTargetId++;
}

EventTargetInstance::EventTargetInstance(EventTarget* eventTarget, JSClassID classId, std::string name) : Instance(eventTarget, std::move(name), nullptr, classId, finalize) {
eventTargetId = globalEventTargetId++;
m_eventTargetId = globalEventTargetId++;
}

EventTargetInstance::EventTargetInstance(EventTarget* eventTarget, JSClassID classId, std::string name, int64_t eventTargetId)
: Instance(eventTarget, std::move(name), nullptr, classId, finalize), eventTargetId(eventTargetId) {}
: Instance(eventTarget, std::move(name), nullptr, classId, finalize), m_eventTargetId(eventTargetId) {}

JSClassID EventTargetInstance::classId() {
assert_m(false, "classId is not implemented");
return 0;
}

EventTargetInstance::~EventTargetInstance() {
foundation::UICommandBuffer::instance(m_contextId)->addCommand(eventTargetId, UICommand::disposeEventTarget, nullptr, false);
foundation::UICommandBuffer::instance(m_contextId)->addCommand(m_eventTargetId, UICommand::disposeEventTarget, nullptr, false);
#if FLUTTER_BACKEND
getDartMethod()->flushUICommand();
#endif
Expand Down Expand Up @@ -385,7 +369,7 @@ int EventTargetInstance::setProperty(QjsContext* ctx, JSValue obj, JSAtom atom,
if (isJavaScriptExtensionElementInstance(eventTarget->context(), eventTarget->instanceObject) && !p->is_wide_char && p->u.str8[0] != '_') {
NativeString* args_01 = atomToNativeString(ctx, atom);
NativeString* args_02 = jsValueToNativeString(ctx, value);
foundation::UICommandBuffer::instance(eventTarget->m_contextId)->addCommand(eventTarget->eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
foundation::UICommandBuffer::instance(eventTarget->m_contextId)->addCommand(eventTarget->m_eventTargetId, UICommand::setProperty, *args_01, *args_02, nullptr);
}
}

Expand Down Expand Up @@ -443,7 +427,7 @@ void EventTargetInstance::setPropertyHandler(JSString* p, JSValue value) {
int32_t contextId = m_context->getContextId();
NativeString* args_01 = atomToNativeString(m_ctx, atom);
int32_t type = JS_IsFunction(m_ctx, value) ? UICommand::addEvent : UICommand::removeEvent;
foundation::UICommandBuffer::instance(contextId)->addCommand(eventTargetId, type, *args_01, nullptr);
foundation::UICommandBuffer::instance(contextId)->addCommand(m_eventTargetId, type, *args_01, nullptr);
}
}

Expand Down Expand Up @@ -489,7 +473,7 @@ void EventTargetInstance::copyNodeProperties(EventTargetInstance* newNode, Event
JSValue k = JS_GetPropertyUint32(ctx, propKeys, i);
JSAtom kt = JS_ValueToAtom(ctx, k);
JSValue v = JS_GetProperty(ctx, referenceNode->m_properties, kt);
JS_SetProperty(ctx, newNode->m_properties, kt, v);
JS_SetProperty(ctx, newNode->m_properties, kt, JS_DupValue(ctx, v));

JS_FreeAtom(ctx, kt);
JS_FreeValue(ctx, k);
Expand Down
3 changes: 2 additions & 1 deletion bridge/bindings/qjs/dom/event_target.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,15 @@ class EventTargetInstance : public Instance {

virtual bool dispatchEvent(EventInstance* event);
static inline JSClassID classId();
inline int32_t eventTargetId() const { return m_eventTargetId; }

JSValue callNativeMethods(const char* method, int32_t argc, NativeValue* argv);
JSValue getNativeProperty(const char* prop);

NativeEventTarget* nativeEventTarget{new NativeEventTarget(this)};

protected:
int32_t eventTargetId;
int32_t m_eventTargetId;
JSValue m_eventHandlers{JS_NewObject(m_ctx)};
JSValue m_propertyEventHandler{JS_NewObject(m_ctx)};
JSValue m_properties{JS_NewObject(m_ctx)};
Expand Down
Loading

0 comments on commit 76af3c7

Please sign in to comment.