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 taskExecutor_ = taskExecutor;
259 ACE_DCHECK(type_ == FrontendType::JS);
260 InitializeFrontendDelegate(taskExecutor);
261 auto weakEngine = AceType::WeakClaim(AceType::RawPtr(jsEngine_));
262 auto weakDelegate = AceType::WeakClaim(AceType::RawPtr(delegate_));
263 taskExecutor->PostTask(
264 [weakEngine, weakDelegate] {
265 auto jsEngine = weakEngine.Upgrade();
266 if (!jsEngine) {
267 return;
268 }
269 jsEngine->Initialize(weakDelegate.Upgrade());
270 },
271 TaskExecutor::TaskType::JS);
272 LOGI("JsFrontend initialize end.");
273 return true;
274 }
275
AttachPipelineContext(const RefPtr<PipelineBase> & context)276 void JsFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
277 {
278 if (!delegate_) {
279 return;
280 }
281 handler_ = AceType::MakeRefPtr<JsEventHandler>(delegate_);
282 auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
283 if (pipelineContext) {
284 pipelineContext->RegisterEventHandler(handler_);
285 }
286 delegate_->AttachPipelineContext(context);
287 }
288
SetAssetManager(const RefPtr<AssetManager> & assetManager)289 void JsFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
290 {
291 if (delegate_) {
292 delegate_->SetAssetManager(assetManager);
293 }
294 }
295
InitializeFrontendDelegate(const RefPtr<TaskExecutor> & taskExecutor)296 void JsFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
297 {
298 Framework::FrontendDelegateImplBuilder builder;
299 builder.loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
300 const std::string& url, const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
301 auto jsEngine = weakEngine.Upgrade();
302 if (!jsEngine) {
303 return;
304 }
305 jsEngine->LoadJs(url, jsPage, isMainPage);
306 };
307
308 builder.transferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
309 const RefPtr<JsMessageDispatcher>& dispatcher) {
310 auto jsEngine = weakEngine.Upgrade();
311 if (!jsEngine) {
312 return;
313 }
314 jsEngine->SetJsMessageDispatcher(dispatcher);
315 };
316
317 builder.asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
318 const std::string& eventId, const std::string& param) {
319 auto jsEngine = weakEngine.Upgrade();
320 if (!jsEngine) {
321 return;
322 }
323 jsEngine->FireAsyncEvent(eventId, param);
324 };
325
326 builder.syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
327 const std::string& eventId, const std::string& param) {
328 auto jsEngine = weakEngine.Upgrade();
329 if (!jsEngine) {
330 return;
331 }
332 jsEngine->FireSyncEvent(eventId, param);
333 };
334
335 builder.externalEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
336 const std::string& componentId, const uint32_t nodeId, const bool isDestroy) {
337 auto jsEngine = weakEngine.Upgrade();
338 if (!jsEngine) {
339 return;
340 }
341 jsEngine->FireExternalEvent(componentId, nodeId, isDestroy);
342 };
343
344 builder.updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
345 const RefPtr<Framework::JsAcePage>& jsPage) {
346 auto jsEngine = weakEngine.Upgrade();
347 if (!jsEngine) {
348 return;
349 }
350 jsEngine->UpdateRunningPage(jsPage);
351 jsEngine->UpdateStagingPage(jsPage);
352 };
353
354 builder.resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
355 auto jsEngine = weakEngine.Upgrade();
356 if (!jsEngine) {
357 return;
358 }
359 jsEngine->ResetStagingPage();
360 };
361
362 builder.destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
363 auto jsEngine = weakEngine.Upgrade();
364 if (!jsEngine) {
365 return;
366 }
367 jsEngine->DestroyPageInstance(pageId);
368 };
369
370 builder.destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
371 const std::string& packageName) {
372 auto jsEngine = weakEngine.Upgrade();
373 if (!jsEngine) {
374 return;
375 }
376 jsEngine->DestroyApplication(packageName);
377 };
378
379 builder.updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
380 const std::string& packageName, Frontend::State state) {
381 auto jsEngine = weakEngine.Upgrade();
382 if (!jsEngine) {
383 return;
384 }
385 jsEngine->UpdateApplicationState(packageName, state);
386 };
387
388 builder.onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
389 auto jsEngine = weakEngine.Upgrade();
390 if (!jsEngine) {
391 return false;
392 }
393 return jsEngine->OnStartContinuation();
394 };
395
396 builder.onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
397 auto jsEngine = weakEngine.Upgrade();
398 if (!jsEngine) {
399 return;
400 }
401 jsEngine->OnCompleteContinuation(code);
402 };
403
404 builder.onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
405 auto jsEngine = weakEngine.Upgrade();
406 if (!jsEngine) {
407 return;
408 }
409 jsEngine->OnRemoteTerminated();
410 };
411
412 builder.onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
413 auto jsEngine = weakEngine.Upgrade();
414 if (!jsEngine) {
415 return;
416 }
417 jsEngine->OnSaveData(savedData);
418 };
419
420 builder.onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
421 const std::string& data) -> bool {
422 auto jsEngine = weakEngine.Upgrade();
423 if (!jsEngine) {
424 return false;
425 }
426 return jsEngine->OnRestoreData(data);
427 };
428
429 builder.timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
430 const std::string& callbackId, const std::string& delay, bool isInterval) {
431 auto jsEngine = weakEngine.Upgrade();
432 if (!jsEngine) {
433 return;
434 }
435 jsEngine->TimerCallback(callbackId, delay, isInterval);
436 };
437
438 builder.mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
439 const std::string& callbackId, const std::string& args) {
440 auto jsEngine = weakEngine.Upgrade();
441 if (!jsEngine) {
442 return;
443 }
444 jsEngine->MediaQueryCallback(callbackId, args);
445 };
446
447 builder.requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
448 const std::string& callbackId, uint64_t timeStamp) {
449 auto jsEngine = weakEngine.Upgrade();
450 if (!jsEngine) {
451 return;
452 }
453 jsEngine->RequestAnimationCallback(callbackId, timeStamp);
454 };
455
456 builder.jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
457 const std::string& callbackId, const std::string& args) {
458 auto jsEngine = weakEngine.Upgrade();
459 if (!jsEngine) {
460 return;
461 }
462 jsEngine->JsCallback(callbackId, args);
463 };
464
465 builder.callNativeHandler = [this](const std::string& event, const std::string& params) {
466 if (dialogCallback_ != nullptr) {
467 dialogCallback_(event, params);
468 }
469 };
470
471 builder.taskExecutor = taskExecutor;
472 delegate_ = AceType::MakeRefPtr<Framework::FrontendDelegateImpl>(builder);
473 if (disallowPopLastPage_) {
474 delegate_->DisallowPopLastPage();
475 }
476 if (jsEngine_) {
477 delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
478 } else {
479 LOGE("the js engine is nullptr");
480 EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
481 }
482 }
483
RunPage(int32_t pageId,const std::string & url,const std::string & params)484 void JsFrontend::RunPage(int32_t pageId, const std::string& url, const std::string& params)
485 {
486 // Not use this pageId from backend, manage it in FrontendDelegateImpl.
487 if (delegate_) {
488 delegate_->RunPage(url, params);
489 }
490 }
491
PushPage(const std::string & url,const std::string & params)492 void JsFrontend::PushPage(const std::string& url, const std::string& params)
493 {
494 if (delegate_) {
495 delegate_->Push(url, params);
496 }
497 }
498
ReplacePage(const std::string & url,const std::string & params)499 void JsFrontend::ReplacePage(const std::string& url, const std::string& params)
500 {
501 if (delegate_) {
502 delegate_->Replace(url, params);
503 }
504 }
505
SendCallbackMessage(const std::string & callbackId,const std::string & data) const506 void JsFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
507 {
508 if (delegate_) {
509 delegate_->OnJsCallback(callbackId, data);
510 }
511 }
512
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const513 void JsFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
514 {
515 if (delegate_) {
516 delegate_->SetJsMessageDispatcher(dispatcher);
517 }
518 }
519
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const520 void JsFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
521 {
522 if (delegate_) {
523 delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
524 }
525 }
526
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const527 void JsFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
528 {
529 if (delegate_) {
530 delegate_->TransferJsResponseData(callbackId, code, std::move(data));
531 }
532 }
533
534 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const535 void JsFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
536 {
537 if (delegate_) {
538 delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
539 }
540 }
541 #endif
542
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const543 void JsFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
544 {
545 if (delegate_) {
546 delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
547 }
548 }
549
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const550 void JsFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
551 {
552 if (delegate_) {
553 delegate_->TransferJsEventData(callbackId, code, std::move(data));
554 }
555 }
556
LoadPluginJsCode(std::string && jsCode) const557 void JsFrontend::LoadPluginJsCode(std::string&& jsCode) const
558 {
559 if (delegate_) {
560 delegate_->LoadPluginJsCode(std::move(jsCode));
561 }
562 }
563
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const564 void JsFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
565 {
566 if (delegate_) {
567 delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
568 }
569 }
570
UpdateState(Frontend::State state)571 void JsFrontend::UpdateState(Frontend::State state)
572 {
573 if (!delegate_) {
574 return;
575 }
576 switch (state) {
577 case Frontend::State::ON_CREATE:
578 break;
579 case Frontend::State::ON_DESTROY:
580 LOGI("UpdateState ON_DESTROY");
581 delegate_->OnApplicationDestroy(delegate_->GetAppID());
582 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_DESTROY);
583 break;
584 case Frontend::State::ON_SHOW:
585 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_SHOW);
586 break;
587 case Frontend::State::ON_HIDE:
588 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_HIDE);
589 break;
590 default:
591 LOGE("error State: %d", state);
592 break;
593 }
594 }
595
GetAccessibilityManager() const596 RefPtr<AccessibilityManager> JsFrontend::GetAccessibilityManager() const
597 {
598 if (!delegate_) {
599 LOGD("GetAccessibilityManager delegate is null");
600 return nullptr;
601 }
602 return delegate_->GetJsAccessibilityManager();
603 }
604
GetWindowConfig()605 WindowConfig& JsFrontend::GetWindowConfig()
606 {
607 if (!delegate_) {
608 static WindowConfig windowConfig;
609 LOGW("delegate is null, return default config");
610 return windowConfig;
611 }
612 return delegate_->GetWindowConfig();
613 }
614
OnBackPressed()615 bool JsFrontend::OnBackPressed()
616 {
617 if (!delegate_) {
618 LOGW("delegate is null, return false");
619 return false;
620 }
621 return delegate_->OnPageBackPress();
622 }
623
OnShow()624 void JsFrontend::OnShow()
625 {
626 if (delegate_) {
627 delegate_->OnForeground();
628 foregroundFrontend_ = true;
629 }
630 }
631
OnHide()632 void JsFrontend::OnHide()
633 {
634 if (delegate_) {
635 delegate_->OnBackGround();
636 foregroundFrontend_ = false;
637 }
638 }
639
OnConfigurationUpdated(const std::string & data)640 void JsFrontend::OnConfigurationUpdated(const std::string& data)
641 {
642 if (delegate_) {
643 delegate_->OnConfigurationUpdated(data);
644 }
645 }
646
OnActive()647 void JsFrontend::OnActive()
648 {
649 if (delegate_) {
650 delegate_->InitializeAccessibilityCallback();
651 delegate_->OnActive();
652 }
653 }
654
OnInactive()655 void JsFrontend::OnInactive()
656 {
657 if (delegate_) {
658 delegate_->OnInactive();
659 }
660 }
661
OnStartContinuation()662 bool JsFrontend::OnStartContinuation()
663 {
664 if (!delegate_) {
665 LOGW("delegate is null, return false");
666 return false;
667 }
668 return delegate_->OnStartContinuation();
669 }
670
OnCompleteContinuation(int32_t code)671 void JsFrontend::OnCompleteContinuation(int32_t code)
672 {
673 if (delegate_) {
674 delegate_->OnCompleteContinuation(code);
675 }
676 }
677
OnRemoteTerminated()678 void JsFrontend::OnRemoteTerminated()
679 {
680 if (delegate_) {
681 delegate_->OnRemoteTerminated();
682 }
683 }
684
OnSaveData(std::string & data)685 void JsFrontend::OnSaveData(std::string& data)
686 {
687 if (delegate_) {
688 delegate_->OnSaveData(data);
689 }
690 }
691
OnRestoreData(const std::string & data)692 bool JsFrontend::OnRestoreData(const std::string& data)
693 {
694 if (!delegate_) {
695 LOGW("delegate is null, return false");
696 return false;
697 }
698 return delegate_->OnRestoreData(data);
699 }
700
OnNewRequest(const std::string & data)701 void JsFrontend::OnNewRequest(const std::string& data)
702 {
703 if (delegate_) {
704 delegate_->OnNewRequest(data);
705 }
706 }
707
CallRouterBack()708 void JsFrontend::CallRouterBack()
709 {
710 if (delegate_) {
711 delegate_->CallPopPage();
712 }
713 }
714
OnSurfaceChanged(int32_t width,int32_t height)715 void JsFrontend::OnSurfaceChanged(int32_t width, int32_t height)
716 {
717 if (delegate_) {
718 delegate_->OnSurfaceChanged();
719 }
720 }
721
OnLayoutCompleted(const std::string & componentId)722 void JsFrontend::OnLayoutCompleted(const std::string& componentId)
723 {
724 if (delegate_) {
725 delegate_->OnLayoutCompleted(componentId);
726 }
727 }
728
OnDrawCompleted(const std::string & componentId)729 void JsFrontend::OnDrawCompleted(const std::string& componentId)
730 {
731 if (delegate_) {
732 delegate_->OnDrawCompleted(componentId);
733 }
734 }
735
DumpFrontend() const736 void JsFrontend::DumpFrontend() const
737 {
738 int32_t routerIndex = 0;
739 std::string routerName;
740 std::string routerPath;
741 if (!delegate_) {
742 return;
743 }
744 delegate_->GetState(routerIndex, routerName, routerPath);
745
746 if (DumpLog::GetInstance().GetDumpFile()) {
747 DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
748 DumpLog::GetInstance().AddDesc("Path: " + routerPath);
749 DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
750 DumpLog::GetInstance().Print(0, routerName, 0);
751 }
752 }
753
GetPagePath() const754 std::string JsFrontend::GetPagePath() const
755 {
756 if (!delegate_) {
757 return "";
758 }
759 int32_t routerIndex = 0;
760 std::string routerName;
761 std::string routerPath;
762 delegate_->GetState(routerIndex, routerName, routerPath);
763 return routerPath + routerName;
764 }
765
TriggerGarbageCollection()766 void JsFrontend::TriggerGarbageCollection()
767 {
768 if (jsEngine_) {
769 jsEngine_->RunGarbageCollection();
770 }
771 }
772
DumpHeapSnapshot(bool isPrivate)773 void JsFrontend::DumpHeapSnapshot(bool isPrivate)
774 {
775 if (jsEngine_) {
776 jsEngine_->DumpHeapSnapshot(isPrivate);
777 }
778 }
779
RebuildAllPages()780 void JsFrontend::RebuildAllPages()
781 {
782 if (delegate_) {
783 delegate_->RebuildAllPages();
784 }
785 }
786
GetPluginsUsed(std::string & data)787 void JsFrontend::GetPluginsUsed(std::string& data)
788 {
789 if (!delegate_) {
790 LOGW("delegate hasn't initialized, load all system plugin");
791 return;
792 }
793
794 if (!delegate_->GetAssetContent("module_collection.txt", data)) {
795 LOGW("read failed, will load all the system plugin");
796 }
797 }
798
SetColorMode(ColorMode colorMode)799 void JsFrontend::SetColorMode(ColorMode colorMode)
800 {
801 if (delegate_) {
802 delegate_->SetColorMode(colorMode);
803 }
804 }
805
HandleAsyncEvent(const EventMarker & eventMarker)806 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
807 {
808 LOGD("HandleAsyncEvent pageId: %{private}d, eventId: %{private}s, eventType: %{private}s",
809 eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
810 std::string param = eventMarker.GetData().GetEventParam();
811 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
812
813 AccessibilityEvent accessibilityEvent;
814 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
815 accessibilityEvent.eventType = eventMarker.GetData().eventType;
816 delegate_->FireAccessibilityEvent(accessibilityEvent);
817 }
818
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)819 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
820 {
821 std::string eventParam;
822 if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
823 TouchInfoToString(info, eventParam);
824 } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
825 MouseInfoToString(info, eventParam);
826 } else if (eventMarker.GetData().eventType == "swipe") {
827 SwipeInfoToString(info, eventParam);
828 } else if (eventMarker.GetData().eventType == "dragstart") {
829 DragStartInfoToString(info, eventParam);
830 } else if (eventMarker.GetData().eventType == "drag") {
831 DragUpdateInfoToString(info, eventParam);
832 } else if (eventMarker.GetData().eventType == "dragend") {
833 DragEndInfoToString(info, eventParam);
834 } else if (eventMarker.GetData().eventType == "dragenter") {
835 DragEnterInfoToString(info, eventParam);
836 } else if (eventMarker.GetData().eventType == "dragover") {
837 DragOverInfoToString(info, eventParam);
838 } else if (eventMarker.GetData().eventType == "dragleave") {
839 DragLeaveInfoToString(info, eventParam);
840 } else if (eventMarker.GetData().eventType == "drop") {
841 DragDropInfoToString(info, eventParam);
842 }
843
844 LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s, eventParam: %{public}s",
845 eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str(),
846 eventParam.c_str());
847 std::string param;
848 auto adapter = TypeInfoHelper::DynamicCast<EventToJSONStringAdapter>(&info);
849 if (adapter) {
850 LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
851 eventMarker.GetData().eventId.c_str());
852 param = adapter->ToJSONString();
853 } else {
854 param = eventMarker.GetData().GetEventParam();
855 if (eventParam.empty()) {
856 param.append("null");
857 } else {
858 param.append(eventParam);
859 }
860 }
861 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
862
863 AccessibilityEvent accessibilityEvent;
864 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
865 accessibilityEvent.eventType = eventMarker.GetData().eventType;
866 delegate_->FireAccessibilityEvent(accessibilityEvent);
867 }
868
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)869 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
870 {
871 LOGD("HandleSyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s", eventMarker.GetData().pageId,
872 eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
873 std::string param = std::string("\"")
874 .append(eventMarker.GetData().eventType)
875 .append("\",{\"code\":")
876 .append(std::to_string(static_cast<int32_t>(info.code)))
877 .append(",\"action\":")
878 .append(std::to_string(static_cast<int32_t>(info.action)))
879 .append(",\"repeatCount\":")
880 .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
881 .append(",\"timestamp\":")
882 .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
883 .append(",\"key\":\"")
884 .append(info.key)
885 .append("\"},");
886
887 result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
888
889 AccessibilityEvent accessibilityEvent;
890 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
891 accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
892 delegate_->FireAccessibilityEvent(accessibilityEvent);
893 }
894
HandleAsyncEvent(const EventMarker & eventMarker,const GestureEvent & info)895 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const GestureEvent& info)
896 {
897 LOGD("HandleASyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s",
898 eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
899 std::string eventParam = std::string("");
900 if (eventMarker.GetData().eventType.find("pinch") != std::string::npos) {
901 eventParam.append("\"")
902 .append(eventMarker.GetData().eventType)
903 .append("\",{\"scale\":")
904 .append(std::to_string(info.GetScale()))
905 .append(",\"pinchCenterX\":")
906 .append(std::to_string(info.GetPinchCenter().GetX()))
907 .append(",\"pinchCenterY\":")
908 .append(std::to_string(info.GetPinchCenter().GetY()))
909 .append("}");
910 }
911
912 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
913
914 AccessibilityEvent accessibilityEvent;
915 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
916 accessibilityEvent.eventType = eventMarker.GetData().eventType;
917 delegate_->FireAccessibilityEvent(accessibilityEvent);
918 }
919
HandleAsyncEvent(const EventMarker & eventMarker,const RotationEvent & info)920 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const RotationEvent& info)
921 {
922 LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s",
923 eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
924 std::string eventParam = std::string("");
925 if (eventMarker.GetData().eventType == "rotate") {
926 eventParam.append("\"")
927 .append(eventMarker.GetData().eventType)
928 .append("\",{\"value\":")
929 .append(std::to_string(info.value))
930 .append("}");
931 }
932
933 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
934
935 AccessibilityEvent accessibilityEvent;
936 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
937 accessibilityEvent.eventType = eventMarker.GetData().eventType;
938 delegate_->FireAccessibilityEvent(accessibilityEvent);
939 }
940
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)941 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
942 {
943 LOGW("js event handler does not support this event type!");
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,const KeyEvent & info)950 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
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 std::string & param)959 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
960 {
961 LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
962 eventMarker.GetData().eventId.c_str());
963 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
964
965 AccessibilityEvent accessibilityEvent;
966 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
967 accessibilityEvent.eventType = eventMarker.GetData().eventType;
968 delegate_->FireAccessibilityEvent(accessibilityEvent);
969 }
970
HandleSyncEvent(const EventMarker & eventMarker,bool & result)971 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
972 {
973 LOGW("js event handler does not support this event type!");
974 AccessibilityEvent accessibilityEvent;
975 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
976 accessibilityEvent.eventType = eventMarker.GetData().eventType;
977 delegate_->FireAccessibilityEvent(accessibilityEvent);
978 }
979
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)980 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
981 {
982 LOGW("js event handler does not support this event type!");
983 AccessibilityEvent accessibilityEvent;
984 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
985 accessibilityEvent.eventType = eventMarker.GetData().eventType;
986 delegate_->FireAccessibilityEvent(accessibilityEvent);
987 }
988
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)989 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
990 {
991 LOGW("js event handler does not support this event type!");
992 AccessibilityEvent accessibilityEvent;
993 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
994 accessibilityEvent.eventType = eventMarker.GetData().eventType;
995 delegate_->FireAccessibilityEvent(accessibilityEvent);
996 delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
997 }
998
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)999 void JsEventHandler::HandleSyncEvent(
1000 const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1001 {
1002 delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1003 }
1004 } // namespace OHOS::Ace
1005