• 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_CARD_FRONTEND_CARD_FRONTEND_H
17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H
18 
19 #include <memory>
20 
21 #include "base/memory/ace_type.h"
22 #include "core/common/ace_page.h"
23 #include "core/common/frontend.h"
24 #include "frameworks/bridge/card_frontend/card_frontend_delegate.h"
25 #include "frameworks/bridge/card_frontend/js_card_parser.h"
26 #include "frameworks/bridge/common/accessibility/accessibility_node_manager.h"
27 #include "frameworks/bridge/common/manifest/manifest_parser.h"
28 #include "frameworks/bridge/common/utils/page_id_pool.h"
29 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h"
30 
31 namespace OHOS::Ace {
32 
33 class ACE_EXPORT CardFrontend : public Frontend {
34     DECLARE_ACE_TYPE(CardFrontend, Frontend);
35 
36 public:
37     CardFrontend() = default;
38     ~CardFrontend() override;
39 
SetLoadCardCallBack(WeakPtr<PipelineBase> outSidePipelineContext)40     virtual void SetLoadCardCallBack(WeakPtr<PipelineBase> outSidePipelineContext) {}
41     virtual void UpdateData(const std::string& dataList);
42     virtual void OnPageLoaded(const RefPtr<Framework::JsAcePage>& page);
43     virtual void HandleSurfaceChanged(int32_t width, int32_t height);
44     virtual void UpdatePageData(const std::string& dataList);
45     virtual void OnMediaFeatureUpdate();
46     std::string GetFormSrcPath(const std::string& uri, const std::string& suffix) const;
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     void SetAssetManager(const RefPtr<AssetManager>& assetManager) override;
54 
55     void RunPage(int32_t pageId, const std::string& url, const std::string& params) override;
ReplacePage(const std::string & url,const std::string & params)56     void ReplacePage(const std::string& url, const std::string& params) override {}
PushPage(const std::string & url,const std::string & params)57     void PushPage(const std::string& url, const std::string& params) override {}
AddPage(const RefPtr<AcePage> & page)58     void AddPage(const RefPtr<AcePage>& page) override {}
59     RefPtr<AcePage> GetPage(int32_t pageId) const override;
TriggerGarbageCollection()60     void TriggerGarbageCollection() override {}
61 
SendCallbackMessage(const std::string & callbackId,const std::string & data)62     void SendCallbackMessage(const std::string& callbackId, const std::string& data) const override {}
63     // platform channel.
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher)64     void SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const override {}
TransferComponentResponseData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data)65     void TransferComponentResponseData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override {}
TransferJsResponseData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data)66     void TransferJsResponseData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override {}
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data)67     void TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override {}
TransferJsPluginGetError(int32_t callbackId,int32_t errorCode,std::string && errorMessage)68     void TransferJsPluginGetError(int32_t callbackId, int32_t errorCode, std::string&& errorMessage) const override {}
69 
LoadPluginJsCode(std::string && jsCode)70     void LoadPluginJsCode(std::string&& jsCode) const override {}
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen)71     void LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const override {}
72 
73     // application lifecycle.
UpdateState(Frontend::State state)74     void UpdateState(Frontend::State state) override {}
75 
76     // page lifecycle.
OnBackPressed()77     bool OnBackPressed() override
78     {
79         return false;
80     }
81 
OnSaveAbilityState(std::string & data)82     void OnSaveAbilityState (std::string& data) override {}
83 
OnRestoreAbilityState(const std::string & data)84     void OnRestoreAbilityState (const std::string& data) override {}
85 
OnShow()86     void OnShow() override
87     {
88         foregroundFrontend_ = true;
89     }
OnHide()90     void OnHide() override
91     {
92         foregroundFrontend_ = false;
93     }
94 
OnActive()95     void OnActive() override {}
OnInactive()96     void OnInactive() override {}
OnStartContinuation()97     bool OnStartContinuation() override
98     {
99         return false;
100     }
OnCompleteContinuation(int32_t code)101     void OnCompleteContinuation(int32_t code) override {}
OnMemoryLevel(const int32_t level)102     void OnMemoryLevel(const int32_t level) override {}
OnSaveData(std::string & data)103     void OnSaveData(std::string& data) override {}
OnRestoreData(const std::string & data)104     bool OnRestoreData(const std::string& data) override
105     {
106         return false;
107     }
OnRemoteTerminated()108     void OnRemoteTerminated() override {}
OnNewRequest(const std::string & data)109     void OnNewRequest(const std::string& data) override {}
OnNewWant(const std::string & data)110     void OnNewWant(const std::string& data) override {}
CallRouterBack()111     void CallRouterBack() override {}
112     void OnSurfaceChanged(int32_t width, int32_t height) override;
DumpFrontend()113     void DumpFrontend() const override {}
GetPagePath()114     std::string GetPagePath() const override
115     {
116         return "";
117     }
118     WindowConfig& GetWindowConfig() override;
119     void SetColorMode(ColorMode colorMode) override;
120     void RebuildAllPages() override;
121 
GetEventHandler()122     RefPtr<AceEventHandler> GetEventHandler() override
123     {
124         return eventHandler_;
125     }
126 
GetType()127     FrontendType GetType() override
128     {
129         return type_;
130     }
131 
132     // judge frontend is foreground frontend.
IsForeground()133     bool IsForeground() override
134     {
135         return foregroundFrontend_;
136     }
137 
GetAccessibilityManager()138     RefPtr<AccessibilityManager> GetAccessibilityManager() const override
139     {
140         if (!delegate_) {
141             LOGE("GetAccessibilityManager delegate is null");
142             return nullptr;
143         }
144         return delegate_->GetJsAccessibilityManager();
145     }
146 
SetDensity(double density)147     void SetDensity(double density)
148     {
149         density_ = density;
150     }
151 
ResetPageLoadState()152     void ResetPageLoadState()
153     {
154         pageLoaded_ = false;
155     }
156 
SetCardHapPath(const std::string & path)157     void SetCardHapPath(const std::string& path)
158     {
159         cardHapPath_ = path;
160     }
161 
GetFormSrc()162     std::string GetFormSrc() const
163     {
164         return formSrc_;
165     }
166 
SetFormSrc(std::string formSrc)167     void SetFormSrc(std::string formSrc)
168     {
169         formSrc_ = formSrc;
170     }
171 
GetCardWindowConfig()172     WindowConfig& GetCardWindowConfig()
173     {
174         return cardWindowConfig_;
175     }
176 
SetCardWindowConfig(WindowConfig cardWindowConfig)177     void SetCardWindowConfig(WindowConfig cardWindowConfig)
178     {
179         cardWindowConfig_ = cardWindowConfig;
180     }
181 
SetRunningCardId(int64_t cardId)182     void SetRunningCardId(int64_t cardId)
183     {
184         cardId_ = cardId;
185     }
186 
187 protected:
188     void ParseManifest() const;
189 
190     ColorMode colorMode_ = ColorMode::LIGHT;
191     FrontendType type_ = FrontendType::JS_CARD;
192     bool foregroundFrontend_ = false;
193     bool pageLoaded_ = false;
194     double density_ = 1.0;
195     std::string cardHapPath_;
196 
197     Framework::PipelineContextHolder holder_;
198     RefPtr<AssetManager> assetManager_;
199     RefPtr<Framework::ManifestParser> manifestParser_;
200 
201     mutable std::once_flag onceFlag_;
202     RefPtr<TaskExecutor> taskExecutor_;
203     RefPtr<AceEventHandler> eventHandler_;
204     Framework::PageIdPool pageIdPool_;
205     std::string formSrc_;
206     WindowConfig cardWindowConfig_;
207     uint64_t cardId_ = 0; // cardId != formId, cardId is the nodeId of component.
208 
209 private:
210     RefPtr<Framework::CardFrontendDelegate> delegate_;
211     void LoadPage(const std::string& urlPath, const std::string& params);
212     void ParsePage(const RefPtr<PipelineBase>& context, const std::string& pageContent, const std::string& params,
213         const RefPtr<Framework::JsAcePage>& page);
214 
215     RefPtr<Framework::JsCardParser> parseJsCard_;
216 };
217 
218 class CardEventHandler : public AceEventHandler {
219 public:
CardEventHandler(const RefPtr<Framework::CardFrontendDelegate> & delegate)220     explicit CardEventHandler(const RefPtr<Framework::CardFrontendDelegate>& delegate) : delegate_(delegate)
221     {
222         ACE_DCHECK(delegate_);
223     }
224 
225     ~CardEventHandler() override = default;
226 
HandleAsyncEvent(const EventMarker & eventMarker)227     void HandleAsyncEvent(const EventMarker& eventMarker) override
228     {
229         LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
230             eventMarker.GetData().eventId.c_str());
231         delegate_->FireCardEvent(eventMarker);
232     }
233 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)234     void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override
235     {
236         LOGW("card event handler does not support this event type!");
237     }
238 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)239     void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override
240     {
241         LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
242             eventMarker.GetData().eventId.c_str());
243         delegate_->FireCardEvent(eventMarker);
244     }
245 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)246     void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override
247     {
248         LOGW("card event handler does not support this event type!");
249     }
250 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)251     void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override
252     {
253         LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
254             eventMarker.GetData().eventId.c_str());
255         delegate_->FireCardEvent(eventMarker, param);
256     }
257 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)258     void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override
259     {
260         LOGW("card event handler does not support this event type!");
261     }
262 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)263     void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override
264     {
265         LOGW("card event handler does not support this event type!");
266     }
267 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)268     void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override
269     {
270         LOGW("card event handler does not support this event type!");
271     }
272 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)273     void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override
274     {
275         LOGW("card event handler does not support this event type!");
276     }
277 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)278     void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId,
279         const bool isDestroy) override
280     {
281         LOGW("card event handler does not support this event type!");
282     }
283 
284 private:
285     RefPtr<Framework::CardFrontendDelegate> delegate_;
286 };
287 } // namespace OHOS::Ace
288 
289 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H
290