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/js_frontend/js_frontend.h"
17
18 #include "base/log/dump_log.h"
19 #include "base/log/event_report.h"
20
21 namespace OHOS::Ace {
22 namespace {
23
TouchInfoToString(const BaseEventInfo & info,std::string & eventParam)24 void TouchInfoToString(const BaseEventInfo& info, std::string& eventParam)
25 {
26 eventParam.append("{\"touches\":[");
27 const auto touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
28 if (touchInfo) {
29 auto touchList = touchInfo->GetTouches();
30 for (const auto& location : touchList) {
31 eventParam.append("{");
32 auto globalLocation = location.GetGlobalLocation();
33 eventParam.append("\"globalX\":")
34 .append(std::to_string(globalLocation.GetX()))
35 .append(",\"globalY\":")
36 .append(std::to_string(globalLocation.GetY()))
37 .append(",");
38 auto localLocation = location.GetLocalLocation();
39 eventParam.append("\"localX\":")
40 .append(std::to_string(localLocation.GetX()))
41 .append(",\"localY\":")
42 .append(std::to_string(localLocation.GetY()))
43 .append(",");
44 eventParam.append("\"size\":").append(std::to_string(location.GetSize())).append(",");
45 eventParam.append("\"identifier\":").append(std::to_string(location.GetFingerId())).append(",");
46 eventParam.append("\"force\":").append(std::to_string(location.GetForce())).append("},");
47 }
48 if (eventParam.back() == ',') {
49 eventParam.pop_back();
50 }
51 eventParam.append("],");
52 eventParam.append("\"deviceId\":").append(std::to_string(touchInfo->GetDeviceId())).append(",");
53 eventParam.append("\"changedTouches\":[");
54 auto changeTouch = touchInfo->GetChangedTouches();
55 for (const auto& change : changeTouch) {
56 eventParam.append("{");
57 auto globalLocation = change.GetGlobalLocation();
58 eventParam.append("\"globalX\":")
59 .append(std::to_string(globalLocation.GetX()))
60 .append(",\"globalY\":")
61 .append(std::to_string(globalLocation.GetY()))
62 .append(",");
63 auto localLocation = change.GetLocalLocation();
64 eventParam.append("\"localX\":")
65 .append(std::to_string(localLocation.GetX()))
66 .append(",\"localY\":")
67 .append(std::to_string(localLocation.GetY()))
68 .append(",");
69 eventParam.append("\"size\":").append(std::to_string(change.GetSize())).append(",");
70 eventParam.append("\"identifier\":").append(std::to_string(change.GetFingerId())).append(",");
71 eventParam.append("\"force\":").append(std::to_string(change.GetForce())).append("},");
72 }
73 if (eventParam.back() == ',') {
74 eventParam.pop_back();
75 }
76 eventParam.append("]");
77 }
78 eventParam.append("}");
79 }
80
DragStartInfoToString(const BaseEventInfo & info,std::string & eventParam)81 void DragStartInfoToString(const BaseEventInfo& info, std::string& eventParam)
82 {
83 eventParam.append("{");
84 const auto touchInfo = TypeInfoHelper::DynamicCast<DragStartInfo>(&info);
85 if (touchInfo) {
86 auto globalLocation = touchInfo->GetGlobalLocation();
87 eventParam.append("\"globalX\":")
88 .append(std::to_string(globalLocation.GetX()))
89 .append(",\"globalY\":")
90 .append(std::to_string(globalLocation.GetY()));
91 }
92 eventParam.append("}");
93 }
94
DragUpdateInfoToString(const BaseEventInfo & info,std::string & eventParam)95 void DragUpdateInfoToString(const BaseEventInfo& info, std::string& eventParam)
96 {
97 eventParam.append("{");
98 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
99 if (touchInfo) {
100 auto globalLocation = touchInfo->GetGlobalLocation();
101 eventParam.append("\"globalX\":")
102 .append(std::to_string(globalLocation.GetX()))
103 .append(",\"globalY\":")
104 .append(std::to_string(globalLocation.GetY()));
105 }
106 eventParam.append("}");
107 }
108
DragEnterInfoToString(const BaseEventInfo & info,std::string & eventParam)109 void DragEnterInfoToString(const BaseEventInfo& info, std::string& eventParam)
110 {
111 eventParam.append("{");
112 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
113 if (touchInfo) {
114 auto globalLocation = touchInfo->GetGlobalLocation();
115 eventParam.append("\"globalX\":")
116 .append(std::to_string(globalLocation.GetX()))
117 .append(",\"globalY\":")
118 .append(std::to_string(globalLocation.GetY()));
119 }
120 eventParam.append("}");
121 }
122
DragOverInfoToString(const BaseEventInfo & info,std::string & eventParam)123 void DragOverInfoToString(const BaseEventInfo& info, std::string& eventParam)
124 {
125 eventParam.append("{");
126 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
127 if (touchInfo) {
128 auto globalLocation = touchInfo->GetGlobalLocation();
129 eventParam.append("\"globalX\":")
130 .append(std::to_string(globalLocation.GetX()))
131 .append(",\"globalY\":")
132 .append(std::to_string(globalLocation.GetY()));
133 }
134 eventParam.append("}");
135 }
136
DragLeaveInfoToString(const BaseEventInfo & info,std::string & eventParam)137 void DragLeaveInfoToString(const BaseEventInfo& info, std::string& eventParam)
138 {
139 eventParam.append("{");
140 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
141 if (touchInfo) {
142 auto globalLocation = touchInfo->GetGlobalLocation();
143 eventParam.append("\"globalX\":")
144 .append(std::to_string(globalLocation.GetX()))
145 .append(",\"globalY\":")
146 .append(std::to_string(globalLocation.GetY()));
147 }
148 eventParam.append("}");
149 }
150
DragDropInfoToString(const BaseEventInfo & info,std::string & eventParam)151 void DragDropInfoToString(const BaseEventInfo& info, std::string& eventParam)
152 {
153 eventParam.append("{");
154 const auto touchInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
155 if (touchInfo) {
156 auto globalLocation = touchInfo->GetGlobalLocation();
157 eventParam.append("\"globalX\":")
158 .append(std::to_string(globalLocation.GetX()))
159 .append(",\"globalY\":")
160 .append(std::to_string(globalLocation.GetY()));
161 }
162 eventParam.append("}");
163 }
164
DragEndInfoToString(const BaseEventInfo & info,std::string & eventParam)165 void DragEndInfoToString(const BaseEventInfo& info, std::string& eventParam)
166 {
167 eventParam.append("{");
168 const auto touchInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
169 if (touchInfo) {
170 auto globalLocation = touchInfo->GetGlobalLocation();
171 eventParam.append("\"globalX\":")
172 .append(std::to_string(globalLocation.GetX()))
173 .append(",\"globalY\":")
174 .append(std::to_string(globalLocation.GetY()));
175 }
176 eventParam.append("}");
177 }
178
MouseInfoToString(const BaseEventInfo & info,std::string & eventParam)179 void MouseInfoToString(const BaseEventInfo& info, std::string& eventParam)
180 {
181 const auto mouseInfo = TypeInfoHelper::DynamicCast<MouseEventInfo>(&info);
182 eventParam.append("{\"mouse\":{");
183 if (mouseInfo) {
184 auto globalMouse = mouseInfo->GetGlobalMouse();
185 eventParam.append("\"globalX\":")
186 .append(std::to_string(globalMouse.x))
187 .append(",\"globalY\":")
188 .append(std::to_string(globalMouse.y))
189 .append(",\"globalZ\":")
190 .append(std::to_string(globalMouse.z))
191 .append(",\"localX\":")
192 .append(std::to_string(globalMouse.x))
193 .append(",\"localY\":")
194 .append(std::to_string(globalMouse.y))
195 .append(",\"localZ\":")
196 .append(std::to_string(globalMouse.z))
197 .append(",\"deltaX\":")
198 .append(std::to_string(globalMouse.deltaX))
199 .append(",\"deltaY\":")
200 .append(std::to_string(globalMouse.deltaY))
201 .append(",\"deltaZ\":")
202 .append(std::to_string(globalMouse.deltaZ))
203 .append(",\"scrollX\":")
204 .append(std::to_string(globalMouse.scrollX))
205 .append(",\"scrollY\":")
206 .append(std::to_string(globalMouse.scrollY))
207 .append(",\"scrollZ\":")
208 .append(std::to_string(globalMouse.scrollZ))
209 .append(",\"action\":")
210 .append(std::to_string(static_cast<int32_t>(globalMouse.action)))
211 .append(",\"button\":")
212 .append(std::to_string(static_cast<int32_t>(globalMouse.button)))
213 .append(",\"pressedButtons\":")
214 .append(std::to_string(globalMouse.pressedButtons))
215 .append("},")
216 .append("\"deviceId\":")
217 .append(std::to_string(mouseInfo->GetDeviceId()))
218 .append("}");
219 } else {
220 eventParam.append("}}");
221 }
222 }
223
SwipeInfoToString(const BaseEventInfo & info,std::string & eventParam)224 void SwipeInfoToString(const BaseEventInfo& info, std::string& eventParam)
225 {
226 const auto& swipeInfo = TypeInfoHelper::DynamicCast<SwipeEventInfo>(&info);
227 if (swipeInfo != nullptr) {
228 eventParam = swipeInfo->ToJsonParamInfo();
229 }
230 }
231
232 } // namespace
233
Create()234 RefPtr<Frontend> Frontend::Create()
235 {
236 return AceType::MakeRefPtr<JsFrontend>();
237 }
238
~JsFrontend()239 JsFrontend::~JsFrontend() noexcept
240 {
241 LOG_DESTROY();
242 }
243
Destroy()244 void JsFrontend::Destroy()
245 {
246 CHECK_RUN_ON(JS);
247 LOGI("JsFrontend Destroy begin.");
248 // To guarantee the jsEngine_ and delegate_ released in js thread
249 delegate_.Reset();
250 handler_.Reset();
251 jsEngine_.Reset();
252 LOGI("JsFrontend Destroy end.");
253 }
254
Initialize(FrontendType type,const RefPtr<TaskExecutor> & taskExecutor)255 bool JsFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
256 {
257 LOGI("JsFrontend initialize begin.");
258 type_ = type;
259 taskExecutor_ = taskExecutor;
260 ACE_DCHECK(type_ == FrontendType::JS);
261 InitializeFrontendDelegate(taskExecutor);
262 auto weakEngine = AceType::WeakClaim(AceType::RawPtr(jsEngine_));
263 auto weakDelegate = AceType::WeakClaim(AceType::RawPtr(delegate_));
264 taskExecutor->PostTask(
265 [weakEngine, weakDelegate] {
266 auto jsEngine = weakEngine.Upgrade();
267 if (!jsEngine) {
268 return;
269 }
270 jsEngine->Initialize(weakDelegate.Upgrade());
271 },
272 TaskExecutor::TaskType::JS, "ArkUIInitJsEngine");
273 LOGI("JsFrontend initialize end.");
274 return true;
275 }
276
AttachPipelineContext(const RefPtr<PipelineBase> & context)277 void JsFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
278 {
279 if (!delegate_) {
280 return;
281 }
282 handler_ = AceType::MakeRefPtr<JsEventHandler>(delegate_);
283 auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
284 if (pipelineContext) {
285 pipelineContext->RegisterEventHandler(handler_);
286 }
287 delegate_->AttachPipelineContext(context);
288 }
289
SetAssetManager(const RefPtr<AssetManager> & assetManager)290 void JsFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
291 {
292 if (delegate_) {
293 delegate_->SetAssetManager(assetManager);
294 }
295 }
296
InitializeFrontendDelegate(const RefPtr<TaskExecutor> & taskExecutor)297 void JsFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
298 {
299 Framework::FrontendDelegateImplBuilder builder;
300 builder.loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
301 const std::string& url, const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
302 auto jsEngine = weakEngine.Upgrade();
303 if (!jsEngine) {
304 return;
305 }
306 jsEngine->LoadJs(url, jsPage, isMainPage);
307 };
308
309 builder.transferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
310 const RefPtr<JsMessageDispatcher>& dispatcher) {
311 auto jsEngine = weakEngine.Upgrade();
312 if (!jsEngine) {
313 return;
314 }
315 jsEngine->SetJsMessageDispatcher(dispatcher);
316 };
317
318 builder.asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
319 const std::string& eventId, const std::string& param) {
320 auto jsEngine = weakEngine.Upgrade();
321 if (!jsEngine) {
322 return;
323 }
324 jsEngine->FireAsyncEvent(eventId, param);
325 };
326
327 builder.syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
328 const std::string& eventId, const std::string& param) {
329 auto jsEngine = weakEngine.Upgrade();
330 if (!jsEngine) {
331 return;
332 }
333 jsEngine->FireSyncEvent(eventId, param);
334 };
335
336 builder.externalEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
337 const std::string& componentId, const uint32_t nodeId, const bool isDestroy) {
338 auto jsEngine = weakEngine.Upgrade();
339 if (!jsEngine) {
340 return;
341 }
342 jsEngine->FireExternalEvent(componentId, nodeId, isDestroy);
343 };
344
345 builder.updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
346 const RefPtr<Framework::JsAcePage>& jsPage) {
347 auto jsEngine = weakEngine.Upgrade();
348 if (!jsEngine) {
349 return;
350 }
351 jsEngine->UpdateRunningPage(jsPage);
352 jsEngine->UpdateStagingPage(jsPage);
353 };
354
355 builder.resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
356 auto jsEngine = weakEngine.Upgrade();
357 if (!jsEngine) {
358 return;
359 }
360 jsEngine->ResetStagingPage();
361 };
362
363 builder.destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
364 auto jsEngine = weakEngine.Upgrade();
365 if (!jsEngine) {
366 return;
367 }
368 jsEngine->DestroyPageInstance(pageId);
369 };
370
371 builder.destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
372 const std::string& packageName) {
373 auto jsEngine = weakEngine.Upgrade();
374 if (!jsEngine) {
375 return;
376 }
377 jsEngine->DestroyApplication(packageName);
378 };
379
380 builder.updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
381 const std::string& packageName, Frontend::State state) {
382 auto jsEngine = weakEngine.Upgrade();
383 if (!jsEngine) {
384 return;
385 }
386 jsEngine->UpdateApplicationState(packageName, state);
387 };
388
389 builder.onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
390 auto jsEngine = weakEngine.Upgrade();
391 if (!jsEngine) {
392 return false;
393 }
394 return jsEngine->OnStartContinuation();
395 };
396
397 builder.onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
398 auto jsEngine = weakEngine.Upgrade();
399 if (!jsEngine) {
400 return;
401 }
402 jsEngine->OnCompleteContinuation(code);
403 };
404
405 builder.onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
406 auto jsEngine = weakEngine.Upgrade();
407 if (!jsEngine) {
408 return;
409 }
410 jsEngine->OnRemoteTerminated();
411 };
412
413 builder.onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
414 auto jsEngine = weakEngine.Upgrade();
415 if (!jsEngine) {
416 return;
417 }
418 jsEngine->OnSaveData(savedData);
419 };
420
421 builder.onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
422 const std::string& data) -> bool {
423 auto jsEngine = weakEngine.Upgrade();
424 if (!jsEngine) {
425 return false;
426 }
427 return jsEngine->OnRestoreData(data);
428 };
429
430 builder.timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
431 const std::string& callbackId, const std::string& delay, bool isInterval) {
432 auto jsEngine = weakEngine.Upgrade();
433 if (!jsEngine) {
434 return;
435 }
436 jsEngine->TimerCallback(callbackId, delay, isInterval);
437 };
438
439 builder.mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
440 const std::string& callbackId, const std::string& args) {
441 auto jsEngine = weakEngine.Upgrade();
442 if (!jsEngine) {
443 return;
444 }
445 jsEngine->MediaQueryCallback(callbackId, args);
446 };
447
448 builder.requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
449 const std::string& callbackId, uint64_t timeStamp) {
450 auto jsEngine = weakEngine.Upgrade();
451 if (!jsEngine) {
452 return;
453 }
454 jsEngine->RequestAnimationCallback(callbackId, timeStamp);
455 };
456
457 builder.jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
458 const std::string& callbackId, const std::string& args) {
459 auto jsEngine = weakEngine.Upgrade();
460 if (!jsEngine) {
461 return;
462 }
463 jsEngine->JsCallback(callbackId, args);
464 };
465
466 builder.callNativeHandler = [this](const std::string& event, const std::string& params) {
467 if (dialogCallback_ != nullptr) {
468 dialogCallback_(event, params);
469 }
470 };
471
472 builder.taskExecutor = taskExecutor;
473 delegate_ = AceType::MakeRefPtr<Framework::FrontendDelegateImpl>(builder);
474 if (disallowPopLastPage_) {
475 delegate_->DisallowPopLastPage();
476 }
477 if (jsEngine_) {
478 delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
479 } else {
480 LOGE("the js engine is nullptr");
481 EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
482 }
483 }
484
RunPage(const std::string & url,const std::string & params)485 UIContentErrorCode JsFrontend::RunPage(const std::string& url, const std::string& params)
486 {
487 // Not use this pageId from backend, manage it in FrontendDelegateImpl.
488 if (delegate_) {
489 return delegate_->RunPage(url, params);
490 }
491
492 return UIContentErrorCode::NULL_POINTER;
493 }
494
PushPage(const std::string & url,const std::string & params)495 void JsFrontend::PushPage(const std::string& url, const std::string& params)
496 {
497 if (delegate_) {
498 delegate_->Push(url, params);
499 }
500 }
501
ReplacePage(const std::string & url,const std::string & params)502 void JsFrontend::ReplacePage(const std::string& url, const std::string& params)
503 {
504 if (delegate_) {
505 delegate_->Replace(url, params);
506 }
507 }
508
SendCallbackMessage(const std::string & callbackId,const std::string & data) const509 void JsFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
510 {
511 if (delegate_) {
512 delegate_->OnJsCallback(callbackId, data);
513 }
514 }
515
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const516 void JsFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
517 {
518 if (delegate_) {
519 delegate_->SetJsMessageDispatcher(dispatcher);
520 }
521 }
522
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const523 void JsFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
524 {
525 if (delegate_) {
526 delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
527 }
528 }
529
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const530 void JsFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
531 {
532 if (delegate_) {
533 delegate_->TransferJsResponseData(callbackId, code, std::move(data));
534 }
535 }
536
537 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const538 void JsFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
539 {
540 if (delegate_) {
541 delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
542 }
543 }
544 #endif
545
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const546 void JsFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
547 {
548 if (delegate_) {
549 delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
550 }
551 }
552
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const553 void JsFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
554 {
555 if (delegate_) {
556 delegate_->TransferJsEventData(callbackId, code, std::move(data));
557 }
558 }
559
LoadPluginJsCode(std::string && jsCode) const560 void JsFrontend::LoadPluginJsCode(std::string&& jsCode) const
561 {
562 if (delegate_) {
563 delegate_->LoadPluginJsCode(std::move(jsCode));
564 }
565 }
566
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const567 void JsFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
568 {
569 if (delegate_) {
570 delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
571 }
572 }
573
UpdateState(Frontend::State state)574 void JsFrontend::UpdateState(Frontend::State state)
575 {
576 if (!delegate_) {
577 return;
578 }
579 switch (state) {
580 case Frontend::State::ON_CREATE:
581 break;
582 case Frontend::State::ON_DESTROY:
583 LOGI("UpdateState ON_DESTROY");
584 delegate_->OnApplicationDestroy(delegate_->GetAppID());
585 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_DESTROY);
586 break;
587 case Frontend::State::ON_SHOW:
588 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_SHOW);
589 break;
590 case Frontend::State::ON_HIDE:
591 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_HIDE);
592 break;
593 default:
594 LOGE("error State: %d", state);
595 break;
596 }
597 }
598
GetAccessibilityManager() const599 RefPtr<AccessibilityManager> JsFrontend::GetAccessibilityManager() const
600 {
601 if (!delegate_) {
602 return nullptr;
603 }
604 return delegate_->GetJsAccessibilityManager();
605 }
606
GetWindowConfig()607 WindowConfig& JsFrontend::GetWindowConfig()
608 {
609 if (!delegate_) {
610 static WindowConfig windowConfig;
611 LOGW("delegate is null, return default config");
612 return windowConfig;
613 }
614 return delegate_->GetWindowConfig();
615 }
616
OnBackPressed()617 bool JsFrontend::OnBackPressed()
618 {
619 if (!delegate_) {
620 LOGW("delegate is null, return false");
621 return false;
622 }
623 return delegate_->OnPageBackPress();
624 }
625
OnShow()626 void JsFrontend::OnShow()
627 {
628 if (delegate_) {
629 delegate_->OnForeground();
630 foregroundFrontend_ = true;
631 }
632 }
633
OnHide()634 void JsFrontend::OnHide()
635 {
636 if (delegate_) {
637 delegate_->OnBackGround();
638 foregroundFrontend_ = false;
639 }
640 }
641
OnConfigurationUpdated(const std::string & data)642 void JsFrontend::OnConfigurationUpdated(const std::string& data)
643 {
644 if (delegate_) {
645 delegate_->OnConfigurationUpdated(data);
646 }
647 }
648
OnActive()649 void JsFrontend::OnActive()
650 {
651 if (delegate_) {
652 delegate_->InitializeAccessibilityCallback();
653 delegate_->OnActive();
654 }
655 }
656
OnInactive()657 void JsFrontend::OnInactive()
658 {
659 if (delegate_) {
660 delegate_->OnInactive();
661 }
662 }
663
OnStartContinuation()664 bool JsFrontend::OnStartContinuation()
665 {
666 if (!delegate_) {
667 LOGW("delegate is null, return false");
668 return false;
669 }
670 return delegate_->OnStartContinuation();
671 }
672
OnCompleteContinuation(int32_t code)673 void JsFrontend::OnCompleteContinuation(int32_t code)
674 {
675 if (delegate_) {
676 delegate_->OnCompleteContinuation(code);
677 }
678 }
679
OnRemoteTerminated()680 void JsFrontend::OnRemoteTerminated()
681 {
682 if (delegate_) {
683 delegate_->OnRemoteTerminated();
684 }
685 }
686
OnSaveData(std::string & data)687 void JsFrontend::OnSaveData(std::string& data)
688 {
689 if (delegate_) {
690 delegate_->OnSaveData(data);
691 }
692 }
693
OnRestoreData(const std::string & data)694 bool JsFrontend::OnRestoreData(const std::string& data)
695 {
696 if (!delegate_) {
697 LOGW("delegate is null, return false");
698 return false;
699 }
700 return delegate_->OnRestoreData(data);
701 }
702
OnNewRequest(const std::string & data)703 void JsFrontend::OnNewRequest(const std::string& data)
704 {
705 if (delegate_) {
706 delegate_->OnNewRequest(data);
707 }
708 }
709
CallRouterBack()710 void JsFrontend::CallRouterBack()
711 {
712 if (delegate_) {
713 delegate_->CallPopPage();
714 }
715 }
716
OnSurfaceChanged(int32_t width,int32_t height)717 void JsFrontend::OnSurfaceChanged(int32_t width, int32_t height)
718 {
719 if (delegate_) {
720 delegate_->OnSurfaceChanged();
721 }
722 }
723
OnLayoutCompleted(const std::string & componentId)724 void JsFrontend::OnLayoutCompleted(const std::string& componentId)
725 {
726 if (delegate_) {
727 delegate_->OnLayoutCompleted(componentId);
728 }
729 }
730
OnDrawCompleted(const std::string & componentId)731 void JsFrontend::OnDrawCompleted(const std::string& componentId)
732 {
733 if (delegate_) {
734 delegate_->OnDrawCompleted(componentId);
735 }
736 }
737
DumpFrontend() const738 void JsFrontend::DumpFrontend() const
739 {
740 int32_t routerIndex = 0;
741 std::string routerName;
742 std::string routerPath;
743 if (!delegate_) {
744 return;
745 }
746 delegate_->GetState(routerIndex, routerName, routerPath);
747
748 if (DumpLog::GetInstance().GetDumpFile()) {
749 DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
750 DumpLog::GetInstance().AddDesc("Path: " + routerPath);
751 DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
752 DumpLog::GetInstance().Print(0, routerName, 0);
753 }
754 }
755
GetPagePath() const756 std::string JsFrontend::GetPagePath() const
757 {
758 if (!delegate_) {
759 return "";
760 }
761 int32_t routerIndex = 0;
762 std::string routerName;
763 std::string routerPath;
764 delegate_->GetState(routerIndex, routerName, routerPath);
765 return routerPath + routerName;
766 }
767
TriggerGarbageCollection()768 void JsFrontend::TriggerGarbageCollection()
769 {
770 if (jsEngine_) {
771 jsEngine_->RunGarbageCollection();
772 }
773 }
774
DumpHeapSnapshot(bool isPrivate)775 void JsFrontend::DumpHeapSnapshot(bool isPrivate)
776 {
777 if (jsEngine_) {
778 jsEngine_->DumpHeapSnapshot(isPrivate);
779 }
780 }
781
DestroyHeapProfiler()782 void JsFrontend::DestroyHeapProfiler()
783 {
784 if (jsEngine_) {
785 jsEngine_->DestroyHeapProfiler();
786 }
787 }
788
ForceFullGC()789 void JsFrontend::ForceFullGC()
790 {
791 if (jsEngine_) {
792 jsEngine_->ForceFullGC();
793 }
794 }
795
NotifyUIIdle()796 void JsFrontend::NotifyUIIdle()
797 {
798 if (jsEngine_) {
799 jsEngine_->NotifyUIIdle();
800 }
801 }
802
RebuildAllPages()803 void JsFrontend::RebuildAllPages()
804 {
805 if (delegate_) {
806 delegate_->RebuildAllPages();
807 }
808 }
809
GetPluginsUsed(std::string & data)810 void JsFrontend::GetPluginsUsed(std::string& data)
811 {
812 if (!delegate_) {
813 LOGW("delegate hasn't initialized, load all system plugin");
814 return;
815 }
816
817 if (!delegate_->GetAssetContent("module_collection.txt", data)) {
818 LOGW("read failed, will load all the system plugin");
819 }
820 }
821
SetColorMode(ColorMode colorMode)822 void JsFrontend::SetColorMode(ColorMode colorMode)
823 {
824 if (delegate_) {
825 delegate_->SetColorMode(colorMode);
826 }
827 }
828
HandleAsyncEvent(const EventMarker & eventMarker)829 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
830 {
831 std::string param = eventMarker.GetData().GetEventParam();
832 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
833
834 AccessibilityEvent accessibilityEvent;
835 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
836 accessibilityEvent.eventType = eventMarker.GetData().eventType;
837 delegate_->FireAccessibilityEvent(accessibilityEvent);
838 }
839
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)840 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
841 {
842 std::string eventParam;
843 if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
844 TouchInfoToString(info, eventParam);
845 } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
846 MouseInfoToString(info, eventParam);
847 } else if (eventMarker.GetData().eventType == "swipe") {
848 SwipeInfoToString(info, eventParam);
849 } else if (eventMarker.GetData().eventType == "dragstart") {
850 DragStartInfoToString(info, eventParam);
851 } else if (eventMarker.GetData().eventType == "drag") {
852 DragUpdateInfoToString(info, eventParam);
853 } else if (eventMarker.GetData().eventType == "dragend") {
854 DragEndInfoToString(info, eventParam);
855 } else if (eventMarker.GetData().eventType == "dragenter") {
856 DragEnterInfoToString(info, eventParam);
857 } else if (eventMarker.GetData().eventType == "dragover") {
858 DragOverInfoToString(info, eventParam);
859 } else if (eventMarker.GetData().eventType == "dragleave") {
860 DragLeaveInfoToString(info, eventParam);
861 } else if (eventMarker.GetData().eventType == "drop") {
862 DragDropInfoToString(info, eventParam);
863 }
864 std::string param;
865 auto adapter = TypeInfoHelper::DynamicCast<EventToJSONStringAdapter>(&info);
866 if (adapter) {
867 param = adapter->ToJSONString();
868 } else {
869 param = eventMarker.GetData().GetEventParam();
870 if (eventParam.empty()) {
871 param.append("null");
872 } else {
873 param.append(eventParam);
874 }
875 }
876 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
877
878 AccessibilityEvent accessibilityEvent;
879 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
880 accessibilityEvent.eventType = eventMarker.GetData().eventType;
881 delegate_->FireAccessibilityEvent(accessibilityEvent);
882 }
883
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)884 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
885 {
886 std::string param = std::string("\"")
887 .append(eventMarker.GetData().eventType)
888 .append("\",{\"code\":")
889 .append(std::to_string(static_cast<int32_t>(info.code)))
890 .append(",\"action\":")
891 .append(std::to_string(static_cast<int32_t>(info.action)))
892 .append(",\"repeatCount\":")
893 .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
894 .append(",\"timestamp\":")
895 .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
896 .append(",\"key\":\"")
897 .append(info.key)
898 .append("\"},");
899
900 result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
901
902 AccessibilityEvent accessibilityEvent;
903 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
904 accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
905 delegate_->FireAccessibilityEvent(accessibilityEvent);
906 }
907
HandleAsyncEvent(const EventMarker & eventMarker,const GestureEvent & info)908 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const GestureEvent& info)
909 {
910 std::string eventParam = std::string("");
911 if (eventMarker.GetData().eventType.find("pinch") != std::string::npos) {
912 eventParam.append("\"")
913 .append(eventMarker.GetData().eventType)
914 .append("\",{\"scale\":")
915 .append(std::to_string(info.GetScale()))
916 .append(",\"pinchCenterX\":")
917 .append(std::to_string(info.GetPinchCenter().GetX()))
918 .append(",\"pinchCenterY\":")
919 .append(std::to_string(info.GetPinchCenter().GetY()))
920 .append("}");
921 }
922
923 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
924
925 AccessibilityEvent accessibilityEvent;
926 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
927 accessibilityEvent.eventType = eventMarker.GetData().eventType;
928 delegate_->FireAccessibilityEvent(accessibilityEvent);
929 }
930
HandleAsyncEvent(const EventMarker & eventMarker,const RotationEvent & info)931 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const RotationEvent& info)
932 {
933 std::string eventParam = std::string("");
934 if (eventMarker.GetData().eventType == "rotate") {
935 eventParam.append("\"")
936 .append(eventMarker.GetData().eventType)
937 .append("\",{\"value\":")
938 .append(std::to_string(info.value))
939 .append("}");
940 }
941
942 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
943
944 AccessibilityEvent accessibilityEvent;
945 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
946 accessibilityEvent.eventType = eventMarker.GetData().eventType;
947 delegate_->FireAccessibilityEvent(accessibilityEvent);
948 }
949
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)950 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
951 {
952 LOGW("js event handler does not support this event type!");
953 AccessibilityEvent accessibilityEvent;
954 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
955 accessibilityEvent.eventType = eventMarker.GetData().eventType;
956 delegate_->FireAccessibilityEvent(accessibilityEvent);
957 }
958
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)959 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
960 {
961 LOGW("js event handler does not support this event type!");
962 AccessibilityEvent accessibilityEvent;
963 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
964 accessibilityEvent.eventType = eventMarker.GetData().eventType;
965 delegate_->FireAccessibilityEvent(accessibilityEvent);
966 }
967
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)968 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
969 {
970 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
971
972 AccessibilityEvent accessibilityEvent;
973 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
974 accessibilityEvent.eventType = eventMarker.GetData().eventType;
975 delegate_->FireAccessibilityEvent(accessibilityEvent);
976 }
977
HandleSyncEvent(const EventMarker & eventMarker,bool & result)978 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
979 {
980 LOGW("js event handler does not support this event type!");
981 AccessibilityEvent accessibilityEvent;
982 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
983 accessibilityEvent.eventType = eventMarker.GetData().eventType;
984 delegate_->FireAccessibilityEvent(accessibilityEvent);
985 }
986
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)987 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
988 {
989 LOGW("js event handler does not support this event type!");
990 AccessibilityEvent accessibilityEvent;
991 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
992 accessibilityEvent.eventType = eventMarker.GetData().eventType;
993 delegate_->FireAccessibilityEvent(accessibilityEvent);
994 }
995
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)996 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
997 {
998 LOGW("js event handler does not support this event type!");
999 AccessibilityEvent accessibilityEvent;
1000 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1001 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1002 delegate_->FireAccessibilityEvent(accessibilityEvent);
1003 delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
1004 }
1005
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)1006 void JsEventHandler::HandleSyncEvent(
1007 const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1008 {
1009 delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1010 }
1011 } // namespace OHOS::Ace
1012