From 7da0b5a45cb430b54e822e6a3be1ec646659b359 Mon Sep 17 00:00:00 2001 From: "ranmo.cy" Date: Tue, 18 May 2021 20:47:29 +0800 Subject: [PATCH 1/3] feat: add SVGElement --- bridge/CMakeLists.txt | 2 + .../bindings/jsc/DOM/elements/svg_element.cc | 46 ++++++++++++++++ .../bindings/jsc/DOM/elements/svg_element.h | 53 +++++++++++++++++++ bridge/bridge_jsc.cc | 2 + 4 files changed, 103 insertions(+) create mode 100644 bridge/bindings/jsc/DOM/elements/svg_element.cc create mode 100644 bridge/bindings/jsc/DOM/elements/svg_element.h diff --git a/bridge/CMakeLists.txt b/bridge/CMakeLists.txt index 3eedbb67fc..6741efc5ad 100644 --- a/bridge/CMakeLists.txt +++ b/bridge/CMakeLists.txt @@ -119,6 +119,8 @@ if ($ENV{KRAKEN_JS_ENGINE} MATCHES "jsc") bindings/jsc/DOM/elements/input_element.h bindings/jsc/DOM/elements/object_element.cc 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/script_element.cc bindings/jsc/DOM/elements/script_element.h bindings/jsc/KOM/performance.cc diff --git a/bridge/bindings/jsc/DOM/elements/svg_element.cc b/bridge/bindings/jsc/DOM/elements/svg_element.cc new file mode 100644 index 0000000000..78eab33a69 --- /dev/null +++ b/bridge/bindings/jsc/DOM/elements/svg_element.cc @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2020 Alibaba Inc. All rights reserved. + * Author: Kraken Team. + */ + +#include "svg_element.h" + +namespace kraken::binding::jsc { + + +void bindSVGElement(std::unique_ptr &context) { + auto SVGElement = JSSVGElement::instance(context.get()); + JSC_GLOBAL_SET_PROPERTY(context, "SVGElement", SVGElement->classObject); +} + + +std::unordered_map JSSVGElement::instanceMap{}; + +JSSVGElement::~JSSVGElement() { + instanceMap.erase(context); +} + +JSSVGElement::JSSVGElement(JSContext *context) : JSElement(context) {} +JSObjectRef JSSVGElement::instanceConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, + const JSValueRef *arguments, JSValueRef *exception) { + auto instance = new SVGElementInstance(this); + return instance->object; +} + +JSSVGElement::SVGElementInstance::SVGElementInstance(JSSVGElement *jsAnchorElement) + : ElementInstance(jsAnchorElement, "svg", false), nativeSVGElement(new NativeSVGElement(nativeElement)) { + std::string tagName = "svg"; + NativeString args_01{}; + buildUICommandArgs(tagName, args_01); + + foundation::UICommandTaskMessageQueue::instance(context->getContextId()) + ->registerCommand(eventTargetId, UICommand::createElement, args_01, nativeSVGElement); +} + +JSSVGElement::SVGElementInstance::~SVGElementInstance() { + ::foundation::UICommandCallbackQueue::instance()->registerCallback([](void *ptr) { + delete reinterpret_cast(ptr); + }, nativeSVGElement); +} + +} // namespace kraken::binding::jsc diff --git a/bridge/bindings/jsc/DOM/elements/svg_element.h b/bridge/bindings/jsc/DOM/elements/svg_element.h new file mode 100644 index 0000000000..8b73327b4e --- /dev/null +++ b/bridge/bindings/jsc/DOM/elements/svg_element.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2020 Alibaba Inc. All rights reserved. + * Author: Kraken Team. + */ + +#ifndef KRAKENBRIDGE_SVG_ELEMENT_H +#define KRAKENBRIDGE_SVG_ELEMENT_H + +#include "bindings/jsc/DOM/element.h" +#include "bindings/jsc/js_context_internal.h" + +namespace kraken::binding::jsc { + +void bindSVGElement(std::unique_ptr &context); + +struct NativeSVGElement; + +class JSSVGElement : public JSElement { +public: + static std::unordered_map instanceMap; + OBJECT_INSTANCE(JSSVGElement) + JSObjectRef instanceConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, + const JSValueRef *arguments, JSValueRef *exception) override; + + class SVGElementInstance : public ElementInstance { + public: + + SVGElementInstance() = delete; + ~SVGElementInstance(); + explicit SVGElementInstance(JSSVGElement *JSSVGElement); + + NativeSVGElement *nativeSVGElement; + + private: + JSStringHolder m_data{context, ""}; + JSStringHolder m_type{context, ""}; + }; +protected: + ~JSSVGElement(); + JSSVGElement() = delete; + explicit JSSVGElement(JSContext *context); +}; + +struct NativeSVGElement { + NativeSVGElement() = delete; + explicit NativeSVGElement(NativeElement *nativeElement) : nativeElement(nativeElement){}; + + NativeElement *nativeElement; +}; + +} // namespace kraken::binding::jsc + +#endif // KRAKENBRIDGE_SVG_ELEMENT_H diff --git a/bridge/bridge_jsc.cc b/bridge/bridge_jsc.cc index f6f31fe642..17fba58a54 100644 --- a/bridge/bridge_jsc.cc +++ b/bridge/bridge_jsc.cc @@ -21,6 +21,7 @@ #include "bindings/jsc/DOM/element.h" #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/event.h" #include "bindings/jsc/DOM/custom_event.h" #include "bindings/jsc/DOM/gesture_event.h" @@ -100,6 +101,7 @@ JSBridge::JSBridge(int32_t contextId, const JSExceptionHandler &handler) : conte bindElement(m_context); bindImageElement(m_context); bindInputElement(m_context); + bindSVGElement(m_context); bindWindow(m_context); bindPerformance(m_context); bindCSSStyleDeclaration(m_context); From 5f1f74dce2081bc9261fe7f893cba8fb356dc919 Mon Sep 17 00:00:00 2001 From: "ranmo.cy" Date: Wed, 19 May 2021 14:05:01 +0800 Subject: [PATCH 2/3] style: modify 2020 to 2021 --- bridge/bindings/jsc/DOM/elements/svg_element.cc | 2 +- bridge/bindings/jsc/DOM/elements/svg_element.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge/bindings/jsc/DOM/elements/svg_element.cc b/bridge/bindings/jsc/DOM/elements/svg_element.cc index 78eab33a69..b49654b3a1 100644 --- a/bridge/bindings/jsc/DOM/elements/svg_element.cc +++ b/bridge/bindings/jsc/DOM/elements/svg_element.cc @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Alibaba Inc. All rights reserved. + * Copyright (C) 2021 Alibaba Inc. All rights reserved. * Author: Kraken Team. */ diff --git a/bridge/bindings/jsc/DOM/elements/svg_element.h b/bridge/bindings/jsc/DOM/elements/svg_element.h index 8b73327b4e..997c29a8f2 100644 --- a/bridge/bindings/jsc/DOM/elements/svg_element.h +++ b/bridge/bindings/jsc/DOM/elements/svg_element.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Alibaba Inc. All rights reserved. + * Copyright (C) 2021 Alibaba Inc. All rights reserved. * Author: Kraken Team. */ From c594232034d3076a8485adb581e6d49c95a7a5e4 Mon Sep 17 00:00:00 2001 From: "ranmo.cy" Date: Wed, 19 May 2021 15:26:30 +0800 Subject: [PATCH 3/3] fix: modify jsAnchorElement to jsSVGElement --- bridge/bindings/jsc/DOM/elements/svg_element.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bridge/bindings/jsc/DOM/elements/svg_element.cc b/bridge/bindings/jsc/DOM/elements/svg_element.cc index b49654b3a1..a03188256b 100644 --- a/bridge/bindings/jsc/DOM/elements/svg_element.cc +++ b/bridge/bindings/jsc/DOM/elements/svg_element.cc @@ -27,8 +27,8 @@ JSObjectRef JSSVGElement::instanceConstructor(JSContextRef ctx, JSObjectRef cons return instance->object; } -JSSVGElement::SVGElementInstance::SVGElementInstance(JSSVGElement *jsAnchorElement) - : ElementInstance(jsAnchorElement, "svg", false), nativeSVGElement(new NativeSVGElement(nativeElement)) { +JSSVGElement::SVGElementInstance::SVGElementInstance(JSSVGElement *jsSVGElement) + : ElementInstance(jsSVGElement, "svg", false), nativeSVGElement(new NativeSVGElement(nativeElement)) { std::string tagName = "svg"; NativeString args_01{}; buildUICommandArgs(tagName, args_01);