1 /* 2 * Copyright (c) 2022 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 NWEB_NAPI_WEBVIEW_CONTROLLER_H 17 #define NWEB_NAPI_WEBVIEW_CONTROLLER_H 18 19 #include <condition_variable> 20 #include <mutex> 21 22 #include "napi/native_api.h" 23 #include "napi/native_common.h" 24 #include "napi/native_node_api.h" 25 #include "uv.h" 26 #include "webview_controller.h" 27 28 namespace OHOS { 29 namespace NWeb { 30 const std::string WEBVIEW_CONTROLLER_CLASS_NAME = "WebviewController"; 31 const std::string WEB_MESSAGE_PORT_CLASS_NAME = "WebMessagePort"; 32 const std::string WEB_PORT_MSG_ENUM_NAME = "WebMessageType"; 33 const std::string WEB_EXT_MSG_CLASS_NAME = "WebMessageExt"; 34 const std::string WEB_HITTESTTYPE_V9_ENUM_NAME = "HitTestTypeV9"; 35 const std::string WEB_HITTESTTYPE_ENUM_NAME = "WebHitTestType"; 36 const std::string WEB_HISTORY_LIST_CLASS_NAME = "WebHistoryList"; 37 const std::string WEB_SECURE_DNS_MODE_ENUM_NAME = "SecureDnsMode"; 38 39 class NapiWebviewController { 40 public: NapiWebviewController()41 NapiWebviewController() {} 42 ~NapiWebviewController() = default; 43 44 static napi_value Init(napi_env env, napi_value exports); 45 46 private: 47 static napi_value JsConstructor(napi_env env, napi_callback_info info); 48 49 static napi_value InitializeWebEngine(napi_env env, napi_callback_info info); 50 51 static napi_value SetHttpDns(napi_env env, napi_callback_info info); 52 53 static napi_value SetWebDebuggingAccess(napi_env env, napi_callback_info info); 54 55 static napi_value InnerGetWebDebuggingAccess(napi_env env, napi_callback_info info); 56 57 static napi_value SetWebId(napi_env env, napi_callback_info info); 58 59 static napi_value InnerJsProxy(napi_env env, napi_callback_info info); 60 61 static napi_value InnerGetCustomeSchemeCmdLine(napi_env env, napi_callback_info info); 62 63 static napi_value AccessForward(napi_env env, napi_callback_info info); 64 65 static napi_value AccessBackward(napi_env env, napi_callback_info info); 66 67 static napi_value Forward(napi_env env, napi_callback_info info); 68 69 static napi_value Backward(napi_env env, napi_callback_info info); 70 71 static napi_value AccessStep(napi_env env, napi_callback_info info); 72 73 static napi_value ClearHistory(napi_env env, napi_callback_info info); 74 75 static napi_value OnActive(napi_env env, napi_callback_info info); 76 77 static napi_value OnInactive(napi_env env, napi_callback_info info); 78 79 static napi_value Refresh(napi_env env, napi_callback_info info); 80 81 static napi_value ZoomIn(napi_env env, napi_callback_info info); 82 83 static napi_value ZoomOut(napi_env env, napi_callback_info info); 84 85 static napi_value GetWebId(napi_env env, napi_callback_info info); 86 87 static napi_value GetUserAgent(napi_env env, napi_callback_info info); 88 89 static napi_value GetCustomUserAgent(napi_env env, napi_callback_info info); 90 91 static napi_value SetCustomUserAgent(napi_env env, napi_callback_info info); 92 93 static napi_value GetTitle(napi_env env, napi_callback_info info); 94 95 static napi_value GetPageHeight(napi_env env, napi_callback_info info); 96 97 static napi_value BackOrForward(napi_env env, napi_callback_info info); 98 99 static napi_value StoreWebArchive(napi_env env, napi_callback_info info); 100 101 static napi_value StoreWebArchiveInternal(napi_env env, napi_callback_info info, 102 const std::string &baseName, bool autoName); 103 104 static napi_value CreateWebMessagePorts(napi_env env, napi_callback_info info); 105 106 static napi_value PostMessage(napi_env env, napi_callback_info info); 107 108 static napi_value GetHitTestValue(napi_env env, napi_callback_info info); 109 110 static napi_value RequestFocus(napi_env env, napi_callback_info info); 111 112 static napi_value LoadUrl(napi_env env, napi_callback_info info); 113 114 static napi_value LoadUrlWithHttpHeaders(napi_env env, napi_callback_info info, const std::string& url, 115 const napi_value* argv, WebviewController* webviewController); 116 117 static napi_value LoadData(napi_env env, napi_callback_info info); 118 119 static napi_value GetHitTest(napi_env env, napi_callback_info info); 120 121 static napi_value ClearMatches(napi_env env, napi_callback_info info); 122 123 static napi_value SearchNext(napi_env env, napi_callback_info info); 124 125 static napi_value SearchAllAsync(napi_env env, napi_callback_info info); 126 127 static napi_value ClearSslCache(napi_env env, napi_callback_info info); 128 129 static napi_value ClearClientAuthenticationCache(napi_env env, napi_callback_info info); 130 131 static napi_value Stop(napi_env env, napi_callback_info info); 132 133 static napi_value Zoom(napi_env env, napi_callback_info info); 134 135 static napi_value RegisterJavaScriptProxy(napi_env env, napi_callback_info info); 136 137 static napi_value DeleteJavaScriptRegister(napi_env env, napi_callback_info info); 138 139 static napi_value RunJavaScript(napi_env env, napi_callback_info info); 140 141 static napi_value RunJavaScriptExt(napi_env env, napi_callback_info info); 142 143 static napi_value RunJS(napi_env env, napi_callback_info info, bool extention); 144 145 static napi_value RunJavaScriptInternal(napi_env env, napi_callback_info info, 146 const std::string &script, bool extention); 147 148 static napi_value GetUrl(napi_env env, napi_callback_info info); 149 150 static napi_value GetOriginalUrl(napi_env env, napi_callback_info info); 151 152 static napi_value SetNetworkAvailable(napi_env env, napi_callback_info info); 153 154 static napi_value InnerGetWebId(napi_env env, napi_callback_info info); 155 156 static napi_value HasImage(napi_env env, napi_callback_info info); 157 158 static napi_value HasImageInternal(napi_env env, napi_callback_info info); 159 160 static napi_value RemoveCache(napi_env env, napi_callback_info info); 161 162 static napi_value getBackForwardEntries(napi_env env, napi_callback_info info); 163 164 static napi_value GetFavicon(napi_env env, napi_callback_info info); 165 166 static napi_value SerializeWebState(napi_env env, napi_callback_info info); 167 168 static napi_value RestoreWebState(napi_env env, napi_callback_info info); 169 170 static napi_value ScrollPageDown(napi_env env, napi_callback_info info); 171 172 static napi_value ScrollPageUp(napi_env env, napi_callback_info info); 173 174 static napi_value ScrollTo(napi_env env, napi_callback_info info); 175 176 static napi_value ScrollBy(napi_env env, napi_callback_info info); 177 178 static napi_value SlideScroll(napi_env env, napi_callback_info info); 179 180 static napi_value CustomizeSchemes(napi_env env, napi_callback_info info); 181 182 static napi_value InnerSetHapPath(napi_env env, napi_callback_info info); 183 184 static napi_value InnerGetCertificate(napi_env env, napi_callback_info info); 185 186 static napi_value SetAudioMuted(napi_env env, napi_callback_info info); 187 188 static napi_value InnerGetThisVar(napi_env env, napi_callback_info info); 189 190 static napi_value PrefetchPage(napi_env env, napi_callback_info info); 191 192 static napi_value PrefetchPageWithHttpHeaders(napi_env env, napi_callback_info info, std::string& url, 193 const napi_value* argv, WebviewController* webviewController); 194 195 static napi_value PrepareForPageLoad(napi_env env, napi_callback_info info); 196 }; 197 198 class NWebValueCallbackImpl : public OHOS::NWeb::NWebValueCallback<std::shared_ptr<NWebMessage>> { 199 public: NWebValueCallbackImpl(napi_env env,napi_ref callback,bool extention)200 NWebValueCallbackImpl(napi_env env, napi_ref callback, bool extention) 201 : env_(env), callback_(callback), extention_(extention) 202 {} 203 ~NWebValueCallbackImpl(); 204 void OnReceiveValue(std::shared_ptr<NWebMessage> result) override; 205 206 private: 207 napi_env env_; 208 napi_ref callback_; 209 bool extention_; 210 static void UvWebMessageOnReceiveValueCallback(uv_work_t *work, int status); 211 }; 212 213 class NapiWebMessageExt { 214 public: 215 NapiWebMessageExt() = default; 216 ~NapiWebMessageExt() = default; 217 218 static napi_value JsConstructor(napi_env env, napi_callback_info info); 219 static napi_value GetType(napi_env env, napi_callback_info info); 220 static napi_value GetString(napi_env env, napi_callback_info info); 221 static napi_value GetNumber(napi_env env, napi_callback_info info); 222 static napi_value GetBoolean(napi_env env, napi_callback_info info); 223 static napi_value GetArrayBuffer(napi_env env, napi_callback_info info); 224 static napi_value GetArray(napi_env env, napi_callback_info info); 225 static napi_value GetError(napi_env env, napi_callback_info info); 226 static napi_value SetType(napi_env env, napi_callback_info info); 227 static napi_value SetString(napi_env env, napi_callback_info info); 228 static napi_value SetNumber(napi_env env, napi_callback_info info); 229 static napi_value SetBoolean(napi_env env, napi_callback_info info); 230 static napi_value SetArrayBuffer(napi_env env, napi_callback_info info); 231 static napi_value SetArray(napi_env env, napi_callback_info info); 232 static napi_value SetError(napi_env env, napi_callback_info info); 233 }; 234 235 class NapiWebMessagePort { 236 public: 237 NapiWebMessagePort() = default; 238 ~NapiWebMessagePort() = default; 239 240 struct WebMsgPortParam { 241 bool extention_; 242 napi_env env_; 243 napi_ref callback_; 244 std::shared_ptr<NWebMessage> msg_; 245 std::mutex mutex_; 246 bool ready_ = false; 247 std::condition_variable condition_; 248 }; 249 250 static napi_value JsConstructor(napi_env env, napi_callback_info info); 251 252 static napi_value Close(napi_env env, napi_callback_info info); 253 254 static napi_value PostMessageEvent(napi_env env, napi_callback_info info); 255 256 static napi_value OnMessageEvent(napi_env env, napi_callback_info info); 257 258 static napi_value PostMessageEventExt(napi_env env, napi_callback_info info); 259 260 static napi_value OnMessageEventExt(napi_env env, napi_callback_info info); 261 }; 262 263 class NapiWebHistoryList { 264 public: 265 NapiWebHistoryList() = default; 266 ~NapiWebHistoryList() = default; 267 268 static napi_value JsConstructor(napi_env env, napi_callback_info info); 269 270 static napi_value GetItem(napi_env env, napi_callback_info info); 271 272 private: 273 static napi_value GetFavicon(napi_env env, std::shared_ptr<NWebHistoryItem> item); 274 }; 275 } // namespace NWeb 276 } // namespace OHOS 277 278 #endif // NWEB_NAPI_WEBVIEW_CONTROLLER_H 279