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