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