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