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