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