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 #ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_JS_FRONTEND_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_JS_FRONTEND_H 18 19 #include <string> 20 #include <unordered_map> 21 22 #include "base/memory/ace_type.h" 23 #include "base/utils/string_utils.h" 24 #include "core/common/ace_page.h" 25 #include "core/common/container.h" 26 #include "core/common/frontend.h" 27 #include "core/common/js_message_dispatcher.h" 28 #include "frameworks/bridge/js_frontend/engine/common/js_engine.h" 29 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h" 30 #include "frameworks/bridge/js_frontend/js_ace_page.h" 31 32 namespace OHOS::Ace { 33 34 // JsFrontend is the unique entrance from ACE backend to frontend. 35 // The relationship between AceActivity, AceContainer and JsFrontend is 1:1:1. 36 // So JsFrontend would be responsible for below things: 37 // - Create and initialize QuickJS engine. 38 // - Load pages of a JS app, and parse the manifest.json before loading main page. 39 // - Maintain the page stack of JS app by FrontendDelegateImpl. 40 // - Lifecycle of JS app (also AceActivity). 41 class JsFrontend : public Frontend { 42 DECLARE_ACE_TYPE(JsFrontend, Frontend); 43 44 public: 45 JsFrontend() = default; 46 ~JsFrontend() override; 47 48 bool Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor) override; 49 50 void Destroy() override; 51 52 void AttachPipelineContext(const RefPtr<PipelineBase>& context) override; 53 54 void SetAssetManager(const RefPtr<AssetManager>& assetManager) override; 55 56 UIContentErrorCode RunPage(const std::string& url, const std::string& params) override; 57 58 void ReplacePage(const std::string& url, const std::string& params) override; 59 60 void PushPage(const std::string& url, const std::string& params) override; 61 62 // Js frontend manages all pages self. AddPage(const RefPtr<AcePage> & page)63 void AddPage(const RefPtr<AcePage>& page) override {} 64 GetPage(int32_t pageId)65 RefPtr<AcePage> GetPage(int32_t pageId) const override 66 { 67 CHECK_NULL_RETURN(delegate_, nullptr); 68 return delegate_->GetPage(pageId); 69 } 70 GetCurrentReadyPage()71 WeakPtr<AcePage> GetCurrentReadyPage() const 72 { 73 CHECK_NULL_RETURN(delegate_, nullptr); 74 return delegate_->GetCurrentReadyPage(); 75 } 76 77 void TriggerGarbageCollection() override; 78 void DumpHeapSnapshot(bool isPrivate) override; 79 void DestroyHeapProfiler() override; 80 void ForceFullGC() override; 81 82 void SendCallbackMessage(const std::string& callbackId, const std::string& data) const override; 83 // platform channel. 84 void SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const override; 85 void TransferComponentResponseData(int32_t callbackId, int32_t code, 86 std::vector<uint8_t>&& data) const override; 87 void TransferJsResponseData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override; 88 #if defined(PREVIEW) RunNativeEngineLoop()89 void RunNativeEngineLoop() override 90 { 91 if (jsEngine_) { 92 jsEngine_->RunNativeEngineLoop(); 93 } 94 } 95 void TransferJsResponseDataPreview(int32_t callbackId, int32_t code, ResponseData responseData) const; 96 #endif 97 void TransferJsPluginGetError(int32_t callbackId, int32_t errorCode, std::string&& errorMessage) const override; 98 void TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override; 99 void LoadPluginJsCode(std::string&& jsCode) const override; 100 void LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const override; 101 102 // application lifecycle. 103 void UpdateState(Frontend::State state) override; 104 105 // page lifecycle. 106 bool OnBackPressed() override; OnSaveAbilityState(std::string & data)107 void OnSaveAbilityState(std::string& data) override {} OnRestoreAbilityState(const std::string & data)108 void OnRestoreAbilityState(const std::string& data) override {} 109 void OnShow() override; 110 void OnHide() override; 111 void OnConfigurationUpdated(const std::string& data) override; 112 void OnActive() override; 113 void OnInactive() override; 114 bool OnStartContinuation() override; 115 void OnCompleteContinuation(int32_t code) override; 116 void OnRemoteTerminated() override; 117 void OnSaveData(std::string& data) override; 118 bool OnRestoreData(const std::string& data) override; 119 OnMemoryLevel(const int32_t level)120 void OnMemoryLevel(const int32_t level) override {} 121 void OnNewRequest(const std::string& data) override; OnNewWant(const std::string & data)122 void OnNewWant(const std::string& data) override {} 123 void CallRouterBack() override; 124 void SetColorMode(ColorMode colorMode) override; 125 126 void OnSurfaceChanged(int32_t width, int32_t height) override; 127 128 void OnLayoutCompleted(const std::string& componentId) override; 129 void OnDrawCompleted(const std::string& componentId) override; 130 131 void DumpFrontend() const override; 132 std::string GetPagePath() const override; 133 GetEventHandler()134 RefPtr<AceEventHandler> GetEventHandler() override 135 { 136 return handler_; 137 } 138 139 // judge frontend is foreground frontend. IsForeground()140 bool IsForeground() override 141 { 142 return foregroundFrontend_; 143 } 144 145 RefPtr<AccessibilityManager> GetAccessibilityManager() const override; 146 WindowConfig& GetWindowConfig() override; 147 SetJsEngine(const RefPtr<Framework::JsEngine> & jsEngine)148 void SetJsEngine(const RefPtr<Framework::JsEngine>& jsEngine) 149 { 150 jsEngine_ = jsEngine; 151 } 152 SetNeedDebugBreakPoint(bool value)153 void SetNeedDebugBreakPoint(bool value) 154 { 155 if (jsEngine_) { 156 jsEngine_->SetNeedDebugBreakPoint(value); 157 } 158 } 159 SetDebugVersion(bool value)160 void SetDebugVersion(bool value) 161 { 162 if (jsEngine_) { 163 jsEngine_->SetDebugVersion(value); 164 } 165 } 166 SetInstanceName(const std::string & name)167 void SetInstanceName(const std::string& name) 168 { 169 if (jsEngine_) { 170 jsEngine_->SetInstanceName(name); 171 } 172 } 173 174 void RebuildAllPages() override; 175 176 void GetPluginsUsed(std::string& data) override; 177 178 private: 179 void InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor); 180 181 RefPtr<Framework::FrontendDelegateImpl> delegate_; 182 RefPtr<AceEventHandler> handler_; 183 RefPtr<Framework::JsEngine> jsEngine_; 184 bool foregroundFrontend_ = false; 185 }; 186 187 class JsEventHandler : public AceEventHandler { 188 public: JsEventHandler(const RefPtr<Framework::FrontendDelegateImpl> & delegate)189 explicit JsEventHandler(const RefPtr<Framework::FrontendDelegateImpl>& delegate) : delegate_(delegate) 190 { 191 ACE_DCHECK(delegate_); 192 } 193 194 ~JsEventHandler() override = default; 195 196 void HandleAsyncEvent(const EventMarker& eventMarker) override; 197 198 void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override; 199 200 void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override; 201 202 void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override; 203 204 void HandleAsyncEvent(const EventMarker& eventMarker, const GestureEvent& info) override; 205 206 void HandleAsyncEvent(const EventMarker& eventMarker, const RotationEvent& info) override; 207 208 void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override; 209 210 void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override; 211 212 void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override; 213 214 void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override; 215 216 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override; 217 218 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, 219 const bool isDestroy) override; 220 221 private: 222 RefPtr<Framework::FrontendDelegateImpl> delegate_; 223 }; 224 225 } // namespace OHOS::Ace 226 227 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_JS_FRONTEND_H 228