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