/* * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_FRONTEND_DELEGATE_DECLARATIVE_H #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_FRONTEND_DELEGATE_DECLARATIVE_H #include #include #include #include "base/memory/ace_type.h" #include "base/memory/referenced.h" #include "base/thread/cancelable_callback.h" #include "base/utils/measure_util.h" #include "bridge/declarative_frontend/ng/page_router_manager.h" #include "core/common/js_message_dispatcher.h" #include "core/components_ng/pattern/overlay/overlay_manager.h" #include "core/components_ng/render/snapshot_param.h" #include "core/pipeline/pipeline_context.h" #include "frameworks/bridge/common/accessibility/accessibility_node_manager.h" #include "frameworks/bridge/common/manifest/manifest_parser.h" #include "frameworks/bridge/js_frontend/engine/common/group_js_bridge.h" #include "frameworks/bridge/js_frontend/engine/common/js_engine.h" #include "frameworks/bridge/js_frontend/frontend_delegate.h" #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h" #include "frameworks/bridge/js_frontend/js_ace_page.h" namespace OHOS::Ace::Framework { using ExternalEventCallback = std::function; enum class RouterAction { PUSH = 0, REPLACE, BACK, CLEAR, }; struct RouterTask { RouterAction action = RouterAction::PUSH; PageTarget target = PageTarget(""); std::string params; std::function errorCallback; }; class FrontendDelegateDeclarative : public FrontendDelegate { DECLARE_ACE_TYPE(FrontendDelegateDeclarative, FrontendDelegate); public: FrontendDelegateDeclarative(const RefPtr& taskExecutor, const LoadJsCallback& loadCallback, const JsMessageDispatcherSetterCallback& transferCallback, const EventCallback& asyncEventCallback, const EventCallback& syncEventCallback, const UpdatePageCallback& updatePageCallback, const ResetStagingPageCallback& resetLoadingPageCallback, const DestroyPageCallback& destroyPageCallback, const DestroyApplicationCallback& destroyApplicationCallback, const UpdateApplicationStateCallback& updateApplicationStateCallback, const TimerCallback& timerCallback, const MediaQueryCallback& mediaQueryCallback, const LayoutInspectorCallback& layoutInpsectorCallback, const DrawInspectorCallback& drawInpsectorCallback, const RequestAnimationCallback& requestAnimationCallback, const JsCallback& jsCallback, const OnWindowDisplayModeChangedCallBack& onWindowDisplayModeChangedCallBack, const OnConfigurationUpdatedCallBack& onConfigurationUpdatedCallBack, const OnSaveAbilityStateCallBack& onSaveAbilityStateCallBack, const OnRestoreAbilityStateCallBack& onRestoreAbilityStateCallBack, const OnNewWantCallBack& onNewWantCallBack, const OnMemoryLevelCallBack& onMemoryLevelCallBack, const OnStartContinuationCallBack& onStartContinuationCallBack, const OnCompleteContinuationCallBack& onCompleteContinuationCallBack, const OnRemoteTerminatedCallBack& onRemoteTerminatedCallBack, const OnSaveDataCallBack& onSaveDataCallBack, const OnRestoreDataCallBack& onRestoreDataCallBack, const ExternalEventCallback& externalEventCallback); ~FrontendDelegateDeclarative() override; void AttachPipelineContext(const RefPtr& context) override; void AttachSubPipelineContext(const RefPtr& context); // JSFrontend delegate functions. UIContentErrorCode RunPage( const std::string& url, const std::string& params, const std::string& profile, bool isNamedRouter = false); void RunPage(const std::shared_ptr>& content, const std::string& params, const std::string& profile); void SetJsMessageDispatcher(const RefPtr& dispatcher) const; void TransferComponentResponseData(int32_t callbackId, int32_t code, std::vector&& data); void TransferJsResponseData(int32_t callbackId, int32_t code, std::vector&& data) const; #if defined(PREVIEW) void TransferJsResponseDataPreview(int32_t callbackId, int32_t code, ResponseData responseData) const; #endif void TransferJsPluginGetError(int32_t callbackId, int32_t errorCode, std::string&& errorMessage) const; void TransferJsEventData(int32_t callbackId, int32_t code, std::vector&& data) const; void LoadPluginJsCode(std::string&& jsCode) const; void LoadPluginJsByteCode(std::vector&& jsCode, std::vector&& jsCodeLen) const; void OnJSCallback(const std::string& callbackId, const std::string& data); bool OnPageBackPress(); void OnBackGround(); void OnForeground(); void OnConfigurationUpdated(const std::string& data); void OnSaveAbilityState(std::string& data); void OnRestoreAbilityState(const std::string& data); void OnNewWant(const std::string& data); bool OnStartContinuation(); void OnCompleteContinuation(int32_t code); void OnMemoryLevel(int32_t level); void OnSaveData(std::string& data); void GetPluginsUsed(std::string& data); bool OnRestoreData(const std::string& data); void OnRemoteTerminated(); void OnNewRequest(const std::string& data); void SetColorMode(ColorMode colorMode); void CallPopPage(); void OnApplicationDestroy(const std::string& packageName); void UpdateApplicationState(const std::string& packageName, Frontend::State state); void OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data); void NotifyAppStorage( const WeakPtr& jsEngineWeak, const std::string& key, const std::string& value); // restore std::pair RestoreRouterStack( const std::string& contentInfo, ContentInfoType type) override; std::string GetContentInfo(ContentInfoType type) override; // Accessibility delegate functions. RefPtr GetJSAccessibilityManager() const { return jsAccessibilityManager_; } void FireAccessibilityEvent(const AccessibilityEvent& accessibilityEvent); void InitializeAccessibilityCallback(); void OnMediaQueryUpdate(bool isSynchronous = false) override; void OnSurfaceChanged(); void OnLayoutCompleted(const std::string& componentId); void OnDrawCompleted(const std::string& componentId); // JSEventHandler delegate functions. void FireAsyncEvent(const std::string& eventId, const std::string& param, const std::string& jsonArgs); bool FireSyncEvent(const std::string& eventId, const std::string& param, const std::string& jsonArgs); void FireSyncEvent( const std::string& eventId, const std::string& param, const std::string& jsonArgs, std::string& result); void FireExternalEvent(const std::string& eventId, const std::string& componentId, uint32_t nodeId, bool isDestroy); // FrontendDelegate overrides. void Push(const PageTarget& target, const std::string& params, const std::function& errorCallback = nullptr); void Replace(const PageTarget& target, const std::string& params, const std::function& errorCallback = nullptr); void BackWithTarget(const PageTarget& target, const std::string& params); void Push(const std::string& uri, const std::string& params) override; void PushWithMode(const std::string& uri, const std::string& params, uint32_t routerMode) override; void PushWithCallback(const std::string& uri, const std::string& params, bool recoverable, const std::function& errorCallback, uint32_t routerMode = 0) override; void PushNamedRoute(const std::string& uri, const std::string& params, bool recoverable, const std::function& errorCallback, uint32_t routerMode = 0) override; void Replace(const std::string& uri, const std::string& params) override; void ReplaceWithMode(const std::string& uri, const std::string& params, uint32_t routerMode) override; void ReplaceWithCallback(const std::string& uri, const std::string& params, bool recoverable, const std::function& errorCallback, uint32_t routerMode = 0) override; void ReplaceNamedRoute(const std::string& uri, const std::string& params, bool recoverable, const std::function& errorCallback, uint32_t routerMode = 0) override; void Back(const std::string& uri, const std::string& params) override; void BackToIndex(int32_t index, const std::string& params) override; void Clear() override; int32_t GetStackSize() const override; int32_t GetCurrentPageIndex() const override; void GetState(int32_t& index, std::string& name, std::string& path) override; void GetRouterStateByIndex(int32_t& index, std::string& name, std::string& path, std::string& params) override; bool IsUnrestoreByIndex(int32_t index); void GetRouterStateByUrl(std::string& url, std::vector& stateArray) override; std::string GetParams() override; int32_t GetIndexByUrl(const std::string& url) override; void PostponePageTransition() override; void LaunchPageTransition() override; size_t GetComponentsCount() override; void TriggerPageUpdate(int32_t pageId, bool directExecute = false) override; void PostJsTask(std::function&& task, const std::string& name) override; const std::string& GetAppID() const override; const std::string& GetAppName() const override; const std::string& GetVersionName() const override; int32_t GetVersionCode() const override; WindowConfig& GetWindowConfig() { return manifestParser_->GetWindowConfig(); } double MeasureText(MeasureContext context) override; Size MeasureTextSize(MeasureContext context) override; void ShowToast(const NG::ToastInfo& toastInfo) override; void SetToastStopListenerCallback(std::function&& stopCallback) override; void ShowDialog(const std::string& title, const std::string& message, const std::vector& buttons, bool autoCancel, std::function&& callback, const std::set& callbacks) override; void ShowDialog(const std::string& title, const std::string& message, const std::vector& buttons, bool autoCancel, std::function&& callback, const std::set& callbacks, std::function&& onStatusChanged) override; void ShowDialog(const PromptDialogAttr &dialogAttr, const std::vector &buttons, std::function &&callback, const std::set &callbacks) override; void ShowDialog(const PromptDialogAttr &dialogAttr, const std::vector &buttons, std::function &&callback, const std::set &callbacks, std::function&& onStatusChanged) override; void ShowDialogInner(DialogProperties& dialogProperties, std::function&& callback, const std::set& callbacks); void RemoveCustomDialog() override; void OpenCustomDialog(const PromptDialogAttr &dialogAttr, std::function &&callback) override; void CloseCustomDialog(const int32_t dialogId) override; void CloseCustomDialog(const WeakPtr& node, std::function &&callback) override; void UpdateCustomDialog(const WeakPtr& node, const PromptDialogAttr &dialogAttr, std::function &&callback) override; RefPtr GetTransitionEffect(void* value) override; void EnableAlertBeforeBackPage(const std::string& message, std::function&& callback) override; void DisableAlertBeforeBackPage() override; void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback) override; void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback, std::function&& onStatusChanged) override; void ShowActionMenu(const PromptDialogAttr& dialogAttr, const std::vector& buttons, std::function&& callback) override; void ShowActionMenuInner(DialogProperties& dialogProperties, const std::vector& button, std::function&& callback); void ShowActionMenuInnerNG(DialogProperties& dialogProperties, const std::vector& button, std::function&& callback); Rect GetBoundingRectData(NodeId nodeId) override; std::string GetInspector(NodeId nodeId) override; void PushJsCallbackToRenderNode(NodeId id, double ratio, std::function&& callback) override; // For async event. void SetCallBackResult(const std::string& callBackId, const std::string& result) override; void WaitTimer(const std::string& callbackId, const std::string& delay, bool isInterval, bool isFirst) override; void ClearTimer(const std::string& callbackId) override; void PostSyncTaskToPage(std::function&& task, const std::string& name) override; void AddTaskObserver(std::function&& task) override; void RemoveTaskObserver() override; bool GetAssetContent(const std::string& url, std::string& content) override; bool GetAssetContent(const std::string& url, std::vector& content) override; std::string GetAssetPath(const std::string& url) override; // i18n void GetI18nData(std::unique_ptr& json) override; void GetResourceConfiguration(std::unique_ptr& json) override; void GetConfigurationCommon(const std::string& filePath, std::unique_ptr& data) override; int32_t GetMinPlatformVersion() override; void LoadResourceConfiguration(std::map& mediaResourceFileMap, std::unique_ptr& currentResourceData) override; void ChangeLocale(const std::string& language, const std::string& countryOrRegion) override; void RegisterFont(const std::string& familyName, const std::string& familySrc, const std::string& bundleName = "", const std::string& moduleName = "") override; void GetSystemFontList(std::vector& fontList) override; bool GetSystemFont(const std::string& fontName, FontInfo& fontInfo) override; void GetUIFontConfig(FontConfigJsonInfo& fontConfigJsonInfo) override; void HandleImage(const std::string& src, std::function&& callback) override; void GetSnapshot(const std::string& componentId, std::function, int32_t, std::function)>&& callback, const NG::SnapshotOptions& options) override; void CreateSnapshot(std::function&& customBuilder, std::function, int32_t, std::function)>&& callback, bool enableInspector, const NG::SnapshotParam& param) override; std::pair> GetSyncSnapshot(const std::string& componentId, const NG::SnapshotOptions& options) override; void AddFrameNodeToOverlay( const RefPtr& node, std::optional index = std::nullopt) override; void RemoveFrameNodeOnOverlay(const RefPtr& node) override; void ShowNodeOnOverlay(const RefPtr& node) override; void HideNodeOnOverlay(const RefPtr& node) override; void ShowAllNodesOnOverlay() override; void HideAllNodesOnOverlay() override; void RequestAnimationFrame(const std::string& callbackId) override; void CancelAnimationFrame(const std::string& callbackId) override; SingleTaskExecutor GetAnimationJsTask() override; SingleTaskExecutor GetUiTask() override; const RefPtr& GetMediaQueryInfoInstance() override { return mediaQueryInfo_; } const RefPtr& GetGroupJsBridge() override { return groupJsBridge_; } #if defined(PREVIEW) void SetPagePath(const std::string& pagePath) { if (manifestParser_) { manifestParser_->SetPagePath(pagePath); } } #endif RefPtr GetPipelineContext() override; void SetGroupJsBridge(const RefPtr& groupJsBridge) { groupJsBridge_ = groupJsBridge; } RefPtr GetPage(int32_t pageId) const override; void RebuildAllPages(); std::string GetCurrentPageUrl(); // Get the currently running JS page information in NG structure. RefPtr GetCurrentPageSourceMap(); // Get the currently running JS page information in NG structure. RefPtr GetFaAppSourceMap(); void GetStageSourceMap( std::unordered_map>& sourceMap); #if defined(PREVIEW) void SetIsComponentPreview(NG::IsComponentPreviewCallback&& callback); #endif void SetPageRouterManager(const RefPtr& routerMgr) { pageRouterManager_ = routerMgr; } const RefPtr& GetPageRouterManager() const { return pageRouterManager_; } const RefPtr& GetTaskExecutor() const { return taskExecutor_; } const RefPtr& GetManifestParser() const { return manifestParser_; } protected: bool isCardDelegate_ = false; private: int32_t GenerateNextPageId(); void RecyclePageId(int32_t pageId); UIContentErrorCode LoadPage( int32_t pageId, const PageTarget& target, bool isMainPage, const std::string& params, bool isRestore = false); void OnPageReady(const RefPtr& page, const std::string& url, bool isMainPage, bool isRestore); void FlushPageCommand( const RefPtr& page, const std::string& url, bool isMainPage, bool isRestore); void AddPageLocked(const RefPtr& page); void OnPrePageChange(const RefPtr& page); void SetCurrentPage(int32_t pageId); void OnPushPageSuccess(const RefPtr& page, const std::string& url); void OnPopToPageSuccess(const std::string& url); void PopToPage(const std::string& url); int32_t OnPopPageSuccess(); void PopPage(); void RestorePopPage(const RefPtr& page, const std::string& url); void PushPageTransitionListener(const TransitionEvent& event, const RefPtr& page); void PopPageTransitionListener(const TransitionEvent& event, int32_t destroyPageId); void PopToPageTransitionListener(const TransitionEvent& event, const std::string& url, int32_t pageId); void RestorePageTransitionListener( const TransitionEvent& event, const std::string& url, const RefPtr& page); int32_t OnClearInvisiblePagesSuccess(); void ClearInvisiblePages(); void OnReplacePageSuccess(const RefPtr& page, const std::string& url); void ReplacePage(const RefPtr& page, const std::string& url); void LoadReplacePage(int32_t pageId, const PageTarget& url, const std::string& params); void ReplacePageInSubStage(const RefPtr& page, const std::string& url); std::optional GetEffectiveContainerId() const; uint64_t GetSystemRealTime(); // Page lifecycle void OnPageShow(); void OnPageHide(); void OnPageDestroy(int32_t pageId); int32_t GetRunningPageId() const; std::string GetRunningPageUrl() const; int32_t GetPageIdByUrl(const std::string& url, bool& isRestore); int32_t GetPageIdByUrl(const std::string& url) { bool tmp = false; return GetPageIdByUrl(url, tmp); } void ResetStagingPage(); void FlushAnimationTasks(); void StartPush(const PageTarget& target, const std::string& params, const std::function& errorCallback); void StartReplace(const PageTarget& target, const std::string& params, const std::function& errorCallback); void StartBack(const PageTarget& target, const std::string& params); void BackCheckAlert(const PageTarget& target, const std::string& params); void ProcessRouterTask(); void AddRouterTask(const RouterTask& task); bool IsNavigationStage(const PageTarget& target); void RecycleSinglePage(); void ClearAlertCallback(PageInfo pageInfo); bool CheckIndexValid(int32_t index) const; DialogProperties ParsePropertiesFromAttr(const PromptDialogAttr &dialogAttr); std::unique_ptr GetNavigationJsonInfo(); std::atomic pageIdPool_ = 0; int32_t callbackCnt_ = 0; int32_t pageId_ = -1; bool isRouteStackFull_ = false; bool isStagingPageExist_ = false; int32_t singlePageId_ = -1; std::string mainPagePath_; PageTarget backUri_ = PageTarget(""); std::string backParam_; std::vector pageRouteStack_; std::unordered_map> pageMap_; std::unordered_map pageParamMap_; std::unordered_map jsCallBackResult_; LoadJsCallback loadJs_; ExternalEventCallback externalEvent_; JsMessageDispatcherSetterCallback dispatcherCallback_; EventCallback asyncEvent_; EventCallback syncEvent_; UpdatePageCallback updatePage_; ResetStagingPageCallback resetStagingPage_; DestroyPageCallback destroyPage_; DestroyApplicationCallback destroyApplication_; UpdateApplicationStateCallback updateApplicationState_; TimerCallback timer_; std::unordered_map> timeoutTaskMap_; MediaQueryCallback mediaQueryCallback_; LayoutInspectorCallback layoutInspectorCallback_; DrawInspectorCallback drawInspectorCallback_; RequestAnimationCallback requestAnimationCallback_; JsCallback jsCallback_; OnWindowDisplayModeChangedCallBack onWindowDisplayModeChanged_; OnConfigurationUpdatedCallBack onConfigurationUpdated_; OnSaveAbilityStateCallBack onSaveAbilityState_; OnRestoreAbilityStateCallBack onRestoreAbilityState_; OnNewWantCallBack onNewWant_; OnMemoryLevelCallBack onMemoryLevel_; OnStartContinuationCallBack onStartContinuationCallBack_; OnCompleteContinuationCallBack onCompleteContinuationCallBack_; OnRemoteTerminatedCallBack onRemoteTerminatedCallBack_; OnSaveDataCallBack onSaveDataCallBack_; OnRestoreDataCallBack onRestoreDataCallBack_; RefPtr manifestParser_; RefPtr jsAccessibilityManager_; RefPtr mediaQueryInfo_; RefPtr groupJsBridge_; RefPtr taskExecutor_; PipelineContextHolder pipelineContextHolder_; BaseId::IdType pageTransitionListenerId_ = 0L; std::queue animationFrameTaskIds_; std::unordered_map> animationFrameTaskMap_; mutable std::mutex mutex_; std::queue routerQueue_; mutable std::mutex routerQueueMutex_; RefPtr appSourceMap_; RefPtr pageRouterManager_; }; } // namespace OHOS::Ace::Framework #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_FRONTEND_DELEGATE_DECLARATIVE_H