1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_COMMON_JS_ENGINE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_COMMON_JS_ENGINE_H 18 19 #include <string> 20 #include <unordered_map> 21 22 #include "core/common/frontend.h" 23 #include "core/common/js_message_dispatcher.h" 24 #include "frameworks/bridge/js_frontend/frontend_delegate.h" 25 #include "frameworks/bridge/js_frontend/js_ace_page.h" 26 27 class NativeEngine; 28 class NativeReference; 29 namespace OHOS::Ace::Framework { 30 using PixelMapNapiEntry = void* (*)(void*, void*); 31 struct JsModule { 32 const std::string moduleName; 33 const std::string methods; 34 }; 35 36 struct JsComponent { 37 const std::string componentName; 38 const std::string methods; 39 }; 40 41 class JsEngineInstance { 42 public: 43 JsEngineInstance() = default; 44 virtual ~JsEngineInstance() = default; 45 46 virtual void FlushCommandBuffer(void* context, const std::string& command); GetNativeEngine()47 NativeEngine* GetNativeEngine() 48 { 49 return nativeEngine_; 50 } SetNativeEngine(NativeEngine * nativeEngine)51 void SetNativeEngine(NativeEngine* nativeEngine) 52 { 53 nativeEngine_ = nativeEngine; 54 } 55 56 protected: 57 NativeEngine* nativeEngine_ = nullptr; 58 }; 59 60 class JsEngine : public AceType { 61 DECLARE_ACE_TYPE(JsEngine, AceType); 62 63 public: 64 JsEngine() = default; 65 virtual ~JsEngine() = default; 66 67 void RegisterSingleComponent(std::string& command, const std::string& componentName, const std::string& methods); 68 69 void RegisterSingleModule(std::string& command, const std::string& moduleName, const std::string& methods); 70 71 void RegisterModules(std::string& command); 72 73 void RegisterComponents(std::string& command); 74 75 // Initialize the JS engine. 76 virtual bool Initialize(const RefPtr<FrontendDelegate>& delegate) = 0; 77 78 // Destroy the js engine resource Destroy()79 virtual void Destroy() {} 80 81 // Load script in JS engine, and execute in corresponding context. 82 virtual void LoadJs(const std::string& url, const RefPtr<JsAcePage>& page, bool isMainPage) = 0; 83 84 // Update running page 85 virtual void UpdateRunningPage(const RefPtr<JsAcePage>& page) = 0; 86 87 // Update staging page 88 virtual void UpdateStagingPage(const RefPtr<JsAcePage>& page) = 0; 89 90 // Reset loading page 91 virtual void ResetStagingPage() = 0; 92 93 virtual void SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) = 0; 94 95 // Fire AsyncEvent on JS 96 virtual void FireAsyncEvent(const std::string& eventId, const std::string& param) = 0; 97 98 // Fire SyncEvent on JS 99 virtual void FireSyncEvent(const std::string& eventId, const std::string& param) = 0; 100 101 // Fire external event on JS thread 102 virtual void FireExternalEvent(const std::string& componentId, const uint32_t nodeId) = 0; 103 104 // Timer callback on JS 105 virtual void TimerCallback(const std::string& callbackId, const std::string& delay, bool isInterval) = 0; 106 107 // Destroy page instance on JS 108 virtual void DestroyPageInstance(int32_t pageId) = 0; 109 110 // destroy application instance according packageName 111 virtual void DestroyApplication(const std::string& packageName) = 0; 112 113 // update application State according packageName UpdateApplicationState(const std::string & packageName,Frontend::State state)114 virtual void UpdateApplicationState(const std::string& packageName, Frontend::State state) {} 115 OnWindowDisplayModeChanged(bool isShownInMultiWindow,const std::string & data)116 virtual void OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data) {} 117 OnNewWant(const std::string & data)118 virtual void OnNewWant(const std::string& data) {} 119 OnSaveAbilityState(std::string & data)120 virtual void OnSaveAbilityState(std::string& data) {} 121 OnRestoreAbilityState(const std::string & data)122 virtual void OnRestoreAbilityState(const std::string& data) {} 123 OnConfigurationUpdated(const std::string & data)124 virtual void OnConfigurationUpdated(const std::string& data) {} 125 OnActive()126 virtual void OnActive() {} 127 OnInactive()128 virtual void OnInactive() {} 129 OnMemoryLevel(const int32_t code)130 virtual void OnMemoryLevel(const int32_t code) {} 131 OnStartContinuation()132 virtual bool OnStartContinuation() 133 { 134 return false; 135 } 136 OnCompleteContinuation(int32_t code)137 virtual void OnCompleteContinuation(int32_t code) {} 138 OnRemoteTerminated()139 virtual void OnRemoteTerminated() {} 140 OnSaveData(std::string & data)141 virtual void OnSaveData(std::string& data) {} 142 OnRestoreData(const std::string & data)143 virtual bool OnRestoreData(const std::string& data) 144 { 145 return false; 146 } 147 MediaQueryCallback(const std::string & callbackId,const std::string & args)148 virtual void MediaQueryCallback(const std::string& callbackId, const std::string& args) 149 { 150 if (mediaUpdateCallback_) { 151 mediaUpdateCallback_(this); 152 } 153 } 154 155 virtual void RequestAnimationCallback(const std::string& callbackId, uint64_t timeStamp) = 0; 156 157 virtual void JsCallback(const std::string& callbackId, const std::string& args) = 0; 158 159 virtual void RunGarbageCollection() = 0; 160 GetStacktraceMessage()161 virtual std::string GetStacktraceMessage() 162 { 163 return ""; 164 } 165 NotifyAppStorage(const std::string & key,const std::string & value)166 virtual void NotifyAppStorage(const std::string& key, const std::string& value) {} 167 168 virtual RefPtr<GroupJsBridge> GetGroupJsBridge() = 0; 169 GetFrontend()170 virtual ACE_EXPORT FrontendDelegate* GetFrontend() 171 { 172 return nullptr; 173 } 174 SetContentStorage(int32_t instanceId,NativeReference * storage)175 virtual void SetContentStorage(int32_t instanceId, NativeReference* storage) {} 176 SetContext(int32_t instanceId,NativeReference * context)177 virtual void SetContext(int32_t instanceId, NativeReference* context) {} 178 IsDebugVersion()179 bool IsDebugVersion() const 180 { 181 return isDebugVersion_; 182 } 183 SetDebugVersion(bool value)184 void SetDebugVersion(bool value) 185 { 186 isDebugVersion_ = value; 187 } 188 NeedDebugBreakPoint()189 bool NeedDebugBreakPoint() const 190 { 191 return needDebugBreakPoint_; 192 } 193 SetNeedDebugBreakPoint(bool value)194 void SetNeedDebugBreakPoint(bool value) 195 { 196 needDebugBreakPoint_ = value; 197 } 198 GetInstanceName()199 const std::string& GetInstanceName() const 200 { 201 return instanceName_; 202 } 203 SetInstanceName(const std::string & name)204 void SetInstanceName(const std::string& name) 205 { 206 instanceName_ = name; 207 } 208 AddExtraNativeObject(const std::string & key,void * value)209 void AddExtraNativeObject(const std::string& key, void* value) 210 { 211 extraNativeObject_[key] = value; 212 } 213 GetExtraNativeObject()214 const std::unordered_map<std::string, void*>& GetExtraNativeObject() const 215 { 216 return extraNativeObject_; 217 } 218 GetNewComponentWithJsCode(const std::string & jsCode)219 virtual RefPtr<Component> GetNewComponentWithJsCode(const std::string& jsCode) 220 { 221 return nullptr; 222 } 223 GetNativeEngine()224 NativeEngine* GetNativeEngine() 225 { 226 return nativeEngine_; 227 } 228 RegistMediaUpdateCallback(std::function<void (JsEngine *)> cb)229 void ACE_EXPORT RegistMediaUpdateCallback(std::function<void(JsEngine*)> cb) 230 { 231 mediaUpdateCallback_ = cb; 232 } 233 UnregistMediaUpdateCallback()234 void ACE_EXPORT UnregistMediaUpdateCallback() 235 { 236 mediaUpdateCallback_ = nullptr; 237 } 238 239 virtual void RunNativeEngineLoop(); 240 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) 241 static PixelMapNapiEntry GetPixelMapNapiEntry(); 242 #endif 243 244 protected: 245 NativeEngine* nativeEngine_ = nullptr; 246 std::function<void(JsEngine*)> mediaUpdateCallback_; 247 248 private: 249 // weather the app has debugger.so. 250 bool isDebugVersion_ = false; 251 252 // if debug, '-D' means need debug breakpoint, by default, do not enter breakpoint. 253 bool needDebugBreakPoint_ = false; 254 255 std::string instanceName_; 256 257 std::unordered_map<std::string, void*> extraNativeObject_; 258 }; 259 260 } // namespace OHOS::Ace::Framework 261 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_COMMON_JS_ENGINE_H 262