• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "frameworks/bridge/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