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 <atomic> 20 #include <condition_variable> 21 #include <mutex> 22 23 #include "napi/native_api.h" 24 #include "napi/native_common.h" 25 #include "napi/native_node_api.h" 26 #include "uv.h" 27 #include "webview_controller.h" 28 29 namespace OHOS { 30 namespace NWeb { 31 const std::string WEBVIEW_CONTROLLER_CLASS_NAME = "WebviewController"; 32 const std::string WEB_MESSAGE_PORT_CLASS_NAME = "WebMessagePort"; 33 const std::string WEB_PORT_MSG_ENUM_NAME = "WebMessageType"; 34 const std::string WEB_EXT_MSG_CLASS_NAME = "WebMessageExt"; 35 const std::string WEB_HITTESTTYPE_V9_ENUM_NAME = "HitTestTypeV9"; 36 const std::string WEB_HITTESTTYPE_ENUM_NAME = "WebHitTestType"; 37 const std::string WEB_HISTORY_LIST_CLASS_NAME = "WebHistoryList"; 38 const std::string WEB_SECURE_DNS_MODE_ENUM_NAME = "SecureDnsMode"; 39 const std::string WEB_PRINT_DOCUMENT_CLASS_NAME = "WebPrintDocument"; 40 const std::string WEB_SECURITY_LEVEL_ENUM_NAME = "WebSecurityLevel"; 41 const std::string WEB_RENDER_PROCESS_MODE_ENUM_NAME = "RenderProcessMode"; 42 const std::string OFFLINE_RESOURCE_TYPE_ENUM_NAME = "OfflineResourceType"; 43 const std::string WEB_SCROLL_TYPE_ENUM_NAME = "ScrollType"; 44 45 struct Scheme { 46 std::string name; 47 bool isSupportCORS; 48 bool isSupportFetch; 49 bool isStandard; 50 bool isLocal; 51 bool isDisplayIsolated; 52 bool isSecure; 53 bool isCspBypassing; 54 bool isCodeCacheSupported; 55 int32_t option = 0; 56 }; 57 58 struct OfflineResourceValue { 59 napi_value urlList; 60 napi_value resource; 61 napi_value responseHeaders; 62 napi_value type; 63 }; 64 65 class NapiWebviewController { 66 public: NapiWebviewController()67 NapiWebviewController() {} 68 ~NapiWebviewController() = default; 69 70 static napi_value Init(napi_env env, napi_value exports); 71 72 private: 73 static napi_value JsConstructor(napi_env env, napi_callback_info info); 74 75 static napi_value InitializeWebEngine(napi_env env, napi_callback_info info); 76 77 static napi_value SetHttpDns(napi_env env, napi_callback_info info); 78 79 static napi_value SetWebDebuggingAccess(napi_env env, napi_callback_info info); 80 81 static napi_value EnableSafeBrowsing(napi_env env, napi_callback_info info); 82 83 static napi_value IsSafeBrowsingEnabled(napi_env env, napi_callback_info info); 84 85 static napi_value InnerGetWebDebuggingAccess(napi_env env, napi_callback_info info); 86 87 static napi_value SetWebId(napi_env env, napi_callback_info info); 88 89 static napi_value InnerJsProxy(napi_env env, napi_callback_info info); 90 91 static napi_value InnerGetCustomeSchemeCmdLine(napi_env env, napi_callback_info info); 92 93 static napi_value AccessForward(napi_env env, napi_callback_info info); 94 95 static napi_value AccessBackward(napi_env env, napi_callback_info info); 96 97 static napi_value Forward(napi_env env, napi_callback_info info); 98 99 static napi_value Backward(napi_env env, napi_callback_info info); 100 101 static napi_value AccessStep(napi_env env, napi_callback_info info); 102 103 static napi_value ClearHistory(napi_env env, napi_callback_info info); 104 105 static napi_value OnActive(napi_env env, napi_callback_info info); 106 107 static napi_value OnInactive(napi_env env, napi_callback_info info); 108 109 static napi_value Refresh(napi_env env, napi_callback_info info); 110 111 static napi_value ZoomIn(napi_env env, napi_callback_info info); 112 113 static napi_value ZoomOut(napi_env env, napi_callback_info info); 114 115 static napi_value GetWebId(napi_env env, napi_callback_info info); 116 117 static napi_value GetUserAgent(napi_env env, napi_callback_info info); 118 119 static napi_value GetCustomUserAgent(napi_env env, napi_callback_info info); 120 121 static napi_value SetCustomUserAgent(napi_env env, napi_callback_info info); 122 123 static napi_value GetTitle(napi_env env, napi_callback_info info); 124 125 static napi_value GetPageHeight(napi_env env, napi_callback_info info); 126 127 static napi_value BackOrForward(napi_env env, napi_callback_info info); 128 129 static napi_value StoreWebArchive(napi_env env, napi_callback_info info); 130 131 static napi_value StoreWebArchiveInternal(napi_env env, napi_callback_info info, 132 const std::string &baseName, bool autoName); 133 134 static napi_value CreateWebMessagePorts(napi_env env, napi_callback_info info); 135 136 static napi_value PostMessage(napi_env env, napi_callback_info info); 137 138 static napi_value GetHitTestValue(napi_env env, napi_callback_info info); 139 140 static napi_value RequestFocus(napi_env env, napi_callback_info info); 141 142 static napi_value LoadUrl(napi_env env, napi_callback_info info); 143 144 static napi_value LoadUrlWithHttpHeaders(napi_env env, napi_callback_info info, const std::string& url, 145 const napi_value* argv, WebviewController* webviewController); 146 147 static napi_value LoadData(napi_env env, napi_callback_info info); 148 149 static napi_value GetHitTest(napi_env env, napi_callback_info info); 150 151 static napi_value ClearMatches(napi_env env, napi_callback_info info); 152 153 static napi_value SearchNext(napi_env env, napi_callback_info info); 154 155 static napi_value SearchAllAsync(napi_env env, napi_callback_info info); 156 157 static napi_value ClearSslCache(napi_env env, napi_callback_info info); 158 159 static napi_value ClearClientAuthenticationCache(napi_env env, napi_callback_info info); 160 161 static napi_value Stop(napi_env env, napi_callback_info info); 162 163 static napi_value Zoom(napi_env env, napi_callback_info info); 164 165 static napi_value InnerCompleteWindowNew(napi_env env, napi_callback_info info); 166 167 static napi_value RegisterJavaScriptProxy(napi_env env, napi_callback_info info); 168 169 static napi_value DeleteJavaScriptRegister(napi_env env, napi_callback_info info); 170 171 static napi_value RunJavaScript(napi_env env, napi_callback_info info); 172 173 static napi_value RunJavaScriptExt(napi_env env, napi_callback_info info); 174 175 static napi_value RunJS(napi_env env, napi_callback_info info, bool extention); 176 177 static napi_value RunJavaScriptInternal(napi_env env, napi_callback_info info, 178 const std::string &script, bool extention); 179 180 static ErrCode ConstructFlowbuf(napi_env env, napi_value argv, int& fd, size_t& scriptLength); 181 182 static napi_value RunJSBackToOriginal(napi_env env, napi_callback_info info, 183 bool extention, napi_value argv, napi_value result); 184 185 static napi_value RunJavaScriptInternalExt(napi_env env, napi_callback_info info, bool extention); 186 187 static napi_value TerminateRenderProcess(napi_env env, napi_callback_info info); 188 189 static napi_value GetUrl(napi_env env, napi_callback_info info); 190 191 static napi_value GetOriginalUrl(napi_env env, napi_callback_info info); 192 193 static napi_value SetNetworkAvailable(napi_env env, napi_callback_info info); 194 195 static napi_value InnerGetWebId(napi_env env, napi_callback_info info); 196 197 static napi_value HasImage(napi_env env, napi_callback_info info); 198 199 static napi_value HasImageInternal(napi_env env, napi_callback_info info); 200 201 static napi_value RemoveCache(napi_env env, napi_callback_info info); 202 203 static napi_value getBackForwardEntries(napi_env env, napi_callback_info info); 204 205 static napi_value GetFavicon(napi_env env, napi_callback_info info); 206 207 static napi_value SerializeWebState(napi_env env, napi_callback_info info); 208 209 static napi_value RestoreWebState(napi_env env, napi_callback_info info); 210 211 static napi_value ScrollPageDown(napi_env env, napi_callback_info info); 212 213 static napi_value ScrollPageUp(napi_env env, napi_callback_info info); 214 215 static napi_value ScrollTo(napi_env env, napi_callback_info info); 216 217 static napi_value ScrollBy(napi_env env, napi_callback_info info); 218 219 static napi_value SlideScroll(napi_env env, napi_callback_info info); 220 221 static napi_value SetScrollable(napi_env env, napi_callback_info info); 222 223 static napi_value GetScrollable(napi_env env, napi_callback_info info); 224 225 static napi_value CustomizeSchemes(napi_env env, napi_callback_info info); 226 227 static napi_value InnerSetHapPath(napi_env env, napi_callback_info info); 228 229 static napi_value InnerGetCertificate(napi_env env, napi_callback_info info); 230 231 static napi_value SetAudioMuted(napi_env env, napi_callback_info info); 232 233 static napi_value InnerGetThisVar(napi_env env, napi_callback_info info); 234 235 static napi_value PrefetchPage(napi_env env, napi_callback_info info); 236 237 static napi_value PrefetchPageWithHttpHeaders(napi_env env, napi_callback_info info, std::string& url, 238 const napi_value* argv, WebviewController* webviewController); 239 240 static napi_value PrepareForPageLoad(napi_env env, napi_callback_info info); 241 242 static napi_value CreateWebPrintDocumentAdapter(napi_env env, napi_callback_info info); 243 244 static napi_value PostUrl(napi_env env, napi_callback_info info); 245 246 static napi_value SetDownloadDelegate(napi_env env, napi_callback_info info); 247 248 static napi_value StartDownload(napi_env env, napi_callback_info info); 249 250 static napi_value SetConnectionTimeout(napi_env env, napi_callback_info info); 251 252 static napi_value GetSecurityLevel(napi_env env, napi_callback_info info); 253 254 static napi_value IsIncognitoMode(napi_env env, napi_callback_info info); 255 256 static napi_value SetPrintBackground(napi_env env, napi_callback_info info); 257 258 static napi_value GetPrintBackground(napi_env env, napi_callback_info info); 259 260 static napi_value SetWebSchemeHandler(napi_env env, napi_callback_info info); 261 262 static napi_value ClearWebSchemeHandler(napi_env env, napi_callback_info info); 263 264 static napi_value SetServiceWorkerWebSchemeHandler( 265 napi_env env, napi_callback_info info); 266 267 static napi_value ClearServiceWorkerWebSchemeHandler( 268 napi_env env, napi_callback_info info); 269 270 static napi_value EnableIntelligentTrackingPrevention( 271 napi_env env, napi_callback_info info); 272 273 static napi_value IsIntelligentTrackingPreventionEnabled( 274 napi_env env, napi_callback_info info); 275 276 static napi_value AddIntelligentTrackingPreventionBypassingList( 277 napi_env env, napi_callback_info info); 278 279 static napi_value RemoveIntelligentTrackingPreventionBypassingList( 280 napi_env env, napi_callback_info info); 281 282 static napi_value ClearIntelligentTrackingPreventionBypassingList( 283 napi_env env, napi_callback_info info); 284 285 static napi_value GetLastJavascriptProxyCallingFrameUrl(napi_env env, napi_callback_info info); 286 287 static napi_value PauseAllTimers(napi_env env, napi_callback_info info); 288 289 static napi_value ResumeAllTimers(napi_env env, napi_callback_info info); 290 291 static napi_value StartCamera(napi_env env, napi_callback_info info); 292 293 static napi_value StopCamera(napi_env env, napi_callback_info info); 294 295 static napi_value CloseCamera(napi_env env, napi_callback_info info); 296 297 static napi_value CloseAllMediaPresentations(napi_env env, napi_callback_info info); 298 299 static napi_value StopAllMedia(napi_env env, napi_callback_info info); 300 301 static napi_value ResumeAllMedia(napi_env env, napi_callback_info info); 302 303 static napi_value PauseAllMedia(napi_env env, napi_callback_info info); 304 305 static napi_value GetMediaPlaybackState(napi_env env, napi_callback_info info); 306 307 static napi_value PrefetchResource(napi_env env, napi_callback_info info); 308 309 static napi_value ClearPrefetchedResource(napi_env env, napi_callback_info info); 310 311 static napi_value OnCreateNativeMediaPlayer(napi_env env, napi_callback_info info); 312 313 static napi_value SetRenderProcessMode(napi_env env, napi_callback_info info); 314 315 static napi_value GetRenderProcessMode(napi_env env, napi_callback_info info); 316 317 static napi_value PrecompileJavaScript(napi_env env, napi_callback_info info); 318 319 static napi_value InjectOfflineResources(napi_env env, napi_callback_info info); 320 321 static void AddResourcesToMemoryCache(napi_env env, 322 napi_callback_info info, 323 napi_value& resourcesList); 324 325 static void AddResourceItemToMemoryCache(napi_env env, 326 napi_callback_info info, 327 OfflineResourceValue resourceValue); 328 329 static napi_value SetHostIP(napi_env env, napi_callback_info info); 330 331 static napi_value ClearHostIP(napi_env env, napi_callback_info info); 332 333 static napi_value WarmupServiceWorker(napi_env env, napi_callback_info info); 334 335 static napi_value GetSurfaceId(napi_env env, napi_callback_info info); 336 337 static napi_value EnableWholeWebPageDrawing(napi_env env, napi_callback_info info); 338 339 static napi_value EnableAdsBlock(napi_env env, napi_callback_info info); 340 341 static napi_value IsAdsBlockEnabled(napi_env env, napi_callback_info info); 342 343 static napi_value IsAdsBlockEnabledForCurPage(napi_env env, napi_callback_info info); 344 345 static napi_value WebPageSnapshot(napi_env env, napi_callback_info info); 346 347 static napi_value SetUrlTrustList(napi_env env, napi_callback_info info); 348 349 static napi_value UpdateInstanceId(napi_env env, napi_callback_info info); 350 351 static napi_value SetPathAllowingUniversalAccess(napi_env env, napi_callback_info info); 352 353 static napi_value EnableBackForwardCache(napi_env env, napi_callback_info info); 354 355 static napi_value SetBackForwardCacheOptions(napi_env env, napi_callback_info info); 356 357 static napi_value ScrollByWithResult(napi_env env, napi_callback_info info); 358 359 static napi_value GetScrollOffset(napi_env env, napi_callback_info info); 360 361 static int32_t maxFdNum_; 362 static std::atomic<int32_t> usedFd_; 363 }; 364 365 class NWebValueCallbackImpl : public NWebMessageValueCallback { 366 public: NWebValueCallbackImpl(napi_env env,napi_ref callback,bool extention)367 NWebValueCallbackImpl(napi_env env, napi_ref callback, bool extention) 368 : env_(env), callback_(callback), extention_(extention) 369 {} 370 ~NWebValueCallbackImpl(); 371 void OnReceiveValue(std::shared_ptr<NWebMessage> result) override; 372 373 private: 374 napi_env env_; 375 napi_ref callback_; 376 bool extention_; 377 static void UvWebMessageOnReceiveValueCallback(uv_work_t *work, int status); 378 }; 379 380 class NapiWebMessageExt { 381 public: 382 NapiWebMessageExt() = default; 383 ~NapiWebMessageExt() = default; 384 385 static napi_value JsConstructor(napi_env env, napi_callback_info info); 386 static napi_value GetType(napi_env env, napi_callback_info info); 387 static napi_value GetString(napi_env env, napi_callback_info info); 388 static napi_value GetNumber(napi_env env, napi_callback_info info); 389 static napi_value GetBoolean(napi_env env, napi_callback_info info); 390 static napi_value GetArrayBuffer(napi_env env, napi_callback_info info); 391 static napi_value GetArray(napi_env env, napi_callback_info info); 392 static napi_value GetError(napi_env env, napi_callback_info info); 393 static napi_value SetType(napi_env env, napi_callback_info info); 394 static napi_value SetString(napi_env env, napi_callback_info info); 395 static napi_value SetNumber(napi_env env, napi_callback_info info); 396 static napi_value SetBoolean(napi_env env, napi_callback_info info); 397 static napi_value SetArrayBuffer(napi_env env, napi_callback_info info); 398 static napi_value SetArray(napi_env env, napi_callback_info info); 399 static napi_value SetError(napi_env env, napi_callback_info info); 400 }; 401 402 class NapiWebMessagePort { 403 public: 404 NapiWebMessagePort() = default; 405 ~NapiWebMessagePort() = default; 406 407 struct WebMsgPortParam { 408 bool extention_; 409 napi_env env_; 410 napi_ref callback_; 411 std::shared_ptr<NWebMessage> msg_; 412 std::mutex mutex_; 413 bool ready_ = false; 414 std::condition_variable condition_; 415 }; 416 417 static napi_value JsConstructor(napi_env env, napi_callback_info info); 418 419 static napi_value Close(napi_env env, napi_callback_info info); 420 421 static napi_value PostMessageEvent(napi_env env, napi_callback_info info); 422 423 static napi_value OnMessageEvent(napi_env env, napi_callback_info info); 424 425 static napi_value PostMessageEventExt(napi_env env, napi_callback_info info); 426 427 static napi_value OnMessageEventExt(napi_env env, napi_callback_info info); 428 }; 429 430 class NapiWebHistoryList { 431 public: 432 NapiWebHistoryList() = default; 433 ~NapiWebHistoryList() = default; 434 435 static napi_value JsConstructor(napi_env env, napi_callback_info info); 436 437 static napi_value GetItem(napi_env env, napi_callback_info info); 438 439 private: 440 static napi_value GetFavicon(napi_env env, std::shared_ptr<NWebHistoryItem> item); 441 }; 442 443 class NapiWebPrintDocument { 444 public: 445 NapiWebPrintDocument() = default; 446 ~NapiWebPrintDocument() = default; 447 448 static napi_value JsConstructor(napi_env env, napi_callback_info info); 449 450 static napi_value OnStartLayoutWrite(napi_env env, napi_callback_info info); 451 452 static napi_value OnJobStateChanged(napi_env env, napi_callback_info info); 453 }; 454 } // namespace NWeb 455 } // namespace OHOS 456 457 #endif // NWEB_NAPI_WEBVIEW_CONTROLLER_H 458