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