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