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