• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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