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