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