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