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