• 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 
30 class JsUIExtensionContext {
31 public:
JsUIExtensionContext(const std::shared_ptr<UIExtensionContext> & context)32     explicit JsUIExtensionContext(const std::shared_ptr<UIExtensionContext>& context) : context_(context) {}
33     virtual ~JsUIExtensionContext() = default;
34     static void Finalizer(napi_env env, void* data, void* hint);
35     static napi_value StartAbility(napi_env env, napi_callback_info info);
36     static napi_value OpenLink(napi_env env, napi_callback_info info);
37     static napi_value TerminateSelf(napi_env env, napi_callback_info info);
38     static napi_value TerminateSelfWithResult(napi_env env, napi_callback_info info);
39     static napi_value CreateJsUIExtensionContext(napi_env env, std::shared_ptr<UIExtensionContext> context);
40     static napi_value StartAbilityForResult(napi_env env, napi_callback_info info);
41     static napi_value StartAbilityForResultAsCaller(napi_env env, napi_callback_info info);
42     static napi_value ConnectAbility(napi_env env, napi_callback_info info);
43     static napi_value DisconnectAbility(napi_env env, napi_callback_info info);
44     static napi_value ReportDrawnCompleted(napi_env env, napi_callback_info info);
45     static napi_value OpenAtomicService(napi_env env, napi_callback_info info);
46 
47 protected:
48     virtual napi_value OnStartAbility(napi_env env, NapiCallbackInfo& info);
49     virtual napi_value OnTerminateSelf(napi_env env, NapiCallbackInfo& info);
50     virtual napi_value OnTerminateSelfWithResult(napi_env env, NapiCallbackInfo& info);
51     virtual napi_value OnStartAbilityForResult(napi_env env, NapiCallbackInfo& info);
52     virtual napi_value OnStartAbilityForResultAsCaller(napi_env env, NapiCallbackInfo &info);
53     virtual napi_value OnConnectAbility(napi_env env, NapiCallbackInfo& info);
54     virtual napi_value OnDisconnectAbility(napi_env env, NapiCallbackInfo& info);
55     virtual napi_value OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info);
56     virtual napi_value OnOpenAtomicService(napi_env env, NapiCallbackInfo& info);
57     void SetCallbackForTerminateWithResult(int32_t resultCode, AAFwk::Want& want,
58         NapiAsyncTask::CompleteCallback& complete);
59 
60 protected:
61     std::weak_ptr<UIExtensionContext> context_;
62 private:
63     sptr<JsFreeInstallObserver> freeInstallObserver_ = nullptr;
64     friend class JsEmbeddableUIAbilityContext;
65     bool CheckStartAbilityInputParam(napi_env env, NapiCallbackInfo& info, AAFwk::Want& want,
66         AAFwk::StartOptions& startOptions, size_t& unwrapArgc) const;
67     napi_value OpenAtomicServiceInner(napi_env env, NapiCallbackInfo& info, AAFwk::Want &want,
68         const AAFwk::StartOptions &options, size_t unwrapArgc);
69     void AddFreeInstallObserver(napi_env env, const AAFwk::Want &want, napi_value callback, napi_value* result,
70         bool isAbilityResult = false, bool isOpenLink = false);
71     bool CreateOpenLinkTask(const napi_env &env, const napi_value &lastParam,
72         AAFwk::Want &want, int &requestCode);
73     void RemoveOpenLinkTask(int requestCode);
74     napi_value OnOpenLink(napi_env env, NapiCallbackInfo& info);
75     napi_value OnOpenLinkInner(napi_env env, const AAFwk::Want& want,
76         int requestCode, const std::string& startTime, const std::string& url);
77 };
78 
79 class JSUIExtensionConnection : public AbilityConnectCallback {
80 public:
81     explicit JSUIExtensionConnection(napi_env env);
82     ~JSUIExtensionConnection();
83     void OnAbilityConnectDone(
84         const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode) override;
85     void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override;
86     void HandleOnAbilityConnectDone(
87         const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode);
88     void HandleOnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode);
89     void SetJsConnectionObject(napi_value jsConnectionObject);
90     void RemoveConnectionObject();
91     void CallJsFailed(int32_t errorCode);
92     void SetConnectionId(int64_t id);
93     int64_t GetConnectionId();
94 private:
95     napi_env env_ = nullptr;
96     std::unique_ptr<NativeReference> jsConnectionObject_ = nullptr;
97     int64_t connectionId_ = -1;
98 };
99 
100 struct UIExtensionConnectionKey {
101     AAFwk::Want want;
102     int64_t id;
103 };
104 
105 struct key_compare {
operatorkey_compare106     bool operator()(const UIExtensionConnectionKey &key1, const UIExtensionConnectionKey &key2) const
107     {
108         if (key1.id < key2.id) {
109             return true;
110         }
111         return false;
112     }
113 };
114 
115 }  // namespace AbilityRuntime
116 }  // namespace OHOS
117 #endif  // OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CONTEXT_H
118