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