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/js_frontend/js_frontend.h"
17
18 #include "base/log/dump_log.h"
19 #include "base/log/event_report.h"
20 #include "core/common/thread_checker.h"
21
22 namespace OHOS::Ace {
23 namespace {
24
TouchInfoToString(const BaseEventInfo & info,std::string & eventParam)25 void TouchInfoToString(const BaseEventInfo& info, std::string& eventParam)
26 {
27 eventParam.append("{\"touches\":[");
28 const auto touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
29 if (touchInfo) {
30 auto touchList = touchInfo->GetTouches();
31 for (const auto& location : touchList) {
32 eventParam.append("{");
33 auto globalLocation = location.GetGlobalLocation();
34 eventParam.append("\"globalX\":")
35 .append(std::to_string(globalLocation.GetX()))
36 .append(",\"globalY\":")
37 .append(std::to_string(globalLocation.GetY()))
38 .append(",");
39 auto localLocation = location.GetLocalLocation();
40 eventParam.append("\"localX\":")
41 .append(std::to_string(localLocation.GetX()))
42 .append(",\"localY\":")
43 .append(std::to_string(localLocation.GetY()))
44 .append(",");
45 eventParam.append("\"size\":").append(std::to_string(location.GetSize())).append(",");
46 eventParam.append("\"identifier\":").append(std::to_string(location.GetFingerId())).append(",");
47 eventParam.append("\"force\":").append(std::to_string(location.GetForce())).append("},");
48 }
49 if (eventParam.back() == ',') {
50 eventParam.pop_back();
51 }
52 eventParam.append("],");
53 eventParam.append("\"deviceId\":").append(std::to_string(touchInfo->GetDeviceId())).append(",");
54 eventParam.append("\"changedTouches\":[");
55 auto changeTouch = touchInfo->GetChangedTouches();
56 for (const auto& change : changeTouch) {
57 eventParam.append("{");
58 auto globalLocation = change.GetGlobalLocation();
59 eventParam.append("\"globalX\":")
60 .append(std::to_string(globalLocation.GetX()))
61 .append(",\"globalY\":")
62 .append(std::to_string(globalLocation.GetY()))
63 .append(",");
64 auto localLocation = change.GetLocalLocation();
65 eventParam.append("\"localX\":")
66 .append(std::to_string(localLocation.GetX()))
67 .append(",\"localY\":")
68 .append(std::to_string(localLocation.GetY()))
69 .append(",");
70 eventParam.append("\"size\":").append(std::to_string(change.GetSize())).append(",");
71 eventParam.append("\"identifier\":").append(std::to_string(change.GetFingerId())).append(",");
72 eventParam.append("\"force\":").append(std::to_string(change.GetForce())).append("},");
73 }
74 if (eventParam.back() == ',') {
75 eventParam.pop_back();
76 }
77 eventParam.append("]");
78 }
79 eventParam.append("}");
80 }
81
DragStartInfoToString(const BaseEventInfo & info,std::string & eventParam)82 void DragStartInfoToString(const BaseEventInfo& info, std::string& eventParam)
83 {
84 eventParam.append("{");
85 const auto touchInfo = TypeInfoHelper::DynamicCast<DragStartInfo>(&info);
86 if (touchInfo) {
87 auto globalLocation = touchInfo->GetGlobalLocation();
88 eventParam.append("\"globalX\":")
89 .append(std::to_string(globalLocation.GetX()))
90 .append(",\"globalY\":")
91 .append(std::to_string(globalLocation.GetY()));
92 }
93 eventParam.append("}");
94 }
95
DragUpdateInfoToString(const BaseEventInfo & info,std::string & eventParam)96 void DragUpdateInfoToString(const BaseEventInfo& info, std::string& eventParam)
97 {
98 eventParam.append("{");
99 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
100 if (touchInfo) {
101 auto globalLocation = touchInfo->GetGlobalLocation();
102 eventParam.append("\"globalX\":")
103 .append(std::to_string(globalLocation.GetX()))
104 .append(",\"globalY\":")
105 .append(std::to_string(globalLocation.GetY()));
106 }
107 eventParam.append("}");
108 }
109
DragEnterInfoToString(const BaseEventInfo & info,std::string & eventParam)110 void DragEnterInfoToString(const BaseEventInfo& info, std::string& eventParam)
111 {
112 eventParam.append("{");
113 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
114 if (touchInfo) {
115 auto globalLocation = touchInfo->GetGlobalLocation();
116 eventParam.append("\"globalX\":")
117 .append(std::to_string(globalLocation.GetX()))
118 .append(",\"globalY\":")
119 .append(std::to_string(globalLocation.GetY()));
120 }
121 eventParam.append("}");
122 }
123
DragOverInfoToString(const BaseEventInfo & info,std::string & eventParam)124 void DragOverInfoToString(const BaseEventInfo& info, std::string& eventParam)
125 {
126 eventParam.append("{");
127 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
128 if (touchInfo) {
129 auto globalLocation = touchInfo->GetGlobalLocation();
130 eventParam.append("\"globalX\":")
131 .append(std::to_string(globalLocation.GetX()))
132 .append(",\"globalY\":")
133 .append(std::to_string(globalLocation.GetY()));
134 }
135 eventParam.append("}");
136 }
137
DragLeaveInfoToString(const BaseEventInfo & info,std::string & eventParam)138 void DragLeaveInfoToString(const BaseEventInfo& info, std::string& eventParam)
139 {
140 eventParam.append("{");
141 const auto touchInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
142 if (touchInfo) {
143 auto globalLocation = touchInfo->GetGlobalLocation();
144 eventParam.append("\"globalX\":")
145 .append(std::to_string(globalLocation.GetX()))
146 .append(",\"globalY\":")
147 .append(std::to_string(globalLocation.GetY()));
148 }
149 eventParam.append("}");
150 }
151
DragDropInfoToString(const BaseEventInfo & info,std::string & eventParam)152 void DragDropInfoToString(const BaseEventInfo& info, std::string& eventParam)
153 {
154 eventParam.append("{");
155 const auto touchInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
156 if (touchInfo) {
157 auto globalLocation = touchInfo->GetGlobalLocation();
158 eventParam.append("\"globalX\":")
159 .append(std::to_string(globalLocation.GetX()))
160 .append(",\"globalY\":")
161 .append(std::to_string(globalLocation.GetY()));
162 }
163 eventParam.append("}");
164 }
165
DragEndInfoToString(const BaseEventInfo & info,std::string & eventParam)166 void DragEndInfoToString(const BaseEventInfo& info, std::string& eventParam)
167 {
168 eventParam.append("{");
169 const auto touchInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
170 if (touchInfo) {
171 auto globalLocation = touchInfo->GetGlobalLocation();
172 eventParam.append("\"globalX\":")
173 .append(std::to_string(globalLocation.GetX()))
174 .append(",\"globalY\":")
175 .append(std::to_string(globalLocation.GetY()));
176 }
177 eventParam.append("}");
178 }
179
MouseInfoToString(const BaseEventInfo & info,std::string & eventParam)180 void MouseInfoToString(const BaseEventInfo& info, std::string& eventParam)
181 {
182 const auto mouseInfo = TypeInfoHelper::DynamicCast<MouseEventInfo>(&info);
183 eventParam.append("{\"mouse\":{");
184 if (mouseInfo) {
185 auto globalMouse = mouseInfo->GetGlobalMouse();
186 eventParam.append("\"globalX\":")
187 .append(std::to_string(globalMouse.x))
188 .append(",\"globalY\":")
189 .append(std::to_string(globalMouse.y))
190 .append(",\"globalZ\":")
191 .append(std::to_string(globalMouse.z))
192 .append(",\"localX\":")
193 .append(std::to_string(globalMouse.x))
194 .append(",\"localY\":")
195 .append(std::to_string(globalMouse.y))
196 .append(",\"localZ\":")
197 .append(std::to_string(globalMouse.z))
198 .append(",\"deltaX\":")
199 .append(std::to_string(globalMouse.deltaX))
200 .append(",\"deltaY\":")
201 .append(std::to_string(globalMouse.deltaY))
202 .append(",\"deltaZ\":")
203 .append(std::to_string(globalMouse.deltaZ))
204 .append(",\"scrollX\":")
205 .append(std::to_string(globalMouse.scrollX))
206 .append(",\"scrollY\":")
207 .append(std::to_string(globalMouse.scrollY))
208 .append(",\"scrollZ\":")
209 .append(std::to_string(globalMouse.scrollZ))
210 .append(",\"action\":")
211 .append(std::to_string(static_cast<int32_t>(globalMouse.action)))
212 .append(",\"button\":")
213 .append(std::to_string(static_cast<int32_t>(globalMouse.button)))
214 .append(",\"pressedButtons\":")
215 .append(std::to_string(globalMouse.pressedButtons))
216 .append("},")
217 .append("\"deviceId\":")
218 .append(std::to_string(mouseInfo->GetDeviceId()))
219 .append("}");
220 } else {
221 eventParam.append("}}");
222 }
223 }
224
SwipeInfoToString(const BaseEventInfo & info,std::string & eventParam)225 void SwipeInfoToString(const BaseEventInfo& info, std::string& eventParam)
226 {
227 const auto& swipeInfo = TypeInfoHelper::DynamicCast<SwipeEventInfo>(&info);
228 eventParam = swipeInfo->ToJsonParamInfo();
229 }
230
231 } // namespace
232
Create()233 RefPtr<Frontend> Frontend::Create()
234 {
235 return AceType::MakeRefPtr<JsFrontend>();
236 }
237
~JsFrontend()238 JsFrontend::~JsFrontend() noexcept
239 {
240 LOG_DESTROY();
241 }
242
Destroy()243 void JsFrontend::Destroy()
244 {
245 CHECK_RUN_ON(JS);
246 LOGI("JsFrontend Destroy begin.");
247 // To guarantee the jsEngine_ and delegate_ released in js thread
248 delegate_.Reset();
249 handler_.Reset();
250 jsEngine_.Reset();
251 LOGI("JsFrontend Destroy end.");
252 }
253
Initialize(FrontendType type,const RefPtr<TaskExecutor> & taskExecutor)254 bool JsFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
255 {
256 LOGI("JsFrontend initialize begin.");
257 type_ = type;
258 taskExecutor_ = taskExecutor;
259 ACE_DCHECK(type_ == FrontendType::JS);
260 InitializeFrontendDelegate(taskExecutor);
261 auto weakEngine = AceType::WeakClaim(AceType::RawPtr(jsEngine_));
262 auto weakDelegate = AceType::WeakClaim(AceType::RawPtr(delegate_));
263 taskExecutor->PostTask(
264 [weakEngine, weakDelegate] {
265 auto jsEngine = weakEngine.Upgrade();
266 if (!jsEngine) {
267 return;
268 }
269 jsEngine->Initialize(weakDelegate.Upgrade());
270 },
271 TaskExecutor::TaskType::JS);
272 LOGI("JsFrontend initialize end.");
273 return true;
274 }
275
AttachPipelineContext(const RefPtr<PipelineBase> & context)276 void JsFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
277 {
278 if (!delegate_) {
279 return;
280 }
281 handler_ = AceType::MakeRefPtr<JsEventHandler>(delegate_);
282 auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
283 if (pipelineContext) {
284 pipelineContext->RegisterEventHandler(handler_);
285 }
286 delegate_->AttachPipelineContext(context);
287 }
288
SetAssetManager(const RefPtr<AssetManager> & assetManager)289 void JsFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
290 {
291 if (delegate_) {
292 delegate_->SetAssetManager(assetManager);
293 }
294 }
295
InitializeFrontendDelegate(const RefPtr<TaskExecutor> & taskExecutor)296 void JsFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
297 {
298 Framework::FrontendDelegateImplBuilder builder;
299 builder.loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
300 const std::string& url, const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
301 auto jsEngine = weakEngine.Upgrade();
302 if (!jsEngine) {
303 return;
304 }
305 jsEngine->LoadJs(url, jsPage, isMainPage);
306 };
307
308 builder.transferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
309 const RefPtr<JsMessageDispatcher>& dispatcher) {
310 auto jsEngine = weakEngine.Upgrade();
311 if (!jsEngine) {
312 return;
313 }
314 jsEngine->SetJsMessageDispatcher(dispatcher);
315 };
316
317 builder.asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
318 const std::string& eventId, const std::string& param) {
319 auto jsEngine = weakEngine.Upgrade();
320 if (!jsEngine) {
321 return;
322 }
323 jsEngine->FireAsyncEvent(eventId, param);
324 };
325
326 builder.syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
327 const std::string& eventId, const std::string& param) {
328 auto jsEngine = weakEngine.Upgrade();
329 if (!jsEngine) {
330 return;
331 }
332 jsEngine->FireSyncEvent(eventId, param);
333 };
334
335 builder.externalEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
336 const std::string& componentId, const uint32_t nodeId, const bool isDestroy) {
337 auto jsEngine = weakEngine.Upgrade();
338 if (!jsEngine) {
339 return;
340 }
341 jsEngine->FireExternalEvent(componentId, nodeId, isDestroy);
342 };
343
344 builder.updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
345 const RefPtr<Framework::JsAcePage>& jsPage) {
346 auto jsEngine = weakEngine.Upgrade();
347 if (!jsEngine) {
348 return;
349 }
350 jsEngine->UpdateRunningPage(jsPage);
351 jsEngine->UpdateStagingPage(jsPage);
352 };
353
354 builder.resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
355 auto jsEngine = weakEngine.Upgrade();
356 if (!jsEngine) {
357 return;
358 }
359 jsEngine->ResetStagingPage();
360 };
361
362 builder.destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
363 auto jsEngine = weakEngine.Upgrade();
364 if (!jsEngine) {
365 return;
366 }
367 jsEngine->DestroyPageInstance(pageId);
368 };
369
370 builder.destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
371 const std::string& packageName) {
372 auto jsEngine = weakEngine.Upgrade();
373 if (!jsEngine) {
374 return;
375 }
376 jsEngine->DestroyApplication(packageName);
377 };
378
379 builder.updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
380 const std::string& packageName, Frontend::State state) {
381 auto jsEngine = weakEngine.Upgrade();
382 if (!jsEngine) {
383 return;
384 }
385 jsEngine->UpdateApplicationState(packageName, state);
386 };
387
388 builder.onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
389 auto jsEngine = weakEngine.Upgrade();
390 if (!jsEngine) {
391 return false;
392 }
393 return jsEngine->OnStartContinuation();
394 };
395
396 builder.onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
397 auto jsEngine = weakEngine.Upgrade();
398 if (!jsEngine) {
399 return;
400 }
401 jsEngine->OnCompleteContinuation(code);
402 };
403
404 builder.onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
405 auto jsEngine = weakEngine.Upgrade();
406 if (!jsEngine) {
407 return;
408 }
409 jsEngine->OnRemoteTerminated();
410 };
411
412 builder.onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
413 auto jsEngine = weakEngine.Upgrade();
414 if (!jsEngine) {
415 return;
416 }
417 jsEngine->OnSaveData(savedData);
418 };
419
420 builder.onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
421 const std::string& data) -> bool {
422 auto jsEngine = weakEngine.Upgrade();
423 if (!jsEngine) {
424 return false;
425 }
426 return jsEngine->OnRestoreData(data);
427 };
428
429 builder.timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
430 const std::string& callbackId, const std::string& delay, bool isInterval) {
431 auto jsEngine = weakEngine.Upgrade();
432 if (!jsEngine) {
433 return;
434 }
435 jsEngine->TimerCallback(callbackId, delay, isInterval);
436 };
437
438 builder.mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
439 const std::string& callbackId, const std::string& args) {
440 auto jsEngine = weakEngine.Upgrade();
441 if (!jsEngine) {
442 return;
443 }
444 jsEngine->MediaQueryCallback(callbackId, args);
445 };
446
447 builder.requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
448 const std::string& callbackId, uint64_t timeStamp) {
449 auto jsEngine = weakEngine.Upgrade();
450 if (!jsEngine) {
451 return;
452 }
453 jsEngine->RequestAnimationCallback(callbackId, timeStamp);
454 };
455
456 builder.jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
457 const std::string& callbackId, const std::string& args) {
458 auto jsEngine = weakEngine.Upgrade();
459 if (!jsEngine) {
460 return;
461 }
462 jsEngine->JsCallback(callbackId, args);
463 };
464
465 builder.callNativeHandler = [this](const std::string& event, const std::string& params) {
466 if (dialogCallback_ != nullptr) {
467 dialogCallback_(event, params);
468 }
469 };
470
471 builder.taskExecutor = taskExecutor;
472 delegate_ = AceType::MakeRefPtr<Framework::FrontendDelegateImpl>(builder);
473 if (disallowPopLastPage_) {
474 delegate_->DisallowPopLastPage();
475 }
476 if (jsEngine_) {
477 delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
478 } else {
479 LOGE("the js engine is nullptr");
480 EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
481 }
482 }
483
RunPage(const std::string & url,const std::string & params)484 UIContentErrorCode JsFrontend::RunPage(const std::string& url, const std::string& params)
485 {
486 // Not use this pageId from backend, manage it in FrontendDelegateImpl.
487 if (delegate_) {
488 return delegate_->RunPage(url, params);
489 }
490
491 return UIContentErrorCode::NULL_POINTER;
492 }
493
PushPage(const std::string & url,const std::string & params)494 void JsFrontend::PushPage(const std::string& url, const std::string& params)
495 {
496 if (delegate_) {
497 delegate_->Push(url, params);
498 }
499 }
500
ReplacePage(const std::string & url,const std::string & params)501 void JsFrontend::ReplacePage(const std::string& url, const std::string& params)
502 {
503 if (delegate_) {
504 delegate_->Replace(url, params);
505 }
506 }
507
SendCallbackMessage(const std::string & callbackId,const std::string & data) const508 void JsFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
509 {
510 if (delegate_) {
511 delegate_->OnJsCallback(callbackId, data);
512 }
513 }
514
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const515 void JsFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
516 {
517 if (delegate_) {
518 delegate_->SetJsMessageDispatcher(dispatcher);
519 }
520 }
521
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const522 void JsFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
523 {
524 if (delegate_) {
525 delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
526 }
527 }
528
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const529 void JsFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
530 {
531 if (delegate_) {
532 delegate_->TransferJsResponseData(callbackId, code, std::move(data));
533 }
534 }
535
536 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const537 void JsFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
538 {
539 if (delegate_) {
540 delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
541 }
542 }
543 #endif
544
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const545 void JsFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
546 {
547 if (delegate_) {
548 delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
549 }
550 }
551
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const552 void JsFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
553 {
554 if (delegate_) {
555 delegate_->TransferJsEventData(callbackId, code, std::move(data));
556 }
557 }
558
LoadPluginJsCode(std::string && jsCode) const559 void JsFrontend::LoadPluginJsCode(std::string&& jsCode) const
560 {
561 if (delegate_) {
562 delegate_->LoadPluginJsCode(std::move(jsCode));
563 }
564 }
565
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const566 void JsFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
567 {
568 if (delegate_) {
569 delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
570 }
571 }
572
UpdateState(Frontend::State state)573 void JsFrontend::UpdateState(Frontend::State state)
574 {
575 if (!delegate_) {
576 return;
577 }
578 switch (state) {
579 case Frontend::State::ON_CREATE:
580 break;
581 case Frontend::State::ON_DESTROY:
582 LOGI("UpdateState ON_DESTROY");
583 delegate_->OnApplicationDestroy(delegate_->GetAppID());
584 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_DESTROY);
585 break;
586 case Frontend::State::ON_SHOW:
587 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_SHOW);
588 break;
589 case Frontend::State::ON_HIDE:
590 delegate_->OnApplicationUpdateState(delegate_->GetAppID(), Frontend::State::ON_HIDE);
591 break;
592 default:
593 LOGE("error State: %d", state);
594 break;
595 }
596 }
597
GetAccessibilityManager() const598 RefPtr<AccessibilityManager> JsFrontend::GetAccessibilityManager() const
599 {
600 if (!delegate_) {
601 return nullptr;
602 }
603 return delegate_->GetJsAccessibilityManager();
604 }
605
GetWindowConfig()606 WindowConfig& JsFrontend::GetWindowConfig()
607 {
608 if (!delegate_) {
609 static WindowConfig windowConfig;
610 LOGW("delegate is null, return default config");
611 return windowConfig;
612 }
613 return delegate_->GetWindowConfig();
614 }
615
OnBackPressed()616 bool JsFrontend::OnBackPressed()
617 {
618 if (!delegate_) {
619 LOGW("delegate is null, return false");
620 return false;
621 }
622 return delegate_->OnPageBackPress();
623 }
624
OnShow()625 void JsFrontend::OnShow()
626 {
627 if (delegate_) {
628 delegate_->OnForeground();
629 foregroundFrontend_ = true;
630 }
631 }
632
OnHide()633 void JsFrontend::OnHide()
634 {
635 if (delegate_) {
636 delegate_->OnBackGround();
637 foregroundFrontend_ = false;
638 }
639 }
640
OnConfigurationUpdated(const std::string & data)641 void JsFrontend::OnConfigurationUpdated(const std::string& data)
642 {
643 if (delegate_) {
644 delegate_->OnConfigurationUpdated(data);
645 }
646 }
647
OnActive()648 void JsFrontend::OnActive()
649 {
650 if (delegate_) {
651 delegate_->InitializeAccessibilityCallback();
652 delegate_->OnActive();
653 }
654 }
655
OnInactive()656 void JsFrontend::OnInactive()
657 {
658 if (delegate_) {
659 delegate_->OnInactive();
660 }
661 }
662
OnStartContinuation()663 bool JsFrontend::OnStartContinuation()
664 {
665 if (!delegate_) {
666 LOGW("delegate is null, return false");
667 return false;
668 }
669 return delegate_->OnStartContinuation();
670 }
671
OnCompleteContinuation(int32_t code)672 void JsFrontend::OnCompleteContinuation(int32_t code)
673 {
674 if (delegate_) {
675 delegate_->OnCompleteContinuation(code);
676 }
677 }
678
OnRemoteTerminated()679 void JsFrontend::OnRemoteTerminated()
680 {
681 if (delegate_) {
682 delegate_->OnRemoteTerminated();
683 }
684 }
685
OnSaveData(std::string & data)686 void JsFrontend::OnSaveData(std::string& data)
687 {
688 if (delegate_) {
689 delegate_->OnSaveData(data);
690 }
691 }
692
OnRestoreData(const std::string & data)693 bool JsFrontend::OnRestoreData(const std::string& data)
694 {
695 if (!delegate_) {
696 LOGW("delegate is null, return false");
697 return false;
698 }
699 return delegate_->OnRestoreData(data);
700 }
701
OnNewRequest(const std::string & data)702 void JsFrontend::OnNewRequest(const std::string& data)
703 {
704 if (delegate_) {
705 delegate_->OnNewRequest(data);
706 }
707 }
708
CallRouterBack()709 void JsFrontend::CallRouterBack()
710 {
711 if (delegate_) {
712 delegate_->CallPopPage();
713 }
714 }
715
OnSurfaceChanged(int32_t width,int32_t height)716 void JsFrontend::OnSurfaceChanged(int32_t width, int32_t height)
717 {
718 if (delegate_) {
719 delegate_->OnSurfaceChanged();
720 }
721 }
722
OnLayoutCompleted(const std::string & componentId)723 void JsFrontend::OnLayoutCompleted(const std::string& componentId)
724 {
725 if (delegate_) {
726 delegate_->OnLayoutCompleted(componentId);
727 }
728 }
729
OnDrawCompleted(const std::string & componentId)730 void JsFrontend::OnDrawCompleted(const std::string& componentId)
731 {
732 if (delegate_) {
733 delegate_->OnDrawCompleted(componentId);
734 }
735 }
736
DumpFrontend() const737 void JsFrontend::DumpFrontend() const
738 {
739 int32_t routerIndex = 0;
740 std::string routerName;
741 std::string routerPath;
742 if (!delegate_) {
743 return;
744 }
745 delegate_->GetState(routerIndex, routerName, routerPath);
746
747 if (DumpLog::GetInstance().GetDumpFile()) {
748 DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
749 DumpLog::GetInstance().AddDesc("Path: " + routerPath);
750 DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
751 DumpLog::GetInstance().Print(0, routerName, 0);
752 }
753 }
754
GetPagePath() const755 std::string JsFrontend::GetPagePath() const
756 {
757 if (!delegate_) {
758 return "";
759 }
760 int32_t routerIndex = 0;
761 std::string routerName;
762 std::string routerPath;
763 delegate_->GetState(routerIndex, routerName, routerPath);
764 return routerPath + routerName;
765 }
766
TriggerGarbageCollection()767 void JsFrontend::TriggerGarbageCollection()
768 {
769 if (jsEngine_) {
770 jsEngine_->RunGarbageCollection();
771 }
772 }
773
DumpHeapSnapshot(bool isPrivate)774 void JsFrontend::DumpHeapSnapshot(bool isPrivate)
775 {
776 if (jsEngine_) {
777 jsEngine_->DumpHeapSnapshot(isPrivate);
778 }
779 }
780
DestroyHeapProfiler()781 void JsFrontend::DestroyHeapProfiler()
782 {
783 if (jsEngine_) {
784 jsEngine_->DestroyHeapProfiler();
785 }
786 }
787
ForceFullGC()788 void JsFrontend::ForceFullGC()
789 {
790 if (jsEngine_) {
791 jsEngine_->ForceFullGC();
792 }
793 }
794
RebuildAllPages()795 void JsFrontend::RebuildAllPages()
796 {
797 if (delegate_) {
798 delegate_->RebuildAllPages();
799 }
800 }
801
GetPluginsUsed(std::string & data)802 void JsFrontend::GetPluginsUsed(std::string& data)
803 {
804 if (!delegate_) {
805 LOGW("delegate hasn't initialized, load all system plugin");
806 return;
807 }
808
809 if (!delegate_->GetAssetContent("module_collection.txt", data)) {
810 LOGW("read failed, will load all the system plugin");
811 }
812 }
813
SetColorMode(ColorMode colorMode)814 void JsFrontend::SetColorMode(ColorMode colorMode)
815 {
816 if (delegate_) {
817 delegate_->SetColorMode(colorMode);
818 }
819 }
820
HandleAsyncEvent(const EventMarker & eventMarker)821 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
822 {
823 std::string param = eventMarker.GetData().GetEventParam();
824 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
825
826 AccessibilityEvent accessibilityEvent;
827 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
828 accessibilityEvent.eventType = eventMarker.GetData().eventType;
829 delegate_->FireAccessibilityEvent(accessibilityEvent);
830 }
831
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)832 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
833 {
834 std::string eventParam;
835 if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
836 TouchInfoToString(info, eventParam);
837 } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
838 MouseInfoToString(info, eventParam);
839 } else if (eventMarker.GetData().eventType == "swipe") {
840 SwipeInfoToString(info, eventParam);
841 } else if (eventMarker.GetData().eventType == "dragstart") {
842 DragStartInfoToString(info, eventParam);
843 } else if (eventMarker.GetData().eventType == "drag") {
844 DragUpdateInfoToString(info, eventParam);
845 } else if (eventMarker.GetData().eventType == "dragend") {
846 DragEndInfoToString(info, eventParam);
847 } else if (eventMarker.GetData().eventType == "dragenter") {
848 DragEnterInfoToString(info, eventParam);
849 } else if (eventMarker.GetData().eventType == "dragover") {
850 DragOverInfoToString(info, eventParam);
851 } else if (eventMarker.GetData().eventType == "dragleave") {
852 DragLeaveInfoToString(info, eventParam);
853 } else if (eventMarker.GetData().eventType == "drop") {
854 DragDropInfoToString(info, eventParam);
855 }
856 std::string param;
857 auto adapter = TypeInfoHelper::DynamicCast<EventToJSONStringAdapter>(&info);
858 if (adapter) {
859 param = adapter->ToJSONString();
860 } else {
861 param = eventMarker.GetData().GetEventParam();
862 if (eventParam.empty()) {
863 param.append("null");
864 } else {
865 param.append(eventParam);
866 }
867 }
868 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
869
870 AccessibilityEvent accessibilityEvent;
871 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
872 accessibilityEvent.eventType = eventMarker.GetData().eventType;
873 delegate_->FireAccessibilityEvent(accessibilityEvent);
874 }
875
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)876 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
877 {
878 std::string param = std::string("\"")
879 .append(eventMarker.GetData().eventType)
880 .append("\",{\"code\":")
881 .append(std::to_string(static_cast<int32_t>(info.code)))
882 .append(",\"action\":")
883 .append(std::to_string(static_cast<int32_t>(info.action)))
884 .append(",\"repeatCount\":")
885 .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
886 .append(",\"timestamp\":")
887 .append(std::to_string(static_cast<int32_t>(info.timeStamp.time_since_epoch().count())))
888 .append(",\"key\":\"")
889 .append(info.key)
890 .append("\"},");
891
892 result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
893
894 AccessibilityEvent accessibilityEvent;
895 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
896 accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
897 delegate_->FireAccessibilityEvent(accessibilityEvent);
898 }
899
HandleAsyncEvent(const EventMarker & eventMarker,const GestureEvent & info)900 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const GestureEvent& info)
901 {
902 std::string eventParam = std::string("");
903 if (eventMarker.GetData().eventType.find("pinch") != std::string::npos) {
904 eventParam.append("\"")
905 .append(eventMarker.GetData().eventType)
906 .append("\",{\"scale\":")
907 .append(std::to_string(info.GetScale()))
908 .append(",\"pinchCenterX\":")
909 .append(std::to_string(info.GetPinchCenter().GetX()))
910 .append(",\"pinchCenterY\":")
911 .append(std::to_string(info.GetPinchCenter().GetY()))
912 .append("}");
913 }
914
915 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
916
917 AccessibilityEvent accessibilityEvent;
918 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
919 accessibilityEvent.eventType = eventMarker.GetData().eventType;
920 delegate_->FireAccessibilityEvent(accessibilityEvent);
921 }
922
HandleAsyncEvent(const EventMarker & eventMarker,const RotationEvent & info)923 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const RotationEvent& info)
924 {
925 std::string eventParam = std::string("");
926 if (eventMarker.GetData().eventType == "rotate") {
927 eventParam.append("\"")
928 .append(eventMarker.GetData().eventType)
929 .append("\",{\"value\":")
930 .append(std::to_string(info.value))
931 .append("}");
932 }
933
934 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, eventParam, "");
935
936 AccessibilityEvent accessibilityEvent;
937 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
938 accessibilityEvent.eventType = eventMarker.GetData().eventType;
939 delegate_->FireAccessibilityEvent(accessibilityEvent);
940 }
941
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)942 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
943 {
944 LOGW("js event handler does not support this event type!");
945 AccessibilityEvent accessibilityEvent;
946 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
947 accessibilityEvent.eventType = eventMarker.GetData().eventType;
948 delegate_->FireAccessibilityEvent(accessibilityEvent);
949 }
950
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)951 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
952 {
953 LOGW("js event handler does not support this event type!");
954 AccessibilityEvent accessibilityEvent;
955 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
956 accessibilityEvent.eventType = eventMarker.GetData().eventType;
957 delegate_->FireAccessibilityEvent(accessibilityEvent);
958 }
959
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)960 void JsEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
961 {
962 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
963
964 AccessibilityEvent accessibilityEvent;
965 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
966 accessibilityEvent.eventType = eventMarker.GetData().eventType;
967 delegate_->FireAccessibilityEvent(accessibilityEvent);
968 }
969
HandleSyncEvent(const EventMarker & eventMarker,bool & result)970 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
971 {
972 LOGW("js event handler does not support this event type!");
973 AccessibilityEvent accessibilityEvent;
974 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
975 accessibilityEvent.eventType = eventMarker.GetData().eventType;
976 delegate_->FireAccessibilityEvent(accessibilityEvent);
977 }
978
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)979 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
980 {
981 LOGW("js event handler does not support this event type!");
982 AccessibilityEvent accessibilityEvent;
983 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
984 accessibilityEvent.eventType = eventMarker.GetData().eventType;
985 delegate_->FireAccessibilityEvent(accessibilityEvent);
986 }
987
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)988 void JsEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result)
989 {
990 LOGW("js event handler does not support this event type!");
991 AccessibilityEvent accessibilityEvent;
992 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
993 accessibilityEvent.eventType = eventMarker.GetData().eventType;
994 delegate_->FireAccessibilityEvent(accessibilityEvent);
995 delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
996 }
997
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)998 void JsEventHandler::HandleSyncEvent(
999 const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1000 {
1001 delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1002 }
1003 } // namespace OHOS::Ace
1004