1 /* 2 * Copyright (c) 2021-2023 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 FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_FUNCTION_JS_FUNCTION_H 17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_FUNCTION_JS_FUNCTION_H 18 19 #include <functional> 20 21 #include "base/memory/ace_type.h" 22 #include "base/utils/macros.h" 23 #include "bridge/declarative_frontend/engine/js_types.h" 24 #include "frameworks/bridge/declarative_frontend/engine/bindings.h" 25 #include "frameworks/bridge/declarative_frontend/engine/js_execution_scope_defines.h" 26 #include "frameworks/bridge/declarative_frontend/engine/js_ref_ptr.h" 27 #if defined(XCOMPONENT_SUPPORTED) 28 #include "frameworks/bridge/declarative_frontend/jsview/js_xcomponent_controller.h" 29 #endif 30 31 namespace OHOS::Ace::Framework { 32 33 class ACE_EXPORT JsFunctionBase : public virtual AceType { 34 DECLARE_ACE_TYPE(JsFunctionBase, AceType); 35 36 public: Execute()37 virtual void Execute() 38 { 39 ExecuteJS(); 40 } 41 42 void Execute(const JSRef<JSObject>& jsParamsObject); 43 void Execute(const std::vector<std::string>& keys, const std::string& param); 44 void ExecuteNew(const std::vector<std::string>& keys, const std::string& param); 45 ExecuteJS(int argc)46 virtual JSRef<JSVal> ExecuteJS(int argc) 47 { 48 return ExecuteJS(argc, nullptr); 49 } ExecuteJS(JSRef<JSVal> * argv)50 virtual JSRef<JSVal> ExecuteJS(JSRef<JSVal>* argv) 51 { 52 return ExecuteJS(0, argv); 53 } ExecuteJS()54 virtual JSRef<JSVal> ExecuteJS() 55 { 56 return ExecuteJS(0, nullptr); 57 } 58 // Empty realization in JsFunctionBase ExecuteJS(int argc,JSRef<JSVal> * argv)59 virtual JSRef<JSVal> ExecuteJS(int argc, JSRef<JSVal>* argv) 60 { 61 JSRef<JSObject> eventInfo = JSRef<JSObject>::New(); 62 return JSRef<JSVal>::Cast(eventInfo); 63 } 64 65 protected: 66 JSWeak<JSVal> jsThis_; 67 68 private: 69 void ExecuteInternal(const std::unique_ptr<JsonValue>& value, const std::string& key, 70 const JSRef<JSObject>& eventInfo); 71 }; 72 73 class ACE_EXPORT JsFunction : public virtual JsFunctionBase { 74 DECLARE_ACE_TYPE(JsFunction, JsFunctionBase); 75 76 public: 77 explicit JsFunction(const JSRef<JSFunc>& jsFunction); 78 JsFunction(const JSRef<JSObject>& jsObject, const JSRef<JSFunc>& jsFunction); 79 ~JsFunction() override; 80 ExecuteJS(int argc)81 JSRef<JSVal> ExecuteJS(int argc) override 82 { 83 return ExecuteJS(argc, nullptr); 84 } ExecuteJS(JSRef<JSVal> * argv)85 JSRef<JSVal> ExecuteJS(JSRef<JSVal>* argv) override 86 { 87 return ExecuteJS(0, argv); 88 } ExecuteJS()89 JSRef<JSVal> ExecuteJS() override 90 { 91 return ExecuteJS(0, nullptr); 92 } 93 JSRef<JSVal> ExecuteJS(int argc, JSRef<JSVal>* argv) override; 94 95 protected: 96 JSRef<JSFunc> jsFunction_; 97 }; 98 99 class ACE_EXPORT JsWeakFunction : public virtual JsFunctionBase { 100 DECLARE_ACE_TYPE(JsWeakFunction, JsFunctionBase); 101 102 public: 103 explicit JsWeakFunction(const JSRef<JSFunc>& jsFunction); 104 JsWeakFunction(const JSRef<JSObject>& jsObject, const JSRef<JSFunc>& jsFunction); 105 ~JsWeakFunction() override = default; 106 ExecuteJS(int argc)107 JSRef<JSVal> ExecuteJS(int argc) override 108 { 109 return ExecuteJS(argc, nullptr); 110 } ExecuteJS(JSRef<JSVal> * argv)111 JSRef<JSVal> ExecuteJS(JSRef<JSVal>* argv) override 112 { 113 return ExecuteJS(0, argv); 114 } ExecuteJS()115 JSRef<JSVal> ExecuteJS() override 116 { 117 return ExecuteJS(0, nullptr); 118 } 119 JSRef<JSVal> ExecuteJS(int argc, JSRef<JSVal>* argv) override; 120 121 protected: 122 JSWeak<JSFunc> jsWeakFunction_; 123 }; 124 125 template<class T, int32_t ARGC = 0> 126 class ACE_EXPORT JsCitedEventFunction : public JsFunction { 127 DECLARE_ACE_TYPE(JsCitedEventFunction, JsFunction); 128 129 public: 130 using ParseFunc = std::function<JSRef<JSVal>(T&)>; 131 JsCitedEventFunction() = delete; JsCitedEventFunction(const JSRef<JSFunc> & jsFunction,ParseFunc parser)132 JsCitedEventFunction(const JSRef<JSFunc>& jsFunction, ParseFunc parser) 133 : JsFunction(JSRef<JSObject>(), jsFunction), parser_(parser) 134 {} 135 ~JsCitedEventFunction() override = default; 136 Execute()137 void Execute() override 138 { 139 JsFunction::ExecuteJS(); 140 } 141 Execute(T & eventInfo)142 void Execute(T& eventInfo) 143 { 144 JSRef<JSVal> param; 145 if (parser_) { 146 param = parser_(eventInfo); 147 } 148 JsFunction::ExecuteJS(ARGC, ¶m); 149 } 150 Execute(const std::string & val,T & eventInfo)151 void Execute(const std::string& val, T& eventInfo) 152 { 153 JSRef<JSVal> jsVal = JSRef<JSVal>::Make(ToJSValue(val)); 154 JSRef<JSVal> itemInfo; 155 if (parser_) { 156 itemInfo = parser_(eventInfo); 157 } 158 JSRef<JSVal> params[] = { jsVal, itemInfo }; 159 JsFunction::ExecuteJS(ARGC, params); 160 } 161 Execute(const std::u16string & val,T & eventInfo)162 void Execute(const std::u16string& val, T& eventInfo) 163 { 164 JSRef<JSVal> jsVal = JSRef<JSVal>::Make(ToJSValue(val)); 165 JSRef<JSVal> itemInfo; 166 if (parser_) { 167 itemInfo = parser_(eventInfo); 168 } 169 JSRef<JSVal> params[] = { jsVal, itemInfo }; 170 JsFunction::ExecuteJS(ARGC, params); 171 } 172 173 private: 174 ParseFunc parser_; 175 }; 176 177 template<class T, int32_t ARGC = 0> 178 class ACE_EXPORT JsCommonEventFunction : public JsFunction { 179 DECLARE_ACE_TYPE(JsCommonEventFunction, JsFunction); 180 181 public: 182 JsCommonEventFunction() = delete; JsCommonEventFunction(const JSRef<JSFunc> & jsFunction)183 JsCommonEventFunction(const JSRef<JSFunc>& jsFunction) 184 : JsFunction(JSRef<JSObject>(), jsFunction) 185 {} 186 ~JsCommonEventFunction() override = default; 187 Execute()188 void Execute() override 189 { 190 JsFunction::ExecuteJS(); 191 } 192 Execute(JSRef<JSVal> * argv)193 void Execute(JSRef<JSVal>* argv) 194 { 195 JsFunction::ExecuteJS(ARGC, argv); 196 } 197 }; 198 199 template<class T, int32_t ARGC = 0> 200 class ACE_EXPORT JsEventFunction : public JsFunction { 201 DECLARE_ACE_TYPE(JsEventFunction, JsFunction); 202 203 public: 204 using ParseFunc = std::function<JSRef<JSVal>(const T&)>; 205 JsEventFunction() = delete; JsEventFunction(const JSRef<JSFunc> & jsFunction,ParseFunc parser)206 JsEventFunction(const JSRef<JSFunc>& jsFunction, ParseFunc parser) 207 : JsFunction(JSRef<JSObject>(), jsFunction), parser_(parser) 208 {} 209 ~JsEventFunction() override = default; 210 Execute()211 void Execute() override 212 { 213 JsFunction::ExecuteJS(); 214 } 215 Execute(const T & eventInfo)216 void Execute(const T& eventInfo) 217 { 218 JSRef<JSVal> param; 219 if (parser_) { 220 param = parser_(eventInfo); 221 } 222 JsFunction::ExecuteJS(ARGC, ¶m); 223 } 224 ExecuteWithValue(const T & eventInfo)225 JSRef<JSVal> ExecuteWithValue(const T& eventInfo) 226 { 227 JSRef<JSVal> param; 228 if (parser_) { 229 param = parser_(eventInfo); 230 } 231 return JsFunction::ExecuteJS(ARGC, ¶m); 232 } 233 234 private: 235 ParseFunc parser_; 236 }; 237 238 JSRef<JSObject> CreateEventTargetObject(const BaseEventInfo& info); 239 240 } // namespace OHOS::Ace::Framework 241 242 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_FUNCTION_JS_FUNCTION_H 243