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