• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CONTEXT_H
17 #define OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CONTEXT_H
18 
19 #include <memory>
20 
21 #include "ui_extension_context.h"
22 #include "js_free_install_observer.h"
23 #include "native_engine/native_engine.h"
24 
25 namespace OHOS {
26 namespace AbilityRuntime {
27 struct NapiCallbackInfo;
28 class JsEmbeddableUIAbilityContext;
29 class JSUIServiceUIExtConnection;
30 
31 class JsUIExtensionContext {
32 public:
JsUIExtensionContext(const std::shared_ptr<UIExtensionContext> & context)33     explicit JsUIExtensionContext(const std::shared_ptr<UIExtensionContext>& context) : context_(context) {}
34     virtual ~JsUIExtensionContext() = default;
35     static void Finalizer(napi_env env, void* data, void* hint);
36     static napi_value StartAbility(napi_env env, napi_callback_info info);
37     static napi_value OpenLink(napi_env env, napi_callback_info info);
38     static napi_value TerminateSelf(napi_env env, napi_callback_info info);
39     static napi_value TerminateSelfWithResult(napi_env env, napi_callback_info info);
40     static napi_value CreateJsUIExtensionContext(napi_env env, std::shared_ptr<UIExtensionContext> context);
41     static napi_value StartAbilityForResult(napi_env env, napi_callback_info info);
42     static napi_value StartAbilityForResultAsCaller(napi_env env, napi_callback_info info);
43     static napi_value StartUIAbilities(napi_env env, napi_callback_info info);
44     static napi_value ConnectAbility(napi_env env, napi_callback_info info);
45     static napi_value DisconnectAbility(napi_env env, napi_callback_info info);
46     static napi_value ReportDrawnCompleted(napi_env env, napi_callback_info info);
47     static napi_value OpenAtomicService(napi_env env, napi_callback_info info);
48     static napi_value StartUIServiceExtension(napi_env env, napi_callback_info info);
49     static napi_value ConnectUIServiceExtension(napi_env env, napi_callback_info info);
50     static napi_value DisconnectUIServiceExtension(napi_env env, napi_callback_info info);
51     static napi_value StartServiceExtensionAbility(napi_env env, napi_callback_info info);
52     static napi_value StartServiceExtensionAbilityWithAccount(napi_env env, napi_callback_info info);
53     static napi_value SetColorMode(napi_env env, napi_callback_info info);
54     static napi_value SetHostPageOverlayForbidden(napi_env env, napi_callback_info info);
55     static napi_value StartAbilityByType(napi_env env, napi_callback_info info);
56     static napi_value IsTerminating(napi_env env, napi_callback_info info);
57 
58 protected:
59     virtual napi_value OnStartAbility(napi_env env, NapiCallbackInfo& info);
60     virtual napi_value OnTerminateSelf(napi_env env, NapiCallbackInfo& info);
61     virtual napi_value OnTerminateSelfWithResult(napi_env env, NapiCallbackInfo& info);
62     virtual napi_value OnStartAbilityForResult(napi_env env, NapiCallbackInfo& info);
63     virtual napi_value OnStartAbilityForResultAsCaller(napi_env env, NapiCallbackInfo &info);
64     virtual napi_value OnStartUIAbilities(napi_env env, NapiCallbackInfo& info);
65     virtual napi_value OnConnectAbility(napi_env env, NapiCallbackInfo& info);
66     virtual napi_value OnDisconnectAbility(napi_env env, NapiCallbackInfo& info);
67     virtual napi_value OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info);
68     virtual napi_value OnOpenAtomicService(napi_env env, NapiCallbackInfo& info);
69     virtual napi_value OnStartUIServiceExtension(napi_env env, NapiCallbackInfo& info);
70     virtual napi_value OnStartServiceExtensionAbility(napi_env env, NapiCallbackInfo& info);
71     virtual napi_value OnStartServiceExtensionAbilityWithAccount(napi_env env, NapiCallbackInfo& info);
72     virtual napi_value OnSetHostPageOverlayForbidden(napi_env env, NapiCallbackInfo& info);
73     bool UnwrapConnectUIServiceExtensionParam(napi_env env, NapiCallbackInfo& info, AAFwk::Want& want);
74     bool CheckConnectAlreadyExist(napi_env env, AAFwk::Want& want, napi_value callback, napi_value& result);
75     virtual napi_value OnConnectUIServiceExtension(napi_env env, NapiCallbackInfo& info);
76     static void DoConnectUIServiceExtension(napi_env env,
77         std::weak_ptr<UIExtensionContext> weakContext, sptr<JSUIServiceUIExtConnection> connection,
78         std::shared_ptr<NapiAsyncTask> uasyncTaskShared, const AAFwk::Want& want);
79     virtual napi_value OnDisconnectUIServiceExtension(napi_env env, NapiCallbackInfo& info);
80     void SetCallbackForTerminateWithResult(int32_t resultCode, AAFwk::Want& want,
81         NapiAsyncTask::CompleteCallback& complete);
82     virtual napi_value OnSetColorMode(napi_env env, NapiCallbackInfo& info);
83     virtual napi_value OnStartAbilityByType(napi_env env, NapiCallbackInfo& info);
84     virtual napi_value OnIsTerminating(napi_env env, NapiCallbackInfo& info);
85 
86 protected:
87     std::weak_ptr<UIExtensionContext> context_;
88 private:
89     sptr<JsFreeInstallObserver> freeInstallObserver_ = nullptr;
90     friend class JsEmbeddableUIAbilityContext;
91 
92     bool CheckStartAbilityInputParam(napi_env env, NapiCallbackInfo& info, AAFwk::Want& want,
93         AAFwk::StartOptions& startOptions, size_t& unwrapArgc) const;
94     napi_value OpenAtomicServiceInner(napi_env env, NapiCallbackInfo& info, AAFwk::Want &want,
95         const AAFwk::StartOptions &options, size_t unwrapArgc);
96     void AddFreeInstallObserver(napi_env env, const AAFwk::Want &want, napi_value callback, napi_value* result,
97         bool isAbilityResult = false, bool isOpenLink = false);
98     bool UnwrapWantList(napi_env env, NapiCallbackInfo &info, std::vector<AAFwk::Want> &wantList);
99     bool CreateOpenLinkTask(const napi_env &env, const napi_value &lastParam,
100         AAFwk::Want &want, int &requestCode);
101     napi_value OnOpenLink(napi_env env, NapiCallbackInfo& info);
102     napi_value OnOpenLinkInner(napi_env env, const AAFwk::Want& want,
103         int requestCode, const std::string& startTime, const std::string& url);
104     void UnWrapCompletionHandlerForAtomicService(
105         napi_env env, napi_value param, AAFwk::StartOptions &options, const std::string &appId);
106 #ifdef SUPPORT_SCREEN
107     void InitDisplayId(AAFwk::Want &want);
108     void InitDisplayId(AAFwk::Want &want, AAFwk::StartOptions &startOptions, napi_env &env, NapiCallbackInfo& info);
109 #endif
110 };
111 
112 class JSUIExtensionConnection : public AbilityConnectCallback {
113 public:
114     explicit JSUIExtensionConnection(napi_env env);
115     ~JSUIExtensionConnection();
116     void ReleaseNativeReference(NativeReference* ref);
117     void OnAbilityConnectDone(
118         const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode) override;
119     void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override;
120     virtual void HandleOnAbilityConnectDone(
121         const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode);
122     virtual void HandleOnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode);
123     void SetJsConnectionObject(napi_value jsConnectionObject);
GetJsConnectionObject()124     std::unique_ptr<NativeReference>& GetJsConnectionObject() { return jsConnectionObject_; }
125     void RemoveConnectionObject();
126     void CallJsFailed(int32_t errorCode);
127     napi_value CallObjectMethod(const char* name, napi_value const *argv, size_t argc);
128     void SetConnectionId(int64_t id);
129     int64_t GetConnectionId();
130 protected:
131     napi_env env_ = nullptr;
132     std::unique_ptr<NativeReference> jsConnectionObject_ = nullptr;
133     int64_t connectionId_ = -1;
134 };
135 
136 struct UIExtensionConnectionKey {
137     AAFwk::Want want;
138     int64_t id;
139 };
140 
141 struct key_compare {
operatorkey_compare142     bool operator()(const UIExtensionConnectionKey &key1, const UIExtensionConnectionKey &key2) const
143     {
144         if (key1.id < key2.id) {
145             return true;
146         }
147         return false;
148     }
149 };
150 
151 }  // namespace AbilityRuntime
152 }  // namespace OHOS
153 #endif  // OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CONTEXT_H
154