1 /*
2 * Copyright (c) 2021-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 #include "core/components/web/resource/web_delegate.h"
17
18 #include <cctype>
19 #include <cfloat>
20 #include <iomanip>
21 #include <optional>
22 #include <sstream>
23 #include <queue>
24 #include <string>
25
26 #include "event_handler.h"
27
28 #include "adapter/ohos/entrance/ace_container.h"
29 #include "adapter/ohos/entrance/utils.h"
30 #include "arkweb_net_error_list.h"
31 #include "base/json/json_util.h"
32 #include "base/log/ace_trace.h"
33 #include "base/log/log.h"
34 #include "base/memory/referenced.h"
35 #include "base/ressched/ressched_report.h"
36 #include "base/utils/utils.h"
37 #include "base/perfmonitor/perf_monitor.h"
38 #include "core/accessibility/accessibility_manager.h"
39 #include "core/components/container_modal/container_modal_constants.h"
40 #include "core/components/web/render_web.h"
41 #include "adapter/ohos/capability/html/span_to_html.h"
42 #ifdef ENABLE_ROSEN_BACKEND
43 #include "core/components_ng/render/adapter/rosen_render_context.h"
44 #endif
45 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h"
46 #ifdef OHOS_STANDARD_SYSTEM
47 #include "application_env.h"
48 #include "nweb_adapter_helper.h"
49 #include "nweb_handler.h"
50 #include "nweb_helper.h"
51 #include "parameters.h"
52 #include "screen_manager/screen_types.h"
53 #include "system_ability_definition.h"
54 #include "unicode/ucnv.h"
55 #include "transaction/rs_interfaces.h"
56 #include "webview_value.h"
57 #include "web_configuration_observer.h"
58 #include "web_javascript_execute_callback.h"
59 #include "web_javascript_result_callback.h"
60
61 #include "core/components_ng/base/ui_node.h"
62 #include "frameworks/base/utils/system_properties.h"
63 #endif
64
65 #include "core/common/container.h"
66 #include "base/include/ark_web_errno.h"
67
68 namespace OHOS::Ace {
69
70 namespace {
71
72 constexpr char WEB_METHOD_ROUTER_BACK[] = "routerBack";
73 constexpr char WEB_METHOD_UPDATEURL[] = "updateUrl";
74 constexpr char WEB_METHOD_CHANGE_PAGE_URL[] = "changePageUrl";
75 constexpr char WEB_METHOD_PAGE_PATH_INVALID[] = "pagePathInvalid";
76 constexpr char WEB_EVENT_PAGESTART[] = "onPageStarted";
77 constexpr char WEB_EVENT_PAGEFINISH[] = "onPageFinished";
78 constexpr char WEB_EVENT_PAGEERROR[] = "onPageError";
79 constexpr char WEB_EVENT_ONMESSAGE[] = "onMessage";
80 constexpr char WEB_EVENT_ROUTERPUSH[] = "routerPush";
81 constexpr char WEB_EVENT_LOADSTART[] = "OnLoadStarted";
82 constexpr char WEB_EVENT_LOADFINISH[] = "OnLoadFinished";
83
84 constexpr char WEB_CREATE[] = "web";
85 constexpr char NTC_PARAM_WEB[] = "web";
86 constexpr char NTC_PARAM_WIDTH[] = "width";
87 constexpr char NTC_PARAM_HEIGHT[] = "height";
88 constexpr char NTC_PARAM_LEFT[] = "left";
89 constexpr char NTC_PARAM_TOP[] = "top";
90 constexpr char NTC_ERROR[] = "create error";
91 constexpr char NTC_PARAM_SRC[] = "src";
92 constexpr char NTC_PARAM_ERROR_CODE[] = "errorCode";
93 constexpr char NTC_PARAM_URL[] = "url";
94 constexpr char NTC_PARAM_PAGE_URL[] = "pageUrl";
95 constexpr char NTC_PARAM_PAGE_INVALID[] = "pageInvalid";
96 constexpr char NTC_PARAM_DESCRIPTION[] = "description";
97 constexpr char WEB_ERROR_CODE_CREATEFAIL[] = "error-web-delegate-000001";
98 constexpr char WEB_ERROR_MSG_CREATEFAIL[] = "create web_delegate failed.";
99
100 const std::string RESOURCE_VIDEO_CAPTURE = "TYPE_VIDEO_CAPTURE";
101 const std::string RESOURCE_AUDIO_CAPTURE = "TYPE_AUDIO_CAPTURE";
102 const std::string RESOURCE_PROTECTED_MEDIA_ID = "TYPE_PROTECTED_MEDIA_ID";
103 const std::string RESOURCE_MIDI_SYSEX = "TYPE_MIDI_SYSEX";
104 const std::string RESOURCE_CLIPBOARD_READ_WRITE = "TYPE_CLIPBOARD_READ_WRITE";
105 const std::string RESOURCE_SENSOR = "TYPE_SENSOR";
106 const std::string DEFAULT_CANONICAL_ENCODING_NAME = "UTF-8";
107 constexpr uint32_t DESTRUCT_DELAY_MILLISECONDS = 1000;
108
109 constexpr uint32_t DRAG_DELAY_MILLISECONDS = 300;
110 constexpr uint32_t ACCESSIBILITY_DELAY_MILLISECONDS = 100;
111 constexpr uint32_t DELAY_MILLISECONDS_1000 = 1000;
112 constexpr uint32_t NO_NATIVE_FINGER_TYPE = 100;
113 constexpr uint32_t ACCESSIBILITY_PAGE_CHANGE_DELAY_MILLISECONDS = 100;
114 const std::string DEFAULT_NATIVE_EMBED_ID = "0";
115
116 const std::vector<std::string> CANONICALENCODINGNAMES = {
117 "Big5", "EUC-JP", "EUC-KR", "GB18030",
118 "GBK", "IBM866", "ISO-2022-JP", "ISO-8859-10",
119 "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16",
120 "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4",
121 "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8",
122 "ISO-8859-8-I", "KOI8-R", "KOI8-U", "macintosh",
123 "Shift_JIS", "UTF-8", "windows-1250", "windows-1251",
124 "windows-1252", "windows-1253", "windows-1254", "windows-1255",
125 "windows-1256", "windows-1257", "windows-1258", "windows-874" };
126
127 #define VISIBLERATIO_LENGTH 4
128 #define VISIBLERATIO_FLOAT_TO_INT 100
129
IsDeviceTabletOr2in1()130 static bool IsDeviceTabletOr2in1()
131 {
132 return OHOS::system::GetDeviceType() == "tablet" || OHOS::system::GetDeviceType() == "2in1";
133 }
134
GetWebOptimizationValue()135 static bool GetWebOptimizationValue()
136 {
137 return OHOS::system::GetBoolParameter("web.optimization", true);
138 }
139
GetPixelFormat(NG::TransImageColorType colorType)140 Media::PixelFormat GetPixelFormat(NG::TransImageColorType colorType)
141 {
142 switch (colorType) {
143 case NG::TransImageColorType::COLOR_TYPE_UNKNOWN:
144 return Media::PixelFormat::UNKNOWN;
145 case NG::TransImageColorType::COLOR_TYPE_RGBA_8888:
146 return Media::PixelFormat::RGBA_8888;
147 case NG::TransImageColorType::COLOR_TYPE_BGRA_8888:
148 return Media::PixelFormat::BGRA_8888;
149 default:
150 return Media::PixelFormat::UNKNOWN;
151 }
152 }
153
GetAlphaType(NG::TransImageAlphaType alphaType)154 Media::AlphaType GetAlphaType(NG::TransImageAlphaType alphaType)
155 {
156 switch (alphaType) {
157 case NG::TransImageAlphaType::ALPHA_TYPE_UNKNOWN:
158 return Media::AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN;
159 case NG::TransImageAlphaType::ALPHA_TYPE_OPAQUE:
160 return Media::AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
161 case NG::TransImageAlphaType::ALPHA_TYPE_PREMULTIPLIED:
162 return Media::AlphaType::IMAGE_ALPHA_TYPE_PREMUL;
163 case NG::TransImageAlphaType::ALPHA_TYPE_POSTMULTIPLIED:
164 return Media::AlphaType::IMAGE_ALPHA_TYPE_UNPREMUL;
165 default:
166 return Media::AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN;
167 }
168 }
169 } // namespace
170
171 #define EGLCONFIG_VERSION 3
172
SetPortHandle(std::string & handle)173 void WebMessagePortOhos::SetPortHandle(std::string& handle)
174 {
175 handle_ = handle;
176 }
177
GetPortHandle()178 std::string WebMessagePortOhos::GetPortHandle()
179 {
180 return handle_;
181 }
182
Close()183 void WebMessagePortOhos::Close()
184 {
185 auto delegate = webDelegate_.Upgrade();
186 if (!delegate) {
187 return;
188 }
189 delegate->ClosePort(handle_);
190 }
191
PostMessage(std::string & data)192 void WebMessagePortOhos::PostMessage(std::string& data)
193 {
194 auto delegate = webDelegate_.Upgrade();
195 if (!delegate) {
196 return;
197 }
198 delegate->PostPortMessage(handle_, data);
199 }
200
SetWebMessageCallback(std::function<void (const std::string &)> && callback)201 void WebMessagePortOhos::SetWebMessageCallback(std::function<void(const std::string&)>&& callback)
202 {
203 auto delegate = webDelegate_.Upgrade();
204 if (!delegate) {
205 return;
206 }
207 delegate->SetPortMessageCallback(handle_, std::move(callback));
208 }
209
GetLineNumber()210 int ConsoleLogOhos::GetLineNumber()
211 {
212 if (message_) {
213 return message_->LineNumer();
214 }
215 return -1;
216 }
217
GetLog()218 std::string ConsoleLogOhos::GetLog()
219 {
220 if (message_) {
221 return message_->Log();
222 }
223 return "";
224 }
225
GetLogLevel()226 int ConsoleLogOhos::GetLogLevel()
227 {
228 if (message_) {
229 return message_->LogLevel();
230 }
231 return -1;
232 }
233
GetSourceId()234 std::string ConsoleLogOhos::GetSourceId()
235 {
236 if (message_) {
237 return message_->SourceId();
238 }
239 return "";
240 }
241
Confirm()242 void ResultOhos::Confirm()
243 {
244 if (result_) {
245 result_->Confirm();
246 }
247 }
248
Confirm(const std::string & message)249 void ResultOhos::Confirm(const std::string& message)
250 {
251 if (result_) {
252 result_->Confirm(message);
253 }
254 }
255
Cancel()256 void ResultOhos::Cancel()
257 {
258 if (result_) {
259 result_->Cancel();
260 }
261 }
262
ExitFullScreen()263 void FullScreenExitHandlerOhos::ExitFullScreen()
264 {
265 auto delegate = webDelegate_.Upgrade();
266 CHECK_NULL_VOID(delegate);
267 CHECK_NULL_VOID(handler_);
268 if (Container::IsCurrentUseNewPipeline()) {
269 // notify chromium to exit fullscreen mode.
270 handler_->ExitFullScreen();
271 // notify web component in arkui to exit fullscreen mode.
272 delegate->ExitFullScreen();
273 }
274 }
275
Confirm(std::string & userName,std::string & pwd)276 bool AuthResultOhos::Confirm(std::string& userName, std::string& pwd)
277 {
278 if (result_) {
279 return result_->Confirm(userName, pwd);
280 }
281 return false;
282 }
283
IsHttpAuthInfoSaved()284 bool AuthResultOhos::IsHttpAuthInfoSaved()
285 {
286 if (result_) {
287 return result_->IsHttpAuthInfoSaved();
288 }
289 return false;
290 }
291
Cancel()292 void AuthResultOhos::Cancel()
293 {
294 if (result_) {
295 result_->Cancel();
296 }
297 }
298
HandleConfirm()299 void SslErrorResultOhos::HandleConfirm()
300 {
301 if (result_) {
302 result_->HandleConfirm();
303 }
304 }
305
HandleCancel()306 void SslErrorResultOhos::HandleCancel()
307 {
308 if (result_) {
309 result_->HandleCancel();
310 }
311 }
312
HandleConfirm()313 void AllSslErrorResultOhos::HandleConfirm()
314 {
315 if (result_) {
316 result_->HandleConfirm();
317 }
318 }
319
HandleCancel(bool abortLoading)320 void AllSslErrorResultOhos::HandleCancel(bool abortLoading)
321 {
322 if (result_) {
323 result_->HandleCancelV2(abortLoading);
324 }
325 }
326
HandleConfirm(const std::string & privateKeyFile,const std::string & certChainFile)327 void SslSelectCertResultOhos::HandleConfirm(const std::string& privateKeyFile, const std::string& certChainFile)
328 {
329 if (result_) {
330 result_->Confirm(privateKeyFile, certChainFile);
331 }
332 }
333
HandleCancel()334 void SslSelectCertResultOhos::HandleCancel()
335 {
336 if (result_) {
337 result_->Cancel();
338 }
339 }
340
HandleIgnore()341 void SslSelectCertResultOhos::HandleIgnore()
342 {
343 if (result_) {
344 result_->Ignore();
345 }
346 }
347
GetTitle()348 std::string FileSelectorParamOhos::GetTitle()
349 {
350 if (param_) {
351 return param_->Title();
352 }
353 return "";
354 }
355
GetMode()356 int FileSelectorParamOhos::GetMode()
357 {
358 if (param_) {
359 return param_->Mode();
360 }
361 return 0;
362 }
363
GetDefaultFileName()364 std::string FileSelectorParamOhos::GetDefaultFileName()
365 {
366 if (param_) {
367 return param_->DefaultFilename();
368 }
369 return "";
370 }
371
GetAcceptType()372 std::vector<std::string> FileSelectorParamOhos::GetAcceptType()
373 {
374 if (param_) {
375 return param_->AcceptType();
376 }
377 return std::vector<std::string>();
378 }
379
IsCapture()380 bool FileSelectorParamOhos::IsCapture()
381 {
382 if (param_) {
383 return param_->IsCapture();
384 }
385 return false;
386 }
387
GetMimeType()388 std::vector<std::string> FileSelectorParamOhos::GetMimeType()
389 {
390 if (param_) {
391 return param_->MimeType();
392 }
393 return std::vector<std::string>();
394 }
395
HandleFileList(std::vector<std::string> & result)396 void FileSelectorResultOhos::HandleFileList(std::vector<std::string>& result)
397 {
398 if (callback_) {
399 callback_->OnReceiveValue(result);
400 }
401 auto delegate = delegate_.Upgrade();
402 if (!delegate) {
403 TAG_LOGE(AceLogTag::ACE_WEB, "HandleFileList SetFileSelectorClosed Failed");
404 return;
405 }
406 delegate->SetIsFileSelectorShow(false);
407 }
408
Deny() const409 void WebPermissionRequestOhos::Deny() const
410 {
411 if (request_) {
412 request_->Refuse();
413 }
414 }
415
GetOrigin() const416 std::string WebPermissionRequestOhos::GetOrigin() const
417 {
418 if (request_) {
419 return request_->Origin();
420 }
421 return "";
422 }
423
GetResources() const424 std::vector<std::string> WebPermissionRequestOhos::GetResources() const
425 {
426 std::vector<std::string> resources;
427 if (request_) {
428 uint32_t resourcesId = static_cast<uint32_t>(request_->ResourceAcessId());
429 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::VIDEO_CAPTURE) {
430 resources.push_back(RESOURCE_VIDEO_CAPTURE);
431 }
432 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::AUDIO_CAPTURE) {
433 resources.push_back(RESOURCE_AUDIO_CAPTURE);
434 }
435 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::PROTECTED_MEDIA_ID) {
436 resources.push_back(RESOURCE_PROTECTED_MEDIA_ID);
437 }
438 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::MIDI_SYSEX) {
439 resources.push_back(RESOURCE_MIDI_SYSEX);
440 }
441 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::CLIPBOARD_READ_WRITE) {
442 resources.push_back(RESOURCE_CLIPBOARD_READ_WRITE);
443 }
444 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::SENSORS) {
445 resources.push_back(RESOURCE_SENSOR);
446 }
447 }
448 return resources;
449 }
450
Grant(std::vector<std::string> & resources) const451 void WebPermissionRequestOhos::Grant(std::vector<std::string>& resources) const
452 {
453 if (request_) {
454 uint32_t resourcesId = 0;
455 for (auto res : resources) {
456 if (res == RESOURCE_VIDEO_CAPTURE) {
457 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::VIDEO_CAPTURE;
458 } else if (res == RESOURCE_AUDIO_CAPTURE) {
459 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::AUDIO_CAPTURE;
460 } else if (res == RESOURCE_PROTECTED_MEDIA_ID) {
461 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::PROTECTED_MEDIA_ID;
462 } else if (res == RESOURCE_MIDI_SYSEX) {
463 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::MIDI_SYSEX;
464 } else if (res == RESOURCE_CLIPBOARD_READ_WRITE) {
465 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::CLIPBOARD_READ_WRITE;
466 } else if (res == RESOURCE_SENSOR) {
467 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::SENSORS;
468 }
469 }
470 request_->Agree(resourcesId);
471 }
472 }
473
Deny() const474 void WebScreenCaptureRequestOhos::Deny() const
475 {
476 if (request_) {
477 request_->Refuse();
478 }
479 }
480
GetOrigin() const481 std::string WebScreenCaptureRequestOhos::GetOrigin() const
482 {
483 if (request_) {
484 return request_->Origin();
485 }
486 return "";
487 }
488
SetCaptureMode(int32_t mode)489 void WebScreenCaptureRequestOhos::SetCaptureMode(int32_t mode)
490 {
491 config_->SetMode(mode);
492 }
493
SetSourceId(int32_t sourceId)494 void WebScreenCaptureRequestOhos::SetSourceId(int32_t sourceId)
495 {
496 config_->SetSourceId(sourceId);
497 }
498
Grant() const499 void WebScreenCaptureRequestOhos::Grant() const
500 {
501 if (request_) {
502 request_->Agree(config_);
503 }
504 }
505
GetXCoord() const506 int32_t ContextMenuParamOhos::GetXCoord() const
507 {
508 if (param_) {
509 return param_->GetXCoord();
510 }
511 return -1;
512 }
513
GetYCoord() const514 int32_t ContextMenuParamOhos::GetYCoord() const
515 {
516 if (param_) {
517 return param_->GetYCoord();
518 }
519 return -1;
520 }
521
GetLinkUrl() const522 std::string ContextMenuParamOhos::GetLinkUrl() const
523 {
524 if (param_) {
525 return param_->GetLinkUrl();
526 }
527 return "";
528 }
529
GetUnfilteredLinkUrl() const530 std::string ContextMenuParamOhos::GetUnfilteredLinkUrl() const
531 {
532 if (param_) {
533 return param_->GetUnfilteredLinkUrl();
534 }
535 return "";
536 }
537
GetSourceUrl() const538 std::string ContextMenuParamOhos::GetSourceUrl() const
539 {
540 if (param_) {
541 return param_->GetSourceUrl();
542 }
543 return "";
544 }
545
HasImageContents() const546 bool ContextMenuParamOhos::HasImageContents() const
547 {
548 if (param_) {
549 return param_->HasImageContents();
550 }
551 return false;
552 }
553
IsEditable() const554 bool ContextMenuParamOhos::IsEditable() const
555 {
556 if (param_) {
557 return param_->IsEditable();
558 }
559 return false;
560 }
561
GetEditStateFlags() const562 int ContextMenuParamOhos::GetEditStateFlags() const
563 {
564 if (param_) {
565 return param_->GetEditStateFlags();
566 }
567 return OHOS::NWeb::NWebContextMenuParams::ContextMenuEditStateFlags::CM_ES_NONE;
568 }
569
GetSourceType() const570 int ContextMenuParamOhos::GetSourceType() const
571 {
572 if (param_) {
573 return param_->GetSourceType();
574 }
575 return OHOS::NWeb::NWebContextMenuParams::ContextMenuSourceType::CM_ST_NONE;
576 }
577
GetMediaType() const578 int ContextMenuParamOhos::GetMediaType() const
579 {
580 if (param_) {
581 return param_->GetMediaType();
582 }
583 return OHOS::NWeb::NWebContextMenuParams::ContextMenuMediaType::CM_MT_NONE;
584 }
585
GetInputFieldType() const586 int ContextMenuParamOhos::GetInputFieldType() const
587 {
588 if (param_) {
589 return param_->GetInputFieldType();
590 }
591 return OHOS::NWeb::NWebContextMenuParams::ContextMenuInputFieldType::CM_IT_NONE;
592 }
593
GetSelectionText() const594 std::string ContextMenuParamOhos::GetSelectionText() const
595 {
596 if (param_) {
597 return param_->GetSelectionText();
598 }
599 return "";
600 }
601
GetImageRect(int32_t & x,int32_t & y,int32_t & width,int32_t & height) const602 void ContextMenuParamOhos::GetImageRect(int32_t& x, int32_t& y, int32_t& width, int32_t& height) const
603 {
604 if (param_) {
605 param_->GetImageRect(x, y, width, height);
606 }
607 }
608
IsAILink() const609 bool ContextMenuParamOhos::IsAILink() const
610 {
611 if (param_) {
612 return param_->IsAILink();
613 }
614 return false;
615 }
616
Cancel() const617 void ContextMenuResultOhos::Cancel() const
618 {
619 if (callback_) {
620 callback_->Cancel();
621 }
622 }
623
CopyImage() const624 void ContextMenuResultOhos::CopyImage() const
625 {
626 if (callback_) {
627 callback_->Continue(CI_IMAGE_COPY, EF_NONE);
628 }
629 }
630
Copy() const631 void ContextMenuResultOhos::Copy() const
632 {
633 if (callback_) {
634 callback_->Continue(CI_COPY, EF_NONE);
635 }
636 }
637
Paste() const638 void ContextMenuResultOhos::Paste() const
639 {
640 if (callback_) {
641 callback_->Continue(CI_PASTE, EF_NONE);
642 }
643 }
644
Cut() const645 void ContextMenuResultOhos::Cut() const
646 {
647 if (callback_) {
648 callback_->Continue(CI_CUT, EF_NONE);
649 }
650 }
651
SelectAll() const652 void ContextMenuResultOhos::SelectAll() const
653 {
654 if (callback_) {
655 callback_->Continue(CI_SELECT_ALL, EF_NONE);
656 }
657 }
658
Undo() const659 void ContextMenuResultOhos::Undo() const
660 {
661 if (callback_) {
662 callback_->Continue(CI_UNDO, EF_NONE);
663 }
664 }
665
Redo() const666 void ContextMenuResultOhos::Redo() const
667 {
668 if (callback_) {
669 callback_->Continue(CI_REDO, EF_NONE);
670 }
671 }
672
PasteAndMatchStyle() const673 void ContextMenuResultOhos::PasteAndMatchStyle() const
674 {
675 if (callback_) {
676 callback_->Continue(CI_PASTE_AND_MATCH_STYLE, EF_NONE);
677 }
678 }
679
SetWebController(int32_t id)680 void WebWindowNewHandlerOhos::SetWebController(int32_t id)
681 {
682 if (handler_) {
683 handler_->SetNWebHandlerById(id);
684 }
685 }
686
IsFrist() const687 bool WebWindowNewHandlerOhos::IsFrist() const
688 {
689 if (handler_) {
690 return handler_->IsFrist();
691 }
692 return true;
693 }
694
GetId() const695 int32_t WebWindowNewHandlerOhos::GetId() const
696 {
697 if (handler_) {
698 return handler_->GetId();
699 }
700 return -1;
701 }
702
GetParentNWebId() const703 int32_t WebWindowNewHandlerOhos::GetParentNWebId() const
704 {
705 return parentNWebId_;
706 }
707
Resend()708 void DataResubmittedOhos::Resend()
709 {
710 if (handler_) {
711 handler_->Resend();
712 }
713 }
714
Cancel()715 void DataResubmittedOhos::Cancel()
716 {
717 if (handler_) {
718 handler_->Cancel();
719 }
720 }
721
GetData()722 const void* FaviconReceivedOhos::GetData()
723 {
724 return data_;
725 }
726
GetWidth()727 size_t FaviconReceivedOhos::GetWidth()
728 {
729 return width_;
730 }
731
GetHeight()732 size_t FaviconReceivedOhos::GetHeight()
733 {
734 return height_;
735 }
736
GetColorType()737 int FaviconReceivedOhos::GetColorType()
738 {
739 return static_cast<int>(colorType_);
740 }
741
GetAlphaType()742 int FaviconReceivedOhos::GetAlphaType()
743 {
744 return static_cast<int>(alphaType_);
745 }
746
GetMediaPixelFormat()747 Media::PixelFormat FaviconReceivedOhos::GetMediaPixelFormat()
748 {
749 return GetPixelFormat(NG::TransImageColorType(colorType_));
750 }
751
GetMediaAlphaType()752 Media::AlphaType FaviconReceivedOhos::GetMediaAlphaType()
753 {
754 return ::OHOS::Ace::GetAlphaType(NG::TransImageAlphaType(alphaType_));
755 }
756
SetPixelMap()757 void FaviconReceivedOhos::SetPixelMap()
758 {
759 Media::InitializationOptions opt;
760 opt.size.width = static_cast<int32_t>(width_);
761 opt.size.height = static_cast<int32_t>(height_);
762 opt.pixelFormat = GetMediaPixelFormat();
763 opt.alphaType = GetMediaAlphaType();
764 opt.editable = true;
765 pixelMap_ = Media::PixelMap::Create(opt);
766 if (!pixelMap_) {
767 return;
768 }
769
770 uint32_t stride = width_ << 2;
771 uint64_t bufferSize = stride * height_;
772 pixelMap_->WritePixels(static_cast<const uint8_t*>(data_), bufferSize);
773 }
774
GetPixelMap()775 std::shared_ptr<Media::PixelMap> FaviconReceivedOhos::GetPixelMap()
776 {
777 return pixelMap_;
778 }
779
NWebScreenLockCallbackImpl(const WeakPtr<PipelineBase> & context)780 NWebScreenLockCallbackImpl::NWebScreenLockCallbackImpl(const WeakPtr<PipelineBase>& context) : context_(context) {}
781
Handle(bool key)782 void NWebScreenLockCallbackImpl::Handle(bool key)
783 {
784 TAG_LOGI(AceLogTag::ACE_WEB, "SetViewKeepScreenOn %{public}d", key);
785 auto weakContext = context_.Upgrade();
786 CHECK_NULL_VOID(weakContext);
787 auto window = weakContext->GetWindow();
788 CHECK_NULL_VOID(window);
789 window->SetViewKeepScreenOn(key);
790 }
791
~WebDelegateObserver()792 WebDelegateObserver::~WebDelegateObserver() {}
793
NotifyDestory()794 void WebDelegateObserver::NotifyDestory()
795 {
796 TAG_LOGI(AceLogTag::ACE_WEB, "NotifyDestory start");
797 uint32_t destructDelayTime = DESTRUCT_DELAY_MILLISECONDS;
798 if (delegate_) {
799 delegate_->UnRegisterScreenLockFunction();
800 if (delegate_->GetWebDestroyMode() == WebDestroyMode::NORMAL_MODE) {
801 destructDelayTime = 0;
802 }
803 }
804 auto context = context_.Upgrade();
805 if (!context) {
806 TAG_LOGD(AceLogTag::ACE_WEB, "NotifyDestory context is null, use EventHandler to destory");
807 auto currentHandler = OHOS::AppExecFwk::EventHandler::Current();
808 if (!currentHandler) {
809 TAG_LOGE(AceLogTag::ACE_WEB, "NWEB webdelegateObserver EventHandler currentHandler is null");
810 return;
811 }
812 currentHandler->PostTask(
813 [weak = WeakClaim(this), currentHandler = currentHandler]() {
814 auto observer = weak.Upgrade();
815 if (!observer) {
816 TAG_LOGE(AceLogTag::ACE_WEB, "NotifyDestory EventHandler observer is null");
817 return;
818 }
819 if (observer->delegate_) {
820 TAG_LOGD(AceLogTag::ACE_WEB, "NotifyDestory EventHandler destorying delegate");
821 observer->delegate_.Reset();
822 }
823 },
824 destructDelayTime);
825 return;
826 }
827 auto taskExecutor = context->GetTaskExecutor();
828 if (!taskExecutor) {
829 TAG_LOGE(AceLogTag::ACE_WEB, "NotifyDestory TaskExecutor is null");
830 return;
831 }
832 taskExecutor->PostDelayedTask(
833 [weak = WeakClaim(this), taskExecutor = taskExecutor]() {
834 auto observer = weak.Upgrade();
835 if (!observer) {
836 TAG_LOGE(AceLogTag::ACE_WEB, "NotifyDestory TaskExecutor observer is null");
837 return;
838 }
839 if (observer->delegate_) {
840 TAG_LOGD(AceLogTag::ACE_WEB, "NotifyDestory TaskExecutor destorying delegate");
841 observer->delegate_.Reset();
842 }
843 },
844 TaskExecutor::TaskType::UI, destructDelayTime, "ArkUIWebNotifyDestory");
845 }
846
OnAttachContext(const RefPtr<NG::PipelineContext> & context)847 void WebDelegateObserver::OnAttachContext(const RefPtr<NG::PipelineContext> &context)
848 {
849 context_ = context;
850 }
851
OnDetachContext()852 void WebDelegateObserver::OnDetachContext()
853 {
854 context_ = nullptr;
855 }
856
SetGestureEventResult(bool result)857 void GestureEventResultOhos::SetGestureEventResult(bool result)
858 {
859 if (!IsMouseToTouch()) {
860 if (!result_) {
861 return;
862 }
863 result_->SetGestureEventResult(result);
864 } else {
865 if (!mouseResult_) {
866 return;
867 }
868 mouseResult_->SetMouseEventResult(result, true);
869 }
870 SetSendTask();
871 eventResult_ = result;
872 }
873
SetGestureEventResult(bool result,bool stopPropagation)874 void GestureEventResultOhos::SetGestureEventResult(bool result, bool stopPropagation)
875 {
876 if (!IsMouseToTouch()) {
877 if (!result_) {
878 return;
879 }
880 result_->SetGestureEventResultV2(result, stopPropagation);
881 } else {
882 if (!mouseResult_) {
883 return;
884 }
885 mouseResult_->SetMouseEventResult(result, stopPropagation);
886 }
887 SetSendTask();
888 eventResult_ = result;
889 }
890
SetMouseEventResult(bool result,bool stopPropagation)891 void MouseEventResultOhos::SetMouseEventResult(bool result, bool stopPropagation)
892 {
893 if (result_) {
894 result_->SetMouseEventResult(result, stopPropagation);
895 SetSendTask();
896 eventResult_ = result;
897 }
898 }
899
UnRegisterScreenLockFunction()900 void WebDelegate::UnRegisterScreenLockFunction()
901 {
902 if (nweb_) {
903 nweb_->UnRegisterScreenLockFunction(instanceId_);
904 }
905 }
906
AfterFocused()907 void WebWindowFocusChangedListener::AfterFocused()
908 {
909 auto delegate = webDelegate_.Upgrade();
910 if (!delegate) {
911 TAG_LOGW(AceLogTag::ACE_WEB, "Dragdrop, AfterFocused error delegate is nullptr");
912 return;
913 }
914 delegate->OnDragAttach();
915 delegate->UnRegisterWebWindowFocusChangedListener();
916 TAG_LOGI(AceLogTag::ACE_WEB, "Dragdrop, AfterFocused, end attach ime, remove listener");
917 }
918
OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea,OHOS::Rosen::AvoidAreaType type,const sptr<OHOS::Rosen::OccupiedAreaChangeInfo> & info)919 void WebAvoidAreaChangedListener::OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea,
920 OHOS::Rosen::AvoidAreaType type, const sptr<OHOS::Rosen::OccupiedAreaChangeInfo>& info)
921 {
922 auto context = context_.Upgrade();
923 if (!context) {
924 return;
925 }
926 context->GetTaskExecutor()->PostTask(
927 [weak = webDelegate_, avoidArea, type]() {
928 auto delegate = weak.Upgrade();
929 CHECK_NULL_VOID(delegate);
930 delegate->OnAvoidAreaChanged(avoidArea, type);
931 },
932 TaskExecutor::TaskType::UI, "OnAvoidAreaChanged");
933 }
934
~WebDelegate()935 WebDelegate::~WebDelegate()
936 {
937 SetAccessibilityState(false, false);
938 OnNativeEmbedAllDestory();
939 ReleasePlatformResource();
940 if (IsDeviceTabletOr2in1() && GetWebOptimizationValue()) {
941 OHOS::Rosen::RSInterfaces::GetInstance().UnRegisterSurfaceOcclusionChangeCallback(surfaceNodeId_);
942 }
943 if (nweb_) {
944 nweb_->OnDestroy();
945 }
946 UnregisterSurfacePositionChangedCallback();
947 UnregisterAvoidAreaChangeListener(instanceId_);
948 UnRegisterConfigObserver();
949 }
950
ReleasePlatformResource()951 void WebDelegate::ReleasePlatformResource()
952 {
953 Stop();
954 Release();
955 }
956
Invoke(const std::string & origin,const bool & allow,const bool & retain)957 void WebGeolocationOhos::Invoke(const std::string& origin, const bool& allow, const bool& retain)
958 {
959 if (geolocationCallback_) {
960 geolocationCallback_->GeolocationCallbackInvoke(origin, allow, retain,
961 incognito_);
962 }
963 }
964
Stop()965 void WebDelegate::Stop()
966 {
967 auto context = context_.Upgrade();
968 if (!context) {
969 return;
970 }
971 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
972 if (platformTaskExecutor.IsRunOnCurrentThread()) {
973 UnregisterEvent();
974 } else {
975 platformTaskExecutor.PostTask([weak = WeakClaim(this)] {
976 auto delegate = weak.Upgrade();
977 if (delegate) {
978 delegate->UnregisterEvent();
979 }
980 }, "ArkUIWebUnregisterEvent");
981 }
982 }
983
UnregisterEvent()984 void WebDelegate::UnregisterEvent()
985 {
986 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
987 if (!context) {
988 return;
989 }
990 auto resRegister = context->GetPlatformResRegister();
991 if (resRegister == nullptr) {
992 return;
993 }
994 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGESTART));
995 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH));
996 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR));
997 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH));
998 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE));
999 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_LOADSTART));
1000 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_LOADFINISH));
1001 }
1002
SetRenderWeb(const WeakPtr<RenderWeb> & renderWeb)1003 void WebDelegate::SetRenderWeb(const WeakPtr<RenderWeb>& renderWeb)
1004 {
1005 renderWeb_ = renderWeb;
1006 }
1007
CreatePlatformResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)1008 void WebDelegate::CreatePlatformResource(
1009 const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
1010 {
1011 ReleasePlatformResource();
1012 context_ = context;
1013 auto pipeline = context.Upgrade();
1014 if (pipeline) {
1015 taskExecutor_ = pipeline->GetTaskExecutor();
1016 }
1017 CreatePluginResource(size, position, context);
1018
1019 auto reloadCallback = [weak = WeakClaim(this)]() {
1020 auto delegate = weak.Upgrade();
1021 if (!delegate) {
1022 return false;
1023 }
1024 delegate->Reload();
1025 return true;
1026 };
1027 WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
1028
1029 auto updateUrlCallback = [weak = WeakClaim(this)](const std::string& url) {
1030 auto delegate = weak.Upgrade();
1031 if (!delegate) {
1032 return false;
1033 }
1034 delegate->UpdateUrl(url);
1035 return true;
1036 };
1037 WebClient::GetInstance().RegisterUpdageUrlCallback(updateUrlCallback);
1038 InitWebEvent();
1039 }
1040
LoadUrl(const std::string & url,const std::map<std::string,std::string> & httpHeaders)1041 void WebDelegate::LoadUrl(const std::string& url, const std::map<std::string, std::string>& httpHeaders)
1042 {
1043 auto context = context_.Upgrade();
1044 if (!context) {
1045 return;
1046 }
1047 context->GetTaskExecutor()->PostTask(
1048 [weak = WeakClaim(this), url, httpHeaders]() {
1049 auto delegate = weak.Upgrade();
1050 if (!delegate) {
1051 return;
1052 }
1053 if (delegate->nweb_) {
1054 delegate->nweb_->Load(
1055 const_cast<std::string&>(url), const_cast<std::map<std::string, std::string>&>(httpHeaders));
1056 }
1057 },
1058 TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadUrl");
1059 }
1060
1061 #ifdef OHOS_STANDARD_SYSTEM
Backward()1062 void WebDelegate::Backward()
1063 {
1064 auto context = context_.Upgrade();
1065 if (!context) {
1066 return;
1067 }
1068 context->GetTaskExecutor()->PostTask(
1069 [weak = WeakClaim(this)]() {
1070 auto delegate = weak.Upgrade();
1071 if (!delegate) {
1072 return;
1073 }
1074 if (delegate->nweb_) {
1075 delegate->nweb_->NavigateBack();
1076 }
1077 },
1078 TaskExecutor::TaskType::PLATFORM, "ArkUIWebNavigateBack");
1079 }
1080
Forward()1081 void WebDelegate::Forward()
1082 {
1083 auto context = context_.Upgrade();
1084 if (!context) {
1085 return;
1086 }
1087 context->GetTaskExecutor()->PostTask(
1088 [weak = WeakClaim(this)]() {
1089 auto delegate = weak.Upgrade();
1090 if (!delegate) {
1091 return;
1092 }
1093 if (delegate->nweb_) {
1094 delegate->nweb_->NavigateForward();
1095 }
1096 },
1097 TaskExecutor::TaskType::PLATFORM, "ArkUIWebNavigateForward");
1098 }
1099
ClearHistory()1100 void WebDelegate::ClearHistory()
1101 {
1102 auto context = context_.Upgrade();
1103 if (!context) {
1104 return;
1105 }
1106 context->GetTaskExecutor()->PostTask(
1107 [weak = WeakClaim(this)]() {
1108 auto delegate = weak.Upgrade();
1109 if (!delegate) {
1110 return;
1111 }
1112 if (delegate->nweb_) {
1113 delegate->nweb_->DeleteNavigateHistory();
1114 }
1115 },
1116 TaskExecutor::TaskType::PLATFORM, "ArkUIWebDeleteNavigateHistory");
1117 }
1118
ClearSslCache()1119 void WebDelegate::ClearSslCache()
1120 {
1121 auto context = context_.Upgrade();
1122 if (!context) {
1123 return;
1124 }
1125 context->GetTaskExecutor()->PostTask(
1126 [weak = WeakClaim(this)]() {
1127 auto delegate = weak.Upgrade();
1128 if (!delegate) {
1129 return;
1130 }
1131 if (delegate->nweb_) {
1132 delegate->nweb_->ClearSslCache();
1133 }
1134 },
1135 TaskExecutor::TaskType::PLATFORM, "ArkUIWebClearSslCache");
1136 }
1137
ClearClientAuthenticationCache()1138 void WebDelegate::ClearClientAuthenticationCache()
1139 {
1140 auto context = context_.Upgrade();
1141 if (!context) {
1142 return;
1143 }
1144 context->GetTaskExecutor()->PostTask(
1145 [weak = WeakClaim(this)]() {
1146 auto delegate = weak.Upgrade();
1147 if (!delegate) {
1148 return;
1149 }
1150 if (delegate->nweb_) {
1151 delegate->nweb_->ClearClientAuthenticationCache();
1152 }
1153 },
1154 TaskExecutor::TaskType::PLATFORM, "ArkUIWebClearClientAuthenticationCache");
1155 }
1156
AccessStep(int32_t step)1157 bool WebDelegate::AccessStep(int32_t step)
1158 {
1159 auto delegate = WeakClaim(this).Upgrade();
1160 if (!delegate) {
1161 return false;
1162 }
1163 if (delegate->nweb_) {
1164 return delegate->nweb_->CanNavigateBackOrForward(step);
1165 }
1166 return false;
1167 }
1168
BackOrForward(int32_t step)1169 void WebDelegate::BackOrForward(int32_t step)
1170 {
1171 auto context = context_.Upgrade();
1172 if (!context) {
1173 return;
1174 }
1175
1176 context->GetTaskExecutor()->PostTask(
1177 [weak = WeakClaim(this), step] {
1178 auto delegate = weak.Upgrade();
1179 if (!delegate) {
1180 return;
1181 }
1182 if (delegate->nweb_) {
1183 delegate->nweb_->NavigateBackOrForward(step);
1184 }
1185 },
1186 TaskExecutor::TaskType::PLATFORM, "ArkUIWebNavigateBackOrForward");
1187 }
1188
AccessBackward()1189 bool WebDelegate::AccessBackward()
1190 {
1191 auto delegate = WeakClaim(this).Upgrade();
1192 if (!delegate) {
1193 return false;
1194 }
1195 if (delegate->nweb_) {
1196 return delegate->nweb_->IsNavigatebackwardAllowed();
1197 }
1198 return false;
1199 }
1200
AccessForward()1201 bool WebDelegate::AccessForward()
1202 {
1203 auto delegate = WeakClaim(this).Upgrade();
1204 if (!delegate) {
1205 return false;
1206 }
1207 if (delegate->nweb_) {
1208 return delegate->nweb_->IsNavigateForwardAllowed();
1209 }
1210 return false;
1211 }
1212
1213 #endif
1214
ExecuteTypeScript(const std::string & jscode,const std::function<void (const std::string)> && callback)1215 void WebDelegate::ExecuteTypeScript(const std::string& jscode, const std::function<void(const std::string)>&& callback)
1216 {
1217 auto context = context_.Upgrade();
1218 if (!context) {
1219 return;
1220 }
1221 context->GetTaskExecutor()->PostTask(
1222 [weak = WeakClaim(this), jscode, callback]() {
1223 auto delegate = weak.Upgrade();
1224 if (!delegate) {
1225 return;
1226 }
1227 if (delegate->nweb_) {
1228 auto callbackImpl = std::make_shared<WebJavaScriptExecuteCallBack>(weak);
1229 if (callbackImpl && callback) {
1230 callbackImpl->SetCallBack([weak, func = std::move(callback)](std::string result) {
1231 auto delegate = weak.Upgrade();
1232 if (!delegate) {
1233 return;
1234 }
1235 auto context = delegate->context_.Upgrade();
1236 if (context) {
1237 context->GetTaskExecutor()->PostTask(
1238 [callback = std::move(func), result]() { callback(result); },
1239 TaskExecutor::TaskType::JS, "ArkUIWebJavaScriptExecuteCallBack");
1240 }
1241 });
1242 }
1243 delegate->nweb_->ExecuteJavaScript(jscode, callbackImpl, false);
1244 }
1245 },
1246 TaskExecutor::TaskType::PLATFORM, "ArkUIWebExecuteJavaScript");
1247 }
1248
1249 class NativeWebProxyCallback : public OHOS::NWeb::NWebJsProxyCallback {
1250 public:
NativeWebProxyCallback(const std::string & methodName,const NativeMethodCallback & method)1251 NativeWebProxyCallback(const std::string& methodName, const NativeMethodCallback& method)
1252 : methodName_(methodName), method_(method) {};
1253 ~NativeWebProxyCallback() = default;
1254
GetMethodName()1255 std::string GetMethodName() override
1256 {
1257 return methodName_;
1258 }
1259
GetMethodCallback()1260 NativeArkWebOnJavaScriptProxyCallback GetMethodCallback() override
1261 {
1262 return method_;
1263 }
1264
1265 private:
1266 std::string methodName_;
1267 NativeMethodCallback method_;
1268 };
1269
RegisterNativeArkJSFunction(const std::string & objName,const std::vector<std::pair<std::string,NativeMethodCallback>> & methodList,bool isNeedRefresh)1270 void WebDelegate::RegisterNativeArkJSFunction(const std::string& objName,
1271 const std::vector<std::pair<std::string, NativeMethodCallback>>& methodList, bool isNeedRefresh)
1272 {
1273 auto context = context_.Upgrade();
1274 if (!context) {
1275 return;
1276 }
1277 context->GetTaskExecutor()->PostTask(
1278 [weak = WeakClaim(this), objName, methodList, isNeedRefresh]() {
1279 auto delegate = weak.Upgrade();
1280 if (!delegate) {
1281 return;
1282 }
1283 if (delegate->nweb_) {
1284 std::vector<std::shared_ptr<NWebJsProxyCallback>> callbacks;
1285 for (const auto& item : methodList) {
1286 auto callback = std::make_shared<NativeWebProxyCallback>(item.first, item.second);
1287 callbacks.emplace_back(callback);
1288 }
1289 delegate->nweb_->RegisterNativeArkJSFunction(objName.c_str(), callbacks);
1290 if (isNeedRefresh) {
1291 delegate->nweb_->Reload();
1292 }
1293 }
1294 },
1295 TaskExecutor::TaskType::PLATFORM, "ArkUIWebRegisterNativeArkJSFunction");
1296 }
1297
UnRegisterNativeArkJSFunction(const std::string & objName)1298 void WebDelegate::UnRegisterNativeArkJSFunction(const std::string& objName)
1299 {
1300 if (nweb_) {
1301 nweb_->UnRegisterNativeArkJSFunction(objName.c_str());
1302 }
1303 }
1304
1305 class NWebJsProxyMethodImpl : public OHOS::NWeb::NWebJsProxyMethod {
1306 public:
NWebJsProxyMethodImpl(int size,const std::vector<std::function<void (const std::vector<std::string> &)>> & func)1307 explicit NWebJsProxyMethodImpl(int size,
1308 const std::vector<std::function<void(const std::vector<std::string>&)>>& func)
1309 : size_(size), funcs_(func) {}
1310 ~NWebJsProxyMethodImpl() = default;
1311
GetSize()1312 int GetSize() override
1313 {
1314 return size_;
1315 }
1316
OnHandle(int number,const std::vector<std::string> & param)1317 void OnHandle(int number, const std::vector<std::string>& param) override
1318 {
1319 if (number < 0 || number >= size_) {
1320 TAG_LOGE(AceLogTag::ACE_WEB, "jsProxy callback back error number %{public}d", number);
1321 return;
1322 }
1323 if (!funcs_[number]) {
1324 TAG_LOGE(AceLogTag::ACE_WEB, "jsProxy callback is null in number %{public}d", number);
1325 return;
1326 }
1327 TAG_LOGD(AceLogTag::ACE_WEB, "jsProxy callback success number %{public}d", number);
1328 funcs_[number](param);
1329 }
1330
1331 private:
1332 int size_ = 0;
1333 std::vector<std::function<void(const std::vector<std::string>&)>> funcs_;
1334 };
1335
RegisterNativeJavaScriptProxy(const std::string & obj,const std::vector<std::string> & method,std::vector<std::function<void (const std::vector<std::string> &)>> callbackImpl,bool isAync,const std::string & permission,bool isNeedRefresh)1336 void WebDelegate::RegisterNativeJavaScriptProxy(const std::string& obj, const std::vector<std::string>& method,
1337 std::vector<std::function<void(const std::vector<std::string>&)>> callbackImpl,
1338 bool isAync, const std::string& permission, bool isNeedRefresh)
1339 {
1340 auto context = context_.Upgrade();
1341 CHECK_NULL_VOID(context);
1342 auto executor = context->GetTaskExecutor();
1343 CHECK_NULL_VOID(executor);
1344
1345 executor->PostTask(
1346 [weak = WeakClaim(this), obj, methods = method, callbacks = callbackImpl, isAync, permission, isNeedRefresh]() {
1347 auto delegate = weak.Upgrade();
1348 CHECK_NULL_VOID(delegate);
1349 auto nweb = delegate->GetNweb();
1350 CHECK_NULL_VOID(nweb);
1351
1352 int len = callbacks.size();
1353 TAG_LOGI(AceLogTag::ACE_WEB, "RegisterNativeJavaScriptProxy %{public}s have %{public}d callback",
1354 obj.c_str(), len);
1355 std::shared_ptr<NWebJsProxyMethodImpl> dataImpl = std::make_shared<NWebJsProxyMethodImpl>(len, callbacks);
1356 nweb->RegisterNativeJavaScriptProxy(obj, methods, dataImpl, isAync, permission);
1357 if (isNeedRefresh) {
1358 nweb->Reload();
1359 }
1360 },
1361 TaskExecutor::TaskType::PLATFORM, "ArkUIWebRegisterNativeJavaScriptProxy");
1362 }
1363
LoadDataWithBaseUrl(const std::string & baseUrl,const std::string & data,const std::string & mimeType,const std::string & encoding,const std::string & historyUrl)1364 void WebDelegate::LoadDataWithBaseUrl(const std::string& baseUrl, const std::string& data, const std::string& mimeType,
1365 const std::string& encoding, const std::string& historyUrl)
1366 {
1367 auto context = context_.Upgrade();
1368 if (!context) {
1369 return;
1370 }
1371 context->GetTaskExecutor()->PostTask(
1372 [weak = WeakClaim(this), baseUrl, data, mimeType, encoding, historyUrl]() {
1373 auto delegate = weak.Upgrade();
1374 if (!delegate) {
1375 return;
1376 }
1377 if (delegate->nweb_) {
1378 if (baseUrl.empty() && historyUrl.empty()) {
1379 delegate->nweb_->LoadWithData(data, mimeType, encoding);
1380 } else {
1381 delegate->nweb_->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
1382 }
1383 }
1384 },
1385 TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithBaseUrl");
1386 }
1387
LoadDataWithRichText()1388 bool WebDelegate::LoadDataWithRichText()
1389 {
1390 auto context = context_.Upgrade();
1391 if (!context) {
1392 return false;
1393 }
1394 #ifdef NG_BUILD
1395 auto webPattern = webPattern_.Upgrade();
1396 CHECK_NULL_RETURN(webPattern, false);
1397 auto webData = webPattern->GetWebData();
1398 CHECK_NULL_RETURN(webData, false);
1399 const std::string& data = webData.value();
1400 if (data.empty()) {
1401 return false;
1402 }
1403
1404 context->GetTaskExecutor()->PostTask(
1405 [weak = WeakClaim(this), data]() {
1406 auto delegate = weak.Upgrade();
1407 if (!delegate) {
1408 return;
1409 }
1410 if (delegate->nweb_) {
1411 delegate->nweb_->LoadWithDataAndBaseUrl("resource://rawfile", data, "", "", "");
1412 }
1413 },
1414 TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithRichText");
1415 return true;
1416 #else
1417 if (Container::IsCurrentUseNewPipeline()) {
1418 auto webPattern = webPattern_.Upgrade();
1419 CHECK_NULL_RETURN(webPattern, false);
1420 auto webData = webPattern->GetWebData();
1421 CHECK_NULL_RETURN(webData, false);
1422 const std::string& data = webData.value();
1423 if (data.empty()) {
1424 return false;
1425 }
1426
1427 context->GetTaskExecutor()->PostTask(
1428 [weak = WeakClaim(this), data]() {
1429 auto delegate = weak.Upgrade();
1430 if (!delegate) {
1431 return;
1432 }
1433 if (delegate->nweb_) {
1434 if (data.find("resource:/") == 0) {
1435 delegate->nweb_->Load(data);
1436 } else {
1437 delegate->nweb_->LoadWithDataAndBaseUrl("resource://rawfile", data, "", "", "");
1438 }
1439 }
1440 },
1441 TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithRichText");
1442 return true;
1443 }
1444
1445 auto webCom = webComponent_.Upgrade();
1446 CHECK_NULL_RETURN(webCom, false);
1447 if (webCom->GetData().empty()) {
1448 return false;
1449 }
1450 const std::string& data = webCom->GetData();
1451 context->GetTaskExecutor()->PostTask(
1452 [weak = WeakClaim(this), data]() {
1453 auto delegate = weak.Upgrade();
1454 if (!delegate) {
1455 return;
1456 }
1457 if (delegate->nweb_) {
1458 if (data.find("resource:/") == 0) {
1459 delegate->nweb_->Load(data);
1460 } else {
1461 delegate->nweb_->LoadWithDataAndBaseUrl("resource://rawfile", data, "", "", "");
1462 }
1463 }
1464 },
1465 TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithRichText");
1466 return true;
1467 #endif
1468 }
1469
Refresh()1470 void WebDelegate::Refresh()
1471 {
1472 auto context = context_.Upgrade();
1473 if (!context) {
1474 return;
1475 }
1476 context->GetTaskExecutor()->PostTask(
1477 [weak = WeakClaim(this)]() {
1478 auto delegate = weak.Upgrade();
1479 if (!delegate) {
1480 return;
1481 }
1482 if (delegate->nweb_) {
1483 delegate->nweb_->Reload();
1484 }
1485 },
1486 TaskExecutor::TaskType::PLATFORM, "ArkUIWebRefresh");
1487 }
1488
StopLoading()1489 void WebDelegate::StopLoading()
1490 {
1491 auto context = context_.Upgrade();
1492 if (!context) {
1493 return;
1494 }
1495 context->GetTaskExecutor()->PostTask(
1496 [weak = WeakClaim(this)]() {
1497 auto delegate = weak.Upgrade();
1498 if (!delegate) {
1499 return;
1500 }
1501 if (delegate->nweb_) {
1502 delegate->nweb_->Stop();
1503 }
1504 },
1505 TaskExecutor::TaskType::PLATFORM, "ArkUIWebStopLoading");
1506 }
1507
AddJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)1508 void WebDelegate::AddJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
1509 {
1510 auto context = context_.Upgrade();
1511 if (!context) {
1512 return;
1513 }
1514 context->GetTaskExecutor()->PostTask(
1515 [weak = WeakClaim(this), objectName, methodList]() {
1516 auto delegate = weak.Upgrade();
1517 if (!delegate) {
1518 return;
1519 }
1520 if (delegate->nweb_) {
1521 // Async methods list is empty
1522 std::vector<std::string> asyncMethodList;
1523 std::string permission;
1524 // webcontroller not support object, so the object_id param
1525 // assign error code
1526 delegate->nweb_->RegisterArkJSfunction(
1527 objectName, methodList, asyncMethodList,
1528 static_cast<int32_t>(JavaScriptObjIdErrorCode::WEBCONTROLLERERROR),
1529 permission);
1530 }
1531 },
1532 TaskExecutor::TaskType::PLATFORM, "ArkUIWebAddJsInterface");
1533 }
RemoveJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)1534 void WebDelegate::RemoveJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
1535 {
1536 auto context = context_.Upgrade();
1537 if (!context) {
1538 return;
1539 }
1540 context->GetTaskExecutor()->PostTask(
1541 [weak = WeakClaim(this), objectName, methodList]() {
1542 auto delegate = weak.Upgrade();
1543 if (!delegate) {
1544 return;
1545 }
1546 if (delegate->nweb_) {
1547 delegate->nweb_->UnregisterArkJSfunction(objectName, methodList);
1548 }
1549 },
1550 TaskExecutor::TaskType::PLATFORM, "ArkUIWebRemoveJsInterface");
1551 }
1552
SetWebViewJavaScriptResultCallBack(const WebController::JavaScriptCallBackImpl && javaScriptCallBackImpl)1553 void WebDelegate::SetWebViewJavaScriptResultCallBack(
1554 const WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl)
1555 {
1556 auto context = context_.Upgrade();
1557 if (!context) {
1558 return;
1559 }
1560
1561 context->GetTaskExecutor()->PostTask(
1562 [weak = WeakClaim(this), javaScriptCallBackImpl]() {
1563 auto delegate = weak.Upgrade();
1564 if (delegate == nullptr || delegate->nweb_ == nullptr) {
1565 return;
1566 }
1567 auto webJSResultCallBack = std::make_shared<WebJavaScriptResultCallBack>(weak);
1568 if (webJSResultCallBack) {
1569 webJSResultCallBack->SetJavaScriptCallBack(std::move(javaScriptCallBackImpl));
1570 delegate->nweb_->SetNWebJavaScriptResultCallBack(webJSResultCallBack);
1571 }
1572 },
1573 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetJsResultCallBack");
1574 }
1575
CreateWebMessagePorts(std::vector<RefPtr<WebMessagePort>> & ports)1576 void WebDelegate::CreateWebMessagePorts(std::vector<RefPtr<WebMessagePort>>& ports)
1577 {
1578 if (nweb_) {
1579 std::vector<std::string> portStr = nweb_->CreateWebMessagePorts();
1580 RefPtr<WebMessagePort> port0 = AceType::MakeRefPtr<WebMessagePortOhos>(WeakClaim(this));
1581 RefPtr<WebMessagePort> port1 = AceType::MakeRefPtr<WebMessagePortOhos>(WeakClaim(this));
1582 port0->SetPortHandle(portStr[0]);
1583 port1->SetPortHandle(portStr[1]);
1584 ports.push_back(port0);
1585 ports.push_back(port1);
1586 }
1587 }
1588
PostWebMessage(std::string & message,std::vector<RefPtr<WebMessagePort>> & ports,std::string & uri)1589 void WebDelegate::PostWebMessage(std::string& message, std::vector<RefPtr<WebMessagePort>>& ports, std::string& uri)
1590 {
1591 if (nweb_) {
1592 std::vector<std::string> sendPorts;
1593 for (RefPtr<WebMessagePort> port : ports) {
1594 sendPorts.push_back(port->GetPortHandle());
1595 }
1596 nweb_->PostWebMessage(message, sendPorts, uri);
1597 }
1598 }
1599
ClosePort(std::string & port)1600 void WebDelegate::ClosePort(std::string& port)
1601 {
1602 if (nweb_) {
1603 nweb_->ClosePort(port);
1604 }
1605 }
1606
PostPortMessage(std::string & port,std::string & data)1607 void WebDelegate::PostPortMessage(std::string& port, std::string& data)
1608 {
1609 if (nweb_) {
1610 auto romMsg = std::make_shared<OHOS::NWeb::WebViewValue>(NWebRomValue::Type::NONE);
1611 romMsg->SetType(NWebRomValue::Type::STRING);
1612 romMsg->SetString(data);
1613 nweb_->PostPortMessageV2(port, romMsg);
1614 if (ArkWebGetErrno() != RESULT_OK) {
1615 auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
1616 webMsg->SetType(NWebValue::Type::STRING);
1617 webMsg->SetString(data);
1618 nweb_->PostPortMessage(port, webMsg);
1619 }
1620 }
1621 }
1622
SetPortMessageCallback(std::string & port,std::function<void (const std::string &)> && callback)1623 void WebDelegate::SetPortMessageCallback(std::string& port, std::function<void(const std::string&)>&& callback)
1624 {
1625 if (nweb_) {
1626 auto callbackImpl = std::make_shared<WebMessageValueCallBackImpl>(WeakClaim(this));
1627 if (callbackImpl && callback) {
1628 callbackImpl->SetCallBack([weak = WeakClaim(this), func = std::move(callback)](std::string result) {
1629 auto delegate = weak.Upgrade();
1630 if (!delegate) {
1631 return;
1632 }
1633 auto context = delegate->context_.Upgrade();
1634 if (context) {
1635 context->GetTaskExecutor()->PostTask(
1636 [callback = std::move(func), result]() { callback(result); },
1637 TaskExecutor::TaskType::JS, "ArkUIWebSetPortMessageCallback");
1638 }
1639 });
1640 }
1641 nweb_->SetPortMessageCallback(port, callbackImpl);
1642 }
1643 }
1644
RequestFocus(OHOS::NWeb::NWebFocusSource source)1645 bool WebDelegate::RequestFocus(OHOS::NWeb::NWebFocusSource source)
1646 {
1647 auto context = context_.Upgrade();
1648 CHECK_NULL_RETURN(context, false);
1649 bool result = false;
1650 context->GetTaskExecutor()->PostSyncTask(
1651 [weak = WeakClaim(this), &result, source]() {
1652 auto delegate = weak.Upgrade();
1653 CHECK_NULL_VOID(delegate);
1654
1655 if (Container::IsCurrentUseNewPipeline()) {
1656 auto webPattern = delegate->webPattern_.Upgrade();
1657 CHECK_NULL_VOID(webPattern);
1658 if (webPattern->IsFocus()) {
1659 result = true;
1660 return;
1661 }
1662 auto eventHub = webPattern->GetWebEventHub();
1663 CHECK_NULL_VOID(eventHub);
1664 auto focusHub = eventHub->GetOrCreateFocusHub();
1665 CHECK_NULL_VOID(focusHub);
1666 if (source == OHOS::NWeb::NWebFocusSource::FOCUS_SOURCE_NAVIGATION &&
1667 webPattern->IsDefaultFocusNodeExist() && !focusHub->IsDefaultFocus()) {
1668 TAG_LOGI(AceLogTag::ACE_WEB, "there are other default focusNodes, web don't focus on navigation");
1669 result = false;
1670 return;
1671 }
1672 if (source == OHOS::NWeb::NWebFocusSource::FOCUS_SOURCE_GESTURE) {
1673 focusHub->RequestFocusImmediately();
1674 result = false;
1675 return;
1676 }
1677
1678 auto host = webPattern->GetHost();
1679 CHECK_NULL_VOID(host);
1680 if (host->IsOnMainTree()) {
1681 focusHub->RequestFocus();
1682 result = false;
1683 }
1684 return;
1685 }
1686
1687 auto webCom = delegate->webComponent_.Upgrade();
1688 CHECK_NULL_VOID(webCom);
1689 result = webCom->RequestFocus();
1690 },
1691 TaskExecutor::TaskType::PLATFORM, "ArkUIWebRequestFocus");
1692 return result;
1693 }
1694
IsCurrentFocus()1695 bool WebDelegate::IsCurrentFocus()
1696 {
1697 auto webPattern = webPattern_.Upgrade();
1698 CHECK_NULL_RETURN(webPattern, false);
1699 return webPattern->IsCurrentFocus();
1700 }
1701
SearchAllAsync(const std::string & searchStr)1702 void WebDelegate::SearchAllAsync(const std::string& searchStr)
1703 {
1704 auto context = context_.Upgrade();
1705 if (!context) {
1706 return;
1707 }
1708 context->GetTaskExecutor()->PostTask(
1709 [weak = WeakClaim(this), searchStr]() {
1710 auto delegate = weak.Upgrade();
1711 if (!delegate) {
1712 return;
1713 }
1714 if (delegate->nweb_) {
1715 delegate->nweb_->FindAllAsync(searchStr);
1716 }
1717 },
1718 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSearchAllAsync");
1719 }
1720
ClearMatches()1721 void WebDelegate::ClearMatches()
1722 {
1723 auto context = context_.Upgrade();
1724 if (!context) {
1725 return;
1726 }
1727 context->GetTaskExecutor()->PostTask(
1728 [weak = WeakClaim(this)]() {
1729 auto delegate = weak.Upgrade();
1730 if (!delegate) {
1731 return;
1732 }
1733 if (delegate->nweb_) {
1734 delegate->nweb_->ClearMatches();
1735 }
1736 },
1737 TaskExecutor::TaskType::PLATFORM, "ArkUIWebClearMatches");
1738 }
1739
SearchNext(bool forward)1740 void WebDelegate::SearchNext(bool forward)
1741 {
1742 auto context = context_.Upgrade();
1743 if (!context) {
1744 return;
1745 }
1746 context->GetTaskExecutor()->PostTask(
1747 [weak = WeakClaim(this), forward]() {
1748 auto delegate = weak.Upgrade();
1749 if (!delegate) {
1750 return;
1751 }
1752 if (delegate->nweb_) {
1753 delegate->nweb_->FindNext(forward);
1754 }
1755 },
1756 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSearchNext");
1757 }
1758
ConverToWebHitTestType(int hitType)1759 int WebDelegate::ConverToWebHitTestType(int hitType)
1760 {
1761 WebHitTestType webHitType;
1762 switch (hitType) {
1763 case OHOS::NWeb::HitTestResult::UNKNOWN_TYPE:
1764 webHitType = WebHitTestType::UNKNOWN;
1765 break;
1766 case OHOS::NWeb::HitTestResult::ANCHOR_TYPE:
1767 webHitType = WebHitTestType::HTTP;
1768 break;
1769 case OHOS::NWeb::HitTestResult::PHONE_TYPE:
1770 webHitType = WebHitTestType::PHONE;
1771 break;
1772 case OHOS::NWeb::HitTestResult::GEO_TYPE:
1773 webHitType = WebHitTestType::MAP;
1774 break;
1775 case OHOS::NWeb::HitTestResult::EMAIL_TYPE:
1776 webHitType = WebHitTestType::EMAIL;
1777 break;
1778 case OHOS::NWeb::HitTestResult::IMAGE_TYPE:
1779 webHitType = WebHitTestType::IMG;
1780 break;
1781 case OHOS::NWeb::HitTestResult::IMAGE_ANCHOR_TYPE:
1782 webHitType = WebHitTestType::HTTP_IMG;
1783 break;
1784 case OHOS::NWeb::HitTestResult::SRC_ANCHOR_TYPE:
1785 webHitType = WebHitTestType::HTTP;
1786 break;
1787 case OHOS::NWeb::HitTestResult::SRC_IMAGE_ANCHOR_TYPE:
1788 webHitType = WebHitTestType::HTTP_IMG;
1789 break;
1790 case OHOS::NWeb::HitTestResult::EDIT_TEXT_TYPE:
1791 webHitType = WebHitTestType::EDIT;
1792 break;
1793 default:
1794 webHitType = WebHitTestType::UNKNOWN;
1795 break;
1796 }
1797 return static_cast<int>(webHitType);
1798 }
1799
GetLastHitTestResult()1800 int WebDelegate::GetLastHitTestResult()
1801 {
1802 if (nweb_) {
1803 std::shared_ptr<OHOS::NWeb::HitTestResult> nwebResult = nweb_->GetLastHitTestResult();
1804 if (nwebResult) {
1805 return ConverToWebHitTestType(nwebResult->GetType());
1806 }
1807 return ConverToWebHitTestType(OHOS::NWeb::HitTestResult::UNKNOWN_TYPE);
1808 }
1809 return static_cast<int>(WebHitTestType::UNKNOWN);
1810 }
1811
GetHitTestResult()1812 int WebDelegate::GetHitTestResult()
1813 {
1814 if (nweb_) {
1815 std::shared_ptr<OHOS::NWeb::HitTestResult> nwebResult = nweb_->GetHitTestResult();
1816 if (nwebResult) {
1817 return ConverToWebHitTestType(nwebResult->GetType());
1818 }
1819 return ConverToWebHitTestType(OHOS::NWeb::HitTestResult::UNKNOWN_TYPE);
1820 }
1821 return static_cast<int>(WebHitTestType::UNKNOWN);
1822 }
1823
SetFocusByPosition(float x,float y)1824 bool WebDelegate::SetFocusByPosition(float x, float y)
1825 {
1826 if (nweb_) {
1827 return nweb_->SetFocusByPosition(x, y);
1828 }
1829 return false;
1830 }
1831
GetHitTestValue(HitTestResult & result)1832 void WebDelegate::GetHitTestValue(HitTestResult& result)
1833 {
1834 if (nweb_) {
1835 std::shared_ptr<OHOS::NWeb::HitTestResult> nwebResult = nweb_->GetHitTestResult();
1836 if (nwebResult) {
1837 result.SetExtraData(nwebResult->GetExtra());
1838 result.SetHitType(ConverToWebHitTestType(nwebResult->GetType()));
1839 } else {
1840 result.SetHitType(ConverToWebHitTestType(OHOS::NWeb::HitTestResult::UNKNOWN_TYPE));
1841 }
1842 }
1843 }
1844
GetProgress()1845 int WebDelegate::GetProgress()
1846 {
1847 return nweb_ ? nweb_->PageLoadProgress() : 0;
1848 }
1849
GetPageHeight()1850 int WebDelegate::GetPageHeight()
1851 {
1852 if (nweb_) {
1853 return nweb_->ContentHeight();
1854 }
1855 return 0;
1856 }
1857
GetWebId()1858 int WebDelegate::GetWebId()
1859 {
1860 if (nweb_) {
1861 return nweb_->GetWebId();
1862 }
1863 return -1;
1864 }
1865
GetTitle()1866 std::string WebDelegate::GetTitle()
1867 {
1868 if (nweb_) {
1869 return nweb_->Title();
1870 }
1871 return "";
1872 }
1873
GetDefaultUserAgent()1874 std::string WebDelegate::GetDefaultUserAgent()
1875 {
1876 if (!nweb_) {
1877 return "";
1878 }
1879 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_->GetPreference();
1880 if (!setting) {
1881 return "";
1882 }
1883 return setting->DefaultUserAgent();
1884 }
1885
SaveCookieSync()1886 bool WebDelegate::SaveCookieSync()
1887 {
1888 if (cookieManager_) {
1889 return cookieManager_->Store();
1890 }
1891 return false;
1892 }
1893
SetCookie(const std::string & url,const std::string & value,bool incognitoMode)1894 bool WebDelegate::SetCookie(const std::string& url,
1895 const std::string& value,
1896 bool incognitoMode)
1897 {
1898 if (cookieManager_) {
1899 return cookieManager_->SetCookie(url, value, incognitoMode);
1900 }
1901 return false;
1902 }
1903
GetCookie(const std::string & url,bool incognitoMode) const1904 std::string WebDelegate::GetCookie(const std::string& url,
1905 bool incognitoMode) const
1906 {
1907 if (cookieManager_) {
1908 bool isValid = true;
1909 return cookieManager_->ReturnCookie(url, isValid, incognitoMode);
1910 }
1911 return "";
1912 }
1913
DeleteEntirelyCookie(bool incognitoMode)1914 void WebDelegate::DeleteEntirelyCookie(bool incognitoMode)
1915 {
1916 if (cookieManager_) {
1917 cookieManager_->DeleteCookieEntirely(nullptr, incognitoMode);
1918 }
1919 }
1920
CreatePluginResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)1921 void WebDelegate::CreatePluginResource(
1922 const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
1923 {
1924 state_ = State::CREATING;
1925 auto webCom = webComponent_.Upgrade();
1926 if (!webCom) {
1927 state_ = State::CREATEFAILED;
1928 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1929 return;
1930 }
1931
1932 auto pipelineContext = context.Upgrade();
1933 if (!pipelineContext) {
1934 state_ = State::CREATEFAILED;
1935 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to context is null");
1936 return;
1937 }
1938 context_ = context;
1939 taskExecutor_ = pipelineContext->GetTaskExecutor();
1940 CHECK_NULL_VOID(taskExecutor_);
1941 auto platformTaskExecutor =
1942 SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::PLATFORM);
1943 auto resRegister = pipelineContext->GetPlatformResRegister();
1944 auto weakRes = AceType::WeakClaim(AceType::RawPtr(resRegister));
1945 platformTaskExecutor.PostTask([weakWeb = AceType::WeakClaim(this), weakRes, size, position] {
1946 auto webDelegate = weakWeb.Upgrade();
1947 if (webDelegate == nullptr) {
1948 return;
1949 }
1950 auto webCom = webDelegate->webComponent_.Upgrade();
1951 if (!webCom) {
1952 webDelegate->OnError(NTC_ERROR, "fail to call WebDelegate::SetSrc PostTask");
1953 return;
1954 }
1955 auto resRegister = weakRes.Upgrade();
1956 if (!resRegister) {
1957 if (webDelegate->onError_) {
1958 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
1959 }
1960 return;
1961 }
1962 auto context = webDelegate->context_.Upgrade();
1963 if (!context) {
1964 return;
1965 }
1966
1967 std::string pageUrl;
1968 int32_t pageId;
1969 OHOS::Ace::Framework::DelegateClient::GetInstance().GetWebPageUrl(pageUrl, pageId);
1970
1971 std::stringstream paramStream;
1972 paramStream << NTC_PARAM_WEB << WEB_PARAM_EQUALS << webDelegate->id_ << WEB_PARAM_AND << NTC_PARAM_WIDTH
1973 << WEB_PARAM_EQUALS << size.Width() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_HEIGHT
1974 << WEB_PARAM_EQUALS << size.Height() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_LEFT
1975 << WEB_PARAM_EQUALS << position.GetX() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_TOP
1976 << WEB_PARAM_EQUALS << position.GetY() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_SRC
1977 << WEB_PARAM_EQUALS << webCom->GetSrc() << WEB_PARAM_AND << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS
1978 << pageUrl;
1979
1980 std::string param = paramStream.str();
1981 webDelegate->id_ = resRegister->CreateResource(WEB_CREATE, param);
1982 if (webDelegate->id_ == WEB_INVALID_ID) {
1983 if (webDelegate->onError_) {
1984 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
1985 }
1986 return;
1987 }
1988 webDelegate->state_ = State::CREATED;
1989 webDelegate->hash_ = webDelegate->MakeResourceHash();
1990 webDelegate->RegisterWebEvent();
1991 webDelegate->BindRouterBackMethod();
1992 webDelegate->BindPopPageSuccessMethod();
1993 webDelegate->BindIsPagePathInvalidMethod();
1994 }, "ArkUIWebCreatePluginResource");
1995 }
1996
InitWebEvent()1997 void WebDelegate::InitWebEvent()
1998 {
1999 auto webCom = webComponent_.Upgrade();
2000 if (!webCom) {
2001 state_ = State::CREATEFAILED;
2002 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
2003 return;
2004 }
2005 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
2006 if (!context) {
2007 state_ = State::CREATEFAILED;
2008 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
2009 return;
2010 }
2011 CHECK_NULL_VOID(context);
2012 if (!webCom->GetPageStartedEventId().IsEmpty()) {
2013 onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context);
2014 }
2015 if (!webCom->GetPageFinishedEventId().IsEmpty()) {
2016 onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context);
2017 }
2018 if (!webCom->GetPageErrorEventId().IsEmpty()) {
2019 onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context);
2020 }
2021 if (!webCom->GetMessageEventId().IsEmpty()) {
2022 onMessage_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetMessageEventId(), context);
2023 }
2024 if (!webCom->GetOnLoadStartedEventId().IsEmpty()) {
2025 onLoadStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetOnLoadStartedEventId(), context);
2026 }
2027 if (!webCom->GetOnLoadFinishedEventId().IsEmpty()) {
2028 onLoadFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetOnLoadFinishedEventId(), context);
2029 }
2030 }
2031
2032 #ifdef OHOS_STANDARD_SYSTEM
ShowWebView()2033 void WebDelegate::ShowWebView()
2034 {
2035 if (window_) {
2036 window_->Show();
2037 }
2038
2039 OnWebviewShow();
2040 }
2041
HideWebView()2042 void WebDelegate::HideWebView()
2043 {
2044 if (window_) {
2045 window_->Hide();
2046 }
2047
2048 OnWebviewHide();
2049 }
2050
IsActivePolicyDisable()2051 bool WebDelegate::IsActivePolicyDisable()
2052 {
2053 ACE_DCHECK(nweb_ != nullptr);
2054 if (nweb_) {
2055 return nweb_->IsActivePolicyDisable();
2056 }
2057 return false;
2058 }
2059
GetWebDestroyMode()2060 OHOS::NWeb::WebDestroyMode WebDelegate::GetWebDestroyMode()
2061 {
2062 CHECK_NULL_RETURN(nweb_ != nullptr,
2063 OHOS::NWeb::WebDestroyMode::NORMAL_MODE);
2064 if (nweb_) {
2065 return nweb_->GetWebDestroyMode();
2066 }
2067 return OHOS::NWeb::WebDestroyMode::NORMAL_MODE;
2068 }
2069
InitOHOSWeb(const RefPtr<PipelineBase> & context,const RefPtr<NG::RenderSurface> & surface)2070 void WebDelegate::InitOHOSWeb(const RefPtr<PipelineBase>& context, const RefPtr<NG::RenderSurface>& surface)
2071 {
2072 #ifdef ENABLE_ROSEN_BACKEND
2073 CHECK_NULL_VOID(context);
2074 auto rosenRenderSurface = DynamicCast<NG::RosenRenderSurface>(surface);
2075 if (!rosenRenderSurface) {
2076 if (PrepareInitOHOSWeb(context)) {
2077 if (!isCreateWebView_) {
2078 #ifndef ENABLE_ROSEN_BACKEND
2079 InitWebViewWithWindow();
2080 isCreateWebView_ = true;
2081 #endif
2082 }
2083 }
2084 return;
2085 }
2086 if (renderMode_ == static_cast<int32_t>(RenderMode::SYNC_RENDER)) {
2087 renderSurface_ = rosenRenderSurface;
2088 }
2089 SetSurface(rosenRenderSurface->GetSurface());
2090 InitOHOSWeb(context);
2091 #endif
2092 }
2093
PrepareInitOHOSWeb(const WeakPtr<PipelineBase> & context)2094 bool WebDelegate::PrepareInitOHOSWeb(const WeakPtr<PipelineBase>& context)
2095 {
2096 ACE_SCOPED_TRACE("PrepareInitOHOSWeb");
2097
2098 state_ = State::CREATING;
2099 // obtain hap data path
2100 auto container = Container::Current();
2101 if (container == nullptr) {
2102 return false;
2103 }
2104 const std::string& bundlePath = container->GetBundlePath();
2105 const std::string& filesDataPath = container->GetFilesDataPath();
2106 std::string baseDir = "base";
2107 std::size_t baseIndex = filesDataPath.find(baseDir);
2108 if (baseIndex == std::string::npos) {
2109 return false;
2110 }
2111 std::string dataPath = filesDataPath.substr(0, baseIndex + baseDir.length());
2112 bundlePath_ = bundlePath;
2113 bundleDataPath_ = dataPath;
2114 hapPath_ = container->GetWebHapPath();
2115 // get app temp dir
2116 tempDir_ = container->GetTempDir();
2117 // load webview so
2118 OHOS::NWeb::NWebHelper::Instance().SetBundlePath(bundlePath_);
2119 if (!OHOS::NWeb::NWebHelper::Instance().Init()) {
2120 return false;
2121 }
2122 auto webCom = webComponent_.Upgrade();
2123 auto webPattern = webPattern_.Upgrade();
2124 auto eventHub = webPattern ? webPattern->GetWebEventHub() : nullptr;
2125 auto useNewPipe = Container::IsCurrentUseNewPipeline();
2126 if (useNewPipe && !webPattern && !eventHub) {
2127 return false;
2128 }
2129 if (!useNewPipe && !webCom) {
2130 return false;
2131 }
2132 incognitoMode_ =
2133 useNewPipe ? webPattern->GetIncognitoMode() : webCom->GetIncognitoMode();
2134 auto sharedRenderProcessToken =
2135 useNewPipe ? webPattern->GetSharedRenderProcessToken() : webCom->GetSharedRenderProcessToken();
2136 sharedRenderProcessToken_ = sharedRenderProcessToken ? sharedRenderProcessToken.value() : "";
2137 context_ = context;
2138 RegisterSurfacePositionChangedCallback();
2139 auto pipelineContext = context.Upgrade();
2140 if (!pipelineContext) {
2141 return false;
2142 }
2143 taskExecutor_ = pipelineContext->GetTaskExecutor();
2144 state_ = State::CREATED;
2145
2146 SetWebCallBack();
2147 if (!pipelineContext->GetIsDeclarative()) {
2148 RegisterOHOSWebEventAndMethord();
2149 } else {
2150 auto oldContext = DynamicCast<PipelineContext>(pipelineContext);
2151
2152 onPageFinishedV2_ = useNewPipe ? eventHub->GetOnPageFinishedEvent()
2153 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2154 webCom->GetPageFinishedEventId(), oldContext);
2155 onPageStartedV2_ = useNewPipe ? eventHub->GetOnPageStartedEvent()
2156 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2157 webCom->GetPageStartedEventId(), oldContext);
2158 onTitleReceiveV2_ = useNewPipe ? eventHub->GetOnTitleReceiveEvent()
2159 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2160 webCom->GetTitleReceiveEventId(), oldContext);
2161 onFullScreenExitV2_ = useNewPipe ? eventHub->GetOnFullScreenExitEvent()
2162 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2163 webCom->GetOnFullScreenExitEventId(), oldContext);
2164 onGeolocationHideV2_ = useNewPipe ? eventHub->GetOnGeolocationHideEvent()
2165 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2166 webCom->GetGeolocationHideEventId(), oldContext);
2167 onGeolocationShowV2_ = useNewPipe ? eventHub->GetOnGeolocationShowEvent()
2168 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2169 webCom->GetGeolocationShowEventId(), oldContext);
2170 onErrorReceiveV2_ = useNewPipe ? eventHub->GetOnErrorReceiveEvent()
2171 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2172 webCom->GetPageErrorEventId(), oldContext);
2173 onHttpErrorReceiveV2_ = useNewPipe ? eventHub->GetOnHttpErrorReceiveEvent()
2174 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2175 webCom->GetHttpErrorEventId(), oldContext);
2176 onRequestFocusV2_ = useNewPipe ? eventHub->GetOnRequestFocusEvent()
2177 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2178 webCom->GetRequestFocusEventId(), oldContext);
2179 onDownloadStartV2_ = useNewPipe ? eventHub->GetOnDownloadStartEvent()
2180 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2181 webCom->GetDownloadStartEventId(), oldContext);
2182 onRenderExitedV2_ = useNewPipe ? eventHub->GetOnRenderExitedEvent()
2183 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2184 webCom->GetRenderExitedId(), oldContext);
2185 onRefreshAccessedHistoryV2_ = useNewPipe ? eventHub->GetOnRefreshAccessedHistoryEvent()
2186 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2187 webCom->GetRefreshAccessedHistoryId(), oldContext);
2188 onResourceLoadV2_ = useNewPipe ? eventHub->GetOnResourceLoadEvent()
2189 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2190 webCom->GetResourceLoadId(), oldContext);
2191 onScaleChangeV2_ = useNewPipe ? eventHub->GetOnScaleChangeEvent()
2192 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2193 webCom->GetScaleChangeId(), oldContext);
2194 onPermissionRequestV2_ = useNewPipe ? eventHub->GetOnPermissionRequestEvent()
2195 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2196 webCom->GetPermissionRequestEventId(), oldContext);
2197 onSearchResultReceiveV2_ = useNewPipe ? eventHub->GetOnSearchResultReceiveEvent()
2198 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2199 webCom->GetSearchResultReceiveEventId(), oldContext);
2200 onScrollV2_ = useNewPipe ? eventHub->GetOnScrollEvent()
2201 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2202 webCom->GetScrollId(), oldContext);
2203 onActivateContentV2_ = useNewPipe ? eventHub->GetOnActivateContentEvent()
2204 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2205 webCom->GetActivateContentEventId(), oldContext);
2206 onWindowExitV2_ = useNewPipe ? eventHub->GetOnWindowExitEvent()
2207 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2208 webCom->GetWindowExitEventId(), oldContext);
2209 onPageVisibleV2_ = useNewPipe ? eventHub->GetOnPageVisibleEvent() : nullptr;
2210 onTouchIconUrlV2_ = useNewPipe ? eventHub->GetOnTouchIconUrlEvent() : nullptr;
2211 onAudioStateChangedV2_ = GetAudioStateChangedCallback(useNewPipe, eventHub);
2212 onFirstContentfulPaintV2_ = useNewPipe ? eventHub->GetOnFirstContentfulPaintEvent() : nullptr;
2213 OnFirstMeaningfulPaintV2_ = useNewPipe ? eventHub->GetOnFirstMeaningfulPaintEvent() : nullptr;
2214 OnLargestContentfulPaintV2_ = useNewPipe ? eventHub->GetOnLargestContentfulPaintEvent() : nullptr;
2215 onSafeBrowsingCheckResultV2_ = useNewPipe ? eventHub->GetOnSafeBrowsingCheckResultEvent() : nullptr;
2216 onOverScrollV2_ = useNewPipe ? eventHub->GetOnOverScrollEvent()
2217 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2218 webCom->GetOverScrollId(), oldContext);
2219 onScreenCaptureRequestV2_ = useNewPipe ? eventHub->GetOnScreenCaptureRequestEvent() : nullptr;
2220 onNavigationEntryCommittedV2_ = useNewPipe ? eventHub->GetOnNavigationEntryCommittedEvent() : nullptr;
2221 OnNativeEmbedAllDestoryV2_ = useNewPipe ? eventHub->GetOnNativeEmbedLifecycleChangeEvent() : nullptr;
2222 OnNativeEmbedLifecycleChangeV2_ = useNewPipe ? eventHub->GetOnNativeEmbedLifecycleChangeEvent()
2223 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2224 webCom->GetNativeEmbedLifecycleChangeId(), oldContext);
2225 OnNativeEmbedVisibilityChangeV2_ = useNewPipe ? eventHub->GetOnNativeEmbedVisibilityChangeEvent()
2226 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2227 webCom->GetNativeEmbedVisibilityChangeId(), oldContext);
2228 OnNativeEmbedGestureEventV2_ = useNewPipe ? eventHub->GetOnNativeEmbedGestureEvent()
2229 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2230 webCom->GetNativeEmbedGestureEventId(), oldContext);
2231 OnNativeEmbedMouseEventV2_ = useNewPipe ? eventHub->GetOnNativeEmbedMouseEvent()
2232 : nullptr;
2233 onIntelligentTrackingPreventionResultV2_ = useNewPipe ?
2234 eventHub->GetOnIntelligentTrackingPreventionResultEvent() : nullptr;
2235 onRenderProcessNotRespondingV2_ = useNewPipe
2236 ? eventHub->GetOnRenderProcessNotRespondingEvent()
2237 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::
2238 Create(webCom->GetRenderProcessNotRespondingId(), oldContext);
2239 onRenderProcessRespondingV2_ = useNewPipe ? eventHub->GetOnRenderProcessRespondingEvent()
2240 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::
2241 Create(webCom->GetRenderProcessRespondingId(), oldContext);
2242 onViewportFitChangedV2_ = useNewPipe ? eventHub->GetOnViewportFitChangedEvent()
2243 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2244 webCom->GetViewportFitChangedId(), oldContext);
2245 onInterceptKeyboardAttachV2_ = useNewPipe ? eventHub->GetOnInterceptKeyboardAttachEvent()
2246 : nullptr;
2247 onAdsBlockedV2_ = useNewPipe ? eventHub->GetOnAdsBlockedEvent()
2248 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2249 webCom->GetAdsBlockedEventId(), oldContext);
2250 onLoadStartedV2_ = useNewPipe ? eventHub->GetOnLoadStartedEvent()
2251 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2252 webCom->GetOnLoadStartedEventId(), oldContext);
2253 onLoadFinishedV2_ = useNewPipe ? eventHub->GetOnLoadFinishedEvent()
2254 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
2255 webCom->GetOnLoadFinishedEventId(), oldContext);
2256 }
2257 return true;
2258 }
2259
OnSurfaceCreated(const sptr<OHOS::Surface> & surface)2260 void WebSurfaceCallback::OnSurfaceCreated(const sptr<OHOS::Surface>& surface) {}
2261
OnSurfaceChanged(const sptr<OHOS::Surface> & surface,int32_t width,int32_t height)2262 void WebSurfaceCallback::OnSurfaceChanged(const sptr<OHOS::Surface>& surface, int32_t width, int32_t height)
2263 {
2264 auto delegate = delegate_.Upgrade();
2265 if (!delegate) {
2266 return;
2267 }
2268 delegate->Resize((double)width, (double)height);
2269 }
2270
OnSurfaceDestroyed()2271 void WebSurfaceCallback::OnSurfaceDestroyed() {}
2272
GLGetConfig(int version,EGLDisplay eglDisplay)2273 EGLConfig WebDelegate::GLGetConfig(int version, EGLDisplay eglDisplay)
2274 {
2275 int attribList[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8,
2276 EGL_ALPHA_SIZE, 8, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE };
2277 EGLConfig configs = NULL;
2278 int configsNum;
2279 if (!eglChooseConfig(eglDisplay, attribList, &configs, 1, &configsNum)) {
2280 return NULL;
2281 }
2282 return configs;
2283 }
2284
GLContextInit(void * window)2285 void WebDelegate::GLContextInit(void* window)
2286 {
2287 if (!window) {
2288 return;
2289 }
2290 mEglWindow = static_cast<EGLNativeWindowType>(window);
2291
2292 // 1. create sharedcontext
2293 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
2294 if (mEGLDisplay == EGL_NO_DISPLAY) {
2295 return;
2296 }
2297
2298 EGLint eglMajVers, eglMinVers;
2299 if (!eglInitialize(mEGLDisplay, &eglMajVers, &eglMinVers)) {
2300 mEGLDisplay = EGL_NO_DISPLAY;
2301 return;
2302 }
2303
2304 mEGLConfig = GLGetConfig(EGLCONFIG_VERSION, mEGLDisplay);
2305 if (mEGLConfig == nullptr) {
2306 return;
2307 }
2308
2309 // 2. Create EGL Surface from Native Window
2310 mEGLSurface = eglCreateWindowSurface(mEGLDisplay, mEGLConfig, mEglWindow, nullptr);
2311 if (mEGLSurface == nullptr) {
2312 return;
2313 }
2314
2315 // 3. Create EGLContext from
2316 int attrib3_list[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
2317
2318 mEGLContext = eglCreateContext(mEGLDisplay, mEGLConfig, mSharedEGLContext, attrib3_list);
2319
2320 if (!eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
2321 return;
2322 }
2323
2324 glViewport(offset_.GetX(), offset_.GetY(), drawSize_.Width(), drawSize_.Height());
2325 glClearColor(1.0, 1.0, 1.0, 1.0);
2326 glClear(GL_COLOR_BUFFER_BIT);
2327
2328 glFlush();
2329 glFinish();
2330 eglSwapBuffers(mEGLDisplay, mEGLSurface);
2331
2332 eglDestroySurface(mEGLDisplay, mEGLSurface);
2333 eglDestroyContext(mEGLDisplay, mEGLContext);
2334 }
2335
InitWebSurfaceDelegate(const WeakPtr<PipelineBase> & context)2336 bool WebDelegate::InitWebSurfaceDelegate(const WeakPtr<PipelineBase>& context)
2337 {
2338 auto pipelineContext = context.Upgrade();
2339 if (!pipelineContext) {
2340 return false;
2341 }
2342 uint32_t windowId = pipelineContext->GetWindowId();
2343 surfaceDelegate_ = new OHOS::SurfaceDelegate(windowId);
2344 if (surfaceDelegate_ == nullptr) {
2345 return false;
2346 }
2347 surfaceCallback_ = new WebSurfaceCallback(AceType::WeakClaim(this));
2348 if (surfaceCallback_ == nullptr) {
2349 return false;
2350 }
2351 surfaceDelegate_->AddSurfaceCallback(surfaceCallback_);
2352 surfaceDelegate_->CreateSurface();
2353 SetBoundsOrResize(drawSize_, offset_);
2354 needResizeAtFirst_ = true;
2355 auto aNativeSurface = surfaceDelegate_->GetNativeWindow();
2356 if (aNativeSurface == nullptr) {
2357 return false;
2358 }
2359 GLContextInit(aNativeSurface);
2360 surfaceInfo_.window = aNativeSurface;
2361 return true;
2362 }
2363
InitOHOSWeb(const WeakPtr<PipelineBase> & context)2364 void WebDelegate::InitOHOSWeb(const WeakPtr<PipelineBase>& context)
2365 {
2366 if (!PrepareInitOHOSWeb(context)) {
2367 return;
2368 }
2369 if (!isCreateWebView_) {
2370 isCreateWebView_ = true;
2371 if (isEnhanceSurface_) {
2372 if (!InitWebSurfaceDelegate(context)) {
2373 return;
2374 }
2375 InitWebViewWithSurface();
2376 } else {
2377 #ifdef ENABLE_ROSEN_BACKEND
2378 InitWebViewWithSurface();
2379 #else
2380 InitWebViewWithWindow();
2381 #endif
2382 }
2383 }
2384 }
RegisterOHOSWebEventAndMethord()2385 void WebDelegate::RegisterOHOSWebEventAndMethord()
2386 {
2387 auto reloadCallback = [weak = WeakClaim(this)]() {
2388 auto delegate = weak.Upgrade();
2389 if (!delegate) {
2390 return false;
2391 }
2392 delegate->Reload();
2393 return true;
2394 };
2395 WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
2396
2397 auto webCom = webComponent_.Upgrade();
2398 CHECK_NULL_VOID(webCom);
2399 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
2400 CHECK_NULL_VOID(context);
2401 if (!webCom->GetPageStartedEventId().IsEmpty()) {
2402 onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context);
2403 }
2404 if (!webCom->GetPageFinishedEventId().IsEmpty()) {
2405 onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context);
2406 }
2407 if (!webCom->GetPageErrorEventId().IsEmpty()) {
2408 onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context);
2409 }
2410 if (!webCom->GetOnLoadStartedEventId().IsEmpty()) {
2411 onLoadStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetOnLoadStartedEventId(), context);
2412 }
2413 if (!webCom->GetOnLoadFinishedEventId().IsEmpty()) {
2414 onLoadFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetOnLoadFinishedEventId(), context);
2415 }
2416 }
2417
NotifyPopupWindowResult(bool result)2418 void WebDelegate::NotifyPopupWindowResult(bool result)
2419 {
2420 if (parentNWebId_ != -1) {
2421 std::shared_ptr<OHOS::NWeb::NWeb> parentNWeb = OHOS::NWeb::NWebHelper::Instance().GetNWeb(parentNWebId_);
2422 if (parentNWeb) {
2423 parentNWeb->NotifyPopupWindowResult(result);
2424 }
2425 }
2426 }
2427
RunSetWebIdAndHapPathCallback()2428 void WebDelegate::RunSetWebIdAndHapPathCallback()
2429 {
2430 CHECK_NULL_VOID(nweb_);
2431 auto webId = nweb_->GetWebId();
2432
2433 #ifdef NG_BUILD
2434 auto pattern = webPattern_.Upgrade();
2435 CHECK_NULL_VOID(pattern);
2436 auto setWebIdCallback = pattern->GetSetWebIdCallback();
2437 CHECK_NULL_VOID(setWebIdCallback);
2438 setWebIdCallback(webId);
2439 if (!hapPath_.empty()) {
2440 auto setHapPathCallback = pattern->GetSetHapPathCallback();
2441 CHECK_NULL_VOID(setHapPathCallback);
2442 setHapPathCallback(hapPath_);
2443 }
2444 auto onControllerAttachedCallback = pattern->GetOnControllerAttachedCallback();
2445 if (onControllerAttachedCallback) {
2446 onControllerAttachedCallback();
2447 }
2448 NotifyPopupWindowResult(true);
2449 return;
2450 #else
2451 if (Container::IsCurrentUseNewPipeline()) {
2452 auto pattern = webPattern_.Upgrade();
2453 CHECK_NULL_VOID(pattern);
2454 auto setWebIdCallback = pattern->GetSetWebIdCallback();
2455 CHECK_NULL_VOID(setWebIdCallback);
2456 setWebIdCallback(webId);
2457 if (!hapPath_.empty()) {
2458 auto setHapPathCallback = pattern->GetSetHapPathCallback();
2459 CHECK_NULL_VOID(setHapPathCallback);
2460 setHapPathCallback(hapPath_);
2461 }
2462 auto onControllerAttachedCallback = pattern->GetOnControllerAttachedCallback();
2463 if (onControllerAttachedCallback) {
2464 onControllerAttachedCallback();
2465 }
2466 NotifyPopupWindowResult(true);
2467 return;
2468 }
2469 auto webCom = webComponent_.Upgrade();
2470 CHECK_NULL_VOID(webCom);
2471 auto setWebIdCallback = webCom->GetSetWebIdCallback();
2472 CHECK_NULL_VOID(setWebIdCallback);
2473 setWebIdCallback(webId);
2474 if (!hapPath_.empty()) {
2475 auto setHapPathCallback = webCom->GetSetHapPathCallback();
2476 CHECK_NULL_VOID(setHapPathCallback);
2477 setHapPathCallback(hapPath_);
2478 }
2479 NotifyPopupWindowResult(true);
2480 #endif
2481 }
2482
RunJsProxyCallback()2483 void WebDelegate::RunJsProxyCallback()
2484 {
2485 #ifdef NG_BUILD
2486 auto pattern = webPattern_.Upgrade();
2487 CHECK_NULL_VOID(pattern);
2488 pattern->CallJsProxyCallback();
2489 return;
2490 #else
2491 if (Container::IsCurrentUseNewPipeline()) {
2492 auto pattern = webPattern_.Upgrade();
2493 CHECK_NULL_VOID(pattern);
2494 pattern->CallJsProxyCallback();
2495 return;
2496 }
2497 auto webCom = webComponent_.Upgrade();
2498 CHECK_NULL_VOID(webCom);
2499 webCom->CallJsProxyCallback();
2500 #endif
2501 }
2502
RegisterConfigObserver()2503 void WebDelegate::RegisterConfigObserver()
2504 {
2505 auto context = context_.Upgrade();
2506 if (!context) {
2507 return;
2508 }
2509 context->GetTaskExecutor()->PostTask(
2510 [weak = WeakClaim(this)]() {
2511 auto delegate = weak.Upgrade();
2512 CHECK_NULL_VOID(delegate);
2513 CHECK_NULL_VOID(delegate->nweb_);
2514 auto abilityContext = OHOS::AbilityRuntime::Context::GetApplicationContext();
2515 CHECK_NULL_VOID(abilityContext);
2516 delegate->configChangeObserver_ = std::make_shared<WebConfigurationObserver>(delegate);
2517 if (delegate->configChangeObserver_) {
2518 abilityContext->RegisterEnvironmentCallback(delegate->configChangeObserver_);
2519 }
2520 },
2521 TaskExecutor::TaskType::PLATFORM, "ArkUIWebAddConfigObserver");
2522 }
2523
UnRegisterConfigObserver()2524 void WebDelegate::UnRegisterConfigObserver()
2525 {
2526 auto context = context_.Upgrade();
2527 if (!context) {
2528 return;
2529 }
2530 context->GetTaskExecutor()->PostTask(
2531 [weak = WeakClaim(this)]() {
2532 auto delegate = weak.Upgrade();
2533 CHECK_NULL_VOID(delegate);
2534 CHECK_NULL_VOID(delegate->nweb_);
2535 CHECK_NULL_VOID(delegate->configChangeObserver_);
2536 auto abilityContext = OHOS::AbilityRuntime::Context::GetApplicationContext();
2537 CHECK_NULL_VOID(abilityContext);
2538 abilityContext->UnregisterEnvironmentCallback(delegate->configChangeObserver_);
2539 delegate->configChangeObserver_.reset();
2540 },
2541 TaskExecutor::TaskType::PLATFORM, "ArkUIWebRemoveConfigObserver");
2542 }
2543
SetWebCallBack()2544 void WebDelegate::SetWebCallBack()
2545 {
2546 RefPtr<WebController> webController;
2547 if (Container::IsCurrentUseNewPipeline()) {
2548 auto pattern = webPattern_.Upgrade();
2549 webController = pattern ? pattern->GetWebController() : nullptr;
2550 } else {
2551 auto webCom = webComponent_.Upgrade();
2552 webController = webCom ? webCom->GetController() : nullptr;
2553 }
2554 if (webController) {
2555 auto context = context_.Upgrade();
2556 if (!context) {
2557 return;
2558 }
2559 auto uiTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::UI);
2560 webController->SetLoadUrlImpl([weak = WeakClaim(this), uiTaskExecutor](
2561 std::string url, const std::map<std::string, std::string>& httpHeaders) {
2562 uiTaskExecutor.PostTask([weak, url, httpHeaders]() {
2563 auto delegate = weak.Upgrade();
2564 if (delegate) {
2565 delegate->LoadUrl(url, httpHeaders);
2566 }
2567 }, "ArkUIWebControllerLoadUrl");
2568 });
2569 webController->SetBackwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2570 uiTaskExecutor.PostTask([weak]() {
2571 auto delegate = weak.Upgrade();
2572 if (delegate) {
2573 delegate->Backward();
2574 }
2575 }, "ArkUIWebBackward");
2576 });
2577 webController->SetForwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2578 uiTaskExecutor.PostTask([weak]() {
2579 auto delegate = weak.Upgrade();
2580 if (delegate) {
2581 delegate->Forward();
2582 }
2583 }, "ArkUIWebForward");
2584 });
2585 webController->SetClearHistoryImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2586 uiTaskExecutor.PostTask([weak]() {
2587 auto delegate = weak.Upgrade();
2588 if (delegate) {
2589 delegate->ClearHistory();
2590 }
2591 }, "ArkUIWebClearHistory");
2592 });
2593 webController->SetClearSslCacheImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2594 uiTaskExecutor.PostTask([weak]() {
2595 auto delegate = weak.Upgrade();
2596 if (delegate) {
2597 delegate->ClearSslCache();
2598 }
2599 }, "ArkUIWebControllerClearSslCache");
2600 });
2601 webController->SetClearClientAuthenticationCacheImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2602 uiTaskExecutor.PostTask([weak]() {
2603 auto delegate = weak.Upgrade();
2604 if (delegate) {
2605 delegate->ClearClientAuthenticationCache();
2606 }
2607 }, "ArkUIWebControllerClearClientAuthnCache");
2608 });
2609 webController->SetAccessStepImpl([weak = WeakClaim(this)](int32_t step) {
2610 auto delegate = weak.Upgrade();
2611 if (delegate) {
2612 return delegate->AccessStep(step);
2613 }
2614 return false;
2615 });
2616 webController->SetBackOrForwardImpl([weak = WeakClaim(this)](int32_t step) {
2617 auto delegate = weak.Upgrade();
2618 if (delegate) {
2619 delegate->BackOrForward(step);
2620 }
2621 });
2622 webController->SetAccessBackwardImpl([weak = WeakClaim(this)]() {
2623 auto delegate = weak.Upgrade();
2624 if (delegate) {
2625 return delegate->AccessBackward();
2626 }
2627 return false;
2628 });
2629 webController->SetAccessForwardImpl([weak = WeakClaim(this)]() {
2630 auto delegate = weak.Upgrade();
2631 if (delegate) {
2632 return delegate->AccessForward();
2633 }
2634 return false;
2635 });
2636 webController->SetExecuteTypeScriptImpl([weak = WeakClaim(this), uiTaskExecutor](std::string jscode,
2637 std::function<void(const std::string)>&& callback) {
2638 uiTaskExecutor.PostTask([weak, jscode, callback]() {
2639 auto delegate = weak.Upgrade();
2640 if (delegate) {
2641 delegate->ExecuteTypeScript(jscode, std::move(callback));
2642 }
2643 }, "ArkUIWebExecuteTypeScript");
2644 });
2645 webController->SetLoadDataWithBaseUrlImpl(
2646 [weak = WeakClaim(this), uiTaskExecutor](std::string baseUrl, std::string data, std::string mimeType,
2647 std::string encoding, std::string historyUrl) {
2648 uiTaskExecutor.PostTask([weak, baseUrl, data, mimeType, encoding, historyUrl]() {
2649 auto delegate = weak.Upgrade();
2650 if (delegate) {
2651 delegate->LoadDataWithBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
2652 }
2653 }, "ArkUIWebControllerLoadDataWithBaseUrl");
2654 });
2655 webController->SetRefreshImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2656 uiTaskExecutor.PostTask([weak]() {
2657 auto delegate = weak.Upgrade();
2658 if (delegate) {
2659 delegate->Refresh();
2660 }
2661 }, "ArkUIWebControllerRefresh");
2662 });
2663 webController->SetStopLoadingImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2664 uiTaskExecutor.PostTask([weak]() {
2665 auto delegate = weak.Upgrade();
2666 if (delegate) {
2667 delegate->StopLoading();
2668 }
2669 }, "ArkUIWebControllerStopLoading");
2670 });
2671 webController->SetGetHitTestResultImpl([weak = WeakClaim(this)]() {
2672 auto delegate = weak.Upgrade();
2673 if (delegate) {
2674 return delegate->GetHitTestResult();
2675 }
2676 return 0;
2677 });
2678 webController->SetGetHitTestValueImpl([weak = WeakClaim(this)](HitTestResult& result) {
2679 auto delegate = weak.Upgrade();
2680 if (delegate) {
2681 delegate->GetHitTestValue(result);
2682 }
2683 });
2684 webController->SetGetProgressImpl([weak = WeakClaim(this)]() {
2685 auto delegate = weak.Upgrade();
2686 return delegate ? delegate->GetProgress() : 0;
2687 });
2688 webController->SetGetPageHeightImpl([weak = WeakClaim(this)]() {
2689 auto delegate = weak.Upgrade();
2690 if (delegate) {
2691 return delegate->GetPageHeight();
2692 }
2693 return 0;
2694 });
2695 webController->SetGetWebIdImpl([weak = WeakClaim(this)]() {
2696 auto delegate = weak.Upgrade();
2697 if (delegate) {
2698 return delegate->GetWebId();
2699 }
2700 return -1;
2701 });
2702 webController->SetGetTitleImpl([weak = WeakClaim(this)]() {
2703 auto delegate = weak.Upgrade();
2704 if (delegate) {
2705 return delegate->GetTitle();
2706 }
2707 return std::string();
2708 });
2709 webController->SetCreateMsgPortsImpl([weak = WeakClaim(this)](std::vector<RefPtr<WebMessagePort>>& ports) {
2710 auto delegate = weak.Upgrade();
2711 if (delegate) {
2712 delegate->CreateWebMessagePorts(ports);
2713 }
2714 });
2715 webController->SetPostWebMessageImpl([weak = WeakClaim(this)](std::string& message,
2716 std::vector<RefPtr<WebMessagePort>>& ports, std::string& uri) {
2717 auto delegate = weak.Upgrade();
2718 if (delegate) {
2719 delegate->PostWebMessage(message, ports, uri);
2720 }
2721 });
2722 webController->SetGetDefaultUserAgentImpl([weak = WeakClaim(this)]() {
2723 auto delegate = weak.Upgrade();
2724 if (delegate) {
2725 return delegate->GetDefaultUserAgent();
2726 }
2727 return std::string();
2728 });
2729 webController->SetSaveCookieSyncImpl([weak = WeakClaim(this)]() {
2730 auto delegate = weak.Upgrade();
2731 if (delegate) {
2732 return delegate->SaveCookieSync();
2733 }
2734 return false;
2735 });
2736 webController->SetSetCookieImpl([weak = WeakClaim(this)](const std::string& url, const std::string& value) {
2737 auto delegate = weak.Upgrade();
2738 if (delegate) {
2739 return delegate->SetCookie(url, value, delegate->incognitoMode_);
2740 }
2741 return false;
2742 });
2743 webController->SetGetCookieImpl([weak = WeakClaim(this)](const std::string& url) {
2744 auto delegate = weak.Upgrade();
2745 if (delegate) {
2746 return delegate->GetCookie(url, delegate->incognitoMode_);
2747 }
2748 return std::string();
2749 });
2750 webController->SetDeleteEntirelyCookieImpl([weak = WeakClaim(this)]() {
2751 auto delegate = weak.Upgrade();
2752 if (delegate) {
2753 delegate->DeleteEntirelyCookie(delegate->incognitoMode_);
2754 }
2755 });
2756 webController->SetWebViewJavaScriptResultCallBackImpl(
2757 [weak = WeakClaim(this), uiTaskExecutor](WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl) {
2758 uiTaskExecutor.PostTask([weak, javaScriptCallBackImpl]() {
2759 auto delegate = weak.Upgrade();
2760 if (delegate) {
2761 delegate->SetWebViewJavaScriptResultCallBack(std::move(javaScriptCallBackImpl));
2762 }
2763 }, "ArkUIWebControllerSetJsResultCallBack");
2764 });
2765 webController->SetAddJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](std::string objectName,
2766 const std::vector<std::string>& methodList) {
2767 uiTaskExecutor.PostTask([weak, objectName, methodList]() {
2768 auto delegate = weak.Upgrade();
2769 if (delegate) {
2770 delegate->AddJavascriptInterface(objectName, methodList);
2771 }
2772 }, "ArkUIWebControllerAddJsInterface");
2773 });
2774 webController->LoadInitJavascriptInterface();
2775 webController->SetRemoveJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](std::string objectName,
2776 const std::vector<std::string>& methodList) {
2777 uiTaskExecutor.PostTask([weak, objectName, methodList]() {
2778 auto delegate = weak.Upgrade();
2779 if (delegate) {
2780 delegate->RemoveJavascriptInterface(objectName, methodList);
2781 }
2782 }, "ArkUIWebControllerRemoveJsInterface");
2783 });
2784 webController->SetOnInactiveImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2785 uiTaskExecutor.PostTask([weak]() {
2786 auto delegate = weak.Upgrade();
2787 if (delegate) {
2788 delegate->OnInactive();
2789 }
2790 }, "ArkUIWebInactiveCallback");
2791 });
2792 webController->SetOnActiveImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2793 uiTaskExecutor.PostTask([weak]() {
2794 auto delegate = weak.Upgrade();
2795 if (delegate) {
2796 delegate->OnActive();
2797 }
2798 }, "ArkUIWebActiveCallback");
2799 });
2800 webController->SetZoomImpl([weak = WeakClaim(this), uiTaskExecutor](float factor) {
2801 uiTaskExecutor.PostTask([weak, factor]() {
2802 auto delegate = weak.Upgrade();
2803 if (delegate) {
2804 delegate->Zoom(factor);
2805 }
2806 }, "ArkUIWebSetZoomFactor");
2807 });
2808 webController->SetZoomInImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2809 bool result = false;
2810 uiTaskExecutor.PostSyncTask([weak, &result]() {
2811 auto delegate = weak.Upgrade();
2812 if (delegate) {
2813 result = delegate->ZoomIn();
2814 }
2815 }, "ArkUIWebControllerZoomIn");
2816 return result;
2817 });
2818 webController->SetZoomOutImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2819 bool result = false;
2820 uiTaskExecutor.PostSyncTask([weak, &result]() {
2821 auto delegate = weak.Upgrade();
2822 if (delegate) {
2823 result = delegate->ZoomOut();
2824 }
2825 }, "ArkUIWebControllerZoomOut");
2826 return result;
2827 });
2828 webController->SetRequestFocusImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2829 uiTaskExecutor.PostTask([weak]() {
2830 auto delegate = weak.Upgrade();
2831 if (delegate) {
2832 delegate->RequestFocus();
2833 }
2834 }, "ArkUIWebControllerRequestFocus");
2835 });
2836
2837 webController->SetSearchAllAsyncImpl([weak = WeakClaim(this), uiTaskExecutor](const std::string& searchStr) {
2838 uiTaskExecutor.PostTask([weak, searchStr]() {
2839 auto delegate = weak.Upgrade();
2840 if (delegate) {
2841 delegate->SearchAllAsync(searchStr);
2842 }
2843 }, "ArkUIWebControllerSearchAllAsync");
2844 });
2845 webController->SetClearMatchesImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2846 uiTaskExecutor.PostTask([weak]() {
2847 auto delegate = weak.Upgrade();
2848 if (delegate) {
2849 delegate->ClearMatches();
2850 }
2851 }, "ArkUIWebControllerClearMatches");
2852 });
2853 webController->SetSearchNextImpl([weak = WeakClaim(this), uiTaskExecutor](bool forward) {
2854 uiTaskExecutor.PostTask([weak, forward]() {
2855 auto delegate = weak.Upgrade();
2856 if (delegate) {
2857 delegate->SearchNext(forward);
2858 }
2859 }, "ArkUIWebControllerSearchNext");
2860 });
2861 webController->SetGetUrlImpl([weak = WeakClaim(this)]() {
2862 auto delegate = weak.Upgrade();
2863 if (delegate) {
2864 return delegate->GetUrl();
2865 }
2866 return std::string();
2867 });
2868 } else {
2869 TAG_LOGW(AceLogTag::ACE_WEB, "web controller is nullptr");
2870 }
2871 }
2872
InitWebViewWithWindow()2873 void WebDelegate::InitWebViewWithWindow()
2874 {
2875 auto context = context_.Upgrade();
2876 CHECK_NULL_VOID(context);
2877 context->GetTaskExecutor()->PostTask(
2878 [weak = WeakClaim(this)]() {
2879 auto delegate = weak.Upgrade();
2880 if (!delegate) {
2881 return;
2882 }
2883 std::shared_ptr<OHOS::NWeb::NWebEngineInitArgsImpl> initArgs =
2884 std::make_shared<OHOS::NWeb::NWebEngineInitArgsImpl>();
2885 std::string app_path = GetDataPath();
2886 if (!app_path.empty()) {
2887 initArgs->AddArg(std::string("--user-data-dir=").append(app_path));
2888 }
2889
2890 delegate->window_ = delegate->CreateWindow();
2891 if (!delegate->window_) {
2892 return;
2893 }
2894
2895 initArgs->SetSharedRenderProcessToken(delegate->sharedRenderProcessToken_);
2896 delegate->nweb_ =
2897 OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
2898 delegate->window_.GetRefPtr(), initArgs,
2899 delegate->incognitoMode_);
2900 if (delegate->nweb_ == nullptr) {
2901 delegate->window_ = nullptr;
2902 return;
2903 }
2904
2905 delegate->JavaScriptOnDocumentStartByOrder();
2906 delegate->JavaScriptOnDocumentEndByOrder();
2907 delegate->JavaScriptOnDocumentStart();
2908 delegate->JavaScriptOnDocumentEnd();
2909
2910 delegate->JavaScriptOnHeadReadyByOrder();
2911 delegate->cookieManager_ = OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
2912 if (delegate->cookieManager_ == nullptr) {
2913 return;
2914 }
2915 auto webviewClient = std::make_shared<WebClientImpl>();
2916 webviewClient->SetWebDelegate(weak);
2917 delegate->nweb_->SetNWebHandler(webviewClient);
2918
2919 // Set downloadListenerImpl
2920 auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>();
2921 downloadListenerImpl->SetWebDelegate(weak);
2922 delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
2923
2924 auto findListenerImpl = std::make_shared<FindListenerImpl>();
2925 findListenerImpl->SetWebDelegate(weak);
2926 delegate->nweb_->PutFindCallback(findListenerImpl);
2927
2928 auto spanstringConvertHtmlImpl = std::make_shared<SpanstringConvertHtmlImpl>(Container::CurrentId());
2929 spanstringConvertHtmlImpl->SetWebDelegate(weak);
2930 delegate->nweb_->PutSpanstringConvertHtmlCallback(spanstringConvertHtmlImpl);
2931
2932 std::optional<std::string> src;
2933 auto isNewPipe = Container::IsCurrentUseNewPipeline();
2934 delegate->UpdateSettting(isNewPipe);
2935 if (isNewPipe) {
2936 auto webPattern = delegate->webPattern_.Upgrade();
2937 if (webPattern) {
2938 src = webPattern->GetWebSrc();
2939 }
2940 } else {
2941 auto webCom = delegate->webComponent_.Upgrade();
2942 if (webCom) {
2943 src = webCom->GetSrc();
2944 }
2945 }
2946 if (src) {
2947 delegate->nweb_->Load(src.value());
2948 }
2949 delegate->window_->Show();
2950 },
2951 TaskExecutor::TaskType::PLATFORM, "ArkUIWebInitWebViewWithWindow");
2952 }
2953
UpdateSettting(bool useNewPipe)2954 void WebDelegate::UpdateSettting(bool useNewPipe)
2955 {
2956 CHECK_NULL_VOID(nweb_);
2957 auto setting = nweb_->GetPreference();
2958 CHECK_NULL_VOID(setting);
2959 #ifdef NG_BUILD
2960 auto webPattern = webPattern_.Upgrade();
2961 CHECK_NULL_VOID(webPattern);
2962 setting->PutDomStorageEnabled(webPattern->GetDomStorageAccessEnabledValue(false));
2963 setting->PutJavaScriptEnabled(webPattern->GetJsEnabledValue(true));
2964 setting->PutEnableRawFileAccess(webPattern->GetFileAccessEnabledValue(true));
2965 setting->PutEnableContentAccess(true);
2966 setting->PutLoadImageFromNetworkDisabled(!webPattern->GetOnLineImageAccessEnabledValue(true));
2967 setting->PutImageLoadingAllowed(webPattern->GetImageAccessEnabledValue(true));
2968 setting->PutAccessModeForSecureOriginLoadFromInsecure(static_cast<OHOS::NWeb::NWebPreference::AccessMode>(
2969 webPattern->GetMixedModeValue(MixedModeContent::MIXED_CONTENT_NEVER_ALLOW)));
2970 setting->PutZoomingFunctionEnabled(webPattern->GetZoomAccessEnabledValue(true));
2971 setting->PutGeolocationAllowed(webPattern->GetGeolocationAccessEnabledValue(true));
2972 setting->PutCacheMode(
2973 static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(webPattern->GetCacheModeValue(WebCacheMode::DEFAULT)));
2974 setting->PutLoadWithOverviewMode(webPattern->GetOverviewModeAccessEnabledValue(true));
2975 setting->PutEnableRawFileAccessFromFileURLs(webPattern->GetFileFromUrlAccessEnabledValue(true));
2976 setting->PutDatabaseAllowed(webPattern->GetDatabaseAccessEnabledValue(false));
2977 setting->PutZoomingForTextFactor(webPattern->GetTextZoomRatioValue(DEFAULT_TEXT_ZOOM_RATIO));
2978 setting->PutMediaPlayGestureAccess(webPattern->GetMediaPlayGestureAccessValue(true));
2979 return;
2980 #else
2981 if (useNewPipe) {
2982 auto webPattern = webPattern_.Upgrade();
2983 CHECK_NULL_VOID(webPattern);
2984 setting->PutDomStorageEnabled(webPattern->GetDomStorageAccessEnabledValue(false));
2985 setting->PutJavaScriptEnabled(webPattern->GetJsEnabledValue(true));
2986 setting->PutEnableRawFileAccess(webPattern->GetFileAccessEnabledValue(true));
2987 setting->PutEnableContentAccess(true);
2988 setting->PutLoadImageFromNetworkDisabled(!webPattern->GetOnLineImageAccessEnabledValue(true));
2989 setting->PutImageLoadingAllowed(webPattern->GetImageAccessEnabledValue(true));
2990 setting->PutAccessModeForSecureOriginLoadFromInsecure(static_cast<OHOS::NWeb::NWebPreference::AccessMode>(
2991 webPattern->GetMixedModeValue(MixedModeContent::MIXED_CONTENT_NEVER_ALLOW)));
2992 setting->PutZoomingFunctionEnabled(webPattern->GetZoomAccessEnabledValue(true));
2993 setting->PutGeolocationAllowed(webPattern->GetGeolocationAccessEnabledValue(true));
2994 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(
2995 webPattern->GetCacheModeValue(WebCacheMode::DEFAULT)));
2996 setting->PutLoadWithOverviewMode(webPattern->GetOverviewModeAccessEnabledValue(true));
2997 setting->PutEnableRawFileAccessFromFileURLs(webPattern->GetFileFromUrlAccessEnabledValue(true));
2998 setting->PutDatabaseAllowed(webPattern->GetDatabaseAccessEnabledValue(false));
2999 setting->PutZoomingForTextFactor(webPattern->GetTextZoomRatioValue(DEFAULT_TEXT_ZOOM_RATIO));
3000 setting->PutMediaPlayGestureAccess(webPattern->GetMediaPlayGestureAccessValue(true));
3001 return;
3002 }
3003 auto component = webComponent_.Upgrade();
3004 CHECK_NULL_VOID(component);
3005 setting->PutDomStorageEnabled(component->GetDomStorageAccessEnabled());
3006 setting->PutJavaScriptEnabled(component->GetJsEnabled());
3007 setting->PutEnableRawFileAccess(component->GetFileAccessEnabled());
3008 setting->PutEnableContentAccess(component->GetContentAccessEnabled());
3009 setting->PutLoadImageFromNetworkDisabled(component->GetOnLineImageAccessEnabled());
3010 setting->PutImageLoadingAllowed(component->GetImageAccessEnabled());
3011 setting->PutAccessModeForSecureOriginLoadFromInsecure(
3012 static_cast<OHOS::NWeb::NWebPreference::AccessMode>(component->GetMixedMode()));
3013 setting->PutZoomingFunctionEnabled(component->GetZoomAccessEnabled());
3014 setting->PutGeolocationAllowed(component->GetGeolocationAccessEnabled());
3015 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(component->GetCacheMode()));
3016 setting->PutLoadWithOverviewMode(component->GetOverviewModeAccessEnabled());
3017 setting->PutEnableRawFileAccessFromFileURLs(component->GetFileFromUrlAccessEnabled());
3018 setting->PutDatabaseAllowed(component->GetDatabaseAccessEnabled());
3019 setting->PutZoomingForTextFactor(component->GetTextZoomRatio());
3020 setting->PutMediaPlayGestureAccess(component->IsMediaPlayGestureAccess());
3021 #endif
3022 }
3023
GetCustomScheme()3024 std::string WebDelegate::GetCustomScheme()
3025 {
3026 std::string customScheme;
3027 if (Container::IsCurrentUseNewPipeline()) {
3028 auto webPattern = webPattern_.Upgrade();
3029 if (webPattern) {
3030 auto webData = webPattern->GetCustomScheme();
3031 if (webData) {
3032 customScheme = webData.value();
3033 }
3034 }
3035 } else {
3036 auto webCom = webComponent_.Upgrade();
3037 if (webCom) {
3038 customScheme = webCom->GetCustomScheme();
3039 }
3040 }
3041 return customScheme;
3042 }
3043
SurfaceOcclusionCallback(float visibleRatio)3044 void WebDelegate::SurfaceOcclusionCallback(float visibleRatio)
3045 {
3046 TAG_LOGI(AceLogTag::ACE_WEB,
3047 "SurfaceOcclusion changed, occlusionPoints:%{public}f, surfacenode id: %{public}" PRIu64 "", visibleRatio,
3048 surfaceNodeId_);
3049 if (fabs(visibleRatio_ - visibleRatio) <= FLT_EPSILON || (fabs(visibleRatio) > FLT_EPSILON && visibleRatio < 0.0) ||
3050 (fabs(visibleRatio - 1.0) > FLT_EPSILON && visibleRatio > 1.0)) {
3051 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio is ilegal or not changed.");
3052 return;
3053 }
3054 visibleRatio_ = visibleRatio;
3055 if (fabs(visibleRatio_) > FLT_EPSILON && visibleRatio_ > 0.0) {
3056 CHECK_NULL_VOID(nweb_);
3057 nweb_->OnUnoccluded();
3058 if (isHalfFrame_) {
3059 if (fabs(visibleRatio_ - lowerFrameRateVisibleRatio_) <= FLT_EPSILON ||
3060 visibleRatio_ < lowerFrameRateVisibleRatio_) {
3061 nweb_->SetEnableLowerFrameRate(true);
3062 nweb_->SetEnableHalfFrameRate(false);
3063 } else if (fabs(visibleRatio_ - halfFrameRateVisibleRatio_) <= FLT_EPSILON ||
3064 visibleRatio_ < halfFrameRateVisibleRatio_) {
3065 nweb_->SetEnableLowerFrameRate(false);
3066 nweb_->SetEnableHalfFrameRate(true);
3067 } else {
3068 nweb_->SetEnableLowerFrameRate(false);
3069 nweb_->SetEnableHalfFrameRate(false);
3070 }
3071 } else {
3072 if (fabs(visibleRatio_ - lowerFrameRateVisibleRatio_) <= FLT_EPSILON ||
3073 visibleRatio_ < lowerFrameRateVisibleRatio_) {
3074 nweb_->SetEnableLowerFrameRate(true);
3075 } else {
3076 nweb_->SetEnableLowerFrameRate(false);
3077 }
3078 }
3079 } else {
3080 auto context = context_.Upgrade();
3081 CHECK_NULL_VOID(context);
3082 CHECK_NULL_VOID(context->GetTaskExecutor());
3083 context->GetTaskExecutor()->PostDelayedTask(
3084 [weak = WeakClaim(this)]() {
3085 auto delegate = weak.Upgrade();
3086 CHECK_NULL_VOID(delegate);
3087 if (fabs(delegate->visibleRatio_) <= FLT_EPSILON) {
3088 TAG_LOGI(AceLogTag::ACE_WEB, "the web is still all occluded");
3089 CHECK_NULL_VOID(delegate->nweb_);
3090 delegate->nweb_->OnOccluded();
3091 }
3092 }, TaskExecutor::TaskType::UI, delayTime_, "ArkUIWebOccluded");
3093 }
3094 }
3095
ratioStrToFloat(const std::string & str)3096 void WebDelegate::ratioStrToFloat(const std::string& str)
3097 {
3098 // LowerFrameRateConfig format x.xx, len is 4, [0.00, 1.00]
3099 if (str.size() != VISIBLERATIO_LENGTH) {
3100 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio lenth is over 4.");
3101 return;
3102 }
3103 auto dotCount = std::count(str.begin(), str.end(), '.');
3104 if (dotCount != 1) {
3105 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio does not have dot.");
3106 return;
3107 }
3108 auto pos = str.find('.', 0);
3109 if (pos != 1) {
3110 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio dot position is wrong.");
3111 return;
3112 }
3113 auto notDigitCount = std::count_if(str.begin(), str.end(), [](char c) { return !isdigit(c) && c != '.'; });
3114 if (notDigitCount > 0) {
3115 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio dot count is over 1.");
3116 return;
3117 }
3118 float f = std::stof(str);
3119 int i = f * VISIBLERATIO_FLOAT_TO_INT;
3120 if (i >= 0 && i <= VISIBLERATIO_FLOAT_TO_INT) {
3121 TAG_LOGI(AceLogTag::ACE_WEB, "visibleRatio check success.");
3122 lowerFrameRateVisibleRatio_ = f;
3123 }
3124 }
3125
ratioStrToFloatV2(const std::string & str)3126 void WebDelegate::ratioStrToFloatV2(const std::string& str)
3127 {
3128 // LowerFrameRateConfig format x.xx, len is 4, [0.00, 1.00]
3129 if (str.size() != VISIBLERATIO_LENGTH) {
3130 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio lenth is over 4.");
3131 return;
3132 }
3133 auto dotCount = std::count(str.begin(), str.end(), '.');
3134 if (dotCount != 1) {
3135 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio does not have dot.");
3136 return;
3137 }
3138 auto pos = str.find('.', 0);
3139 if (pos != 1) {
3140 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio dot position is wrong.");
3141 return;
3142 }
3143 auto notDigitCount = std::count_if(str.begin(), str.end(), [](char c) { return !isdigit(c) && c != '.'; });
3144 if (notDigitCount > 0) {
3145 TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio dot count is over 1.");
3146 return;
3147 }
3148 float f = std::stof(str);
3149 int i = f * VISIBLERATIO_FLOAT_TO_INT;
3150 if (i >= 0 && i <= VISIBLERATIO_FLOAT_TO_INT) {
3151 TAG_LOGI(AceLogTag::ACE_WEB, "visibleRatio check success.");
3152 halfFrameRateVisibleRatio_ = f;
3153 }
3154 }
3155
SetPartitionPoints(std::vector<float> & partition)3156 void WebDelegate::SetPartitionPoints(std::vector<float>& partition)
3157 {
3158 if (isHalfFrame_) {
3159 TAG_LOGI(AceLogTag::ACE_WEB, "max visible rate to half frame rate:%{public}f", halfFrameRateVisibleRatio_);
3160 if ((int)(halfFrameRateVisibleRatio_ * VISIBLERATIO_FLOAT_TO_INT) == 0) {
3161 partition = { 0 };
3162 } else if ((int)(lowerFrameRateVisibleRatio_ * VISIBLERATIO_FLOAT_TO_INT) == 0) {
3163 partition = { 0, halfFrameRateVisibleRatio_ };
3164 } else {
3165 partition = { 0, lowerFrameRateVisibleRatio_, halfFrameRateVisibleRatio_ };
3166 }
3167 } else {
3168 if ((int)(lowerFrameRateVisibleRatio_ * VISIBLERATIO_FLOAT_TO_INT) == 0) {
3169 partition = { 0 };
3170 } else {
3171 partition = { 0, lowerFrameRateVisibleRatio_ };
3172 }
3173 }
3174 }
RegisterSurfaceOcclusionChangeFun()3175 void WebDelegate::RegisterSurfaceOcclusionChangeFun()
3176 {
3177 if (!GetWebOptimizationValue()) {
3178 TAG_LOGI(AceLogTag::ACE_WEB, "web optimization is close.");
3179 return;
3180 }
3181 if (!IsDeviceTabletOr2in1()) {
3182 TAG_LOGI(AceLogTag::ACE_WEB, "device type does not satisfy.");
3183 return;
3184 }
3185 std::string visibleAreaRatio =
3186 OHOS::NWeb::NWebAdapterHelper::Instance().ParsePerfConfig("LowerFrameRateConfig", "visibleAreaRatio");
3187 std::string visibleAreaRatioV2 =
3188 OHOS::NWeb::NWebAdapterHelper::Instance().ParsePerfConfig("LowerFrameRateConfig", "visibleAreaRatioV2");
3189 ratioStrToFloat(visibleAreaRatio);
3190 ratioStrToFloatV2(visibleAreaRatioV2);
3191 isHalfFrame_ = (lowerFrameRateVisibleRatio_ < halfFrameRateVisibleRatio_ ? true : false);
3192 std::vector<float> partitionPoints;
3193 TAG_LOGI(AceLogTag::ACE_WEB, "max visible rate to lower frame rate:%{public}f", lowerFrameRateVisibleRatio_);
3194 SetPartitionPoints(partitionPoints);
3195 auto ret = OHOS::Rosen::RSInterfaces::GetInstance().RegisterSurfaceOcclusionChangeCallback(
3196 surfaceNodeId_,
3197 [weak = WeakClaim(this)](float visibleRatio) {
3198 auto delegate = weak.Upgrade();
3199 CHECK_NULL_VOID(delegate);
3200 auto context = delegate->context_.Upgrade();
3201 CHECK_NULL_VOID(context);
3202 context->GetTaskExecutor()->PostTask(
3203 [weakDelegate = weak, webVisibleRatio = visibleRatio]() {
3204 auto delegate = weakDelegate.Upgrade();
3205 CHECK_NULL_VOID(delegate);
3206 delegate->SurfaceOcclusionCallback(webVisibleRatio);
3207 },
3208 TaskExecutor::TaskType::UI, "ArkUIWebOcclusionChange");
3209 },
3210 partitionPoints);
3211 if (ret != Rosen::StatusCode::SUCCESS) {
3212 TAG_LOGW(AceLogTag::ACE_WEB,
3213 "RegisterSurfaceOcclusionChangeCallback failed, surfacenode id:%{public}" PRIu64 ""
3214 ", ret: %{public}" PRIu32 "",
3215 surfaceNodeId_, ret);
3216 return;
3217 }
3218 TAG_LOGI(AceLogTag::ACE_WEB,
3219 "RegisterSurfaceOcclusionChangeCallback succeed, surfacenode id:%{public}" PRIu64 ""
3220 ", ret: %{public}" PRIu32 "",
3221 surfaceNodeId_, ret);
3222 }
3223
RegisterAvoidAreaChangeListener(int32_t instanceId)3224 void WebDelegate::RegisterAvoidAreaChangeListener(int32_t instanceId)
3225 {
3226 constexpr static int32_t PLATFORM_VERSION_TEN = 10;
3227 auto container = AceType::DynamicCast<Platform::AceContainer>(Container::GetContainer(instanceId));
3228 CHECK_NULL_VOID(container);
3229 auto pipeline = container->GetPipelineContext();
3230 if (pipeline && pipeline->GetMinPlatformVersion() >= PLATFORM_VERSION_TEN &&
3231 (pipeline->GetIsAppWindow() || container->IsUIExtensionWindow())) {
3232 if (avoidAreaChangedListener_) return;
3233
3234 systemSafeArea_ = container->GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType::TYPE_SYSTEM);
3235 cutoutSafeArea_ = container->GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType::TYPE_CUTOUT);
3236 navigationIndicatorSafeArea_ =
3237 container->GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR);
3238 OnSafeInsetsChange();
3239 auto context = context_.Upgrade();
3240 CHECK_NULL_VOID(context);
3241 avoidAreaChangedListener_ = new WebAvoidAreaChangedListener(AceType::WeakClaim(this), context);
3242 OHOS::Rosen::WMError regCode = container->RegisterAvoidAreaChangeListener(avoidAreaChangedListener_);
3243 TAG_LOGI(AceLogTag::ACE_WEB, "RegisterAvoidAreaChangeListener result:%{public}d", (int) regCode);
3244 } else {
3245 TAG_LOGI(AceLogTag::ACE_WEB, "CANNOT RegisterAvoidAreaChangeListener");
3246 }
3247 }
3248
RegisterWebWindowFocusChangedListener()3249 void WebDelegate::RegisterWebWindowFocusChangedListener()
3250 {
3251 auto container = AceType::DynamicCast<Platform::AceContainer>(Container::Current());
3252 CHECK_NULL_VOID(container);
3253 int32_t instanceId = container->GetInstanceId();
3254 auto window = Platform::AceContainer::GetUIWindow(instanceId);
3255 CHECK_NULL_VOID(window);
3256 if (webWindowFocusChangedListener_) {
3257 return;
3258 }
3259 webWindowFocusChangedListener_ = new WebWindowFocusChangedListener(AceType::WeakClaim(this));
3260 OHOS::Rosen::WMError result = window->RegisterLifeCycleListener(webWindowFocusChangedListener_);
3261 if (OHOS::Rosen::WMError::WM_OK == result) {
3262 TAG_LOGE(AceLogTag::ACE_WEB, "Dragdrop, RegisterWebWindowFocusChangedListener after drop action success.");
3263 } else {
3264 TAG_LOGI(AceLogTag::ACE_WEB,
3265 "Dragdrop, RegisterWebWindowFocusChangedListener after drop action fail. result:%{public}d", (int) result);
3266 webWindowFocusChangedListener_ = nullptr;
3267 }
3268 }
3269
UnRegisterWebWindowFocusChangedListener()3270 void WebDelegate::UnRegisterWebWindowFocusChangedListener()
3271 {
3272 CHECK_NULL_VOID(webWindowFocusChangedListener_);
3273 auto container = AceType::DynamicCast<Platform::AceContainer>(Container::Current());
3274 CHECK_NULL_VOID(container);
3275 int32_t instanceId = container->GetInstanceId();
3276 auto window = Platform::AceContainer::GetUIWindow(instanceId);
3277 CHECK_NULL_VOID(window);
3278 OHOS::Rosen::WMError result = window->UnregisterLifeCycleListener(webWindowFocusChangedListener_);
3279 if (OHOS::Rosen::WMError::WM_OK == result) {
3280 webWindowFocusChangedListener_ = nullptr;
3281 TAG_LOGE(AceLogTag::ACE_WEB, "Dragdrop, UnRegisterWebWindowFocusChangedListener success.");
3282 } else {
3283 TAG_LOGI(AceLogTag::ACE_WEB,
3284 "Dragdrop, UnRegisterWebWindowFocusChangedListener fail. result:%{public}d", (int) result);
3285 }
3286 }
3287
OnDragAttach()3288 void WebDelegate::OnDragAttach()
3289 {
3290 if (nweb_) {
3291 TAG_LOGI(AceLogTag::ACE_WEB, "Dragdrop, after drop action, OnDragAttach");
3292 nweb_->OnDragAttach();
3293 }
3294 }
3295
3296 class NWebAutoFillCallbackImpl : public OHOS::NWeb::NWebMessageValueCallback {
3297 public:
NWebAutoFillCallbackImpl(const WeakPtr<WebDelegate> & delegate)3298 NWebAutoFillCallbackImpl(const WeakPtr<WebDelegate>& delegate) : delegate_(delegate) {}
3299 ~NWebAutoFillCallbackImpl() = default;
3300
OnReceiveValue(std::shared_ptr<NWebMessage> result)3301 void OnReceiveValue(std::shared_ptr<NWebMessage> result) override
3302 {
3303 TAG_LOGI(AceLogTag::ACE_AUTO_FILL, "called");
3304 auto delegate = delegate_.Upgrade();
3305 CHECK_NULL_VOID(delegate);
3306 bool ret = delegate->HandleAutoFillEvent(result);
3307 result->SetType(NWebValue::Type::BOOLEAN);
3308 result->SetBoolean(ret);
3309 }
3310
OnReceiveValueV2(std::shared_ptr<NWebHapValue> value)3311 void OnReceiveValueV2(std::shared_ptr<NWebHapValue> value) override
3312 {
3313 TAG_LOGI(AceLogTag::ACE_AUTO_FILL, "called");
3314 auto delegate = delegate_.Upgrade();
3315 CHECK_NULL_VOID(delegate);
3316 bool ret = delegate->HandleAutoFillEvent(value);
3317 value->SetType(NWebHapValue::Type::BOOLEAN);
3318 value->SetBool(ret);
3319 }
3320
3321 private:
3322 WeakPtr<WebDelegate> delegate_;
3323 };
3324
UnregisterAvoidAreaChangeListener(int32_t instanceId)3325 void WebDelegate::UnregisterAvoidAreaChangeListener(int32_t instanceId)
3326 {
3327 constexpr static int32_t PLATFORM_VERSION_TEN = 10;
3328 auto container = AceType::DynamicCast<Platform::AceContainer>(Container::GetContainer(instanceId));
3329 CHECK_NULL_VOID(container);
3330 auto pipeline = container->GetPipelineContext();
3331 if (pipeline && pipeline->GetMinPlatformVersion() >= PLATFORM_VERSION_TEN &&
3332 (pipeline->GetIsAppWindow() || container->IsUIExtensionWindow())) {
3333 if (!avoidAreaChangedListener_) return;
3334 OHOS::Rosen::WMError regCode = container->UnregisterAvoidAreaChangeListener(avoidAreaChangedListener_);
3335 avoidAreaChangedListener_ = nullptr;
3336 TAG_LOGI(AceLogTag::ACE_WEB, "UnregisterAvoidAreaChangeListener result:%{public}d", (int) regCode);
3337 } else {
3338 TAG_LOGI(AceLogTag::ACE_WEB, "CANNOT UnregisterAvoidAreaChangeListener");
3339 }
3340 }
3341
InitWebViewWithSurface()3342 void WebDelegate::InitWebViewWithSurface()
3343 {
3344 auto context = context_.Upgrade();
3345 CHECK_NULL_VOID(context);
3346 auto window = context->GetWindow();
3347 CHECK_NULL_VOID(window);
3348 rosenWindowId_ = window->GetWindowId();
3349 context->GetTaskExecutor()->PostTask(
3350 [weak = WeakClaim(this), context = context_, renderMode = renderMode_, layoutMode = layoutMode_]() {
3351 auto delegate = weak.Upgrade();
3352 CHECK_NULL_VOID(delegate);
3353 std::shared_ptr<OHOS::NWeb::NWebEngineInitArgsImpl> initArgs =
3354 std::make_shared<OHOS::NWeb::NWebEngineInitArgsImpl>();
3355 initArgs->AddArg(std::string("--user-data-dir=").append(delegate->bundleDataPath_));
3356 initArgs->AddArg(std::string("--bundle-installation-dir=").append(delegate->bundlePath_));
3357 initArgs->AddArg(std::string("--lang=").append(AceApplicationInfo::GetInstance().GetLanguage() +
3358 "-" + AceApplicationInfo::GetInstance().GetCountryOrRegion()));
3359 initArgs->AddArg(std::string("--user-api-version=").append(
3360 std::to_string(AceApplicationInfo::GetInstance().GetApiTargetVersion())));
3361 bool isEnhanceSurface = delegate->isEnhanceSurface_;
3362 initArgs->SetIsEnhanceSurface(isEnhanceSurface);
3363 initArgs->SetIsPopup(delegate->isPopup_);
3364 initArgs->SetSharedRenderProcessToken(delegate->sharedRenderProcessToken_);
3365
3366 if (!delegate->hapPath_.empty()) {
3367 initArgs->AddArg(std::string("--user-hap-path=").append(delegate->hapPath_));
3368 }
3369
3370 if (!delegate->tempDir_.empty()) {
3371 initArgs->AddArg(std::string("--ohos-temp-dir=").append(delegate->tempDir_));
3372 }
3373
3374 std::string customScheme = delegate->GetCustomScheme();
3375 if (!customScheme.empty()) {
3376 initArgs->AddArg(std::string("--ohos-custom-scheme=").append(customScheme));
3377 }
3378 initArgs->AddArg(std::string("--init-background-color=")
3379 .append(std::to_string(delegate->backgroundColor_)));
3380 if (delegate->richtextData_) {
3381 // Created a richtext component
3382 initArgs->AddArg(std::string("--init-richtext-data=").append(delegate->richtextData_.value()));
3383 }
3384 if (isEnhanceSurface) {
3385 TAG_LOGD(AceLogTag::ACE_WEB, "Create webview with isEnhanceSurface");
3386 delegate->nweb_ = OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
3387 (void *)(&delegate->surfaceInfo_),
3388 initArgs,
3389 delegate->drawSize_.Width(),
3390 delegate->drawSize_.Height(),
3391 delegate->incognitoMode_);
3392
3393 delegate->JavaScriptOnDocumentStartByOrder();
3394 delegate->JavaScriptOnDocumentEndByOrder();
3395 delegate->JavaScriptOnDocumentStart();
3396 delegate->JavaScriptOnDocumentEnd();
3397 delegate->JavaScriptOnHeadReadyByOrder();
3398 } else {
3399 #ifdef ENABLE_ROSEN_BACKEND
3400 wptr<Surface> surfaceWeak(delegate->surface_);
3401 sptr<Surface> surface = surfaceWeak.promote();
3402 CHECK_NULL_VOID(surface);
3403 delegate->nweb_ = OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
3404 surface,
3405 initArgs,
3406 delegate->drawSize_.Width(),
3407 delegate->drawSize_.Height(),
3408 delegate->incognitoMode_);
3409
3410 delegate->JavaScriptOnDocumentStartByOrder();
3411 delegate->JavaScriptOnDocumentEndByOrder();
3412 delegate->JavaScriptOnDocumentStart();
3413 delegate->JavaScriptOnDocumentEnd();
3414 delegate->JavaScriptOnHeadReadyByOrder();
3415 #endif
3416 }
3417 CHECK_NULL_VOID(delegate->nweb_);
3418 delegate->cookieManager_ = OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
3419 CHECK_NULL_VOID(delegate->cookieManager_);
3420 auto nweb_handler = std::make_shared<WebClientImpl>();
3421 nweb_handler->SetWebDelegate(weak);
3422 auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>();
3423 downloadListenerImpl->SetWebDelegate(weak);
3424 delegate->nweb_->SetNWebHandler(nweb_handler);
3425 delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
3426 #ifdef OHOS_STANDARD_SYSTEM
3427 auto screenLockCallback = std::make_shared<NWebScreenLockCallbackImpl>(context);
3428 delegate->nweb_->RegisterScreenLockFunction(Container::CurrentId(), screenLockCallback);
3429 auto autoFillCallback = std::make_shared<NWebAutoFillCallbackImpl>(weak);
3430 delegate->nweb_->SetAutofillCallback(autoFillCallback);
3431 #endif
3432 auto findListenerImpl = std::make_shared<FindListenerImpl>();
3433 findListenerImpl->SetWebDelegate(weak);
3434 delegate->nweb_->PutFindCallback(findListenerImpl);
3435 delegate->UpdateSettting(Container::IsCurrentUseNewPipeline());
3436 delegate->RunSetWebIdAndHapPathCallback();
3437 delegate->RunJsProxyCallback();
3438 auto releaseSurfaceListenerImpl = std::make_shared<ReleaseSurfaceImpl>();
3439 releaseSurfaceListenerImpl->SetSurfaceDelegate(delegate->GetSurfaceDelegateClient());
3440 releaseSurfaceListenerImpl->SetWebDelegate(weak);
3441 delegate->nweb_->PutReleaseSurfaceCallback(releaseSurfaceListenerImpl);
3442 auto upgradeContext = context.Upgrade();
3443 CHECK_NULL_VOID(upgradeContext);
3444 auto window_id = upgradeContext->GetWindowId();
3445 auto foucus_window_id = upgradeContext->GetFocusWindowId();
3446 delegate->nweb_->SetWindowId(window_id);
3447 if (sptr<Rosen::Window> window = OHOS::Rosen::Window::GetWindowWithId(window_id)) {
3448 delegate->nweb_->SetPrivacyStatus(window->IsPrivacyMode());
3449 }
3450 delegate->nweb_->SetVisibility(delegate->isVisible_);
3451 delegate->nweb_->SetFocusWindowId(foucus_window_id);
3452 delegate->SetToken();
3453 delegate->RegisterSurfaceOcclusionChangeFun();
3454 delegate->nweb_->SetDrawMode(renderMode);
3455 delegate->nweb_->SetFitContentMode(layoutMode);
3456 delegate->RegisterConfigObserver();
3457 auto spanstringConvertHtmlImpl = std::make_shared<SpanstringConvertHtmlImpl>(Container::CurrentId());
3458 spanstringConvertHtmlImpl->SetWebDelegate(weak);
3459 delegate->nweb_->PutSpanstringConvertHtmlCallback(spanstringConvertHtmlImpl);
3460 auto pattern = delegate->webPattern_.Upgrade();
3461 CHECK_NULL_VOID(pattern);
3462 pattern->InitDataDetector();
3463 pattern->InitAIDetectResult();
3464 },
3465 TaskExecutor::TaskType::PLATFORM, "ArkUIWebInitWebViewWithSurface");
3466 }
3467
SetKeepScreenOn(bool key)3468 void WebDelegate::SetKeepScreenOn(bool key)
3469 {
3470 auto context = context_.Upgrade();
3471 CHECK_NULL_VOID(context);
3472 auto window = context->GetWindow();
3473 CHECK_NULL_VOID(window);
3474 window->SetViewKeepScreenOn(key);
3475 }
3476
UpdateUserAgent(const std::string & userAgent)3477 void WebDelegate::UpdateUserAgent(const std::string& userAgent)
3478 {
3479 auto context = context_.Upgrade();
3480 if (!context) {
3481 return;
3482 }
3483 context->GetTaskExecutor()->PostTask(
3484 [weak = WeakClaim(this), userAgent]() {
3485 auto delegate = weak.Upgrade();
3486 if (delegate && delegate->nweb_) {
3487 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3488 CHECK_NULL_VOID(setting);
3489 setting->PutUserAgent(userAgent);
3490 }
3491 },
3492 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateUserAgent");
3493 }
3494
UpdateBackgroundColor(const int backgroundColor)3495 void WebDelegate::UpdateBackgroundColor(const int backgroundColor)
3496 {
3497 auto context = context_.Upgrade();
3498 if (!context) {
3499 return;
3500 }
3501 context->GetTaskExecutor()->PostTask(
3502 [weak = WeakClaim(this), backgroundColor]() {
3503 auto delegate = weak.Upgrade();
3504 if (delegate && delegate->nweb_) {
3505 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3506 delegate->nweb_->PutBackgroundColor(backgroundColor);
3507 }
3508 },
3509 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBackgroundColor");
3510 }
3511
UpdateInitialScale(float scale)3512 void WebDelegate::UpdateInitialScale(float scale)
3513 {
3514 auto context = context_.Upgrade();
3515 if (!context) {
3516 return;
3517 }
3518 context->GetTaskExecutor()->PostTask(
3519 [weak = WeakClaim(this), scale]() {
3520 auto delegate = weak.Upgrade();
3521 if (delegate && delegate->nweb_) {
3522 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3523 delegate->nweb_->InitialScale(scale);
3524 }
3525 },
3526 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateInitialScale");
3527 }
3528
UpdateLayoutMode(WebLayoutMode mode)3529 void WebDelegate::UpdateLayoutMode(WebLayoutMode mode)
3530 {
3531 auto context = context_.Upgrade();
3532 if (!context) {
3533 return;
3534 }
3535 context->GetTaskExecutor()->PostTask(
3536 [weak = WeakClaim(this), mode]() {
3537 auto delegate = weak.Upgrade();
3538 if (delegate && delegate->nweb_) {
3539 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3540 delegate->nweb_->SetFitContentMode(static_cast<int32_t>(mode));
3541 }
3542 },
3543 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateLayoutMode");
3544 }
3545
SetSurfaceDensity(const double & density)3546 void WebDelegate::SetSurfaceDensity(const double& density)
3547 {
3548 if (density_ == density || density == 0.0) {
3549 return;
3550 }
3551 density_ = density;
3552 auto context = context_.Upgrade();
3553 if (!context) {
3554 return;
3555 }
3556 context->GetTaskExecutor()->PostTask(
3557 [weak = WeakClaim(this), density]() {
3558 auto delegate = weak.Upgrade();
3559 if (delegate && delegate->nweb_) {
3560 delegate->nweb_->SetSurfaceDensity(density);
3561 }
3562 },
3563 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetSurfaceDensity");
3564 }
3565
Resize(const double & width,const double & height,bool isKeyboard)3566 void WebDelegate::Resize(const double& width, const double& height, bool isKeyboard)
3567 {
3568 if (width <= 0 || height <= 0) {
3569 return;
3570 }
3571
3572 if ((resizeWidth_ == width) && (resizeHeight_ == height)) {
3573 return;
3574 }
3575 resizeWidth_ = width;
3576 resizeHeight_ = height;
3577 auto context = context_.Upgrade();
3578 if (!context) {
3579 return;
3580 }
3581 context->GetTaskExecutor()->PostTask(
3582 [weak = WeakClaim(this), width, height, isKeyboard]() {
3583 auto delegate = weak.Upgrade();
3584 if (delegate && delegate->nweb_ && !delegate->window_) {
3585 // Sur need int value, greater than this value in case show black line.
3586 delegate->nweb_->Resize(std::ceil(width), std::ceil(height), isKeyboard);
3587 double offsetX = 0;
3588 double offsetY = 0;
3589 delegate->UpdateScreenOffSet(offsetX, offsetY);
3590 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
3591 }
3592 },
3593 TaskExecutor::TaskType::PLATFORM, "ArkUIWebResize");
3594 auto webPattern = webPattern_.Upgrade();
3595 CHECK_NULL_VOID(webPattern);
3596 webPattern->SetDrawSize(width, height);
3597 webPattern->DestroyAnalyzerOverlay();
3598 }
3599
3600
DragResize(const double & width,const double & height,const double & pre_height,const double & pre_width)3601 void WebDelegate::DragResize(const double& width, const double& height,
3602 const double& pre_height, const double& pre_width)
3603 {
3604 if (width <= 0 || height <= 0) {
3605 return;
3606 }
3607 auto context = context_.Upgrade();
3608 if (!context) {
3609 return;
3610 }
3611 context->GetTaskExecutor()->PostTask(
3612 [weak = WeakClaim(this), width, height, pre_height, pre_width]() {
3613 auto delegate = weak.Upgrade();
3614 if (delegate && delegate->nweb_ && !delegate->window_) {
3615 // Sur need int value, greater than this value in case show black line.
3616 delegate->nweb_->DragResize(std::ceil(width), std::ceil(height),
3617 std::ceil(pre_height), std::ceil(pre_width));
3618 double offsetX = 0;
3619 double offsetY = 0;
3620 delegate->UpdateScreenOffSet(offsetX, offsetY);
3621 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
3622 }
3623 },
3624 TaskExecutor::TaskType::PLATFORM, "ArkUIWebDragResize");
3625 }
3626
GetIsSmoothDragResizeEnabled()3627 bool WebDelegate::GetIsSmoothDragResizeEnabled()
3628 {
3629 if (!nweb_) {
3630 return false;
3631 }
3632 bool isBrowserUsage = nweb_->IsNWebEx();
3633 if (OHOS::system::GetDeviceType() != "2in1" || !isBrowserUsage) {
3634 TAG_LOGD(AceLogTag::ACE_WEB, "Smooth drag resize only support browser in 2in1");
3635 return false;
3636 }
3637 return true;
3638 }
3639
SetDragResizeStartFlag(bool isDragResizeStart)3640 void WebDelegate::SetDragResizeStartFlag(bool isDragResizeStart)
3641 {
3642 isDragResizeStart_ = isDragResizeStart;
3643 }
3644
SetDragResizePreSize(const double & pre_height,const double & pre_width)3645 void WebDelegate::SetDragResizePreSize(const double& pre_height, const double& pre_width)
3646 {
3647 dragResize_preHight_ = pre_height;
3648 dragResize_preWidth_ = pre_width;
3649 }
3650
UpdateJavaScriptEnabled(const bool & isJsEnabled)3651 void WebDelegate::UpdateJavaScriptEnabled(const bool& isJsEnabled)
3652 {
3653 auto context = context_.Upgrade();
3654 if (!context) {
3655 return;
3656 }
3657 context->GetTaskExecutor()->PostTask(
3658 [weak = WeakClaim(this), isJsEnabled]() {
3659 auto delegate = weak.Upgrade();
3660 if (delegate && delegate->nweb_) {
3661 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3662 CHECK_NULL_VOID(setting);
3663 setting->PutJavaScriptEnabled(isJsEnabled);
3664 }
3665 },
3666 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateJavaScriptEnabled");
3667 }
3668
UpdateAllowFileAccess(const bool & isFileAccessEnabled)3669 void WebDelegate::UpdateAllowFileAccess(const bool& isFileAccessEnabled)
3670 {
3671 auto context = context_.Upgrade();
3672 if (!context) {
3673 return;
3674 }
3675 context->GetTaskExecutor()->PostTask(
3676 [weak = WeakClaim(this), isFileAccessEnabled]() {
3677 auto delegate = weak.Upgrade();
3678 if (delegate && delegate->nweb_) {
3679 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3680 CHECK_NULL_VOID(setting);
3681 setting->PutEnableRawFileAccess(isFileAccessEnabled);
3682 }
3683 },
3684 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAllowFileAccess");
3685 }
3686
UpdateBlockNetworkImage(const bool & onLineImageAccessEnabled)3687 void WebDelegate::UpdateBlockNetworkImage(const bool& onLineImageAccessEnabled)
3688 {
3689 auto context = context_.Upgrade();
3690 if (!context) {
3691 return;
3692 }
3693 context->GetTaskExecutor()->PostTask(
3694 [weak = WeakClaim(this), onLineImageAccessEnabled]() {
3695 auto delegate = weak.Upgrade();
3696 if (delegate && delegate->nweb_) {
3697 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3698 CHECK_NULL_VOID(setting);
3699 setting->PutLoadImageFromNetworkDisabled(onLineImageAccessEnabled);
3700 }
3701 },
3702 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBlockNetworkImage");
3703 }
3704
UpdateLoadsImagesAutomatically(const bool & isImageAccessEnabled)3705 void WebDelegate::UpdateLoadsImagesAutomatically(const bool& isImageAccessEnabled)
3706 {
3707 auto context = context_.Upgrade();
3708 if (!context) {
3709 return;
3710 }
3711 context->GetTaskExecutor()->PostTask(
3712 [weak = WeakClaim(this), isImageAccessEnabled]() {
3713 auto delegate = weak.Upgrade();
3714 if (delegate && delegate->nweb_) {
3715 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3716 CHECK_NULL_VOID(setting);
3717 setting->PutImageLoadingAllowed(isImageAccessEnabled);
3718 }
3719 },
3720 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateLoadImageAccessEnabled");
3721 }
3722
UpdateMixedContentMode(const MixedModeContent & mixedMode)3723 void WebDelegate::UpdateMixedContentMode(const MixedModeContent& mixedMode)
3724 {
3725 auto context = context_.Upgrade();
3726 if (!context) {
3727 return;
3728 }
3729 context->GetTaskExecutor()->PostTask(
3730 [weak = WeakClaim(this), mixedMode]() {
3731 auto delegate = weak.Upgrade();
3732 if (delegate && delegate->nweb_) {
3733 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3734 CHECK_NULL_VOID(setting);
3735 setting->PutAccessModeForSecureOriginLoadFromInsecure(
3736 static_cast<OHOS::NWeb::NWebPreference::AccessMode>(mixedMode));
3737 }
3738 },
3739 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMixedContentMode");
3740 }
3741
UpdateSupportZoom(const bool & isZoomAccessEnabled)3742 void WebDelegate::UpdateSupportZoom(const bool& isZoomAccessEnabled)
3743 {
3744 auto context = context_.Upgrade();
3745 if (!context) {
3746 return;
3747 }
3748 context->GetTaskExecutor()->PostTask(
3749 [weak = WeakClaim(this), isZoomAccessEnabled]() {
3750 auto delegate = weak.Upgrade();
3751 if (delegate && delegate->nweb_) {
3752 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3753 CHECK_NULL_VOID(setting);
3754 setting->PutZoomingFunctionEnabled(isZoomAccessEnabled);
3755 }
3756 },
3757 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateSupportZoom");
3758 }
UpdateDomStorageEnabled(const bool & isDomStorageAccessEnabled)3759 void WebDelegate::UpdateDomStorageEnabled(const bool& isDomStorageAccessEnabled)
3760 {
3761 auto context = context_.Upgrade();
3762 if (!context) {
3763 return;
3764 }
3765 context->GetTaskExecutor()->PostTask(
3766 [weak = WeakClaim(this), isDomStorageAccessEnabled]() {
3767 auto delegate = weak.Upgrade();
3768 if (delegate && delegate->nweb_) {
3769 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3770 CHECK_NULL_VOID(setting);
3771 setting->PutDomStorageEnabled(isDomStorageAccessEnabled);
3772 }
3773 },
3774 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDomStorageEnabled");
3775 }
UpdateGeolocationEnabled(const bool & isGeolocationAccessEnabled)3776 void WebDelegate::UpdateGeolocationEnabled(const bool& isGeolocationAccessEnabled)
3777 {
3778 auto context = context_.Upgrade();
3779 if (!context) {
3780 return;
3781 }
3782 context->GetTaskExecutor()->PostTask(
3783 [weak = WeakClaim(this), isGeolocationAccessEnabled]() {
3784 auto delegate = weak.Upgrade();
3785 if (delegate && delegate->nweb_) {
3786 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3787 CHECK_NULL_VOID(setting);
3788 setting->PutGeolocationAllowed(isGeolocationAccessEnabled);
3789 }
3790 },
3791 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateGeolocationEnabled");
3792 }
3793
UpdateCacheMode(const WebCacheMode & mode)3794 void WebDelegate::UpdateCacheMode(const WebCacheMode& mode)
3795 {
3796 auto context = context_.Upgrade();
3797 if (!context) {
3798 return;
3799 }
3800
3801 context->GetTaskExecutor()->PostTask(
3802 [weak = WeakClaim(this), mode]() {
3803 auto delegate = weak.Upgrade();
3804 if (delegate && delegate->nweb_) {
3805 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3806 CHECK_NULL_VOID(setting);
3807 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(mode));
3808 }
3809 },
3810 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateCacheMode");
3811 }
3812
GetNweb()3813 std::shared_ptr<OHOS::NWeb::NWeb> WebDelegate::GetNweb()
3814 {
3815 return nweb_;
3816 }
3817
GetForceDarkMode()3818 bool WebDelegate::GetForceDarkMode()
3819 {
3820 return forceDarkMode_;
3821 }
3822
UpdateDarkMode(const WebDarkMode & mode)3823 void WebDelegate::UpdateDarkMode(const WebDarkMode& mode)
3824 {
3825 auto context = context_.Upgrade();
3826 if (!context) {
3827 return;
3828 }
3829
3830 current_dark_mode_ = mode;
3831 context->GetTaskExecutor()->PostTask(
3832 [weak = WeakClaim(this), mode]() {
3833 auto delegate = weak.Upgrade();
3834 CHECK_NULL_VOID(delegate);
3835 CHECK_NULL_VOID(delegate->nweb_);
3836 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3837 CHECK_NULL_VOID(setting);
3838
3839 if (mode == WebDarkMode::On) {
3840 setting->PutDarkSchemeEnabled(true);
3841 if (delegate->forceDarkMode_) {
3842 setting->PutForceDarkModeEnabled(true);
3843 }
3844 } else if (mode == WebDarkMode::Off) {
3845 setting->PutDarkSchemeEnabled(false);
3846 setting->PutForceDarkModeEnabled(false);
3847 } else if (mode == WebDarkMode::Auto) {
3848 delegate->UpdateDarkModeAuto(delegate, setting);
3849 }
3850 },
3851 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDarkMode");
3852 }
3853
UpdateDarkModeAuto(RefPtr<WebDelegate> delegate,std::shared_ptr<OHOS::NWeb::NWebPreference> setting)3854 void WebDelegate::UpdateDarkModeAuto(RefPtr<WebDelegate> delegate, std::shared_ptr<OHOS::NWeb::NWebPreference> setting)
3855 {
3856 CHECK_NULL_VOID(setting);
3857 auto abilityContext = OHOS::AbilityRuntime::Context::GetApplicationContext();
3858 CHECK_NULL_VOID(abilityContext);
3859 auto appConfig = abilityContext->GetConfiguration();
3860 CHECK_NULL_VOID(appConfig);
3861 auto colorMode = appConfig->GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
3862 if (colorMode == "dark") {
3863 setting->PutDarkSchemeEnabled(true);
3864 if (delegate->GetForceDarkMode()) {
3865 setting->PutForceDarkModeEnabled(true);
3866 }
3867 }
3868 if (colorMode == "light") {
3869 setting->PutDarkSchemeEnabled(false);
3870 setting->PutForceDarkModeEnabled(false);
3871 }
3872 }
3873
UpdateForceDarkAccess(const bool & access)3874 void WebDelegate::UpdateForceDarkAccess(const bool& access)
3875 {
3876 auto context = context_.Upgrade();
3877 if (!context) {
3878 return;
3879 }
3880 context->GetTaskExecutor()->PostTask(
3881 [weak = WeakClaim(this), access]() {
3882 auto delegate = weak.Upgrade();
3883 CHECK_NULL_VOID(delegate);
3884 CHECK_NULL_VOID(delegate->nweb_);
3885 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3886 CHECK_NULL_VOID(setting);
3887 delegate->forceDarkMode_ = access;
3888 if (setting->DarkSchemeEnabled()) {
3889 setting->PutForceDarkModeEnabled(access);
3890 } else {
3891 setting->PutForceDarkModeEnabled(false);
3892 }
3893 },
3894 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateForceDarkAccess");
3895 }
3896
UpdateAudioResumeInterval(const int32_t & resumeInterval)3897 void WebDelegate::UpdateAudioResumeInterval(const int32_t& resumeInterval)
3898 {
3899 auto context = context_.Upgrade();
3900 if (!context) {
3901 return;
3902 }
3903 context->GetTaskExecutor()->PostTask(
3904 [weak = WeakClaim(this), resumeInterval]() {
3905 auto delegate = weak.Upgrade();
3906 CHECK_NULL_VOID(delegate);
3907 CHECK_NULL_VOID(delegate->nweb_);
3908 delegate->nweb_->SetAudioResumeInterval(resumeInterval);
3909 },
3910 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAudioResumeInterval");
3911 }
3912
UpdateAudioExclusive(const bool & audioExclusive)3913 void WebDelegate::UpdateAudioExclusive(const bool& audioExclusive)
3914 {
3915 auto context = context_.Upgrade();
3916 if (!context) {
3917 return;
3918 }
3919 context->GetTaskExecutor()->PostTask(
3920 [weak = WeakClaim(this), audioExclusive]() {
3921 auto delegate = weak.Upgrade();
3922 CHECK_NULL_VOID(delegate);
3923 CHECK_NULL_VOID(delegate->nweb_);
3924 delegate->nweb_->SetAudioExclusive(audioExclusive);
3925 },
3926 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAudioExclusive");
3927 }
3928
UpdateAudioSessionType(const WebAudioSessionType & audioSessionType)3929 void WebDelegate::UpdateAudioSessionType(const WebAudioSessionType& audioSessionType)
3930 {
3931 auto context = context_.Upgrade();
3932 if (!context) {
3933 return;
3934 }
3935 context->GetTaskExecutor()->PostTask(
3936 [weak = WeakClaim(this), audioSessionType]() {
3937 auto delegate = weak.Upgrade();
3938 CHECK_NULL_VOID(delegate);
3939 CHECK_NULL_VOID(delegate->nweb_);
3940 delegate->nweb_->SetAudioSessionType(static_cast<int32_t>(audioSessionType));
3941 },
3942 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAudioSessionType");
3943 }
3944
UpdateOverviewModeEnabled(const bool & isOverviewModeAccessEnabled)3945 void WebDelegate::UpdateOverviewModeEnabled(const bool& isOverviewModeAccessEnabled)
3946 {
3947 auto context = context_.Upgrade();
3948 if (!context) {
3949 return;
3950 }
3951 context->GetTaskExecutor()->PostTask(
3952 [weak = WeakClaim(this), isOverviewModeAccessEnabled]() {
3953 auto delegate = weak.Upgrade();
3954 if (delegate && delegate->nweb_) {
3955 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3956 CHECK_NULL_VOID(setting);
3957 setting->PutLoadWithOverviewMode(isOverviewModeAccessEnabled);
3958 }
3959 },
3960 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateOverviewModeEnabled");
3961 }
3962
UpdateFileFromUrlEnabled(const bool & isFileFromUrlAccessEnabled)3963 void WebDelegate::UpdateFileFromUrlEnabled(const bool& isFileFromUrlAccessEnabled)
3964 {
3965 auto context = context_.Upgrade();
3966 if (!context) {
3967 return;
3968 }
3969 context->GetTaskExecutor()->PostTask(
3970 [weak = WeakClaim(this), isFileFromUrlAccessEnabled]() {
3971 auto delegate = weak.Upgrade();
3972 if (delegate && delegate->nweb_) {
3973 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3974 CHECK_NULL_VOID(setting);
3975 setting->PutEnableRawFileAccessFromFileURLs(isFileFromUrlAccessEnabled);
3976 }
3977 },
3978 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateFileFromUrlEnabled");
3979 }
3980
UpdateDatabaseEnabled(const bool & isDatabaseAccessEnabled)3981 void WebDelegate::UpdateDatabaseEnabled(const bool& isDatabaseAccessEnabled)
3982 {
3983 auto context = context_.Upgrade();
3984 if (!context) {
3985 return;
3986 }
3987 context->GetTaskExecutor()->PostTask(
3988 [weak = WeakClaim(this), isDatabaseAccessEnabled]() {
3989 auto delegate = weak.Upgrade();
3990 if (delegate && delegate->nweb_) {
3991 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3992 CHECK_NULL_VOID(setting);
3993 setting->PutDatabaseAllowed(isDatabaseAccessEnabled);
3994 }
3995 },
3996 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDatabaseEnabled");
3997 }
3998
UpdateTextZoomRatio(const int32_t & textZoomRatioNum)3999 void WebDelegate::UpdateTextZoomRatio(const int32_t& textZoomRatioNum)
4000 {
4001 auto context = context_.Upgrade();
4002 if (!context) {
4003 return;
4004 }
4005 context->GetTaskExecutor()->PostTask(
4006 [weak = WeakClaim(this), textZoomRatioNum]() {
4007 auto delegate = weak.Upgrade();
4008 if (delegate && delegate->nweb_) {
4009 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4010 CHECK_NULL_VOID(setting);
4011 setting->PutZoomingForTextFactor(textZoomRatioNum);
4012 }
4013 },
4014 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateTextZoomRatio");
4015 }
4016
UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)4017 void WebDelegate::UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)
4018 {
4019 auto context = context_.Upgrade();
4020 if (!context) {
4021 return;
4022 }
4023 context->GetTaskExecutor()->PostTask(
4024 [weak = WeakClaim(this), isWebDebuggingAccessEnabled]() {
4025 NWebHelper::Instance().SetWebDebuggingAccess(isWebDebuggingAccessEnabled);
4026 },
4027 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDebuggingAccess");
4028 }
4029
UpdateWebDebuggingAccessAndPort(bool enabled,int32_t port)4030 void WebDelegate::UpdateWebDebuggingAccessAndPort(bool enabled, int32_t port)
4031 {
4032 auto context = context_.Upgrade();
4033 if (!context) {
4034 return;
4035 }
4036 context->GetTaskExecutor()->PostTask(
4037 [weak = WeakClaim(this), enabled, port]() {
4038 if (port > 0) {
4039 NWebHelper::Instance().SetWebDebuggingAccessAndPort(enabled, port);
4040 } else {
4041 NWebHelper::Instance().SetWebDebuggingAccess(enabled);
4042 }
4043 },
4044 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDebuggingAccessAndPort");
4045 }
4046
UpdatePinchSmoothModeEnabled(bool isPinchSmoothModeEnabled)4047 void WebDelegate::UpdatePinchSmoothModeEnabled(bool isPinchSmoothModeEnabled)
4048 {
4049 auto context = context_.Upgrade();
4050 if (!context) {
4051 return;
4052 }
4053 context->GetTaskExecutor()->PostTask(
4054 [weak = WeakClaim(this), isPinchSmoothModeEnabled]() {
4055 auto delegate = weak.Upgrade();
4056 if (delegate && delegate->nweb_) {
4057 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4058 CHECK_NULL_VOID(setting);
4059 setting->PutPinchSmoothMode(isPinchSmoothModeEnabled);
4060 }
4061 },
4062 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdatePinchSmoothModeEnabled");
4063 }
4064
UpdateMediaPlayGestureAccess(bool isNeedGestureAccess)4065 void WebDelegate::UpdateMediaPlayGestureAccess(bool isNeedGestureAccess)
4066 {
4067 auto context = context_.Upgrade();
4068 if (!context) {
4069 return;
4070 }
4071 context->GetTaskExecutor()->PostTask(
4072 [weak = WeakClaim(this), isNeedGestureAccess]() {
4073 auto delegate = weak.Upgrade();
4074 if (delegate && delegate->nweb_) {
4075 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4076 if (setting) {
4077 setting->PutMediaPlayGestureAccess(isNeedGestureAccess);
4078 }
4079 }
4080 },
4081 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMediaPlayGestureAccess");
4082 }
4083
UpdateMultiWindowAccess(bool isMultiWindowAccessEnabled)4084 void WebDelegate::UpdateMultiWindowAccess(bool isMultiWindowAccessEnabled)
4085 {
4086 auto context = context_.Upgrade();
4087 if (!context) {
4088 return;
4089 }
4090 context->GetTaskExecutor()->PostTask(
4091 [weak = WeakClaim(this), isMultiWindowAccessEnabled]() {
4092 auto delegate = weak.Upgrade();
4093 if (delegate && delegate->nweb_) {
4094 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4095 CHECK_NULL_VOID(setting);
4096 setting->PutMultiWindowAccess(isMultiWindowAccessEnabled);
4097 }
4098 },
4099 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMultiWindowAccess");
4100 }
4101
UpdateAllowWindowOpenMethod(bool isAllowWindowOpenMethod)4102 void WebDelegate::UpdateAllowWindowOpenMethod(bool isAllowWindowOpenMethod)
4103 {
4104 auto context = context_.Upgrade();
4105 if (!context) {
4106 return;
4107 }
4108 context->GetTaskExecutor()->PostTask(
4109 [weak = WeakClaim(this), isAllowWindowOpenMethod]() {
4110 auto delegate = weak.Upgrade();
4111 if (delegate && delegate->nweb_) {
4112 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4113 CHECK_NULL_VOID(setting);
4114 setting->PutIsCreateWindowsByJavaScriptAllowed(isAllowWindowOpenMethod);
4115 }
4116 },
4117 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAllowWindowOpen");
4118 }
4119
UpdateWebCursiveFont(const std::string & cursiveFontFamily)4120 void WebDelegate::UpdateWebCursiveFont(const std::string& cursiveFontFamily)
4121 {
4122 auto context = context_.Upgrade();
4123 if (!context) {
4124 return;
4125 }
4126 context->GetTaskExecutor()->PostTask(
4127 [weak = WeakClaim(this), cursiveFontFamily]() {
4128 auto delegate = weak.Upgrade();
4129 if (delegate && delegate->nweb_) {
4130 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4131 if (setting) {
4132 setting->PutCursiveFontFamilyName(cursiveFontFamily);
4133 }
4134 }
4135 },
4136 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebCursiveFont");
4137 }
4138
UpdateWebFantasyFont(const std::string & fantasyFontFamily)4139 void WebDelegate::UpdateWebFantasyFont(const std::string& fantasyFontFamily)
4140 {
4141 auto context = context_.Upgrade();
4142 if (!context) {
4143 return;
4144 }
4145 context->GetTaskExecutor()->PostTask(
4146 [weak = WeakClaim(this), fantasyFontFamily]() {
4147 auto delegate = weak.Upgrade();
4148 if (delegate && delegate->nweb_) {
4149 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4150 if (setting) {
4151 setting->PutFantasyFontFamilyName(fantasyFontFamily);
4152 }
4153 }
4154 },
4155 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebFantasyFont");
4156 }
4157
UpdateWebFixedFont(const std::string & fixedFontFamily)4158 void WebDelegate::UpdateWebFixedFont(const std::string& fixedFontFamily)
4159 {
4160 auto context = context_.Upgrade();
4161 if (!context) {
4162 return;
4163 }
4164 context->GetTaskExecutor()->PostTask(
4165 [weak = WeakClaim(this), fixedFontFamily]() {
4166 auto delegate = weak.Upgrade();
4167 if (delegate && delegate->nweb_) {
4168 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4169 if (setting) {
4170 setting->PutFixedFontFamilyName(fixedFontFamily);
4171 }
4172 }
4173 },
4174 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebFixedFont");
4175 }
4176
UpdateWebSansSerifFont(const std::string & sansSerifFontFamily)4177 void WebDelegate::UpdateWebSansSerifFont(const std::string& sansSerifFontFamily)
4178 {
4179 auto context = context_.Upgrade();
4180 if (!context) {
4181 return;
4182 }
4183 context->GetTaskExecutor()->PostTask(
4184 [weak = WeakClaim(this), sansSerifFontFamily]() {
4185 auto delegate = weak.Upgrade();
4186 if (delegate && delegate->nweb_) {
4187 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4188 if (setting) {
4189 setting->PutSansSerifFontFamilyName(sansSerifFontFamily);
4190 }
4191 }
4192 },
4193 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebSansSerifFont");
4194 }
4195
UpdateWebSerifFont(const std::string & serifFontFamily)4196 void WebDelegate::UpdateWebSerifFont(const std::string& serifFontFamily)
4197 {
4198 auto context = context_.Upgrade();
4199 if (!context) {
4200 return;
4201 }
4202 context->GetTaskExecutor()->PostTask(
4203 [weak = WeakClaim(this), serifFontFamily]() {
4204 auto delegate = weak.Upgrade();
4205 if (delegate && delegate->nweb_) {
4206 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4207 if (setting) {
4208 setting->PutSerifFontFamilyName(serifFontFamily);
4209 }
4210 }
4211 },
4212 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebSerifFont");
4213 }
4214
UpdateWebStandardFont(const std::string & standardFontFamily)4215 void WebDelegate::UpdateWebStandardFont(const std::string& standardFontFamily)
4216 {
4217 auto context = context_.Upgrade();
4218 if (!context) {
4219 return;
4220 }
4221 context->GetTaskExecutor()->PostTask(
4222 [weak = WeakClaim(this), standardFontFamily]() {
4223 auto delegate = weak.Upgrade();
4224 if (delegate && delegate->nweb_) {
4225 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4226 if (setting) {
4227 setting->PutStandardFontFamilyName(standardFontFamily);
4228 }
4229 }
4230 },
4231 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebStandardFont");
4232 }
4233
UpdateDefaultFixedFontSize(int32_t defaultFixedFontSize)4234 void WebDelegate::UpdateDefaultFixedFontSize(int32_t defaultFixedFontSize)
4235 {
4236 auto context = context_.Upgrade();
4237 if (!context) {
4238 return;
4239 }
4240 context->GetTaskExecutor()->PostTask(
4241 [weak = WeakClaim(this), defaultFixedFontSize]() {
4242 auto delegate = weak.Upgrade();
4243 if (delegate && delegate->nweb_) {
4244 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4245 if (setting) {
4246 setting->PutDefaultFixedFontSize(defaultFixedFontSize);
4247 }
4248 }
4249 },
4250 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDefaultFixedFontSize");
4251 }
4252
OnConfigurationUpdated(const OHOS::AppExecFwk::Configuration & configuration)4253 void WebDelegate::OnConfigurationUpdated(const OHOS::AppExecFwk::Configuration& configuration)
4254 {
4255 auto context = context_.Upgrade();
4256 CHECK_NULL_VOID(context);
4257
4258 auto executor = context->GetTaskExecutor();
4259 CHECK_NULL_VOID(executor);
4260
4261 std::string colorMode = configuration.GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
4262 std::string weightScale = configuration.GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE);
4263 std::string themeTag = configuration.GetItem(OHOS::AAFwk::GlobalConfigurationKey::THEME);
4264 uint8_t themeFlags = static_cast<uint8_t>(OHOS::NWeb::SystemThemeFlags::NONE);
4265 if (!themeTag.empty()) {
4266 std::unique_ptr<JsonValue> json = JsonUtil::ParseJsonString(themeTag);
4267 if (json->GetInt("fonts")) {
4268 themeFlags |= static_cast<uint8_t>(OHOS::NWeb::SystemThemeFlags::THEME_FONT);
4269 TAG_LOGI(AceLogTag::ACE_WEB, "OnConfigurationUpdated fonts:%{public}s", themeTag.c_str());
4270 }
4271 }
4272
4273 executor->PostTask(
4274 [weak = WeakClaim(this), colorMode, themeFlags, dark_mode = current_dark_mode_, weightScale]() {
4275 auto delegate = weak.Upgrade();
4276 CHECK_NULL_VOID(delegate);
4277 auto nweb = delegate->GetNweb();
4278 CHECK_NULL_VOID(nweb);
4279
4280 std::shared_ptr<NWebSystemConfigurationImpl> configuration =
4281 std::make_shared<NWebSystemConfigurationImpl>(themeFlags);
4282 nweb->OnConfigurationUpdated(configuration);
4283
4284 auto setting = nweb->GetPreference();
4285 CHECK_NULL_VOID(setting);
4286 bool auto_dark_mode = (dark_mode == WebDarkMode::Auto);
4287 if (auto_dark_mode && colorMode == "dark") {
4288 setting->PutDarkSchemeEnabled(true);
4289 if (delegate->GetForceDarkMode()) {
4290 setting->PutForceDarkModeEnabled(true);
4291 }
4292 } else if (auto_dark_mode && colorMode == "light") {
4293 setting->PutDarkSchemeEnabled(false);
4294 setting->PutForceDarkModeEnabled(false);
4295 }
4296 if (delegate->enableFollowSystemFontWeight_) {
4297 setting->SetFontWeightScale(std::stof(weightScale));
4298 }
4299 },
4300 TaskExecutor::TaskType::PLATFORM, "ArkUIWebConfigurationUpdated");
4301 }
4302
UpdateDefaultFontSize(int32_t defaultFontSize)4303 void WebDelegate::UpdateDefaultFontSize(int32_t defaultFontSize)
4304 {
4305 auto context = context_.Upgrade();
4306 if (!context) {
4307 return;
4308 }
4309 context->GetTaskExecutor()->PostTask(
4310 [weak = WeakClaim(this), defaultFontSize]() {
4311 auto delegate = weak.Upgrade();
4312 if (delegate && delegate->nweb_) {
4313 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4314 if (setting) {
4315 setting->PutDefaultFontSize(defaultFontSize);
4316 }
4317 }
4318 },
4319 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDefaultFontSize");
4320 }
4321
UpdateMinFontSize(int32_t minFontSize)4322 void WebDelegate::UpdateMinFontSize(int32_t minFontSize)
4323 {
4324 auto context = context_.Upgrade();
4325 if (!context) {
4326 return;
4327 }
4328 context->GetTaskExecutor()->PostTask(
4329 [weak = WeakClaim(this), minFontSize]() {
4330 auto delegate = weak.Upgrade();
4331 if (delegate && delegate->nweb_) {
4332 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4333 if (setting) {
4334 setting->PutFontSizeLowerLimit(minFontSize);
4335 }
4336 }
4337 },
4338 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMinFontSize");
4339 }
4340
UpdateMinLogicalFontSize(int32_t minLogicalFontSize)4341 void WebDelegate::UpdateMinLogicalFontSize(int32_t minLogicalFontSize)
4342 {
4343 auto context = context_.Upgrade();
4344 if (!context) {
4345 return;
4346 }
4347 context->GetTaskExecutor()->PostTask(
4348 [weak = WeakClaim(this), minLogicalFontSize]() {
4349 auto delegate = weak.Upgrade();
4350 if (delegate && delegate->nweb_) {
4351 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4352 if (setting) {
4353 setting->PutLogicalFontSizeLowerLimit(minLogicalFontSize);
4354 }
4355 }
4356 },
4357 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMinLogicalFontSize");
4358 }
4359
UpdateBlockNetwork(bool isNetworkBlocked)4360 void WebDelegate::UpdateBlockNetwork(bool isNetworkBlocked)
4361 {
4362 auto context = context_.Upgrade();
4363 if (!context) {
4364 return;
4365 }
4366 context->GetTaskExecutor()->PostTask(
4367 [weak = WeakClaim(this), isNetworkBlocked]() {
4368 auto delegate = weak.Upgrade();
4369 if (delegate && delegate->nweb_) {
4370 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4371 if (setting) {
4372 setting->PutBlockNetwork(isNetworkBlocked);
4373 }
4374 }
4375 },
4376 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBlockNetwork");
4377 }
4378
UpdateHorizontalScrollBarAccess(bool isHorizontalScrollBarAccessEnabled)4379 void WebDelegate::UpdateHorizontalScrollBarAccess(bool isHorizontalScrollBarAccessEnabled)
4380 {
4381 auto context = context_.Upgrade();
4382 if (!context) {
4383 return;
4384 }
4385 context->GetTaskExecutor()->PostTask(
4386 [weak = WeakClaim(this), isHorizontalScrollBarAccessEnabled]() {
4387 auto delegate = weak.Upgrade();
4388 if (delegate && delegate->nweb_) {
4389 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4390 if (setting) {
4391 setting->PutHorizontalScrollBarAccess(isHorizontalScrollBarAccessEnabled);
4392 }
4393 }
4394 },
4395 TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutHorizontalScrollBarAccess");
4396 }
4397
UpdateVerticalScrollBarAccess(bool isVerticalScrollBarAccessEnabled)4398 void WebDelegate::UpdateVerticalScrollBarAccess(bool isVerticalScrollBarAccessEnabled)
4399 {
4400 auto context = context_.Upgrade();
4401 if (!context) {
4402 return;
4403 }
4404 context->GetTaskExecutor()->PostTask(
4405 [weak = WeakClaim(this), isVerticalScrollBarAccessEnabled]() {
4406 auto delegate = weak.Upgrade();
4407 if (delegate && delegate->nweb_) {
4408 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4409 if (setting) {
4410 setting->PutVerticalScrollBarAccess(isVerticalScrollBarAccessEnabled);
4411 }
4412 }
4413 },
4414 TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutVerticalScrollBarAccess");
4415 }
4416
UpdateOverlayScrollbarEnabled(bool isEnabled)4417 void WebDelegate::UpdateOverlayScrollbarEnabled(bool isEnabled)
4418 {
4419 auto context = context_.Upgrade();
4420 if (!context) {
4421 return;
4422 }
4423 context->GetTaskExecutor()->PostTask(
4424 [weak = WeakClaim(this), isEnabled]() {
4425 auto delegate = weak.Upgrade();
4426 if (delegate && delegate->nweb_) {
4427 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4428 if (setting) {
4429 setting->PutOverlayScrollbarEnabled(isEnabled);
4430 }
4431 }
4432 },
4433 TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutOverlayScrollbarEnabled");
4434 }
4435
UpdateNativeEmbedModeEnabled(bool isEmbedModeEnabled)4436 void WebDelegate::UpdateNativeEmbedModeEnabled(bool isEmbedModeEnabled)
4437 {
4438 auto context = context_.Upgrade();
4439 if (!context) {
4440 return;
4441 }
4442 isEmbedModeEnabled_ = isEmbedModeEnabled;
4443 context->GetTaskExecutor()->PostTask(
4444 [weak = WeakClaim(this), isEmbedModeEnabled]() {
4445 auto delegate = weak.Upgrade();
4446 if (delegate && delegate->nweb_) {
4447 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4448 if (setting) {
4449 setting->SetNativeEmbedMode(isEmbedModeEnabled);
4450 }
4451 }
4452 },
4453 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetNativeEmbedMode");
4454 }
4455
UpdateIntrinsicSizeEnabled(bool isIntrinsicSizeEnabled)4456 void WebDelegate::UpdateIntrinsicSizeEnabled(bool isIntrinsicSizeEnabled)
4457 {
4458 auto context = context_.Upgrade();
4459 if (!context) {
4460 return;
4461 }
4462 context->GetTaskExecutor()->PostTask(
4463 [weak = WeakClaim(this), isIntrinsicSizeEnabled]() {
4464 auto delegate = weak.Upgrade();
4465 if (delegate && delegate->nweb_) {
4466 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4467 if (setting) {
4468 setting->SetIntrinsicSizeEnable(isIntrinsicSizeEnabled);
4469 }
4470 }
4471 },
4472 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetIntrinsicSizeEnable");
4473 }
4474
UpdateCssDisplayChangeEnabled(bool isCssDisplayChangeEnabled)4475 void WebDelegate::UpdateCssDisplayChangeEnabled(bool isCssDisplayChangeEnabled)
4476 {
4477 auto context = context_.Upgrade();
4478 if (!context) {
4479 return;
4480 }
4481 context->GetTaskExecutor()->PostTask(
4482 [weak = WeakClaim(this), isCssDisplayChangeEnabled]() {
4483 auto delegate = weak.Upgrade();
4484 if (delegate && delegate->nweb_) {
4485 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4486 if (setting) {
4487 setting->SetCssDisplayChangeEnabled(isCssDisplayChangeEnabled);
4488 }
4489 }
4490 },
4491 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetCssDisplayChangeEnabled");
4492 }
4493
UpdateNativeEmbedRuleTag(const std::string & tag)4494 void WebDelegate::UpdateNativeEmbedRuleTag(const std::string& tag)
4495 {
4496 auto context = context_.Upgrade();
4497 if (!context) {
4498 return;
4499 }
4500 tag_ = tag;
4501 if (tag_.empty() || tag_type_.empty()) {
4502 return;
4503 }
4504
4505 context->GetTaskExecutor()->PostTask(
4506 [weak = WeakClaim(this)]() {
4507 auto delegate = weak.Upgrade();
4508 if (delegate && delegate->nweb_) {
4509 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4510 if (setting) {
4511 setting->RegisterNativeEmbedRule(delegate->tag_, delegate->tag_type_);
4512 }
4513 }
4514 },
4515 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateNativeEmbedRuleTag");
4516 }
4517
UpdateNativeEmbedRuleType(const std::string & type)4518 void WebDelegate::UpdateNativeEmbedRuleType(const std::string& type)
4519 {
4520 auto context = context_.Upgrade();
4521 if (!context) {
4522 return;
4523 }
4524 tag_type_ = type;
4525 if (tag_.empty() || tag_type_.empty()) {
4526 return;
4527 }
4528 context->GetTaskExecutor()->PostTask(
4529 [weak = WeakClaim(this)]() {
4530 auto delegate = weak.Upgrade();
4531 if (delegate && delegate->nweb_) {
4532 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4533 if (setting) {
4534 setting->RegisterNativeEmbedRule(delegate->tag_, delegate->tag_type_);
4535 }
4536 }
4537 },
4538 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateNativeEmbedRuleType");
4539 }
4540
UpdateScrollBarColor(const std::string & colorValue)4541 void WebDelegate::UpdateScrollBarColor(const std::string& colorValue)
4542 {
4543 auto context = context_.Upgrade();
4544 if (!context) {
4545 return;
4546 }
4547
4548 auto pipeline = PipelineContext::GetCurrentContext();
4549 if (pipeline == nullptr) {
4550 return;
4551 }
4552
4553 auto themeManager = pipeline->GetThemeManager();
4554 if (themeManager == nullptr) {
4555 return;
4556 }
4557
4558 auto themeConstants = themeManager->GetThemeConstants();
4559 if (themeConstants == nullptr) {
4560 return;
4561 }
4562 Color color = themeConstants->GetColorByName(colorValue);
4563 uint32_t colorContent = color.GetValue();
4564 context->GetTaskExecutor()->PostTask(
4565 [weak = WeakClaim(this), colorContent]() {
4566 auto delegate = weak.Upgrade();
4567 if (delegate && delegate->nweb_) {
4568 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4569 if (setting) {
4570 setting->PutScrollBarColor(colorContent);
4571 }
4572 }
4573 },
4574 TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutScrollBarColor");
4575 }
4576
UpdateEnableFollowSystemFontWeight(bool enableFollowSystemFontWeight)4577 void WebDelegate::UpdateEnableFollowSystemFontWeight(bool enableFollowSystemFontWeight)
4578 {
4579 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::UpdateEnableFollowSystemFontWeight isfollow:%{public}d",
4580 enableFollowSystemFontWeight);
4581 enableFollowSystemFontWeight_ = enableFollowSystemFontWeight;
4582 if (!enableFollowSystemFontWeight_) {
4583 return;
4584 }
4585 auto context = context_.Upgrade();
4586 if (!context) {
4587 return;
4588 }
4589 float fontWeightScale = SystemProperties::GetFontWeightScale();
4590 context->GetTaskExecutor()->PostTask(
4591 [weak = WeakClaim(this), fontWeightScale]() {
4592 auto delegate = weak.Upgrade();
4593 if (delegate && delegate->nweb_) {
4594 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
4595 if (setting) {
4596 setting->SetFontWeightScale(fontWeightScale);
4597 }
4598 }
4599 },
4600 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetFontWeightScale");
4601 }
4602
LoadUrl()4603 void WebDelegate::LoadUrl()
4604 {
4605 auto context = context_.Upgrade();
4606 CHECK_NULL_VOID(context);
4607 context->GetTaskExecutor()->PostTask(
4608 [weak = WeakClaim(this)]() {
4609 auto delegate = weak.Upgrade();
4610 if (delegate && delegate->nweb_) {
4611 std::optional<std::string> src;
4612 if (Container::IsCurrentUseNewPipeline()) {
4613 auto webPattern = delegate->webPattern_.Upgrade();
4614 if (webPattern) {
4615 src = webPattern->GetWebSrc();
4616 }
4617 } else {
4618 auto webCom = delegate->webComponent_.Upgrade();
4619 if (webCom) {
4620 src = webCom->GetSrc();
4621 }
4622 }
4623 CHECK_NULL_VOID(src);
4624 delegate->nweb_->Load(src.value());
4625 }
4626 },
4627 TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadSrcUrl");
4628 }
4629
OnInactive()4630 void WebDelegate::OnInactive()
4631 {
4632 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnInactive, webId:%{public}d", GetWebId());
4633 auto context = context_.Upgrade();
4634 if (!context) {
4635 return;
4636 }
4637 context->GetTaskExecutor()->PostTask(
4638 [weak = WeakClaim(this)]() {
4639 auto delegate = weak.Upgrade();
4640 if (!delegate) {
4641 return;
4642 }
4643 if (delegate->nweb_) {
4644 delegate->nweb_->OnPause();
4645 }
4646 },
4647 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnInactive");
4648 }
4649
OnActive()4650 void WebDelegate::OnActive()
4651 {
4652 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnActive, webId:%{public}d", GetWebId());
4653 auto context = context_.Upgrade();
4654 if (!context) {
4655 return;
4656 }
4657 context->GetTaskExecutor()->PostTask(
4658 [weak = WeakClaim(this)]() {
4659 auto delegate = weak.Upgrade();
4660 if (!delegate) {
4661 return;
4662 }
4663 if (delegate->nweb_) {
4664 delegate->nweb_->OnContinue();
4665 }
4666 },
4667 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnActive");
4668 }
4669
GestureBackBlur()4670 void WebDelegate::GestureBackBlur()
4671 {
4672 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::GestureBackBlur, webId:%{public}d", GetWebId());
4673 auto context = context_.Upgrade();
4674 if (!context) {
4675 return;
4676 }
4677 context->GetTaskExecutor()->PostTask(
4678 [weak = WeakClaim(this)]() {
4679 auto delegate = weak.Upgrade();
4680 if (!delegate) {
4681 return;
4682 }
4683 if (delegate->nweb_) {
4684 delegate->nweb_->WebComponentsBlur();
4685 }
4686 },
4687 TaskExecutor::TaskType::PLATFORM, "ArkUIWebGestureBackBlur");
4688 }
4689
OnWebviewHide()4690 void WebDelegate::OnWebviewHide()
4691 {
4692 auto context = context_.Upgrade();
4693 if (!context) {
4694 return;
4695 }
4696 context->GetTaskExecutor()->PostTask(
4697 [weak = WeakClaim(this)]() {
4698 auto delegate = weak.Upgrade();
4699 if (!delegate) {
4700 return;
4701 }
4702 if (delegate->nweb_) {
4703 delegate->nweb_->OnWebviewHide();
4704 }
4705 },
4706 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnWebviewHide");
4707 }
4708
OnWebviewShow()4709 void WebDelegate::OnWebviewShow()
4710 {
4711 auto context = context_.Upgrade();
4712 if (!context) {
4713 return;
4714 }
4715 context->GetTaskExecutor()->PostTask(
4716 [weak = WeakClaim(this)]() {
4717 auto delegate = weak.Upgrade();
4718 if (!delegate) {
4719 return;
4720 }
4721 if (delegate->nweb_) {
4722 delegate->nweb_->OnWebviewShow();
4723 }
4724 },
4725 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnWebviewShow");
4726 }
4727
OnRenderToForeground()4728 void WebDelegate::OnRenderToForeground()
4729 {
4730 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnRenderToForeground");
4731 auto context = context_.Upgrade();
4732 if (!context) {
4733 return;
4734 }
4735 context->GetTaskExecutor()->PostTask(
4736 [weak = WeakClaim(this)]() {
4737 auto delegate = weak.Upgrade();
4738 if (!delegate) {
4739 return;
4740 }
4741 if (delegate->nweb_) {
4742 TAG_LOGD(AceLogTag::ACE_WEB, "delegate->nweb_->OnRenderToForeground");
4743 delegate->nweb_->OnRenderToForeground();
4744 }
4745 },
4746 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnRenderToForeground");
4747 }
4748
OnRenderToBackground()4749 void WebDelegate::OnRenderToBackground()
4750 {
4751 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnRenderToBackground");
4752 auto context = context_.Upgrade();
4753 if (!context) {
4754 return;
4755 }
4756 context->GetTaskExecutor()->PostTask(
4757 [weak = WeakClaim(this)]() {
4758 auto delegate = weak.Upgrade();
4759 if (!delegate) {
4760 return;
4761 }
4762 if (delegate->nweb_) {
4763 TAG_LOGD(AceLogTag::ACE_WEB, "delegate->nweb_->OnRenderToBackground");
4764 delegate->nweb_->OnRenderToBackground();
4765 }
4766 },
4767 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnRenderToBackground");
4768 }
4769
OnOnlineRenderToForeground()4770 void WebDelegate::OnOnlineRenderToForeground()
4771 {
4772 TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::OnOnlineRenderToForeground");
4773 auto context = context_.Upgrade();
4774 if (!context) {
4775 return;
4776 }
4777 context->GetTaskExecutor()->PostTask(
4778 [weak = WeakClaim(this)]() {
4779 auto delegate = weak.Upgrade();
4780 if (!delegate) {
4781 return;
4782 }
4783 if (delegate->nweb_) {
4784 TAG_LOGD(AceLogTag::ACE_WEB, "delegate->nweb_->OnOnlineRenderToForeground");
4785 delegate->nweb_->OnOnlineRenderToForeground();
4786 }
4787 },
4788 TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnOnlineRenderToForeground");
4789 }
4790
SetShouldFrameSubmissionBeforeDraw(bool should)4791 void WebDelegate::SetShouldFrameSubmissionBeforeDraw(bool should)
4792 {
4793 auto context = context_.Upgrade();
4794 if (!context) {
4795 return;
4796 }
4797 context->GetTaskExecutor()->PostTask(
4798 [weak = WeakClaim(this), should]() {
4799 auto delegate = weak.Upgrade();
4800 if (!delegate) {
4801 return;
4802 }
4803 if (delegate->nweb_) {
4804 delegate->nweb_->SetShouldFrameSubmissionBeforeDraw(should);
4805 }
4806 },
4807 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetShouldFrameSubmissionBeforeDraw");
4808 }
4809
NotifyMemoryLevel(int32_t level)4810 void WebDelegate::NotifyMemoryLevel(int32_t level)
4811 {
4812 auto context = context_.Upgrade();
4813 if (!context) {
4814 return;
4815 }
4816 context->GetTaskExecutor()->PostTask(
4817 [weak = WeakClaim(this), level]() {
4818 auto delegate = weak.Upgrade();
4819 if (!delegate) {
4820 return;
4821 }
4822 if (delegate->nweb_) {
4823 delegate->nweb_->NotifyMemoryLevel(level);
4824 }
4825 },
4826 TaskExecutor::TaskType::PLATFORM, "ArkUIWebNotifyMemoryLevel");
4827 }
4828
SetAudioMuted(bool muted)4829 void WebDelegate::SetAudioMuted(bool muted)
4830 {
4831 ACE_DCHECK(nweb_ != nullptr);
4832 if (nweb_) {
4833 nweb_->SetAudioMuted(muted);
4834 }
4835 }
4836
Zoom(float factor)4837 void WebDelegate::Zoom(float factor)
4838 {
4839 auto context = context_.Upgrade();
4840 if (!context) {
4841 return;
4842 }
4843
4844 context->GetTaskExecutor()->PostTask(
4845 [weak = WeakClaim(this), factor]() {
4846 auto delegate = weak.Upgrade();
4847 if (!delegate) {
4848 return;
4849 }
4850 if (delegate->nweb_) {
4851 delegate->nweb_->Zoom(factor);
4852 }
4853 },
4854 TaskExecutor::TaskType::PLATFORM, "ArkUIWebZoom");
4855 }
4856
ZoomIn()4857 bool WebDelegate::ZoomIn()
4858 {
4859 auto context = context_.Upgrade();
4860 if (!context) {
4861 return false;
4862 }
4863 bool result = false;
4864 context->GetTaskExecutor()->PostSyncTask(
4865 [weak = WeakClaim(this), &result]() {
4866 auto delegate = weak.Upgrade();
4867 if (!delegate) {
4868 return;
4869 }
4870 if (delegate->nweb_) {
4871 result = delegate->nweb_->ZoomIn();
4872 }
4873 },
4874 TaskExecutor::TaskType::PLATFORM, "ArkUIWebZoomIn");
4875 return result;
4876 }
4877
ZoomOut()4878 bool WebDelegate::ZoomOut()
4879 {
4880 auto context = context_.Upgrade();
4881 if (!context) {
4882 return false;
4883 }
4884 bool result = false;
4885 context->GetTaskExecutor()->PostSyncTask(
4886 [weak = WeakClaim(this), &result]() {
4887 auto delegate = weak.Upgrade();
4888 if (!delegate) {
4889 return;
4890 }
4891 if (delegate->nweb_) {
4892 result = delegate->nweb_->ZoomOut();
4893 }
4894 },
4895 TaskExecutor::TaskType::PLATFORM, "ArkUIWebZoomOut");
4896 return result;
4897 }
4898
CreateWindow()4899 sptr<OHOS::Rosen::Window> WebDelegate::CreateWindow()
4900 {
4901 auto context = context_.Upgrade();
4902 if (!context) {
4903 return nullptr;
4904 }
4905 float scale = context->GetViewScale();
4906
4907 constexpr int DEFAULT_HEIGHT = 1600;
4908 int DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR = (int)(scale * context->GetRootHeight());
4909 int DEFAULT_STATUS_BAR_HEIGHT = (DEFAULT_HEIGHT - DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR) / 2;
4910 constexpr int DEFAULT_LEFT = 0;
4911 int DEFAULT_TOP = DEFAULT_STATUS_BAR_HEIGHT;
4912 int DEFAULT_WIDTH = (int)(scale * context->GetRootWidth());
4913 sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
4914 option->SetWindowRect({ DEFAULT_LEFT, DEFAULT_TOP, DEFAULT_WIDTH, DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR });
4915 option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_LAUNCHING);
4916 option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
4917 auto window = Rosen::Window::Create("ohos_web_window", option);
4918 return window;
4919 }
4920 #endif
4921
RegisterWebEvent()4922 void WebDelegate::RegisterWebEvent()
4923 {
4924 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
4925 CHECK_NULL_VOID(context);
4926 auto resRegister = context->GetPlatformResRegister();
4927 if (resRegister == nullptr) {
4928 return;
4929 }
4930 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGESTART), [weak = WeakClaim(this)](const std::string& param) {
4931 auto delegate = weak.Upgrade();
4932 if (delegate) {
4933 delegate->OnPageStarted(param);
4934 }
4935 });
4936 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH), [weak = WeakClaim(this)](const std::string& param) {
4937 auto delegate = weak.Upgrade();
4938 if (delegate) {
4939 delegate->OnPageFinished(param);
4940 }
4941 });
4942 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR), [weak = WeakClaim(this)](const std::string& param) {
4943 auto delegate = weak.Upgrade();
4944 if (delegate) {
4945 delegate->OnPageError(param);
4946 }
4947 });
4948 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH), [weak = WeakClaim(this)](const std::string& param) {
4949 auto delegate = weak.Upgrade();
4950 if (delegate) {
4951 delegate->OnRouterPush(param);
4952 }
4953 });
4954 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE), [weak = WeakClaim(this)](const std::string& param) {
4955 auto delegate = weak.Upgrade();
4956 if (delegate) {
4957 delegate->OnMessage(param);
4958 }
4959 });
4960 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_LOADSTART), [weak = WeakClaim(this)](const std::string& param) {
4961 auto delegate = weak.Upgrade();
4962 if (delegate) {
4963 delegate->OnLoadStarted(param);
4964 }
4965 });
4966 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_LOADFINISH), [weak = WeakClaim(this)](const std::string& param) {
4967 auto delegate = weak.Upgrade();
4968 if (delegate) {
4969 delegate->OnLoadFinished(param);
4970 }
4971 });
4972 }
4973
4974 // upper ui component which inherited from WebComponent
4975 // could implement some curtain createdCallback to customized controller interface
4976 // eg: web.loadurl.
AddCreatedCallback(const CreatedCallback & createdCallback)4977 void WebDelegate::AddCreatedCallback(const CreatedCallback& createdCallback)
4978 {
4979 ACE_DCHECK(createdCallback != nullptr);
4980 ACE_DCHECK(state_ != State::RELEASED);
4981 createdCallbacks_.emplace_back(createdCallback);
4982 }
4983
RemoveCreatedCallback()4984 void WebDelegate::RemoveCreatedCallback()
4985 {
4986 ACE_DCHECK(state_ != State::RELEASED);
4987 createdCallbacks_.pop_back();
4988 }
4989
AddReleasedCallback(const ReleasedCallback & releasedCallback)4990 void WebDelegate::AddReleasedCallback(const ReleasedCallback& releasedCallback)
4991 {
4992 ACE_DCHECK(releasedCallback != nullptr && state_ != State::RELEASED);
4993 releasedCallbacks_.emplace_back(releasedCallback);
4994 }
4995
RemoveReleasedCallback()4996 void WebDelegate::RemoveReleasedCallback()
4997 {
4998 ACE_DCHECK(state_ != State::RELEASED);
4999 releasedCallbacks_.pop_back();
5000 }
5001
Reload()5002 void WebDelegate::Reload()
5003 {
5004 #ifdef OHOS_STANDARD_SYSTEM
5005 auto context = context_.Upgrade();
5006 if (!context) {
5007 return;
5008 }
5009 context->GetTaskExecutor()->PostTask(
5010 [weak = WeakClaim(this)]() {
5011 auto delegate = weak.Upgrade();
5012 if (!delegate) {
5013 return;
5014 }
5015 if (delegate->nweb_) {
5016 delegate->nweb_->Reload();
5017 }
5018 },
5019 TaskExecutor::TaskType::PLATFORM, "ArkUIWebReload");
5020 #else
5021 hash_ = MakeResourceHash();
5022 reloadMethod_ = MakeMethodHash("reload");
5023 CallResRegisterMethod(reloadMethod_, WEB_PARAM_NONE, nullptr);
5024 #endif
5025 }
5026
UpdateUrl(const std::string & url)5027 void WebDelegate::UpdateUrl(const std::string& url)
5028 {
5029 hash_ = MakeResourceHash();
5030 updateUrlMethod_ = MakeMethodHash(WEB_METHOD_UPDATEURL);
5031 std::stringstream paramStream;
5032 paramStream << NTC_PARAM_SRC << WEB_PARAM_EQUALS << url;
5033 std::string param = paramStream.str();
5034 CallResRegisterMethod(updateUrlMethod_, param, nullptr);
5035 }
5036
CallWebRouterBack()5037 void WebDelegate::CallWebRouterBack()
5038 {
5039 hash_ = MakeResourceHash();
5040 routerBackMethod_ = MakeMethodHash(WEB_METHOD_ROUTER_BACK);
5041 CallResRegisterMethod(routerBackMethod_, WEB_PARAM_NONE, nullptr);
5042 }
5043
CallPopPageSuccessPageUrl(const std::string & url)5044 void WebDelegate::CallPopPageSuccessPageUrl(const std::string& url)
5045 {
5046 hash_ = MakeResourceHash();
5047 changePageUrlMethod_ = MakeMethodHash(WEB_METHOD_CHANGE_PAGE_URL);
5048 std::stringstream paramStream;
5049 paramStream << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS << url;
5050 std::string param = paramStream.str();
5051 CallResRegisterMethod(changePageUrlMethod_, param, nullptr);
5052 }
5053
CallIsPagePathInvalid(const bool & isPageInvalid)5054 void WebDelegate::CallIsPagePathInvalid(const bool& isPageInvalid)
5055 {
5056 hash_ = MakeResourceHash();
5057 isPagePathInvalidMethod_ = MakeMethodHash(WEB_METHOD_PAGE_PATH_INVALID);
5058 std::stringstream paramStream;
5059 paramStream << NTC_PARAM_PAGE_INVALID << WEB_PARAM_EQUALS << isPageInvalid;
5060 std::string param = paramStream.str();
5061 CallResRegisterMethod(isPagePathInvalidMethod_, param, nullptr);
5062 }
5063
RecordWebEvent(Recorder::EventType eventType,const std::string & param) const5064 void WebDelegate::RecordWebEvent(Recorder::EventType eventType, const std::string& param) const
5065 {
5066 if (!Recorder::EventRecorder::Get().IsRecordEnable(Recorder::EventCategory::CATEGORY_WEB)) {
5067 return;
5068 }
5069 auto pattern = webPattern_.Upgrade();
5070 CHECK_NULL_VOID(pattern);
5071 auto host = pattern->GetHost();
5072 CHECK_NULL_VOID(host);
5073 Recorder::EventParamsBuilder builder;
5074 builder.SetId(host->GetInspectorIdValue(""))
5075 .SetType(host->GetHostTag())
5076 .SetEventCategory(Recorder::EventCategory::CATEGORY_WEB)
5077 .SetEventType(eventType)
5078 .SetText(param)
5079 .SetExtra("active", pattern->GetActiveStatus() ? "true" : "false")
5080 .SetHost(host)
5081 .SetDescription(host->GetAutoEventParamValue(""));
5082 Recorder::EventRecorder::Get().OnEvent(std::move(builder));
5083 }
5084
OnPageStarted(const std::string & param)5085 void WebDelegate::OnPageStarted(const std::string& param)
5086 {
5087 CHECK_NULL_VOID(taskExecutor_);
5088 taskExecutor_->PostTask(
5089 [weak = WeakClaim(this), param]() {
5090 auto delegate = weak.Upgrade();
5091 CHECK_NULL_VOID(delegate);
5092 auto webPattern = delegate->webPattern_.Upgrade();
5093 CHECK_NULL_VOID(webPattern);
5094 auto webEventHub = webPattern->GetWebEventHub();
5095 CHECK_NULL_VOID(webEventHub);
5096 webEventHub->FireOnPageStartedEvent(std::make_shared<LoadWebPageStartEvent>(param));
5097 delegate->RecordWebEvent(Recorder::EventType::WEB_PAGE_BEGIN, param);
5098 delegate->ResetStateOfDataDetectorJS();
5099 webPattern->InitDataDetector();
5100 },
5101 TaskExecutor::TaskType::JS, "ArkUIWebPageStarted");
5102 auto pattern = webPattern_.Upgrade();
5103 CHECK_NULL_VOID(pattern);
5104 pattern->DestroyAnalyzerOverlay();
5105 pattern->OnTooltip("");
5106 }
5107
OnPageFinished(const std::string & param)5108 void WebDelegate::OnPageFinished(const std::string& param)
5109 {
5110 CHECK_NULL_VOID(taskExecutor_);
5111 taskExecutor_->PostTask(
5112 [weak = WeakClaim(this), param]() {
5113 auto delegate = weak.Upgrade();
5114 CHECK_NULL_VOID(delegate);
5115 auto webPattern = delegate->webPattern_.Upgrade();
5116 CHECK_NULL_VOID(webPattern);
5117 auto webEventHub = webPattern->GetWebEventHub();
5118 CHECK_NULL_VOID(webEventHub);
5119 webEventHub->FireOnPageFinishedEvent(std::make_shared<LoadWebPageFinishEvent>(param));
5120 webPattern->OnScrollEndRecursive(std::nullopt);
5121 delegate->RecordWebEvent(Recorder::EventType::WEB_PAGE_END, param);
5122 auto pageUrl = delegate->GetUrl();
5123 if (pageUrl != "about:blank") {
5124 TAG_LOGI(AceLogTag::ACE_WEB, "OnPageFinished:Start to RunJsInit.");
5125 webPattern->RunJsInit();
5126 }
5127 delegate->RunDataDetectorJS();
5128 },
5129 TaskExecutor::TaskType::JS, "ArkUIWebPageFinished");
5130
5131 AccessibilitySendPageChange();
5132 }
5133
SetPageFinishedState(const bool & state)5134 void WebDelegate::SetPageFinishedState(const bool& state)
5135 {
5136 isPageFinished_ = state;
5137 }
5138
GetPageFinishedState()5139 bool WebDelegate::GetPageFinishedState()
5140 {
5141 return isPageFinished_;
5142 }
5143
OnLoadStarted(const std::string & param)5144 void WebDelegate::OnLoadStarted(const std::string& param)
5145 {
5146 CHECK_NULL_VOID(taskExecutor_);
5147 taskExecutor_->PostTask(
5148 [weak = WeakClaim(this), param]() {
5149 auto delegate = weak.Upgrade();
5150 CHECK_NULL_VOID(delegate);
5151 auto webPattern = delegate->webPattern_.Upgrade();
5152 CHECK_NULL_VOID(webPattern);
5153 auto webEventHub = webPattern->GetWebEventHub();
5154 CHECK_NULL_VOID(webEventHub);
5155 webEventHub->FireOnLoadStartedEvent(std::make_shared<LoadStartedEvent>(param));
5156 delegate->RecordWebEvent(Recorder::EventType::LOAD_STARTED, param);
5157 },
5158 TaskExecutor::TaskType::JS, "ArkUIWebLoadStarted");
5159 }
5160
OnLoadFinished(const std::string & param)5161 void WebDelegate::OnLoadFinished(const std::string& param)
5162 {
5163 CHECK_NULL_VOID(taskExecutor_);
5164 taskExecutor_->PostTask(
5165 [weak = WeakClaim(this), param]() {
5166 auto delegate = weak.Upgrade();
5167 CHECK_NULL_VOID(delegate);
5168 auto webPattern = delegate->webPattern_.Upgrade();
5169 CHECK_NULL_VOID(webPattern);
5170 auto webEventHub = webPattern->GetWebEventHub();
5171 CHECK_NULL_VOID(webEventHub);
5172 webEventHub->FireOnLoadFinishedEvent(std::make_shared<LoadFinishedEvent>(param));
5173 webPattern->OnScrollEndRecursive(std::nullopt);
5174 delegate->RecordWebEvent(Recorder::EventType::LOAD_FINISHED, param);
5175 },
5176 TaskExecutor::TaskType::JS, "ArkUIWebLoadFinished");
5177 }
5178
OnProgressChanged(int param)5179 void WebDelegate::OnProgressChanged(int param)
5180 {
5181 CHECK_NULL_VOID(taskExecutor_);
5182 taskExecutor_->PostTask(
5183 [weak = WeakClaim(this), param]() {
5184 auto delegate = weak.Upgrade();
5185 CHECK_NULL_VOID(delegate);
5186 auto eventParam = std::make_shared<LoadWebProgressChangeEvent>(param);
5187 if (Container::IsCurrentUseNewPipeline()) {
5188 auto webPattern = delegate->webPattern_.Upgrade();
5189 CHECK_NULL_VOID(webPattern);
5190 auto webEventHub = webPattern->GetWebEventHub();
5191 CHECK_NULL_VOID(webEventHub);
5192 webEventHub->FireOnProgressChangeEvent(eventParam);
5193 return;
5194 }
5195 auto webCom = delegate->webComponent_.Upgrade();
5196 CHECK_NULL_VOID(webCom);
5197 webCom->OnProgressChange(eventParam.get());
5198 },
5199 TaskExecutor::TaskType::JS, "ArkUIWebProgressChanged");
5200 }
5201
OnReceivedTitle(const std::string & title,bool isRealTitle)5202 void WebDelegate::OnReceivedTitle(const std::string& title, bool isRealTitle)
5203 {
5204 CHECK_NULL_VOID(taskExecutor_);
5205 taskExecutor_->PostTask(
5206 [weak = WeakClaim(this), title, isRealTitle]() {
5207 auto delegate = weak.Upgrade();
5208 CHECK_NULL_VOID(delegate);
5209 // ace 2.0
5210 auto onTitleReceiveV2 = delegate->onTitleReceiveV2_;
5211 if (onTitleReceiveV2) {
5212 onTitleReceiveV2(std::make_shared<LoadWebTitleReceiveEvent>(title, isRealTitle));
5213 }
5214 },
5215 TaskExecutor::TaskType::JS, "ArkUIWebReceivedTitle");
5216 }
5217
ExitFullScreen()5218 void WebDelegate::ExitFullScreen()
5219 {
5220 if (Container::IsCurrentUseNewPipeline()) {
5221 auto webPattern = webPattern_.Upgrade();
5222 CHECK_NULL_VOID(webPattern);
5223 webPattern->ExitFullScreen();
5224 }
5225 }
5226
OnFullScreenExit()5227 void WebDelegate::OnFullScreenExit()
5228 {
5229 CHECK_NULL_VOID(taskExecutor_);
5230 taskExecutor_->PostTask(
5231 [weak = WeakClaim(this)]() {
5232 auto delegate = weak.Upgrade();
5233 CHECK_NULL_VOID(delegate);
5234 auto param = std::make_shared<FullScreenExitEvent>(false);
5235 #ifdef NG_BUILD
5236 auto webPattern = delegate->webPattern_.Upgrade();
5237 CHECK_NULL_VOID(webPattern);
5238 auto webEventHub = webPattern->GetWebEventHub();
5239 CHECK_NULL_VOID(webEventHub);
5240 auto propOnFullScreenExitEvent = webEventHub->GetOnFullScreenExitEvent();
5241 CHECK_NULL_VOID(propOnFullScreenExitEvent);
5242 propOnFullScreenExitEvent(param);
5243 return;
5244 #else
5245 if (Container::IsCurrentUseNewPipeline()) {
5246 auto webPattern = delegate->webPattern_.Upgrade();
5247 CHECK_NULL_VOID(webPattern);
5248 auto webEventHub = webPattern->GetWebEventHub();
5249 CHECK_NULL_VOID(webEventHub);
5250 auto propOnFullScreenExitEvent = webEventHub->GetOnFullScreenExitEvent();
5251 CHECK_NULL_VOID(propOnFullScreenExitEvent);
5252 propOnFullScreenExitEvent(param);
5253 return;
5254 }
5255 // ace 2.0
5256 auto onFullScreenExitV2 = delegate->onFullScreenExitV2_;
5257 if (onFullScreenExitV2) {
5258 onFullScreenExitV2(param);
5259 }
5260 #endif
5261 },
5262 TaskExecutor::TaskType::JS, "ArkUIWebFullScreenExit");
5263 }
5264
OnGeolocationPermissionsHidePrompt()5265 void WebDelegate::OnGeolocationPermissionsHidePrompt()
5266 {
5267 CHECK_NULL_VOID(taskExecutor_);
5268 taskExecutor_->PostTask(
5269 [weak = WeakClaim(this)]() {
5270 auto delegate = weak.Upgrade();
5271 CHECK_NULL_VOID(delegate);
5272 // ace 2.0
5273 auto onGeolocationHideV2 = delegate->onGeolocationHideV2_;
5274 if (onGeolocationHideV2) {
5275 onGeolocationHideV2(std::make_shared<LoadWebGeolocationHideEvent>(""));
5276 }
5277 },
5278 TaskExecutor::TaskType::JS, "ArkUIWebGeolocationPermissionsHidePrompt");
5279 }
5280
OnGeolocationPermissionsShowPrompt(const std::string & origin,const std::shared_ptr<OHOS::NWeb::NWebGeolocationCallbackInterface> & callback)5281 void WebDelegate::OnGeolocationPermissionsShowPrompt(
5282 const std::string& origin, const std::shared_ptr<OHOS::NWeb::NWebGeolocationCallbackInterface>& callback)
5283 {
5284 CHECK_NULL_VOID(taskExecutor_);
5285 taskExecutor_->PostTask(
5286 [weak = WeakClaim(this), origin, callback]() {
5287 auto delegate = weak.Upgrade();
5288 CHECK_NULL_VOID(delegate);
5289 // ace 2.0
5290 auto onGeolocationShowV2 = delegate->onGeolocationShowV2_;
5291 if (onGeolocationShowV2) {
5292 auto geolocation =
5293 AceType::MakeRefPtr<WebGeolocationOhos>(callback,
5294 delegate->incognitoMode_);
5295 onGeolocationShowV2(std::make_shared<LoadWebGeolocationShowEvent>(origin, geolocation));
5296 }
5297 },
5298 TaskExecutor::TaskType::JS, "ArkUIWebGeolocationPermissionsShowPrompt");
5299 }
5300
OnPermissionRequestPrompt(const std::shared_ptr<OHOS::NWeb::NWebAccessRequest> & request)5301 void WebDelegate::OnPermissionRequestPrompt(const std::shared_ptr<OHOS::NWeb::NWebAccessRequest>& request)
5302 {
5303 CHECK_NULL_VOID(taskExecutor_);
5304 taskExecutor_->PostTask(
5305 [weak = WeakClaim(this), request]() {
5306 auto delegate = weak.Upgrade();
5307 CHECK_NULL_VOID(delegate);
5308 if (static_cast<uint32_t>(request->ResourceAcessId())
5309 & OHOS::NWeb::NWebAccessRequest::Resources::CLIPBOARD_READ_WRITE) {
5310 auto webPattern = delegate->webPattern_.Upgrade();
5311 CHECK_NULL_VOID(webPattern);
5312 auto clipboardCallback = webPattern->GetPermissionClipboardCallback();
5313 CHECK_NULL_VOID(clipboardCallback);
5314 clipboardCallback(std::make_shared<WebPermissionRequestEvent>(
5315 AceType::MakeRefPtr<WebPermissionRequestOhos>(request)));
5316 return;
5317 }
5318 // ace 2.0
5319 auto onPermissionRequestV2 = delegate->onPermissionRequestV2_;
5320 if (onPermissionRequestV2) {
5321 onPermissionRequestV2(std::make_shared<WebPermissionRequestEvent>(
5322 AceType::MakeRefPtr<WebPermissionRequestOhos>(request)));
5323 }
5324 },
5325 TaskExecutor::TaskType::JS, "ArkUIWebPermissionRequestPrompt");
5326 }
5327
OnScreenCaptureRequest(const std::shared_ptr<OHOS::NWeb::NWebScreenCaptureAccessRequest> & request)5328 void WebDelegate::OnScreenCaptureRequest(const std::shared_ptr<OHOS::NWeb::NWebScreenCaptureAccessRequest>& request)
5329 {
5330 CHECK_NULL_VOID(taskExecutor_);
5331 taskExecutor_->PostTask(
5332 [weak = WeakClaim(this), request]() {
5333 auto delegate = weak.Upgrade();
5334 CHECK_NULL_VOID(delegate);
5335 // ace 2.0
5336 auto onScreenCaptureRequestV2 = delegate->onScreenCaptureRequestV2_;
5337 if (onScreenCaptureRequestV2) {
5338 onScreenCaptureRequestV2(std::make_shared<WebScreenCaptureRequestEvent>(
5339 AceType::MakeRefPtr<WebScreenCaptureRequestOhos>(request)));
5340 }
5341 },
5342 TaskExecutor::TaskType::JS, "ArkUIWebScreenCaptureRequest");
5343 }
5344
OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)5345 bool WebDelegate::OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)
5346 {
5347 CHECK_NULL_RETURN(taskExecutor_, false);
5348 bool result = false;
5349 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
5350 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), message, &result]() {
5351 auto delegate = weak.Upgrade();
5352 CHECK_NULL_VOID(delegate);
5353 auto param = std::make_shared<LoadWebConsoleLogEvent>(AceType::MakeRefPtr<ConsoleLogOhos>(message));
5354 if (Container::IsCurrentUseNewPipeline()) {
5355 auto webPattern = delegate->webPattern_.Upgrade();
5356 CHECK_NULL_VOID(webPattern);
5357 auto webEventHub = webPattern->GetWebEventHub();
5358 CHECK_NULL_VOID(webEventHub);
5359 auto propOnConsoleEvent = webEventHub->GetOnConsoleEvent();
5360 CHECK_NULL_VOID(propOnConsoleEvent);
5361 result = propOnConsoleEvent(param);
5362 return;
5363 }
5364 auto webCom = delegate->webComponent_.Upgrade();
5365 CHECK_NULL_VOID(webCom);
5366 result = webCom->OnConsole(param.get());
5367 return;
5368 }, "ArkUIWebConsoleLog");
5369 return result;
5370 }
5371
OnCommonDialog(const std::shared_ptr<BaseEventInfo> & info,DialogEventType dialogEventType)5372 bool WebDelegate::OnCommonDialog(const std::shared_ptr<BaseEventInfo>& info, DialogEventType dialogEventType)
5373 {
5374 CHECK_NULL_RETURN(taskExecutor_, false);
5375 bool result = false;
5376 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
5377 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, dialogEventType, &result]() {
5378 auto delegate = weak.Upgrade();
5379 CHECK_NULL_VOID(delegate);
5380 #ifdef NG_BUILD
5381 auto webPattern = delegate->webPattern_.Upgrade();
5382 CHECK_NULL_VOID(webPattern);
5383 auto webEventHub = webPattern->GetWebEventHub();
5384 CHECK_NULL_VOID(webEventHub);
5385 result = webEventHub->FireOnCommonDialogEvent(info, dialogEventType);
5386 return;
5387 #else
5388 if (Container::IsCurrentUseNewPipeline()) {
5389 auto webPattern = delegate->webPattern_.Upgrade();
5390 CHECK_NULL_VOID(webPattern);
5391 auto webEventHub = webPattern->GetWebEventHub();
5392 CHECK_NULL_VOID(webEventHub);
5393 result = webEventHub->FireOnCommonDialogEvent(info, dialogEventType);
5394 return;
5395 }
5396 auto webCom = delegate->webComponent_.Upgrade();
5397 CHECK_NULL_VOID(webCom);
5398 result = webCom->OnCommonDialog(info.get(), dialogEventType);
5399 return;
5400 #endif
5401 }, "ArkUIWebCommonDialogEvent");
5402 return result;
5403 }
5404
OnFullScreenEnter(std::shared_ptr<OHOS::NWeb::NWebFullScreenExitHandler> handler,int videoNaturalWidth,int videoNaturalHeight)5405 void WebDelegate::OnFullScreenEnter(
5406 std::shared_ptr<OHOS::NWeb::NWebFullScreenExitHandler> handler, int videoNaturalWidth, int videoNaturalHeight)
5407 {
5408 CHECK_NULL_VOID(taskExecutor_);
5409 taskExecutor_->PostTask(
5410 [weak = WeakClaim(this), handler, videoNaturalWidth, videoNaturalHeight]() {
5411 auto delegate = weak.Upgrade();
5412 CHECK_NULL_VOID(delegate);
5413 auto param =
5414 std::make_shared<FullScreenEnterEvent>(AceType::MakeRefPtr<FullScreenExitHandlerOhos>(handler, weak),
5415 videoNaturalWidth, videoNaturalHeight);
5416 #ifdef NG_BUILD
5417 auto webPattern = delegate->webPattern_.Upgrade();
5418 CHECK_NULL_VOID(webPattern);
5419 webPattern->RequestFullScreen();
5420 webPattern->SetFullScreenExitHandler(param);
5421 auto webEventHub = webPattern->GetWebEventHub();
5422 CHECK_NULL_VOID(webEventHub);
5423 auto propOnFullScreenEnterEvent = webEventHub->GetOnFullScreenEnterEvent();
5424 CHECK_NULL_VOID(propOnFullScreenEnterEvent);
5425 propOnFullScreenEnterEvent(param);
5426 return;
5427 #else
5428 if (Container::IsCurrentUseNewPipeline()) {
5429 auto webPattern = delegate->webPattern_.Upgrade();
5430 CHECK_NULL_VOID(webPattern);
5431 webPattern->RequestFullScreen();
5432 webPattern->SetFullScreenExitHandler(param);
5433 auto webEventHub = webPattern->GetWebEventHub();
5434 CHECK_NULL_VOID(webEventHub);
5435 auto propOnFullScreenEnterEvent = webEventHub->GetOnFullScreenEnterEvent();
5436 CHECK_NULL_VOID(propOnFullScreenEnterEvent);
5437 propOnFullScreenEnterEvent(param);
5438 return;
5439 }
5440 auto webCom = delegate->webComponent_.Upgrade();
5441 CHECK_NULL_VOID(webCom);
5442 webCom->OnFullScreenEnter(param.get());
5443 #endif
5444 },
5445 TaskExecutor::TaskType::JS, "ArkUIWebFullScreenEnter");
5446 }
5447
OnHttpAuthRequest(const std::shared_ptr<BaseEventInfo> & info)5448 bool WebDelegate::OnHttpAuthRequest(const std::shared_ptr<BaseEventInfo>& info)
5449 {
5450 CHECK_NULL_RETURN(taskExecutor_, false);
5451 bool result = false;
5452 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
5453 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5454 auto delegate = weak.Upgrade();
5455 CHECK_NULL_VOID(delegate);
5456 #ifdef NG_BUILD
5457 auto webPattern = delegate->webPattern_.Upgrade();
5458 CHECK_NULL_VOID(webPattern);
5459 auto webEventHub = webPattern->GetWebEventHub();
5460 CHECK_NULL_VOID(webEventHub);
5461 auto propOnHttpAuthRequestEvent = webEventHub->GetOnHttpAuthRequestEvent();
5462 CHECK_NULL_VOID(propOnHttpAuthRequestEvent);
5463 result = propOnHttpAuthRequestEvent(info);
5464 return;
5465 #else
5466 if (Container::IsCurrentUseNewPipeline()) {
5467 auto webPattern = delegate->webPattern_.Upgrade();
5468 CHECK_NULL_VOID(webPattern);
5469 auto webEventHub = webPattern->GetWebEventHub();
5470 CHECK_NULL_VOID(webEventHub);
5471 auto propOnHttpAuthRequestEvent = webEventHub->GetOnHttpAuthRequestEvent();
5472 CHECK_NULL_VOID(propOnHttpAuthRequestEvent);
5473 result = propOnHttpAuthRequestEvent(info);
5474 return;
5475 }
5476 auto webCom = delegate->webComponent_.Upgrade();
5477 CHECK_NULL_VOID(webCom);
5478 result = webCom->OnHttpAuthRequest(info.get());
5479 #endif
5480 }, "ArkUIWebHttpAuthRequest");
5481 return result;
5482 }
5483
OnSslErrorRequest(const std::shared_ptr<BaseEventInfo> & info)5484 bool WebDelegate::OnSslErrorRequest(const std::shared_ptr<BaseEventInfo>& info)
5485 {
5486 CHECK_NULL_RETURN(taskExecutor_, false);
5487 bool result = false;
5488 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
5489 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5490 auto delegate = weak.Upgrade();
5491 CHECK_NULL_VOID(delegate);
5492 #ifdef NG_BUILD
5493 auto webPattern = delegate->webPattern_.Upgrade();
5494 CHECK_NULL_VOID(webPattern);
5495 auto webEventHub = webPattern->GetWebEventHub();
5496 CHECK_NULL_VOID(webEventHub);
5497 auto propOnSslErrorEvent = webEventHub->GetOnSslErrorRequestEvent();
5498 CHECK_NULL_VOID(propOnSslErrorEvent);
5499 result = propOnSslErrorEvent(info);
5500 return;
5501 #else
5502 if (Container::IsCurrentUseNewPipeline()) {
5503 auto webPattern = delegate->webPattern_.Upgrade();
5504 CHECK_NULL_VOID(webPattern);
5505 auto webEventHub = webPattern->GetWebEventHub();
5506 CHECK_NULL_VOID(webEventHub);
5507 auto propOnSslErrorEvent = webEventHub->GetOnSslErrorRequestEvent();
5508 CHECK_NULL_VOID(propOnSslErrorEvent);
5509 result = propOnSslErrorEvent(info);
5510 return;
5511 }
5512 auto webCom = delegate->webComponent_.Upgrade();
5513 CHECK_NULL_VOID(webCom);
5514 result = webCom->OnSslErrorRequest(info.get());
5515 #endif
5516 }, "ArkUIWebSslErrorRequest");
5517 return result;
5518 }
5519
OnAllSslErrorRequest(const std::shared_ptr<BaseEventInfo> & info)5520 bool WebDelegate::OnAllSslErrorRequest(const std::shared_ptr<BaseEventInfo>& info)
5521 {
5522 CHECK_NULL_RETURN(taskExecutor_, false);
5523 bool result = false;
5524 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
5525 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5526 auto delegate = weak.Upgrade();
5527 CHECK_NULL_VOID(delegate);
5528 auto webPattern = delegate->webPattern_.Upgrade();
5529 CHECK_NULL_VOID(webPattern);
5530 auto webEventHub = webPattern->GetWebEventHub();
5531 CHECK_NULL_VOID(webEventHub);
5532 auto propOnAllSslErrorEvent = webEventHub->GetOnAllSslErrorRequestEvent();
5533 CHECK_NULL_VOID(propOnAllSslErrorEvent);
5534 result = propOnAllSslErrorEvent(info);
5535 return;
5536 }, "ArkUIWebAllSslErrorRequest");
5537 return result;
5538 }
5539
OnSslSelectCertRequest(const std::shared_ptr<BaseEventInfo> & info)5540 bool WebDelegate::OnSslSelectCertRequest(const std::shared_ptr<BaseEventInfo>& info)
5541 {
5542 CHECK_NULL_RETURN(taskExecutor_, false);
5543 bool result = false;
5544 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
5545 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5546 auto delegate = weak.Upgrade();
5547 CHECK_NULL_VOID(delegate);
5548 #ifdef NG_BUILD
5549 auto webPattern = delegate->webPattern_.Upgrade();
5550 CHECK_NULL_VOID(webPattern);
5551 auto webEventHub = webPattern->GetWebEventHub();
5552 CHECK_NULL_VOID(webEventHub);
5553 auto propOnSslSelectCertRequestEvent = webEventHub->GetOnSslSelectCertRequestEvent();
5554 CHECK_NULL_VOID(propOnSslSelectCertRequestEvent);
5555 result = propOnSslSelectCertRequestEvent(info);
5556 return;
5557 #else
5558 if (Container::IsCurrentUseNewPipeline()) {
5559 auto webPattern = delegate->webPattern_.Upgrade();
5560 CHECK_NULL_VOID(webPattern);
5561 auto webEventHub = webPattern->GetWebEventHub();
5562 CHECK_NULL_VOID(webEventHub);
5563 auto propOnSslSelectCertRequestEvent = webEventHub->GetOnSslSelectCertRequestEvent();
5564 CHECK_NULL_VOID(propOnSslSelectCertRequestEvent);
5565 result = propOnSslSelectCertRequestEvent(info);
5566 return;
5567 }
5568 auto webCom = delegate->webComponent_.Upgrade();
5569 CHECK_NULL_VOID(webCom);
5570 result = webCom->OnSslSelectCertRequest(info.get());
5571 #endif
5572 }, "ArkUIWebSslSelectCertRequest");
5573 return result;
5574 }
5575
OnDownloadStart(const std::string & url,const std::string & userAgent,const std::string & contentDisposition,const std::string & mimetype,long contentLength)5576 void WebDelegate::OnDownloadStart(const std::string& url, const std::string& userAgent,
5577 const std::string& contentDisposition, const std::string& mimetype, long contentLength)
5578 {
5579 CHECK_NULL_VOID(taskExecutor_);
5580 taskExecutor_->PostTask(
5581 [weak = WeakClaim(this), url, userAgent, contentDisposition, mimetype, contentLength]() {
5582 auto delegate = weak.Upgrade();
5583 CHECK_NULL_VOID(delegate);
5584 auto onDownloadStartV2 = delegate->onDownloadStartV2_;
5585 if (onDownloadStartV2) {
5586 onDownloadStartV2(
5587 std::make_shared<DownloadStartEvent>(url, userAgent, contentDisposition, mimetype, contentLength));
5588 }
5589 },
5590 TaskExecutor::TaskType::JS, "ArkUIWebDownloadStart");
5591 }
5592
OnAccessibilityEvent(int64_t accessibilityId,AccessibilityEventType eventType,const std::string & argument)5593 void WebDelegate::OnAccessibilityEvent(
5594 int64_t accessibilityId, AccessibilityEventType eventType, const std::string& argument)
5595 {
5596 if (!accessibilityState_) {
5597 return;
5598 }
5599 auto context = context_.Upgrade();
5600 CHECK_NULL_VOID(context);
5601 AccessibilityEvent event;
5602 if (eventType == AccessibilityEventType::ANNOUNCE_FOR_ACCESSIBILITY ||
5603 eventType == AccessibilityEventType::ANNOUNCE_FOR_ACCESSIBILITY_NOT_INTERRUPT) {
5604 event.textAnnouncedForAccessibility = argument;
5605 }
5606 auto webPattern = webPattern_.Upgrade();
5607 CHECK_NULL_VOID(webPattern);
5608 auto accessibilityManager = context->GetAccessibilityManager();
5609 CHECK_NULL_VOID(accessibilityManager);
5610 if (accessibilityId != 0) {
5611 if (accessibilityManager->IsScreenReaderEnabled()) {
5612 if (eventType == AccessibilityEventType::ACCESSIBILITY_FOCUSED) {
5613 webPattern->UpdateFocusedAccessibilityId(accessibilityId);
5614 } else if (eventType == AccessibilityEventType::ACCESSIBILITY_FOCUS_CLEARED) {
5615 webPattern->ClearFocusedAccessibilityId();
5616 } else if (eventType == AccessibilityEventType::CHANGE) {
5617 webPattern->UpdateFocusedAccessibilityId();
5618 }
5619 }
5620 if (eventType == AccessibilityEventType::CLICK) {
5621 WebComponentClickReport(accessibilityId);
5622 }
5623 if (eventType == AccessibilityEventType::FOCUS ||
5624 eventType == AccessibilityEventType::BLUR ||
5625 eventType == AccessibilityEventType::TEXT_CHANGE) {
5626 auto report = webPattern->GetAccessibilityEventReport();
5627 CHECK_NULL_VOID(report);
5628 report->ReportEvent(eventType, accessibilityId);
5629 }
5630 event.nodeId = accessibilityId;
5631 event.type = eventType;
5632 accessibilityManager->SendWebAccessibilityAsyncEvent(event, webPattern);
5633 } else {
5634 auto webNode = webPattern->GetHost();
5635 CHECK_NULL_VOID(webNode);
5636 event.nodeId = webNode->GetAccessibilityId();
5637 event.type = eventType;
5638 accessibilityManager->SendAccessibilityAsyncEvent(event);
5639 }
5640 }
5641
WebComponentClickReport(int64_t accessibilityId)5642 void WebDelegate::WebComponentClickReport(int64_t accessibilityId)
5643 {
5644 auto webPattern = webPattern_.Upgrade();
5645 CHECK_NULL_VOID(webPattern);
5646 auto webAccessibilityNode = webPattern->GetAccessibilityNodeById(accessibilityId);
5647 CHECK_NULL_VOID(webAccessibilityNode);
5648 auto webComponentClickCallback = webPattern->GetWebComponentClickCallback();
5649 CHECK_NULL_VOID(webComponentClickCallback);
5650 webComponentClickCallback(accessibilityId, webAccessibilityNode->GetContent());
5651 }
5652
OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)5653 void WebDelegate::OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
5654 std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)
5655 {
5656 CHECK_NULL_VOID(taskExecutor_);
5657 taskExecutor_->PostTask(
5658 [weak = WeakClaim(this), request, error]() {
5659 auto delegate = weak.Upgrade();
5660 CHECK_NULL_VOID(delegate);
5661 auto webPattern = delegate->webPattern_.Upgrade();
5662 CHECK_NULL_VOID(webPattern);
5663 auto webEventHub = webPattern->GetWebEventHub();
5664 CHECK_NULL_VOID(webEventHub);
5665 webEventHub->FireOnErrorReceiveEvent(std::make_shared<ReceivedErrorEvent>(
5666 AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
5667 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
5668 AceType::MakeRefPtr<WebError>(error->ErrorInfo(), error->ErrorCode())));
5669 },
5670 TaskExecutor::TaskType::JS, "ArkUIWebErrorReceive");
5671
5672 if (error->ErrorCode() == ArkWeb_NetError::ARKWEB_ERR_INTERNET_DISCONNECTED ||
5673 error->ErrorCode() == ArkWeb_NetError::ARKWEB_ERR_NAME_NOT_RESOLVED) {
5674 AccessibilityReleasePageEvent();
5675 }
5676 }
5677
AccessibilitySendPageChange()5678 void WebDelegate::AccessibilitySendPageChange()
5679 {
5680 CHECK_NULL_VOID(taskExecutor_);
5681 taskExecutor_->PostDelayedTask(
5682 [weak = WeakClaim(this)]() {
5683 auto delegate = weak.Upgrade();
5684 CHECK_NULL_VOID(delegate);
5685 auto webPattern = delegate->webPattern_.Upgrade();
5686 CHECK_NULL_VOID(webPattern);
5687 auto context = AceType::DynamicCast<NG::PipelineContext>(delegate->context_.Upgrade());
5688 CHECK_NULL_VOID(context);
5689 auto webNode = webPattern->GetHost();
5690 CHECK_NULL_VOID(webNode);
5691 auto accessibilityManager = context->GetAccessibilityManager();
5692 CHECK_NULL_VOID(accessibilityManager);
5693 if (!accessibilityManager->IsScreenReaderEnabled()) {
5694 return;
5695 }
5696 delegate->SetPageFinishedState(true);
5697 if (webNode->IsOnMainTree()) {
5698 if (!webPattern->CheckVisible()) {
5699 bool deleteResult = accessibilityManager->DeleteFromPageEventController(webNode);
5700 TAG_LOGI(AceLogTag::ACE_WEB,
5701 "WebDelegate::AccessibilitySendPageChange CheckVisible accessibilityId = "
5702 "%{public}" PRId64 ", deleteResult = %{public}d",
5703 webNode->GetAccessibilityId(), deleteResult);
5704 return;
5705 }
5706 if (accessibilityManager->CheckPageEventCached(webNode, false)) {
5707 TAG_LOGI(AceLogTag::ACE_WEB,
5708 "WebDelegate::AccessibilitySendPageChange CheckPageEventCached accessibilityId = "
5709 "%{public}" PRId64,
5710 webNode->GetAccessibilityId());
5711 accessibilityManager->ReleasePageEvent(webNode, true, true);
5712 return;
5713 }
5714 auto navigationMgr = context->GetNavigationManager();
5715 if (navigationMgr && navigationMgr->IsNavigationInAnimation()) {
5716 TAG_LOGI(AceLogTag::ACE_WEB,
5717 "WebDelegate::AccessibilitySendPageChange IsNavigationInAnimation accessibilityId = "
5718 "%{public}" PRId64,
5719 webNode->GetAccessibilityId());
5720 accessibilityManager->ReleasePageEvent(webNode, true, true);
5721 return;
5722 }
5723 TAG_LOGI(AceLogTag::ACE_WEB,
5724 "WebDelegate::AccessibilitySendPageChange accessibilityId = %{public}" PRId64,
5725 webNode->GetAccessibilityId());
5726 accessibilityManager->ReleasePageEvent(webNode, true, true);
5727 AccessibilityEvent event;
5728 event.nodeId = webNode->GetAccessibilityId();
5729 event.type = AccessibilityEventType::PAGE_CHANGE;
5730 accessibilityManager->SendAccessibilityAsyncEvent(event);
5731 }
5732 },
5733 TaskExecutor::TaskType::UI, ACCESSIBILITY_PAGE_CHANGE_DELAY_MILLISECONDS,
5734 "ArkUIWebAccessibilitySendPageChange");
5735 }
5736
AccessibilityReleasePageEvent()5737 void WebDelegate::AccessibilityReleasePageEvent()
5738 {
5739 CHECK_NULL_VOID(taskExecutor_);
5740 taskExecutor_->PostDelayedTask(
5741 [weak = WeakClaim(this)]() {
5742 auto delegate = weak.Upgrade();
5743 CHECK_NULL_VOID(delegate);
5744 auto webPattern = delegate->webPattern_.Upgrade();
5745 CHECK_NULL_VOID(webPattern);
5746 auto context = AceType::DynamicCast<NG::PipelineContext>(delegate->context_.Upgrade());
5747 CHECK_NULL_VOID(context);
5748 auto webNode = webPattern->GetHost();
5749 CHECK_NULL_VOID(webNode);
5750 auto accessibilityManager = context->GetAccessibilityManager();
5751 CHECK_NULL_VOID(accessibilityManager);
5752 if (!accessibilityManager->IsScreenReaderEnabled()) {
5753 return;
5754 }
5755 if (webNode->IsOnMainTree()) {
5756 TAG_LOGI(AceLogTag::ACE_WEB,
5757 "WebDelegate::AccessibilityReleasePageEvent accessibilityId = %{public}" PRId64,
5758 webNode->GetAccessibilityId());
5759 accessibilityManager->ReleasePageEvent(webNode, true, true);
5760 }
5761 },
5762 TaskExecutor::TaskType::UI, ACCESSIBILITY_PAGE_CHANGE_DELAY_MILLISECONDS,
5763 "ArkUIWebAccessibilityReleasePageEvent");
5764 }
5765
ReportDynamicFrameLossEvent(const std::string & sceneId,bool isStart)5766 void WebDelegate::ReportDynamicFrameLossEvent(const std::string& sceneId, bool isStart)
5767 {
5768 if (sceneId == "") {
5769 TAG_LOGE(AceLogTag::ACE_WEB, "sceneId is null, do not report.");
5770 return;
5771 }
5772 ACE_SCOPED_TRACE("ReportDynamicFrameLossEvent, sceneId: %s, isStart: %u", sceneId.c_str(), isStart);
5773 if (isStart) {
5774 PerfMonitor::GetPerfMonitor()->Start(sceneId, PerfActionType::FIRST_MOVE, "");
5775 } else {
5776 PerfMonitor::GetPerfMonitor()->End(sceneId, false);
5777 }
5778 }
5779
OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)5780 void WebDelegate::OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
5781 std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)
5782 {
5783 if (onHttpErrorReceiveV2_) {
5784 onHttpErrorReceiveV2_(std::make_shared<ReceivedHttpErrorEvent>(
5785 AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
5786 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
5787 AceType::MakeRefPtr<WebResponse>(response->ResponseHeaders(), response->ResponseData(),
5788 response->ResponseEncoding(), response->ResponseMimeType(), response->ResponseStatus(),
5789 response->ResponseStatusCode())));
5790 }
5791 }
5792
IsEmptyOnInterceptRequest()5793 bool WebDelegate::IsEmptyOnInterceptRequest()
5794 {
5795 #ifdef NG_BUILD
5796 auto webPattern = webPattern_.Upgrade();
5797 CHECK_NULL_RETURN(webPattern, false);
5798 auto webEventHub = webPattern->GetWebEventHub();
5799 CHECK_NULL_RETURN(webEventHub, false);
5800 return webEventHub->GetOnInterceptRequestEvent() == nullptr;
5801 #else
5802 if (Container::IsCurrentUseNewPipeline()) {
5803 auto webPattern = webPattern_.Upgrade();
5804 CHECK_NULL_RETURN(webPattern, false);
5805 auto webEventHub = webPattern->GetWebEventHub();
5806 CHECK_NULL_RETURN(webEventHub, false);
5807 return webEventHub->GetOnInterceptRequestEvent() == nullptr;
5808 }
5809 auto webCom = webComponent_.Upgrade();
5810 CHECK_NULL_RETURN(webCom, true);
5811 return webCom->IsEmptyOnInterceptRequest();
5812 #endif
5813 }
5814
OnInterceptRequest(const std::shared_ptr<BaseEventInfo> & info)5815 RefPtr<WebResponse> WebDelegate::OnInterceptRequest(const std::shared_ptr<BaseEventInfo>& info)
5816 {
5817 auto context = context_.Upgrade();
5818 CHECK_NULL_RETURN(context, nullptr);
5819 RefPtr<WebResponse> result = nullptr;
5820 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5821 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5822 auto delegate = weak.Upgrade();
5823 CHECK_NULL_VOID(delegate);
5824 if (Container::IsCurrentUseNewPipeline()) {
5825 auto webPattern = delegate->webPattern_.Upgrade();
5826 CHECK_NULL_VOID(webPattern);
5827 auto webEventHub = webPattern->GetWebEventHub();
5828 CHECK_NULL_VOID(webEventHub);
5829 auto propOnInterceptRequestEvent = webEventHub->GetOnInterceptRequestEvent();
5830 CHECK_NULL_VOID(propOnInterceptRequestEvent);
5831 result = propOnInterceptRequestEvent(info);
5832 }
5833 auto webCom = delegate->webComponent_.Upgrade();
5834 CHECK_NULL_VOID(webCom);
5835 result = webCom->OnInterceptRequest(info.get());
5836 }, "ArkUIWebInterceptRequest");
5837 return result;
5838 }
5839
OnOverrideErrorPage(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> webResourceRequest,std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)5840 std::string WebDelegate::OnOverrideErrorPage(
5841 std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> webResourceRequest,
5842 std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)
5843 {
5844 auto context = context_.Upgrade();
5845 CHECK_NULL_RETURN(context, "");
5846 CHECK_NULL_RETURN(webResourceRequest, "");
5847 CHECK_NULL_RETURN(error, "");
5848 std::string result = "";
5849 auto info = std::make_shared<OnOverrideErrorPageEvent>(
5850 AceType::MakeRefPtr<WebRequest>(webResourceRequest->RequestHeaders(),
5851 webResourceRequest->Method(), webResourceRequest->Url(),
5852 webResourceRequest->FromGesture(), webResourceRequest->IsAboutMainFrame(),
5853 webResourceRequest->IsRequestRedirect()),
5854 AceType::MakeRefPtr<WebError>(error->ErrorInfo(), error->ErrorCode()));
5855 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5856 jsTaskExecutor.PostSyncTask(
5857 [weak = WeakClaim(this), info, &result]() {
5858 auto delegate = weak.Upgrade();
5859 CHECK_NULL_VOID(delegate);
5860 if (Container::IsCurrentUseNewPipeline()) {
5861 auto webPattern = delegate->webPattern_.Upgrade();
5862 CHECK_NULL_VOID(webPattern);
5863 auto webEventHub = webPattern->GetWebEventHub();
5864 CHECK_NULL_VOID(webEventHub);
5865 auto propOnOverrideErrorPageEvent = webEventHub->GetOnOverrideErrorPageEvent();
5866 CHECK_NULL_VOID(propOnOverrideErrorPageEvent);
5867 result = propOnOverrideErrorPageEvent(info);
5868 return;
5869 }
5870 auto webCom = delegate->webComponent_.Upgrade();
5871 CHECK_NULL_VOID(webCom);
5872 result = webCom->OnOverrideErrorPage(info.get());
5873 },
5874 "ArkUIWebOverrideErrorPage");
5875 return result;
5876 }
5877
OnTooltip(const std::string & tooltip)5878 void WebDelegate::OnTooltip(const std::string& tooltip)
5879 {
5880 auto context = context_.Upgrade();
5881 CHECK_NULL_VOID(context);
5882 context->GetTaskExecutor()->PostTask(
5883 [weak = WeakClaim(this), tooltip]() {
5884 auto delegate = weak.Upgrade();
5885 CHECK_NULL_VOID(delegate);
5886 auto webPattern = delegate->webPattern_.Upgrade();
5887 CHECK_NULL_VOID(webPattern);
5888 webPattern->OnTooltip(tooltip);
5889 },
5890 TaskExecutor::TaskType::UI, "ArkUIWebTooltip");
5891 }
5892
OnPopupSize(int32_t x,int32_t y,int32_t width,int32_t height)5893 void WebDelegate::OnPopupSize(int32_t x, int32_t y, int32_t width, int32_t height)
5894 {
5895 auto context = context_.Upgrade();
5896 CHECK_NULL_VOID(context);
5897 context->GetTaskExecutor()->PostTask(
5898 [weak = WeakClaim(this), x, y, width, height]() {
5899 auto delegate = weak.Upgrade();
5900 CHECK_NULL_VOID(delegate);
5901 auto webPattern = delegate->webPattern_.Upgrade();
5902 CHECK_NULL_VOID(webPattern);
5903 webPattern->OnPopupSize(x, y, width, height);
5904 },
5905 TaskExecutor::TaskType::UI, "ArkUIWebPopupSize");
5906 }
5907
GetVisibleRectToWeb(int & visibleX,int & visibleY,int & visibleWidth,int & visibleHeight)5908 void WebDelegate::GetVisibleRectToWeb(int& visibleX, int& visibleY, int& visibleWidth, int& visibleHeight)
5909 {
5910 auto webPattern = webPattern_.Upgrade();
5911 CHECK_NULL_VOID(webPattern);
5912 webPattern->GetVisibleRectToWeb(visibleX, visibleY, visibleWidth, visibleHeight);
5913 }
5914
OnPopupShow(bool show)5915 void WebDelegate::OnPopupShow(bool show)
5916 {
5917 auto context = context_.Upgrade();
5918 CHECK_NULL_VOID(context);
5919 context->GetTaskExecutor()->PostTask(
5920 [weak = WeakClaim(this), show]() {
5921 auto delegate = weak.Upgrade();
5922 CHECK_NULL_VOID(delegate);
5923 auto webPattern = delegate->webPattern_.Upgrade();
5924 CHECK_NULL_VOID(webPattern);
5925 webPattern->OnPopupShow(show);
5926 },
5927 TaskExecutor::TaskType::UI, "ArkUIWebPopupShow");
5928 }
5929
OnRequestFocus()5930 void WebDelegate::OnRequestFocus()
5931 {
5932 if (onRequestFocusV2_) {
5933 onRequestFocusV2_(std::make_shared<LoadWebRequestFocusEvent>(""));
5934 }
5935 }
5936
OnRenderExited(OHOS::NWeb::RenderExitReason reason)5937 void WebDelegate::OnRenderExited(OHOS::NWeb::RenderExitReason reason)
5938 {
5939 CHECK_NULL_VOID(taskExecutor_);
5940 taskExecutor_->PostTask(
5941 [weak = WeakClaim(this), reason]() {
5942 auto delegate = weak.Upgrade();
5943 CHECK_NULL_VOID(delegate);
5944 auto onRenderExitedV2 = delegate->onRenderExitedV2_;
5945 if (onRenderExitedV2) {
5946 onRenderExitedV2(std::make_shared<RenderExitedEvent>(static_cast<int32_t>(reason)));
5947 }
5948 },
5949 TaskExecutor::TaskType::JS, "ArkUIWebRenderExited");
5950 }
5951
OnRefreshAccessedHistory(const std::string & url,bool isRefreshed)5952 void WebDelegate::OnRefreshAccessedHistory(const std::string& url, bool isRefreshed)
5953 {
5954 CHECK_NULL_VOID(taskExecutor_);
5955 taskExecutor_->PostTask(
5956 [weak = WeakClaim(this), url, isRefreshed]() {
5957 auto delegate = weak.Upgrade();
5958 CHECK_NULL_VOID(delegate);
5959 auto onRefreshAccessedHistoryV2 = delegate->onRefreshAccessedHistoryV2_;
5960 if (onRefreshAccessedHistoryV2) {
5961 onRefreshAccessedHistoryV2(std::make_shared<RefreshAccessedHistoryEvent>(url, isRefreshed));
5962 }
5963 },
5964 TaskExecutor::TaskType::JS, "ArkUIWebRefreshAccessedHistory");
5965 }
5966
OnPageError(const std::string & param)5967 void WebDelegate::OnPageError(const std::string& param)
5968 {
5969 if (onPageError_) {
5970 int32_t errorCode = GetIntParam(param, NTC_PARAM_ERROR_CODE);
5971 std::string url = GetUrlStringParam(param, NTC_PARAM_URL);
5972 std::string description = GetStringParam(param, NTC_PARAM_DESCRIPTION);
5973
5974 std::string paramUrl = std::string(R"(")").append(url).append(std::string(R"(")")).append(",");
5975
5976 std::string paramErrorCode = std::string(R"(")")
5977 .append(NTC_PARAM_ERROR_CODE)
5978 .append(std::string(R"(")"))
5979 .append(":")
5980 .append(std::to_string(errorCode))
5981 .append(",");
5982
5983 std::string paramDesc = std::string(R"(")")
5984 .append(NTC_PARAM_DESCRIPTION)
5985 .append(std::string(R"(")"))
5986 .append(":")
5987 .append(std::string(R"(")").append(description).append(std::string(R"(")")));
5988 std::string errorParam =
5989 std::string(R"("error",{"url":)").append((paramUrl + paramErrorCode + paramDesc).append("},null"));
5990 onPageError_(errorParam);
5991 }
5992 }
5993
OnMessage(const std::string & param)5994 void WebDelegate::OnMessage(const std::string& param)
5995 {
5996 std::string removeQuotes = param;
5997 removeQuotes.erase(std::remove(removeQuotes.begin(), removeQuotes.end(), '\"'), removeQuotes.end());
5998 if (onMessage_) {
5999 std::string paramMessage = std::string(R"(")").append(removeQuotes).append(std::string(R"(")"));
6000 std::string messageParam = std::string(R"("message",{"message":)").append(paramMessage.append("},null"));
6001 onMessage_(messageParam);
6002 }
6003 }
6004
OnRouterPush(const std::string & param)6005 void WebDelegate::OnRouterPush(const std::string& param)
6006 {
6007 OHOS::Ace::Framework::DelegateClient::GetInstance().RouterPush(param);
6008 }
6009
OnFileSelectorShow(const std::shared_ptr<BaseEventInfo> & info)6010 bool WebDelegate::OnFileSelectorShow(const std::shared_ptr<BaseEventInfo>& info)
6011 {
6012 CHECK_NULL_RETURN(taskExecutor_, false);
6013 bool result = false;
6014 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
6015 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
6016 auto delegate = weak.Upgrade();
6017 CHECK_NULL_VOID(delegate);
6018 if (Container::IsCurrentUseNewPipeline()) {
6019 auto webPattern = delegate->webPattern_.Upgrade();
6020 CHECK_NULL_VOID(webPattern);
6021 auto webEventHub = webPattern->GetWebEventHub();
6022 CHECK_NULL_VOID(webEventHub);
6023 auto propOnFileSelectorShowEvent = webEventHub->GetOnFileSelectorShowEvent();
6024 CHECK_NULL_VOID(propOnFileSelectorShowEvent);
6025 result = propOnFileSelectorShowEvent(info);
6026 }
6027 auto webCom = delegate->webComponent_.Upgrade();
6028 CHECK_NULL_VOID(webCom);
6029 result = webCom->OnFileSelectorShow(info.get());
6030 }, "ArkUIWebFileSelectorShow");
6031
6032 if (!result) {
6033 TAG_LOGI(AceLogTag::ACE_WEB, "default file selector show handled");
6034 isFileSelectorShow_ = true;
6035 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
6036 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
6037 auto delegate = weak.Upgrade();
6038 CHECK_NULL_VOID(delegate);
6039 auto webPattern = delegate->webPattern_.Upgrade();
6040 CHECK_NULL_VOID(webPattern);
6041 auto fileSelectCallback = webPattern->GetDefaultFileSelectorShowCallback();
6042 CHECK_NULL_VOID(fileSelectCallback);
6043 fileSelectCallback(info);
6044 result = true;
6045 }, "ArkUIWebDefaultFileSelectorShow");
6046 }
6047 return result;
6048 }
6049
OnContextMenuShow(const std::shared_ptr<BaseEventInfo> & info)6050 bool WebDelegate::OnContextMenuShow(const std::shared_ptr<BaseEventInfo>& info)
6051 {
6052 CHECK_NULL_RETURN(taskExecutor_, false);
6053 bool result = false;
6054 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
6055 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
6056 auto delegate = weak.Upgrade();
6057 CHECK_NULL_VOID(delegate);
6058 #ifdef NG_BUILD
6059 auto webPattern = delegate->webPattern_.Upgrade();
6060 CHECK_NULL_VOID(webPattern);
6061 webPattern->SetAILinkMenuShow(false);
6062 if (delegate->richtextData_) {
6063 webPattern->OnContextMenuShow(info, true, true);
6064 result = true;
6065 }
6066 auto webEventHub = webPattern->GetWebEventHub();
6067 CHECK_NULL_VOID(webEventHub);
6068 auto *eventInfo = TypeInfoHelper::DynamicCast<ContextMenuEvent>(info.get());
6069 CHECK_NULL_VOID(eventInfo);
6070 auto contextMenuParam = eventInfo->GetParam();
6071 CHECK_NULL_VOID(contextMenuParam);
6072 if (!contextMenuParam->IsAILink()) {
6073 auto propOnContextMenuShowEvent = webEventHub->GetOnContextMenuShowEvent();
6074 CHECK_NULL_VOID(propOnContextMenuShowEvent);
6075 result = propOnContextMenuShowEvent(info);
6076 } else {
6077 result = true;
6078 }
6079 if (!delegate->richtextData_) {
6080 webPattern->OnContextMenuShow(info, false, result);
6081 }
6082 return;
6083 #else
6084 if (Container::IsCurrentUseNewPipeline()) {
6085 auto webPattern = delegate->webPattern_.Upgrade();
6086 CHECK_NULL_VOID(webPattern);
6087 webPattern->SetAILinkMenuShow(false);
6088 if (delegate->richtextData_) {
6089 webPattern->OnContextMenuShow(info, true, true);
6090 result = true;
6091 }
6092 auto webEventHub = webPattern->GetWebEventHub();
6093 CHECK_NULL_VOID(webEventHub);
6094 auto *eventInfo = TypeInfoHelper::DynamicCast<ContextMenuEvent>(info.get());
6095 CHECK_NULL_VOID(eventInfo);
6096 auto contextMenuParam = eventInfo->GetParam();
6097 CHECK_NULL_VOID(contextMenuParam);
6098 if (!contextMenuParam->IsAILink()) {
6099 auto propOnContextMenuShowEvent = webEventHub->GetOnContextMenuShowEvent();
6100 CHECK_NULL_VOID(propOnContextMenuShowEvent);
6101 result = propOnContextMenuShowEvent(info);
6102 } else {
6103 result = true;
6104 }
6105 if (!delegate->richtextData_) {
6106 webPattern->OnContextMenuShow(info, false, result);
6107 }
6108 return;
6109 }
6110 auto webCom = delegate->webComponent_.Upgrade();
6111 CHECK_NULL_VOID(webCom);
6112 result = webCom->OnContextMenuShow(info.get());
6113 #endif
6114 }, "ArkUIWebContextMenuShow");
6115 if (result) {
6116 auto webPattern = webPattern_.Upgrade();
6117 CHECK_NULL_RETURN(webPattern, result);
6118 webPattern->DestroyAnalyzerOverlay();
6119 }
6120 return result;
6121 }
6122
OnContextMenuHide(const std::string & info)6123 void WebDelegate::OnContextMenuHide(const std::string& info)
6124 {
6125 CHECK_NULL_VOID(taskExecutor_);
6126 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
6127 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info]() {
6128 auto delegate = weak.Upgrade();
6129 CHECK_NULL_VOID(delegate);
6130 if (Container::IsCurrentUseNewPipeline()) {
6131 auto webPattern = delegate->webPattern_.Upgrade();
6132 CHECK_NULL_VOID(webPattern);
6133 webPattern->OnContextMenuHide();
6134 auto webEventHub = webPattern->GetWebEventHub();
6135 CHECK_NULL_VOID(webEventHub);
6136 auto propOnContextMenuHideEvent = webEventHub->GetOnContextMenuHideEvent();
6137 CHECK_NULL_VOID(propOnContextMenuHideEvent);
6138 propOnContextMenuHideEvent(std::make_shared<ContextMenuHideEvent>(info));
6139 return;
6140 } else {
6141 TAG_LOGW(AceLogTag::ACE_WEB, "current is not new pipeline");
6142 }
6143 }, "ArkUIWebContextMenuHide");
6144 return;
6145 }
6146
OnHandleInterceptUrlLoading(const std::string & data)6147 bool WebDelegate::OnHandleInterceptUrlLoading(const std::string& data)
6148 {
6149 CHECK_NULL_RETURN(taskExecutor_, false);
6150 bool result = false;
6151 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
6152 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), data, &result]() {
6153 auto delegate = weak.Upgrade();
6154 CHECK_NULL_VOID(delegate);
6155 auto param = std::make_shared<UrlLoadInterceptEvent>(data);
6156 if (Container::IsCurrentUseNewPipeline()) {
6157 auto webPattern = delegate->webPattern_.Upgrade();
6158 CHECK_NULL_VOID(webPattern);
6159 auto webEventHub = webPattern->GetWebEventHub();
6160 CHECK_NULL_VOID(webEventHub);
6161 auto propOnUrlLoadInterceptEvent = webEventHub->GetOnUrlLoadInterceptEvent();
6162 CHECK_NULL_VOID(propOnUrlLoadInterceptEvent);
6163 result = propOnUrlLoadInterceptEvent(param);
6164 }
6165 auto webCom = delegate->webComponent_.Upgrade();
6166 CHECK_NULL_VOID(webCom);
6167 result = webCom->OnUrlLoadIntercept(param.get());
6168 }, "ArkUIWebHandleInterceptUrlLoading");
6169 return result;
6170 }
6171
RemoveSnapshotFrameNode(int removeDelayTime)6172 void WebDelegate::RemoveSnapshotFrameNode(int removeDelayTime)
6173 {
6174 TAG_LOGD(AceLogTag::ACE_WEB, "blankless WebDelegate::RemoveSnapshotFrameNode");
6175 auto context = context_.Upgrade();
6176 CHECK_NULL_VOID(context);
6177 CHECK_NULL_VOID(context->GetTaskExecutor());
6178 context->GetTaskExecutor()->PostDelayedTask(
6179 [weak = WeakClaim(this)]() {
6180 auto delegate = weak.Upgrade();
6181 CHECK_NULL_VOID(delegate);
6182 auto webPattern = delegate->webPattern_.Upgrade();
6183 CHECK_NULL_VOID(webPattern);
6184 webPattern->RemoveSnapshotFrameNode();
6185 },
6186 TaskExecutor::TaskType::UI, removeDelayTime, "ArkUIWebSnapshotRemove");
6187 }
6188
CreateSnapshotFrameNode(const std::string & snapshotPath)6189 void WebDelegate::CreateSnapshotFrameNode(const std::string& snapshotPath)
6190 {
6191 if (snapshotPath.empty()) {
6192 return;
6193 }
6194 TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::CreateSnapshotFrameNode");
6195 auto context = context_.Upgrade();
6196 CHECK_NULL_VOID(context);
6197 CHECK_NULL_VOID(context->GetTaskExecutor());
6198 context->GetTaskExecutor()->PostTask(
6199 [weak = WeakClaim(this), snapshotPath]() {
6200 auto delegate = weak.Upgrade();
6201 CHECK_NULL_VOID(delegate);
6202 auto webPattern = delegate->webPattern_.Upgrade();
6203 CHECK_NULL_VOID(webPattern);
6204 webPattern->CreateSnapshotImageFrameNode(snapshotPath);
6205 },
6206 TaskExecutor::TaskType::UI, "ArkUIWebLoadSnapshot");
6207 }
6208
SetVisibility(bool isVisible)6209 void WebDelegate::SetVisibility(bool isVisible)
6210 {
6211 isVisible_ = isVisible;
6212 CHECK_NULL_VOID(nweb_);
6213 nweb_->SetVisibility(isVisible);
6214 }
6215
OnHandleInterceptLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)6216 bool WebDelegate::OnHandleInterceptLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)
6217 {
6218 CHECK_NULL_RETURN(taskExecutor_, false);
6219 bool result = false;
6220 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
6221 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), request, &result]() {
6222 auto delegate = weak.Upgrade();
6223 CHECK_NULL_VOID(delegate);
6224 auto webRequest = AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
6225 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect());
6226 auto param = std::make_shared<LoadInterceptEvent>(webRequest);
6227 if (Container::IsCurrentUseNewPipeline()) {
6228 auto webPattern = delegate->webPattern_.Upgrade();
6229 CHECK_NULL_VOID(webPattern);
6230 auto webEventHub = webPattern->GetWebEventHub();
6231 CHECK_NULL_VOID(webEventHub);
6232 auto propOnLoadInterceptEvent = webEventHub->GetOnLoadInterceptEvent();
6233 CHECK_NULL_VOID(propOnLoadInterceptEvent);
6234 result = propOnLoadInterceptEvent(param);
6235 }
6236 auto webCom = delegate->webComponent_.Upgrade();
6237 CHECK_NULL_VOID(webCom);
6238 result = webCom->OnLoadIntercept(param.get());
6239 }, "ArkUIWebHandleInterceptLoading");
6240
6241 auto context = context_.Upgrade();
6242 CHECK_NULL_RETURN(context, false);
6243 context->GetTaskExecutor()->PostTask(
6244 [weak = WeakClaim(this), request]() {
6245 auto delegate = weak.Upgrade();
6246 CHECK_NULL_VOID(delegate);
6247 CHECK_NULL_VOID(delegate->nweb_);
6248 if (request->IsAboutMainFrame() && !request->IsRequestRedirect()) {
6249 bool ret = delegate->nweb_->TriggerBlanklessForUrl(request->Url());
6250 TAG_LOGD(AceLogTag::ACE_WEB, "TriggerBlanklessForUrl ret %{public}d", ret);
6251 }
6252 },
6253 TaskExecutor::TaskType::PLATFORM, "ArkUIWebloadSnapshot");
6254 return result;
6255 }
6256
OnResourceLoad(const std::string & url)6257 void WebDelegate::OnResourceLoad(const std::string& url)
6258 {
6259 if (onResourceLoadV2_) {
6260 onResourceLoadV2_(std::make_shared<ResourceLoadEvent>(url));
6261 }
6262 }
6263
OnScaleChange(float oldScaleFactor,float newScaleFactor)6264 void WebDelegate::OnScaleChange(float oldScaleFactor, float newScaleFactor)
6265 {
6266 CHECK_NULL_VOID(taskExecutor_);
6267 if (oldScaleFactor != newScaleFactor) {
6268 SetViewportScaleState();
6269 }
6270 taskExecutor_->PostTask(
6271 [weak = WeakClaim(this), oldScaleFactor, newScaleFactor]() {
6272 auto delegate = weak.Upgrade();
6273 CHECK_NULL_VOID(delegate);
6274 auto onScaleChangeV2 = delegate->onScaleChangeV2_;
6275 if (onScaleChangeV2) {
6276 onScaleChangeV2(std::make_shared<ScaleChangeEvent>(oldScaleFactor, newScaleFactor));
6277 }
6278 },
6279 TaskExecutor::TaskType::JS, "ArkUIWebScaleChange");
6280 }
6281
OnScroll(double xOffset,double yOffset)6282 void WebDelegate::OnScroll(double xOffset, double yOffset)
6283 {
6284 CHECK_NULL_VOID(taskExecutor_);
6285 taskExecutor_->PostTask(
6286 [weak = WeakClaim(this), xOffset, yOffset]() {
6287 auto delegate = weak.Upgrade();
6288 CHECK_NULL_VOID(delegate);
6289 auto onScrollV2 = delegate->onScrollV2_;
6290 if (onScrollV2) {
6291 onScrollV2(std::make_shared<WebOnScrollEvent>(xOffset, yOffset));
6292 }
6293 },
6294 TaskExecutor::TaskType::JS, "ArkUIWebScroll");
6295 }
6296
OnSearchResultReceive(int activeMatchOrdinal,int numberOfMatches,bool isDoneCounting)6297 void WebDelegate::OnSearchResultReceive(int activeMatchOrdinal, int numberOfMatches, bool isDoneCounting)
6298 {
6299 CHECK_NULL_VOID(taskExecutor_);
6300 taskExecutor_->PostTask(
6301 [weak = WeakClaim(this), activeMatchOrdinal, numberOfMatches, isDoneCounting]() {
6302 auto delegate = weak.Upgrade();
6303 CHECK_NULL_VOID(delegate);
6304 auto onSearchResultReceiveV2 = delegate->onSearchResultReceiveV2_;
6305 if (onSearchResultReceiveV2) {
6306 onSearchResultReceiveV2(
6307 std::make_shared<SearchResultReceiveEvent>(activeMatchOrdinal, numberOfMatches, isDoneCounting));
6308 }
6309 },
6310 TaskExecutor::TaskType::JS, "ArkUIWebSearchResultReceive");
6311 }
6312
OnDragAndDropData(const void * data,size_t len,int width,int height)6313 bool WebDelegate::OnDragAndDropData(const void* data, size_t len, int width, int height)
6314 {
6315 pixelMap_ = PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
6316 if (pixelMap_ == nullptr) {
6317 return false;
6318 }
6319 isRefreshPixelMap_ = true;
6320
6321 auto webPattern = webPattern_.Upgrade();
6322 if (!webPattern) {
6323 return false;
6324 }
6325
6326 uint32_t res = pixelMap_->GetPixelMapSharedPtr()->SetMemoryName(
6327 webPattern->GetPixelMapName(pixelMap_->GetPixelMapSharedPtr(), "drag"));
6328 TAG_LOGI(AceLogTag::ACE_WEB, "SetMemoryName result is %{public}d", res);
6329 return webPattern->NotifyStartDragTask();
6330 }
6331
OnDragAndDropDataUdmf(std::shared_ptr<OHOS::NWeb::NWebDragData> dragData)6332 bool WebDelegate::OnDragAndDropDataUdmf(std::shared_ptr<OHOS::NWeb::NWebDragData> dragData)
6333 {
6334 const void* data = nullptr;
6335 size_t len = 0;
6336 int width = 0;
6337 int height = 0;
6338 dragData->GetPixelMapSetting(&data, len, width, height);
6339 pixelMap_ = PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
6340 CHECK_NULL_RETURN(pixelMap_, false);
6341 isRefreshPixelMap_ = true;
6342
6343 dragData_ = dragData;
6344 auto webPattern = webPattern_.Upgrade();
6345 CHECK_NULL_RETURN(webPattern, false);
6346
6347 uint32_t res = pixelMap_->GetPixelMapSharedPtr()->SetMemoryName(
6348 webPattern->GetPixelMapName(pixelMap_->GetPixelMapSharedPtr(), "drag"));
6349 TAG_LOGI(AceLogTag::ACE_WEB, "SetMemoryName result is %{public}d", res);
6350
6351 if (webPattern->IsRootNeedExportTexture()) {
6352 return false;
6353 }
6354
6355 if (dragData->IsDragNewStyle() && (!webPattern->IsNewDragStyle() || !webPattern->IsPreviewImageNodeExist())) {
6356 TAG_LOGI(AceLogTag::ACE_WEB, "OnDragAndDropDataUdmf not a new style");
6357 auto context = context_.Upgrade();
6358 CHECK_NULL_RETURN(context, false);
6359 CHECK_NULL_RETURN(context->GetTaskExecutor(), false);
6360 context->GetTaskExecutor()->PostDelayedTask(
6361 [weak = WeakClaim(this)]() {
6362 auto delegate = weak.Upgrade();
6363 CHECK_NULL_VOID(delegate);
6364 auto pattern = delegate->webPattern_.Upgrade();
6365 CHECK_NULL_VOID(pattern);
6366 pattern->NotifyStartDragTask(true);
6367 },
6368 TaskExecutor::TaskType::UI, DRAG_DELAY_MILLISECONDS, "OnDragAndDropDataUdmf");
6369 return true;
6370 } else if (!dragData->IsDragNewStyle()) {
6371 webPattern->SetNewDragStyle(false);
6372 }
6373 return webPattern->NotifyStartDragTask();
6374 }
6375
IsDragging()6376 bool WebDelegate::IsDragging()
6377 {
6378 auto webPattern = webPattern_.Upgrade();
6379 CHECK_NULL_RETURN(webPattern, false);
6380 return webPattern->IsDragging();
6381 }
6382
IsImageDrag()6383 bool WebDelegate::IsImageDrag()
6384 {
6385 if (dragData_) {
6386 return dragData_->IsSingleImageContent();
6387 }
6388 return false;
6389 }
6390
GetOrCreateDragData()6391 std::shared_ptr<OHOS::NWeb::NWebDragData> WebDelegate::GetOrCreateDragData()
6392 {
6393 if (dragData_) {
6394 return dragData_;
6395 }
6396
6397 if (nweb_) {
6398 dragData_ = nweb_->GetOrCreateDragData();
6399 return dragData_;
6400 }
6401 return nullptr;
6402 }
6403
OnWindowNew(const std::string & targetUrl,bool isAlert,bool isUserTrigger,const std::shared_ptr<OHOS::NWeb::NWebControllerHandler> & handler)6404 void WebDelegate::OnWindowNew(const std::string& targetUrl, bool isAlert, bool isUserTrigger,
6405 const std::shared_ptr<OHOS::NWeb::NWebControllerHandler>& handler)
6406 {
6407 CHECK_NULL_VOID(taskExecutor_);
6408 taskExecutor_->PostSyncTask(
6409 [weak = WeakClaim(this), targetUrl, isAlert, isUserTrigger, handler]() {
6410 auto delegate = weak.Upgrade();
6411 CHECK_NULL_VOID(delegate);
6412 int32_t parentNWebId = (delegate->nweb_ ? static_cast<int32_t>(delegate->nweb_->GetWebId()) : -1);
6413 auto param = std::make_shared<WebWindowNewEvent>(
6414 targetUrl, isAlert, isUserTrigger, AceType::MakeRefPtr<WebWindowNewHandlerOhos>(handler, parentNWebId));
6415 #ifdef NG_BUILD
6416 auto webPattern = delegate->webPattern_.Upgrade();
6417 CHECK_NULL_VOID(webPattern);
6418 auto webEventHub = webPattern->GetWebEventHub();
6419 CHECK_NULL_VOID(webEventHub);
6420 auto propOnWindowNewEvent = webEventHub->GetOnWindowNewEvent();
6421 CHECK_NULL_VOID(propOnWindowNewEvent);
6422 propOnWindowNewEvent(param);
6423 return;
6424 #else
6425 if (Container::IsCurrentUseNewPipeline()) {
6426 auto webPattern = delegate->webPattern_.Upgrade();
6427 CHECK_NULL_VOID(webPattern);
6428 auto webEventHub = webPattern->GetWebEventHub();
6429 CHECK_NULL_VOID(webEventHub);
6430 auto propOnWindowNewEvent = webEventHub->GetOnWindowNewEvent();
6431 CHECK_NULL_VOID(propOnWindowNewEvent);
6432 propOnWindowNewEvent(param);
6433 return;
6434 }
6435 auto webCom = delegate->webComponent_.Upgrade();
6436 CHECK_NULL_VOID(webCom);
6437 webCom->OnWindowNewEvent(param);
6438 #endif
6439 },
6440 TaskExecutor::TaskType::JS, "ArkUIWebWindowNewEvent");
6441 }
6442
OnActivateContent()6443 void WebDelegate::OnActivateContent()
6444 {
6445 CHECK_NULL_VOID(taskExecutor_);
6446 taskExecutor_->PostTask(
6447 [weak = WeakClaim(this)]() {
6448 auto delegate = weak.Upgrade();
6449 CHECK_NULL_VOID(delegate);
6450 auto onActivateContentV2 = delegate->onActivateContentV2_;
6451 if (onActivateContentV2) {
6452 onActivateContentV2(std::make_shared<WebActivateContentEvent>());
6453 }
6454 },
6455 TaskExecutor::TaskType::JS, "ArkUIWebActivateContent");
6456 }
6457
OnWindowExit()6458 void WebDelegate::OnWindowExit()
6459 {
6460 CHECK_NULL_VOID(taskExecutor_);
6461 taskExecutor_->PostTask(
6462 [weak = WeakClaim(this)]() {
6463 auto delegate = weak.Upgrade();
6464 CHECK_NULL_VOID(delegate);
6465 auto onWindowExitV2 = delegate->onWindowExitV2_;
6466 if (onWindowExitV2) {
6467 onWindowExitV2(std::make_shared<WebWindowExitEvent>());
6468 }
6469 },
6470 TaskExecutor::TaskType::JS, "ArkUIWebWindowExit");
6471 }
6472
OnPageVisible(const std::string & url)6473 void WebDelegate::OnPageVisible(const std::string& url)
6474 {
6475 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnPageVisible, web id = %{public}d", GetWebId());
6476 if (onPageVisibleV2_) {
6477 onPageVisibleV2_(std::make_shared<PageVisibleEvent>(url));
6478 } else {
6479 TAG_LOGI(AceLogTag::ACE_WEB, "The developer has not registered this OnPageVisible event");
6480 }
6481
6482 if (isEnableHardwareComposition_) {
6483 return;
6484 }
6485 auto context = context_.Upgrade();
6486 CHECK_NULL_VOID(context);
6487 context->GetTaskExecutor()->PostDelayedTask(
6488 [weak = WeakClaim(this)]() {
6489 auto delegate = weak.Upgrade();
6490 CHECK_NULL_VOID(delegate);
6491 delegate->EnableHardware();
6492 },
6493 TaskExecutor::TaskType::UI, DELAY_MILLISECONDS_1000, "ArkUIWebEnableHardware");
6494 }
6495
OnFirstContentfulPaint(int64_t navigationStartTick,int64_t firstContentfulPaintMs)6496 void WebDelegate::OnFirstContentfulPaint(int64_t navigationStartTick, int64_t firstContentfulPaintMs)
6497 {
6498 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnFirstContentfulPaint, web id = %{public}d", GetWebId());
6499 if (onFirstContentfulPaintV2_) {
6500 onFirstContentfulPaintV2_(
6501 std::make_shared<FirstContentfulPaintEvent>(navigationStartTick, firstContentfulPaintMs));
6502 }
6503 }
6504
OnFirstMeaningfulPaint(std::shared_ptr<OHOS::NWeb::NWebFirstMeaningfulPaintDetails> details)6505 void WebDelegate::OnFirstMeaningfulPaint(std::shared_ptr<OHOS::NWeb::NWebFirstMeaningfulPaintDetails> details)
6506 {
6507 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnFirstMeaningfulPaint, web id = %{public}d", GetWebId());
6508 if (OnFirstMeaningfulPaintV2_) {
6509 OnFirstMeaningfulPaintV2_(std::make_shared<FirstMeaningfulPaintEvent>(
6510 details->GetNavigationStartTime(), details->GetFirstMeaningfulPaintTime()));
6511 }
6512 }
6513
OnLargestContentfulPaint(std::shared_ptr<OHOS::NWeb::NWebLargestContentfulPaintDetails> details)6514 void WebDelegate::OnLargestContentfulPaint(std::shared_ptr<OHOS::NWeb::NWebLargestContentfulPaintDetails> details)
6515 {
6516 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnLargestContentfulPaint, web id = %{public}d", GetWebId());
6517 if (OnLargestContentfulPaintV2_) {
6518 OnLargestContentfulPaintV2_(std::make_shared<LargestContentfulPaintEvent>(details->GetNavigationStartTime(),
6519 details->GetLargestImagePaintTime(), details->GetLargestTextPaintTime(),
6520 details->GetLargestImageLoadStartTime(), details->GetLargestImageLoadEndTime(), details->GetImageBPP()));
6521 }
6522 }
6523
EnableHardware()6524 void WebDelegate::EnableHardware()
6525 {
6526 if (isEnableHardwareComposition_) {
6527 return;
6528 }
6529
6530 auto surfaceNode = OHOS::Rosen::RSBaseNode::ReinterpretCast<OHOS::Rosen::RSSurfaceNode>(surfaceRsNode_);
6531 CHECK_NULL_VOID(surfaceNode);
6532 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::EnableHardware, web id = %{public}d", GetWebId());
6533 ACE_SCOPED_TRACE("WebDelegate::EnableHardware, web id = %d", GetWebId());
6534 surfaceNode->SetHardwareEnabled(true);
6535 isEnableHardwareComposition_ = true;
6536 }
6537
OnSafeBrowsingCheckResult(int threat_type)6538 void WebDelegate::OnSafeBrowsingCheckResult(int threat_type)
6539 {
6540 if (onSafeBrowsingCheckResultV2_) {
6541 onSafeBrowsingCheckResultV2_(
6542 std::make_shared<SafeBrowsingCheckResultEvent>(threat_type));
6543 }
6544 }
6545
OnDataResubmitted(std::shared_ptr<OHOS::NWeb::NWebDataResubmissionCallback> handler)6546 void WebDelegate::OnDataResubmitted(std::shared_ptr<OHOS::NWeb::NWebDataResubmissionCallback> handler)
6547 {
6548 auto param = std::make_shared<DataResubmittedEvent>(AceType::MakeRefPtr<DataResubmittedOhos>(handler));
6549 if (Container::IsCurrentUseNewPipeline()) {
6550 auto webPattern = webPattern_.Upgrade();
6551 CHECK_NULL_VOID(webPattern);
6552 auto webEventHub = webPattern->GetWebEventHub();
6553 CHECK_NULL_VOID(webEventHub);
6554 auto propOnDataResubmittedEvent = webEventHub->GetOnDataResubmittedEvent();
6555 CHECK_NULL_VOID(propOnDataResubmittedEvent);
6556 propOnDataResubmittedEvent(param);
6557 return;
6558 }
6559 }
6560
OnNavigationEntryCommitted(std::shared_ptr<OHOS::NWeb::NWebLoadCommittedDetails> details)6561 void WebDelegate::OnNavigationEntryCommitted(std::shared_ptr<OHOS::NWeb::NWebLoadCommittedDetails> details)
6562 {
6563 if (onNavigationEntryCommittedV2_) {
6564 NavigationType type = static_cast<NavigationType>(details->GetNavigationType());
6565 onNavigationEntryCommittedV2_(std::make_shared<NavigationEntryCommittedEvent>(details->GetURL(),
6566 type, details->IsMainFrame(), details->IsSameDocument(),
6567 details->DidReplaceEntry()));
6568 }
6569 auto webPattern = webPattern_.Upgrade();
6570 CHECK_NULL_VOID(webPattern);
6571 webPattern->DestroyAnalyzerOverlay();
6572 }
6573
OnFaviconReceived(const void * data,size_t width,size_t height,OHOS::NWeb::ImageColorType colorType,OHOS::NWeb::ImageAlphaType alphaType)6574 void WebDelegate::OnFaviconReceived(const void* data, size_t width, size_t height, OHOS::NWeb::ImageColorType colorType,
6575 OHOS::NWeb::ImageAlphaType alphaType)
6576 {
6577 auto param = std::make_shared<FaviconReceivedEvent>(
6578 AceType::MakeRefPtr<FaviconReceivedOhos>(data, width, height, colorType, alphaType));
6579 if (Container::IsCurrentUseNewPipeline()) {
6580 OnSetFaviconCallback(param);
6581
6582 auto webPattern = webPattern_.Upgrade();
6583 CHECK_NULL_VOID(webPattern);
6584 auto webEventHub = webPattern->GetWebEventHub();
6585 CHECK_NULL_VOID(webEventHub);
6586 auto propOnFaviconReceivedEvent = webEventHub->GetOnFaviconReceivedEvent();
6587 CHECK_NULL_VOID(propOnFaviconReceivedEvent);
6588 propOnFaviconReceivedEvent(param);
6589 return;
6590 }
6591 }
6592
OnTouchIconUrl(const std::string & iconUrl,bool precomposed)6593 void WebDelegate::OnTouchIconUrl(const std::string& iconUrl, bool precomposed)
6594 {
6595 if (onTouchIconUrlV2_) {
6596 onTouchIconUrlV2_(std::make_shared<TouchIconUrlEvent>(iconUrl, precomposed));
6597 }
6598 }
6599
OnAudioStateChanged(bool audible)6600 void WebDelegate::OnAudioStateChanged(bool audible)
6601 {
6602 if (onAudioStateChangedV2_) {
6603 onAudioStateChangedV2_(std::make_shared<AudioStateChangedEvent>(audible));
6604 }
6605 }
6606
OnGetTouchHandleHotZone(std::shared_ptr<OHOS::NWeb::NWebTouchHandleHotZone> hotZone)6607 void WebDelegate::OnGetTouchHandleHotZone(std::shared_ptr<OHOS::NWeb::NWebTouchHandleHotZone> hotZone)
6608 {
6609 auto pipeline = PipelineContext::GetCurrentContext();
6610 CHECK_NULL_VOID(pipeline);
6611 auto theme = pipeline->GetTheme<TextOverlayTheme>();
6612 CHECK_NULL_VOID(theme);
6613 auto touchHandleSize = theme->GetHandleHotZoneRadius().ConvertToPx();
6614 auto webPattern = webPattern_.Upgrade();
6615 CHECK_NULL_VOID(webPattern);
6616 if (hotZone) {
6617 if (webPattern->IsShowHandle()) {
6618 hotZone->SetWidth(touchHandleSize);
6619 hotZone->SetHeight(touchHandleSize);
6620 } else {
6621 hotZone->SetWidth(theme->GetHandleLineWidth().ConvertToPx());
6622 hotZone->SetHeight(0);
6623 }
6624 }
6625 }
6626
GetDragPixelMap()6627 RefPtr<PixelMap> WebDelegate::GetDragPixelMap()
6628 {
6629 return pixelMap_;
6630 }
6631
6632 #ifdef OHOS_STANDARD_SYSTEM
HandleTouchDown(const int32_t & id,const double & x,const double & y,bool from_overlay)6633 void WebDelegate::HandleTouchDown(const int32_t& id, const double& x, const double& y, bool from_overlay)
6634 {
6635 ACE_DCHECK(nweb_ != nullptr);
6636 if (nweb_) {
6637 nweb_->OnTouchPress(id, x, y, from_overlay);
6638 }
6639 }
6640
HandleTouchUp(const int32_t & id,const double & x,const double & y,bool from_overlay)6641 void WebDelegate::HandleTouchUp(const int32_t& id, const double& x, const double& y, bool from_overlay)
6642 {
6643 ACE_DCHECK(nweb_ != nullptr);
6644 if (nweb_) {
6645 nweb_->OnTouchRelease(id, x, y, from_overlay);
6646 }
6647 }
6648
HandleTouchMove(const int32_t & id,const double & x,const double & y,bool from_overlay)6649 void WebDelegate::HandleTouchMove(const int32_t& id, const double& x, const double& y, bool from_overlay)
6650 {
6651 ACE_DCHECK(nweb_ != nullptr);
6652 if (nweb_) {
6653 nweb_->OnTouchMove(id, x, y, from_overlay);
6654 }
6655 }
6656
HandleTouchMove(const std::vector<std::shared_ptr<OHOS::NWeb::NWebTouchPointInfo>> & touch_point_infos,bool from_overlay)6657 void WebDelegate::HandleTouchMove(const std::vector<std::shared_ptr<OHOS::NWeb::NWebTouchPointInfo>> &touch_point_infos,
6658 bool from_overlay)
6659 {
6660 ACE_DCHECK(nweb_ != nullptr);
6661 if (nweb_) {
6662 nweb_->OnTouchMove(touch_point_infos, from_overlay);
6663 }
6664 }
6665
HandleTouchCancel()6666 void WebDelegate::HandleTouchCancel()
6667 {
6668 ACE_DCHECK(nweb_ != nullptr);
6669 if (nweb_) {
6670 nweb_->OnTouchCancel();
6671 }
6672 }
6673
HandleTouchpadFlingEvent(const double & x,const double & y,const double & vx,const double & vy)6674 void WebDelegate::HandleTouchpadFlingEvent(const double& x, const double& y, const double& vx, const double& vy)
6675 {
6676 if (nweb_) {
6677 nweb_->SendTouchpadFlingEvent(x, y, vx, vy);
6678 }
6679 }
6680
WebHandleTouchpadFlingEvent(const double & x,const double & y,const double & vx,const double & vy,const std::vector<int32_t> & pressedCodes)6681 void WebDelegate::WebHandleTouchpadFlingEvent(const double& x, const double& y,
6682 const double& vx, const double& vy, const std::vector<int32_t>& pressedCodes)
6683 {
6684 if (nweb_) {
6685 nweb_->WebSendTouchpadFlingEvent(x, y, vx, vy, pressedCodes);
6686 }
6687 }
6688
HandleAxisEvent(const double & x,const double & y,const double & deltaX,const double & deltaY)6689 void WebDelegate::HandleAxisEvent(const double& x, const double& y, const double& deltaX, const double& deltaY)
6690 {
6691 if (nweb_) {
6692 nweb_->SendMouseWheelEvent(x, y, deltaX, deltaY);
6693 }
6694 }
6695
WebHandleAxisEvent(const double & x,const double & y,const double & deltaX,const double & deltaY,const std::vector<int32_t> & pressedCodes,const int32_t source)6696 void WebDelegate::WebHandleAxisEvent(const double& x, const double& y,
6697 const double& deltaX, const double& deltaY, const std::vector<int32_t>& pressedCodes, const int32_t source)
6698 {
6699 if (nweb_) {
6700 bool result = nweb_->WebSendMouseWheelEventV2(x, y, deltaX, deltaY, pressedCodes, source);
6701 if (!result) {
6702 nweb_->WebSendMouseWheelEvent(x, y, deltaX, deltaY, pressedCodes);
6703 }
6704 }
6705 }
6706
OnKeyEvent(int32_t keyCode,int32_t keyAction)6707 bool WebDelegate::OnKeyEvent(int32_t keyCode, int32_t keyAction)
6708 {
6709 if (nweb_) {
6710 return nweb_->SendKeyEvent(keyCode, keyAction);
6711 }
6712 return false;
6713 }
6714
WebOnKeyEvent(int32_t keyCode,int32_t keyAction,const std::vector<int32_t> & pressedCodes)6715 bool WebDelegate::WebOnKeyEvent(int32_t keyCode, int32_t keyAction,
6716 const std::vector<int32_t>& pressedCodes)
6717 {
6718 CHECK_NULL_RETURN(nweb_, false);
6719 return nweb_->WebSendKeyEvent(keyCode, keyAction, pressedCodes);
6720 }
6721
SendKeyboardEvent(const std::shared_ptr<OHOS::NWeb::NWebKeyboardEvent> & keyboardEvent)6722 bool WebDelegate::SendKeyboardEvent(const std::shared_ptr<OHOS::NWeb::NWebKeyboardEvent>& keyboardEvent)
6723 {
6724 CHECK_NULL_RETURN(nweb_, false);
6725 return nweb_->SendKeyboardEvent(keyboardEvent);
6726 }
6727
OnMouseEvent(int32_t x,int32_t y,const MouseButton button,const MouseAction action,int count)6728 void WebDelegate::OnMouseEvent(int32_t x, int32_t y, const MouseButton button, const MouseAction action, int count)
6729 {
6730 if (nweb_) {
6731 nweb_->SendMouseEvent(x, y, static_cast<int>(button), static_cast<int>(action), count);
6732 }
6733 }
6734
WebOnMouseEvent(const std::shared_ptr<OHOS::NWeb::NWebMouseEvent> & mouseEvent)6735 void WebDelegate::WebOnMouseEvent(const std::shared_ptr<OHOS::NWeb::NWebMouseEvent>& mouseEvent)
6736 {
6737 CHECK_NULL_VOID(nweb_);
6738 ACE_SCOPED_TRACE("WebDelegate::WebOnMouseEvent, web id = %d", GetWebId());
6739 nweb_->WebSendMouseEvent(mouseEvent);
6740 }
6741
OnFocus(const OHOS::NWeb::FocusReason & reason)6742 void WebDelegate::OnFocus(const OHOS::NWeb::FocusReason& reason)
6743 {
6744 ACE_DCHECK(nweb_ != nullptr);
6745 if (nweb_) {
6746 nweb_->OnFocus(reason);
6747 }
6748 }
6749
NeedSoftKeyboard()6750 bool WebDelegate::NeedSoftKeyboard()
6751 {
6752 if (nweb_) {
6753 return nweb_->NeedSoftKeyboard();
6754 }
6755 return false;
6756 }
6757
OnBlur()6758 void WebDelegate::OnBlur()
6759 {
6760 ACE_DCHECK(nweb_ != nullptr);
6761 if (nweb_) {
6762 nweb_->OnBlur(blurReason_);
6763 }
6764 }
6765
UpdateClippedSelectionBounds(int32_t x,int32_t y,int32_t w,int32_t h)6766 void WebDelegate::UpdateClippedSelectionBounds(int32_t x, int32_t y, int32_t w, int32_t h)
6767 {
6768 auto webPattern = webPattern_.Upgrade();
6769 CHECK_NULL_VOID(webPattern);
6770 webPattern->UpdateClippedSelectionBounds(x, y, w, h);
6771 }
6772
RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)6773 bool WebDelegate::RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,
6774 std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)
6775 {
6776 #ifdef NG_BUILD
6777 auto webPattern = webPattern_.Upgrade();
6778 CHECK_NULL_RETURN(webPattern, false);
6779 return webPattern->RunQuickMenu(params, callback);
6780 #else
6781 if (Container::IsCurrentUseNewPipeline()) {
6782 auto webPattern = webPattern_.Upgrade();
6783 CHECK_NULL_RETURN(webPattern, false);
6784 return webPattern->RunQuickMenu(params, callback);
6785 }
6786 auto renderWeb = renderWeb_.Upgrade();
6787 if (!renderWeb || !params || !callback) {
6788 return false;
6789 }
6790
6791 return renderWeb->RunQuickMenu(params, callback);
6792 #endif
6793 }
6794
HideHandleAndQuickMenuIfNecessary(bool hide)6795 void WebDelegate::HideHandleAndQuickMenuIfNecessary(bool hide)
6796 {
6797 auto webPattern = webPattern_.Upgrade();
6798 CHECK_NULL_VOID(webPattern);
6799 webPattern->HideHandleAndQuickMenuIfNecessary(hide);
6800 }
6801
ChangeVisibilityOfQuickMenu()6802 void WebDelegate::ChangeVisibilityOfQuickMenu()
6803 {
6804 auto webPattern = webPattern_.Upgrade();
6805 CHECK_NULL_VOID(webPattern);
6806 webPattern->ChangeVisibilityOfQuickMenu();
6807 }
6808
ChangeVisibilityOfQuickMenuV2()6809 bool WebDelegate::ChangeVisibilityOfQuickMenuV2()
6810 {
6811 auto webPattern = webPattern_.Upgrade();
6812 CHECK_NULL_RETURN(webPattern, false);
6813 return webPattern->ChangeVisibilityOfQuickMenuV2();
6814 }
6815
OnQuickMenuDismissed()6816 void WebDelegate::OnQuickMenuDismissed()
6817 {
6818 #ifdef NG_BUILD
6819 auto webPattern = webPattern_.Upgrade();
6820 CHECK_NULL_VOID(webPattern);
6821 webPattern->OnQuickMenuDismissed();
6822 return;
6823 #else
6824 if (Container::IsCurrentUseNewPipeline()) {
6825 auto webPattern = webPattern_.Upgrade();
6826 CHECK_NULL_VOID(webPattern);
6827 webPattern->OnQuickMenuDismissed();
6828 return;
6829 }
6830 auto renderWeb = renderWeb_.Upgrade();
6831 CHECK_NULL_VOID(renderWeb);
6832 renderWeb->OnQuickMenuDismissed();
6833 #endif
6834 }
6835
OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)6836 void WebDelegate::OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,
6837 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,
6838 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)
6839 {
6840 #ifdef NG_BUILD
6841 auto webPattern = webPattern_.Upgrade();
6842 CHECK_NULL_VOID(webPattern);
6843 webPattern->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
6844 return;
6845 #else
6846 if (Container::IsCurrentUseNewPipeline()) {
6847 auto webPattern = webPattern_.Upgrade();
6848 CHECK_NULL_VOID(webPattern);
6849 webPattern->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
6850 return;
6851 }
6852 auto renderWeb = renderWeb_.Upgrade();
6853 CHECK_NULL_VOID(renderWeb);
6854 renderWeb->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
6855 #endif
6856 }
6857
OnCursorChange(const OHOS::NWeb::CursorType & type,std::shared_ptr<OHOS::NWeb::NWebCursorInfo> info)6858 bool WebDelegate::OnCursorChange(const OHOS::NWeb::CursorType& type, std::shared_ptr<OHOS::NWeb::NWebCursorInfo> info)
6859 {
6860 #ifdef NG_BUILD
6861 auto webPattern = webPattern_.Upgrade();
6862 CHECK_NULL_RETURN(webPattern, false);
6863 return webPattern->OnCursorChange(type, info);
6864 #else
6865 if (Container::IsCurrentUseNewPipeline()) {
6866 auto webPattern = webPattern_.Upgrade();
6867 CHECK_NULL_RETURN(webPattern, false);
6868 return webPattern->OnCursorChange(type, info);
6869 }
6870 auto renderWeb = renderWeb_.Upgrade();
6871 CHECK_NULL_RETURN(renderWeb, false);
6872 return renderWeb->OnCursorChange(type, info);
6873 #endif
6874 }
6875
OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)6876 void WebDelegate::OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,
6877 std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)
6878 {
6879 #ifdef NG_BUILD
6880 auto webPattern = webPattern_.Upgrade();
6881 CHECK_NULL_VOID(webPattern);
6882 webPattern->OnSelectPopupMenu(params, callback);
6883 return;
6884 #else
6885 if (Container::IsCurrentUseNewPipeline()) {
6886 auto webPattern = webPattern_.Upgrade();
6887 CHECK_NULL_VOID(webPattern);
6888 webPattern->OnSelectPopupMenu(params, callback);
6889 return;
6890 }
6891 auto renderWeb = renderWeb_.Upgrade();
6892 CHECK_NULL_VOID(renderWeb);
6893 return renderWeb->OnSelectPopupMenu(params, callback);
6894 #endif
6895 }
6896
HandleDragEvent(int32_t x,int32_t y,const DragAction & dragAction)6897 void WebDelegate::HandleDragEvent(int32_t x, int32_t y, const DragAction& dragAction)
6898 {
6899 if (nweb_) {
6900 std::shared_ptr<NWebDragEventImpl> dragEvent =
6901 std::make_shared<NWebDragEventImpl>(x, y, static_cast<OHOS::NWeb::DragAction>(dragAction));
6902 nweb_->SendDragEvent(dragEvent);
6903 }
6904 }
6905
GetUrl()6906 std::string WebDelegate::GetUrl()
6907 {
6908 if (nweb_) {
6909 return nweb_->GetUrl();
6910 }
6911 return "";
6912 }
6913
UpdateLocale()6914 void WebDelegate::UpdateLocale()
6915 {
6916 ACE_DCHECK(nweb_ != nullptr);
6917 if (nweb_) {
6918 std::string language = AceApplicationInfo::GetInstance().GetLanguage();
6919 std::string region = AceApplicationInfo::GetInstance().GetCountryOrRegion();
6920 if (!language.empty() || !region.empty()) {
6921 nweb_->UpdateLocale(language, region);
6922 }
6923 }
6924 }
6925
SetDrawRect(int32_t x,int32_t y,int32_t width,int32_t height)6926 void WebDelegate::SetDrawRect(int32_t x, int32_t y, int32_t width, int32_t height)
6927 {
6928 ACE_DCHECK(nweb_ != nullptr);
6929 if (nweb_) {
6930 nweb_->SetDrawRect(x, y, width, height);
6931 }
6932 }
6933
GetPendingSizeStatus()6934 bool WebDelegate::GetPendingSizeStatus()
6935 {
6936 ACE_DCHECK(nweb_ != nullptr);
6937 if (nweb_) {
6938 return nweb_->GetPendingSizeStatus();
6939 }
6940 return false;
6941 }
6942
HandleAccessibilityHoverEvent(const NG::PointF & point,SourceType source,NG::AccessibilityHoverEventType eventType,TimeStamp time)6943 void WebDelegate::HandleAccessibilityHoverEvent(
6944 const NG::PointF& point, SourceType source, NG::AccessibilityHoverEventType eventType, TimeStamp time)
6945 {
6946 ACE_DCHECK(nweb_ != nullptr);
6947 CHECK_NULL_VOID(nweb_);
6948 int32_t x = point.GetX();
6949 int32_t y = point.GetY();
6950 std::shared_lock<std::shared_mutex> readLock(embedDataInfoMutex_);
6951 for (auto iter = embedDataInfo_.begin(); iter != embedDataInfo_.end(); iter++) {
6952 std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo = iter->second;
6953 CHECK_NULL_CONTINUE(dataInfo);
6954 auto embedInfo = dataInfo->GetNativeEmbedInfo();
6955 CHECK_NULL_CONTINUE(embedInfo);
6956 int embedX = embedInfo->GetX();
6957 int embedY = embedInfo->GetY();
6958 int embedWidth = embedInfo->GetWidth();
6959 int embedHeight = embedInfo->GetHeight();
6960 if (x >= embedX && y >= embedY && x <= embedX + embedWidth && y <= embedY + embedHeight) {
6961 std::string surfaceId = dataInfo->GetSurfaceId();
6962 int64_t webNodeId = GetWebAccessibilityIdBySurfaceId(surfaceId);
6963 if (webNodeId == -1) {
6964 TAG_LOGW(AceLogTag::ACE_WEB, "WebDelegate::HandleAccessibilityHoverEvent cannot find the bind webNode");
6965 continue;
6966 }
6967 NG::PointF mutablePoint = point;
6968 mutablePoint.SetX(x - embedX);
6969 mutablePoint.SetY(y - embedY);
6970 NG::HandleHoverEventParam param = { mutablePoint, source, eventType, time };
6971 auto context = context_.Upgrade();
6972 CHECK_NULL_VOID(context);
6973 auto pipeline = AceType::DynamicCast<NG::PipelineContext>(context);
6974 CHECK_NULL_VOID(pipeline);
6975 auto accessibilityManagerNG = pipeline->GetAccessibilityManagerNG();
6976 CHECK_NULL_VOID(accessibilityManagerNG);
6977 accessibilityManagerNG->HandleAccessibilityHoverEventBySurfaceId(dataInfo->GetSurfaceId(), param);
6978 return;
6979 }
6980 }
6981 bool isHoverEnter = (eventType != NG::AccessibilityHoverEventType::EXIT);
6982 nweb_->SendAccessibilityHoverEventV2(x, y, isHoverEnter);
6983 }
6984
NotifyAutoFillViewData(const std::string & jsonStr)6985 void WebDelegate::NotifyAutoFillViewData(const std::string& jsonStr)
6986 {
6987 auto context = context_.Upgrade();
6988 CHECK_NULL_VOID(context);
6989 context->GetTaskExecutor()->PostTask(
6990 [weak = WeakClaim(this), jsonStr]() {
6991 auto delegate = weak.Upgrade();
6992 CHECK_NULL_VOID(delegate);
6993 CHECK_NULL_VOID(delegate->nweb_);
6994 auto romMessage = std::make_shared<OHOS::NWeb::WebViewValue>(NWebRomValue::Type::NONE);
6995 romMessage->SetType(NWebRomValue::Type::STRING);
6996 romMessage->SetString(jsonStr);
6997 delegate->nweb_->FillAutofillDataV2(romMessage);
6998 if (ArkWebGetErrno() != RESULT_OK) {
6999 auto webMessage = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
7000 webMessage->SetType(NWebValue::Type::STRING);
7001 webMessage->SetString(jsonStr);
7002 delegate->nweb_->FillAutofillData(webMessage);
7003 }
7004 },
7005 TaskExecutor::TaskType::PLATFORM, "ArkUIWebNotifyAutoFillViewData");
7006 }
7007
AutofillCancel(const std::string & fillContent)7008 void WebDelegate::AutofillCancel(const std::string& fillContent)
7009 {
7010 auto context = context_.Upgrade();
7011 CHECK_NULL_VOID(context);
7012 context->GetTaskExecutor()->PostTask(
7013 [weak = WeakClaim(this), fillContent]() {
7014 auto delegate = weak.Upgrade();
7015 CHECK_NULL_VOID(delegate);
7016 CHECK_NULL_VOID(delegate->nweb_);
7017 delegate->nweb_->OnAutofillCancel(fillContent);
7018 },
7019 TaskExecutor::TaskType::UI, "ArkUIWebAutofillCancel");
7020 }
7021
HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebMessage> & viewDataJson)7022 bool WebDelegate::HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebMessage>& viewDataJson)
7023 {
7024 auto pattern = webPattern_.Upgrade();
7025 CHECK_NULL_RETURN(pattern, false);
7026 return pattern->HandleAutoFillEvent(viewDataJson);
7027 }
7028
HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebHapValue> & viewDataJson)7029 bool WebDelegate::HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebHapValue>& viewDataJson)
7030 {
7031 auto pattern = webPattern_.Upgrade();
7032 CHECK_NULL_RETURN(pattern, false);
7033 return pattern->HandleAutoFillEvent(viewDataJson);
7034 }
7035
7036 #endif
7037
GetUrlStringParam(const std::string & param,const std::string & name) const7038 std::string WebDelegate::GetUrlStringParam(const std::string& param, const std::string& name) const
7039 {
7040 size_t len = name.length();
7041 size_t posErrorCode = param.find(NTC_PARAM_ERROR_CODE);
7042 size_t pos = param.find(name);
7043 std::string result;
7044
7045 if (pos != std::string::npos && posErrorCode != std::string::npos) {
7046 std::stringstream ss;
7047
7048 ss << param.substr(pos + 1 + len, posErrorCode - 5);
7049 ss >> result;
7050 }
7051 return result;
7052 }
7053
SetRenderMode(RenderMode renderMode)7054 void WebDelegate::SetRenderMode(RenderMode renderMode)
7055 {
7056 renderMode_ = static_cast<int32_t>(renderMode);
7057 }
7058
SetFitContentMode(WebLayoutMode layoutMode)7059 void WebDelegate::SetFitContentMode(WebLayoutMode layoutMode)
7060 {
7061 layoutMode_ = static_cast<int32_t>(layoutMode);
7062 }
7063
BindRouterBackMethod()7064 void WebDelegate::BindRouterBackMethod()
7065 {
7066 auto context = context_.Upgrade();
7067 if (context) {
7068 context->SetRouterBackEventHandler([weak = WeakClaim(this)] {
7069 auto delegate = weak.Upgrade();
7070 if (delegate) {
7071 delegate->CallWebRouterBack();
7072 }
7073 });
7074 }
7075 }
7076
BindPopPageSuccessMethod()7077 void WebDelegate::BindPopPageSuccessMethod()
7078 {
7079 auto context = context_.Upgrade();
7080 if (context) {
7081 context->SetPopPageSuccessEventHandler(
7082 [weak = WeakClaim(this)](const std::string& pageUrl, const int32_t pageId) {
7083 std::string url = pageUrl.substr(0, pageUrl.length() - 3);
7084 auto delegate = weak.Upgrade();
7085 if (delegate) {
7086 delegate->CallPopPageSuccessPageUrl(url);
7087 }
7088 });
7089 }
7090 }
7091
BindIsPagePathInvalidMethod()7092 void WebDelegate::BindIsPagePathInvalidMethod()
7093 {
7094 auto context = context_.Upgrade();
7095 if (context) {
7096 context->SetIsPagePathInvalidEventHandler([weak = WeakClaim(this)](bool& isPageInvalid) {
7097 auto delegate = weak.Upgrade();
7098 if (delegate) {
7099 delegate->CallIsPagePathInvalid(isPageInvalid);
7100 }
7101 });
7102 }
7103 }
7104
SetComponent(const RefPtr<WebComponent> & component)7105 void WebDelegate::SetComponent(const RefPtr<WebComponent>& component)
7106 {
7107 webComponent_ = component;
7108 }
7109
SetNGWebPattern(const RefPtr<NG::WebPattern> & webPattern)7110 void WebDelegate::SetNGWebPattern(const RefPtr<NG::WebPattern>& webPattern)
7111 {
7112 webPattern_ = webPattern;
7113 }
7114
SetDrawSize(const Size & drawSize)7115 void WebDelegate::SetDrawSize(const Size& drawSize)
7116 {
7117 drawSize_ = drawSize;
7118 }
7119
SetEnhanceSurfaceFlag(const bool & isEnhanceSurface)7120 void WebDelegate::SetEnhanceSurfaceFlag(const bool& isEnhanceSurface)
7121 {
7122 isEnhanceSurface_ = isEnhanceSurface;
7123 }
7124
GetSurfaceDelegateClient()7125 sptr<OHOS::SurfaceDelegate> WebDelegate::GetSurfaceDelegateClient()
7126 {
7127 return surfaceDelegate_;
7128 }
7129
SetBoundsOrResize(const Size & drawSize,const Offset & offset,bool isKeyboard)7130 void WebDelegate::SetBoundsOrResize(const Size& drawSize, const Offset& offset, bool isKeyboard)
7131 {
7132 if (isDragResizeStart_) {
7133 DragResize(drawSize.Width(), drawSize.Height(), dragResize_preHight_, dragResize_preWidth_);
7134 return;
7135 }
7136 if ((drawSize.Width() == 0) && (drawSize.Height() == 0)) {
7137 return;
7138 }
7139 if (isEnhanceSurface_) {
7140 if (surfaceDelegate_) {
7141 if (needResizeAtFirst_) {
7142 Resize(drawSize.Width(), drawSize.Height(), isKeyboard);
7143 needResizeAtFirst_ = false;
7144 }
7145 Size webSize = GetEnhanceSurfaceSize(drawSize);
7146 surfaceDelegate_->SetBounds(offset.GetX(), (int32_t)offset.GetY(), webSize.Width(), webSize.Height());
7147 }
7148 } else {
7149 Resize(drawSize.Width(), drawSize.Height(), isKeyboard);
7150 }
7151 }
7152
ResizeVisibleViewport(const Size & visibleSize,bool isKeyboard)7153 void WebDelegate::ResizeVisibleViewport(const Size& visibleSize, bool isKeyboard)
7154 {
7155 double width = visibleSize.Width();
7156 double height = visibleSize.Height();
7157 if (NearEqual(resizeVisibleWidth_, width) && NearEqual(resizeVisibleHeight_, height)) {
7158 return;
7159 }
7160 resizeVisibleWidth_ = width;
7161 resizeVisibleHeight_ = height;
7162 auto context = context_.Upgrade();
7163 if (!context) {
7164 return;
7165 }
7166 context->GetTaskExecutor()->PostTask(
7167 [weak = WeakClaim(this), width, height, isKeyboard]() {
7168 auto delegate = weak.Upgrade();
7169 if (delegate && delegate->nweb_ && !delegate->window_) {
7170 delegate->nweb_->ResizeVisibleViewport(
7171 width < 0 ? 0 : std::ceil(width), height < 0 ? 0 : std::ceil(height), isKeyboard);
7172 }
7173 },
7174 TaskExecutor::TaskType::PLATFORM, "ArkUIWebResizeVisibleViewport");
7175 auto webPattern = webPattern_.Upgrade();
7176 CHECK_NULL_VOID(webPattern);
7177 webPattern->DestroyAnalyzerOverlay();
7178 }
7179
GetWebRenderGlobalPos()7180 Offset WebDelegate::GetWebRenderGlobalPos()
7181 {
7182 return offset_;
7183 }
7184
GetEnhanceSurfaceSize(const Size & drawSize)7185 Size WebDelegate::GetEnhanceSurfaceSize(const Size& drawSize)
7186 {
7187 auto pipeline = PipelineBase::GetCurrentContext();
7188 CHECK_NULL_RETURN(pipeline, Size());
7189 double dipScale = pipeline->GetDipScale();
7190 if (NearZero(dipScale)) {
7191 return Size();
7192 }
7193 int width = std::ceil(std::floor(drawSize.Width() / dipScale) * dipScale);
7194 int height = std::ceil(std::floor(drawSize.Height() / dipScale) * dipScale);
7195 if (width <= 0) {
7196 width = 1;
7197 }
7198 if (height <= 0) {
7199 height = 1;
7200 }
7201 return Size(width, height);
7202 }
7203
GetAudioStateChangedCallback(bool useNewPipe,const RefPtr<NG::WebEventHub> & eventHub)7204 WebDelegate::EventCallbackV2 WebDelegate::GetAudioStateChangedCallback(
7205 bool useNewPipe, const RefPtr<NG::WebEventHub>& eventHub)
7206 {
7207 if (eventHub && useNewPipe) {
7208 return eventHub->GetOnAudioStateChangedEvent();
7209 }
7210 return nullptr;
7211 }
7212
7213 #ifdef ENABLE_ROSEN_BACKEND
SetSurface(const sptr<Surface> & surface)7214 void WebDelegate::SetSurface(const sptr<Surface>& surface)
7215 {
7216 surface_ = surface;
7217 auto webPattern = webPattern_.Upgrade();
7218 CHECK_NULL_VOID(webPattern);
7219 auto host = webPattern->GetHost();
7220 CHECK_NULL_VOID(host);
7221 auto renderContext = host->GetRenderContext();
7222 CHECK_NULL_VOID(renderContext);
7223 auto rosenRenderContext = AceType::DynamicCast<NG::RosenRenderContext>(renderContext);
7224 CHECK_NULL_VOID(rosenRenderContext);
7225 rsNode_ = rosenRenderContext->GetRSNode();
7226 CHECK_NULL_VOID(rsNode_);
7227 surfaceRsNode_ = webPattern->GetSurfaceRSNode();
7228 CHECK_NULL_VOID(surfaceRsNode_);
7229 surfaceNodeId_ = webPattern->GetWebSurfaceNodeId();
7230 }
SetPopupSurface(const RefPtr<NG::RenderSurface> & popupSurface)7231 void WebDelegate::SetPopupSurface(const RefPtr<NG::RenderSurface>& popupSurface)
7232 {
7233 auto context = context_.Upgrade();
7234 if (!context) {
7235 return;
7236 }
7237
7238 context->GetTaskExecutor()->PostTask(
7239 [weak = WeakClaim(this), popupSurface]() {
7240 auto delegate = weak.Upgrade();
7241 if (delegate && delegate->nweb_) {
7242 auto rosenRenderSurface = AceType::DynamicCast<NG::RosenRenderSurface>(popupSurface);
7243 delegate->popupRenderSurface_ = rosenRenderSurface;
7244 delegate->popupSurface_ = rosenRenderSurface->GetSurface();
7245
7246 CHECK_NULL_VOID(delegate->popupSurface_);
7247 delegate->nweb_->SetPopupSurface(reinterpret_cast<void *>(&delegate->popupSurface_));
7248 }
7249 },
7250 TaskExecutor::TaskType::PLATFORM, "ArkUISetPopupSurface");
7251 }
7252 #endif
7253
UpdateScreenOffSet(double & offsetX,double & offsetY)7254 void WebDelegate::UpdateScreenOffSet(double& offsetX, double& offsetY)
7255 {
7256 #ifdef NG_BUILD
7257 auto webPattern = webPattern_.Upgrade();
7258 CHECK_NULL_VOID(webPattern);
7259 offsetX += webPattern->GetHost()->GetTransformRelativeOffset().GetX();
7260 offsetY += webPattern->GetHost()->GetTransformRelativeOffset().GetY();
7261 auto context = context_.Upgrade();
7262 CHECK_NULL_VOID(context);
7263 auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
7264 offsetX += windowOffset.GetX();
7265 offsetY += windowOffset.GetY();
7266 return;
7267 #else
7268 if (Container::IsCurrentUseNewPipeline()) {
7269 auto webPattern = webPattern_.Upgrade();
7270 CHECK_NULL_VOID(webPattern);
7271 offsetX += webPattern->GetHost()->GetTransformRelativeOffset().GetX();
7272 offsetY += webPattern->GetHost()->GetTransformRelativeOffset().GetY();
7273 auto context = context_.Upgrade();
7274 CHECK_NULL_VOID(context);
7275 auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
7276 offsetX += windowOffset.GetX();
7277 offsetY += windowOffset.GetY();
7278 return;
7279 }
7280 auto renderWeb = renderWeb_.Upgrade();
7281 CHECK_NULL_VOID(renderWeb);
7282 offsetX += renderWeb->GetGlobalOffset().GetX();
7283 offsetY += renderWeb->GetGlobalOffset().GetY();
7284 auto context = context_.Upgrade();
7285 CHECK_NULL_VOID(context);
7286 auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
7287 offsetX += windowOffset.GetX();
7288 offsetY += windowOffset.GetY();
7289 WindowMode windowMode = context->GetWindowManager()->GetWindowMode();
7290 if (windowMode == WindowMode::WINDOW_MODE_FLOATING) {
7291 offsetX += CONTAINER_BORDER_WIDTH.ConvertToPx();
7292 offsetY += CONTAINER_TITLE_HEIGHT.ConvertToPx();
7293 }
7294 #endif
7295 }
7296
UpdateOverScrollMode(const int overscrollModeValue)7297 void WebDelegate::UpdateOverScrollMode(const int overscrollModeValue)
7298 {
7299 auto context = context_.Upgrade();
7300 CHECK_NULL_VOID(context);
7301 context->GetTaskExecutor()->PostTask(
7302 [weak = WeakClaim(this), overscrollModeValue]() {
7303 auto delegate = weak.Upgrade();
7304 CHECK_NULL_VOID(delegate);
7305 CHECK_NULL_VOID(delegate->nweb_);
7306 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
7307 CHECK_NULL_VOID(setting);
7308 setting->PutOverscrollMode(overscrollModeValue);
7309 },
7310 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateOverScrollMode");
7311 }
7312
UpdateBlurOnKeyboardHideMode(const int isBlurOnKeyboardHideEnable)7313 void WebDelegate::UpdateBlurOnKeyboardHideMode(const int isBlurOnKeyboardHideEnable)
7314 {
7315 auto context = context_.Upgrade();
7316 CHECK_NULL_VOID(context);
7317 context->GetTaskExecutor()->PostTask(
7318 [weak = WeakClaim(this), isBlurOnKeyboardHideEnable]() {
7319 auto delegate = weak.Upgrade();
7320 CHECK_NULL_VOID(delegate);
7321 CHECK_NULL_VOID(delegate->nweb_);
7322 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
7323 CHECK_NULL_VOID(setting);
7324 setting->SetBlurOnKeyboardHideMode(isBlurOnKeyboardHideEnable);
7325 },
7326 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBlurOnKeyboardHideMode");
7327 }
7328
UpdateCopyOptionMode(const int copyOptionModeValue)7329 void WebDelegate::UpdateCopyOptionMode(const int copyOptionModeValue)
7330 {
7331 auto context = context_.Upgrade();
7332 CHECK_NULL_VOID(context);
7333 context->GetTaskExecutor()->PostTask(
7334 [weak = WeakClaim(this), copyOptionModeValue]() {
7335 auto delegate = weak.Upgrade();
7336 CHECK_NULL_VOID(delegate);
7337 CHECK_NULL_VOID(delegate->nweb_);
7338 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
7339 CHECK_NULL_VOID(setting);
7340 setting->PutCopyOptionMode(
7341 static_cast<OHOS::NWeb::NWebPreference::CopyOptionMode>(copyOptionModeValue));
7342 },
7343 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateCopyOptionMode");
7344 }
7345
UpdateTextAutosizing(bool isTextAutosizing)7346 void WebDelegate::UpdateTextAutosizing(bool isTextAutosizing)
7347 {
7348 auto context = context_.Upgrade();
7349 if (!context) {
7350 return;
7351 }
7352 context->GetTaskExecutor()->PostTask(
7353 [weak = WeakClaim(this), isTextAutosizing]() {
7354 auto delegate = weak.Upgrade();
7355 if (delegate && delegate->nweb_) {
7356 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
7357 CHECK_NULL_VOID(setting);
7358 setting->PutTextAutosizingEnabled(isTextAutosizing);
7359 }
7360 },
7361 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateTextAutosizing");
7362 }
7363
UpdateNativeVideoPlayerConfig(bool enable,bool shouldOverlay)7364 void WebDelegate::UpdateNativeVideoPlayerConfig(bool enable, bool shouldOverlay)
7365 {
7366 auto context = context_.Upgrade();
7367 CHECK_NULL_VOID(context);
7368 context->GetTaskExecutor()->PostTask(
7369 [weak = WeakClaim(this), enable, shouldOverlay]() {
7370 auto delegate = weak.Upgrade();
7371 CHECK_NULL_VOID(delegate);
7372 CHECK_NULL_VOID(delegate->nweb_);
7373 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
7374 CHECK_NULL_VOID(setting);
7375 setting->SetNativeVideoPlayerConfig(enable, shouldOverlay);
7376 },
7377 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateNativeVideoPlayerConfig");
7378 }
7379
RegisterSurfacePositionChangedCallback()7380 void WebDelegate::RegisterSurfacePositionChangedCallback()
7381 {
7382 #ifdef NG_BUILD
7383 auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
7384 CHECK_NULL_VOID(pipelineContext);
7385 if (callbackId_ <= 0) {
7386 callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
7387 [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
7388 auto delegate = weak.Upgrade();
7389 if (delegate && delegate->nweb_ && !delegate->window_) {
7390 double offsetX = 0;
7391 double offsetY = 0;
7392 delegate->UpdateScreenOffSet(offsetX, offsetY);
7393 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
7394 }
7395 });
7396 }
7397 return;
7398 #else
7399 if (Container::IsCurrentUseNewPipeline()) {
7400 auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
7401 CHECK_NULL_VOID(pipelineContext);
7402 if (callbackId_ <= 0) {
7403 callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
7404 [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
7405 auto delegate = weak.Upgrade();
7406 if (delegate && delegate->nweb_ && !delegate->window_) {
7407 double offsetX = 0;
7408 double offsetY = 0;
7409 delegate->UpdateScreenOffSet(offsetX, offsetY);
7410 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
7411 }
7412 });
7413 }
7414 return;
7415 }
7416 auto pipelineContext = DynamicCast<PipelineContext>(context_.Upgrade());
7417 CHECK_NULL_VOID(pipelineContext);
7418 if (callbackId_ <= 0) {
7419 callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
7420 [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
7421 auto delegate = weak.Upgrade();
7422 if (delegate && delegate->nweb_ && !delegate->window_) {
7423 double offsetX = 0;
7424 double offsetY = 0;
7425 delegate->UpdateScreenOffSet(offsetX, offsetY);
7426 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
7427 }
7428 });
7429 }
7430 #endif
7431 }
7432
UnregisterSurfacePositionChangedCallback()7433 void WebDelegate::UnregisterSurfacePositionChangedCallback()
7434 {
7435 if (callbackId_ <= 0) {
7436 return;
7437 }
7438 #ifdef NG_BUILD
7439 auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
7440 CHECK_NULL_VOID(pipelineContext);
7441 pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
7442 callbackId_ = 0;
7443 return;
7444 #else
7445 if (Container::IsCurrentUseNewPipeline()) {
7446 auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
7447 CHECK_NULL_VOID(pipelineContext);
7448 pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
7449 callbackId_ = 0;
7450 return;
7451 }
7452 auto pipelineContext = DynamicCast<PipelineContext>(context_.Upgrade());
7453 CHECK_NULL_VOID(pipelineContext);
7454 pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
7455 callbackId_ = 0;
7456 #endif
7457 }
7458
OnCompleteSwapWithNewSize()7459 void WebDelegate::OnCompleteSwapWithNewSize()
7460 {
7461 auto webPattern = webPattern_.Upgrade();
7462 CHECK_NULL_VOID(webPattern);
7463 webPattern->OnCompleteSwapWithNewSize();
7464 }
7465
OnResizeNotWork()7466 void WebDelegate::OnResizeNotWork()
7467 {
7468 auto webPattern = webPattern_.Upgrade();
7469 CHECK_NULL_VOID(webPattern);
7470 webPattern->OnResizeNotWork();
7471 }
7472
OnDateTimeChooserPopup(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>> & suggestions,std::shared_ptr<OHOS::NWeb::NWebDateTimeChooserCallback> callback)7473 void WebDelegate::OnDateTimeChooserPopup(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,
7474 const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>>& suggestions,
7475 std::shared_ptr<OHOS::NWeb::NWebDateTimeChooserCallback> callback)
7476 {
7477 auto webPattern = webPattern_.Upgrade();
7478 CHECK_NULL_VOID(webPattern);
7479 webPattern->OnDateTimeChooserPopup(chooser, suggestions, callback);
7480 }
7481
OnDateTimeChooserClose()7482 void WebDelegate::OnDateTimeChooserClose()
7483 {
7484 auto webPattern = webPattern_.Upgrade();
7485 CHECK_NULL_VOID(webPattern);
7486 webPattern->OnDateTimeChooserClose();
7487 }
7488
OnOverScroll(float xOffset,float yOffset)7489 void WebDelegate::OnOverScroll(float xOffset, float yOffset)
7490 {
7491 auto context = context_.Upgrade();
7492 CHECK_NULL_VOID(context);
7493 context->GetTaskExecutor()->PostTask(
7494 [weak = WeakClaim(this), xOffset, yOffset]() {
7495 auto delegate = weak.Upgrade();
7496 CHECK_NULL_VOID(delegate);
7497 auto onOverScrollV2 = delegate->onOverScrollV2_;
7498 if (onOverScrollV2) {
7499 onOverScrollV2(std::make_shared<WebOnOverScrollEvent>(xOffset, yOffset));
7500 }
7501 },
7502 TaskExecutor::TaskType::JS, "ArkUIWebOverScroll");
7503 }
7504
SetTouchEventInfo(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> touchEvent,TouchEventInfo & touchEventInfo)7505 void WebDelegate::SetTouchEventInfo(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> touchEvent,
7506 TouchEventInfo& touchEventInfo)
7507 {
7508 auto webPattern = webPattern_.Upgrade();
7509 CHECK_NULL_VOID(webPattern);
7510 if (touchEvent) {
7511 TouchEvent event;
7512 event.SetId(touchEvent->GetId())
7513 .SetX(touchEvent->GetX())
7514 .SetY(touchEvent->GetY())
7515 .SetScreenX(touchEvent->GetScreenX())
7516 .SetScreenY(touchEvent->GetScreenY())
7517 .SetType(static_cast<OHOS::Ace::TouchType>(touchEvent->GetType()));
7518 webPattern->SetTouchEventInfo(event, touchEventInfo, touchEvent->GetEmbedId());
7519 } else {
7520 TouchEvent event;
7521 event.SetId(0);
7522 webPattern->SetTouchEventInfo(event, touchEventInfo, DEFAULT_NATIVE_EMBED_ID);
7523 }
7524 }
7525
SetTouchEventInfoFromMouse(const MouseInfo & mouseInfo,TouchEventInfo & touchEventInfo)7526 bool WebDelegate::SetTouchEventInfoFromMouse(const MouseInfo &mouseInfo, TouchEventInfo &touchEventInfo)
7527 {
7528 TouchLocationInfo touchLocationInfo(0);
7529 switch (mouseInfo.GetAction()) {
7530 case MouseAction::PRESS:
7531 touchLocationInfo.SetTouchType(TouchType::DOWN);
7532 break;
7533 case MouseAction::RELEASE:
7534 touchLocationInfo.SetTouchType(TouchType::UP);
7535 break;
7536 case MouseAction::MOVE:
7537 touchLocationInfo.SetTouchType(TouchType::MOVE);
7538 break;
7539 case MouseAction::CANCEL:
7540 touchLocationInfo.SetTouchType(TouchType::CANCEL);
7541 break;
7542 default:
7543 TAG_LOGW(AceLogTag::ACE_WEB, "mouse's action is not match, result is false");
7544 return false;
7545 }
7546 touchLocationInfo.SetLocalLocation(Offset(mouseInfo.GetLocalLocation()));
7547 touchLocationInfo.SetScreenLocation(Offset(mouseInfo.GetScreenLocation()));
7548 touchLocationInfo.SetGlobalLocation(Offset(mouseInfo.GetScreenLocation()));
7549 touchLocationInfo.SetTimeStamp(mouseInfo.GetTimeStamp());
7550 touchEventInfo.AddChangedTouchLocationInfo(std::move(touchLocationInfo));
7551 touchEventInfo.AddTouchLocationInfo(std::move(touchLocationInfo));
7552 touchEventInfo.SetSourceDevice(SourceType::TOUCH);
7553
7554 ACE_SCOPED_TRACE(
7555 "WebDelegate::SetTouchEventInfoFromMouse touchLocationInfo, LocalLocation: %s, ScreenLocation: %s",
7556 mouseInfo.GetLocalLocation().ToString().c_str(), mouseInfo.GetScreenLocation().ToString().c_str());
7557 return true;
7558 }
7559
TransToMouseInfo(const std::shared_ptr<OHOS::NWeb::NWebNativeEmbedMouseEvent> & mouseEvent)7560 MouseInfo WebDelegate::TransToMouseInfo(const std::shared_ptr<OHOS::NWeb::NWebNativeEmbedMouseEvent>& mouseEvent)
7561 {
7562 std::string embedId;
7563 float x = 0;
7564 float y = 0;
7565 if (mouseEvent) {
7566 embedId = mouseEvent->GetEmbedId();
7567 x = mouseEvent->GetX();
7568 y = mouseEvent->GetY();
7569 } else {
7570 embedId = DEFAULT_NATIVE_EMBED_ID;
7571 }
7572 auto webPattern = webPattern_.Upgrade();
7573 CHECK_NULL_RETURN(webPattern, MouseInfo());
7574 CHECK_NULL_RETURN(webPattern->GetHost(), MouseInfo());
7575 auto offset = webPattern->GetHost()->GetTransformRelativeOffset();
7576 auto pos = GetPosition(embedId);
7577
7578 auto& mouseInfoQueue = webPattern->GetMouseInfoQueue();
7579 MouseInfo mouseInfo;
7580 MouseInfo tmpMouseInfo = webPattern->GetMouseInfo();
7581 auto mouseAction = static_cast<MouseAction>(mouseEvent->GetType());
7582 if ((mouseAction == MouseAction::PRESS || mouseAction == MouseAction::RELEASE) && !mouseInfoQueue.empty()) {
7583 tmpMouseInfo = mouseInfoQueue.front();
7584 mouseInfoQueue.pop();
7585 }
7586 mouseInfo.SetLocalLocation(Offset(x, y));
7587 mouseInfo.SetGlobalLocation(Offset(x, y));
7588 mouseInfo.SetScreenLocation(Offset(x + offset.GetX() + pos.GetX(), y + offset.GetY() + pos.GetY()));
7589 mouseInfo.SetAction(mouseAction);
7590 mouseInfo.SetButton(static_cast<MouseButton>(mouseEvent->GetButton()));
7591 mouseInfo.SetTimeStamp(tmpMouseInfo.GetTimeStamp());
7592 mouseInfo.SetSourceDevice(tmpMouseInfo.GetSourceDevice());
7593 mouseInfo.SetTarget(tmpMouseInfo.GetTarget());
7594 mouseInfo.SetForce(tmpMouseInfo.GetForce());
7595 mouseInfo.SetSourceTool(tmpMouseInfo.GetSourceTool());
7596 mouseInfo.SetTargetDisplayId(tmpMouseInfo.GetTargetDisplayId());
7597 mouseInfo.SetDeviceId(tmpMouseInfo.GetDeviceId());
7598
7599 ACE_SCOPED_TRACE("WebDelegate::TransToMouseInfo mouseInfo, LocalLocation: %s, ScreenLocation: %s,"
7600 "GlobalLocation: %s",
7601 mouseInfo.GetLocalLocation().ToString().c_str(), mouseInfo.GetScreenLocation().ToString().c_str(),
7602 mouseInfo.GetGlobalLocation().ToString().c_str());
7603 return mouseInfo;
7604 }
7605
OnNativeEmbedAllDestory()7606 void WebDelegate::OnNativeEmbedAllDestory()
7607 {
7608 if (!isEmbedModeEnabled_) {
7609 return;
7610 }
7611 std::unique_lock<std::shared_mutex> writeLock(embedDataInfoMutex_);
7612 auto iter = embedDataInfo_.begin();
7613 for (; iter != embedDataInfo_.end(); iter++) {
7614 EmbedInfo info;
7615 std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo = iter->second;
7616 if (dataInfo == nullptr) {
7617 continue;
7618 }
7619 std::string embedId = dataInfo->GetEmbedId();
7620 TAG_LOGI(AceLogTag::ACE_WEB, "OnNativeEmbedAllDestory embdedid=%{public}s", embedId.c_str());
7621 std::string surfaceId = dataInfo->GetSurfaceId();
7622 auto embedInfo = dataInfo->GetNativeEmbedInfo();
7623 if (embedInfo) {
7624 info = {embedInfo->GetId(), embedInfo->GetType(), embedInfo->GetSrc(),
7625 embedInfo->GetUrl(), embedInfo->GetTag(), embedInfo->GetWidth(),
7626 embedInfo->GetHeight(), embedInfo->GetX(), embedInfo->GetY(),
7627 embedInfo->GetParams()};
7628 }
7629 if (OnNativeEmbedAllDestoryV2_) {
7630 OHOS::Ace::NativeEmbedStatus status = OHOS::Ace::NativeEmbedStatus::DESTROY;
7631 OnNativeEmbedAllDestoryV2_(
7632 std::make_shared<NativeEmbedDataInfo>(status, surfaceId, embedId, info));
7633 }
7634 }
7635 embedDataInfo_.clear();
7636 }
7637
GetSurfaceIdByHtmlElementId(const std::string & htmlElementId)7638 std::string WebDelegate::GetSurfaceIdByHtmlElementId(const std::string& htmlElementId)
7639 {
7640 std::shared_lock<std::shared_mutex> readLock(embedDataInfoMutex_);
7641 for (auto iter = embedDataInfo_.begin(); iter != embedDataInfo_.end(); iter++) {
7642 std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo = iter->second;
7643 CHECK_NULL_CONTINUE(dataInfo);
7644 auto embedInfo = dataInfo->GetNativeEmbedInfo();
7645 if (embedInfo && embedInfo->GetId() == htmlElementId) {
7646 std::string surfaceId = dataInfo->GetSurfaceId();
7647 return surfaceId;
7648 }
7649 }
7650 TAG_LOGI(AceLogTag::ACE_WEB, "GetSurfaceIdByHtmlElementId surfaceId is empty");
7651 return "";
7652 }
7653
GetHtmlElementIdBySurfaceId(const std::string & surfaceId)7654 std::string WebDelegate::GetHtmlElementIdBySurfaceId(const std::string& surfaceId)
7655 {
7656 std::shared_lock<std::shared_mutex> readLock(embedDataInfoMutex_);
7657 for (auto iter = embedDataInfo_.begin(); iter != embedDataInfo_.end(); iter++) {
7658 std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo = iter->second;
7659 CHECK_NULL_CONTINUE(dataInfo);
7660 std::string surfaceIdInData = dataInfo->GetSurfaceId();
7661 if (surfaceIdInData == surfaceId) {
7662 auto embedInfo = dataInfo->GetNativeEmbedInfo();
7663 CHECK_NULL_RETURN(embedInfo, "");
7664 return embedInfo->GetId();
7665 }
7666 }
7667 TAG_LOGI(AceLogTag::ACE_WEB, "GetHtmlElementIdBySurfaceId html element id is empty");
7668 return "";
7669 }
7670
GetWebAccessibilityIdBySurfaceId(const std::string & surfaceId)7671 int64_t WebDelegate::GetWebAccessibilityIdBySurfaceId(const std::string& surfaceId)
7672 {
7673 CHECK_NULL_RETURN(nweb_, -1);
7674 if (IS_CALLING_FROM_M114()) {
7675 return -1;
7676 }
7677 std::string htmlElementId = GetHtmlElementIdBySurfaceId(surfaceId);
7678 int64_t webAccessibilityId = nweb_->GetWebAccessibilityIdByHtmlElementId(htmlElementId);
7679 return webAccessibilityId;
7680 }
7681
OnNativeEmbedLifecycleChange(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo)7682 void WebDelegate::OnNativeEmbedLifecycleChange(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo)
7683 {
7684 if (!isEmbedModeEnabled_) {
7685 return;
7686 }
7687
7688 EmbedInfo info;
7689 std::string embedId;
7690 std::string surfaceId;
7691 OHOS::Ace::NativeEmbedStatus status = OHOS::Ace::NativeEmbedStatus::CREATE;
7692 if (dataInfo) {
7693 embedId = dataInfo->GetEmbedId();
7694 surfaceId = dataInfo->GetSurfaceId();
7695 status = static_cast<OHOS::Ace::NativeEmbedStatus>(dataInfo->GetStatus());
7696 auto context = context_.Upgrade();
7697 CHECK_NULL_VOID(context);
7698 auto accessibilityManager = context->GetAccessibilityManager();
7699 CHECK_NULL_VOID(accessibilityManager);
7700
7701 auto embedInfo = dataInfo->GetNativeEmbedInfo();
7702 if (embedInfo) {
7703 info = { embedInfo->GetId(), embedInfo->GetType(), embedInfo->GetSrc(), embedInfo->GetUrl(),
7704 embedInfo->GetTag(), embedInfo->GetWidth(), embedInfo->GetHeight(), embedInfo->GetX(),
7705 embedInfo->GetY(), embedInfo->GetParams() };
7706 }
7707
7708 if (status == OHOS::Ace::NativeEmbedStatus::CREATE || status == OHOS::Ace::NativeEmbedStatus::UPDATE) {
7709 accessibilityManager->SetWebPatternBySurfaceId(surfaceId, webPattern_);
7710 std::unique_lock<std::shared_mutex> writeLock(embedDataInfoMutex_);
7711 embedDataInfo_.insert_or_assign(embedId, dataInfo);
7712 } else if (status == OHOS::Ace::NativeEmbedStatus::DESTROY) {
7713 accessibilityManager->RemoveWebPatternBySurfaceId(surfaceId);
7714 std::unique_lock<std::shared_mutex> writeLock(embedDataInfoMutex_);
7715 auto iter = embedDataInfo_.find(embedId);
7716 if (iter != embedDataInfo_.end()) {
7717 embedDataInfo_.erase(iter);
7718 }
7719 }
7720 }
7721
7722 CHECK_NULL_VOID(taskExecutor_);
7723 taskExecutor_->PostTask(
7724 [weak = WeakClaim(this), status, surfaceId, embedId, info]() {
7725 auto delegate = weak.Upgrade();
7726 CHECK_NULL_VOID(delegate);
7727 auto OnNativeEmbedLifecycleChangeV2_ = delegate->OnNativeEmbedLifecycleChangeV2_;
7728 if (OnNativeEmbedLifecycleChangeV2_) {
7729 OnNativeEmbedLifecycleChangeV2_(
7730 std::make_shared<NativeEmbedDataInfo>(status, surfaceId, embedId, info));
7731 }
7732 },
7733 TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedLifecycleChange");
7734 }
7735
OnNativeEmbedVisibilityChange(const std::string & embedId,bool visibility)7736 void WebDelegate::OnNativeEmbedVisibilityChange(const std::string& embedId, bool visibility)
7737 {
7738 if (!isEmbedModeEnabled_) {
7739 return;
7740 }
7741
7742 CHECK_NULL_VOID(taskExecutor_);
7743 taskExecutor_->PostTask(
7744 [weak = WeakClaim(this), embedId, visibility]() {
7745 auto delegate = weak.Upgrade();
7746 CHECK_NULL_VOID(delegate);
7747 auto OnNativeEmbedVisibilityChangeV2_ = delegate->OnNativeEmbedVisibilityChangeV2_;
7748 if (OnNativeEmbedVisibilityChangeV2_) {
7749 OnNativeEmbedVisibilityChangeV2_(
7750 std::make_shared<NativeEmbedVisibilityInfo>(visibility, embedId));
7751 }
7752 },
7753 TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedVisibilityChange");
7754 }
7755
OnNativeEmbedGestureEvent(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> event)7756 void WebDelegate::OnNativeEmbedGestureEvent(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> event)
7757 {
7758 if (event->GetId() == NO_NATIVE_FINGER_TYPE) {
7759 auto webPattern = webPattern_.Upgrade();
7760 CHECK_NULL_VOID(webPattern);
7761 if (webPattern->IsDefaultGestureFocusMode()) {
7762 webPattern->RequestFocus();
7763 }
7764 return;
7765 }
7766 CHECK_NULL_VOID(taskExecutor_);
7767 TouchEventInfo touchEventInfo("touchEvent");
7768 auto embedId = event ? event->GetEmbedId() : "";
7769 SetTouchEventInfo(event, touchEventInfo);
7770 TAG_LOGD(AceLogTag::ACE_WEB, "hit Emebed gusture event notify");
7771 auto param = AceType::MakeRefPtr<GestureEventResultOhos>(event->GetResult());
7772 auto type = event->GetType();
7773 taskExecutor_->PostTask(
7774 [weak = WeakClaim(this), embedId, touchEventInfo, param, type]() {
7775 auto delegate = weak.Upgrade();
7776 CHECK_NULL_VOID(delegate);
7777 auto OnNativeEmbedGestureEventV2_ = delegate->OnNativeEmbedGestureEventV2_;
7778 if (OnNativeEmbedGestureEventV2_) {
7779 OnNativeEmbedGestureEventV2_(
7780 std::make_shared<NativeEmbeadTouchInfo>(embedId, touchEventInfo, param));
7781 if (!param->HasSendTask()) {
7782 param->SetGestureEventResult(true);
7783 }
7784 auto webPattern = delegate->webPattern_.Upgrade();
7785 CHECK_NULL_VOID(webPattern);
7786 if (webPattern->IsDefaultGestureFocusMode() && !param->GetEventResult() &&
7787 type == OHOS::NWeb::TouchType::DOWN) {
7788 webPattern->RequestFocus();
7789 }
7790 }
7791 },
7792 TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedGestureEvent");
7793 }
7794
OnNativeEmbedMouseEvent(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedMouseEvent> event)7795 void WebDelegate::OnNativeEmbedMouseEvent(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedMouseEvent> event)
7796 {
7797 if (!event->IsHitNativeArea()) {
7798 auto webPattern = webPattern_.Upgrade();
7799 CHECK_NULL_VOID(webPattern);
7800 webPattern->RequestFocus();
7801 auto webEventHub = webPattern->GetWebEventHub();
7802 CHECK_NULL_VOID(webEventHub);
7803 auto button = static_cast<MouseButton>(event->GetButton());
7804 bool isSupportMouse = button == MouseButton::LEFT_BUTTON
7805 || button == MouseButton::RIGHT_BUTTON || button == MouseButton::MIDDLE_BUTTON;
7806 if (OnNativeEmbedMouseEventV2_ && isSupportMouse) {
7807 auto gestureEventHub = webEventHub->GetOrCreateGestureEventHub();
7808 CHECK_NULL_VOID(gestureEventHub);
7809 gestureEventHub->SetRecognizerDelayStatus(RecognizerDelayStatus::END);
7810 }
7811 return;
7812 }
7813 CHECK_NULL_VOID(taskExecutor_);
7814 auto embedId = event ? event->GetEmbedId() : "";
7815 TAG_LOGD(AceLogTag::ACE_WEB, "hit Emebed mouse event notify");
7816 MouseInfo mouseInfo = TransToMouseInfo(event);
7817 taskExecutor_->PostTask(
7818 [weak = WeakClaim(this), embedId, mouseInfo, event]() {
7819 auto delegate = weak.Upgrade();
7820 CHECK_NULL_VOID(delegate);
7821 auto result = event->GetResult();
7822 auto button = static_cast<MouseButton>(event->GetButton());
7823 auto OnNativeEmbedMouseEventV2_ = delegate->OnNativeEmbedMouseEventV2_;
7824 bool isSupportMouseToTouch = button == MouseButton::LEFT_BUTTON;
7825 bool isSupportMouse = button == MouseButton::LEFT_BUTTON
7826 || button == MouseButton::RIGHT_BUTTON || button == MouseButton::MIDDLE_BUTTON;
7827 if (OnNativeEmbedMouseEventV2_ && isSupportMouse) {
7828 delegate->HandleNativeMouseEvent(result, mouseInfo, embedId, delegate);
7829 } else if (delegate->OnNativeEmbedGestureEventV2_ && isSupportMouseToTouch) {
7830 delegate->HandleNativeMouseToTouch(result, mouseInfo, embedId, delegate);
7831 }
7832 },
7833 TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedMouseEvent");
7834 }
7835
HandleNativeMouseEvent(const std::shared_ptr<OHOS::NWeb::NWebMouseEventResult> & result,const MouseInfo & mouseInfo,std::string embedId,const RefPtr<WebDelegate> & delegate)7836 void WebDelegate::HandleNativeMouseEvent(
7837 const std::shared_ptr<OHOS::NWeb::NWebMouseEventResult>& result,
7838 const MouseInfo& mouseInfo, std::string embedId, const RefPtr<WebDelegate>& delegate)
7839 {
7840 auto param = AceType::MakeRefPtr<MouseEventResultOhos>(result);
7841 OnNativeEmbedMouseEventV2_(
7842 std::make_shared<NativeEmbeadMouseInfo>(embedId, mouseInfo, param));
7843 if (!param->HasSendTask()) {
7844 param->SetMouseEventResult(true, true);
7845 }
7846 if (!param->GetEventResult() && mouseInfo.GetAction() == MouseAction::PRESS) {
7847 auto webPattern = delegate->webPattern_.Upgrade();
7848 CHECK_NULL_VOID(webPattern);
7849 webPattern->RequestFocus();
7850 }
7851 }
7852
HandleNativeMouseToTouch(const std::shared_ptr<OHOS::NWeb::NWebMouseEventResult> & result,const MouseInfo & mouseInfo,std::string embedId,const RefPtr<WebDelegate> & delegate)7853 void WebDelegate::HandleNativeMouseToTouch(
7854 const std::shared_ptr<OHOS::NWeb::NWebMouseEventResult>& result,
7855 const MouseInfo& mouseInfo, std::string embedId, const RefPtr<WebDelegate>& delegate)
7856 {
7857 auto param = AceType::MakeRefPtr<GestureEventResultOhos>(result);
7858 param->SetIsMouseToTouch(true);
7859 TouchEventInfo touchEventInfo("touchEvent");
7860 if (!delegate->SetTouchEventInfoFromMouse(mouseInfo, touchEventInfo)) {
7861 return;
7862 }
7863 delegate->OnNativeEmbedGestureEventV2_(
7864 std::make_shared<NativeEmbeadTouchInfo>(embedId, touchEventInfo, param));
7865 if (!param->HasSendTask()) {
7866 param->SetGestureEventResult(true);
7867 }
7868
7869 if (!param->GetEventResult() && mouseInfo.GetAction() == MouseAction::PRESS) {
7870 auto webPattern = delegate->webPattern_.Upgrade();
7871 CHECK_NULL_VOID(webPattern);
7872 webPattern->RequestFocus();
7873 }
7874 }
7875
SetToken()7876 void WebDelegate::SetToken()
7877 {
7878 auto container = AceType::DynamicCast<Platform::AceContainer>(Container::Current());
7879 CHECK_NULL_VOID(container);
7880 int32_t instanceId = container->GetInstanceId();
7881 auto window = Platform::AceContainer::GetUIWindow(instanceId);
7882 CHECK_NULL_VOID(window);
7883 auto uiContent = window->GetUIContent();
7884 CHECK_NULL_VOID(nweb_);
7885 CHECK_NULL_VOID(uiContent);
7886 nweb_->SetToken(static_cast<void*>(uiContent));
7887 TAG_LOGD(AceLogTag::ACE_WEB, "setToken success");
7888 }
7889
OnOverScrollFlingVelocity(float xVelocity,float yVelocity,bool isFling)7890 void WebDelegate::OnOverScrollFlingVelocity(float xVelocity, float yVelocity, bool isFling)
7891 {
7892 auto webPattern = webPattern_.Upgrade();
7893 CHECK_NULL_VOID(webPattern);
7894 webPattern->OnOverScrollFlingVelocity(xVelocity, yVelocity, isFling);
7895 }
7896
OnScrollState(bool scrollState)7897 void WebDelegate::OnScrollState(bool scrollState)
7898 {
7899 auto webPattern = webPattern_.Upgrade();
7900 CHECK_NULL_VOID(webPattern);
7901 webPattern->OnScrollState(scrollState);
7902 }
7903
OnScrollStart(const float x,const float y)7904 void WebDelegate::OnScrollStart(const float x, const float y)
7905 {
7906 auto webPattern = webPattern_.Upgrade();
7907 CHECK_NULL_VOID(webPattern);
7908 webPattern->OnScrollStart(x, y);
7909 }
7910
EnableSecurityLayer(bool isNeedSecurityLayer)7911 void WebDelegate::EnableSecurityLayer(bool isNeedSecurityLayer)
7912 {
7913 auto webPattern = webPattern_.Upgrade();
7914 CHECK_NULL_VOID(webPattern);
7915 webPattern->EnableSecurityLayer(isNeedSecurityLayer);
7916 }
7917
OnRootLayerChanged(int width,int height)7918 void WebDelegate::OnRootLayerChanged(int width, int height)
7919 {
7920 auto webPattern = webPattern_.Upgrade();
7921 CHECK_NULL_VOID(webPattern);
7922 webPattern->OnRootLayerChanged(width, height);
7923 }
7924
ReleaseResizeHold()7925 void WebDelegate::ReleaseResizeHold()
7926 {
7927 auto webPattern = webPattern_.Upgrade();
7928 CHECK_NULL_VOID(webPattern);
7929 webPattern->ReleaseResizeHold();
7930 }
7931
SetVirtualKeyBoardArg(int32_t width,int32_t height,double keyboard)7932 void WebDelegate::SetVirtualKeyBoardArg(int32_t width, int32_t height, double keyboard)
7933 {
7934 if (nweb_) {
7935 nweb_->SetVirtualKeyBoardArg(width, height, keyboard);
7936 }
7937 }
7938
ShouldVirtualKeyboardOverlay()7939 bool WebDelegate::ShouldVirtualKeyboardOverlay()
7940 {
7941 if (nweb_) {
7942 return nweb_->ShouldVirtualKeyboardOverlay();
7943 }
7944 return false;
7945 }
7946
FilterScrollEvent(const float x,const float y,const float xVelocity,const float yVelocity)7947 bool WebDelegate::FilterScrollEvent(const float x, const float y, const float xVelocity, const float yVelocity)
7948 {
7949 auto webPattern = webPattern_.Upgrade();
7950 CHECK_NULL_RETURN(webPattern, false);
7951 return webPattern->FilterScrollEvent(x, y, xVelocity, yVelocity);
7952 }
7953
ScrollBy(float deltaX,float deltaY)7954 void WebDelegate::ScrollBy(float deltaX, float deltaY)
7955 {
7956 CHECK_NULL_VOID(nweb_);
7957 nweb_->ScrollBy(deltaX, deltaY);
7958 }
7959
ScrollByRefScreen(float deltaX,float deltaY,float vx,float vy)7960 void WebDelegate::ScrollByRefScreen(float deltaX, float deltaY, float vx, float vy)
7961 {
7962 CHECK_NULL_VOID(nweb_);
7963 nweb_->ScrollByRefScreen(deltaX, deltaY, vx, vy);
7964 }
7965
SetJavaScriptItems(const ScriptItems & scriptItems,const ScriptItemType & type)7966 void WebDelegate::SetJavaScriptItems(const ScriptItems& scriptItems, const ScriptItemType& type)
7967 {
7968 if (type == ScriptItemType::DOCUMENT_START) {
7969 onDocumentStartScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
7970 onDocumentStartScriptItemsByOrder_ = std::nullopt;
7971 } else if (type == ScriptItemType::DOCUMENT_END) {
7972 onDocumentEndScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
7973 onDocumentEndScriptItemsByOrder_ = std::nullopt;
7974 } else if (type == ScriptItemType::DOCUMENT_HEAD_READY) {
7975 onHeadReadyScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
7976 onHeadReadyScriptItemsByOrder_ = std::nullopt;
7977 }
7978 }
7979
JavaScriptOnDocumentStart()7980 void WebDelegate::JavaScriptOnDocumentStart()
7981 {
7982 CHECK_NULL_VOID(nweb_);
7983 if (onDocumentStartScriptItems_.has_value() && !onDocumentStartScriptItemsByOrder_.has_value()) {
7984 nweb_->JavaScriptOnDocumentStart(onDocumentStartScriptItems_.value());
7985 onDocumentStartScriptItems_ = std::nullopt;
7986 }
7987 }
7988
SetJavaScriptItemsByOrder(const ScriptItems & scriptItems,const ScriptItemType & type,const ScriptItemsByOrder & scriptItemsByOrder)7989 void WebDelegate::SetJavaScriptItemsByOrder(const ScriptItems& scriptItems, const ScriptItemType& type,
7990 const ScriptItemsByOrder& scriptItemsByOrder)
7991 {
7992 if (type == ScriptItemType::DOCUMENT_START) {
7993 onDocumentStartScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
7994 onDocumentStartScriptItemsByOrder_ = std::make_optional<ScriptItemsByOrder>(scriptItemsByOrder);
7995 } else if (type == ScriptItemType::DOCUMENT_END) {
7996 onDocumentEndScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
7997 onDocumentEndScriptItemsByOrder_ = std::make_optional<ScriptItemsByOrder>(scriptItemsByOrder);
7998 } else if (type == ScriptItemType::DOCUMENT_HEAD_READY) {
7999 onHeadReadyScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
8000 onHeadReadyScriptItemsByOrder_ = std::make_optional<ScriptItemsByOrder>(scriptItemsByOrder);
8001 }
8002 }
8003
JavaScriptOnDocumentStartByOrder()8004 void WebDelegate::JavaScriptOnDocumentStartByOrder()
8005 {
8006 CHECK_NULL_VOID(nweb_);
8007 if (onDocumentStartScriptItems_.has_value() && onDocumentStartScriptItemsByOrder_.has_value()) {
8008 nweb_->JavaScriptOnDocumentStartByOrder(onDocumentStartScriptItems_.value(),
8009 onDocumentStartScriptItemsByOrder_.value());
8010 onDocumentStartScriptItems_ = std::nullopt;
8011 onDocumentStartScriptItemsByOrder_ = std::nullopt;
8012 }
8013 }
8014
JavaScriptOnDocumentEndByOrder()8015 void WebDelegate::JavaScriptOnDocumentEndByOrder()
8016 {
8017 CHECK_NULL_VOID(nweb_);
8018 if (onDocumentEndScriptItems_.has_value() && onDocumentEndScriptItemsByOrder_.has_value()) {
8019 nweb_->JavaScriptOnDocumentEndByOrder(onDocumentEndScriptItems_.value(),
8020 onDocumentEndScriptItemsByOrder_.value());
8021 onDocumentEndScriptItems_ = std::nullopt;
8022 onDocumentEndScriptItemsByOrder_ = std::nullopt;
8023 }
8024 }
8025
JavaScriptOnHeadReadyByOrder()8026 void WebDelegate::JavaScriptOnHeadReadyByOrder()
8027 {
8028 CHECK_NULL_VOID(nweb_);
8029 if (onHeadReadyScriptItems_.has_value() && onHeadReadyScriptItemsByOrder_.has_value()) {
8030 nweb_->JavaScriptOnHeadReadyByOrder(onHeadReadyScriptItems_.value(),
8031 onHeadReadyScriptItemsByOrder_.value());
8032 onHeadReadyScriptItems_ = std::nullopt;
8033 onHeadReadyScriptItemsByOrder_ = std::nullopt;
8034 }
8035 }
8036
JavaScriptOnDocumentEnd()8037 void WebDelegate::JavaScriptOnDocumentEnd()
8038 {
8039 CHECK_NULL_VOID(nweb_);
8040 if (onDocumentEndScriptItems_.has_value() && !onDocumentEndScriptItemsByOrder_.has_value()) {
8041 nweb_->JavaScriptOnDocumentEnd(onDocumentEndScriptItems_.value());
8042 onDocumentEndScriptItems_ = std::nullopt;
8043 }
8044 }
8045
ExecuteAction(int64_t accessibilityId,AceAction action,const std::map<std::string,std::string> & actionArguments)8046 bool WebDelegate::ExecuteAction(
8047 int64_t accessibilityId, AceAction action, const std::map<std::string, std::string>& actionArguments)
8048 {
8049 TAG_LOGI(AceLogTag::ACE_WEB,
8050 "WebDelegate::ExecuteAction, accessibilityId = %{public}" PRId64 ", action = %{public}d", accessibilityId,
8051 static_cast<int32_t>(action));
8052 if (!accessibilityState_) {
8053 return false;
8054 }
8055 uint32_t nwebAction = static_cast<uint32_t>(action);
8056 CHECK_NULL_RETURN(nweb_, false);
8057 return nweb_->PerformActionV2(accessibilityId, nwebAction, actionArguments);
8058 }
8059
GetAccessibilityNodeRectById(int64_t accessibilityId,int32_t * width,int32_t * height,int32_t * offsetX,int32_t * offsetY)8060 bool WebDelegate::GetAccessibilityNodeRectById(
8061 int64_t accessibilityId, int32_t* width, int32_t* height, int32_t* offsetX, int32_t* offsetY)
8062 {
8063 if (!accessibilityState_) {
8064 return false;
8065 }
8066 CHECK_NULL_RETURN(nweb_, false);
8067 return nweb_->GetAccessibilityNodeRectById(accessibilityId, width, height, offsetX, offsetY);
8068 }
8069
SetAccessibilityState(bool state,bool isDelayed)8070 void WebDelegate::SetAccessibilityState(bool state, bool isDelayed)
8071 {
8072 if (state == accessibilityState_) {
8073 return;
8074 }
8075 accessibilityState_ = state;
8076 if (state) {
8077 auto context = context_.Upgrade();
8078 CHECK_NULL_VOID(context);
8079 uint32_t delayedTime = 0;
8080 if (isDelayed) {
8081 delayedTime = ACCESSIBILITY_DELAY_MILLISECONDS;
8082 }
8083 context->GetTaskExecutor()->PostDelayedTask(
8084 [weak = WeakClaim(this), state]() {
8085 auto delegate = weak.Upgrade();
8086 CHECK_NULL_VOID(delegate);
8087 CHECK_NULL_VOID(delegate->nweb_);
8088 delegate->nweb_->SetAccessibilityState(state);
8089 },
8090 TaskExecutor::TaskType::PLATFORM, delayedTime, "ArkUIWebSetAccessibilityState");
8091 } else {
8092 CHECK_NULL_VOID(nweb_);
8093 nweb_->SetAccessibilityState(state);
8094 }
8095 }
8096
GetFocusedAccessibilityNodeInfo(int64_t accessibilityId,bool isAccessibilityFocus)8097 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> WebDelegate::GetFocusedAccessibilityNodeInfo(
8098 int64_t accessibilityId, bool isAccessibilityFocus)
8099 {
8100 CHECK_NULL_RETURN(nweb_, nullptr);
8101 if (!accessibilityState_) {
8102 return nullptr;
8103 }
8104 return nweb_->GetFocusedAccessibilityNodeInfo(accessibilityId, isAccessibilityFocus);
8105 }
8106
GetAccessibilityNodeInfoById(int64_t accessibilityId)8107 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> WebDelegate::GetAccessibilityNodeInfoById(
8108 int64_t accessibilityId)
8109 {
8110 CHECK_NULL_RETURN(nweb_, nullptr);
8111 if (!accessibilityState_) {
8112 return nullptr;
8113 }
8114 return nweb_->GetAccessibilityNodeInfoById(accessibilityId);
8115 }
8116
GetAccessibilityNodeInfoByFocusMove(int64_t accessibilityId,int32_t direction)8117 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> WebDelegate::GetAccessibilityNodeInfoByFocusMove(
8118 int64_t accessibilityId, int32_t direction)
8119 {
8120 TAG_LOGI(AceLogTag::ACE_WEB,
8121 "WebDelegate::GetAccessibilityNodeInfoByFocusMove, accessibilityId = %{public}" PRId64
8122 ", direction = %{public}d",
8123 accessibilityId, direction);
8124 CHECK_NULL_RETURN(nweb_, nullptr);
8125 if (!accessibilityState_) {
8126 return nullptr;
8127 }
8128 return nweb_->GetAccessibilityNodeInfoByFocusMove(accessibilityId, direction);
8129 }
8130
GetCopyOptionMode() const8131 OHOS::NWeb::NWebPreference::CopyOptionMode WebDelegate::GetCopyOptionMode() const
8132 {
8133 CHECK_NULL_RETURN(nweb_, OHOS::NWeb::NWebPreference::CopyOptionMode::CROSS_DEVICE);
8134 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_->GetPreference();
8135 CHECK_NULL_RETURN(setting, OHOS::NWeb::NWebPreference::CopyOptionMode::CROSS_DEVICE);
8136 auto copyOption = setting->GetCopyOptionMode();
8137 return copyOption;
8138 }
8139
OnOpenAppLink(const std::string & url,std::shared_ptr<OHOS::NWeb::NWebAppLinkCallback> callback)8140 bool WebDelegate::OnOpenAppLink(
8141 const std::string& url, std::shared_ptr<OHOS::NWeb::NWebAppLinkCallback> callback)
8142 {
8143 if (!callback) {
8144 TAG_LOGE(AceLogTag::ACE_WEB, "open app link callback is nullptr");
8145 return false;
8146 }
8147 auto context = context_.Upgrade();
8148 CHECK_NULL_RETURN(context, false);
8149 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
8150 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), url, callback]() {
8151 auto delegate = weak.Upgrade();
8152 CHECK_NULL_VOID(delegate);
8153 auto webPattern = delegate->webPattern_.Upgrade();
8154 CHECK_NULL_VOID(webPattern);
8155 auto openAppLinkCallback = webPattern->GetOnOpenAppLinkCallback();
8156 CHECK_NULL_VOID(openAppLinkCallback);
8157 openAppLinkCallback(std::make_shared<WebAppLinkEvent>(url,
8158 AceType::MakeRefPtr<WebAppLinkCallbackOhos>(callback)));
8159 }, "ArkUIWebOnOpenAppLink");
8160 return true;
8161 }
8162
OnSetFaviconCallback(std::shared_ptr<FaviconReceivedEvent> param)8163 bool WebDelegate::OnSetFaviconCallback(std::shared_ptr<FaviconReceivedEvent> param)
8164 {
8165 if (!param) {
8166 TAG_LOGE(AceLogTag::ACE_WEB, "Set Favicon callback is nullptr");
8167 return false;
8168 }
8169 auto context = context_.Upgrade();
8170 CHECK_NULL_RETURN(context, false);
8171 bool result = false;
8172 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
8173 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), param, &result]() {
8174 auto delegate = weak.Upgrade();
8175 CHECK_NULL_VOID(delegate);
8176 auto webPattern = delegate->webPattern_.Upgrade();
8177 CHECK_NULL_VOID(webPattern);
8178 auto setFaviconCallback = webPattern->GetSetFaviconFunction();
8179 CHECK_NULL_VOID(setFaviconCallback);
8180 setFaviconCallback(param);
8181 result = true;
8182 }, "SetFavicon");
8183 return result;
8184 }
8185
GetCanonicalEncodingName(const std::string & alias_name) const8186 std::string WebDelegate::GetCanonicalEncodingName(const std::string& alias_name) const
8187 {
8188 const char* standards[3] = { "HTML", "MIME", "IANA" };
8189 for (auto* standard : standards) {
8190 UErrorCode errorCode = U_ZERO_ERROR;
8191 const char* result =
8192 ucnv_getStandardName(alias_name.c_str(), standard, &errorCode);
8193 if (!U_SUCCESS(errorCode) || !result)
8194 continue;
8195 std::string canonicalName(result);
8196 for (const auto& encodingName : CANONICALENCODINGNAMES) {
8197 if (encodingName == canonicalName)
8198 return canonicalName;
8199 }
8200 }
8201 return DEFAULT_CANONICAL_ENCODING_NAME;
8202 }
8203
UpdateDefaultTextEncodingFormat(const std::string & textEncodingFormat)8204 void WebDelegate::UpdateDefaultTextEncodingFormat(const std::string& textEncodingFormat)
8205 {
8206 auto context = context_.Upgrade();
8207 if (!context || textEncodingFormat.empty()) {
8208 return;
8209 }
8210 auto canonicalEncodingName = GetCanonicalEncodingName(textEncodingFormat);
8211 context->GetTaskExecutor()->PostTask(
8212 [weak = WeakClaim(this), canonicalEncodingName]() {
8213 auto delegate = weak.Upgrade();
8214 if (delegate && delegate->nweb_) {
8215 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
8216 if (setting) {
8217 setting->PutDefaultTextEncodingFormat(canonicalEncodingName);
8218 }
8219 }
8220 },
8221 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDefaultTextEncodingFormat");
8222 }
8223
OnIntelligentTrackingPreventionResult(const std::string & websiteHost,const std::string & trackerHost)8224 void WebDelegate::OnIntelligentTrackingPreventionResult(
8225 const std::string& websiteHost, const std::string& trackerHost)
8226 {
8227 if (onIntelligentTrackingPreventionResultV2_) {
8228 onIntelligentTrackingPreventionResultV2_(
8229 std::make_shared<IntelligentTrackingPreventionResultEvent>(
8230 websiteHost, trackerHost));
8231 }
8232 }
8233
OnHandleOverrideLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)8234 bool WebDelegate::OnHandleOverrideLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)
8235 {
8236 if (!request) {
8237 return false;
8238 }
8239 CHECK_NULL_RETURN(taskExecutor_, false);
8240 bool result = false;
8241 auto jsTaskExecutor = SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
8242 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), request, &result]() {
8243 auto delegate = weak.Upgrade();
8244 CHECK_NULL_VOID(delegate);
8245 auto webRequest = AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
8246 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect());
8247 auto param = std::make_shared<LoadOverrideEvent>(webRequest);
8248 if (Container::IsCurrentUseNewPipeline()) {
8249 auto webPattern = delegate->webPattern_.Upgrade();
8250 CHECK_NULL_VOID(webPattern);
8251 auto webEventHub = webPattern->GetWebEventHub();
8252 CHECK_NULL_VOID(webEventHub);
8253 auto propOnOverrideUrlLoadingEvent = webEventHub->GetOnOverrideUrlLoadingEvent();
8254 CHECK_NULL_VOID(propOnOverrideUrlLoadingEvent);
8255 result = propOnOverrideUrlLoadingEvent(param);
8256 return;
8257 }
8258 auto webCom = delegate->webComponent_.Upgrade();
8259 CHECK_NULL_VOID(webCom);
8260 result = webCom->OnOverrideUrlLoading(param.get());
8261 }, "ArkUIWebHandleOverrideLoading");
8262 return result;
8263 }
8264
OnDetachContext()8265 void WebDelegate::OnDetachContext()
8266 {
8267 UnRegisterScreenLockFunction();
8268 UnregisterSurfacePositionChangedCallback();
8269 auto context = context_.Upgrade();
8270 CHECK_NULL_VOID(context);
8271 auto pipelineContext = DynamicCast<NG::PipelineContext>(context);
8272 CHECK_NULL_VOID(pipelineContext);
8273 pipelineContext->AddAfterRenderTask(
8274 [weak = WeakClaim(this), instanceId = instanceId_]() {
8275 auto delegate = weak.Upgrade();
8276 CHECK_NULL_VOID(delegate);
8277 delegate->UnregisterAvoidAreaChangeListener(instanceId);
8278 });
8279 instanceId_ = INSTANCE_ID_UNDEFINED;
8280 }
8281
OnAttachContext(const RefPtr<NG::PipelineContext> & context)8282 void WebDelegate::OnAttachContext(const RefPtr<NG::PipelineContext> &context)
8283 {
8284 instanceId_ = context->GetInstanceId();
8285 context_ = context;
8286 RegisterSurfacePositionChangedCallback();
8287 if (nweb_) {
8288 auto screenLockCallback = std::make_shared<NWebScreenLockCallbackImpl>(context);
8289 nweb_->RegisterScreenLockFunction(instanceId_, screenLockCallback);
8290 auto windowId = context->GetFocusWindowId();
8291 nweb_->SetWindowId(windowId);
8292 }
8293 auto pipelineContext = DynamicCast<NG::PipelineContext>(context);
8294 CHECK_NULL_VOID(pipelineContext);
8295 pipelineContext->AddAfterRenderTask(
8296 [weak = WeakClaim(this), instanceId = instanceId_]() {
8297 auto delegate = weak.Upgrade();
8298 CHECK_NULL_VOID(delegate);
8299 delegate->RegisterAvoidAreaChangeListener(instanceId);
8300 });
8301 }
8302
UpdateMetaViewport(bool isMetaViewportEnabled)8303 void WebDelegate::UpdateMetaViewport(bool isMetaViewportEnabled)
8304 {
8305 auto context = context_.Upgrade();
8306 CHECK_NULL_VOID(context);
8307 context->GetTaskExecutor()->PostTask(
8308 [weak = WeakClaim(this), isMetaViewportEnabled]() {
8309 auto delegate = weak.Upgrade();
8310 if (delegate && delegate->nweb_) {
8311 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
8312 if (setting) {
8313 setting->SetViewportEnable(isMetaViewportEnabled);
8314 }
8315 }
8316 },
8317 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMetaViewport");
8318 }
8319
ScaleGestureChange(double scale,double centerX,double centerY)8320 void WebDelegate::ScaleGestureChange(double scale, double centerX, double centerY)
8321 {
8322 #ifdef OHOS_STANDARD_SYSTEM
8323 ACE_DCHECK(nweb_ != nullptr);
8324 if (nweb_) {
8325 nweb_->ScaleGestureChange(scale, centerX, centerY);
8326 }
8327 #endif
8328 }
8329
GetWordSelection(const std::string & text,int8_t offset)8330 std::vector<int8_t> WebDelegate::GetWordSelection(const std::string& text, int8_t offset)
8331 {
8332 auto webPattern = webPattern_.Upgrade();
8333 std::vector<int8_t> vec = { -1, -1 };
8334 CHECK_NULL_RETURN(webPattern, vec);
8335 return webPattern->GetWordSelection(text, offset);
8336 }
8337
NotifyForNextTouchEvent()8338 void WebDelegate::NotifyForNextTouchEvent()
8339 {
8340 ACE_DCHECK(nweb_ != nullptr);
8341 if (nweb_) {
8342 nweb_->NotifyForNextTouchEvent();
8343 }
8344 }
8345
OnRenderProcessNotResponding(const std::string & jsStack,int pid,OHOS::NWeb::RenderProcessNotRespondingReason reason)8346 void WebDelegate::OnRenderProcessNotResponding(
8347 const std::string& jsStack, int pid, OHOS::NWeb::RenderProcessNotRespondingReason reason)
8348 {
8349 CHECK_NULL_VOID(taskExecutor_);
8350 taskExecutor_->PostTask(
8351 [weak = WeakClaim(this), jsStack, pid, reason]() {
8352 auto delegate = weak.Upgrade();
8353 CHECK_NULL_VOID(delegate);
8354 auto onRenderProcessNotRespondingV2 = delegate->onRenderProcessNotRespondingV2_;
8355 if (onRenderProcessNotRespondingV2) {
8356 onRenderProcessNotRespondingV2(std::make_shared<RenderProcessNotRespondingEvent>(
8357 jsStack, pid, static_cast<int>(reason)));
8358 }
8359 },
8360 TaskExecutor::TaskType::JS, "ArkUIWebHandleRenderProcessNotResponding");
8361 }
8362
OnRenderProcessResponding()8363 void WebDelegate::OnRenderProcessResponding()
8364 {
8365 CHECK_NULL_VOID(taskExecutor_);
8366 taskExecutor_->PostTask(
8367 [weak = WeakClaim(this)]() {
8368 auto delegate = weak.Upgrade();
8369 CHECK_NULL_VOID(delegate);
8370 auto onRenderProcessRespondingV2 = delegate->onRenderProcessRespondingV2_;
8371 if (onRenderProcessRespondingV2) {
8372 onRenderProcessRespondingV2(std::make_shared<RenderProcessRespondingEvent>());
8373 }
8374 },
8375 TaskExecutor::TaskType::JS, "ArkUIWebHandleRenderProcessResponding");
8376 }
8377
GetSelectInfo() const8378 std::string WebDelegate::GetSelectInfo() const
8379 {
8380 CHECK_NULL_RETURN(nweb_, std::string());
8381 return nweb_->GetSelectInfo();
8382 }
8383
GetAllTextInfo() const8384 std::string WebDelegate::GetAllTextInfo() const
8385 {
8386 CHECK_NULL_RETURN(nweb_, std::string());
8387 return nweb_->GetAllTextInfo();
8388 }
8389
GetSelectStartIndex() const8390 int WebDelegate::GetSelectStartIndex() const
8391 {
8392 CHECK_NULL_RETURN(nweb_, 0);
8393 return nweb_->GetSelectStartIndex();
8394 }
8395
GetSelectEndIndex() const8396 int WebDelegate::GetSelectEndIndex() const
8397 {
8398 CHECK_NULL_RETURN(nweb_, 0);
8399 return nweb_->GetSelectEndIndex();
8400 }
8401
GetPosition(const std::string & embedId)8402 Offset WebDelegate::GetPosition(const std::string& embedId)
8403 {
8404 std::shared_lock<std::shared_mutex> readLock(embedDataInfoMutex_);
8405 auto iter = embedDataInfo_.find(embedId);
8406 if (iter != embedDataInfo_.end()) {
8407 std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo = iter->second;
8408 if (dataInfo) {
8409 auto embedInfo = dataInfo->GetNativeEmbedInfo();
8410 return Offset(embedInfo->GetX(), embedInfo->GetY());
8411 }
8412 }
8413 return Offset();
8414 }
8415
OnShowAutofillPopup(const float offsetX,const float offsetY,const std::vector<std::string> & menu_items)8416 void WebDelegate::OnShowAutofillPopup(
8417 const float offsetX, const float offsetY, const std::vector<std::string>& menu_items)
8418 {
8419 auto webPattern = webPattern_.Upgrade();
8420 CHECK_NULL_VOID(webPattern);
8421 webPattern->OnShowAutofillPopup(offsetX, offsetY, menu_items);
8422 }
8423
OnShowAutofillPopupV2(const float offsetX,const float offsetY,const float height,const float width,const std::vector<std::string> & menu_items)8424 void WebDelegate::OnShowAutofillPopupV2(
8425 const float offsetX, const float offsetY, const float height, const float width,
8426 const std::vector<std::string>& menu_items)
8427 {
8428 auto webPattern = webPattern_.Upgrade();
8429 CHECK_NULL_VOID(webPattern);
8430 webPattern->OnShowAutofillPopupV2(offsetX, offsetY, height, width, menu_items);
8431 }
8432
SuggestionSelected(int32_t index)8433 void WebDelegate::SuggestionSelected(int32_t index)
8434 {
8435 CHECK_NULL_VOID(nweb_);
8436 nweb_->SuggestionSelected(index);
8437 }
8438
OnHideAutofillPopup()8439 void WebDelegate::OnHideAutofillPopup()
8440 {
8441 auto webPattern = webPattern_.Upgrade();
8442 CHECK_NULL_VOID(webPattern);
8443 webPattern->OnHideAutofillPopup();
8444 }
8445
OnAreaChange(const OHOS::Ace::Rect & area)8446 void WebDelegate::OnAreaChange(const OHOS::Ace::Rect& area)
8447 {
8448 if (currentArea_ == area) {
8449 return;
8450 }
8451 currentArea_ = area;
8452 if (nweb_) {
8453 double offsetX = 0;
8454 double offsetY = 0;
8455 UpdateScreenOffSet(offsetX, offsetY);
8456 nweb_->SetScreenOffSet(offsetX, offsetY);
8457 }
8458 OnSafeInsetsChange();
8459 }
8460
OnViewportFitChange(OHOS::NWeb::ViewportFit viewportFit)8461 void WebDelegate::OnViewportFitChange(OHOS::NWeb::ViewportFit viewportFit)
8462 {
8463 CHECK_NULL_VOID(taskExecutor_);
8464 taskExecutor_->PostTask(
8465 [weak = WeakClaim(this), viewportFit]() {
8466 auto delegate = weak.Upgrade();
8467 CHECK_NULL_VOID(delegate);
8468 auto onViewportFitChangedV2 = delegate->onViewportFitChangedV2_;
8469 if (onViewportFitChangedV2) {
8470 onViewportFitChangedV2(std::make_shared<ViewportFitChangedEvent>(static_cast<int32_t>(viewportFit)));
8471 }
8472 },
8473 TaskExecutor::TaskType::JS, "ArkUIWebViewportFitChanged");
8474 }
8475
OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea,OHOS::Rosen::AvoidAreaType type)8476 void WebDelegate::OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea, OHOS::Rosen::AvoidAreaType type)
8477 {
8478 bool changed = false;
8479 auto safeArea = ConvertAvoidArea(avoidArea);
8480
8481 if (type == Rosen::AvoidAreaType::TYPE_SYSTEM) {
8482 changed = (systemSafeArea_ != safeArea);
8483 systemSafeArea_ = safeArea;
8484 } else if (type == Rosen::AvoidAreaType::TYPE_CUTOUT) {
8485 changed = (cutoutSafeArea_ != safeArea);
8486 cutoutSafeArea_ = safeArea;
8487 } else if (type == Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR) {
8488 changed = (navigationIndicatorSafeArea_ != safeArea);
8489 navigationIndicatorSafeArea_ = safeArea;
8490 }
8491
8492 if (changed) {
8493 OnSafeInsetsChange();
8494 }
8495 }
8496
OnInterceptKeyboardAttach(const std::shared_ptr<OHOS::NWeb::NWebCustomKeyboardHandler> keyboardHandler,const std::map<std::string,std::string> & attributes,bool & useSystemKeyboard,int32_t & enterKeyType)8497 void WebDelegate::OnInterceptKeyboardAttach(
8498 const std::shared_ptr<OHOS::NWeb::NWebCustomKeyboardHandler> keyboardHandler,
8499 const std::map<std::string, std::string> &attributes, bool &useSystemKeyboard, int32_t &enterKeyType)
8500 {
8501 CHECK_NULL_VOID(onInterceptKeyboardAttachV2_);
8502 CHECK_NULL_VOID(taskExecutor_);
8503 keyboardHandler_ = keyboardHandler;
8504 WebKeyboardOption keyboardOpt;
8505 std::function<void()> buildFunc = nullptr;
8506 taskExecutor_->PostSyncTask(
8507 [weak = WeakClaim(this), &keyboardHandler, &attributes, &keyboardOpt]() {
8508 auto delegate = weak.Upgrade();
8509 CHECK_NULL_VOID(delegate);
8510 auto onInterceptKeyboardAttachV2_ = delegate->onInterceptKeyboardAttachV2_;
8511 if (onInterceptKeyboardAttachV2_) {
8512 auto param = AceType::MakeRefPtr<WebCustomKeyboardHandlerOhos>(keyboardHandler);
8513 keyboardOpt = onInterceptKeyboardAttachV2_(std::make_shared<InterceptKeyboardEvent>(param, attributes));
8514 }
8515 },
8516 TaskExecutor::TaskType::JS, "ArkUIWebHandleInterceptKeyboardAttach");
8517
8518 useSystemKeyboard = keyboardOpt.isSystemKeyboard_;
8519 enterKeyType = keyboardOpt.enterKeyTpye_;
8520 auto webPattern = webPattern_.Upgrade();
8521 CHECK_NULL_VOID(webPattern);
8522 webPattern->SetCustomKeyboardBuilder(keyboardOpt.customKeyboardBuilder_);
8523 TAG_LOGI(AceLogTag::ACE_WEB, "WebCustomKeyboard OnInterceptKeyboardAttach sync task end");
8524 }
8525
OnCustomKeyboardAttach()8526 void WebDelegate::OnCustomKeyboardAttach()
8527 {
8528 auto webPattern = webPattern_.Upgrade();
8529 CHECK_NULL_VOID(webPattern);
8530 webPattern->AttachCustomKeyboard();
8531 }
8532
OnCustomKeyboardClose()8533 void WebDelegate::OnCustomKeyboardClose()
8534 {
8535 auto webPattern = webPattern_.Upgrade();
8536 CHECK_NULL_VOID(webPattern);
8537 webPattern->CloseCustomKeyboard();
8538 }
8539
KeyboardReDispatch(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent> & event,bool isUsed)8540 void WebDelegate::KeyboardReDispatch(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent>& event, bool isUsed)
8541 {
8542 auto webPattern = webPattern_.Upgrade();
8543 CHECK_NULL_VOID(webPattern);
8544 webPattern->KeyboardReDispatch(event, isUsed);
8545 }
8546
OnTakeFocus(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent> & event)8547 void WebDelegate::OnTakeFocus(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent>& event)
8548 {
8549 auto webPattern = webPattern_.Upgrade();
8550 CHECK_NULL_VOID(webPattern);
8551 webPattern->OnTakeFocus(event);
8552 }
8553
OnCursorUpdate(double x,double y,double width,double height)8554 void WebDelegate::OnCursorUpdate(double x, double y, double width, double height)
8555 {
8556 auto webPattern = webPattern_.Upgrade();
8557 CHECK_NULL_VOID(webPattern);
8558 webPattern->OnCursorUpdate(x, y, width, height);
8559 }
8560
GetCombinedSafeArea()8561 NG::SafeAreaInsets WebDelegate::GetCombinedSafeArea()
8562 {
8563 NG::SafeAreaInsets resultSafeArea({0, 0}, {0, 0}, {0, 0}, {0, 0});
8564 resultSafeArea = resultSafeArea.Combine(systemSafeArea_);
8565 resultSafeArea = resultSafeArea.Combine(cutoutSafeArea_);
8566 resultSafeArea = resultSafeArea.Combine(navigationIndicatorSafeArea_);
8567 return resultSafeArea;
8568 }
8569
OnSafeInsetsChange()8570 void WebDelegate::OnSafeInsetsChange()
8571 {
8572 NG::SafeAreaInsets resultSafeArea = GetCombinedSafeArea();
8573 auto context = context_.Upgrade();
8574 if (!context) {
8575 TAG_LOGE(AceLogTag::ACE_WEB, "WebDelegate::OnSafeInsetsChange occur errors, context is nullptr");
8576 return;
8577 }
8578 auto windowRect = context->GetDisplayWindowRectInfo();
8579
8580 int left = 0;
8581 if (resultSafeArea.left_.IsValid() && resultSafeArea.left_.end > currentArea_.Left()) {
8582 left = static_cast<int>(
8583 resultSafeArea.left_.start + resultSafeArea.left_.end - std::max(currentArea_.Left(), 0.0));
8584 }
8585 int top = 0;
8586 if (resultSafeArea.top_.IsValid() && resultSafeArea.top_.end > currentArea_.Top()) {
8587 top = static_cast<int>(resultSafeArea.top_.end -
8588 std::max<double>(currentArea_.Top(), resultSafeArea.top_.start));
8589 }
8590 int right = 0;
8591 if (resultSafeArea.right_.IsValid() && resultSafeArea.right_.start < currentArea_.Right()) {
8592 right = static_cast<int>(std::min(windowRect.Width(), currentArea_.Right()) +
8593 windowRect.Width() - resultSafeArea.right_.end - resultSafeArea.right_.start);
8594 }
8595 int bottom = 0;
8596 if (resultSafeArea.bottom_.IsValid() && resultSafeArea.bottom_.start < currentArea_.Bottom()) {
8597 bottom = static_cast<int>(
8598 std::min<double>(resultSafeArea.bottom_.end, currentArea_.Bottom()) - resultSafeArea.bottom_.start);
8599 }
8600
8601 if (left < 0 || bottom < 0 || right < 0 || top < 0) {
8602 TAG_LOGE(AceLogTag::ACE_WEB, "WebDelegate::OnSafeInsetsChange occur errors "
8603 "ltrb:%{public}d,%{public}d,%{public}d,%{public}d", left, top, right, bottom);
8604 return;
8605 }
8606 TAG_LOGD(AceLogTag::ACE_WEB,
8607 "WebDelegate::OnSafeInsetsChange left:%{public}d top:%{public}d right:%{public}d bottom:%{public}d "
8608 "systemSafeArea:%{public}s cutoutSafeArea:%{public}s navigationIndicatorSafeArea:%{public}s "
8609 "resultSafeArea:%{public}s currentArea:%{public}s windowRect:%{public}s", left, top, right, bottom,
8610 systemSafeArea_.ToString().c_str(), cutoutSafeArea_.ToString().c_str(),
8611 navigationIndicatorSafeArea_.ToString().c_str(), resultSafeArea.ToString().c_str(),
8612 currentArea_.ToString().c_str(), windowRect.ToString().c_str());
8613
8614 context->GetTaskExecutor()->PostTask(
8615 [weak = WeakClaim(this), left, top, right, bottom]() {
8616 auto delegate = weak.Upgrade();
8617 if (delegate && delegate->nweb_ && !delegate->window_) {
8618 delegate->nweb_->OnSafeInsetsChange(left, top, right, bottom);
8619 }
8620 },
8621 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSafeInsetsChange");
8622 }
8623
CreateOverlay(void * data,size_t len,int width,int height,int offsetX,int offsetY,int rectWidth,int rectHeight,int pointX,int pointY)8624 void WebDelegate::CreateOverlay(void* data, size_t len, int width, int height, int offsetX, int offsetY, int rectWidth,
8625 int rectHeight, int pointX, int pointY)
8626 {
8627 auto webPattern = webPattern_.Upgrade();
8628 CHECK_NULL_VOID(webPattern);
8629
8630 RefPtr<OHOS::Ace::PixelMap> pixelMap =
8631 PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
8632 uint32_t res = pixelMap->GetPixelMapSharedPtr()->SetMemoryName(
8633 webPattern->GetPixelMapName(pixelMap->GetPixelMapSharedPtr(), "AI"));
8634 TAG_LOGI(AceLogTag::ACE_WEB, "SetMemoryName result is %{public}d", res);
8635
8636 webPattern->CreateOverlay(pixelMap, offsetX, offsetY, rectWidth, rectHeight, pointX, pointY);
8637 }
8638
OnOverlayStateChanged(int offsetX,int offsetY,int rectWidth,int rectHeight)8639 void WebDelegate::OnOverlayStateChanged(int offsetX, int offsetY, int rectWidth, int rectHeight)
8640 {
8641 auto webPattern = webPattern_.Upgrade();
8642 CHECK_NULL_VOID(webPattern);
8643 webPattern->OnOverlayStateChanged(offsetX, offsetY, rectWidth, rectHeight);
8644 }
8645
OnTextSelected()8646 void WebDelegate::OnTextSelected()
8647 {
8648 auto delegate = WeakClaim(this).Upgrade();
8649 CHECK_NULL_VOID(delegate);
8650 if (delegate->nweb_) {
8651 OnContextMenuHide("");
8652 return delegate->nweb_->OnTextSelected();
8653 }
8654 }
8655
OnDestroyImageAnalyzerOverlay()8656 void WebDelegate::OnDestroyImageAnalyzerOverlay()
8657 {
8658 CHECK_NULL_VOID(nweb_);
8659 nweb_->OnDestroyImageAnalyzerOverlay();
8660 }
8661
GetWebInfoType()8662 std::string WebDelegate::GetWebInfoType()
8663 {
8664 std::string factoryLevel = NWebAdapterHelper::Instance()
8665 .ParsePerfConfig("factoryConfig", "factoryLevel");
8666 if (factoryLevel.empty()) {
8667 NWebAdapterHelper::Instance().ReadConfigIfNeeded();
8668 factoryLevel = NWebAdapterHelper::Instance().
8669 ParsePerfConfig("factoryConfig", "factoryLevel");
8670 }
8671 TAG_LOGD(AceLogTag::ACE_WEB, "read config factoryLevel: %{public}s ", factoryLevel.c_str());
8672 return factoryLevel;
8673 }
8674
OnAdsBlocked(const std::string & url,const std::vector<std::string> & adsBlocked)8675 void WebDelegate::OnAdsBlocked(const std::string& url, const std::vector<std::string>& adsBlocked)
8676 {
8677 CHECK_NULL_VOID(taskExecutor_);
8678 taskExecutor_->PostTask(
8679 [weak = WeakClaim(this), url, adsBlocked]() {
8680 auto delegate = weak.Upgrade();
8681 CHECK_NULL_VOID(delegate);
8682 auto onAdsBlockedV2 = delegate->onAdsBlockedV2_;
8683 if (onAdsBlockedV2) {
8684 onAdsBlockedV2(std::make_shared<AdsBlockedEvent>(url, adsBlocked));
8685 }
8686 },
8687 TaskExecutor::TaskType::JS, "ArkUiWebAdsBlocked");
8688 }
8689
SetSurfaceId(const std::string & surfaceId)8690 void WebDelegate::SetSurfaceId(const std::string& surfaceId)
8691 {
8692 auto context = context_.Upgrade();
8693 if (!context) {
8694 return;
8695 }
8696 context->GetTaskExecutor()->PostTask(
8697 [weak = WeakClaim(this), surfaceId]() {
8698 auto delegate = weak.Upgrade();
8699 if (delegate && delegate->nweb_) {
8700 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
8701 CHECK_NULL_VOID(setting);
8702 setting->SetSurfaceId(surfaceId);
8703 }
8704 },
8705 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetSurfaceId");
8706 }
8707
SpanstringConvertHtml(const std::vector<uint8_t> & content)8708 std::string WebDelegate::SpanstringConvertHtml(const std::vector<uint8_t> &content)
8709 {
8710 std::vector<uint8_t> tempVec(content.begin(), content.end());
8711 std::string htmlStr = OHOS::Ace::SpanToHtml::ToHtml(tempVec);
8712 TAG_LOGD(AceLogTag::ACE_WEB, "pasteboard spasntring convert html success,"
8713 " string length = %{public}u", static_cast<int32_t>(htmlStr.length()));
8714 return htmlStr;
8715 }
8716
StartVibraFeedback(const std::string & vibratorType)8717 void WebDelegate::StartVibraFeedback(const std::string& vibratorType)
8718 {
8719 auto webPattern = webPattern_.Upgrade();
8720 CHECK_NULL_VOID(webPattern);
8721 webPattern->StartVibraFeedback(vibratorType);
8722 }
8723
CloseImageOverlaySelection()8724 bool WebDelegate::CloseImageOverlaySelection()
8725 {
8726 auto webPattern = webPattern_.Upgrade();
8727 CHECK_NULL_RETURN(webPattern, false);
8728 return webPattern->CloseImageOverlaySelection();
8729 }
8730
GetAccessibilityVisible(int64_t accessibilityId)8731 bool WebDelegate::GetAccessibilityVisible(int64_t accessibilityId)
8732 {
8733 CHECK_NULL_RETURN(nweb_, true);
8734 return nweb_->GetAccessibilityVisible(accessibilityId);
8735 }
8736
SetTransformHint(uint32_t rotation)8737 void WebDelegate::SetTransformHint(uint32_t rotation)
8738 {
8739 ACE_DCHECK(nweb_ != nullptr);
8740 if (nweb_) {
8741 nweb_->SetTransformHint(rotation);
8742 }
8743 }
8744
ScaleGestureChangeV2(int type,double scale,double originScale,double centerX,double centerY)8745 void WebDelegate::ScaleGestureChangeV2(int type, double scale, double originScale, double centerX, double centerY)
8746 {
8747 #ifdef OHOS_STANDARD_SYSTEM
8748 ACE_DCHECK(nweb_ != nullptr);
8749 if (nweb_) {
8750 nweb_->ScaleGestureChangeV2(type, scale, originScale, centerX, centerY);
8751 }
8752 #endif
8753 }
8754
UpdateOptimizeParserBudgetEnabled(const bool enable)8755 void WebDelegate::UpdateOptimizeParserBudgetEnabled(const bool enable)
8756 {
8757 auto context = context_.Upgrade();
8758 if (!context) {
8759 return;
8760 }
8761 context->GetTaskExecutor()->PostTask(
8762 [weak = WeakClaim(this), enable]() {
8763 auto delegate = weak.Upgrade();
8764 if (delegate && delegate->nweb_) {
8765 delegate->nweb_->PutOptimizeParserBudgetEnabled(enable);
8766 }
8767 },
8768 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateOptimizeParserBudget");
8769 }
8770
UpdateWebMediaAVSessionEnabled(bool isEnabled)8771 void WebDelegate::UpdateWebMediaAVSessionEnabled(bool isEnabled)
8772 {
8773 auto context = context_.Upgrade();
8774 if (!context) {
8775 return;
8776 }
8777 context->GetTaskExecutor()->PostTask(
8778 [weak = WeakClaim(this), isEnabled]() {
8779 auto delegate = weak.Upgrade();
8780 if (delegate && delegate->nweb_) {
8781 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
8782 if (setting) {
8783 setting->PutWebMediaAVSessionEnabled(isEnabled);
8784 }
8785 }
8786 },
8787 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebMediaAVSessionEnabled");
8788 }
8789
GetCurrentLanguage()8790 std::string WebDelegate::GetCurrentLanguage()
8791 {
8792 if (nweb_) {
8793 return nweb_->GetCurrentLanguage();
8794 }
8795 return "";
8796 }
8797
MaximizeResize()8798 void WebDelegate::MaximizeResize()
8799 {
8800 ACE_DCHECK(nweb_ != nullptr);
8801 if (nweb_) {
8802 nweb_->MaximizeResize();
8803 }
8804 }
8805
SetNativeInnerWeb(bool isInnerWeb)8806 void WebDelegate::SetNativeInnerWeb(bool isInnerWeb)
8807 {
8808 ACE_DCHECK(nweb_ != nullptr);
8809 if (nweb_) {
8810 nweb_->SetNativeInnerWeb(isInnerWeb);
8811 }
8812 }
8813
ResetStateOfDataDetectorJS()8814 void WebDelegate::ResetStateOfDataDetectorJS()
8815 {
8816 initDataDetectorJS_ = false;
8817 }
8818
RunDataDetectorJS()8819 void WebDelegate::RunDataDetectorJS()
8820 {
8821 auto webPattern = webPattern_.Upgrade();
8822 CHECK_NULL_VOID(webPattern);
8823 if (!webPattern->GetDataDetectorEnable()) {
8824 return;
8825 }
8826 if (initDataDetectorJS_) {
8827 return;
8828 }
8829 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::RunDataDetectorJS");
8830 auto context = context_.Upgrade();
8831 CHECK_NULL_VOID(context);
8832 context->GetTaskExecutor()->PostTask(
8833 [weak = WeakClaim(this)]() {
8834 auto delegate = weak.Upgrade();
8835 CHECK_NULL_VOID(delegate);
8836 CHECK_NULL_VOID(delegate->nweb_);
8837 delegate->nweb_->RunDataDetectorJS();
8838 },
8839 TaskExecutor::TaskType::PLATFORM, "RunDataDetectorJS");
8840 initDataDetectorJS_ = true;
8841 }
8842
SetDataDetectorEnable(bool enable)8843 void WebDelegate::SetDataDetectorEnable(bool enable)
8844 {
8845 TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::SetDataDetectorEnable enable: %{public}d", enable);
8846 if (nweb_) {
8847 nweb_->SetDataDetectorEnable(enable);
8848 }
8849 }
8850
OnDataDetectorSelectText()8851 void WebDelegate::OnDataDetectorSelectText()
8852 {
8853 TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::OnDataDetectorSelectText");
8854 if (nweb_) {
8855 nweb_->OnDataDetectorSelectText();
8856 }
8857 }
8858
OnDataDetectorCopy(const std::vector<std::string> & recordMix)8859 void WebDelegate::OnDataDetectorCopy(const std::vector<std::string>& recordMix)
8860 {
8861 TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::OnDataDetectorCopy");
8862 if (nweb_) {
8863 nweb_->OnDataDetectorCopy(recordMix);
8864 }
8865 }
8866
RestoreRenderFit()8867 void WebDelegate::RestoreRenderFit()
8868 {
8869 auto webPattern = webPattern_.Upgrade();
8870 CHECK_NULL_VOID(webPattern);
8871 webPattern->RestoreRenderFit();
8872 }
8873
OnNestedScroll(float & x,float & y,float & xVelocity,float & yVelocity,bool & isAvailable)8874 bool WebDelegate::OnNestedScroll(float& x, float& y, float& xVelocity, float& yVelocity, bool& isAvailable)
8875 {
8876 auto webPattern = webPattern_.Upgrade();
8877 CHECK_NULL_RETURN(webPattern, false);
8878 return webPattern->OnNestedScroll(x, y, xVelocity, yVelocity, isAvailable);
8879 }
8880
IsNWebEx()8881 bool WebDelegate::IsNWebEx()
8882 {
8883 if (!nweb_) {
8884 return false;
8885 }
8886 return nweb_->IsNWebEx();
8887 }
8888
OnPip(int status,int delegate_id,int child_id,int frame_routing_id,int width,int height)8889 void WebDelegate::OnPip(
8890 int status, int delegate_id, int child_id, int frame_routing_id, int width, int height)
8891 {
8892 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnPip");
8893 auto context = context_.Upgrade();
8894 CHECK_NULL_VOID(context);
8895 context->GetTaskExecutor()->PostTask(
8896 [weak = WeakClaim(this), status, delegate_id, child_id, frame_routing_id, width, height]() {
8897 auto delegate = weak.Upgrade();
8898 CHECK_NULL_VOID(delegate);
8899 auto webPattern = delegate->webPattern_.Upgrade();
8900 CHECK_NULL_VOID(webPattern);
8901 webPattern->OnPip(status, delegate_id, child_id, frame_routing_id, width, height);
8902 },
8903 TaskExecutor::TaskType::UI, "ArkUIWebOnPip");
8904 }
8905
SetPipNativeWindow(int delegate_id,int child_id,int frame_routing_id,void * window)8906 void WebDelegate::SetPipNativeWindow(int delegate_id, int child_id, int frame_routing_id, void* window)
8907 {
8908 if (!window) {
8909 TAG_LOGI(AceLogTag::ACE_WEB, "SetPipNativeWindow null");
8910 return;
8911 }
8912 auto context = context_.Upgrade();
8913 CHECK_NULL_VOID(context);
8914 context->GetTaskExecutor()->PostTask(
8915 [weak = WeakClaim(this), delegate_id, child_id, frame_routing_id, window]() {
8916 auto delegate = weak.Upgrade();
8917 CHECK_NULL_VOID(delegate);
8918 CHECK_NULL_VOID(delegate->nweb_);
8919 TAG_LOGI(AceLogTag::ACE_WEB, "setPipNativeWindow setting");
8920 delegate->nweb_->SetPipNativeWindow(delegate_id, child_id, frame_routing_id, window);
8921 },
8922 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetPipNativeWindow");
8923 }
8924
SendPipEvent(int delegate_id,int child_id,int frame_routing_id,int event)8925 void WebDelegate::SendPipEvent(int delegate_id, int child_id, int frame_routing_id, int event)
8926 {
8927 auto context = context_.Upgrade();
8928 CHECK_NULL_VOID(context);
8929 context->GetTaskExecutor()->PostTask(
8930 [weak = WeakClaim(this), delegate_id, child_id, frame_routing_id, event]() {
8931 auto delegate = weak.Upgrade();
8932 CHECK_NULL_VOID(delegate);
8933 CHECK_NULL_VOID(delegate->nweb_);
8934 TAG_LOGI(AceLogTag::ACE_WEB, "sendPipEvent setting");
8935 delegate->nweb_->SendPipEvent(delegate_id, child_id, frame_routing_id, event);
8936 },
8937 TaskExecutor::TaskType::PLATFORM, "ArkUIWebSendPipEvent");
8938 }
8939
UpdateBypassVsyncCondition(const WebBypassVsyncCondition & condition)8940 void WebDelegate::UpdateBypassVsyncCondition(const WebBypassVsyncCondition& condition)
8941 {
8942 auto context = context_.Upgrade();
8943 if (!context) {
8944 return;
8945 }
8946 CHECK_NULL_VOID(context);
8947 context->GetTaskExecutor()->PostTask(
8948 [weak = WeakClaim(this), condition]() {
8949 auto delegate = weak.Upgrade();
8950 if (delegate && delegate->nweb_) {
8951 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
8952 if (setting) {
8953 TAG_LOGI(AceLogTag::ACE_WEB,
8954 "WebDelegate::UpdateBypassVsyncCondition condition:%{public}d", condition);
8955 setting->SetBypassVsyncCondition(static_cast<int32_t>(condition));
8956 }
8957 }
8958 },
8959 TaskExecutor::TaskType::PLATFORM, "ArkUIWebBypassVsyncCondition");
8960 }
8961
UpdateGestureFocusMode(const GestureFocusMode & mode)8962 void WebDelegate::UpdateGestureFocusMode(const GestureFocusMode& mode)
8963 {
8964 auto context = context_.Upgrade();
8965 CHECK_NULL_VOID(context);
8966 context->GetTaskExecutor()->PostTask(
8967 [weak = WeakClaim(this), mode]() {
8968 auto delegate = weak.Upgrade();
8969 if (delegate && delegate->nweb_) {
8970 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
8971 if (setting) {
8972 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::UpdateGestureFocusMode mode:%{public}d", mode);
8973 setting->SetGestureFocusMode(static_cast<int32_t>(mode));
8974 }
8975 }
8976 },
8977 TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateGestureFocusMode");
8978 }
8979
UpdateSingleHandleVisible(bool isVisible)8980 void WebDelegate::UpdateSingleHandleVisible(bool isVisible)
8981 {
8982 CHECK_NULL_VOID(nweb_);
8983 nweb_->UpdateSingleHandleVisible(isVisible);
8984 }
8985
ShowMagnifier()8986 bool WebDelegate::ShowMagnifier()
8987 {
8988 auto webPattern = webPattern_.Upgrade();
8989 CHECK_NULL_RETURN(webPattern, false);
8990 webPattern->OnShowMagnifier();
8991 return true;
8992 }
8993
HideMagnifier()8994 bool WebDelegate::HideMagnifier()
8995 {
8996 auto webPattern = webPattern_.Upgrade();
8997 CHECK_NULL_RETURN(webPattern, false);
8998 webPattern->OnHideMagnifier();
8999 return true;
9000 }
9001
SetTouchHandleExistState(bool touchHandleExist)9002 void WebDelegate::SetTouchHandleExistState(bool touchHandleExist)
9003 {
9004 CHECK_NULL_VOID(nweb_);
9005 nweb_->SetTouchHandleExistState(touchHandleExist);
9006 }
9007
SetBorderRadiusFromWeb(double borderRadiusTopLeft,double borderRadiusTopRight,double borderRadiusBottomLeft,double borderRadiusBottomRight)9008 void WebDelegate::SetBorderRadiusFromWeb(double borderRadiusTopLeft, double borderRadiusTopRight,
9009 double borderRadiusBottomLeft, double borderRadiusBottomRight)
9010 {
9011 CHECK_NULL_VOID(nweb_);
9012 nweb_->SetBorderRadiusFromWeb(
9013 borderRadiusTopLeft, borderRadiusTopRight, borderRadiusBottomLeft, borderRadiusBottomRight);
9014 }
9015
SetViewportScaleState()9016 void WebDelegate::SetViewportScaleState()
9017 {
9018 CHECK_NULL_VOID(nweb_);
9019 nweb_->SetViewportScaleState();
9020 }
9021
OnPdfScrollAtBottom(const std::string & url)9022 void WebDelegate::OnPdfScrollAtBottom(const std::string& url)
9023 {
9024 CHECK_NULL_VOID(taskExecutor_);
9025 taskExecutor_->PostTask(
9026 [weak = WeakClaim(this), url]() {
9027 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnPdfScrollAtBottom, fire event task");
9028 auto delegate = weak.Upgrade();
9029 CHECK_NULL_VOID(delegate);
9030 auto webPattern = delegate->webPattern_.Upgrade();
9031 CHECK_NULL_VOID(webPattern);
9032 auto webEventHub = webPattern->GetWebEventHub();
9033 CHECK_NULL_VOID(webEventHub);
9034 webEventHub->FireOnPdfScrollAtBottomEvent(std::make_shared<PdfScrollEvent>(url));
9035 },
9036 TaskExecutor::TaskType::JS, "ArkUIWebPdfScrollAtBottom");
9037 }
9038
OnPdfLoadEvent(int32_t result,const std::string & url)9039 void WebDelegate::OnPdfLoadEvent(int32_t result, const std::string& url)
9040 {
9041 CHECK_NULL_VOID(taskExecutor_);
9042 taskExecutor_->PostTask(
9043 [weak = WeakClaim(this), result, url]() {
9044 TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnPdfLoadEvent, fire event task");
9045 auto delegate = weak.Upgrade();
9046 CHECK_NULL_VOID(delegate);
9047 auto webPattern = delegate->webPattern_.Upgrade();
9048 CHECK_NULL_VOID(webPattern);
9049 auto webEventHub = webPattern->GetWebEventHub();
9050 CHECK_NULL_VOID(webEventHub);
9051 webEventHub->FireOnPdfLoadEvent(std::make_shared<PdfLoadEvent>(result, url));
9052 },
9053 TaskExecutor::TaskType::JS, "ArkUIWebPdfLoadEvent");
9054 }
9055
9056 } // namespace OHOS::Ace
9057