• 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(int32_t pageId,const std::string & url,const std::string & params)484 void JsFrontend::RunPage(int32_t pageId, const std::string& url, const std::string& params)
485 {
486     // Not use this pageId from backend, manage it in FrontendDelegateImpl.
487     if (delegate_) {
488         delegate_->RunPage(url, params);
489     }
490 }
491 
PushPage(const std::string & url,const std::string & params)492 void JsFrontend::PushPage(const std::string& url, const std::string& params)
493 {
494     if (delegate_) {
495         delegate_->Push(url, params);
496     }
497 }
498 
ReplacePage(const std::string & url,const std::string & params)499 void JsFrontend::ReplacePage(const std::string& url, const std::string& params)
500 {
501     if (delegate_) {
502         delegate_->Replace(url, params);
503     }
504 }
505 
SendCallbackMessage(const std::string & callbackId,const std::string & data) const506 void JsFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
507 {
508     if (delegate_) {
509         delegate_->OnJsCallback(callbackId, data);
510     }
511 }
512 
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const513 void JsFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
514 {
515     if (delegate_) {
516         delegate_->SetJsMessageDispatcher(dispatcher);
517     }
518 }
519 
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const520 void JsFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
521 {
522     if (delegate_) {
523         delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
524     }
525 }
526 
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const527 void JsFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
528 {
529     if (delegate_) {
530         delegate_->TransferJsResponseData(callbackId, code, std::move(data));
531     }
532 }
533 
534 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const535 void JsFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
536 {
537     if (delegate_) {
538         delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
539     }
540 }
541 #endif
542 
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const543 void JsFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
544 {
545     if (delegate_) {
546         delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
547     }
548 }
549 
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const550 void JsFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
551 {
552     if (delegate_) {
553         delegate_->TransferJsEventData(callbackId, code, std::move(data));
554     }
555 }
556 
LoadPluginJsCode(std::string && jsCode) const557 void JsFrontend::LoadPluginJsCode(std::string&& jsCode) const
558 {
559     if (delegate_) {
560         delegate_->LoadPluginJsCode(std::move(jsCode));
561     }
562 }
563 
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const564 void JsFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
565 {
566     if (delegate_) {
567         delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
568     }
569 }
570 
UpdateState(Frontend::State state)571 void JsFrontend::UpdateState(Frontend::State state)
572 {
573     if (!delegate_) {
574         return;
575     }
576     switch (state) {
577         case Frontend::State::ON_CREATE:
578             break;
579         case Frontend::State::ON_DESTROY:
580             LOGI("UpdateState ON_DESTROY");
581             delegate_->OnApplicationDestroy(delegate_->GetAppID());
582             delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_DESTROY);
583             break;
584         case Frontend::State::ON_SHOW:
585             delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_SHOW);
586             break;
587         case Frontend::State::ON_HIDE:
588             delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_HIDE);
589             break;
590         default:
591             LOGE("error State: %d", state);
592             break;
593     }
594 }
595 
GetAccessibilityManager() const596 RefPtr<AccessibilityManager> JsFrontend::GetAccessibilityManager() const
597 {
598     if (!delegate_) {
599         LOGD("GetAccessibilityManager delegate is null");
600         return nullptr;
601     }
602     return delegate_->GetJsAccessibilityManager();
603 }
604 
GetWindowConfig()605 WindowConfig& JsFrontend::GetWindowConfig()
606 {
607     if (!delegate_) {
608         static WindowConfig windowConfig;
609         LOGW("delegate is null, return default config");
610         return windowConfig;
611     }
612     return delegate_->GetWindowConfig();
613 }
614 
OnBackPressed()615 bool JsFrontend::OnBackPressed()
616 {
617     if (!delegate_) {
618         LOGW("delegate is null, return false");
619         return false;
620     }
621     return delegate_->OnPageBackPress();
622 }
623 
OnShow()624 void JsFrontend::OnShow()
625 {
626     if (delegate_) {
627         delegate_->OnForeground();
628         foregroundFrontend_ = true;
629     }
630 }
631 
OnHide()632 void JsFrontend::OnHide()
633 {
634     if (delegate_) {
635         delegate_->OnBackGround();
636         foregroundFrontend_ = false;
637     }
638 }
639 
OnConfigurationUpdated(const std::string & data)640 void JsFrontend::OnConfigurationUpdated(const std::string& data)
641 {
642     if (delegate_) {
643         delegate_->OnConfigurationUpdated(data);
644     }
645 }
646 
OnActive()647 void JsFrontend::OnActive()
648 {
649     if (delegate_) {
650         delegate_->InitializeAccessibilityCallback();
651         delegate_->OnActive();
652     }
653 }
654 
OnInactive()655 void JsFrontend::OnInactive()
656 {
657     if (delegate_) {
658         delegate_->OnInactive();
659     }
660 }
661 
OnStartContinuation()662 bool JsFrontend::OnStartContinuation()
663 {
664     if (!delegate_) {
665         LOGW("delegate is null, return false");
666         return false;
667     }
668     return delegate_->OnStartContinuation();
669 }
670 
OnCompleteContinuation(int32_t code)671 void JsFrontend::OnCompleteContinuation(int32_t code)
672 {
673     if (delegate_) {
674         delegate_->OnCompleteContinuation(code);
675     }
676 }
677 
OnRemoteTerminated()678 void JsFrontend::OnRemoteTerminated()
679 {
680     if (delegate_) {
681         delegate_->OnRemoteTerminated();
682     }
683 }
684 
OnSaveData(std::string & data)685 void JsFrontend::OnSaveData(std::string& data)
686 {
687     if (delegate_) {
688         delegate_->OnSaveData(data);
689     }
690 }
691 
OnRestoreData(const std::string & data)692 bool JsFrontend::OnRestoreData(const std::string& data)
693 {
694     if (!delegate_) {
695         LOGW("delegate is null, return false");
696         return false;
697     }
698     return delegate_->OnRestoreData(data);
699 }
700 
OnNewRequest(const std::string & data)701 void JsFrontend::OnNewRequest(const std::string& data)
702 {
703     if (delegate_) {
704         delegate_->OnNewRequest(data);
705     }
706 }
707 
CallRouterBack()708 void JsFrontend::CallRouterBack()
709 {
710     if (delegate_) {
711         delegate_->CallPopPage();
712     }
713 }
714 
OnSurfaceChanged(int32_t width,int32_t height)715 void JsFrontend::OnSurfaceChanged(int32_t width, int32_t height)
716 {
717     if (delegate_) {
718         delegate_->OnSurfaceChanged();
719     }
720 }
721 
OnLayoutCompleted(const std::string & componentId)722 void JsFrontend::OnLayoutCompleted(const std::string& componentId)
723 {
724     if (delegate_) {
725         delegate_->OnLayoutCompleted(componentId);
726     }
727 }
728 
OnDrawCompleted(const std::string & componentId)729 void JsFrontend::OnDrawCompleted(const std::string& componentId)
730 {
731     if (delegate_) {
732         delegate_->OnDrawCompleted(componentId);
733     }
734 }
735 
DumpFrontend() const736 void JsFrontend::DumpFrontend() const
737 {
738     int32_t routerIndex = 0;
739     std::string routerName;
740     std::string routerPath;
741     if (!delegate_) {
742         return;
743     }
744     delegate_->GetState(routerIndex, routerName, routerPath);
745 
746     if (DumpLog::GetInstance().GetDumpFile()) {
747         DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
748         DumpLog::GetInstance().AddDesc("Path: " + routerPath);
749         DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
750         DumpLog::GetInstance().Print(0, routerName, 0);
751     }
752 }
753 
GetPagePath() const754 std::string JsFrontend::GetPagePath() const
755 {
756     if (!delegate_) {
757         return "";
758     }
759     int32_t routerIndex = 0;
760     std::string routerName;
761     std::string routerPath;
762     delegate_->GetState(routerIndex, routerName, routerPath);
763     return routerPath + routerName;
764 }
765 
TriggerGarbageCollection()766 void JsFrontend::TriggerGarbageCollection()
767 {
768     if (jsEngine_) {
769         jsEngine_->RunGarbageCollection();
770     }
771 }
772 
DumpHeapSnapshot(bool isPrivate)773 void JsFrontend::DumpHeapSnapshot(bool isPrivate)
774 {
775     if (jsEngine_) {
776         jsEngine_->DumpHeapSnapshot(isPrivate);
777     }
778 }
779 
RebuildAllPages()780 void JsFrontend::RebuildAllPages()
781 {
782     if (delegate_) {
783         delegate_->RebuildAllPages();
784     }
785 }
786 
GetPluginsUsed(std::string & data)787 void JsFrontend::GetPluginsUsed(std::string& data)
788 {
789     if (!delegate_) {
790         LOGW("delegate hasn't initialized, load all system plugin");
791         return;
792     }
793 
794     if (!delegate_->GetAssetContent("module_collection.txt", data)) {
795         LOGW("read failed, will load all the system plugin");
796     }
797 }
798 
SetColorMode(ColorMode colorMode)799 void JsFrontend::SetColorMode(ColorMode colorMode)
800 {
801     if (delegate_) {
802         delegate_->SetColorMode(colorMode);
803     }
804 }
805 
HandleAsyncEvent(const EventMarker & eventMarker)806 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
807 {
808     LOGD("HandleAsyncEvent pageId: %{private}d, eventId: %{private}s, eventType: %{private}s",
809         eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
810     std::string param = eventMarker.GetData().GetEventParam();
811     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
812 
813     AccessibilityEvent accessibilityEvent;
814     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
815     accessibilityEvent.eventType = eventMarker.GetData().eventType;
816     delegate_->FireAccessibilityEvent(accessibilityEvent);
817 }
818 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)819 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
820 {
821     std::string eventParam;
822     if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
823         TouchInfoToString(info, eventParam);
824     } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
825         MouseInfoToString(info, eventParam);
826     } else if (eventMarker.GetData().eventType == "swipe") {
827         SwipeInfoToString(info, eventParam);
828     } else if (eventMarker.GetData().eventType == "dragstart") {
829         DragStartInfoToString(info, eventParam);
830     } else if (eventMarker.GetData().eventType == "drag") {
831         DragUpdateInfoToString(info, eventParam);
832     } else if (eventMarker.GetData().eventType == "dragend") {
833         DragEndInfoToString(info, eventParam);
834     } else if (eventMarker.GetData().eventType == "dragenter") {
835         DragEnterInfoToString(info, eventParam);
836     } else if (eventMarker.GetData().eventType == "dragover") {
837         DragOverInfoToString(info, eventParam);
838     } else if (eventMarker.GetData().eventType == "dragleave") {
839         DragLeaveInfoToString(info, eventParam);
840     } else if (eventMarker.GetData().eventType == "drop") {
841         DragDropInfoToString(info, eventParam);
842     }
843 
844     LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s, eventParam: %{public}s",
845         eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str(),
846         eventParam.c_str());
847     std::string param;
848     auto adapter = TypeInfoHelper::DynamicCast<EventToJSONStringAdapter>(&info);
849     if (adapter) {
850         LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
851             eventMarker.GetData().eventId.c_str());
852         param = adapter->ToJSONString();
853     } else {
854         param = eventMarker.GetData().GetEventParam();
855         if (eventParam.empty()) {
856             param.append("null");
857         } else {
858             param.append(eventParam);
859         }
860     }
861     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
862 
863     AccessibilityEvent accessibilityEvent;
864     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
865     accessibilityEvent.eventType = eventMarker.GetData().eventType;
866     delegate_->FireAccessibilityEvent(accessibilityEvent);
867 }
868 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)869 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
870 {
871     LOGD("HandleSyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s", eventMarker.GetData().pageId,
872         eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
873     std::string param = std::string("\"")
874                             .append(eventMarker.GetData().eventType)
875                             .append("\",{\"code\":")
876                             .append(std::to_string(static_cast<int32_t>(info.code)))
877                             .append(",\"action\":")
878                             .append(std::to_string(static_cast<int32_t>(info.action)))
879                             .append(",\"repeatCount\":")
880                             .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
881                             .append(",\"timestamp\":")
882                             .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
883                             .append(",\"key\":\"")
884                             .append(info.key)
885                             .append("\"},");
886 
887     result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
888 
889     AccessibilityEvent accessibilityEvent;
890     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
891     accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
892     delegate_->FireAccessibilityEvent(accessibilityEvent);
893 }
894 
HandleAsyncEvent(const EventMarker & eventMarker,const GestureEvent & info)895 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const GestureEvent& info)
896 {
897     LOGD("HandleASyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s",
898         eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
899     std::string eventParam = std::string("");
900     if (eventMarker.GetData().eventType.find("pinch") != std::string::npos) {
901         eventParam.append("\"")
902             .append(eventMarker.GetData().eventType)
903             .append("\",{\"scale\":")
904             .append(std::to_string(info.GetScale()))
905             .append(",\"pinchCenterX\":")
906             .append(std::to_string(info.GetPinchCenter().GetX()))
907             .append(",\"pinchCenterY\":")
908             .append(std::to_string(info.GetPinchCenter().GetY()))
909             .append("}");
910     }
911 
912     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
913 
914     AccessibilityEvent accessibilityEvent;
915     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
916     accessibilityEvent.eventType = eventMarker.GetData().eventType;
917     delegate_->FireAccessibilityEvent(accessibilityEvent);
918 }
919 
HandleAsyncEvent(const EventMarker & eventMarker,const RotationEvent & info)920 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const RotationEvent& info)
921 {
922     LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s",
923         eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
924     std::string eventParam = std::string("");
925     if (eventMarker.GetData().eventType == "rotate") {
926         eventParam.append("\"")
927             .append(eventMarker.GetData().eventType)
928             .append("\",{\"value\":")
929             .append(std::to_string(info.value))
930             .append("}");
931     }
932 
933     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
934 
935     AccessibilityEvent accessibilityEvent;
936     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
937     accessibilityEvent.eventType = eventMarker.GetData().eventType;
938     delegate_->FireAccessibilityEvent(accessibilityEvent);
939 }
940 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)941 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
942 {
943     LOGW("js event handler does not support this event type!");
944     AccessibilityEvent accessibilityEvent;
945     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
946     accessibilityEvent.eventType = eventMarker.GetData().eventType;
947     delegate_->FireAccessibilityEvent(accessibilityEvent);
948 }
949 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)950 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
951 {
952     LOGW("js event handler does not support this event type!");
953     AccessibilityEvent accessibilityEvent;
954     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
955     accessibilityEvent.eventType = eventMarker.GetData().eventType;
956     delegate_->FireAccessibilityEvent(accessibilityEvent);
957 }
958 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)959 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
960 {
961     LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
962         eventMarker.GetData().eventId.c_str());
963     delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
964 
965     AccessibilityEvent accessibilityEvent;
966     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
967     accessibilityEvent.eventType = eventMarker.GetData().eventType;
968     delegate_->FireAccessibilityEvent(accessibilityEvent);
969 }
970 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)971 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
972 {
973     LOGW("js event handler does not support this event type!");
974     AccessibilityEvent accessibilityEvent;
975     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
976     accessibilityEvent.eventType = eventMarker.GetData().eventType;
977     delegate_->FireAccessibilityEvent(accessibilityEvent);
978 }
979 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)980 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
981 {
982     LOGW("js event handler does not support this event type!");
983     AccessibilityEvent accessibilityEvent;
984     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
985     accessibilityEvent.eventType = eventMarker.GetData().eventType;
986     delegate_->FireAccessibilityEvent(accessibilityEvent);
987 }
988 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)989 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
990 {
991     LOGW("js event handler does not support this event type!");
992     AccessibilityEvent accessibilityEvent;
993     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
994     accessibilityEvent.eventType = eventMarker.GetData().eventType;
995     delegate_->FireAccessibilityEvent(accessibilityEvent);
996     delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
997 }
998 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)999 void JsEventHandler::HandleSyncEvent(
1000     const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1001 {
1002     delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1003 }
1004 } // namespace OHOS::Ace
1005