• 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 
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     LOGI("Frontend destroyed");
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 
OnDrawChildrenCompleted(const std::string & componentId)738 void JsFrontend::OnDrawChildrenCompleted(const std::string& componentId)
739 {
740     if (delegate_) {
741         delegate_->OnDrawChildrenCompleted(componentId);
742     }
743 }
744 
IsDrawChildrenCallbackFuncExist(const std::string & componentId)745 bool JsFrontend::IsDrawChildrenCallbackFuncExist(const std::string& componentId)
746 {
747     if (delegate_) {
748         return delegate_->IsDrawChildrenCallbackFuncExist(componentId);
749     }
750     return false;
751 }
752 
DumpFrontend() const753 void JsFrontend::DumpFrontend() const
754 {
755     int32_t routerIndex = 0;
756     std::string routerName;
757     std::string routerPath;
758     if (!delegate_) {
759         return;
760     }
761     delegate_->GetState(routerIndex, routerName, routerPath);
762 
763     if (DumpLog::GetInstance().GetDumpFile()) {
764         DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
765         DumpLog::GetInstance().AddDesc("Path: " + routerPath);
766         DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
767         DumpLog::GetInstance().Print(0, routerName, 0);
768     }
769 }
770 
GetPagePath() const771 std::string JsFrontend::GetPagePath() const
772 {
773     if (!delegate_) {
774         return "";
775     }
776     int32_t routerIndex = 0;
777     std::string routerName;
778     std::string routerPath;
779     delegate_->GetState(routerIndex, routerName, routerPath);
780     return routerPath + routerName;
781 }
782 
TriggerGarbageCollection()783 void JsFrontend::TriggerGarbageCollection()
784 {
785     if (jsEngine_) {
786         jsEngine_->RunGarbageCollection();
787     }
788 }
789 
DumpHeapSnapshot(bool isPrivate)790 void JsFrontend::DumpHeapSnapshot(bool isPrivate)
791 {
792     if (jsEngine_) {
793         jsEngine_->DumpHeapSnapshot(isPrivate);
794     }
795 }
796 
DestroyHeapProfiler()797 void JsFrontend::DestroyHeapProfiler()
798 {
799     if (jsEngine_) {
800         jsEngine_->DestroyHeapProfiler();
801     }
802 }
803 
ForceFullGC()804 void JsFrontend::ForceFullGC()
805 {
806     if (jsEngine_) {
807         jsEngine_->ForceFullGC();
808     }
809 }
810 
NotifyUIIdle()811 void JsFrontend::NotifyUIIdle()
812 {
813     if (jsEngine_) {
814         jsEngine_->NotifyUIIdle();
815     }
816 }
817 
RebuildAllPages()818 void JsFrontend::RebuildAllPages()
819 {
820     if (delegate_) {
821         delegate_->RebuildAllPages();
822     }
823 }
824 
GetPluginsUsed(std::string & data)825 void JsFrontend::GetPluginsUsed(std::string& data)
826 {
827     if (!delegate_) {
828         LOGW("delegate hasn't initialized, load all system plugin");
829         return;
830     }
831 
832     if (!delegate_->GetAssetContent("module_collection.txt", data)) {
833         LOGW("read failed, will load all the system plugin");
834     }
835 }
836 
SetColorMode(ColorMode colorMode)837 void JsFrontend::SetColorMode(ColorMode colorMode)
838 {
839     if (delegate_) {
840         delegate_->SetColorMode(colorMode);
841     }
842 }
843 
HandleAsyncEvent(const EventMarker & eventMarker)844 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
845 {
846     std::string param = eventMarker.GetData().GetEventParam();
847     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
848 
849     AccessibilityEvent accessibilityEvent;
850     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
851     accessibilityEvent.eventType = eventMarker.GetData().eventType;
852     delegate_->FireAccessibilityEvent(accessibilityEvent);
853 }
854 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)855 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
856 {
857     std::string eventParam;
858     if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
859         TouchInfoToString(info, eventParam);
860     } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
861         MouseInfoToString(info, eventParam);
862     } else if (eventMarker.GetData().eventType == "swipe") {
863         SwipeInfoToString(info, eventParam);
864     } else if (eventMarker.GetData().eventType == "dragstart") {
865         DragStartInfoToString(info, eventParam);
866     } else if (eventMarker.GetData().eventType == "drag") {
867         DragUpdateInfoToString(info, eventParam);
868     } else if (eventMarker.GetData().eventType == "dragend") {
869         DragEndInfoToString(info, eventParam);
870     } else if (eventMarker.GetData().eventType == "dragenter") {
871         DragEnterInfoToString(info, eventParam);
872     } else if (eventMarker.GetData().eventType == "dragover") {
873         DragOverInfoToString(info, eventParam);
874     } else if (eventMarker.GetData().eventType == "dragleave") {
875         DragLeaveInfoToString(info, eventParam);
876     } else if (eventMarker.GetData().eventType == "drop") {
877         DragDropInfoToString(info, eventParam);
878     }
879     std::string param;
880     auto adapter = TypeInfoHelper::DynamicCast<EventToJSONStringAdapter>(&info);
881     if (adapter) {
882         param = adapter->ToJSONString();
883     } else {
884         param = eventMarker.GetData().GetEventParam();
885         if (eventParam.empty()) {
886             param.append("null");
887         } else {
888             param.append(eventParam);
889         }
890     }
891     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
892 
893     AccessibilityEvent accessibilityEvent;
894     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
895     accessibilityEvent.eventType = eventMarker.GetData().eventType;
896     delegate_->FireAccessibilityEvent(accessibilityEvent);
897 }
898 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)899 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
900 {
901     std::string param = std::string("\"")
902                             .append(eventMarker.GetData().eventType)
903                             .append("\",{\"code\":")
904                             .append(std::to_string(static_cast<int32_t>(info.code)))
905                             .append(",\"action\":")
906                             .append(std::to_string(static_cast<int32_t>(info.action)))
907                             .append(",\"repeatCount\":")
908                             .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
909                             .append(",\"timestamp\":")
910                             .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
911                             .append(",\"key\":\"")
912                             .append(info.key)
913                             .append("\"},");
914 
915     result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
916 
917     AccessibilityEvent accessibilityEvent;
918     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
919     accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
920     delegate_->FireAccessibilityEvent(accessibilityEvent);
921 }
922 
HandleAsyncEvent(const EventMarker & eventMarker,const GestureEvent & info)923 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const GestureEvent& info)
924 {
925     std::string eventParam = std::string("");
926     if (eventMarker.GetData().eventType.find("pinch") != std::string::npos) {
927         eventParam.append("\"")
928             .append(eventMarker.GetData().eventType)
929             .append("\",{\"scale\":")
930             .append(std::to_string(info.GetScale()))
931             .append(",\"pinchCenterX\":")
932             .append(std::to_string(info.GetPinchCenter().GetX()))
933             .append(",\"pinchCenterY\":")
934             .append(std::to_string(info.GetPinchCenter().GetY()))
935             .append("}");
936     }
937 
938     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
939 
940     AccessibilityEvent accessibilityEvent;
941     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
942     accessibilityEvent.eventType = eventMarker.GetData().eventType;
943     delegate_->FireAccessibilityEvent(accessibilityEvent);
944 }
945 
HandleAsyncEvent(const EventMarker & eventMarker,const RotationEvent & info)946 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const RotationEvent& info)
947 {
948     std::string eventParam = std::string("");
949     if (eventMarker.GetData().eventType == "rotate") {
950         eventParam.append("\"")
951             .append(eventMarker.GetData().eventType)
952             .append("\",{\"value\":")
953             .append(std::to_string(info.value))
954             .append("}");
955     }
956 
957     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
958 
959     AccessibilityEvent accessibilityEvent;
960     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
961     accessibilityEvent.eventType = eventMarker.GetData().eventType;
962     delegate_->FireAccessibilityEvent(accessibilityEvent);
963 }
964 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)965 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
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 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)974 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
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 }
982 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)983 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
984 {
985     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
986 
987     AccessibilityEvent accessibilityEvent;
988     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
989     accessibilityEvent.eventType = eventMarker.GetData().eventType;
990     delegate_->FireAccessibilityEvent(accessibilityEvent);
991 }
992 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)993 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
994 {
995     LOGW("js event handler does not support this event type!");
996     AccessibilityEvent accessibilityEvent;
997     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
998     accessibilityEvent.eventType = eventMarker.GetData().eventType;
999     delegate_->FireAccessibilityEvent(accessibilityEvent);
1000 }
1001 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)1002 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
1003 {
1004     LOGW("js event handler does not support this event type!");
1005     AccessibilityEvent accessibilityEvent;
1006     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1007     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1008     delegate_->FireAccessibilityEvent(accessibilityEvent);
1009 }
1010 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)1011 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
1012 {
1013     LOGW("js event handler does not support this event type!");
1014     AccessibilityEvent accessibilityEvent;
1015     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1016     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1017     delegate_->FireAccessibilityEvent(accessibilityEvent);
1018     delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
1019 }
1020 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)1021 void JsEventHandler::HandleSyncEvent(
1022     const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1023 {
1024     delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1025 }
1026 } // namespace OHOS::Ace
1027