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/plugin_frontend/plugin_frontend.h"
17 
18 #include <memory>
19 
20 #include "base/log/dump_log.h"
21 #include "base/log/event_report.h"
22 #include "base/utils/utils.h"
23 #include "core/common/thread_checker.h"
24 #include "core/components/navigator/navigator_component.h"
25 
26 namespace OHOS::Ace {
27 namespace {
28 /*
29  * NOTE:
30  * This function is needed to copy the values from BaseEventInfo
31  * It is observed, that the owner of BaseEventInfo will delete the pointer before it is ultimately
32  * processed by the EventMarker callback. In order to avoid this, a copy of all data needs to be made.
33  */
CopyEventInfo(const BaseEventInfo & info)34 std::shared_ptr<BaseEventInfo> CopyEventInfo(const BaseEventInfo& info)
35 {
36     const auto* touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
37     if (touchInfo != nullptr) {
38         return std::make_shared<TouchEventInfo>(*touchInfo);
39     }
40 
41     const auto* dragStartInfo = TypeInfoHelper::DynamicCast<DragStartInfo>(&info);
42     if (dragStartInfo != nullptr) {
43         return std::make_shared<DragStartInfo>(*dragStartInfo);
44     }
45 
46     const auto* dragUpdateInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
47     if (dragUpdateInfo != nullptr) {
48         return std::make_shared<DragUpdateInfo>(*dragUpdateInfo);
49     }
50 
51     const auto* dragEndInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
52     if (dragEndInfo != nullptr) {
53         return std::make_shared<DragEndInfo>(*dragEndInfo);
54     }
55 
56     const auto* clickInfo = TypeInfoHelper::DynamicCast<ClickInfo>(&info);
57     if (clickInfo != nullptr) {
58         return std::make_shared<ClickInfo>(*clickInfo);
59     }
60     return nullptr;
61 }
62 
TouchInfoToString(const BaseEventInfo & info,std::string & eventParam)63 void TouchInfoToString(const BaseEventInfo& info, std::string& eventParam)
64 {
65     eventParam.append("{\"touches\":[{");
66     const auto touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
67     if (touchInfo) {
68         auto touchList = touchInfo->GetTouches();
69         for (const auto& location : touchList) {
70             auto globalLocation = location.GetGlobalLocation();
71             eventParam.append("\"globalX\":")
72                 .append(std::to_string(globalLocation.GetX()))
73                 .append(",\"globalY\":")
74                 .append(std::to_string(globalLocation.GetY()))
75                 .append(",");
76             auto localLocation = location.GetLocalLocation();
77             eventParam.append("\"localX\":")
78                 .append(std::to_string(localLocation.GetX()))
79                 .append(",\"localY\":")
80                 .append(std::to_string(localLocation.GetY()))
81                 .append(",");
82             eventParam.append("\"size\":").append(std::to_string(location.GetSize())).append(",");
83         }
84         if (eventParam.back() == ',') {
85             eventParam.pop_back();
86         }
87         eventParam.append("}],\"changedTouches\":[{");
88         auto changeTouch = touchInfo->GetChangedTouches();
89         for (const auto& change : changeTouch) {
90             auto globalLocation = change.GetGlobalLocation();
91             eventParam.append("\"globalX\":")
92                 .append(std::to_string(globalLocation.GetX()))
93                 .append(",\"globalY\":")
94                 .append(std::to_string(globalLocation.GetY()))
95                 .append(",");
96             auto localLocation = change.GetLocalLocation();
97             eventParam.append("\"localX\":")
98                 .append(std::to_string(localLocation.GetX()))
99                 .append(",\"localY\":")
100                 .append(std::to_string(localLocation.GetY()))
101                 .append(",");
102             eventParam.append("\"size\":").append(std::to_string(change.GetSize())).append(",");
103         }
104         if (eventParam.back() == ',') {
105             eventParam.pop_back();
106         }
107     }
108     eventParam.append("}]}");
109 }
110 
MouseInfoToString(const BaseEventInfo & info,std::string & eventParam)111 void MouseInfoToString(const BaseEventInfo& info, std::string& eventParam)
112 {
113     const auto mouseInfo = TypeInfoHelper::DynamicCast<MouseEventInfo>(&info);
114     eventParam.append("{\"mouse\":{");
115     if (mouseInfo) {
116         auto globalMouse = mouseInfo->GetGlobalMouse();
117         eventParam.append("\"globalX\":")
118             .append(std::to_string(globalMouse.x))
119             .append(",\"globalY\":")
120             .append(std::to_string(globalMouse.y))
121             .append(",\"globalZ\":")
122             .append(std::to_string(globalMouse.z))
123             .append(",\"localX\":")
124             .append(std::to_string(globalMouse.x))
125             .append(",\"localY\":")
126             .append(std::to_string(globalMouse.y))
127             .append(",\"localZ\":")
128             .append(std::to_string(globalMouse.z))
129             .append(",\"deltaX\":")
130             .append(std::to_string(globalMouse.deltaX))
131             .append(",\"deltaY\":")
132             .append(std::to_string(globalMouse.deltaY))
133             .append(",\"deltaZ\":")
134             .append(std::to_string(globalMouse.deltaZ))
135             .append(",\"scrollX\":")
136             .append(std::to_string(globalMouse.scrollX))
137             .append(",\"scrollY\":")
138             .append(std::to_string(globalMouse.scrollY))
139             .append(",\"scrollZ\":")
140             .append(std::to_string(globalMouse.scrollZ))
141             .append(",\"action\":")
142             .append(std::to_string(static_cast<int32_t>(globalMouse.action)))
143             .append(",\"button\":")
144             .append(std::to_string(static_cast<int32_t>(globalMouse.button)))
145             .append(",\"pressedButtons\":")
146             .append(std::to_string(globalMouse.pressedButtons));
147     }
148     eventParam.append("}}");
149 }
150 
SwipeInfoToString(const BaseEventInfo & info,std::string & eventParam)151 void SwipeInfoToString(const BaseEventInfo& info, std::string& eventParam)
152 {
153     const auto& swipeInfo = TypeInfoHelper::DynamicCast<SwipeEventInfo>(&info);
154     CHECK_NULL_VOID(swipeInfo);
155     eventParam = swipeInfo->ToJsonParamInfo();
156 }
157 } // namespace
158 
~PluginFrontend()159 PluginFrontend::~PluginFrontend() noexcept
160 {
161     Destroy();
162     LOG_DESTROY();
163 }
164 
Destroy()165 void PluginFrontend::Destroy()
166 {
167     CHECK_RUN_ON(JS);
168     // To guarantee the jsEngine_ and delegate_ released in js thread
169     if (jsEngine_) {
170         jsEngine_->Destroy();
171         jsEngine_.Reset();
172     }
173     delegate_.Reset();
174     handler_.Reset();
175 }
176 
Initialize(FrontendType type,const RefPtr<TaskExecutor> & taskExecutor)177 bool PluginFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
178 {
179     type_ = type;
180     taskExecutor_ = taskExecutor;
181     ACE_DCHECK(type_ == FrontendType::JS_PLUGIN);
182     InitializeFrontendDelegate(taskExecutor);
183     taskExecutor->PostSyncTask(
184         [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_] {
185             auto jsEngine = weakEngine.Upgrade();
186             CHECK_NULL_VOID(jsEngine);
187             jsEngine->Initialize(delegate);
188         },
189         TaskExecutor::TaskType::JS, "ArkUIPluginInitialize");
190 
191     return true;
192 }
193 
AttachPipelineContext(const RefPtr<PipelineBase> & context)194 void PluginFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
195 {
196     CHECK_NULL_VOID(delegate_);
197     handler_ = AceType::MakeRefPtr<PluginEventHandler>(delegate_);
198     auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
199     if (pipelineContext) {
200         pipelineContext->RegisterEventHandler(handler_);
201     }
202     delegate_->AttachPipelineContext(context);
203 }
204 
SetAssetManager(const RefPtr<AssetManager> & assetManager)205 void PluginFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
206 {
207     if (delegate_) {
208         delegate_->SetAssetManager(assetManager);
209     }
210 }
211 
InitializeFrontendDelegate(const RefPtr<TaskExecutor> & taskExecutor)212 void PluginFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
213 {
214     const auto& loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
215                                    const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
216         auto jsEngine = weakEngine.Upgrade();
217         CHECK_NULL_VOID(jsEngine);
218         jsEngine->LoadPluginComponent(url, jsPage, isMainPage);
219     };
220 
221     const auto& setPluginMessageTransferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
222                                                        const RefPtr<JsMessageDispatcher>& dispatcher) {
223         auto jsEngine = weakEngine.Upgrade();
224         CHECK_NULL_VOID(jsEngine);
225         jsEngine->SetJsMessageDispatcher(dispatcher);
226     };
227 
228     const auto& asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
229                                          const std::string& eventId, const std::string& param) {
230         auto jsEngine = weakEngine.Upgrade();
231         CHECK_NULL_VOID(jsEngine);
232         jsEngine->FireAsyncEvent(eventId, param);
233     };
234 
235     const auto& syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
236                                         const std::string& eventId, const std::string& param) {
237         auto jsEngine = weakEngine.Upgrade();
238         CHECK_NULL_VOID(jsEngine);
239         jsEngine->FireSyncEvent(eventId, param);
240     };
241 
242     const auto& updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
243                                          const RefPtr<Framework::JsAcePage>& jsPage) {
244         auto jsEngine = weakEngine.Upgrade();
245         CHECK_NULL_VOID(jsEngine);
246         jsEngine->UpdateRunningPage(jsPage);
247         jsEngine->UpdateStagingPage(jsPage);
248     };
249 
250     const auto& resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
251         auto jsEngine = weakEngine.Upgrade();
252         CHECK_NULL_VOID(jsEngine);
253         jsEngine->ResetStagingPage();
254     };
255 
256     const auto& destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
257         auto jsEngine = weakEngine.Upgrade();
258         CHECK_NULL_VOID(jsEngine);
259         jsEngine->DestroyPageInstance(pageId);
260     };
261 
262     const auto& destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
263                                                  const std::string& packageName) {
264         auto jsEngine = weakEngine.Upgrade();
265         CHECK_NULL_VOID(jsEngine);
266         jsEngine->DestroyApplication(packageName);
267     };
268 
269     const auto& updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
270                                                      const std::string& packageName, Frontend::State state) {
271         auto jsEngine = weakEngine.Upgrade();
272         CHECK_NULL_VOID(jsEngine);
273         jsEngine->UpdateApplicationState(packageName, state);
274     };
275 
276     const auto& onWindowDisplayModeChangedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
277                                                          bool isShownInMultiWindow, const std::string& data) {
278         auto jsEngine = weakEngine.Upgrade();
279         CHECK_NULL_VOID(jsEngine);
280         jsEngine->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
281     };
282 
283     const auto& onSaveAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& data) {
284         auto jsEngine = weakEngine.Upgrade();
285         CHECK_NULL_VOID(jsEngine);
286         jsEngine->OnSaveAbilityState(data);
287     };
288     const auto& onRestoreAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
289                                                     const std::string& data) {
290         auto jsEngine = weakEngine.Upgrade();
291         CHECK_NULL_VOID(jsEngine);
292         jsEngine->OnRestoreAbilityState(data);
293     };
294 
295     const auto& onNewWantCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& data) {
296         auto jsEngine = weakEngine.Upgrade();
297         CHECK_NULL_VOID(jsEngine);
298         jsEngine->OnNewWant(data);
299     };
300     const auto& onActiveCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
301         auto jsEngine = weakEngine.Upgrade();
302         CHECK_NULL_VOID(jsEngine);
303         jsEngine->OnActive();
304     };
305 
306     const auto& onInactiveCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
307         auto jsEngine = weakEngine.Upgrade();
308         CHECK_NULL_VOID(jsEngine);
309         jsEngine->OnInactive();
310     };
311 
312     const auto& onConfigurationUpdatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
313                                                      const std::string& data) {
314         auto jsEngine = weakEngine.Upgrade();
315         CHECK_NULL_VOID(jsEngine);
316         jsEngine->OnConfigurationUpdated(data);
317     };
318 
319     const auto& timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
320                                     const std::string& callbackId, const std::string& delay, bool isInterval) {
321         auto jsEngine = weakEngine.Upgrade();
322         CHECK_NULL_VOID(jsEngine);
323         jsEngine->TimerCallback(callbackId, delay, isInterval);
324     };
325 
326     const auto& mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
327                                          const std::string& callbackId, const std::string& args) {
328         auto jsEngine = weakEngine.Upgrade();
329         CHECK_NULL_VOID(jsEngine);
330         jsEngine->MediaQueryCallback(callbackId, args);
331     };
332 
333     const auto& requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
334                                                const std::string& callbackId, uint64_t timeStamp) {
335         auto jsEngine = weakEngine.Upgrade();
336         CHECK_NULL_VOID(jsEngine);
337         jsEngine->RequestAnimationCallback(callbackId, timeStamp);
338     };
339 
340     const auto& jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
341                                  const std::string& callbackId, const std::string& args) {
342         auto jsEngine = weakEngine.Upgrade();
343         CHECK_NULL_VOID(jsEngine);
344         jsEngine->JsCallback(callbackId, args);
345     };
346 
347     const auto& onMemoryLevelCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const int32_t level) {
348         auto jsEngine = weakEngine.Upgrade();
349         CHECK_NULL_VOID(jsEngine);
350         jsEngine->OnMemoryLevel(level);
351     };
352 
353     const auto& onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
354         auto jsEngine = weakEngine.Upgrade();
355         CHECK_NULL_RETURN(jsEngine, false);
356         return jsEngine->OnStartContinuation();
357     };
358     const auto& onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
359         auto jsEngine = weakEngine.Upgrade();
360         CHECK_NULL_VOID(jsEngine);
361         jsEngine->OnCompleteContinuation(code);
362     };
363     const auto& onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
364         auto jsEngine = weakEngine.Upgrade();
365         CHECK_NULL_VOID(jsEngine);
366         jsEngine->OnRemoteTerminated();
367     };
368     const auto& onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
369         auto jsEngine = weakEngine.Upgrade();
370         CHECK_NULL_VOID(jsEngine);
371         jsEngine->OnSaveData(savedData);
372     };
373     const auto& onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
374                                             const std::string& data) -> bool {
375         auto jsEngine = weakEngine.Upgrade();
376         CHECK_NULL_RETURN(jsEngine, false);
377         return jsEngine->OnRestoreData(data);
378     };
379     delegate_ = AceType::MakeRefPtr<Framework::PluginFrontendDelegate>(taskExecutor, loadCallback,
380         setPluginMessageTransferCallback, asyncEventCallback, syncEventCallback, updatePageCallback,
381         resetStagingPageCallback, destroyPageCallback, destroyApplicationCallback, updateApplicationStateCallback,
382         timerCallback, mediaQueryCallback, requestAnimationCallback, jsCallback, onWindowDisplayModeChangedCallBack,
383         onConfigurationUpdatedCallBack, onSaveAbilityStateCallBack, onRestoreAbilityStateCallBack, onNewWantCallBack,
384         onActiveCallBack, onInactiveCallBack, onMemoryLevelCallBack, onStartContinuationCallBack,
385         onCompleteContinuationCallBack, onRemoteTerminatedCallBack, onSaveDataCallBack, onRestoreDataCallBack);
386     if (disallowPopLastPage_) {
387         delegate_->DisallowPopLastPage();
388     }
389     if (jsEngine_) {
390         delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
391     } else {
392         LOGE("the js engine is nullptr");
393         EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
394     }
395 }
396 
RunPage(const std::string & url,const std::string & params)397 UIContentErrorCode PluginFrontend::RunPage(const std::string& url, const std::string& params)
398 {
399     // Not use this pageId from backend, manage it in PluginFrontendDelegate.
400     CHECK_NULL_RETURN(delegate_, UIContentErrorCode::NULL_POINTER);
401     return delegate_->RunPage(url, params);
402 }
403 
ReplacePage(const std::string & url,const std::string & params)404 void PluginFrontend::ReplacePage(const std::string& url, const std::string& params)
405 {
406     CHECK_NULL_VOID(delegate_);
407     delegate_->Replace(url, params);
408 }
409 
PushPage(const std::string & url,const std::string & params)410 void PluginFrontend::PushPage(const std::string& url, const std::string& params)
411 {
412     CHECK_NULL_VOID(delegate_);
413     delegate_->Push(url, params);
414 }
415 
416 // navigator component call router
NavigatePage(uint8_t type,const PageTarget & target,const std::string & params)417 void PluginFrontend::NavigatePage(uint8_t type, const PageTarget& target, const std::string& params)
418 {
419     CHECK_NULL_VOID(delegate_);
420     switch (static_cast<NavigatorType>(type)) {
421         case NavigatorType::PUSH:
422             delegate_->Push(target, params);
423             break;
424         case NavigatorType::REPLACE:
425             delegate_->Replace(target, params);
426             break;
427         case NavigatorType::BACK:
428             delegate_->BackWithTarget(target, params);
429             break;
430         default:
431             LOGE("Navigator type is invalid!");
432             delegate_->BackWithTarget(target, params);
433     }
434 }
435 
SendCallbackMessage(const std::string & callbackId,const std::string & data) const436 void PluginFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
437 {
438     CHECK_NULL_VOID(delegate_);
439     delegate_->OnJSCallback(callbackId, data);
440 }
441 
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const442 void PluginFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
443 {
444     CHECK_NULL_VOID(delegate_);
445     delegate_->SetJsMessageDispatcher(dispatcher);
446 }
447 
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const448 void PluginFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
449 {
450     CHECK_NULL_VOID(delegate_);
451     delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
452 }
453 
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const454 void PluginFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
455 {
456     CHECK_NULL_VOID(delegate_);
457     delegate_->TransferJsResponseData(callbackId, code, std::move(data));
458 }
459 
460 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const461 void PluginFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
462 {
463     delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
464 }
465 #endif
466 
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const467 void PluginFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
468 {
469     CHECK_NULL_VOID(delegate_);
470     delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
471 }
472 
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const473 void PluginFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
474 {
475     CHECK_NULL_VOID(delegate_);
476     delegate_->TransferJsEventData(callbackId, code, std::move(data));
477 }
478 
LoadPluginJsCode(std::string && jsCode) const479 void PluginFrontend::LoadPluginJsCode(std::string&& jsCode) const
480 {
481     CHECK_NULL_VOID(delegate_);
482     delegate_->LoadPluginJsCode(std::move(jsCode));
483 }
484 
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const485 void PluginFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
486 {
487     CHECK_NULL_VOID(delegate_);
488     delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
489 }
490 
UpdateState(Frontend::State state)491 void PluginFrontend::UpdateState(Frontend::State state)
492 {
493     CHECK_NULL_VOID(delegate_);
494     switch (state) {
495         case Frontend::State::ON_CREATE:
496             break;
497         case Frontend::State::ON_SHOW:
498         case Frontend::State::ON_HIDE:
499             delegate_->UpdateApplicationState(delegate_->GetAppID(), state);
500             break;
501         case Frontend::State::ON_DESTROY:
502             delegate_->OnApplicationDestroy(delegate_->GetAppID());
503             break;
504         default:
505             LOGE("error State: %d", state);
506             break;
507     }
508 }
509 
OnWindowDisplayModeChanged(bool isShownInMultiWindow,const std::string & data)510 void PluginFrontend::OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data)
511 {
512     CHECK_NULL_VOID(delegate_);
513     delegate_->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
514 }
515 
OnSaveAbilityState(std::string & data)516 void PluginFrontend::OnSaveAbilityState(std::string& data)
517 {
518     CHECK_NULL_VOID(delegate_);
519     delegate_->OnSaveAbilityState(data);
520 }
521 
OnRestoreAbilityState(const std::string & data)522 void PluginFrontend::OnRestoreAbilityState(const std::string& data)
523 {
524     CHECK_NULL_VOID(delegate_);
525     delegate_->OnRestoreAbilityState(data);
526 }
527 
OnNewWant(const std::string & data)528 void PluginFrontend::OnNewWant(const std::string& data)
529 {
530     CHECK_NULL_VOID(delegate_);
531     delegate_->OnNewWant(data);
532 }
533 
GetAccessibilityManager() const534 RefPtr<AccessibilityManager> PluginFrontend::GetAccessibilityManager() const
535 {
536     CHECK_NULL_RETURN(delegate_, nullptr);
537     return delegate_->GetJSAccessibilityManager();
538 }
539 
GetWindowConfig()540 WindowConfig& PluginFrontend::GetWindowConfig()
541 {
542     if (!delegate_) {
543         static WindowConfig windowConfig;
544         LOGW("delegate is null, return default config");
545         return windowConfig;
546     }
547     return delegate_->GetWindowConfig();
548 }
549 
OnBackPressed()550 bool PluginFrontend::OnBackPressed()
551 {
552     CHECK_NULL_RETURN(delegate_, false);
553     return delegate_->OnPageBackPress();
554 }
555 
OnShow()556 void PluginFrontend::OnShow()
557 {
558     CHECK_NULL_VOID(delegate_);
559     delegate_->OnForeground();
560 }
561 
OnHide()562 void PluginFrontend::OnHide()
563 {
564     CHECK_NULL_VOID(delegate_);
565     delegate_->OnBackGround();
566     foregroundFrontend_ = false;
567 }
568 
OnConfigurationUpdated(const std::string & data)569 void PluginFrontend::OnConfigurationUpdated(const std::string& data)
570 {
571     CHECK_NULL_VOID(delegate_);
572     delegate_->OnConfigurationUpdated(data);
573 }
574 
OnActive()575 void PluginFrontend::OnActive()
576 {
577     CHECK_NULL_VOID(delegate_);
578     foregroundFrontend_ = true;
579     delegate_->OnActive();
580     delegate_->InitializeAccessibilityCallback();
581 }
582 
OnInactive()583 void PluginFrontend::OnInactive()
584 {
585     CHECK_NULL_VOID(delegate_);
586     delegate_->OnInactive();
587     delegate_->OnSuspended();
588 }
589 
OnStartContinuation()590 bool PluginFrontend::OnStartContinuation()
591 {
592     CHECK_NULL_RETURN(delegate_, false);
593     return delegate_->OnStartContinuation();
594 }
595 
OnCompleteContinuation(int32_t code)596 void PluginFrontend::OnCompleteContinuation(int32_t code)
597 {
598     CHECK_NULL_VOID(delegate_);
599     delegate_->OnCompleteContinuation(code);
600 }
601 
OnMemoryLevel(const int32_t level)602 void PluginFrontend::OnMemoryLevel(const int32_t level)
603 {
604     CHECK_NULL_VOID(delegate_);
605     delegate_->OnMemoryLevel(level);
606 }
607 
OnSaveData(std::string & data)608 void PluginFrontend::OnSaveData(std::string& data)
609 {
610     CHECK_NULL_VOID(delegate_);
611     delegate_->OnSaveData(data);
612 }
613 
GetPluginsUsed(std::string & data)614 void PluginFrontend::GetPluginsUsed(std::string& data)
615 {
616     CHECK_NULL_VOID(delegate_);
617     delegate_->GetPluginsUsed(data);
618 }
619 
OnRestoreData(const std::string & data)620 bool PluginFrontend::OnRestoreData(const std::string& data)
621 {
622     CHECK_NULL_RETURN(delegate_, false);
623     return delegate_->OnRestoreData(data);
624 }
625 
OnRemoteTerminated()626 void PluginFrontend::OnRemoteTerminated()
627 {
628     CHECK_NULL_VOID(delegate_);
629     delegate_->OnRemoteTerminated();
630 }
631 
OnNewRequest(const std::string & data)632 void PluginFrontend::OnNewRequest(const std::string& data)
633 {
634     CHECK_NULL_VOID(delegate_);
635     delegate_->OnNewRequest(data);
636 }
637 
CallRouterBack()638 void PluginFrontend::CallRouterBack()
639 {
640     CHECK_NULL_VOID(delegate_);
641     if (delegate_->GetStackSize() == 1 && isSubWindow_) {
642         LOGW("Can't back because this is the last page of sub window!");
643         return;
644     }
645     delegate_->CallPopPage();
646 }
647 
OnSurfaceChanged(int32_t width,int32_t height)648 void PluginFrontend::OnSurfaceChanged(int32_t width, int32_t height)
649 {
650     CHECK_NULL_VOID(delegate_);
651     delegate_->OnSurfaceChanged();
652 }
653 
OnLayoutCompleted(const std::string & componentId)654 void PluginFrontend::OnLayoutCompleted(const std::string& componentId)
655 {
656     CHECK_NULL_VOID(delegate_);
657 }
658 
OnDrawCompleted(const std::string & componentId)659 void PluginFrontend::OnDrawCompleted(const std::string& componentId)
660 {
661     CHECK_NULL_VOID(delegate_);
662 }
663 
DumpFrontend() const664 void PluginFrontend::DumpFrontend() const
665 {
666     CHECK_NULL_VOID(delegate_);
667     int32_t routerIndex = 0;
668     std::string routerName;
669     std::string routerPath;
670     delegate_->GetState(routerIndex, routerName, routerPath);
671 
672     if (DumpLog::GetInstance().GetDumpFile()) {
673         DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
674         DumpLog::GetInstance().AddDesc("Path: " + routerPath);
675         DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
676         DumpLog::GetInstance().Print(0, routerName, 0);
677     }
678 }
679 
GetPagePath() const680 std::string PluginFrontend::GetPagePath() const
681 {
682     CHECK_NULL_RETURN(delegate_, "");
683     int32_t routerIndex = 0;
684     std::string routerName;
685     std::string routerPath;
686     delegate_->GetState(routerIndex, routerName, routerPath);
687     return routerPath + routerName;
688 }
689 
TriggerGarbageCollection()690 void PluginFrontend::TriggerGarbageCollection()
691 {
692     CHECK_NULL_VOID(delegate_);
693     jsEngine_->RunGarbageCollection();
694 }
695 
SetColorMode(ColorMode colorMode)696 void PluginFrontend::SetColorMode(ColorMode colorMode)
697 {
698     CHECK_NULL_VOID(delegate_);
699     delegate_->SetColorMode(colorMode);
700 }
701 
RebuildAllPages()702 void PluginFrontend::RebuildAllPages()
703 {
704     CHECK_NULL_VOID(delegate_);
705     delegate_->RebuildAllPages();
706 }
707 
NotifyAppStorage(const std::string & key,const std::string & value)708 void PluginFrontend::NotifyAppStorage(const std::string& key, const std::string& value)
709 {
710     CHECK_NULL_VOID(delegate_);
711     delegate_->NotifyAppStorage(jsEngine_, key, value);
712 }
713 
UpdatePlugin(const std::string & content)714 void PluginFrontend::UpdatePlugin(const std::string& content)
715 {
716     CHECK_NULL_VOID(delegate_);
717     delegate_->UpdatePlugin(content);
718 }
719 
HandleAsyncEvent(const EventMarker & eventMarker)720 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
721 {
722     std::string param = eventMarker.GetData().GetEventParam();
723     if (eventMarker.GetData().isDeclarativeUi) {
724         if (delegate_) {
725             delegate_->GetUiTask().PostTask(
726                 [eventMarker] { eventMarker.CallUiFunction(); }, "ArkUIPluginCallUiFunction");
727         }
728     } else {
729         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
730     }
731 
732     AccessibilityEvent accessibilityEvent;
733     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
734     accessibilityEvent.eventType = eventMarker.GetData().eventType;
735     delegate_->FireAccessibilityEvent(accessibilityEvent);
736 }
737 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)738 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
739 {
740     std::string eventParam;
741     if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
742         TouchInfoToString(info, eventParam);
743     } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
744         MouseInfoToString(info, eventParam);
745     } else if (eventMarker.GetData().eventType == "swipe") {
746         SwipeInfoToString(info, eventParam);
747     }
748 
749     std::string param = eventMarker.GetData().GetEventParam();
750     if (eventParam.empty()) {
751         param.append("null");
752     } else {
753         param.append(eventParam);
754     }
755 
756     if (eventMarker.GetData().isDeclarativeUi) {
757         if (delegate_) {
758             auto cinfo = CopyEventInfo(info);
759             delegate_->GetUiTask().PostTask(
760                 [eventMarker, cinfo] { eventMarker.CallUiArgFunction(cinfo.get()); }, "ArkUIPluginCallUiArgFunction");
761         }
762     } else {
763         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
764     }
765 
766     AccessibilityEvent accessibilityEvent;
767     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
768     accessibilityEvent.eventType = eventMarker.GetData().eventType;
769     delegate_->FireAccessibilityEvent(accessibilityEvent);
770 }
771 
HandleAsyncEvent(const EventMarker & eventMarker,const std::shared_ptr<BaseEventInfo> & info)772 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
773 {
774     if (eventMarker.GetData().isDeclarativeUi) {
775         if (delegate_) {
776             delegate_->GetUiTask().PostTask(
777                 [eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); }, "ArkUIPluginCallUiArgFunction");
778         }
779     }
780 }
781 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)782 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
783 {
784     std::string param = std::string("\"")
785                             .append(eventMarker.GetData().eventType)
786                             .append("\",{\"code\":")
787                             .append(std::to_string(static_cast<int32_t>(info.code)))
788                             .append(",\"action\":")
789                             .append(std::to_string(static_cast<int32_t>(info.action)))
790                             .append(",\"repeatCount\":")
791                             .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
792                             .append(",\"timestamp\":")
793                             .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
794                             .append(",\"key\":\"")
795                             .append(info.key)
796                             .append("\"},");
797 
798     result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
799 
800     AccessibilityEvent accessibilityEvent;
801     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
802     accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
803     delegate_->FireAccessibilityEvent(accessibilityEvent);
804 }
805 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)806 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
807 {
808     LOGW("js event handler does not support this event type!");
809     AccessibilityEvent accessibilityEvent;
810     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
811     accessibilityEvent.eventType = eventMarker.GetData().eventType;
812     delegate_->FireAccessibilityEvent(accessibilityEvent);
813 }
814 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)815 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
816 {
817     LOGW("js event handler does not support this event type!");
818     AccessibilityEvent accessibilityEvent;
819     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
820     accessibilityEvent.eventType = eventMarker.GetData().eventType;
821     delegate_->FireAccessibilityEvent(accessibilityEvent);
822 }
823 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)824 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
825 {
826     if (eventMarker.GetData().isDeclarativeUi) {
827         std::string fixParam(param);
828         std::string::size_type startPos = param.find_first_of("{");
829         std::string::size_type endPos = param.find_last_of("}");
830         if (startPos != std::string::npos && endPos != std::string::npos && startPos < endPos) {
831             fixParam = fixParam.substr(startPos, endPos - startPos + 1);
832         }
833         if (delegate_) {
834             delegate_->GetUiTask().PostTask(
835                 [eventMarker, fixParam] { eventMarker.CallUiStrFunction(fixParam); }, "ArkUIPluginCallUiStrFunction");
836         }
837     } else {
838         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
839     }
840 
841     AccessibilityEvent accessibilityEvent;
842     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
843     accessibilityEvent.eventType = eventMarker.GetData().eventType;
844     delegate_->FireAccessibilityEvent(accessibilityEvent);
845 }
846 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)847 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
848 {
849     LOGW("js event handler does not support this event type!");
850     AccessibilityEvent accessibilityEvent;
851     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
852     accessibilityEvent.eventType = eventMarker.GetData().eventType;
853     delegate_->FireAccessibilityEvent(accessibilityEvent);
854 }
855 
HandleSyncEvent(const EventMarker & eventMarker,const std::shared_ptr<BaseEventInfo> & info)856 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
857 {
858     CHECK_NULL_VOID(delegate_);
859     delegate_->GetUiTask().PostSyncTask(
860         [eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); }, "ArkUIPluginCallUiArgFunction");
861 }
862 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)863 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
864 {
865     LOGW("js event handler does not support this event type!");
866     AccessibilityEvent accessibilityEvent;
867     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
868     accessibilityEvent.eventType = eventMarker.GetData().eventType;
869     delegate_->FireAccessibilityEvent(accessibilityEvent);
870 }
871 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)872 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
873 {
874     LOGW("js event handler does not support this event type!");
875     AccessibilityEvent accessibilityEvent;
876     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
877     accessibilityEvent.eventType = eventMarker.GetData().eventType;
878     delegate_->FireAccessibilityEvent(accessibilityEvent);
879     delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
880 }
881 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)882 void PluginEventHandler::HandleSyncEvent(
883     const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
884 {
885     LOGW("js event handler does not support this event type!");
886 }
887 } // namespace OHOS::Ace
888