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