• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_xcomponent_node_bridge.h"
17 
18 #include "bridge/declarative_frontend/jsview/js_xcomponent.h"
19 namespace OHOS::Ace::NG {
20 
Create(ArkUIRuntimeCallInfo * runtimeCallInfo)21 ArkUINativeModuleValue XComponentNodeBridge::Create(ArkUIRuntimeCallInfo* runtimeCallInfo)
22 {
23     EcmaVM* vm = runtimeCallInfo->GetVM();
24     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
25 
26     Framework::XComponentParams params;
27     // elmtId
28     Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(0);
29     if (arg->IsNumber()) {
30         params.elmtId = arg->Int32Value(vm);
31     }
32     // xcomponent id
33     arg = runtimeCallInfo->GetCallArgRef(1);
34     if (arg->IsString()) {
35         params.xcomponentId = arg->ToString(vm)->ToString();
36     }
37     // xcomponentType
38     arg = runtimeCallInfo->GetCallArgRef(2);
39     if (arg->IsNumber()) {
40         params.xcomponentType = arg->Int32Value(vm);
41     }
42     // renderType
43     arg = runtimeCallInfo->GetCallArgRef(3);
44     if (arg->IsNumber()) {
45         params.renderType = arg->Int32Value(vm);
46     }
47     // surfaceId
48     arg = runtimeCallInfo->GetCallArgRef(4);
49     if (arg->IsString()) {
50         params.surfaceId = arg->ToString(vm)->ToString();
51     }
52     // selfIdealWidth
53     arg = runtimeCallInfo->GetCallArgRef(5);
54     if (arg->IsNumber()) {
55         params.width = arg->Int32Value(vm);
56     }
57     // selfIdealHeight
58     arg = runtimeCallInfo->GetCallArgRef(6);
59     if (arg->IsNumber()) {
60         params.height = arg->Int32Value(vm);
61     }
62     // libraryname
63     arg = runtimeCallInfo->GetCallArgRef(7);
64     if (arg->IsString()) {
65         params.libraryName = arg->ToString(vm)->ToString();
66     }
67 
68     void* jsXComponent = Framework::JSXComponent::Create(params);
69     auto nativeModule = panda::NativePointerRef::New(
70         vm, reinterpret_cast<void*>(jsXComponent),
71         [](void* data, [[maybe_unused]] void* hint) {
72             auto* jsXComponent = reinterpret_cast<Framework::JSXComponent*>(data);
73             if (jsXComponent) {
74                 delete jsXComponent;
75                 jsXComponent = nullptr;
76             }
77         },
78         reinterpret_cast<void*>(jsXComponent), sizeof(void*));
79     return nativeModule;
80 }
81 
GetFrameNode(ArkUIRuntimeCallInfo * runtimeCallInfo)82 ArkUINativeModuleValue XComponentNodeBridge::GetFrameNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
83 {
84     EcmaVM* vm = runtimeCallInfo->GetVM();
85     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
86     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
87     Framework::JSXComponent* jsXComponent =
88         reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
89     if (jsXComponent) {
90         auto frameNode = jsXComponent->GetFrameNode();
91         auto nativeModule = panda::NativePointerRef::New(vm, reinterpret_cast<void*>(AceType::RawPtr(frameNode)));
92         return nativeModule;
93     }
94     return panda::JSValueRef::Undefined(vm);
95 }
96 
RegisterOnCreateCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)97 ArkUINativeModuleValue XComponentNodeBridge::RegisterOnCreateCallback(ArkUIRuntimeCallInfo* runtimeCallInfo)
98 {
99     EcmaVM* vm = runtimeCallInfo->GetVM();
100     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
101     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
102     Framework::JSXComponent* jsXComponent =
103         reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
104     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
105     if (jsXComponent && secondArg->IsFunction()) {
106         Framework::JsiExecutionContext execCtx = { vm };
107         jsXComponent->RegisterOnCreate(execCtx, secondArg);
108     }
109     return panda::JSValueRef::Undefined(vm);
110 }
111 
RegisterOnDestroyCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue XComponentNodeBridge::RegisterOnDestroyCallback(ArkUIRuntimeCallInfo* runtimeCallInfo)
113 {
114     EcmaVM* vm = runtimeCallInfo->GetVM();
115     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
116     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
117     Framework::JSXComponent* jsXComponent =
118         reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
119     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
120     if (jsXComponent && secondArg->IsFunction()) {
121         Framework::JsiExecutionContext execCtx = { vm };
122         jsXComponent->RegisterOnDestroy(execCtx, secondArg);
123     }
124     return panda::JSValueRef::Undefined(vm);
125 }
126 
ChangeRenderType(ArkUIRuntimeCallInfo * runtimeCallInfo)127 ArkUINativeModuleValue XComponentNodeBridge::ChangeRenderType(ArkUIRuntimeCallInfo* runtimeCallInfo)
128 {
129     EcmaVM* vm = runtimeCallInfo->GetVM();
130     auto defaultNativeModule = panda::BooleanRef::New(vm, false);
131     CHECK_NULL_RETURN(vm, defaultNativeModule);
132     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
133     Framework::JSXComponent* jsXComponent =
134         reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
135     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
136     if (jsXComponent && secondArg->IsNumber()) {
137         auto ret = jsXComponent->ChangeRenderType(secondArg->Int32Value(vm));
138         auto nativeModule = panda::BooleanRef::New(vm, ret);
139         return nativeModule;
140     }
141     return defaultNativeModule;
142 }
143 } // namespace OHOS::Ace::NG
144