• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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