• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 ConnectAbility(napi_env env, napi_callback_info info);
44     static napi_value DisconnectAbility(napi_env env, napi_callback_info info);
45     static napi_value ReportDrawnCompleted(napi_env env, napi_callback_info info);
46     static napi_value OpenAtomicService(napi_env env, napi_callback_info info);
47     static napi_value StartUIServiceExtension(napi_env env, napi_callback_info info);
48     static napi_value ConnectUIServiceExtension(napi_env env, napi_callback_info info);
49     static napi_value DisconnectUIServiceExtension(napi_env env, napi_callback_info info);
50     static napi_value SetHostPageOverlayForbidden(napi_env env, napi_callback_info info);
51 
52 protected:
53     virtual napi_value OnStartAbility(napi_env env, NapiCallbackInfo& info);
54     virtual napi_value OnTerminateSelf(napi_env env, NapiCallbackInfo& info);
55     virtual napi_value OnTerminateSelfWithResult(napi_env env, NapiCallbackInfo& info);
56     virtual napi_value OnStartAbilityForResult(napi_env env, NapiCallbackInfo& info);
57     virtual napi_value OnStartAbilityForResultAsCaller(napi_env env, NapiCallbackInfo &info);
58     virtual napi_value OnConnectAbility(napi_env env, NapiCallbackInfo& info);
59     virtual napi_value OnDisconnectAbility(napi_env env, NapiCallbackInfo& info);
60     virtual napi_value OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info);
61     virtual napi_value OnOpenAtomicService(napi_env env, NapiCallbackInfo& info);
62     virtual napi_value OnStartUIServiceExtension(napi_env env, NapiCallbackInfo& info);
63     virtual napi_value OnSetHostPageOverlayForbidden(napi_env env, NapiCallbackInfo& info);
64     bool UnwrapConnectUIServiceExtensionParam(napi_env env, NapiCallbackInfo& info, AAFwk::Want& want);
65     bool CheckConnectAlreadyExist(napi_env env, AAFwk::Want& want, napi_value callback, napi_value& result);
66     virtual napi_value OnConnectUIServiceExtension(napi_env env, NapiCallbackInfo& info);
67     static void DoConnectUIServiceExtension(napi_env env,
68         std::weak_ptr<UIExtensionContext> weakContext, sptr<JSUIServiceUIExtConnection> connection,
69         std::shared_ptr<NapiAsyncTask> uasyncTaskShared, const AAFwk::Want& want);
70     virtual napi_value OnDisconnectUIServiceExtension(napi_env env, NapiCallbackInfo& info);
71     void SetCallbackForTerminateWithResult(int32_t resultCode, AAFwk::Want& want,
72         NapiAsyncTask::CompleteCallback& complete);
73 
74 protected:
75     std::weak_ptr<UIExtensionContext> context_;
76 private:
77     sptr<JsFreeInstallObserver> freeInstallObserver_ = nullptr;
78     friend class JsEmbeddableUIAbilityContext;
79     bool CheckStartAbilityInputParam(napi_env env, NapiCallbackInfo& info, AAFwk::Want& want,
80         AAFwk::StartOptions& startOptions, size_t& unwrapArgc) const;
81     napi_value OpenAtomicServiceInner(napi_env env, NapiCallbackInfo& info, AAFwk::Want &want,
82         const AAFwk::StartOptions &options, size_t unwrapArgc);
83     void AddFreeInstallObserver(napi_env env, const AAFwk::Want &want, napi_value callback, napi_value* result,
84         bool isAbilityResult = false, bool isOpenLink = false);
85     bool CreateOpenLinkTask(const napi_env &env, const napi_value &lastParam,
86         AAFwk::Want &want, int &requestCode);
87     napi_value OnOpenLink(napi_env env, NapiCallbackInfo& info);
88     napi_value OnOpenLinkInner(napi_env env, const AAFwk::Want& want,
89         int requestCode, const std::string& startTime, const std::string& url);
90 #ifdef SUPPORT_SCREEN
91     void InitDisplayId(AAFwk::Want &want);
92     void InitDisplayId(AAFwk::Want &want, AAFwk::StartOptions &startOptions, napi_env &env, NapiCallbackInfo& info);
93 #endif
94 };
95 
96 class JSUIExtensionConnection : public AbilityConnectCallback {
97 public:
98     explicit JSUIExtensionConnection(napi_env env);
99     ~JSUIExtensionConnection();
100     void ReleaseNativeReference(NativeReference* ref);
101     void OnAbilityConnectDone(
102         const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode) override;
103     void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override;
104     virtual void HandleOnAbilityConnectDone(
105         const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode);
106     virtual void HandleOnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode);
107     void SetJsConnectionObject(napi_value jsConnectionObject);
GetJsConnectionObject()108     std::unique_ptr<NativeReference>& GetJsConnectionObject() { return jsConnectionObject_; }
109     void RemoveConnectionObject();
110     void CallJsFailed(int32_t errorCode);
111     napi_value CallObjectMethod(const char* name, napi_value const *argv, size_t argc);
112     void SetConnectionId(int64_t id);
113     int64_t GetConnectionId();
114 protected:
115     napi_env env_ = nullptr;
116     std::unique_ptr<NativeReference> jsConnectionObject_ = nullptr;
117     int64_t connectionId_ = -1;
118 };
119 
120 struct UIExtensionConnectionKey {
121     AAFwk::Want want;
122     int64_t id;
123 };
124 
125 struct key_compare {
operatorkey_compare126     bool operator()(const UIExtensionConnectionKey &key1, const UIExtensionConnectionKey &key2) const
127     {
128         if (key1.id < key2.id) {
129             return true;
130         }
131         return false;
132     }
133 };
134 
135 }  // namespace AbilityRuntime
136 }  // namespace OHOS
137 #endif  // OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CONTEXT_H
138