1 /*
2 * Copyright (c) 2021-2022 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 "frameworks/bridge/declarative_frontend/engine/functions/js_drag_function.h"
17
18 #include "base/log/log.h"
19 #include "frameworks/bridge/declarative_frontend/jsview/js_utils.h"
20 #include "frameworks/bridge/declarative_frontend/jsview/js_view_register.h"
21
22 #ifdef ENABLE_DRAG_FRAMEWORK
23 #include "js_native_api_types.h"
24 #include "napi/native_api.h"
25 #include "native_engine/native_engine.h"
26 #include "native_engine/native_value.h"
27
28 #include "core/common/udmf/udmf_client.h"
29 #include "frameworks/bridge/common/utils/engine_helper.h"
30 #include "frameworks/bridge/declarative_frontend/engine/js_converter.h"
31 #include "frameworks/bridge/js_frontend/engine/common/js_engine.h"
32 #endif
33
34 namespace OHOS::Ace::Framework {
35 namespace {
36 #ifdef ENABLE_DRAG_FRAMEWORK
NapiThrow(const RefPtr<Framework::JsEngine> & engine,int32_t errCode,const std::string & message)37 void NapiThrow(const RefPtr<Framework::JsEngine>& engine, int32_t errCode, const std::string& message)
38 {
39 NativeEngine* nativeEngine = engine->GetNativeEngine();
40 napi_env env = reinterpret_cast<napi_env>(nativeEngine);
41 napi_value code = nullptr;
42 std::string strCode = std::to_string(errCode);
43 napi_create_string_utf8(env, strCode.c_str(), strCode.length(), &code);
44 napi_value msg = nullptr;
45 napi_create_string_utf8(env, message.c_str(), message.length(), &msg);
46 napi_value error = nullptr;
47 napi_create_error(env, code, msg, &error);
48 napi_throw(env, error);
49 }
50 #endif
51 } // namespace
52
53 class JsPasteData : public Referenced {
54 public:
JSBind(BindingTarget globalObj)55 static void JSBind(BindingTarget globalObj)
56 {
57 JSClass<JsPasteData>::Declare("PasteData");
58 JSClass<JsPasteData>::CustomMethod("setPlainText", &JsPasteData::SetPlainText);
59 JSClass<JsPasteData>::CustomMethod("getPlainText", &JsPasteData::GetPlainText);
60 JSClass<JsPasteData>::Bind(globalObj, &JsPasteData::Constructor, &JsPasteData::Destructor);
61 }
62
SetPlainText(const JSCallbackInfo & args)63 void SetPlainText(const JSCallbackInfo& args)
64 {
65 if (args[0]->IsString()) {
66 pasteData_->SetPlainText(args[0]->ToString());
67 }
68 }
69
GetPlainText(const JSCallbackInfo & args)70 void GetPlainText(const JSCallbackInfo& args)
71 {
72 auto plainText = JSVal(ToJSValue(pasteData_->GetPlainText()));
73 auto plainTextRef = JSRef<JSVal>::Make(plainText);
74 args.SetReturnValue(plainTextRef);
75 }
76
SetPasteData(const RefPtr<PasteData> & pasteData)77 void SetPasteData(const RefPtr<PasteData>& pasteData)
78 {
79 pasteData_ = pasteData;
80 }
81
GetPasteData() const82 RefPtr<PasteData> GetPasteData() const
83 {
84 return pasteData_;
85 }
86
87 private:
Constructor(const JSCallbackInfo & args)88 static void Constructor(const JSCallbackInfo& args)
89 {
90 auto jsPasteData = Referenced::MakeRefPtr<JsPasteData>();
91 jsPasteData->IncRefCount();
92 args.SetReturnValue(Referenced::RawPtr(jsPasteData));
93 }
94
Destructor(JsPasteData * jsPasteData)95 static void Destructor(JsPasteData* jsPasteData)
96 {
97 if (jsPasteData != nullptr) {
98 jsPasteData->DecRefCount();
99 }
100 }
101
102 RefPtr<PasteData> pasteData_;
103 };
104
JSBind(BindingTarget globalObj)105 void JsDragEvent::JSBind(BindingTarget globalObj)
106 {
107 JSClass<JsDragEvent>::Declare("DragEvent");
108 JSClass<JsDragEvent>::CustomMethod("getPasteData", &JsDragEvent::GetJsPasteData);
109 JSClass<JsDragEvent>::CustomMethod("getDisplayX", &JsDragEvent::GetScreenX);
110 JSClass<JsDragEvent>::CustomMethod("getDisplayY", &JsDragEvent::GetScreenY);
111 JSClass<JsDragEvent>::CustomMethod("getWindowX", &JsDragEvent::GetX);
112 JSClass<JsDragEvent>::CustomMethod("getWindowY", &JsDragEvent::GetY);
113 JSClass<JsDragEvent>::CustomMethod("getX", &JsDragEvent::GetX);
114 JSClass<JsDragEvent>::CustomMethod("getY", &JsDragEvent::GetY);
115 JSClass<JsDragEvent>::CustomMethod("getDescription", &JsDragEvent::GetDescription);
116 JSClass<JsDragEvent>::CustomMethod("setDescription", &JsDragEvent::SetDescription);
117 #ifdef ENABLE_DRAG_FRAMEWORK
118 JSClass<JsDragEvent>::CustomMethod("setData", &JsDragEvent::SetData);
119 JSClass<JsDragEvent>::CustomMethod("getData", &JsDragEvent::GetData);
120 JSClass<JsDragEvent>::CustomMethod("getSummary", &JsDragEvent::GetSummary);
121 JSClass<JsDragEvent>::CustomMethod("setResult", &JsDragEvent::SetResult);
122 JSClass<JsDragEvent>::CustomMethod("getResult", &JsDragEvent::GetResult);
123 JSClass<JsDragEvent>::CustomMethod("getPreviewRect", &JsDragEvent::GetPreviewRect);
124 JSClass<JsDragEvent>::CustomProperty(
125 "useCustomDropAnimation", &JsDragEvent::GetUseCustomDropAnimation, &JsDragEvent::SetUseCustomDropAnimation);
126 JSClass<JsDragEvent>::CustomMethod("setDragInfo", &JsDragEvent::SetDragInfo);
127 JSClass<JsDragEvent>::CustomMethod("getDragInfo", &JsDragEvent::GetDragInfo);
128 JSClass<JsDragEvent>::CustomProperty("dragBehavior", &JsDragEvent::GetDragBehavior, &JsDragEvent::SetDragBehavior);
129 #endif
130 JSClass<JsDragEvent>::CustomMethod("getVelocityX", &JsDragEvent::GetVelocityX);
131 JSClass<JsDragEvent>::CustomMethod("getVelocityY", &JsDragEvent::GetVelocityY);
132 JSClass<JsDragEvent>::CustomMethod("getVelocity", &JsDragEvent::GetVelocity);
133 JSClass<JsDragEvent>::Bind(globalObj, &JsDragEvent::Constructor, &JsDragEvent::Destructor);
134 }
135
SetJsPasteData(const JSRef<JSObject> & jsPasteData)136 void JsDragEvent::SetJsPasteData(const JSRef<JSObject>& jsPasteData)
137 {
138 jsPasteData_ = jsPasteData;
139 }
140
GetJsPasteData(const JSCallbackInfo & args)141 void JsDragEvent::GetJsPasteData(const JSCallbackInfo& args)
142 {
143 args.SetReturnValue(jsPasteData_);
144 }
145
GetScreenX(const JSCallbackInfo & args)146 void JsDragEvent::GetScreenX(const JSCallbackInfo& args)
147 {
148 auto xValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetScreenX())));
149 auto xValueRef = JSRef<JSVal>::Make(xValue);
150 args.SetReturnValue(xValueRef);
151 }
152
GetScreenY(const JSCallbackInfo & args)153 void JsDragEvent::GetScreenY(const JSCallbackInfo& args)
154 {
155 auto yValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetScreenY())));
156 auto yValueRef = JSRef<JSVal>::Make(yValue);
157 args.SetReturnValue(yValueRef);
158 }
159
GetX(const JSCallbackInfo & args)160 void JsDragEvent::GetX(const JSCallbackInfo& args)
161 {
162 auto xValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetX())));
163 auto xValueRef = JSRef<JSVal>::Make(xValue);
164 args.SetReturnValue(xValueRef);
165 }
166
GetY(const JSCallbackInfo & args)167 void JsDragEvent::GetY(const JSCallbackInfo& args)
168 {
169 auto yValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetY())));
170 auto yValueRef = JSRef<JSVal>::Make(yValue);
171 args.SetReturnValue(yValueRef);
172 }
173
GetDescription(const JSCallbackInfo & args)174 void JsDragEvent::GetDescription(const JSCallbackInfo& args)
175 {
176 auto description = JSVal(ToJSValue(dragEvent_->GetDescription()));
177 auto descriptionRef = JSRef<JSVal>::Make(description);
178 args.SetReturnValue(descriptionRef);
179 }
180
SetDescription(const JSCallbackInfo & args)181 void JsDragEvent::SetDescription(const JSCallbackInfo& args)
182 {
183 if (args[0]->IsString()) {
184 dragEvent_->SetDescription(args[0]->ToString());
185 }
186 }
187 #ifdef ENABLE_DRAG_FRAMEWORK
SetData(const JSCallbackInfo & args)188 void JsDragEvent::SetData(const JSCallbackInfo& args)
189 {
190 if (!args[0]->IsObject()) {
191 LOGE("info[0] is not an object when try SetData");
192 return;
193 }
194 auto engine = EngineHelper::GetCurrentEngine();
195 CHECK_NULL_VOID(engine);
196 NativeEngine* nativeEngine = engine->GetNativeEngine();
197 panda::Local<JsiValue> value = args[0].Get().GetLocalHandle();
198 JSValueWrapper valueWrapper = value;
199 ScopeRAII scope(nativeEngine->GetScopeManager());
200 NativeValue* nativeValue = nativeEngine->ValueToNativeValue(valueWrapper);
201 RefPtr<UnifiedData> udData = UdmfClient::GetInstance()->TransformUnifiedData(nativeValue);
202 CHECK_NULL_VOID(udData);
203 dragEvent_->SetData(udData);
204 }
205
GetData(const JSCallbackInfo & args)206 void JsDragEvent::GetData(const JSCallbackInfo& args)
207 {
208 auto dragData = dragEvent_->GetData();
209 if (!dragEvent_->IsGetDataSuccess()) {
210 LOGE("UDMF GetData failed in first attempt");
211 std::string udKey = dragEvent_->GetUdKey();
212 if (udKey.empty()) {
213 args.SetReturnValue(JSVal::Undefined());
214 return;
215 }
216 int ret = UdmfClient::GetInstance()->GetData(dragData, udKey);
217 if (ret != 0) {
218 LOGW("UDMF GetData failed: %{public}d", ret);
219 auto engine = EngineHelper::GetCurrentEngine();
220 if (!engine) {
221 args.SetReturnValue(JSVal::Undefined());
222 return;
223 }
224 auto errorInfo = UdmfClient::GetInstance()->GetErrorInfo(ret);
225 NapiThrow(engine, errorInfo.first, errorInfo.second);
226 return;
227 } else {
228 dragEvent_->SetData(dragData);
229 dragEvent_->SetIsGetDataSuccess(true);
230 }
231 }
232 CHECK_NULL_VOID(dragData);
233 NativeValue* nativeValue = UdmfClient::GetInstance()->TransformUdmfUnifiedData(dragData);
234 CHECK_NULL_VOID(nativeValue);
235 auto jsValue = JsConverter::ConvertNativeValueToJsVal(nativeValue);
236 args.SetReturnValue(jsValue);
237 }
238
GetSummary(const JSCallbackInfo & args)239 void JsDragEvent::GetSummary(const JSCallbackInfo& args)
240 {
241 auto engine = EngineHelper::GetCurrentEngine();
242 CHECK_NULL_VOID(engine);
243 auto summary = dragEvent_->GetSummary();
244 NativeValue* nativeValue = UdmfClient::GetInstance()->TransformSummary(summary);
245 CHECK_NULL_VOID(nativeValue);
246 auto jsValue = JsConverter::ConvertNativeValueToJsVal(nativeValue);
247 args.SetReturnValue(jsValue);
248 }
249
SetResult(const JSCallbackInfo & args)250 void JsDragEvent::SetResult(const JSCallbackInfo& args)
251 {
252 if (args[0]->IsNumber()) {
253 auto dragRet = args[0]->ToNumber<int32_t>();
254 dragEvent_->SetResult((DragRet)dragRet);
255 }
256 }
257
GetResult(const JSCallbackInfo & args)258 void JsDragEvent::GetResult(const JSCallbackInfo& args)
259 {
260 auto dragRet = JSVal(ToJSValue(static_cast<int32_t>(dragEvent_->GetResult())));
261 auto dragRetRef = JSRef<JSVal>::Make(dragRet);
262 args.SetReturnValue(dragRetRef);
263 }
264
GetPreviewRect(const JSCallbackInfo & args)265 void JsDragEvent::GetPreviewRect(const JSCallbackInfo& args)
266 {
267 auto rectObj = CreateRectangle(dragEvent_->GetPreviewRect());
268 JSRef<JSVal> previewRect = JSRef<JSObject>::Cast(rectObj);
269 args.SetReturnValue(previewRect);
270 }
271
SetUseCustomDropAnimation(const JSCallbackInfo & args)272 void JsDragEvent::SetUseCustomDropAnimation(const JSCallbackInfo& args)
273 {
274 if (args[0]->IsBoolean()) {
275 dragEvent_->UseCustomAnimation(args[0]->ToBoolean());
276 }
277 }
278
GetUseCustomDropAnimation(const JSCallbackInfo & args)279 void JsDragEvent::GetUseCustomDropAnimation(const JSCallbackInfo& args)
280 {
281 auto useCustomAnimation = JSVal(ToJSValue(dragEvent_->IsUseCustomAnimation()));
282 auto useCustomAnimationRef = JSRef<JSVal>::Make(useCustomAnimation);
283 args.SetReturnValue(useCustomAnimationRef);
284 }
285
SetDragInfo(const JSCallbackInfo & args)286 void JsDragEvent::SetDragInfo(const JSCallbackInfo& args)
287 {
288 if (!args[0]->IsObject()) {
289 LOGE("info[0] is not an object when try SetDragInfo");
290 return;
291 }
292 auto engine = EngineHelper::GetCurrentEngine();
293 CHECK_NULL_VOID(engine);
294 NativeEngine* nativeEngine = engine->GetNativeEngine();
295 panda::Local<JsiValue> value = args[0].Get().GetLocalHandle();
296 JSValueWrapper valueWrapper = value;
297 ScopeRAII scope(nativeEngine->GetScopeManager());
298 NativeValue* nativeValue = nativeEngine->ValueToNativeValue(valueWrapper);
299 RefPtr<UnifiedData> udData = UdmfClient::GetInstance()->TransformUnifiedData(nativeValue);
300 CHECK_NULL_VOID(udData);
301 dragEvent_->SetData(udData);
302 }
303
GetDragInfo(const JSCallbackInfo & args)304 void JsDragEvent::GetDragInfo(const JSCallbackInfo& args)
305 {
306 auto dragData = dragEvent_->GetDragInfo();
307 CHECK_NULL_VOID(dragData);
308 NativeValue* nativeValue = UdmfClient::GetInstance()->TransformUdmfUnifiedData(dragData);
309 CHECK_NULL_VOID(nativeValue);
310 auto jsValue = JsConverter::ConvertNativeValueToJsVal(nativeValue);
311 args.SetReturnValue(jsValue);
312 }
313
SetDragBehavior(const JSCallbackInfo & args)314 void JsDragEvent::SetDragBehavior(const JSCallbackInfo& args)
315 {
316 if (args[0]->IsNumber()) {
317 dragEvent_->SetCopy(!static_cast<bool>(args[0]->ToNumber<int32_t>()));
318 }
319 }
320
GetDragBehavior(const JSCallbackInfo & args)321 void JsDragEvent::GetDragBehavior(const JSCallbackInfo& args)
322 {
323 auto dragBehavior = JSVal(ToJSValue(static_cast<int32_t>(!dragEvent_->IsCopy())));
324 auto dragBehaviorRef = JSRef<JSVal>::Make(dragBehavior);
325 args.SetReturnValue(dragBehaviorRef);
326 }
327 #endif
328
GetVelocityX(const JSCallbackInfo & args)329 void JsDragEvent::GetVelocityX(const JSCallbackInfo& args)
330 {
331 auto jsValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetVelocity().GetVelocityX())));
332 auto jsValueRef = JSRef<JSVal>::Make(jsValue);
333 args.SetReturnValue(jsValueRef);
334 }
335
GetVelocityY(const JSCallbackInfo & args)336 void JsDragEvent::GetVelocityY(const JSCallbackInfo& args)
337 {
338 auto jsValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetVelocity().GetVelocityY())));
339 auto jsValueRef = JSRef<JSVal>::Make(jsValue);
340 args.SetReturnValue(jsValueRef);
341 }
342
GetVelocity(const JSCallbackInfo & args)343 void JsDragEvent::GetVelocity(const JSCallbackInfo& args)
344 {
345 auto jsValue = JSVal(ToJSValue(SystemProperties::Px2Vp(dragEvent_->GetVelocity().GetVelocityValue())));
346 auto jsValueRef = JSRef<JSVal>::Make(jsValue);
347 args.SetReturnValue(jsValueRef);
348 }
349
Constructor(const JSCallbackInfo & args)350 void JsDragEvent::Constructor(const JSCallbackInfo& args)
351 {
352 auto dragEvent = Referenced::MakeRefPtr<JsDragEvent>();
353 dragEvent->IncRefCount();
354 args.SetReturnValue(Referenced::RawPtr(dragEvent));
355 }
356
Destructor(JsDragEvent * dragEvent)357 void JsDragEvent::Destructor(JsDragEvent* dragEvent)
358 {
359 if (dragEvent != nullptr) {
360 dragEvent->DecRefCount();
361 }
362 }
363 #ifdef ENABLE_DRAG_FRAMEWORK
CreateRectangle(const Rect & info)364 JSRef<JSObject> JsDragEvent::CreateRectangle(const Rect& info)
365 {
366 JSRef<JSObject> rectObj = JSRef<JSObject>::New();
367 rectObj->SetProperty<double>("x", SystemProperties::Px2Vp(info.Left()));
368 rectObj->SetProperty<double>("y", SystemProperties::Px2Vp(info.Top()));
369 rectObj->SetProperty<double>("width", SystemProperties::Px2Vp(info.Width()));
370 rectObj->SetProperty<double>("height", SystemProperties::Px2Vp(info.Height()));
371 return rectObj;
372 }
373 #endif
374
JSBind(BindingTarget globalObj)375 void JsDragFunction::JSBind(BindingTarget globalObj)
376 {
377 JsPasteData::JSBind(globalObj);
378 JsDragEvent::JSBind(globalObj);
379 }
380
Execute()381 void JsDragFunction::Execute()
382 {
383 JsFunction::Execute();
384 }
385
Execute(const RefPtr<DragEvent> & info,const std::string & extraParams)386 JSRef<JSVal> JsDragFunction::Execute(const RefPtr<DragEvent>& info, const std::string& extraParams)
387 {
388 JSRef<JSVal> dragInfo = JSRef<JSObject>::Cast(CreateDragEvent(info));
389 JSRef<JSVal> jsonInfo = JSRef<JSVal>::Make(ToJSValue(extraParams));
390 JSRef<JSVal> params[] = { dragInfo, jsonInfo };
391 return JsFunction::ExecuteJS(2, params);
392 }
393
Execute(const RefPtr<DragEvent> & info)394 JSRef<JSVal> JsDragFunction::Execute(const RefPtr<DragEvent>& info)
395 {
396 JSRef<JSVal> dragInfo = JSRef<JSObject>::Cast(CreateDragEvent(info));
397 JSRef<JSVal> params[] = { dragInfo };
398 return JsFunction::ExecuteJS(1, params);
399 }
400
ItemDragStartExecute(const ItemDragInfo & info,int32_t itemIndex)401 JSRef<JSVal> JsDragFunction::ItemDragStartExecute(const ItemDragInfo& info, int32_t itemIndex)
402 {
403 JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
404 JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
405 JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam };
406 return JsFunction::ExecuteJS(2, params);
407 }
408
ItemDragEnterExecute(const ItemDragInfo & info)409 void JsDragFunction::ItemDragEnterExecute(const ItemDragInfo& info)
410 {
411 JSRef<JSObject> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
412 JSRef<JSVal> param = itemDragInfo;
413 JsFunction::ExecuteJS(1, ¶m);
414 }
415
ItemDragMoveExecute(const ItemDragInfo & info,int32_t itemIndex,int32_t insertIndex)416 void JsDragFunction::ItemDragMoveExecute(const ItemDragInfo& info, int32_t itemIndex, int32_t insertIndex)
417 {
418 JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
419 JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
420 JSRef<JSVal> insertIndexParam = JSRef<JSVal>::Make(ToJSValue(insertIndex));
421 JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam, insertIndexParam };
422 JsFunction::ExecuteJS(3, params);
423 }
424
ItemDragLeaveExecute(const ItemDragInfo & info,int32_t itemIndex)425 void JsDragFunction::ItemDragLeaveExecute(const ItemDragInfo& info, int32_t itemIndex)
426 {
427 JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
428 JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
429 JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam };
430 JsFunction::ExecuteJS(2, params);
431 }
432
ItemDropExecute(const ItemDragInfo & info,int32_t itemIndex,int32_t insertIndex,bool isSuccess)433 void JsDragFunction::ItemDropExecute(const ItemDragInfo& info, int32_t itemIndex, int32_t insertIndex, bool isSuccess)
434 {
435 JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
436 JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
437 JSRef<JSVal> insertIndexParam = JSRef<JSVal>::Make(ToJSValue(insertIndex));
438 JSRef<JSVal> isSuccessParam = JSRef<JSVal>::Make(ToJSValue(isSuccess));
439 JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam, insertIndexParam, isSuccessParam };
440 JsFunction::ExecuteJS(4, params);
441 }
442
CreateDragEvent(const RefPtr<DragEvent> & info)443 JSRef<JSObject> JsDragFunction::CreateDragEvent(const RefPtr<DragEvent>& info)
444 {
445 JSRef<JSObject> dragObj = JSClass<JsDragEvent>::NewInstance();
446 auto dragEvent = Referenced::Claim(dragObj->Unwrap<JsDragEvent>());
447 dragEvent->SetDragEvent(info);
448 auto pasteDataInfo = dragEvent->GetDragEvent()->GetPasteData();
449 JSRef<JSObject> pasteData = CreatePasteData(pasteDataInfo);
450 dragEvent->SetJsPasteData(pasteData);
451 return dragObj;
452 }
453
CreatePasteData(const RefPtr<PasteData> & info)454 JSRef<JSObject> JsDragFunction::CreatePasteData(const RefPtr<PasteData>& info)
455 {
456 JSRef<JSObject> pasteObj = JSClass<JsPasteData>::NewInstance();
457 auto pasteData = Referenced::Claim(pasteObj->Unwrap<JsPasteData>());
458 pasteData->SetPasteData(info);
459 return pasteObj;
460 }
461
CreateItemDragInfo(const ItemDragInfo & info)462 JSRef<JSObject> JsDragFunction::CreateItemDragInfo(const ItemDragInfo& info)
463 {
464 JSRef<JSObject> itemDragInfoObj = JSRef<JSObject>::New();
465 itemDragInfoObj->SetProperty<double>("x", SystemProperties::Px2Vp(info.GetX()));
466 itemDragInfoObj->SetProperty<double>("y", SystemProperties::Px2Vp(info.GetY()));
467 return itemDragInfoObj;
468 }
469
470 } // namespace OHOS::Ace::Framework
471