• 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/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     eventParam = swipeInfo->ToJsonParamInfo();
155 }
156 } // namespace
157 
~PluginFrontend()158 PluginFrontend::~PluginFrontend() noexcept
159 {
160     LOG_DESTROY();
161 }
162 
Destroy()163 void PluginFrontend::Destroy()
164 {
165     CHECK_RUN_ON(JS);
166     // To guarantee the jsEngine_ and delegate_ released in js thread
167     jsEngine_.Reset();
168     delegate_.Reset();
169     handler_.Reset();
170 }
171 
Initialize(FrontendType type,const RefPtr<TaskExecutor> & taskExecutor)172 bool PluginFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
173 {
174     type_ = type;
175     ACE_DCHECK(type_ == FrontendType::JS_PLUGIN);
176     InitializeFrontendDelegate(taskExecutor);
177     taskExecutor->PostSyncTask(
178         [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_] {
179             auto jsEngine = weakEngine.Upgrade();
180             CHECK_NULL_VOID_NOLOG(jsEngine);
181             jsEngine->Initialize(delegate);
182         },
183         TaskExecutor::TaskType::JS);
184 
185     return true;
186 }
187 
AttachPipelineContext(const RefPtr<PipelineBase> & context)188 void PluginFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
189 {
190     CHECK_NULL_VOID_NOLOG(delegate_);
191     handler_ = AceType::MakeRefPtr<PluginEventHandler>(delegate_);
192     auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
193     if (pipelineContext) {
194         pipelineContext->RegisterEventHandler(handler_);
195     }
196     delegate_->AttachPipelineContext(context);
197 }
198 
SetAssetManager(const RefPtr<AssetManager> & assetManager)199 void PluginFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
200 {
201     if (delegate_) {
202         delegate_->SetAssetManager(assetManager);
203     }
204 }
205 
InitializeFrontendDelegate(const RefPtr<TaskExecutor> & taskExecutor)206 void PluginFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
207 {
208     const auto& loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
209                                    const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
210         auto jsEngine = weakEngine.Upgrade();
211         CHECK_NULL_VOID_NOLOG(jsEngine);
212         jsEngine->LoadJs(url, jsPage, isMainPage);
213     };
214 
215     const auto& setPluginMessageTransferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
216                                                        const RefPtr<JsMessageDispatcher>& dispatcher) {
217         auto jsEngine = weakEngine.Upgrade();
218         CHECK_NULL_VOID_NOLOG(jsEngine);
219         jsEngine->SetJsMessageDispatcher(dispatcher);
220     };
221 
222     const auto& asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
223                                          const std::string& eventId, const std::string& param) {
224         auto jsEngine = weakEngine.Upgrade();
225         CHECK_NULL_VOID_NOLOG(jsEngine);
226         jsEngine->FireAsyncEvent(eventId, param);
227     };
228 
229     const auto& syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
230                                         const std::string& eventId, const std::string& param) {
231         auto jsEngine = weakEngine.Upgrade();
232         CHECK_NULL_VOID_NOLOG(jsEngine);
233         jsEngine->FireSyncEvent(eventId, param);
234     };
235 
236     const auto& updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
237                                          const RefPtr<Framework::JsAcePage>& jsPage) {
238         auto jsEngine = weakEngine.Upgrade();
239         CHECK_NULL_VOID_NOLOG(jsEngine);
240         jsEngine->UpdateRunningPage(jsPage);
241         jsEngine->UpdateStagingPage(jsPage);
242     };
243 
244     const auto& resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
245         auto jsEngine = weakEngine.Upgrade();
246         CHECK_NULL_VOID_NOLOG(jsEngine);
247         jsEngine->ResetStagingPage();
248     };
249 
250     const auto& destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
251         auto jsEngine = weakEngine.Upgrade();
252         CHECK_NULL_VOID_NOLOG(jsEngine);
253         jsEngine->DestroyPageInstance(pageId);
254     };
255 
256     const auto& destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
257                                                  const std::string& packageName) {
258         auto jsEngine = weakEngine.Upgrade();
259         CHECK_NULL_VOID_NOLOG(jsEngine);
260         jsEngine->DestroyApplication(packageName);
261     };
262 
263     const auto& updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
264                                                      const std::string& packageName, Frontend::State state) {
265         auto jsEngine = weakEngine.Upgrade();
266         CHECK_NULL_VOID_NOLOG(jsEngine);
267         jsEngine->UpdateApplicationState(packageName, state);
268     };
269 
270     const auto& onWindowDisplayModeChangedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
271                                                          bool isShownInMultiWindow, const std::string& data) {
272         auto jsEngine = weakEngine.Upgrade();
273         CHECK_NULL_VOID_NOLOG(jsEngine);
274         jsEngine->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
275     };
276 
277     const auto& onSaveAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& data) {
278         auto jsEngine = weakEngine.Upgrade();
279         CHECK_NULL_VOID(jsEngine);
280         jsEngine->OnSaveAbilityState(data);
281     };
282     const auto& onRestoreAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
283                                                     const std::string& data) {
284         auto jsEngine = weakEngine.Upgrade();
285         CHECK_NULL_VOID(jsEngine);
286         jsEngine->OnRestoreAbilityState(data);
287     };
288 
289     const auto& onNewWantCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& data) {
290         auto jsEngine = weakEngine.Upgrade();
291         CHECK_NULL_VOID(jsEngine);
292         jsEngine->OnNewWant(data);
293     };
294     const auto& onActiveCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
295         auto jsEngine = weakEngine.Upgrade();
296         CHECK_NULL_VOID_NOLOG(jsEngine);
297         jsEngine->OnActive();
298     };
299 
300     const auto& onInactiveCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
301         auto jsEngine = weakEngine.Upgrade();
302         CHECK_NULL_VOID_NOLOG(jsEngine);
303         jsEngine->OnInactive();
304     };
305 
306     const auto& onConfigurationUpdatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
307                                                      const std::string& data) {
308         auto jsEngine = weakEngine.Upgrade();
309         CHECK_NULL_VOID_NOLOG(jsEngine);
310         jsEngine->OnConfigurationUpdated(data);
311     };
312 
313     const auto& timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
314                                     const std::string& callbackId, const std::string& delay, bool isInterval) {
315         auto jsEngine = weakEngine.Upgrade();
316         CHECK_NULL_VOID_NOLOG(jsEngine);
317         jsEngine->TimerCallback(callbackId, delay, isInterval);
318     };
319 
320     const auto& mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
321                                          const std::string& callbackId, const std::string& args) {
322         auto jsEngine = weakEngine.Upgrade();
323         CHECK_NULL_VOID_NOLOG(jsEngine);
324         jsEngine->MediaQueryCallback(callbackId, args);
325     };
326 
327     const auto& requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
328                                                const std::string& callbackId, uint64_t timeStamp) {
329         auto jsEngine = weakEngine.Upgrade();
330         CHECK_NULL_VOID_NOLOG(jsEngine);
331         jsEngine->RequestAnimationCallback(callbackId, timeStamp);
332     };
333 
334     const auto& jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
335                                  const std::string& callbackId, const std::string& args) {
336         auto jsEngine = weakEngine.Upgrade();
337         CHECK_NULL_VOID_NOLOG(jsEngine);
338         jsEngine->JsCallback(callbackId, args);
339     };
340 
341     const auto& onMemoryLevelCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const int32_t level) {
342         auto jsEngine = weakEngine.Upgrade();
343         CHECK_NULL_VOID_NOLOG(jsEngine);
344         jsEngine->OnMemoryLevel(level);
345     };
346 
347     const auto& onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
348         auto jsEngine = weakEngine.Upgrade();
349         CHECK_NULL_RETURN_NOLOG(jsEngine, false);
350         return jsEngine->OnStartContinuation();
351     };
352     const auto& onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
353         auto jsEngine = weakEngine.Upgrade();
354         CHECK_NULL_VOID_NOLOG(jsEngine);
355         jsEngine->OnCompleteContinuation(code);
356     };
357     const auto& onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
358         auto jsEngine = weakEngine.Upgrade();
359         CHECK_NULL_VOID_NOLOG(jsEngine);
360         jsEngine->OnRemoteTerminated();
361     };
362     const auto& onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
363         auto jsEngine = weakEngine.Upgrade();
364         CHECK_NULL_VOID_NOLOG(jsEngine);
365         jsEngine->OnSaveData(savedData);
366     };
367     const auto& onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
368                                             const std::string& data) -> bool {
369         auto jsEngine = weakEngine.Upgrade();
370         CHECK_NULL_RETURN_NOLOG(jsEngine, false);
371         return jsEngine->OnRestoreData(data);
372     };
373     delegate_ = AceType::MakeRefPtr<Framework::PluginFrontendDelegate>(taskExecutor, loadCallback,
374         setPluginMessageTransferCallback, asyncEventCallback, syncEventCallback, updatePageCallback,
375         resetStagingPageCallback, destroyPageCallback, destroyApplicationCallback, updateApplicationStateCallback,
376         timerCallback, mediaQueryCallback, requestAnimationCallback, jsCallback, onWindowDisplayModeChangedCallBack,
377         onConfigurationUpdatedCallBack, onSaveAbilityStateCallBack, onRestoreAbilityStateCallBack, onNewWantCallBack,
378         onActiveCallBack, onInactiveCallBack, onMemoryLevelCallBack, onStartContinuationCallBack,
379         onCompleteContinuationCallBack, onRemoteTerminatedCallBack, onSaveDataCallBack, onRestoreDataCallBack);
380     if (disallowPopLastPage_) {
381         delegate_->DisallowPopLastPage();
382     }
383     if (jsEngine_) {
384         delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
385     } else {
386         LOGE("the js engine is nullptr");
387         EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
388     }
389 }
390 
RunPage(int32_t pageId,const std::string & url,const std::string & params)391 void PluginFrontend::RunPage(int32_t pageId, const std::string& url, const std::string& params)
392 {
393     // Not use this pageId from backend, manage it in PluginFrontendDelegate.
394     CHECK_NULL_VOID_NOLOG(delegate_);
395     delegate_->RunPage(url, params);
396 }
397 
ReplacePage(const std::string & url,const std::string & params)398 void PluginFrontend::ReplacePage(const std::string& url, const std::string& params)
399 {
400     CHECK_NULL_VOID_NOLOG(delegate_);
401     delegate_->Replace(url, params);
402 }
403 
PushPage(const std::string & url,const std::string & params)404 void PluginFrontend::PushPage(const std::string& url, const std::string& params)
405 {
406     CHECK_NULL_VOID_NOLOG(delegate_);
407     delegate_->Push(url, params);
408 }
409 
410 // navigator component call router
NavigatePage(uint8_t type,const PageTarget & target,const std::string & params)411 void PluginFrontend::NavigatePage(uint8_t type, const PageTarget& target, const std::string& params)
412 {
413     CHECK_NULL_VOID_NOLOG(delegate_);
414     switch (static_cast<NavigatorType>(type)) {
415         case NavigatorType::PUSH:
416             delegate_->Push(target, params);
417             break;
418         case NavigatorType::REPLACE:
419             delegate_->Replace(target, params);
420             break;
421         case NavigatorType::BACK:
422             delegate_->BackWithTarget(target, params);
423             break;
424         default:
425             LOGE("Navigator type is invalid!");
426             delegate_->BackWithTarget(target, params);
427     }
428 }
429 
SendCallbackMessage(const std::string & callbackId,const std::string & data) const430 void PluginFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
431 {
432     CHECK_NULL_VOID_NOLOG(delegate_);
433     delegate_->OnJSCallback(callbackId, data);
434 }
435 
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const436 void PluginFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
437 {
438     CHECK_NULL_VOID_NOLOG(delegate_);
439     delegate_->SetJsMessageDispatcher(dispatcher);
440 }
441 
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const442 void PluginFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
443 {
444     CHECK_NULL_VOID_NOLOG(delegate_);
445     delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
446 }
447 
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const448 void PluginFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
449 {
450     CHECK_NULL_VOID_NOLOG(delegate_);
451     delegate_->TransferJsResponseData(callbackId, code, std::move(data));
452 }
453 
454 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const455 void PluginFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
456 {
457     delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
458 }
459 #endif
460 
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const461 void PluginFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
462 {
463     CHECK_NULL_VOID_NOLOG(delegate_);
464     delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
465 }
466 
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const467 void PluginFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
468 {
469     CHECK_NULL_VOID_NOLOG(delegate_);
470     delegate_->TransferJsEventData(callbackId, code, std::move(data));
471 }
472 
LoadPluginJsCode(std::string && jsCode) const473 void PluginFrontend::LoadPluginJsCode(std::string&& jsCode) const
474 {
475     CHECK_NULL_VOID_NOLOG(delegate_);
476     delegate_->LoadPluginJsCode(std::move(jsCode));
477 }
478 
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const479 void PluginFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
480 {
481     CHECK_NULL_VOID_NOLOG(delegate_);
482     delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
483 }
484 
UpdateState(Frontend::State state)485 void PluginFrontend::UpdateState(Frontend::State state)
486 {
487     CHECK_NULL_VOID_NOLOG(delegate_);
488     switch (state) {
489         case Frontend::State::ON_CREATE:
490             break;
491         case Frontend::State::ON_SHOW:
492         case Frontend::State::ON_HIDE:
493             delegate_->UpdateApplicationState(delegate_->GetAppID(), state);
494             break;
495         case Frontend::State::ON_DESTROY:
496             delegate_->OnApplicationDestroy(delegate_->GetAppID());
497             break;
498         default:
499             LOGE("error State: %d", state);
500             break;
501     }
502 }
503 
OnWindowDisplayModeChanged(bool isShownInMultiWindow,const std::string & data)504 void PluginFrontend::OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data)
505 {
506     CHECK_NULL_VOID_NOLOG(delegate_);
507     delegate_->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
508 }
509 
OnSaveAbilityState(std::string & data)510 void PluginFrontend::OnSaveAbilityState(std::string& data)
511 {
512     CHECK_NULL_VOID_NOLOG(delegate_);
513     delegate_->OnSaveAbilityState(data);
514 }
515 
OnRestoreAbilityState(const std::string & data)516 void PluginFrontend::OnRestoreAbilityState(const std::string& data)
517 {
518     CHECK_NULL_VOID_NOLOG(delegate_);
519     delegate_->OnRestoreAbilityState(data);
520 }
521 
OnNewWant(const std::string & data)522 void PluginFrontend::OnNewWant(const std::string& data)
523 {
524     CHECK_NULL_VOID_NOLOG(delegate_);
525     delegate_->OnNewWant(data);
526 }
527 
GetAccessibilityManager() const528 RefPtr<AccessibilityManager> PluginFrontend::GetAccessibilityManager() const
529 {
530     CHECK_NULL_RETURN(delegate_, nullptr);
531     return delegate_->GetJSAccessibilityManager();
532 }
533 
GetWindowConfig()534 WindowConfig& PluginFrontend::GetWindowConfig()
535 {
536     if (!delegate_) {
537         static WindowConfig windowConfig;
538         LOGW("delegate is null, return default config");
539         return windowConfig;
540     }
541     return delegate_->GetWindowConfig();
542 }
543 
OnBackPressed()544 bool PluginFrontend::OnBackPressed()
545 {
546     CHECK_NULL_RETURN(delegate_, false);
547     return delegate_->OnPageBackPress();
548 }
549 
OnShow()550 void PluginFrontend::OnShow()
551 {
552     CHECK_NULL_VOID_NOLOG(delegate_);
553     delegate_->OnForeground();
554 }
555 
OnHide()556 void PluginFrontend::OnHide()
557 {
558     CHECK_NULL_VOID_NOLOG(delegate_);
559     delegate_->OnBackGround();
560     foregroundFrontend_ = false;
561 }
562 
OnConfigurationUpdated(const std::string & data)563 void PluginFrontend::OnConfigurationUpdated(const std::string& data)
564 {
565     CHECK_NULL_VOID_NOLOG(delegate_);
566     delegate_->OnConfigurationUpdated(data);
567 }
568 
OnActive()569 void PluginFrontend::OnActive()
570 {
571     CHECK_NULL_VOID_NOLOG(delegate_);
572     foregroundFrontend_ = true;
573     delegate_->OnActive();
574     delegate_->InitializeAccessibilityCallback();
575 }
576 
OnInactive()577 void PluginFrontend::OnInactive()
578 {
579     CHECK_NULL_VOID_NOLOG(delegate_);
580     delegate_->OnInactive();
581     delegate_->OnSuspended();
582 }
583 
OnStartContinuation()584 bool PluginFrontend::OnStartContinuation()
585 {
586     CHECK_NULL_RETURN(delegate_, false);
587     return delegate_->OnStartContinuation();
588 }
589 
OnCompleteContinuation(int32_t code)590 void PluginFrontend::OnCompleteContinuation(int32_t code)
591 {
592     CHECK_NULL_VOID_NOLOG(delegate_);
593     delegate_->OnCompleteContinuation(code);
594 }
595 
OnMemoryLevel(const int32_t level)596 void PluginFrontend::OnMemoryLevel(const int32_t level)
597 {
598     CHECK_NULL_VOID_NOLOG(delegate_);
599     delegate_->OnMemoryLevel(level);
600 }
601 
OnSaveData(std::string & data)602 void PluginFrontend::OnSaveData(std::string& data)
603 {
604     CHECK_NULL_VOID_NOLOG(delegate_);
605     delegate_->OnSaveData(data);
606 }
607 
GetPluginsUsed(std::string & data)608 void PluginFrontend::GetPluginsUsed(std::string& data)
609 {
610     CHECK_NULL_VOID_NOLOG(delegate_);
611     delegate_->GetPluginsUsed(data);
612 }
613 
OnRestoreData(const std::string & data)614 bool PluginFrontend::OnRestoreData(const std::string& data)
615 {
616     CHECK_NULL_RETURN(delegate_, false);
617     return delegate_->OnRestoreData(data);
618 }
619 
OnRemoteTerminated()620 void PluginFrontend::OnRemoteTerminated()
621 {
622     CHECK_NULL_VOID_NOLOG(delegate_);
623     delegate_->OnRemoteTerminated();
624 }
625 
OnNewRequest(const std::string & data)626 void PluginFrontend::OnNewRequest(const std::string& data)
627 {
628     CHECK_NULL_VOID_NOLOG(delegate_);
629     delegate_->OnNewRequest(data);
630 }
631 
CallRouterBack()632 void PluginFrontend::CallRouterBack()
633 {
634     CHECK_NULL_VOID(delegate_);
635     if (delegate_->GetStackSize() == 1 && isSubWindow_) {
636         LOGW("Can't back because this is the last page of sub window!");
637         return;
638     }
639     delegate_->CallPopPage();
640 }
641 
OnSurfaceChanged(int32_t width,int32_t height)642 void PluginFrontend::OnSurfaceChanged(int32_t width, int32_t height)
643 {
644     CHECK_NULL_VOID_NOLOG(delegate_);
645     delegate_->OnSurfaceChanged();
646 }
647 
DumpFrontend() const648 void PluginFrontend::DumpFrontend() const
649 {
650     CHECK_NULL_VOID_NOLOG(delegate_);
651     int32_t routerIndex = 0;
652     std::string routerName;
653     std::string routerPath;
654     delegate_->GetState(routerIndex, routerName, routerPath);
655 
656     if (DumpLog::GetInstance().GetDumpFile()) {
657         DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
658         DumpLog::GetInstance().AddDesc("Path: " + routerPath);
659         DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
660         DumpLog::GetInstance().Print(0, routerName, 0);
661     }
662 }
663 
GetPagePath() const664 std::string PluginFrontend::GetPagePath() const
665 {
666     CHECK_NULL_RETURN_NOLOG(delegate_, "");
667     int32_t routerIndex = 0;
668     std::string routerName;
669     std::string routerPath;
670     delegate_->GetState(routerIndex, routerName, routerPath);
671     return routerPath + routerName;
672 }
673 
TriggerGarbageCollection()674 void PluginFrontend::TriggerGarbageCollection()
675 {
676     CHECK_NULL_VOID_NOLOG(delegate_);
677     jsEngine_->RunGarbageCollection();
678 }
679 
SetColorMode(ColorMode colorMode)680 void PluginFrontend::SetColorMode(ColorMode colorMode)
681 {
682     CHECK_NULL_VOID_NOLOG(delegate_);
683     delegate_->SetColorMode(colorMode);
684 }
685 
RebuildAllPages()686 void PluginFrontend::RebuildAllPages()
687 {
688     CHECK_NULL_VOID_NOLOG(delegate_);
689     delegate_->RebuildAllPages();
690 }
691 
NotifyAppStorage(const std::string & key,const std::string & value)692 void PluginFrontend::NotifyAppStorage(const std::string& key, const std::string& value)
693 {
694     CHECK_NULL_VOID_NOLOG(delegate_);
695     delegate_->NotifyAppStorage(jsEngine_, key, value);
696 }
697 
UpdatePlugin(const std::string & content)698 void PluginFrontend::UpdatePlugin(const std::string& content)
699 {
700     CHECK_NULL_VOID(delegate_);
701     delegate_->UpdatePlugin(content);
702 }
703 
HandleAsyncEvent(const EventMarker & eventMarker)704 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
705 {
706     std::string param = eventMarker.GetData().GetEventParam();
707     if (eventMarker.GetData().isDeclarativeUi) {
708         if (delegate_) {
709             delegate_->GetUiTask().PostTask([eventMarker] { eventMarker.CallUiFunction(); });
710         }
711     } else {
712         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
713     }
714 
715     AccessibilityEvent accessibilityEvent;
716     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
717     accessibilityEvent.eventType = eventMarker.GetData().eventType;
718     delegate_->FireAccessibilityEvent(accessibilityEvent);
719 }
720 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)721 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
722 {
723     std::string eventParam;
724     if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
725         TouchInfoToString(info, eventParam);
726     } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
727         MouseInfoToString(info, eventParam);
728     } else if (eventMarker.GetData().eventType == "swipe") {
729         SwipeInfoToString(info, eventParam);
730     }
731 
732     std::string param = eventMarker.GetData().GetEventParam();
733     if (eventParam.empty()) {
734         param.append("null");
735     } else {
736         param.append(eventParam);
737     }
738 
739     if (eventMarker.GetData().isDeclarativeUi) {
740         if (delegate_) {
741             auto cinfo = CopyEventInfo(info);
742             delegate_->GetUiTask().PostTask([eventMarker, cinfo] { eventMarker.CallUiArgFunction(cinfo.get()); });
743         }
744     } else {
745         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
746     }
747 
748     AccessibilityEvent accessibilityEvent;
749     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
750     accessibilityEvent.eventType = eventMarker.GetData().eventType;
751     delegate_->FireAccessibilityEvent(accessibilityEvent);
752 }
753 
HandleAsyncEvent(const EventMarker & eventMarker,const std::shared_ptr<BaseEventInfo> & info)754 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
755 {
756     if (eventMarker.GetData().isDeclarativeUi) {
757         if (delegate_) {
758             delegate_->GetUiTask().PostTask([eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); });
759         }
760     }
761 }
762 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)763 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
764 {
765     std::string param = std::string("\"")
766                             .append(eventMarker.GetData().eventType)
767                             .append("\",{\"code\":")
768                             .append(std::to_string(static_cast<int32_t>(info.code)))
769                             .append(",\"action\":")
770                             .append(std::to_string(static_cast<int32_t>(info.action)))
771                             .append(",\"repeatCount\":")
772                             .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
773                             .append(",\"timestamp\":")
774                             .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
775                             .append(",\"key\":\"")
776                             .append(info.key)
777                             .append("\"},");
778 
779     result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
780 
781     AccessibilityEvent accessibilityEvent;
782     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
783     accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
784     delegate_->FireAccessibilityEvent(accessibilityEvent);
785 }
786 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)787 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
788 {
789     LOGW("js event handler does not support this event type!");
790     AccessibilityEvent accessibilityEvent;
791     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
792     accessibilityEvent.eventType = eventMarker.GetData().eventType;
793     delegate_->FireAccessibilityEvent(accessibilityEvent);
794 }
795 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)796 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
797 {
798     LOGW("js event handler does not support this event type!");
799     AccessibilityEvent accessibilityEvent;
800     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
801     accessibilityEvent.eventType = eventMarker.GetData().eventType;
802     delegate_->FireAccessibilityEvent(accessibilityEvent);
803 }
804 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)805 void PluginEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
806 {
807     if (eventMarker.GetData().isDeclarativeUi) {
808         std::string fixParam(param);
809         std::string::size_type startPos = param.find_first_of("{");
810         std::string::size_type endPos = param.find_last_of("}");
811         if (startPos != std::string::npos && endPos != std::string::npos && startPos < endPos) {
812             fixParam = fixParam.substr(startPos, endPos - startPos + 1);
813         }
814         if (delegate_) {
815             delegate_->GetUiTask().PostTask([eventMarker, fixParam] { eventMarker.CallUiStrFunction(fixParam); });
816         }
817     } else {
818         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
819     }
820 
821     AccessibilityEvent accessibilityEvent;
822     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
823     accessibilityEvent.eventType = eventMarker.GetData().eventType;
824     delegate_->FireAccessibilityEvent(accessibilityEvent);
825 }
826 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)827 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
828 {
829     LOGW("js event handler does not support this event type!");
830     AccessibilityEvent accessibilityEvent;
831     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
832     accessibilityEvent.eventType = eventMarker.GetData().eventType;
833     delegate_->FireAccessibilityEvent(accessibilityEvent);
834 }
835 
HandleSyncEvent(const EventMarker & eventMarker,const std::shared_ptr<BaseEventInfo> & info)836 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
837 {
838     CHECK_NULL_VOID_NOLOG(delegate_);
839     delegate_->GetUiTask().PostSyncTask([eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); });
840 }
841 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)842 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
843 {
844     LOGW("js event handler does not support this event type!");
845     AccessibilityEvent accessibilityEvent;
846     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
847     accessibilityEvent.eventType = eventMarker.GetData().eventType;
848     delegate_->FireAccessibilityEvent(accessibilityEvent);
849 }
850 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)851 void PluginEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
852 {
853     LOGW("js event handler does not support this event type!");
854     AccessibilityEvent accessibilityEvent;
855     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
856     accessibilityEvent.eventType = eventMarker.GetData().eventType;
857     delegate_->FireAccessibilityEvent(accessibilityEvent);
858     delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
859 }
860 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)861 void PluginEventHandler::HandleSyncEvent(
862     const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
863 {
864     LOGW("js event handler does not support this event type!");
865 }
866 } // namespace OHOS::Ace
867