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, ¶m);
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