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 <algorithm>
19 #include <cctype>
20 #include <cfloat>
21 #include <iomanip>
22 #include <optional>
23 #include <sstream>
24 
25 #include "adapter/ohos/entrance/ace_container.h"
26 #include "adapter/ohos/entrance/utils.h"
27 #include "base/json/json_util.h"
28 #include "base/log/ace_trace.h"
29 #include "base/log/log.h"
30 #include "base/memory/referenced.h"
31 #include "base/notification/eventhandler/interfaces/inner_api/event_handler.h"
32 #include "base/ressched/ressched_report.h"
33 #include "base/utils/utils.h"
34 #include "core/accessibility/accessibility_manager.h"
35 #include "core/components/container_modal/container_modal_constants.h"
36 #include "core/components/web/render_web.h"
37 #include "core/components/web/web_event.h"
38 #include "core/components/web/web_property.h"
39 #include "core/components_ng/pattern/web/web_pattern.h"
40 #include "core/pipeline_ng/pipeline_context.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 "core/common/ace_application_info.h"
46 #include "core/event/ace_event_helper.h"
47 #include "core/event/ace_events.h"
48 #include "core/event/back_end_event_manager.h"
49 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h"
50 #ifdef OHOS_STANDARD_SYSTEM
51 #include "application_env.h"
52 #include "iservice_registry.h"
53 #include "nweb_adapter_helper.h"
54 #include "nweb_handler.h"
55 #include "parameters.h"
56 #include "screen_manager/screen_types.h"
57 #include "system_ability_definition.h"
58 #include "third_party/icu/icu4c/source/common/unicode/ucnv.h"
59 #include "transaction/rs_interfaces.h"
60 #include "web_configuration_observer.h"
61 #include "web_javascript_execute_callback.h"
62 #include "web_javascript_result_callback.h"
63 
64 #include "core/components_ng/base/ui_node.h"
65 #include "frameworks/base/utils/system_properties.h"
66 #endif
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 
82 constexpr char WEB_CREATE[] = "web";
83 constexpr char NTC_PARAM_WEB[] = "web";
84 constexpr char NTC_PARAM_WIDTH[] = "width";
85 constexpr char NTC_PARAM_HEIGHT[] = "height";
86 constexpr char NTC_PARAM_LEFT[] = "left";
87 constexpr char NTC_PARAM_TOP[] = "top";
88 constexpr char NTC_ERROR[] = "create error";
89 constexpr char NTC_PARAM_SRC[] = "src";
90 constexpr char NTC_PARAM_ERROR_CODE[] = "errorCode";
91 constexpr char NTC_PARAM_URL[] = "url";
92 constexpr char NTC_PARAM_PAGE_URL[] = "pageUrl";
93 constexpr char NTC_PARAM_PAGE_INVALID[] = "pageInvalid";
94 constexpr char NTC_PARAM_DESCRIPTION[] = "description";
95 constexpr char WEB_ERROR_CODE_CREATEFAIL[] = "error-web-delegate-000001";
96 constexpr char WEB_ERROR_MSG_CREATEFAIL[] = "create web_delegate failed.";
97 
98 const std::string RESOURCE_VIDEO_CAPTURE = "TYPE_VIDEO_CAPTURE";
99 const std::string RESOURCE_AUDIO_CAPTURE = "TYPE_AUDIO_CAPTURE";
100 const std::string RESOURCE_PROTECTED_MEDIA_ID = "TYPE_PROTECTED_MEDIA_ID";
101 const std::string RESOURCE_MIDI_SYSEX = "TYPE_MIDI_SYSEX";
102 const std::string RESOURCE_CLIPBOARD_READ_WRITE = "TYPE_CLIPBOARD_READ_WRITE";
103 const std::string RESOURCE_SENSOR = "TYPE_SENSOR";
104 const std::string DEFAULT_CANONICAL_ENCODING_NAME = "UTF-8";
105 constexpr uint32_t DESTRUCT_DELAY_MILLISECONDS = 1000;
106 
107 constexpr uint32_t DRAG_DELAY_MILLISECONDS = 300;
108 constexpr uint32_t DELAY_MILLISECONDS_1000 = 1000;
109 constexpr uint32_t NO_NATIVE_FINGER_TYPE = 100;
110 const std::string DEFAULT_NATIVE_EMBED_ID = "0";
111 
112 const std::vector<std::string> CANONICALENCODINGNAMES = {
113     "Big5",         "EUC-JP",       "EUC-KR",       "GB18030",
114     "GBK",          "IBM866",       "ISO-2022-JP",  "ISO-8859-10",
115     "ISO-8859-13",  "ISO-8859-14",  "ISO-8859-15",  "ISO-8859-16",
116     "ISO-8859-1",   "ISO-8859-2",   "ISO-8859-3",   "ISO-8859-4",
117     "ISO-8859-5",   "ISO-8859-6",   "ISO-8859-7",   "ISO-8859-8",
118     "ISO-8859-8-I", "KOI8-R",       "KOI8-U",       "macintosh",
119     "Shift_JIS",    "UTF-8",        "windows-1250", "windows-1251",
120     "windows-1252", "windows-1253", "windows-1254", "windows-1255",
121     "windows-1256", "windows-1257", "windows-1258", "windows-874" };
122 
123 #define VISIBLERATIO_LENGTH 4
124 #define VISIBLERATIO_FLOAT_TO_INT 100
125 
IsDeviceTabletOr2in1()126 static bool IsDeviceTabletOr2in1()
127 {
128     return OHOS::system::GetDeviceType() == "tablet" || OHOS::system::GetDeviceType() == "2in1";
129 }
130 
GetWebOptimizationValue()131 static bool GetWebOptimizationValue()
132 {
133     return OHOS::system::GetBoolParameter("web.optimization", true);
134 }
135 } // namespace
136 
137 #define EGLCONFIG_VERSION 3
138 
SetPortHandle(std::string & handle)139 void WebMessagePortOhos::SetPortHandle(std::string& handle)
140 {
141     handle_ = handle;
142 }
143 
GetPortHandle()144 std::string WebMessagePortOhos::GetPortHandle()
145 {
146     return handle_;
147 }
148 
Close()149 void WebMessagePortOhos::Close()
150 {
151     auto delegate = webDelegate_.Upgrade();
152     if (!delegate) {
153         return;
154     }
155     delegate->ClosePort(handle_);
156 }
157 
PostMessage(std::string & data)158 void WebMessagePortOhos::PostMessage(std::string& data)
159 {
160     auto delegate = webDelegate_.Upgrade();
161     if (!delegate) {
162         return;
163     }
164     delegate->PostPortMessage(handle_, data);
165 }
166 
SetWebMessageCallback(std::function<void (const std::string &)> && callback)167 void WebMessagePortOhos::SetWebMessageCallback(std::function<void(const std::string&)>&& callback)
168 {
169     auto delegate = webDelegate_.Upgrade();
170     if (!delegate) {
171         return;
172     }
173     delegate->SetPortMessageCallback(handle_, std::move(callback));
174 }
175 
GetLineNumber()176 int ConsoleLogOhos::GetLineNumber()
177 {
178     if (message_) {
179         return message_->LineNumer();
180     }
181     return -1;
182 }
183 
GetLog()184 std::string ConsoleLogOhos::GetLog()
185 {
186     if (message_) {
187         return message_->Log();
188     }
189     return "";
190 }
191 
GetLogLevel()192 int ConsoleLogOhos::GetLogLevel()
193 {
194     if (message_) {
195         return message_->LogLevel();
196     }
197     return -1;
198 }
199 
GetSourceId()200 std::string ConsoleLogOhos::GetSourceId()
201 {
202     if (message_) {
203         return message_->SourceId();
204     }
205     return "";
206 }
207 
Confirm()208 void ResultOhos::Confirm()
209 {
210     if (result_) {
211         result_->Confirm();
212     }
213 }
214 
Confirm(const std::string & message)215 void ResultOhos::Confirm(const std::string& message)
216 {
217     if (result_) {
218         result_->Confirm(message);
219     }
220 }
221 
Cancel()222 void ResultOhos::Cancel()
223 {
224     if (result_) {
225         result_->Cancel();
226     }
227 }
228 
ExitFullScreen()229 void FullScreenExitHandlerOhos::ExitFullScreen()
230 {
231     auto delegate = webDelegate_.Upgrade();
232     CHECK_NULL_VOID(delegate);
233     CHECK_NULL_VOID(handler_);
234     if (Container::IsCurrentUseNewPipeline()) {
235         // notify chromium to exit fullscreen mode.
236         handler_->ExitFullScreen();
237         // notify web component in arkui to exit fullscreen mode.
238         delegate->ExitFullScreen();
239     }
240 }
241 
Confirm(std::string & userName,std::string & pwd)242 bool AuthResultOhos::Confirm(std::string& userName, std::string& pwd)
243 {
244     if (result_) {
245         return result_->Confirm(userName, pwd);
246     }
247     return false;
248 }
249 
IsHttpAuthInfoSaved()250 bool AuthResultOhos::IsHttpAuthInfoSaved()
251 {
252     if (result_) {
253         return result_->IsHttpAuthInfoSaved();
254     }
255     return false;
256 }
257 
Cancel()258 void AuthResultOhos::Cancel()
259 {
260     if (result_) {
261         result_->Cancel();
262     }
263 }
264 
HandleConfirm()265 void SslErrorResultOhos::HandleConfirm()
266 {
267     if (result_) {
268         result_->HandleConfirm();
269     }
270 }
271 
HandleCancel()272 void SslErrorResultOhos::HandleCancel()
273 {
274     if (result_) {
275         result_->HandleCancel();
276     }
277 }
278 
HandleConfirm()279 void AllSslErrorResultOhos::HandleConfirm()
280 {
281     if (result_) {
282         result_->HandleConfirm();
283     }
284 }
285 
HandleCancel()286 void AllSslErrorResultOhos::HandleCancel()
287 {
288     if (result_) {
289         result_->HandleCancel();
290     }
291 }
292 
HandleConfirm(const std::string & privateKeyFile,const std::string & certChainFile)293 void SslSelectCertResultOhos::HandleConfirm(const std::string& privateKeyFile, const std::string& certChainFile)
294 {
295     if (result_) {
296         result_->Confirm(privateKeyFile, certChainFile);
297     }
298 }
299 
HandleCancel()300 void SslSelectCertResultOhos::HandleCancel()
301 {
302     if (result_) {
303         result_->Cancel();
304     }
305 }
306 
HandleIgnore()307 void SslSelectCertResultOhos::HandleIgnore()
308 {
309     if (result_) {
310         result_->Ignore();
311     }
312 }
313 
GetTitle()314 std::string FileSelectorParamOhos::GetTitle()
315 {
316     if (param_) {
317         return param_->Title();
318     }
319     return "";
320 }
321 
GetMode()322 int FileSelectorParamOhos::GetMode()
323 {
324     if (param_) {
325         return param_->Mode();
326     }
327     return 0;
328 }
329 
GetDefaultFileName()330 std::string FileSelectorParamOhos::GetDefaultFileName()
331 {
332     if (param_) {
333         return param_->DefaultFilename();
334     }
335     return "";
336 }
337 
GetAcceptType()338 std::vector<std::string> FileSelectorParamOhos::GetAcceptType()
339 {
340     if (param_) {
341         return param_->AcceptType();
342     }
343     return std::vector<std::string>();
344 }
345 
IsCapture()346 bool FileSelectorParamOhos::IsCapture()
347 {
348     if (param_) {
349         return param_->IsCapture();
350     }
351     return false;
352 }
353 
HandleFileList(std::vector<std::string> & result)354 void FileSelectorResultOhos::HandleFileList(std::vector<std::string>& result)
355 {
356     if (callback_) {
357         callback_->OnReceiveValue(result);
358     }
359 }
360 
Deny() const361 void WebPermissionRequestOhos::Deny() const
362 {
363     if (request_) {
364         request_->Refuse();
365     }
366 }
367 
GetOrigin() const368 std::string WebPermissionRequestOhos::GetOrigin() const
369 {
370     if (request_) {
371         return request_->Origin();
372     }
373     return "";
374 }
375 
GetResources() const376 std::vector<std::string> WebPermissionRequestOhos::GetResources() const
377 {
378     std::vector<std::string> resources;
379     if (request_) {
380         uint32_t resourcesId = static_cast<uint32_t>(request_->ResourceAcessId());
381         if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::VIDEO_CAPTURE) {
382             resources.push_back(RESOURCE_VIDEO_CAPTURE);
383         }
384         if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::AUDIO_CAPTURE) {
385             resources.push_back(RESOURCE_AUDIO_CAPTURE);
386         }
387         if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::PROTECTED_MEDIA_ID) {
388             resources.push_back(RESOURCE_PROTECTED_MEDIA_ID);
389         }
390         if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::MIDI_SYSEX) {
391             resources.push_back(RESOURCE_MIDI_SYSEX);
392         }
393         if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::CLIPBOARD_READ_WRITE) {
394             resources.push_back(RESOURCE_CLIPBOARD_READ_WRITE);
395         }
396         if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::SENSORS) {
397             resources.push_back(RESOURCE_SENSOR);
398         }
399     }
400     return resources;
401 }
402 
Grant(std::vector<std::string> & resources) const403 void WebPermissionRequestOhos::Grant(std::vector<std::string>& resources) const
404 {
405     if (request_) {
406         uint32_t resourcesId = 0;
407         for (auto res : resources) {
408             if (res == RESOURCE_VIDEO_CAPTURE) {
409                 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::VIDEO_CAPTURE;
410             } else if (res == RESOURCE_AUDIO_CAPTURE) {
411                 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::AUDIO_CAPTURE;
412             } else if (res == RESOURCE_PROTECTED_MEDIA_ID) {
413                 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::PROTECTED_MEDIA_ID;
414             } else if (res == RESOURCE_MIDI_SYSEX) {
415                 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::MIDI_SYSEX;
416             } else if (res == RESOURCE_CLIPBOARD_READ_WRITE) {
417                 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::CLIPBOARD_READ_WRITE;
418             } else if (res == RESOURCE_SENSOR) {
419                 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::SENSORS;
420             }
421         }
422         request_->Agree(resourcesId);
423     }
424 }
425 
Deny() const426 void WebScreenCaptureRequestOhos::Deny() const
427 {
428     if (request_) {
429         request_->Refuse();
430     }
431 }
432 
GetOrigin() const433 std::string WebScreenCaptureRequestOhos::GetOrigin() const
434 {
435     if (request_) {
436         return request_->Origin();
437     }
438     return "";
439 }
440 
SetCaptureMode(int32_t mode)441 void WebScreenCaptureRequestOhos::SetCaptureMode(int32_t mode)
442 {
443     config_->SetMode(mode);
444 }
445 
SetSourceId(int32_t sourceId)446 void WebScreenCaptureRequestOhos::SetSourceId(int32_t sourceId)
447 {
448     config_->SetSourceId(sourceId);
449 }
450 
Grant() const451 void WebScreenCaptureRequestOhos::Grant() const
452 {
453     if (request_) {
454         request_->Agree(config_);
455     }
456 }
457 
GetXCoord() const458 int32_t ContextMenuParamOhos::GetXCoord() const
459 {
460     if (param_) {
461         return param_->GetXCoord();
462     }
463     return -1;
464 }
465 
GetYCoord() const466 int32_t ContextMenuParamOhos::GetYCoord() const
467 {
468     if (param_) {
469         return param_->GetYCoord();
470     }
471     return -1;
472 }
473 
GetLinkUrl() const474 std::string ContextMenuParamOhos::GetLinkUrl() const
475 {
476     if (param_) {
477         return param_->GetLinkUrl();
478     }
479     return "";
480 }
481 
GetUnfilteredLinkUrl() const482 std::string ContextMenuParamOhos::GetUnfilteredLinkUrl() const
483 {
484     if (param_) {
485         return param_->GetUnfilteredLinkUrl();
486     }
487     return "";
488 }
489 
GetSourceUrl() const490 std::string ContextMenuParamOhos::GetSourceUrl() const
491 {
492     if (param_) {
493         return param_->GetSourceUrl();
494     }
495     return "";
496 }
497 
HasImageContents() const498 bool ContextMenuParamOhos::HasImageContents() const
499 {
500     if (param_) {
501         return param_->HasImageContents();
502     }
503     return false;
504 }
505 
IsEditable() const506 bool ContextMenuParamOhos::IsEditable() const
507 {
508     if (param_) {
509         return param_->IsEditable();
510     }
511     return false;
512 }
513 
GetEditStateFlags() const514 int ContextMenuParamOhos::GetEditStateFlags() const
515 {
516     if (param_) {
517         return param_->GetEditStateFlags();
518     }
519     return OHOS::NWeb::NWebContextMenuParams::ContextMenuEditStateFlags::CM_ES_NONE;
520 }
521 
GetSourceType() const522 int ContextMenuParamOhos::GetSourceType() const
523 {
524     if (param_) {
525         return param_->GetSourceType();
526     }
527     return OHOS::NWeb::NWebContextMenuParams::ContextMenuSourceType::CM_ST_NONE;
528 }
529 
GetMediaType() const530 int ContextMenuParamOhos::GetMediaType() const
531 {
532     if (param_) {
533         return param_->GetMediaType();
534     }
535     return OHOS::NWeb::NWebContextMenuParams::ContextMenuMediaType::CM_MT_NONE;
536 }
537 
GetInputFieldType() const538 int ContextMenuParamOhos::GetInputFieldType() const
539 {
540     if (param_) {
541         return param_->GetInputFieldType();
542     }
543     return OHOS::NWeb::NWebContextMenuParams::ContextMenuInputFieldType::CM_IT_NONE;
544 }
545 
GetSelectionText() const546 std::string ContextMenuParamOhos::GetSelectionText() const
547 {
548     if (param_) {
549         return param_->GetSelectionText();
550     }
551     return "";
552 }
553 
GetImageRect(int32_t & x,int32_t & y,int32_t & width,int32_t & height) const554 void ContextMenuParamOhos::GetImageRect(int32_t& x, int32_t& y, int32_t& width, int32_t& height) const
555 {
556     if (param_) {
557         param_->GetImageRect(x, y, width, height);
558     }
559 }
560 
Cancel() const561 void ContextMenuResultOhos::Cancel() const
562 {
563     if (callback_) {
564         callback_->Cancel();
565     }
566 }
567 
CopyImage() const568 void ContextMenuResultOhos::CopyImage() const
569 {
570     if (callback_) {
571         callback_->Continue(CI_IMAGE_COPY, EF_NONE);
572     }
573 }
574 
Copy() const575 void ContextMenuResultOhos::Copy() const
576 {
577     if (callback_) {
578         callback_->Continue(CI_COPY, EF_NONE);
579     }
580 }
581 
Paste() const582 void ContextMenuResultOhos::Paste() const
583 {
584     if (callback_) {
585         callback_->Continue(CI_PASTE, EF_NONE);
586     }
587 }
588 
Cut() const589 void ContextMenuResultOhos::Cut() const
590 {
591     if (callback_) {
592         callback_->Continue(CI_CUT, EF_NONE);
593     }
594 }
595 
SelectAll() const596 void ContextMenuResultOhos::SelectAll() const
597 {
598     if (callback_) {
599         callback_->Continue(CI_SELECT_ALL, EF_NONE);
600     }
601 }
602 
SetWebController(int32_t id)603 void WebWindowNewHandlerOhos::SetWebController(int32_t id)
604 {
605     if (handler_) {
606         handler_->SetNWebHandlerById(id);
607     }
608 }
609 
IsFrist() const610 bool WebWindowNewHandlerOhos::IsFrist() const
611 {
612     if (handler_) {
613         return handler_->IsFrist();
614     }
615     return true;
616 }
617 
GetId() const618 int32_t WebWindowNewHandlerOhos::GetId() const
619 {
620     if (handler_) {
621         return handler_->GetId();
622     }
623     return -1;
624 }
625 
GetParentNWebId() const626 int32_t WebWindowNewHandlerOhos::GetParentNWebId() const
627 {
628     return parentNWebId_;
629 }
630 
Resend()631 void DataResubmittedOhos::Resend()
632 {
633     if (handler_) {
634         handler_->Resend();
635     }
636 }
637 
Cancel()638 void DataResubmittedOhos::Cancel()
639 {
640     if (handler_) {
641         handler_->Cancel();
642     }
643 }
644 
GetData()645 const void* FaviconReceivedOhos::GetData()
646 {
647     return data_;
648 }
649 
GetWidth()650 size_t FaviconReceivedOhos::GetWidth()
651 {
652     return width_;
653 }
654 
GetHeight()655 size_t FaviconReceivedOhos::GetHeight()
656 {
657     return height_;
658 }
659 
GetColorType()660 int FaviconReceivedOhos::GetColorType()
661 {
662     return static_cast<int>(colorType_);
663 }
664 
GetAlphaType()665 int FaviconReceivedOhos::GetAlphaType()
666 {
667     return static_cast<int>(alphaType_);
668 }
669 
NWebScreenLockCallbackImpl(const WeakPtr<PipelineBase> & context)670 NWebScreenLockCallbackImpl::NWebScreenLockCallbackImpl(const WeakPtr<PipelineBase>& context) : context_(context) {}
671 
Handle(bool key)672 void NWebScreenLockCallbackImpl::Handle(bool key)
673 {
674     TAG_LOGI(AceLogTag::ACE_WEB, "SetKeepScreenOn %{public}d", key);
675     auto weakContext = context_.Upgrade();
676     CHECK_NULL_VOID(weakContext);
677     auto window = weakContext->GetWindow();
678     CHECK_NULL_VOID(window);
679     window->SetKeepScreenOn(key);
680 }
681 
~WebDelegateObserver()682 WebDelegateObserver::~WebDelegateObserver() {}
683 
NotifyDestory()684 void WebDelegateObserver::NotifyDestory()
685 {
686     TAG_LOGI(AceLogTag::ACE_WEB, "NotifyDestory start");
687     if (delegate_) {
688         delegate_->UnRegisterScreenLockFunction();
689     }
690     auto context = context_.Upgrade();
691     if (!context) {
692         TAG_LOGD(AceLogTag::ACE_WEB, "NotifyDestory context is null, use EventHandler to destory");
693         auto currentHandler = OHOS::AppExecFwk::EventHandler::Current();
694         if (!currentHandler) {
695             TAG_LOGE(AceLogTag::ACE_WEB, "NWEB webdelegateObserver EventHandler currentHandler is null");
696             return;
697         }
698         currentHandler->PostTask(
699             [weak = WeakClaim(this), currentHandler = currentHandler]() {
700                 auto observer = weak.Upgrade();
701                 if (!observer) {
702                     TAG_LOGE(AceLogTag::ACE_WEB, "NotifyDestory EventHandler observer is null");
703                     return;
704                 }
705                 if (observer->delegate_) {
706                     TAG_LOGD(AceLogTag::ACE_WEB, "NotifyDestory EventHandler destorying delegate");
707                     observer->delegate_.Reset();
708                 }
709             },
710             DESTRUCT_DELAY_MILLISECONDS);
711         return;
712     }
713     auto taskExecutor = context->GetTaskExecutor();
714     if (!taskExecutor) {
715         TAG_LOGE(AceLogTag::ACE_WEB, "NotifyDestory TaskExecutor is null");
716         return;
717     }
718     taskExecutor->PostDelayedTask(
719         [weak = WeakClaim(this), taskExecutor = taskExecutor]() {
720             auto observer = weak.Upgrade();
721             if (!observer) {
722                 TAG_LOGE(AceLogTag::ACE_WEB, "NotifyDestory TaskExecutor observer is null");
723                 return;
724             }
725             if (observer->delegate_) {
726                 TAG_LOGD(AceLogTag::ACE_WEB, "NotifyDestory TaskExecutor destorying delegate");
727                 observer->delegate_.Reset();
728             }
729         },
730         TaskExecutor::TaskType::UI, DESTRUCT_DELAY_MILLISECONDS, "ArkUIWebNotifyDestory");
731 }
732 
UnRegisterScreenLockFunction()733 void WebDelegate::UnRegisterScreenLockFunction()
734 {
735     if (nweb_) {
736         nweb_->UnRegisterScreenLockFunction(instanceId_);
737     }
738 }
739 
OnAttachContext(const RefPtr<NG::PipelineContext> & context)740 void WebDelegateObserver::OnAttachContext(const RefPtr<NG::PipelineContext> &context)
741 {
742     context_ = context;
743 }
744 
OnDetachContext()745 void WebDelegateObserver::OnDetachContext()
746 {
747     context_ = nullptr;
748 }
749 
SetGestureEventResult(bool result)750 void GestureEventResultOhos::SetGestureEventResult(bool result)
751 {
752     if (result_) {
753         result_->SetGestureEventResult(result);
754         SetSendTask();
755         eventResult_ = result;
756     }
757 }
758 
SetGestureEventResult(bool result,bool stopPropagation)759 void GestureEventResultOhos::SetGestureEventResult(bool result, bool stopPropagation)
760 {
761     if (result_) {
762         result_->SetGestureEventResultV2(result, stopPropagation);
763         SetSendTask();
764         eventResult_ = result;
765     }
766 }
767 
OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea,OHOS::Rosen::AvoidAreaType type)768 void WebAvoidAreaChangedListener::OnAvoidAreaChanged(
769     const OHOS::Rosen::AvoidArea avoidArea, OHOS::Rosen::AvoidAreaType type)
770 {
771     if (auto delegate = webDelegate_.Upgrade()) {
772         delegate->OnAvoidAreaChanged(avoidArea, type);
773     }
774 }
775 
~WebDelegate()776 WebDelegate::~WebDelegate()
777 {
778     SetAccessibilityState(false);
779     OnNativeEmbedAllDestory();
780     ReleasePlatformResource();
781     if (IsDeviceTabletOr2in1() && GetWebOptimizationValue()) {
782         OHOS::Rosen::RSInterfaces::GetInstance().UnRegisterSurfaceOcclusionChangeCallback(surfaceNodeId_);
783     }
784     if (nweb_) {
785         nweb_->OnDestroy();
786     }
787     UnregisterSurfacePositionChangedCallback();
788     UnregisterAvoidAreaChangeListener();
789     UnRegisterConfigObserver();
790 }
791 
ReleasePlatformResource()792 void WebDelegate::ReleasePlatformResource()
793 {
794     Stop();
795     Release();
796 }
797 
Invoke(const std::string & origin,const bool & allow,const bool & retain)798 void WebGeolocationOhos::Invoke(const std::string& origin, const bool& allow, const bool& retain)
799 {
800     if (geolocationCallback_) {
801         geolocationCallback_->GeolocationCallbackInvoke(origin, allow, retain,
802             incognito_);
803     }
804 }
805 
Stop()806 void WebDelegate::Stop()
807 {
808     auto context = context_.Upgrade();
809     if (!context) {
810         return;
811     }
812     auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
813     if (platformTaskExecutor.IsRunOnCurrentThread()) {
814         UnregisterEvent();
815     } else {
816         platformTaskExecutor.PostTask([weak = WeakClaim(this)] {
817             auto delegate = weak.Upgrade();
818             if (delegate) {
819                 delegate->UnregisterEvent();
820             }
821         }, "ArkUIWebUnregisterEvent");
822     }
823 }
824 
UnregisterEvent()825 void WebDelegate::UnregisterEvent()
826 {
827     auto context = DynamicCast<PipelineContext>(context_.Upgrade());
828     if (!context) {
829         return;
830     }
831     auto resRegister = context->GetPlatformResRegister();
832     if (resRegister == nullptr) {
833         return;
834     }
835     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGESTART));
836     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH));
837     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR));
838     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH));
839     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE));
840 }
841 
SetRenderWeb(const WeakPtr<RenderWeb> & renderWeb)842 void WebDelegate::SetRenderWeb(const WeakPtr<RenderWeb>& renderWeb)
843 {
844     renderWeb_ = renderWeb;
845 }
846 
CreatePlatformResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)847 void WebDelegate::CreatePlatformResource(
848     const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
849 {
850     ReleasePlatformResource();
851     context_ = context;
852     CreatePluginResource(size, position, context);
853 
854     auto reloadCallback = [weak = WeakClaim(this)]() {
855         auto delegate = weak.Upgrade();
856         if (!delegate) {
857             return false;
858         }
859         delegate->Reload();
860         return true;
861     };
862     WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
863 
864     auto updateUrlCallback = [weak = WeakClaim(this)](const std::string& url) {
865         auto delegate = weak.Upgrade();
866         if (!delegate) {
867             return false;
868         }
869         delegate->UpdateUrl(url);
870         return true;
871     };
872     WebClient::GetInstance().RegisterUpdageUrlCallback(updateUrlCallback);
873     InitWebEvent();
874 }
875 
LoadUrl(const std::string & url,const std::map<std::string,std::string> & httpHeaders)876 void WebDelegate::LoadUrl(const std::string& url, const std::map<std::string, std::string>& httpHeaders)
877 {
878     auto context = context_.Upgrade();
879     if (!context) {
880         return;
881     }
882     context->GetTaskExecutor()->PostTask(
883         [weak = WeakClaim(this), url, httpHeaders]() {
884             auto delegate = weak.Upgrade();
885             if (!delegate) {
886                 return;
887             }
888             if (delegate->nweb_) {
889                 delegate->nweb_->Load(
890                     const_cast<std::string&>(url), const_cast<std::map<std::string, std::string>&>(httpHeaders));
891             }
892         },
893         TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadUrl");
894 }
895 
896 #ifdef OHOS_STANDARD_SYSTEM
Backward()897 void WebDelegate::Backward()
898 {
899     auto context = context_.Upgrade();
900     if (!context) {
901         return;
902     }
903     context->GetTaskExecutor()->PostTask(
904         [weak = WeakClaim(this)]() {
905             auto delegate = weak.Upgrade();
906             if (!delegate) {
907                 return;
908             }
909             if (delegate->nweb_) {
910                 delegate->nweb_->NavigateBack();
911             }
912         },
913         TaskExecutor::TaskType::PLATFORM, "ArkUIWebNavigateBack");
914 }
915 
Forward()916 void WebDelegate::Forward()
917 {
918     auto context = context_.Upgrade();
919     if (!context) {
920         return;
921     }
922     context->GetTaskExecutor()->PostTask(
923         [weak = WeakClaim(this)]() {
924             auto delegate = weak.Upgrade();
925             if (!delegate) {
926                 return;
927             }
928             if (delegate->nweb_) {
929                 delegate->nweb_->NavigateForward();
930             }
931         },
932         TaskExecutor::TaskType::PLATFORM, "ArkUIWebNavigateForward");
933 }
934 
ClearHistory()935 void WebDelegate::ClearHistory()
936 {
937     auto context = context_.Upgrade();
938     if (!context) {
939         return;
940     }
941     context->GetTaskExecutor()->PostTask(
942         [weak = WeakClaim(this)]() {
943             auto delegate = weak.Upgrade();
944             if (!delegate) {
945                 return;
946             }
947             if (delegate->nweb_) {
948                 delegate->nweb_->DeleteNavigateHistory();
949             }
950         },
951         TaskExecutor::TaskType::PLATFORM, "ArkUIWebDeleteNavigateHistory");
952 }
953 
ClearSslCache()954 void WebDelegate::ClearSslCache()
955 {
956     auto context = context_.Upgrade();
957     if (!context) {
958         return;
959     }
960     context->GetTaskExecutor()->PostTask(
961         [weak = WeakClaim(this)]() {
962             auto delegate = weak.Upgrade();
963             if (!delegate) {
964                 return;
965             }
966             if (delegate->nweb_) {
967                 delegate->nweb_->ClearSslCache();
968             }
969         },
970         TaskExecutor::TaskType::PLATFORM, "ArkUIWebClearSslCache");
971 }
972 
ClearClientAuthenticationCache()973 void WebDelegate::ClearClientAuthenticationCache()
974 {
975     auto context = context_.Upgrade();
976     if (!context) {
977         return;
978     }
979     context->GetTaskExecutor()->PostTask(
980         [weak = WeakClaim(this)]() {
981             auto delegate = weak.Upgrade();
982             if (!delegate) {
983                 return;
984             }
985             if (delegate->nweb_) {
986                 delegate->nweb_->ClearClientAuthenticationCache();
987             }
988         },
989         TaskExecutor::TaskType::PLATFORM, "ArkUIWebClearClientAuthenticationCache");
990 }
991 
AccessStep(int32_t step)992 bool WebDelegate::AccessStep(int32_t step)
993 {
994     auto delegate = WeakClaim(this).Upgrade();
995     if (!delegate) {
996         return false;
997     }
998     if (delegate->nweb_) {
999         return delegate->nweb_->CanNavigateBackOrForward(step);
1000     }
1001     return false;
1002 }
1003 
BackOrForward(int32_t step)1004 void WebDelegate::BackOrForward(int32_t step)
1005 {
1006     auto context = context_.Upgrade();
1007     if (!context) {
1008         return;
1009     }
1010 
1011     context->GetTaskExecutor()->PostTask(
1012         [weak = WeakClaim(this), step] {
1013             auto delegate = weak.Upgrade();
1014             if (!delegate) {
1015                 return;
1016             }
1017             if (delegate->nweb_) {
1018                 delegate->nweb_->NavigateBackOrForward(step);
1019             }
1020         },
1021         TaskExecutor::TaskType::PLATFORM, "ArkUIWebNavigateBackOrForward");
1022 }
1023 
AccessBackward()1024 bool WebDelegate::AccessBackward()
1025 {
1026     auto delegate = WeakClaim(this).Upgrade();
1027     if (!delegate) {
1028         return false;
1029     }
1030     if (delegate->nweb_) {
1031         return delegate->nweb_->IsNavigatebackwardAllowed();
1032     }
1033     return false;
1034 }
1035 
AccessForward()1036 bool WebDelegate::AccessForward()
1037 {
1038     auto delegate = WeakClaim(this).Upgrade();
1039     if (!delegate) {
1040         return false;
1041     }
1042     if (delegate->nweb_) {
1043         return delegate->nweb_->IsNavigateForwardAllowed();
1044     }
1045     return false;
1046 }
1047 
1048 #endif
1049 
ExecuteTypeScript(const std::string & jscode,const std::function<void (const std::string)> && callback)1050 void WebDelegate::ExecuteTypeScript(const std::string& jscode, const std::function<void(const std::string)>&& callback)
1051 {
1052     auto context = context_.Upgrade();
1053     if (!context) {
1054         return;
1055     }
1056     context->GetTaskExecutor()->PostTask(
1057         [weak = WeakClaim(this), jscode, callback]() {
1058             auto delegate = weak.Upgrade();
1059             if (!delegate) {
1060                 return;
1061             }
1062             if (delegate->nweb_) {
1063                 auto callbackImpl = std::make_shared<WebJavaScriptExecuteCallBack>(weak);
1064                 if (callbackImpl && callback) {
1065                     callbackImpl->SetCallBack([weak, func = std::move(callback)](std::string result) {
1066                         auto delegate = weak.Upgrade();
1067                         if (!delegate) {
1068                             return;
1069                         }
1070                         auto context = delegate->context_.Upgrade();
1071                         if (context) {
1072                             context->GetTaskExecutor()->PostTask(
1073                                 [callback = std::move(func), result]() { callback(result); },
1074                                 TaskExecutor::TaskType::JS, "ArkUIWebJavaScriptExecuteCallBack");
1075                         }
1076                     });
1077                 }
1078                 delegate->nweb_->ExecuteJavaScript(jscode, callbackImpl, false);
1079             }
1080         },
1081         TaskExecutor::TaskType::PLATFORM, "ArkUIWebExecuteJavaScript");
1082 }
1083 
LoadDataWithBaseUrl(const std::string & baseUrl,const std::string & data,const std::string & mimeType,const std::string & encoding,const std::string & historyUrl)1084 void WebDelegate::LoadDataWithBaseUrl(const std::string& baseUrl, const std::string& data, const std::string& mimeType,
1085     const std::string& encoding, const std::string& historyUrl)
1086 {
1087     auto context = context_.Upgrade();
1088     if (!context) {
1089         return;
1090     }
1091     context->GetTaskExecutor()->PostTask(
1092         [weak = WeakClaim(this), baseUrl, data, mimeType, encoding, historyUrl]() {
1093             auto delegate = weak.Upgrade();
1094             if (!delegate) {
1095                 return;
1096             }
1097             if (delegate->nweb_) {
1098                 if (baseUrl.empty() && historyUrl.empty()) {
1099                     delegate->nweb_->LoadWithData(data, mimeType, encoding);
1100                 } else {
1101                     delegate->nweb_->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
1102                 }
1103             }
1104         },
1105         TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithBaseUrl");
1106 }
1107 
LoadDataWithRichText()1108 bool WebDelegate::LoadDataWithRichText()
1109 {
1110     auto context = context_.Upgrade();
1111     if (!context) {
1112         return false;
1113     }
1114 #ifdef NG_BUILD
1115     auto webPattern = webPattern_.Upgrade();
1116     CHECK_NULL_RETURN(webPattern, false);
1117     auto webData = webPattern->GetWebData();
1118     CHECK_NULL_RETURN(webData, false);
1119     const std::string& data = webData.value();
1120     if (data.empty()) {
1121         return false;
1122     }
1123 
1124     context->GetTaskExecutor()->PostTask(
1125         [weak = WeakClaim(this), data]() {
1126             auto delegate = weak.Upgrade();
1127             if (!delegate) {
1128                 return;
1129             }
1130             if (delegate->nweb_) {
1131                 delegate->nweb_->LoadWithDataAndBaseUrl("resource://rawfile", data, "", "", "");
1132             }
1133         },
1134         TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithRichText");
1135     return true;
1136 #else
1137     if (Container::IsCurrentUseNewPipeline()) {
1138         auto webPattern = webPattern_.Upgrade();
1139         CHECK_NULL_RETURN(webPattern, false);
1140         auto webData = webPattern->GetWebData();
1141         CHECK_NULL_RETURN(webData, false);
1142         const std::string& data = webData.value();
1143         if (data.empty()) {
1144             return false;
1145         }
1146 
1147         context->GetTaskExecutor()->PostTask(
1148             [weak = WeakClaim(this), data]() {
1149                 auto delegate = weak.Upgrade();
1150                 if (!delegate) {
1151                     return;
1152                 }
1153                 if (delegate->nweb_) {
1154                     delegate->nweb_->LoadWithDataAndBaseUrl("resource://rawfile", data, "", "", "");
1155                 }
1156             },
1157             TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithRichText");
1158         return true;
1159     }
1160 
1161     auto webCom = webComponent_.Upgrade();
1162     CHECK_NULL_RETURN(webCom, false);
1163     if (webCom->GetData().empty()) {
1164         return false;
1165     }
1166     const std::string& data = webCom->GetData();
1167     context->GetTaskExecutor()->PostTask(
1168         [weak = WeakClaim(this), data]() {
1169             auto delegate = weak.Upgrade();
1170             if (!delegate) {
1171                 return;
1172             }
1173             if (delegate->nweb_) {
1174                 delegate->nweb_->LoadWithDataAndBaseUrl("resource://rawfile", data, "", "", "");
1175             }
1176         },
1177         TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadDataWithRichText");
1178     return true;
1179 #endif
1180 }
1181 
Refresh()1182 void WebDelegate::Refresh()
1183 {
1184     auto context = context_.Upgrade();
1185     if (!context) {
1186         return;
1187     }
1188     context->GetTaskExecutor()->PostTask(
1189         [weak = WeakClaim(this)]() {
1190             auto delegate = weak.Upgrade();
1191             if (!delegate) {
1192                 return;
1193             }
1194             if (delegate->nweb_) {
1195                 delegate->nweb_->Reload();
1196             }
1197         },
1198         TaskExecutor::TaskType::PLATFORM, "ArkUIWebRefresh");
1199 }
1200 
StopLoading()1201 void WebDelegate::StopLoading()
1202 {
1203     auto context = context_.Upgrade();
1204     if (!context) {
1205         return;
1206     }
1207     context->GetTaskExecutor()->PostTask(
1208         [weak = WeakClaim(this)]() {
1209             auto delegate = weak.Upgrade();
1210             if (!delegate) {
1211                 return;
1212             }
1213             if (delegate->nweb_) {
1214                 delegate->nweb_->Stop();
1215             }
1216         },
1217         TaskExecutor::TaskType::PLATFORM, "ArkUIWebStopLoading");
1218 }
1219 
AddJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)1220 void WebDelegate::AddJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
1221 {
1222     auto context = context_.Upgrade();
1223     if (!context) {
1224         return;
1225     }
1226     context->GetTaskExecutor()->PostTask(
1227         [weak = WeakClaim(this), objectName, methodList]() {
1228             auto delegate = weak.Upgrade();
1229             if (!delegate) {
1230                 return;
1231             }
1232             if (delegate->nweb_) {
1233                 // Async methods list is empty
1234                 std::vector<std::string> asyncMethodList;
1235                 std::string permission;
1236                 // webcontroller not support object, so the object_id param
1237                 // assign error code
1238                 delegate->nweb_->RegisterArkJSfunctionV2(
1239                     objectName, methodList, asyncMethodList,
1240                     static_cast<int32_t>(JavaScriptObjIdErrorCode::WEBCONTROLLERERROR),
1241                     permission);
1242             }
1243         },
1244         TaskExecutor::TaskType::PLATFORM, "ArkUIWebAddJsInterface");
1245 }
RemoveJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)1246 void WebDelegate::RemoveJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
1247 {
1248     auto context = context_.Upgrade();
1249     if (!context) {
1250         return;
1251     }
1252     context->GetTaskExecutor()->PostTask(
1253         [weak = WeakClaim(this), objectName, methodList]() {
1254             auto delegate = weak.Upgrade();
1255             if (!delegate) {
1256                 return;
1257             }
1258             if (delegate->nweb_) {
1259                 delegate->nweb_->UnregisterArkJSfunction(objectName, methodList);
1260             }
1261         },
1262         TaskExecutor::TaskType::PLATFORM, "ArkUIWebRemoveJsInterface");
1263 }
1264 
SetWebViewJavaScriptResultCallBack(const WebController::JavaScriptCallBackImpl && javaScriptCallBackImpl)1265 void WebDelegate::SetWebViewJavaScriptResultCallBack(
1266     const WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl)
1267 {
1268     auto context = context_.Upgrade();
1269     if (!context) {
1270         return;
1271     }
1272 
1273     context->GetTaskExecutor()->PostTask(
1274         [weak = WeakClaim(this), javaScriptCallBackImpl]() {
1275             auto delegate = weak.Upgrade();
1276             if (delegate == nullptr || delegate->nweb_ == nullptr) {
1277                 return;
1278             }
1279             auto webJSResultCallBack = std::make_shared<WebJavaScriptResultCallBack>(weak);
1280             if (webJSResultCallBack) {
1281                 webJSResultCallBack->SetJavaScriptCallBack(std::move(javaScriptCallBackImpl));
1282                 delegate->nweb_->SetNWebJavaScriptResultCallBack(webJSResultCallBack);
1283             }
1284         },
1285         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetJsResultCallBack");
1286 }
1287 
CreateWebMessagePorts(std::vector<RefPtr<WebMessagePort>> & ports)1288 void WebDelegate::CreateWebMessagePorts(std::vector<RefPtr<WebMessagePort>>& ports)
1289 {
1290     if (nweb_) {
1291         std::vector<std::string> portStr = nweb_->CreateWebMessagePorts();
1292         RefPtr<WebMessagePort> port0 = AceType::MakeRefPtr<WebMessagePortOhos>(WeakClaim(this));
1293         RefPtr<WebMessagePort> port1 = AceType::MakeRefPtr<WebMessagePortOhos>(WeakClaim(this));
1294         port0->SetPortHandle(portStr[0]);
1295         port1->SetPortHandle(portStr[1]);
1296         ports.push_back(port0);
1297         ports.push_back(port1);
1298     }
1299 }
1300 
PostWebMessage(std::string & message,std::vector<RefPtr<WebMessagePort>> & ports,std::string & uri)1301 void WebDelegate::PostWebMessage(std::string& message, std::vector<RefPtr<WebMessagePort>>& ports, std::string& uri)
1302 {
1303     if (nweb_) {
1304         std::vector<std::string> sendPorts;
1305         for (RefPtr<WebMessagePort> port : ports) {
1306             sendPorts.push_back(port->GetPortHandle());
1307         }
1308         nweb_->PostWebMessage(message, sendPorts, uri);
1309     }
1310 }
1311 
ClosePort(std::string & port)1312 void WebDelegate::ClosePort(std::string& port)
1313 {
1314     if (nweb_) {
1315         nweb_->ClosePort(port);
1316     }
1317 }
1318 
PostPortMessage(std::string & port,std::string & data)1319 void WebDelegate::PostPortMessage(std::string& port, std::string& data)
1320 {
1321     if (nweb_) {
1322         auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
1323         webMsg->SetType(NWebValue::Type::STRING);
1324         webMsg->SetString(data);
1325         nweb_->PostPortMessage(port, webMsg);
1326     }
1327 }
1328 
SetPortMessageCallback(std::string & port,std::function<void (const std::string &)> && callback)1329 void WebDelegate::SetPortMessageCallback(std::string& port, std::function<void(const std::string&)>&& callback)
1330 {
1331     if (nweb_) {
1332         auto callbackImpl = std::make_shared<WebMessageValueCallBackImpl>(WeakClaim(this));
1333         if (callbackImpl && callback) {
1334             callbackImpl->SetCallBack([weak = WeakClaim(this), func = std::move(callback)](std::string result) {
1335                 auto delegate = weak.Upgrade();
1336                 if (!delegate) {
1337                     return;
1338                 }
1339                 auto context = delegate->context_.Upgrade();
1340                 if (context) {
1341                     context->GetTaskExecutor()->PostTask(
1342                         [callback = std::move(func), result]() { callback(result); },
1343                         TaskExecutor::TaskType::JS, "ArkUIWebSetPortMessageCallback");
1344                 }
1345             });
1346         }
1347         nweb_->SetPortMessageCallback(port, callbackImpl);
1348     }
1349 }
1350 
RequestFocus(OHOS::NWeb::NWebFocusSource source)1351 bool WebDelegate::RequestFocus(OHOS::NWeb::NWebFocusSource source)
1352 {
1353     auto context = context_.Upgrade();
1354     CHECK_NULL_RETURN(context, false);
1355     bool result = false;
1356     context->GetTaskExecutor()->PostSyncTask(
1357         [weak = WeakClaim(this), &result, source]() {
1358             auto delegate = weak.Upgrade();
1359             CHECK_NULL_VOID(delegate);
1360 
1361             if (Container::IsCurrentUseNewPipeline()) {
1362                 auto webPattern = delegate->webPattern_.Upgrade();
1363                 CHECK_NULL_VOID(webPattern);
1364                 if (webPattern->IsFocus()) {
1365                     result = true;
1366                     return;
1367                 }
1368                 auto eventHub = webPattern->GetWebEventHub();
1369                 CHECK_NULL_VOID(eventHub);
1370                 auto focusHub = eventHub->GetOrCreateFocusHub();
1371                 CHECK_NULL_VOID(focusHub);
1372                 if (source == OHOS::NWeb::NWebFocusSource::FOCUS_SOURCE_NAVIGATION &&
1373                     webPattern->IsDefaultFocusNodeExist() && !focusHub->IsDefaultFocus()) {
1374                     TAG_LOGI(AceLogTag::ACE_WEB, "there are other default focusNodes, web don't focus on navigation");
1375                     result = false;
1376                     return;
1377                 }
1378 
1379                 auto host = webPattern->GetHost();
1380                 CHECK_NULL_VOID(host);
1381                 if (host->IsOnMainTree()) {
1382                     focusHub->RequestFocus();
1383                     result = false;
1384                 }
1385                 return;
1386             }
1387 
1388             auto webCom = delegate->webComponent_.Upgrade();
1389             CHECK_NULL_VOID(webCom);
1390             result = webCom->RequestFocus();
1391         },
1392         TaskExecutor::TaskType::PLATFORM, "ArkUIWebRequestFocus");
1393     return result;
1394 }
1395 
SearchAllAsync(const std::string & searchStr)1396 void WebDelegate::SearchAllAsync(const std::string& searchStr)
1397 {
1398     auto context = context_.Upgrade();
1399     if (!context) {
1400         return;
1401     }
1402     context->GetTaskExecutor()->PostTask(
1403         [weak = WeakClaim(this), searchStr]() {
1404             auto delegate = weak.Upgrade();
1405             if (!delegate) {
1406                 return;
1407             }
1408             if (delegate->nweb_) {
1409                 delegate->nweb_->FindAllAsync(searchStr);
1410             }
1411         },
1412         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSearchAllAsync");
1413 }
1414 
ClearMatches()1415 void WebDelegate::ClearMatches()
1416 {
1417     auto context = context_.Upgrade();
1418     if (!context) {
1419         return;
1420     }
1421     context->GetTaskExecutor()->PostTask(
1422         [weak = WeakClaim(this)]() {
1423             auto delegate = weak.Upgrade();
1424             if (!delegate) {
1425                 return;
1426             }
1427             if (delegate->nweb_) {
1428                 delegate->nweb_->ClearMatches();
1429             }
1430         },
1431         TaskExecutor::TaskType::PLATFORM, "ArkUIWebClearMatches");
1432 }
1433 
SearchNext(bool forward)1434 void WebDelegate::SearchNext(bool forward)
1435 {
1436     auto context = context_.Upgrade();
1437     if (!context) {
1438         return;
1439     }
1440     context->GetTaskExecutor()->PostTask(
1441         [weak = WeakClaim(this), forward]() {
1442             auto delegate = weak.Upgrade();
1443             if (!delegate) {
1444                 return;
1445             }
1446             if (delegate->nweb_) {
1447                 delegate->nweb_->FindNext(forward);
1448             }
1449         },
1450         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSearchNext");
1451 }
1452 
ConverToWebHitTestType(int hitType)1453 int WebDelegate::ConverToWebHitTestType(int hitType)
1454 {
1455     WebHitTestType webHitType;
1456     switch (hitType) {
1457         case OHOS::NWeb::HitTestResult::UNKNOWN_TYPE:
1458             webHitType = WebHitTestType::UNKNOWN;
1459             break;
1460         case OHOS::NWeb::HitTestResult::ANCHOR_TYPE:
1461             webHitType = WebHitTestType::HTTP;
1462             break;
1463         case OHOS::NWeb::HitTestResult::PHONE_TYPE:
1464             webHitType = WebHitTestType::PHONE;
1465             break;
1466         case OHOS::NWeb::HitTestResult::GEO_TYPE:
1467             webHitType = WebHitTestType::MAP;
1468             break;
1469         case OHOS::NWeb::HitTestResult::EMAIL_TYPE:
1470             webHitType = WebHitTestType::EMAIL;
1471             break;
1472         case OHOS::NWeb::HitTestResult::IMAGE_TYPE:
1473             webHitType = WebHitTestType::IMG;
1474             break;
1475         case OHOS::NWeb::HitTestResult::IMAGE_ANCHOR_TYPE:
1476             webHitType = WebHitTestType::HTTP_IMG;
1477             break;
1478         case OHOS::NWeb::HitTestResult::SRC_ANCHOR_TYPE:
1479             webHitType = WebHitTestType::HTTP;
1480             break;
1481         case OHOS::NWeb::HitTestResult::SRC_IMAGE_ANCHOR_TYPE:
1482             webHitType = WebHitTestType::HTTP_IMG;
1483             break;
1484         case OHOS::NWeb::HitTestResult::EDIT_TEXT_TYPE:
1485             webHitType = WebHitTestType::EDIT;
1486             break;
1487         default:
1488             webHitType = WebHitTestType::UNKNOWN;
1489             break;
1490     }
1491     return static_cast<int>(webHitType);
1492 }
1493 
GetHitTestResult()1494 int WebDelegate::GetHitTestResult()
1495 {
1496     if (nweb_) {
1497         std::shared_ptr<OHOS::NWeb::HitTestResult> nwebResult = nweb_->GetHitTestResult();
1498         if (nwebResult) {
1499             return ConverToWebHitTestType(nwebResult->GetType());
1500         }
1501         return ConverToWebHitTestType(OHOS::NWeb::HitTestResult::UNKNOWN_TYPE);
1502     }
1503     return static_cast<int>(WebHitTestType::UNKNOWN);
1504 }
1505 
GetHitTestValue(HitTestResult & result)1506 void WebDelegate::GetHitTestValue(HitTestResult& result)
1507 {
1508     if (nweb_) {
1509         std::shared_ptr<OHOS::NWeb::HitTestResult> nwebResult = nweb_->GetHitTestResult();
1510         if (nwebResult) {
1511             result.SetExtraData(nwebResult->GetExtra());
1512             result.SetHitType(ConverToWebHitTestType(nwebResult->GetType()));
1513         } else {
1514             result.SetHitType(ConverToWebHitTestType(OHOS::NWeb::HitTestResult::UNKNOWN_TYPE));
1515         }
1516     }
1517 }
1518 
GetPageHeight()1519 int WebDelegate::GetPageHeight()
1520 {
1521     if (nweb_) {
1522         return nweb_->ContentHeight();
1523     }
1524     return 0;
1525 }
1526 
GetWebId()1527 int WebDelegate::GetWebId()
1528 {
1529     if (nweb_) {
1530         return nweb_->GetWebId();
1531     }
1532     return -1;
1533 }
1534 
GetTitle()1535 std::string WebDelegate::GetTitle()
1536 {
1537     if (nweb_) {
1538         return nweb_->Title();
1539     }
1540     return "";
1541 }
1542 
GetDefaultUserAgent()1543 std::string WebDelegate::GetDefaultUserAgent()
1544 {
1545     if (!nweb_) {
1546         return "";
1547     }
1548     std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_->GetPreference();
1549     if (!setting) {
1550         return "";
1551     }
1552     return setting->DefaultUserAgent();
1553 }
1554 
SaveCookieSync()1555 bool WebDelegate::SaveCookieSync()
1556 {
1557     if (cookieManager_) {
1558         return cookieManager_->Store();
1559     }
1560     return false;
1561 }
1562 
SetCookie(const std::string & url,const std::string & value,bool incognitoMode)1563 bool WebDelegate::SetCookie(const std::string& url,
1564                             const std::string& value,
1565                             bool incognitoMode)
1566 {
1567     if (cookieManager_) {
1568         return cookieManager_->SetCookie(url, value, incognitoMode);
1569     }
1570     return false;
1571 }
1572 
GetCookie(const std::string & url,bool incognitoMode) const1573 std::string WebDelegate::GetCookie(const std::string& url,
1574                                    bool incognitoMode) const
1575 {
1576     if (cookieManager_) {
1577         bool isValid = true;
1578         return cookieManager_->ReturnCookie(url, isValid, incognitoMode);
1579     }
1580     return "";
1581 }
1582 
DeleteEntirelyCookie(bool incognitoMode)1583 void WebDelegate::DeleteEntirelyCookie(bool incognitoMode)
1584 {
1585     if (cookieManager_) {
1586         cookieManager_->DeleteCookieEntirely(nullptr, incognitoMode);
1587     }
1588 }
1589 
CreatePluginResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)1590 void WebDelegate::CreatePluginResource(
1591     const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
1592 {
1593     state_ = State::CREATING;
1594     auto webCom = webComponent_.Upgrade();
1595     if (!webCom) {
1596         state_ = State::CREATEFAILED;
1597         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1598         return;
1599     }
1600 
1601     auto pipelineContext = context.Upgrade();
1602     if (!pipelineContext) {
1603         state_ = State::CREATEFAILED;
1604         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to context is null");
1605         return;
1606     }
1607     context_ = context;
1608     auto platformTaskExecutor =
1609         SingleTaskExecutor::Make(pipelineContext->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
1610     auto resRegister = pipelineContext->GetPlatformResRegister();
1611     auto weakRes = AceType::WeakClaim(AceType::RawPtr(resRegister));
1612     platformTaskExecutor.PostTask([weakWeb = AceType::WeakClaim(this), weakRes, size, position] {
1613         auto webDelegate = weakWeb.Upgrade();
1614         if (webDelegate == nullptr) {
1615             return;
1616         }
1617         auto webCom = webDelegate->webComponent_.Upgrade();
1618         if (!webCom) {
1619             webDelegate->OnError(NTC_ERROR, "fail to call WebDelegate::SetSrc PostTask");
1620             return;
1621         }
1622         auto resRegister = weakRes.Upgrade();
1623         if (!resRegister) {
1624             if (webDelegate->onError_) {
1625                 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
1626             }
1627             return;
1628         }
1629         auto context = webDelegate->context_.Upgrade();
1630         if (!context) {
1631             return;
1632         }
1633 
1634         std::string pageUrl;
1635         int32_t pageId;
1636         OHOS::Ace::Framework::DelegateClient::GetInstance().GetWebPageUrl(pageUrl, pageId);
1637 
1638         std::stringstream paramStream;
1639         paramStream << NTC_PARAM_WEB << WEB_PARAM_EQUALS << webDelegate->id_ << WEB_PARAM_AND << NTC_PARAM_WIDTH
1640                     << WEB_PARAM_EQUALS << size.Width() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_HEIGHT
1641                     << WEB_PARAM_EQUALS << size.Height() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_LEFT
1642                     << WEB_PARAM_EQUALS << position.GetX() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_TOP
1643                     << WEB_PARAM_EQUALS << position.GetY() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_SRC
1644                     << WEB_PARAM_EQUALS << webCom->GetSrc() << WEB_PARAM_AND << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS
1645                     << pageUrl;
1646 
1647         std::string param = paramStream.str();
1648         webDelegate->id_ = resRegister->CreateResource(WEB_CREATE, param);
1649         if (webDelegate->id_ == WEB_INVALID_ID) {
1650             if (webDelegate->onError_) {
1651                 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
1652             }
1653             return;
1654         }
1655         webDelegate->state_ = State::CREATED;
1656         webDelegate->hash_ = webDelegate->MakeResourceHash();
1657         webDelegate->RegisterWebEvent();
1658         webDelegate->BindRouterBackMethod();
1659         webDelegate->BindPopPageSuccessMethod();
1660         webDelegate->BindIsPagePathInvalidMethod();
1661     }, "ArkUIWebCreatePluginResource");
1662 }
1663 
InitWebEvent()1664 void WebDelegate::InitWebEvent()
1665 {
1666     auto webCom = webComponent_.Upgrade();
1667     if (!webCom) {
1668         state_ = State::CREATEFAILED;
1669         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1670         return;
1671     }
1672     auto context = DynamicCast<PipelineContext>(context_.Upgrade());
1673     if (!context) {
1674         state_ = State::CREATEFAILED;
1675         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1676         return;
1677     }
1678     CHECK_NULL_VOID(context);
1679     if (!webCom->GetPageStartedEventId().IsEmpty()) {
1680         onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context);
1681     }
1682     if (!webCom->GetPageFinishedEventId().IsEmpty()) {
1683         onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context);
1684     }
1685     if (!webCom->GetPageErrorEventId().IsEmpty()) {
1686         onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context);
1687     }
1688     if (!webCom->GetMessageEventId().IsEmpty()) {
1689         onMessage_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetMessageEventId(), context);
1690     }
1691 }
1692 
1693 #ifdef OHOS_STANDARD_SYSTEM
ShowWebView()1694 void WebDelegate::ShowWebView()
1695 {
1696     if (window_) {
1697         window_->Show();
1698     }
1699 
1700     OnActive();
1701     OnWebviewShow();
1702 }
1703 
HideWebView()1704 void WebDelegate::HideWebView()
1705 {
1706     if (window_) {
1707         window_->Hide();
1708     }
1709 
1710     OnInactive();
1711     OnWebviewHide();
1712 }
1713 
InitOHOSWeb(const RefPtr<PipelineBase> & context,const RefPtr<NG::RenderSurface> & surface)1714 void WebDelegate::InitOHOSWeb(const RefPtr<PipelineBase>& context, const RefPtr<NG::RenderSurface>& surface)
1715 {
1716 #ifdef ENABLE_ROSEN_BACKEND
1717     CHECK_NULL_VOID(context);
1718     auto rosenRenderSurface = DynamicCast<NG::RosenRenderSurface>(surface);
1719     if (!rosenRenderSurface) {
1720         if (PrepareInitOHOSWeb(context)) {
1721             if (!isCreateWebView_) {
1722 #ifndef ENABLE_ROSEN_BACKEND
1723                 InitWebViewWithWindow();
1724                 isCreateWebView_ = true;
1725 #endif
1726             }
1727         }
1728         return;
1729     }
1730     if (renderMode_ == static_cast<int32_t>(RenderMode::SYNC_RENDER)) {
1731         renderSurface_ = rosenRenderSurface;
1732     }
1733     SetSurface(rosenRenderSurface->GetSurface());
1734     InitOHOSWeb(context);
1735 #endif
1736 }
1737 
PrepareInitOHOSWeb(const WeakPtr<PipelineBase> & context)1738 bool WebDelegate::PrepareInitOHOSWeb(const WeakPtr<PipelineBase>& context)
1739 {
1740     ACE_SCOPED_TRACE("PrepareInitOHOSWeb");
1741 
1742     state_ = State::CREATING;
1743     // obtain hap data path
1744     auto container = Container::Current();
1745     if (container == nullptr) {
1746         return false;
1747     }
1748     const std::string& bundlePath = container->GetBundlePath();
1749     const std::string& filesDataPath = container->GetFilesDataPath();
1750     std::string baseDir = "base";
1751     std::size_t baseIndex = filesDataPath.find(baseDir);
1752     if (baseIndex == std::string::npos) {
1753         return false;
1754     }
1755     std::string dataPath = filesDataPath.substr(0, baseIndex + baseDir.length());
1756     bundlePath_ = bundlePath;
1757     bundleDataPath_ = dataPath;
1758     hapPath_ = container->GetWebHapPath();
1759     // get app temp dir
1760     tempDir_ = container->GetTempDir();
1761     // load webview so
1762     OHOS::NWeb::NWebHelper::Instance().SetBundlePath(bundlePath_);
1763     if (!OHOS::NWeb::NWebHelper::Instance().Init()) {
1764         return false;
1765     }
1766     auto webCom = webComponent_.Upgrade();
1767     auto webPattern = webPattern_.Upgrade();
1768     auto eventHub = webPattern ? webPattern->GetWebEventHub() : nullptr;
1769     auto useNewPipe = Container::IsCurrentUseNewPipeline();
1770     if (useNewPipe && !webPattern && !eventHub) {
1771         return false;
1772     }
1773     if (!useNewPipe && !webCom) {
1774         return false;
1775     }
1776     incognitoMode_ =
1777         useNewPipe ? webPattern->GetIncognitoMode() : webCom->GetIncognitoMode();
1778     auto sharedRenderProcessToken =
1779         useNewPipe ? webPattern->GetSharedRenderProcessToken() : webCom->GetSharedRenderProcessToken();
1780     sharedRenderProcessToken_ = sharedRenderProcessToken ? sharedRenderProcessToken.value() : "";
1781     context_ = context;
1782     RegisterSurfacePositionChangedCallback();
1783     auto pipelineContext = context.Upgrade();
1784     if (!pipelineContext) {
1785         return false;
1786     }
1787     state_ = State::CREATED;
1788 
1789     SetWebCallBack();
1790     if (!pipelineContext->GetIsDeclarative()) {
1791         RegisterOHOSWebEventAndMethord();
1792     } else {
1793         auto oldContext = DynamicCast<PipelineContext>(pipelineContext);
1794 
1795         onPageFinishedV2_ = useNewPipe ? eventHub->GetOnPageFinishedEvent()
1796                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1797                                            webCom->GetPageFinishedEventId(), oldContext);
1798         onPageStartedV2_ = useNewPipe ? eventHub->GetOnPageStartedEvent()
1799                                       : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1800                                           webCom->GetPageStartedEventId(), oldContext);
1801         onTitleReceiveV2_ = useNewPipe ? eventHub->GetOnTitleReceiveEvent()
1802                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1803                                            webCom->GetTitleReceiveEventId(), oldContext);
1804         onFullScreenExitV2_ = useNewPipe ? eventHub->GetOnFullScreenExitEvent()
1805                                          : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1806                                              webCom->GetOnFullScreenExitEventId(), oldContext);
1807         onGeolocationHideV2_ = useNewPipe ? eventHub->GetOnGeolocationHideEvent()
1808                                           : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1809                                               webCom->GetGeolocationHideEventId(), oldContext);
1810         onGeolocationShowV2_ = useNewPipe ? eventHub->GetOnGeolocationShowEvent()
1811                                           : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1812                                               webCom->GetGeolocationShowEventId(), oldContext);
1813         onErrorReceiveV2_ = useNewPipe ? eventHub->GetOnErrorReceiveEvent()
1814                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1815                                            webCom->GetPageErrorEventId(), oldContext);
1816         onHttpErrorReceiveV2_ = useNewPipe ? eventHub->GetOnHttpErrorReceiveEvent()
1817                                            : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1818                                                webCom->GetHttpErrorEventId(), oldContext);
1819         onRequestFocusV2_ = useNewPipe ? eventHub->GetOnRequestFocusEvent()
1820                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1821                                            webCom->GetRequestFocusEventId(), oldContext);
1822         onDownloadStartV2_ = useNewPipe ? eventHub->GetOnDownloadStartEvent()
1823                                         : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1824                                             webCom->GetDownloadStartEventId(), oldContext);
1825         onRenderExitedV2_ = useNewPipe ? eventHub->GetOnRenderExitedEvent()
1826                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1827                                            webCom->GetRenderExitedId(), oldContext);
1828         onRefreshAccessedHistoryV2_ = useNewPipe ? eventHub->GetOnRefreshAccessedHistoryEvent()
1829                                                  : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1830                                                      webCom->GetRefreshAccessedHistoryId(), oldContext);
1831         onResourceLoadV2_ = useNewPipe ? eventHub->GetOnResourceLoadEvent()
1832                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1833                                            webCom->GetResourceLoadId(), oldContext);
1834         onScaleChangeV2_ = useNewPipe ? eventHub->GetOnScaleChangeEvent()
1835                                       : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1836                                           webCom->GetScaleChangeId(), oldContext);
1837         onPermissionRequestV2_ = useNewPipe ? eventHub->GetOnPermissionRequestEvent()
1838                                             : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1839                                                 webCom->GetPermissionRequestEventId(), oldContext);
1840         onSearchResultReceiveV2_ = useNewPipe ? eventHub->GetOnSearchResultReceiveEvent()
1841                                               : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1842                                                   webCom->GetSearchResultReceiveEventId(), oldContext);
1843         onScrollV2_ = useNewPipe ? eventHub->GetOnScrollEvent()
1844                                  : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1845                                      webCom->GetScrollId(), oldContext);
1846         onWindowExitV2_ = useNewPipe ? eventHub->GetOnWindowExitEvent()
1847                                      : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1848                                          webCom->GetWindowExitEventId(), oldContext);
1849         onPageVisibleV2_ = useNewPipe ? eventHub->GetOnPageVisibleEvent() : nullptr;
1850         onTouchIconUrlV2_ = useNewPipe ? eventHub->GetOnTouchIconUrlEvent() : nullptr;
1851         onAudioStateChangedV2_ = GetAudioStateChangedCallback(useNewPipe, eventHub);
1852         onFirstContentfulPaintV2_ = useNewPipe ? eventHub->GetOnFirstContentfulPaintEvent() : nullptr;
1853         OnFirstMeaningfulPaintV2_ = useNewPipe ? eventHub->GetOnFirstMeaningfulPaintEvent() : nullptr;
1854         OnLargestContentfulPaintV2_ = useNewPipe ? eventHub->GetOnLargestContentfulPaintEvent() : nullptr;
1855         onSafeBrowsingCheckResultV2_ = useNewPipe ? eventHub->GetOnSafeBrowsingCheckResultEvent() : nullptr;
1856         onOverScrollV2_ = useNewPipe ? eventHub->GetOnOverScrollEvent()
1857                                      : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1858                                          webCom->GetOverScrollId(), oldContext);
1859         onScreenCaptureRequestV2_ = useNewPipe ? eventHub->GetOnScreenCaptureRequestEvent() : nullptr;
1860         onNavigationEntryCommittedV2_ = useNewPipe ? eventHub->GetOnNavigationEntryCommittedEvent() : nullptr;
1861         OnNativeEmbedAllDestoryV2_ = useNewPipe ? eventHub->GetOnNativeEmbedLifecycleChangeEvent() : nullptr;
1862         OnNativeEmbedLifecycleChangeV2_ = useNewPipe ? eventHub->GetOnNativeEmbedLifecycleChangeEvent()
1863                                             : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1864                                                 webCom->GetNativeEmbedLifecycleChangeId(), oldContext);
1865         OnNativeEmbedVisibilityChangeV2_ = useNewPipe ? eventHub->GetOnNativeEmbedVisibilityChangeEvent()
1866                                             : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1867                                                 webCom->GetNativeEmbedVisibilityChangeId(), oldContext);
1868         OnNativeEmbedGestureEventV2_ = useNewPipe ? eventHub->GetOnNativeEmbedGestureEvent()
1869                                             : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1870                                                 webCom->GetNativeEmbedGestureEventId(), oldContext);
1871         onIntelligentTrackingPreventionResultV2_ = useNewPipe ?
1872             eventHub->GetOnIntelligentTrackingPreventionResultEvent() : nullptr;
1873         onRenderProcessNotRespondingV2_ = useNewPipe
1874                                               ? eventHub->GetOnRenderProcessNotRespondingEvent()
1875                                               : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::
1876                                                 Create(webCom->GetRenderProcessNotRespondingId(), oldContext);
1877         onRenderProcessRespondingV2_ = useNewPipe ? eventHub->GetOnRenderProcessRespondingEvent()
1878                                                   : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::
1879                                                 Create(webCom->GetRenderProcessRespondingId(), oldContext);
1880         onViewportFitChangedV2_ = useNewPipe ? eventHub->GetOnViewportFitChangedEvent()
1881                                        : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1882                                            webCom->GetViewportFitChangedId(), oldContext);
1883         onAdsBlockedV2_ = useNewPipe ? eventHub->GetOnAdsBlockedEvent()
1884                                      : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1885                                          webCom->GetAdsBlockedEventId(), oldContext);
1886         onInterceptKeyboardAttachV2_ = useNewPipe ? eventHub->GetOnInterceptKeyboardAttachEvent()
1887                                                   : nullptr;
1888     }
1889     return true;
1890 }
1891 
OnSurfaceCreated(const sptr<OHOS::Surface> & surface)1892 void WebSurfaceCallback::OnSurfaceCreated(const sptr<OHOS::Surface>& surface) {}
1893 
OnSurfaceChanged(const sptr<OHOS::Surface> & surface,int32_t width,int32_t height)1894 void WebSurfaceCallback::OnSurfaceChanged(const sptr<OHOS::Surface>& surface, int32_t width, int32_t height)
1895 {
1896     auto delegate = delegate_.Upgrade();
1897     if (!delegate) {
1898         return;
1899     }
1900     delegate->Resize((double)width, (double)height);
1901 }
1902 
OnSurfaceDestroyed()1903 void WebSurfaceCallback::OnSurfaceDestroyed() {}
1904 
GLGetConfig(int version,EGLDisplay eglDisplay)1905 EGLConfig WebDelegate::GLGetConfig(int version, EGLDisplay eglDisplay)
1906 {
1907     int attribList[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8,
1908         EGL_ALPHA_SIZE, 8, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE };
1909     EGLConfig configs = NULL;
1910     int configsNum;
1911     if (!eglChooseConfig(eglDisplay, attribList, &configs, 1, &configsNum)) {
1912         return NULL;
1913     }
1914     return configs;
1915 }
1916 
GLContextInit(void * window)1917 void WebDelegate::GLContextInit(void* window)
1918 {
1919     if (!window) {
1920         return;
1921     }
1922     mEglWindow = static_cast<EGLNativeWindowType>(window);
1923 
1924     // 1. create sharedcontext
1925     mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1926     if (mEGLDisplay == EGL_NO_DISPLAY) {
1927         return;
1928     }
1929 
1930     EGLint eglMajVers, eglMinVers;
1931     if (!eglInitialize(mEGLDisplay, &eglMajVers, &eglMinVers)) {
1932         mEGLDisplay = EGL_NO_DISPLAY;
1933         return;
1934     }
1935 
1936     mEGLConfig = GLGetConfig(EGLCONFIG_VERSION, mEGLDisplay);
1937     if (mEGLConfig == nullptr) {
1938         return;
1939     }
1940 
1941     // 2. Create EGL Surface from Native Window
1942     mEGLSurface = eglCreateWindowSurface(mEGLDisplay, mEGLConfig, mEglWindow, nullptr);
1943     if (mEGLSurface == nullptr) {
1944         return;
1945     }
1946 
1947     // 3. Create EGLContext from
1948     int attrib3_list[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
1949 
1950     mEGLContext = eglCreateContext(mEGLDisplay, mEGLConfig, mSharedEGLContext, attrib3_list);
1951 
1952     if (!eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
1953         return;
1954     }
1955 
1956     glViewport(offset_.GetX(), offset_.GetY(), drawSize_.Width(), drawSize_.Height());
1957     glClearColor(1.0, 1.0, 1.0, 1.0);
1958     glClear(GL_COLOR_BUFFER_BIT);
1959 
1960     glFlush();
1961     glFinish();
1962     eglSwapBuffers(mEGLDisplay, mEGLSurface);
1963 
1964     eglDestroySurface(mEGLDisplay, mEGLSurface);
1965     eglDestroyContext(mEGLDisplay, mEGLContext);
1966 }
1967 
InitWebSurfaceDelegate(const WeakPtr<PipelineBase> & context)1968 bool WebDelegate::InitWebSurfaceDelegate(const WeakPtr<PipelineBase>& context)
1969 {
1970     auto pipelineContext = context.Upgrade();
1971     if (!pipelineContext) {
1972         return false;
1973     }
1974     uint32_t windowId = pipelineContext->GetWindowId();
1975     surfaceDelegate_ = new OHOS::SurfaceDelegate(windowId);
1976     if (surfaceDelegate_ == nullptr) {
1977         return false;
1978     }
1979     surfaceCallback_ = new WebSurfaceCallback(AceType::WeakClaim(this));
1980     if (surfaceCallback_ == nullptr) {
1981         return false;
1982     }
1983     surfaceDelegate_->AddSurfaceCallback(surfaceCallback_);
1984     surfaceDelegate_->CreateSurface();
1985     SetBoundsOrResize(drawSize_, offset_);
1986     needResizeAtFirst_ = true;
1987     auto aNativeSurface = surfaceDelegate_->GetNativeWindow();
1988     if (aNativeSurface == nullptr) {
1989         return false;
1990     }
1991     GLContextInit(aNativeSurface);
1992     surfaceInfo_.window = aNativeSurface;
1993     return true;
1994 }
1995 
InitOHOSWeb(const WeakPtr<PipelineBase> & context)1996 void WebDelegate::InitOHOSWeb(const WeakPtr<PipelineBase>& context)
1997 {
1998     if (!PrepareInitOHOSWeb(context)) {
1999         return;
2000     }
2001     if (!isCreateWebView_) {
2002         isCreateWebView_ = true;
2003         if (isEnhanceSurface_) {
2004             if (!InitWebSurfaceDelegate(context)) {
2005                 return;
2006             }
2007             InitWebViewWithSurface();
2008         } else {
2009 #ifdef ENABLE_ROSEN_BACKEND
2010             InitWebViewWithSurface();
2011 #else
2012             InitWebViewWithWindow();
2013 #endif
2014         }
2015     }
2016 }
RegisterOHOSWebEventAndMethord()2017 void WebDelegate::RegisterOHOSWebEventAndMethord()
2018 {
2019     auto reloadCallback = [weak = WeakClaim(this)]() {
2020         auto delegate = weak.Upgrade();
2021         if (!delegate) {
2022             return false;
2023         }
2024         delegate->Reload();
2025         return true;
2026     };
2027     WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
2028 
2029     auto webCom = webComponent_.Upgrade();
2030     CHECK_NULL_VOID(webCom);
2031     auto context = DynamicCast<PipelineContext>(context_.Upgrade());
2032     CHECK_NULL_VOID(context);
2033     if (!webCom->GetPageStartedEventId().IsEmpty()) {
2034         onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context);
2035     }
2036     if (!webCom->GetPageFinishedEventId().IsEmpty()) {
2037         onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context);
2038     }
2039     if (!webCom->GetPageErrorEventId().IsEmpty()) {
2040         onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context);
2041     }
2042 }
2043 
NotifyPopupWindowResult(bool result)2044 void WebDelegate::NotifyPopupWindowResult(bool result)
2045 {
2046     if (parentNWebId_ != -1) {
2047         std::shared_ptr<OHOS::NWeb::NWeb> parentNWeb = OHOS::NWeb::NWebHelper::Instance().GetNWeb(parentNWebId_);
2048         if (parentNWeb) {
2049             parentNWeb->NotifyPopupWindowResult(result);
2050         }
2051     }
2052 }
2053 
RunSetWebIdAndHapPathCallback()2054 void WebDelegate::RunSetWebIdAndHapPathCallback()
2055 {
2056     CHECK_NULL_VOID(nweb_);
2057     auto webId = nweb_->GetWebId();
2058 
2059 #ifdef NG_BUILD
2060     auto pattern = webPattern_.Upgrade();
2061     CHECK_NULL_VOID(pattern);
2062     auto setWebIdCallback = pattern->GetSetWebIdCallback();
2063     CHECK_NULL_VOID(setWebIdCallback);
2064     setWebIdCallback(webId);
2065     if (!hapPath_.empty()) {
2066         auto setHapPathCallback = pattern->GetSetHapPathCallback();
2067         CHECK_NULL_VOID(setHapPathCallback);
2068         setHapPathCallback(hapPath_);
2069     }
2070     auto onControllerAttachedCallback = pattern->GetOnControllerAttachedCallback();
2071     if (onControllerAttachedCallback) {
2072         onControllerAttachedCallback();
2073     }
2074     NotifyPopupWindowResult(true);
2075     return;
2076 #else
2077     if (Container::IsCurrentUseNewPipeline()) {
2078         auto pattern = webPattern_.Upgrade();
2079         CHECK_NULL_VOID(pattern);
2080         auto setWebIdCallback = pattern->GetSetWebIdCallback();
2081         CHECK_NULL_VOID(setWebIdCallback);
2082         setWebIdCallback(webId);
2083         if (!hapPath_.empty()) {
2084             auto setHapPathCallback = pattern->GetSetHapPathCallback();
2085             CHECK_NULL_VOID(setHapPathCallback);
2086             setHapPathCallback(hapPath_);
2087         }
2088         auto onControllerAttachedCallback = pattern->GetOnControllerAttachedCallback();
2089         if (onControllerAttachedCallback) {
2090             onControllerAttachedCallback();
2091         }
2092         NotifyPopupWindowResult(true);
2093         return;
2094     }
2095     auto webCom = webComponent_.Upgrade();
2096     CHECK_NULL_VOID(webCom);
2097     auto setWebIdCallback = webCom->GetSetWebIdCallback();
2098     CHECK_NULL_VOID(setWebIdCallback);
2099     setWebIdCallback(webId);
2100     if (!hapPath_.empty()) {
2101         auto setHapPathCallback = webCom->GetSetHapPathCallback();
2102         CHECK_NULL_VOID(setHapPathCallback);
2103         setHapPathCallback(hapPath_);
2104     }
2105     NotifyPopupWindowResult(true);
2106 #endif
2107 }
2108 
RunJsProxyCallback()2109 void WebDelegate::RunJsProxyCallback()
2110 {
2111 #ifdef NG_BUILD
2112     auto pattern = webPattern_.Upgrade();
2113     CHECK_NULL_VOID(pattern);
2114     pattern->CallJsProxyCallback();
2115     return;
2116 #else
2117     if (Container::IsCurrentUseNewPipeline()) {
2118         auto pattern = webPattern_.Upgrade();
2119         CHECK_NULL_VOID(pattern);
2120         pattern->CallJsProxyCallback();
2121         return;
2122     }
2123     auto webCom = webComponent_.Upgrade();
2124     CHECK_NULL_VOID(webCom);
2125     webCom->CallJsProxyCallback();
2126 #endif
2127 }
2128 
RegisterConfigObserver()2129 void WebDelegate::RegisterConfigObserver()
2130 {
2131     auto context = context_.Upgrade();
2132     if (!context) {
2133         return;
2134     }
2135     context->GetTaskExecutor()->PostTask(
2136         [weak = WeakClaim(this)]() {
2137             auto delegate = weak.Upgrade();
2138             CHECK_NULL_VOID(delegate);
2139             CHECK_NULL_VOID(delegate->nweb_);
2140             auto abilityContext = OHOS::AbilityRuntime::Context::GetApplicationContext();
2141             CHECK_NULL_VOID(abilityContext);
2142             delegate->configChangeObserver_ = std::make_shared<WebConfigurationObserver>(delegate);
2143             if (delegate->configChangeObserver_) {
2144                 abilityContext->RegisterEnvironmentCallback(delegate->configChangeObserver_);
2145             }
2146         },
2147         TaskExecutor::TaskType::PLATFORM, "ArkUIWebAddConfigObserver");
2148 }
2149 
UnRegisterConfigObserver()2150 void WebDelegate::UnRegisterConfigObserver()
2151 {
2152     auto context = context_.Upgrade();
2153     if (!context) {
2154         return;
2155     }
2156     context->GetTaskExecutor()->PostTask(
2157         [weak = WeakClaim(this)]() {
2158             auto delegate = weak.Upgrade();
2159             CHECK_NULL_VOID(delegate);
2160             CHECK_NULL_VOID(delegate->nweb_);
2161             CHECK_NULL_VOID(delegate->configChangeObserver_);
2162             auto abilityContext = OHOS::AbilityRuntime::Context::GetApplicationContext();
2163             CHECK_NULL_VOID(abilityContext);
2164             abilityContext->UnregisterEnvironmentCallback(delegate->configChangeObserver_);
2165             delegate->configChangeObserver_.reset();
2166         },
2167         TaskExecutor::TaskType::PLATFORM, "ArkUIWebRemoveConfigObserver");
2168 }
2169 
SetWebCallBack()2170 void WebDelegate::SetWebCallBack()
2171 {
2172     RefPtr<WebController> webController;
2173     if (Container::IsCurrentUseNewPipeline()) {
2174         auto pattern = webPattern_.Upgrade();
2175         webController = pattern ? pattern->GetWebController() : nullptr;
2176     } else {
2177         auto webCom = webComponent_.Upgrade();
2178         webController = webCom ? webCom->GetController() : nullptr;
2179     }
2180     if (webController) {
2181         auto context = context_.Upgrade();
2182         if (!context) {
2183             return;
2184         }
2185         auto uiTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::UI);
2186         webController->SetLoadUrlImpl([weak = WeakClaim(this), uiTaskExecutor](
2187                                           std::string url, const std::map<std::string, std::string>& httpHeaders) {
2188             uiTaskExecutor.PostTask([weak, url, httpHeaders]() {
2189                 auto delegate = weak.Upgrade();
2190                 if (delegate) {
2191                     delegate->LoadUrl(url, httpHeaders);
2192                 }
2193             }, "ArkUIWebControllerLoadUrl");
2194         });
2195         webController->SetBackwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2196             uiTaskExecutor.PostTask([weak]() {
2197                 auto delegate = weak.Upgrade();
2198                 if (delegate) {
2199                     delegate->Backward();
2200                 }
2201             }, "ArkUIWebBackward");
2202         });
2203         webController->SetForwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2204             uiTaskExecutor.PostTask([weak]() {
2205                 auto delegate = weak.Upgrade();
2206                 if (delegate) {
2207                     delegate->Forward();
2208                 }
2209             }, "ArkUIWebForward");
2210         });
2211         webController->SetClearHistoryImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2212             uiTaskExecutor.PostTask([weak]() {
2213                 auto delegate = weak.Upgrade();
2214                 if (delegate) {
2215                     delegate->ClearHistory();
2216                 }
2217             }, "ArkUIWebClearHistory");
2218         });
2219         webController->SetClearSslCacheImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2220             uiTaskExecutor.PostTask([weak]() {
2221                 auto delegate = weak.Upgrade();
2222                 if (delegate) {
2223                     delegate->ClearSslCache();
2224                 }
2225             }, "ArkUIWebControllerClearSslCache");
2226         });
2227         webController->SetClearClientAuthenticationCacheImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2228             uiTaskExecutor.PostTask([weak]() {
2229                 auto delegate = weak.Upgrade();
2230                 if (delegate) {
2231                     delegate->ClearClientAuthenticationCache();
2232                 }
2233             }, "ArkUIWebControllerClearClientAuthnCache");
2234         });
2235         webController->SetAccessStepImpl([weak = WeakClaim(this)](int32_t step) {
2236             auto delegate = weak.Upgrade();
2237             if (delegate) {
2238                 return delegate->AccessStep(step);
2239             }
2240             return false;
2241         });
2242         webController->SetBackOrForwardImpl([weak = WeakClaim(this)](int32_t step) {
2243             auto delegate = weak.Upgrade();
2244             if (delegate) {
2245                 delegate->BackOrForward(step);
2246             }
2247         });
2248         webController->SetAccessBackwardImpl([weak = WeakClaim(this)]() {
2249             auto delegate = weak.Upgrade();
2250             if (delegate) {
2251                 return delegate->AccessBackward();
2252             }
2253             return false;
2254         });
2255         webController->SetAccessForwardImpl([weak = WeakClaim(this)]() {
2256             auto delegate = weak.Upgrade();
2257             if (delegate) {
2258                 return delegate->AccessForward();
2259             }
2260             return false;
2261         });
2262         webController->SetExecuteTypeScriptImpl([weak = WeakClaim(this), uiTaskExecutor](std::string jscode,
2263                                                     std::function<void(const std::string)>&& callback) {
2264             uiTaskExecutor.PostTask([weak, jscode, callback]() {
2265                 auto delegate = weak.Upgrade();
2266                 if (delegate) {
2267                     delegate->ExecuteTypeScript(jscode, std::move(callback));
2268                 }
2269             }, "ArkUIWebExecuteTypeScript");
2270         });
2271         webController->SetLoadDataWithBaseUrlImpl(
2272             [weak = WeakClaim(this), uiTaskExecutor](std::string baseUrl, std::string data, std::string mimeType,
2273                 std::string encoding, std::string historyUrl) {
2274                 uiTaskExecutor.PostTask([weak, baseUrl, data, mimeType, encoding, historyUrl]() {
2275                     auto delegate = weak.Upgrade();
2276                     if (delegate) {
2277                         delegate->LoadDataWithBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
2278                     }
2279                 }, "ArkUIWebControllerLoadDataWithBaseUrl");
2280             });
2281         webController->SetRefreshImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2282             uiTaskExecutor.PostTask([weak]() {
2283                 auto delegate = weak.Upgrade();
2284                 if (delegate) {
2285                     delegate->Refresh();
2286                 }
2287             }, "ArkUIWebControllerRefresh");
2288         });
2289         webController->SetStopLoadingImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2290             uiTaskExecutor.PostTask([weak]() {
2291                 auto delegate = weak.Upgrade();
2292                 if (delegate) {
2293                     delegate->StopLoading();
2294                 }
2295             }, "ArkUIWebControllerStopLoading");
2296         });
2297         webController->SetGetHitTestResultImpl([weak = WeakClaim(this)]() {
2298             auto delegate = weak.Upgrade();
2299             if (delegate) {
2300                 return delegate->GetHitTestResult();
2301             }
2302             return 0;
2303         });
2304         webController->SetGetHitTestValueImpl([weak = WeakClaim(this)](HitTestResult& result) {
2305             auto delegate = weak.Upgrade();
2306             if (delegate) {
2307                 delegate->GetHitTestValue(result);
2308             }
2309         });
2310         webController->SetGetPageHeightImpl([weak = WeakClaim(this)]() {
2311             auto delegate = weak.Upgrade();
2312             if (delegate) {
2313                 return delegate->GetPageHeight();
2314             }
2315             return 0;
2316         });
2317         webController->SetGetWebIdImpl([weak = WeakClaim(this)]() {
2318             auto delegate = weak.Upgrade();
2319             if (delegate) {
2320                 return delegate->GetWebId();
2321             }
2322             return -1;
2323         });
2324         webController->SetGetTitleImpl([weak = WeakClaim(this)]() {
2325             auto delegate = weak.Upgrade();
2326             if (delegate) {
2327                 return delegate->GetTitle();
2328             }
2329             return std::string();
2330         });
2331         webController->SetCreateMsgPortsImpl([weak = WeakClaim(this)](std::vector<RefPtr<WebMessagePort>>& ports) {
2332             auto delegate = weak.Upgrade();
2333             if (delegate) {
2334                 delegate->CreateWebMessagePorts(ports);
2335             }
2336         });
2337         webController->SetPostWebMessageImpl([weak = WeakClaim(this)](std::string& message,
2338                                                  std::vector<RefPtr<WebMessagePort>>& ports, std::string& uri) {
2339             auto delegate = weak.Upgrade();
2340             if (delegate) {
2341                 delegate->PostWebMessage(message, ports, uri);
2342             }
2343         });
2344         webController->SetGetDefaultUserAgentImpl([weak = WeakClaim(this)]() {
2345             auto delegate = weak.Upgrade();
2346             if (delegate) {
2347                 return delegate->GetDefaultUserAgent();
2348             }
2349             return std::string();
2350         });
2351         webController->SetSaveCookieSyncImpl([weak = WeakClaim(this)]() {
2352             auto delegate = weak.Upgrade();
2353             if (delegate) {
2354                 return delegate->SaveCookieSync();
2355             }
2356             return false;
2357         });
2358         webController->SetSetCookieImpl([weak = WeakClaim(this)](const std::string& url, const std::string& value) {
2359             auto delegate = weak.Upgrade();
2360             if (delegate) {
2361                 return delegate->SetCookie(url, value, delegate->incognitoMode_);
2362             }
2363             return false;
2364         });
2365         webController->SetGetCookieImpl([weak = WeakClaim(this)](const std::string& url) {
2366             auto delegate = weak.Upgrade();
2367             if (delegate) {
2368                 return delegate->GetCookie(url, delegate->incognitoMode_);
2369             }
2370             return std::string();
2371         });
2372         webController->SetDeleteEntirelyCookieImpl([weak = WeakClaim(this)]() {
2373             auto delegate = weak.Upgrade();
2374             if (delegate) {
2375                 delegate->DeleteEntirelyCookie(delegate->incognitoMode_);
2376             }
2377         });
2378         webController->SetWebViewJavaScriptResultCallBackImpl(
2379             [weak = WeakClaim(this), uiTaskExecutor](WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl) {
2380                 uiTaskExecutor.PostTask([weak, javaScriptCallBackImpl]() {
2381                     auto delegate = weak.Upgrade();
2382                     if (delegate) {
2383                         delegate->SetWebViewJavaScriptResultCallBack(std::move(javaScriptCallBackImpl));
2384                     }
2385                 }, "ArkUIWebControllerSetJsResultCallBack");
2386             });
2387         webController->SetAddJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](std::string objectName,
2388                                                          const std::vector<std::string>& methodList) {
2389             uiTaskExecutor.PostTask([weak, objectName, methodList]() {
2390                 auto delegate = weak.Upgrade();
2391                 if (delegate) {
2392                     delegate->AddJavascriptInterface(objectName, methodList);
2393                 }
2394             }, "ArkUIWebControllerAddJsInterface");
2395         });
2396         webController->LoadInitJavascriptInterface();
2397         webController->SetRemoveJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](std::string objectName,
2398                                                             const std::vector<std::string>& methodList) {
2399             uiTaskExecutor.PostTask([weak, objectName, methodList]() {
2400                 auto delegate = weak.Upgrade();
2401                 if (delegate) {
2402                     delegate->RemoveJavascriptInterface(objectName, methodList);
2403                 }
2404             }, "ArkUIWebControllerRemoveJsInterface");
2405         });
2406         webController->SetOnInactiveImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2407             uiTaskExecutor.PostTask([weak]() {
2408                 auto delegate = weak.Upgrade();
2409                 if (delegate) {
2410                     delegate->OnInactive();
2411                 }
2412             }, "ArkUIWebInactiveCallback");
2413         });
2414         webController->SetOnActiveImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2415             uiTaskExecutor.PostTask([weak]() {
2416                 auto delegate = weak.Upgrade();
2417                 if (delegate) {
2418                     delegate->OnActive();
2419                 }
2420             }, "ArkUIWebActiveCallback");
2421         });
2422         webController->SetZoomImpl([weak = WeakClaim(this), uiTaskExecutor](float factor) {
2423             uiTaskExecutor.PostTask([weak, factor]() {
2424                 auto delegate = weak.Upgrade();
2425                 if (delegate) {
2426                     delegate->Zoom(factor);
2427                 }
2428             }, "ArkUIWebSetZoomFactor");
2429         });
2430         webController->SetZoomInImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2431             bool result = false;
2432             uiTaskExecutor.PostSyncTask([weak, &result]() {
2433                 auto delegate = weak.Upgrade();
2434                 if (delegate) {
2435                     result = delegate->ZoomIn();
2436                 }
2437             }, "ArkUIWebControllerZoomIn");
2438             return result;
2439         });
2440         webController->SetZoomOutImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2441             bool result = false;
2442             uiTaskExecutor.PostSyncTask([weak, &result]() {
2443                 auto delegate = weak.Upgrade();
2444                 if (delegate) {
2445                     result = delegate->ZoomOut();
2446                 }
2447             }, "ArkUIWebControllerZoomOut");
2448             return result;
2449         });
2450         webController->SetRequestFocusImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2451             uiTaskExecutor.PostTask([weak]() {
2452                 auto delegate = weak.Upgrade();
2453                 if (delegate) {
2454                     delegate->RequestFocus();
2455                 }
2456             }, "ArkUIWebControllerRequestFocus");
2457         });
2458 
2459         webController->SetSearchAllAsyncImpl([weak = WeakClaim(this), uiTaskExecutor](const std::string& searchStr) {
2460             uiTaskExecutor.PostTask([weak, searchStr]() {
2461                 auto delegate = weak.Upgrade();
2462                 if (delegate) {
2463                     delegate->SearchAllAsync(searchStr);
2464                 }
2465             }, "ArkUIWebControllerSearchAllAsync");
2466         });
2467         webController->SetClearMatchesImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2468             uiTaskExecutor.PostTask([weak]() {
2469                 auto delegate = weak.Upgrade();
2470                 if (delegate) {
2471                     delegate->ClearMatches();
2472                 }
2473             }, "ArkUIWebControllerClearMatches");
2474         });
2475         webController->SetSearchNextImpl([weak = WeakClaim(this), uiTaskExecutor](bool forward) {
2476             uiTaskExecutor.PostTask([weak, forward]() {
2477                 auto delegate = weak.Upgrade();
2478                 if (delegate) {
2479                     delegate->SearchNext(forward);
2480                 }
2481             }, "ArkUIWebControllerSearchNext");
2482         });
2483         webController->SetGetUrlImpl([weak = WeakClaim(this)]() {
2484             auto delegate = weak.Upgrade();
2485             if (delegate) {
2486                 return delegate->GetUrl();
2487             }
2488             return std::string();
2489         });
2490     } else {
2491         TAG_LOGW(AceLogTag::ACE_WEB, "web controller is nullptr");
2492     }
2493 }
2494 
InitWebViewWithWindow()2495 void WebDelegate::InitWebViewWithWindow()
2496 {
2497     auto context = context_.Upgrade();
2498     CHECK_NULL_VOID(context);
2499     context->GetTaskExecutor()->PostTask(
2500         [weak = WeakClaim(this)]() {
2501             auto delegate = weak.Upgrade();
2502             if (!delegate) {
2503                 return;
2504             }
2505             std::shared_ptr<OHOS::NWeb::NWebEngineInitArgsImpl> initArgs =
2506                 std::make_shared<OHOS::NWeb::NWebEngineInitArgsImpl>();
2507             std::string app_path = GetDataPath();
2508             if (!app_path.empty()) {
2509                 initArgs->AddArg(std::string("--user-data-dir=").append(app_path));
2510             }
2511 
2512             delegate->window_ = delegate->CreateWindow();
2513             if (!delegate->window_) {
2514                 return;
2515             }
2516 
2517             initArgs->SetSharedRenderProcessToken(delegate->sharedRenderProcessToken_);
2518             delegate->nweb_ =
2519                 OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
2520                     delegate->window_.GetRefPtr(), initArgs,
2521                     delegate->incognitoMode_);
2522             if (delegate->nweb_ == nullptr) {
2523                 delegate->window_ = nullptr;
2524                 return;
2525             }
2526             delegate->JavaScriptOnDocumentStart();
2527             delegate->JavaScriptOnDocumentEnd();
2528             delegate->cookieManager_ = OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
2529             if (delegate->cookieManager_ == nullptr) {
2530                 return;
2531             }
2532             auto webviewClient = std::make_shared<WebClientImpl>();
2533             webviewClient->SetWebDelegate(weak);
2534             delegate->nweb_->SetNWebHandler(webviewClient);
2535 
2536             // Set downloadListenerImpl
2537             auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>();
2538             downloadListenerImpl->SetWebDelegate(weak);
2539             delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
2540 
2541             auto findListenerImpl = std::make_shared<FindListenerImpl>();
2542             findListenerImpl->SetWebDelegate(weak);
2543             delegate->nweb_->PutFindCallback(findListenerImpl);
2544 
2545             auto spanstringConvertHtmlImpl = std::make_shared<SpanstringConvertHtmlImpl>(Container::CurrentId());
2546             spanstringConvertHtmlImpl->SetWebDelegate(weak);
2547             delegate->nweb_->PutSpanstringConvertHtmlCallback(spanstringConvertHtmlImpl);
2548 
2549             std::optional<std::string> src;
2550             auto isNewPipe = Container::IsCurrentUseNewPipeline();
2551             delegate->UpdateSettting(isNewPipe);
2552             if (isNewPipe) {
2553                 auto webPattern = delegate->webPattern_.Upgrade();
2554                 if (webPattern) {
2555                     src = webPattern->GetWebSrc();
2556                 }
2557             } else {
2558                 auto webCom = delegate->webComponent_.Upgrade();
2559                 if (webCom) {
2560                     src = webCom->GetSrc();
2561                 }
2562             }
2563             if (src) {
2564                 delegate->nweb_->Load(src.value());
2565             }
2566             delegate->window_->Show();
2567         },
2568         TaskExecutor::TaskType::PLATFORM, "ArkUIWebInitWebViewWithWindow");
2569 }
2570 
UpdateSettting(bool useNewPipe)2571 void WebDelegate::UpdateSettting(bool useNewPipe)
2572 {
2573     CHECK_NULL_VOID(nweb_);
2574     auto setting = nweb_->GetPreference();
2575     CHECK_NULL_VOID(setting);
2576 #ifdef NG_BUILD
2577     auto webPattern = webPattern_.Upgrade();
2578     CHECK_NULL_VOID(webPattern);
2579     setting->PutDomStorageEnabled(webPattern->GetDomStorageAccessEnabledValue(false));
2580     setting->PutJavaScriptEnabled(webPattern->GetJsEnabledValue(true));
2581     setting->PutEnableRawFileAccess(webPattern->GetFileAccessEnabledValue(true));
2582     setting->PutEnableContentAccess(true);
2583     setting->PutLoadImageFromNetworkDisabled(!webPattern->GetOnLineImageAccessEnabledValue(true));
2584     setting->PutImageLoadingAllowed(webPattern->GetImageAccessEnabledValue(true));
2585     setting->PutAccessModeForSecureOriginLoadFromInsecure(static_cast<OHOS::NWeb::NWebPreference::AccessMode>(
2586         webPattern->GetMixedModeValue(MixedModeContent::MIXED_CONTENT_NEVER_ALLOW)));
2587     setting->PutZoomingFunctionEnabled(webPattern->GetZoomAccessEnabledValue(true));
2588     setting->PutGeolocationAllowed(webPattern->GetGeolocationAccessEnabledValue(true));
2589     setting->PutCacheMode(
2590         static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(webPattern->GetCacheModeValue(WebCacheMode::DEFAULT)));
2591     setting->PutLoadWithOverviewMode(webPattern->GetOverviewModeAccessEnabledValue(true));
2592     setting->PutEnableRawFileAccessFromFileURLs(webPattern->GetFileFromUrlAccessEnabledValue(true));
2593     setting->PutDatabaseAllowed(webPattern->GetDatabaseAccessEnabledValue(false));
2594     setting->PutZoomingForTextFactor(webPattern->GetTextZoomRatioValue(DEFAULT_TEXT_ZOOM_RATIO));
2595     setting->PutWebDebuggingAccess(webPattern->GetWebDebuggingAccessEnabledValue(false));
2596     setting->PutMediaPlayGestureAccess(webPattern->GetMediaPlayGestureAccessValue(true));
2597     return;
2598 #else
2599     if (useNewPipe) {
2600         auto webPattern = webPattern_.Upgrade();
2601         CHECK_NULL_VOID(webPattern);
2602         setting->PutDomStorageEnabled(webPattern->GetDomStorageAccessEnabledValue(false));
2603         setting->PutJavaScriptEnabled(webPattern->GetJsEnabledValue(true));
2604         setting->PutEnableRawFileAccess(webPattern->GetFileAccessEnabledValue(true));
2605         setting->PutEnableContentAccess(true);
2606         setting->PutLoadImageFromNetworkDisabled(!webPattern->GetOnLineImageAccessEnabledValue(true));
2607         setting->PutImageLoadingAllowed(webPattern->GetImageAccessEnabledValue(true));
2608         setting->PutAccessModeForSecureOriginLoadFromInsecure(static_cast<OHOS::NWeb::NWebPreference::AccessMode>(
2609             webPattern->GetMixedModeValue(MixedModeContent::MIXED_CONTENT_NEVER_ALLOW)));
2610         setting->PutZoomingFunctionEnabled(webPattern->GetZoomAccessEnabledValue(true));
2611         setting->PutGeolocationAllowed(webPattern->GetGeolocationAccessEnabledValue(true));
2612         setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(
2613             webPattern->GetCacheModeValue(WebCacheMode::DEFAULT)));
2614         setting->PutLoadWithOverviewMode(webPattern->GetOverviewModeAccessEnabledValue(true));
2615         setting->PutEnableRawFileAccessFromFileURLs(webPattern->GetFileFromUrlAccessEnabledValue(true));
2616         setting->PutDatabaseAllowed(webPattern->GetDatabaseAccessEnabledValue(false));
2617         setting->PutZoomingForTextFactor(webPattern->GetTextZoomRatioValue(DEFAULT_TEXT_ZOOM_RATIO));
2618         setting->PutWebDebuggingAccess(webPattern->GetWebDebuggingAccessEnabledValue(false));
2619         setting->PutMediaPlayGestureAccess(webPattern->GetMediaPlayGestureAccessValue(true));
2620         return;
2621     }
2622     auto component = webComponent_.Upgrade();
2623     CHECK_NULL_VOID(component);
2624     setting->PutDomStorageEnabled(component->GetDomStorageAccessEnabled());
2625     setting->PutJavaScriptEnabled(component->GetJsEnabled());
2626     setting->PutEnableRawFileAccess(component->GetFileAccessEnabled());
2627     setting->PutEnableContentAccess(component->GetContentAccessEnabled());
2628     setting->PutLoadImageFromNetworkDisabled(component->GetOnLineImageAccessEnabled());
2629     setting->PutImageLoadingAllowed(component->GetImageAccessEnabled());
2630     setting->PutAccessModeForSecureOriginLoadFromInsecure(
2631         static_cast<OHOS::NWeb::NWebPreference::AccessMode>(component->GetMixedMode()));
2632     setting->PutZoomingFunctionEnabled(component->GetZoomAccessEnabled());
2633     setting->PutGeolocationAllowed(component->GetGeolocationAccessEnabled());
2634     setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(component->GetCacheMode()));
2635     setting->PutLoadWithOverviewMode(component->GetOverviewModeAccessEnabled());
2636     setting->PutEnableRawFileAccessFromFileURLs(component->GetFileFromUrlAccessEnabled());
2637     setting->PutDatabaseAllowed(component->GetDatabaseAccessEnabled());
2638     setting->PutZoomingForTextFactor(component->GetTextZoomRatio());
2639     setting->PutWebDebuggingAccess(component->GetWebDebuggingAccessEnabled());
2640     setting->PutMediaPlayGestureAccess(component->IsMediaPlayGestureAccess());
2641 #endif
2642 }
2643 
GetCustomScheme()2644 std::string WebDelegate::GetCustomScheme()
2645 {
2646     std::string customScheme;
2647     if (Container::IsCurrentUseNewPipeline()) {
2648         auto webPattern = webPattern_.Upgrade();
2649         if (webPattern) {
2650             auto webData = webPattern->GetCustomScheme();
2651             if (webData) {
2652                 customScheme = webData.value();
2653             }
2654         }
2655     } else {
2656         auto webCom = webComponent_.Upgrade();
2657         if (webCom) {
2658             customScheme = webCom->GetCustomScheme();
2659         }
2660     }
2661     return customScheme;
2662 }
2663 
SurfaceOcclusionCallback(float visibleRatio)2664 void WebDelegate::SurfaceOcclusionCallback(float visibleRatio)
2665 {
2666     TAG_LOGI(AceLogTag::ACE_WEB,
2667         "SurfaceOcclusion changed, occlusionPoints:%{public}f, surfacenode id: %{public}" PRIu64 "", visibleRatio,
2668         surfaceNodeId_);
2669     if (fabs(visibleRatio_ - visibleRatio) <= FLT_EPSILON || (fabs(visibleRatio) > FLT_EPSILON && visibleRatio < 0.0) ||
2670         (fabs(visibleRatio - 1.0) > FLT_EPSILON && visibleRatio > 1.0)) {
2671         TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio is ilegal or not changed.");
2672         return;
2673     }
2674     visibleRatio_ = visibleRatio;
2675 
2676     if (fabs(visibleRatio_) > FLT_EPSILON && visibleRatio_ > 0.0) {
2677         CHECK_NULL_VOID(nweb_);
2678         nweb_->OnUnoccluded();
2679         if (fabs(visibleRatio_ - lowerFrameRateVisibleRatio_) <= FLT_EPSILON ||
2680             visibleRatio_ < lowerFrameRateVisibleRatio_) {
2681             nweb_->SetEnableLowerFrameRate(true);
2682         } else {
2683             nweb_->SetEnableLowerFrameRate(false);
2684         }
2685     } else {
2686         auto context = context_.Upgrade();
2687         CHECK_NULL_VOID(context);
2688         CHECK_NULL_VOID(context->GetTaskExecutor());
2689         context->GetTaskExecutor()->PostDelayedTask(
2690             [weak = WeakClaim(this)]() {
2691                 auto delegate = weak.Upgrade();
2692                 CHECK_NULL_VOID(delegate);
2693                 if (fabs(delegate->visibleRatio_) <= FLT_EPSILON) {
2694                     TAG_LOGI(AceLogTag::ACE_WEB, "the web is still all occluded");
2695                     CHECK_NULL_VOID(delegate->nweb_);
2696                     delegate->nweb_->OnOccluded();
2697                 }
2698             },
2699             TaskExecutor::TaskType::UI, delayTime_, "ArkUIWebOccluded");
2700     }
2701 }
2702 
ratioStrToFloat(const std::string & str)2703 void WebDelegate::ratioStrToFloat(const std::string& str)
2704 {
2705     // LowerFrameRateConfig format x.xx, len is 4, [0.00, 1.00]
2706     if (str.size() != VISIBLERATIO_LENGTH) {
2707         TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio lenth is over 4.");
2708         return;
2709     }
2710     auto dotCount = std::count(str.begin(), str.end(), '.');
2711     if (dotCount != 1) {
2712         TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio does not have dot.");
2713         return;
2714     }
2715     auto pos = str.find('.', 0);
2716     if (pos != 1) {
2717         TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio dot position is wrong.");
2718         return;
2719     }
2720     auto notDigitCount = std::count_if(str.begin(), str.end(), [](char c) { return !isdigit(c) && c != '.'; });
2721     if (notDigitCount > 0) {
2722         TAG_LOGE(AceLogTag::ACE_WEB, "visibleRatio dot count is over 1.");
2723         return;
2724     }
2725     float f = std::stof(str);
2726     int i = f * VISIBLERATIO_FLOAT_TO_INT;
2727     if (i >= 0 && i <= VISIBLERATIO_FLOAT_TO_INT) {
2728         TAG_LOGI(AceLogTag::ACE_WEB, "visibleRatio check success.");
2729         lowerFrameRateVisibleRatio_ = f;
2730     }
2731 }
2732 
RegisterSurfaceOcclusionChangeFun()2733 void WebDelegate::RegisterSurfaceOcclusionChangeFun()
2734 {
2735     if (!GetWebOptimizationValue()) {
2736         TAG_LOGI(AceLogTag::ACE_WEB, "web optimization is close.");
2737         return;
2738     }
2739     if (!IsDeviceTabletOr2in1()) {
2740         TAG_LOGI(AceLogTag::ACE_WEB, "device type does not satisfy.");
2741         return;
2742     }
2743     std::string visibleAreaRatio =
2744         OHOS::NWeb::NWebAdapterHelper::Instance().ParsePerfConfig("LowerFrameRateConfig", "visibleAreaRatio");
2745     ratioStrToFloat(visibleAreaRatio);
2746     std::vector<float> partitionPoints;
2747     TAG_LOGI(AceLogTag::ACE_WEB, "max visible rate to lower frame rate:%{public}f", lowerFrameRateVisibleRatio_);
2748     if ((int)(lowerFrameRateVisibleRatio_ * VISIBLERATIO_FLOAT_TO_INT) == 0) {
2749         partitionPoints = { 0 };
2750     } else {
2751         partitionPoints = { 0, lowerFrameRateVisibleRatio_ };
2752     }
2753     auto ret = OHOS::Rosen::RSInterfaces::GetInstance().RegisterSurfaceOcclusionChangeCallback(
2754         surfaceNodeId_,
2755         [weak = WeakClaim(this)](float visibleRatio) {
2756             auto delegate = weak.Upgrade();
2757             CHECK_NULL_VOID(delegate);
2758             auto context = delegate->context_.Upgrade();
2759             CHECK_NULL_VOID(context);
2760             context->GetTaskExecutor()->PostTask(
2761                 [weakDelegate = weak, webVisibleRatio = visibleRatio]() {
2762                     auto delegate = weakDelegate.Upgrade();
2763                     CHECK_NULL_VOID(delegate);
2764                     delegate->SurfaceOcclusionCallback(webVisibleRatio);
2765                 },
2766                 TaskExecutor::TaskType::UI, "ArkUIWebOcclusionChange");
2767         },
2768         partitionPoints);
2769     if (ret != Rosen::StatusCode::SUCCESS) {
2770         TAG_LOGW(AceLogTag::ACE_WEB,
2771             "RegisterSurfaceOcclusionChangeCallback failed, surfacenode id:%{public}" PRIu64 ""
2772             ", ret: %{public}" PRIu32 "",
2773             surfaceNodeId_, ret);
2774         return;
2775     }
2776     TAG_LOGI(AceLogTag::ACE_WEB,
2777             "RegisterSurfaceOcclusionChangeCallback succeed, surfacenode id:%{public}" PRIu64 ""
2778             ", ret: %{public}" PRIu32 "",
2779             surfaceNodeId_, ret);
2780 }
2781 
RegisterAvoidAreaChangeListener()2782 void WebDelegate::RegisterAvoidAreaChangeListener()
2783 {
2784     constexpr static int32_t PLATFORM_VERSION_TEN = 10;
2785     auto container = AceType::DynamicCast<Platform::AceContainer>(Container::GetContainer(instanceId_));
2786     CHECK_NULL_VOID(container);
2787     auto pipeline = container->GetPipelineContext();
2788     if (pipeline && pipeline->GetMinPlatformVersion() >= PLATFORM_VERSION_TEN &&
2789         (pipeline->GetIsAppWindow() || container->IsUIExtensionWindow())) {
2790         if (avoidAreaChangedListener_) return;
2791 
2792         systemSafeArea_ = container->GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType::TYPE_SYSTEM);
2793         cutoutSafeArea_ = container->GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType::TYPE_CUTOUT);
2794         navigationIndicatorSafeArea_ =
2795             container->GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR);
2796         OnSafeInsetsChange();
2797 
2798         avoidAreaChangedListener_ = new WebAvoidAreaChangedListener(AceType::WeakClaim(this));
2799         OHOS::Rosen::WMError regCode = container->RegisterAvoidAreaChangeListener(avoidAreaChangedListener_);
2800         TAG_LOGI(AceLogTag::ACE_WEB, "RegisterAvoidAreaChangeListener result:%{public}d", (int) regCode);
2801     } else {
2802         TAG_LOGI(AceLogTag::ACE_WEB, "CANNOT RegisterAvoidAreaChangeListener");
2803     }
2804 }
2805 
2806 class NWebAutoFillCallbackImpl : public OHOS::NWeb::NWebMessageValueCallback {
2807 public:
NWebAutoFillCallbackImpl(const WeakPtr<WebDelegate> & delegate)2808     NWebAutoFillCallbackImpl(const WeakPtr<WebDelegate>& delegate) : delegate_(delegate) {}
2809     ~NWebAutoFillCallbackImpl() = default;
2810 
OnReceiveValue(std::shared_ptr<NWebMessage> result)2811     void OnReceiveValue(std::shared_ptr<NWebMessage> result) override
2812     {
2813         TAG_LOGI(AceLogTag::ACE_AUTO_FILL, "called");
2814         auto delegate = delegate_.Upgrade();
2815         CHECK_NULL_VOID(delegate);
2816         bool ret = delegate->HandleAutoFillEvent(result);
2817         result->SetType(NWebValue::Type::BOOLEAN);
2818         result->SetBoolean(ret);
2819     }
2820 
2821 private:
2822     WeakPtr<WebDelegate> delegate_;
2823 };
2824 
UnregisterAvoidAreaChangeListener()2825 void WebDelegate::UnregisterAvoidAreaChangeListener()
2826 {
2827     constexpr static int32_t PLATFORM_VERSION_TEN = 10;
2828     auto container = AceType::DynamicCast<Platform::AceContainer>(Container::GetContainer(instanceId_));
2829     CHECK_NULL_VOID(container);
2830     auto pipeline = container->GetPipelineContext();
2831     if (pipeline && pipeline->GetMinPlatformVersion() >= PLATFORM_VERSION_TEN &&
2832         (pipeline->GetIsAppWindow() || container->IsUIExtensionWindow())) {
2833         if (!avoidAreaChangedListener_) return;
2834         OHOS::Rosen::WMError regCode = container->UnregisterAvoidAreaChangeListener(avoidAreaChangedListener_);
2835         avoidAreaChangedListener_ = nullptr;
2836         TAG_LOGI(AceLogTag::ACE_WEB, "UnregisterAvoidAreaChangeListener result:%{public}d", (int) regCode);
2837     } else {
2838         TAG_LOGI(AceLogTag::ACE_WEB, "CANNOT UnregisterAvoidAreaChangeListener");
2839     }
2840 }
2841 
InitWebViewWithSurface()2842 void WebDelegate::InitWebViewWithSurface()
2843 {
2844     auto context = context_.Upgrade();
2845     CHECK_NULL_VOID(context);
2846     auto window = context->GetWindow();
2847     CHECK_NULL_VOID(window);
2848     rosenWindowId_ = window->GetWindowId();
2849     context->GetTaskExecutor()->PostTask(
2850         [weak = WeakClaim(this), context = context_, renderMode = renderMode_, layoutMode = layoutMode_]() {
2851             auto delegate = weak.Upgrade();
2852             CHECK_NULL_VOID(delegate);
2853             std::shared_ptr<OHOS::NWeb::NWebEngineInitArgsImpl> initArgs =
2854                 std::make_shared<OHOS::NWeb::NWebEngineInitArgsImpl>();
2855             initArgs->AddArg(std::string("--user-data-dir=").append(delegate->bundleDataPath_));
2856             initArgs->AddArg(std::string("--bundle-installation-dir=").append(delegate->bundlePath_));
2857             initArgs->AddArg(std::string("--lang=").append(AceApplicationInfo::GetInstance().GetLanguage() +
2858                     "-" + AceApplicationInfo::GetInstance().GetCountryOrRegion()));
2859             initArgs->AddArg(std::string("--user-api-version=").append(
2860                 std::to_string(AceApplicationInfo::GetInstance().GetApiTargetVersion())));
2861             bool isEnhanceSurface = delegate->isEnhanceSurface_;
2862             initArgs->SetIsEnhanceSurface(isEnhanceSurface);
2863             initArgs->SetIsPopup(delegate->isPopup_);
2864             initArgs->SetSharedRenderProcessToken(delegate->sharedRenderProcessToken_);
2865 
2866             if (!delegate->hapPath_.empty()) {
2867                 initArgs->AddArg(std::string("--user-hap-path=").append(delegate->hapPath_));
2868             }
2869 
2870             if (!delegate->tempDir_.empty()) {
2871                 initArgs->AddArg(std::string("--ohos-temp-dir=").append(delegate->tempDir_));
2872             }
2873 
2874             std::string customScheme = delegate->GetCustomScheme();
2875             if (!customScheme.empty()) {
2876                 initArgs->AddArg(std::string("--ohos-custom-scheme=").append(customScheme));
2877             }
2878             initArgs->AddArg(std::string("--init-background-color=")
2879                 .append(std::to_string(delegate->backgroundColor_)));
2880             if (delegate->richtextData_) {
2881                 // Created a richtext component
2882                 initArgs->AddArg(std::string("--init-richtext-data=").append(delegate->richtextData_.value()));
2883             }
2884             if (isEnhanceSurface) {
2885                 TAG_LOGD(AceLogTag::ACE_WEB, "Create webview with isEnhanceSurface");
2886                 delegate->nweb_ = OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
2887                     (void *)(&delegate->surfaceInfo_),
2888                     initArgs,
2889                     delegate->drawSize_.Width(),
2890                     delegate->drawSize_.Height(),
2891                     delegate->incognitoMode_);
2892                 delegate->JavaScriptOnDocumentStart();
2893                 delegate->JavaScriptOnDocumentEnd();
2894             } else {
2895 #ifdef ENABLE_ROSEN_BACKEND
2896                 wptr<Surface> surfaceWeak(delegate->surface_);
2897                 sptr<Surface> surface = surfaceWeak.promote();
2898                 CHECK_NULL_VOID(surface);
2899                 delegate->nweb_ = OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
2900                     surface,
2901                     initArgs,
2902                     delegate->drawSize_.Width(),
2903                     delegate->drawSize_.Height(),
2904                     delegate->incognitoMode_);
2905                 delegate->JavaScriptOnDocumentStart();
2906                 delegate->JavaScriptOnDocumentEnd();
2907 #endif
2908             }
2909             CHECK_NULL_VOID(delegate->nweb_);
2910             delegate->cookieManager_ = OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
2911             CHECK_NULL_VOID(delegate->cookieManager_);
2912             auto nweb_handler = std::make_shared<WebClientImpl>();
2913             nweb_handler->SetWebDelegate(weak);
2914             auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>();
2915             downloadListenerImpl->SetWebDelegate(weak);
2916             delegate->nweb_->SetNWebHandler(nweb_handler);
2917             delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
2918 #ifdef OHOS_STANDARD_SYSTEM
2919             auto screenLockCallback = std::make_shared<NWebScreenLockCallbackImpl>(context);
2920             delegate->nweb_->RegisterScreenLockFunction(Container::CurrentId(), screenLockCallback);
2921             auto autoFillCallback = std::make_shared<NWebAutoFillCallbackImpl>(weak);
2922             delegate->nweb_->SetAutofillCallback(autoFillCallback);
2923 #endif
2924             auto findListenerImpl = std::make_shared<FindListenerImpl>();
2925             findListenerImpl->SetWebDelegate(weak);
2926             delegate->nweb_->PutFindCallback(findListenerImpl);
2927             delegate->UpdateSettting(Container::IsCurrentUseNewPipeline());
2928             delegate->RunSetWebIdAndHapPathCallback();
2929             delegate->RunJsProxyCallback();
2930             auto releaseSurfaceListenerImpl = std::make_shared<ReleaseSurfaceImpl>();
2931             releaseSurfaceListenerImpl->SetSurfaceDelegate(delegate->GetSurfaceDelegateClient());
2932             releaseSurfaceListenerImpl->SetWebDelegate(weak);
2933             delegate->nweb_->PutReleaseSurfaceCallback(releaseSurfaceListenerImpl);
2934             auto upgradeContext = context.Upgrade();
2935             CHECK_NULL_VOID(upgradeContext);
2936             auto window_id = upgradeContext->GetWindowId();
2937             delegate->nweb_->SetWindowId(window_id);
2938             delegate->SetToken();
2939             delegate->RegisterSurfaceOcclusionChangeFun();
2940             delegate->RegisterAvoidAreaChangeListener();
2941             delegate->nweb_->SetDrawMode(renderMode);
2942             delegate->nweb_->SetFitContentMode(layoutMode);
2943             delegate->RegisterConfigObserver();
2944             auto spanstringConvertHtmlImpl = std::make_shared<SpanstringConvertHtmlImpl>(Container::CurrentId());
2945             spanstringConvertHtmlImpl->SetWebDelegate(weak);
2946             delegate->nweb_->PutSpanstringConvertHtmlCallback(spanstringConvertHtmlImpl);
2947         },
2948         TaskExecutor::TaskType::PLATFORM, "ArkUIWebInitWebViewWithSurface");
2949 }
2950 
SetKeepScreenOn(bool key)2951 void WebDelegate::SetKeepScreenOn(bool key)
2952 {
2953     auto context = context_.Upgrade();
2954     CHECK_NULL_VOID(context);
2955     auto window = context->GetWindow();
2956     CHECK_NULL_VOID(window);
2957     window->SetKeepScreenOn(key);
2958 }
2959 
UpdateUserAgent(const std::string & userAgent)2960 void WebDelegate::UpdateUserAgent(const std::string& userAgent)
2961 {
2962     auto context = context_.Upgrade();
2963     if (!context) {
2964         return;
2965     }
2966     context->GetTaskExecutor()->PostTask(
2967         [weak = WeakClaim(this), userAgent]() {
2968             auto delegate = weak.Upgrade();
2969             if (delegate && delegate->nweb_) {
2970                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2971                 CHECK_NULL_VOID(setting);
2972                 setting->PutUserAgent(userAgent);
2973             }
2974         },
2975         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateUserAgent");
2976 }
2977 
UpdateBackgroundColor(const int backgroundColor)2978 void WebDelegate::UpdateBackgroundColor(const int backgroundColor)
2979 {
2980     auto context = context_.Upgrade();
2981     if (!context) {
2982         return;
2983     }
2984     context->GetTaskExecutor()->PostTask(
2985         [weak = WeakClaim(this), backgroundColor]() {
2986             auto delegate = weak.Upgrade();
2987             if (delegate && delegate->nweb_) {
2988                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2989                 delegate->nweb_->PutBackgroundColor(backgroundColor);
2990             }
2991         },
2992         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBackgroundColor");
2993 }
2994 
UpdateInitialScale(float scale)2995 void WebDelegate::UpdateInitialScale(float scale)
2996 {
2997     auto context = context_.Upgrade();
2998     if (!context) {
2999         return;
3000     }
3001     context->GetTaskExecutor()->PostTask(
3002         [weak = WeakClaim(this), scale]() {
3003             auto delegate = weak.Upgrade();
3004             if (delegate && delegate->nweb_) {
3005                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3006                 delegate->nweb_->InitialScale(scale);
3007             }
3008         },
3009         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateInitialScale");
3010 }
3011 
SetSurfaceDensity(const double & density)3012 void WebDelegate::SetSurfaceDensity(const double& density)
3013 {
3014     auto context = context_.Upgrade();
3015     if (!context) {
3016         return;
3017     }
3018     context->GetTaskExecutor()->PostTask(
3019         [weak = WeakClaim(this), density]() {
3020             auto delegate = weak.Upgrade();
3021             if (delegate && delegate->nweb_) {
3022                 delegate->nweb_->SetSurfaceDensity(density);
3023             }
3024         },
3025         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetSurfaceDensity");
3026 }
3027 
UpdateLayoutMode(WebLayoutMode mode)3028 void WebDelegate::UpdateLayoutMode(WebLayoutMode mode)
3029 {
3030     auto context = context_.Upgrade();
3031     if (!context) {
3032         return;
3033     }
3034     context->GetTaskExecutor()->PostTask(
3035         [weak = WeakClaim(this), mode]() {
3036             auto delegate = weak.Upgrade();
3037             if (delegate && delegate->nweb_) {
3038                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3039                 delegate->nweb_->SetFitContentMode(static_cast<int32_t>(mode));
3040             }
3041         },
3042         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateLayoutMode");
3043 }
3044 
Resize(const double & width,const double & height,bool isKeyboard)3045 void WebDelegate::Resize(const double& width, const double& height, bool isKeyboard)
3046 {
3047     if (width <= 0 || height <= 0) {
3048         return;
3049     }
3050 
3051     if ((resizeWidth_ == width) && (resizeHeight_ == height)) {
3052         return;
3053     }
3054     resizeWidth_ = width;
3055     resizeHeight_ = height;
3056     auto context = context_.Upgrade();
3057     if (!context) {
3058         return;
3059     }
3060     context->GetTaskExecutor()->PostTask(
3061         [weak = WeakClaim(this), width, height, isKeyboard]() {
3062             auto delegate = weak.Upgrade();
3063             if (delegate && delegate->nweb_ && !delegate->window_) {
3064                 // Sur need int value, greater than this value in case show black line.
3065                 delegate->nweb_->Resize(std::ceil(width), std::ceil(height), isKeyboard);
3066                 double offsetX = 0;
3067                 double offsetY = 0;
3068                 delegate->UpdateScreenOffSet(offsetX, offsetY);
3069                 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
3070             }
3071         },
3072         TaskExecutor::TaskType::PLATFORM, "ArkUIWebResize");
3073     auto webPattern = webPattern_.Upgrade();
3074     CHECK_NULL_VOID(webPattern);
3075     webPattern->DestroyAnalyzerOverlay();
3076 }
3077 
UpdateJavaScriptEnabled(const bool & isJsEnabled)3078 void WebDelegate::UpdateJavaScriptEnabled(const bool& isJsEnabled)
3079 {
3080     auto context = context_.Upgrade();
3081     if (!context) {
3082         return;
3083     }
3084     context->GetTaskExecutor()->PostTask(
3085         [weak = WeakClaim(this), isJsEnabled]() {
3086             auto delegate = weak.Upgrade();
3087             if (delegate && delegate->nweb_) {
3088                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3089                 CHECK_NULL_VOID(setting);
3090                 setting->PutJavaScriptEnabled(isJsEnabled);
3091             }
3092         },
3093         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateJavaScriptEnabled");
3094 }
3095 
UpdateAllowFileAccess(const bool & isFileAccessEnabled)3096 void WebDelegate::UpdateAllowFileAccess(const bool& isFileAccessEnabled)
3097 {
3098     auto context = context_.Upgrade();
3099     if (!context) {
3100         return;
3101     }
3102     context->GetTaskExecutor()->PostTask(
3103         [weak = WeakClaim(this), isFileAccessEnabled]() {
3104             auto delegate = weak.Upgrade();
3105             if (delegate && delegate->nweb_) {
3106                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3107                 CHECK_NULL_VOID(setting);
3108                 setting->PutEnableRawFileAccess(isFileAccessEnabled);
3109             }
3110         },
3111         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAllowFileAccess");
3112 }
3113 
UpdateBlockNetworkImage(const bool & onLineImageAccessEnabled)3114 void WebDelegate::UpdateBlockNetworkImage(const bool& onLineImageAccessEnabled)
3115 {
3116     auto context = context_.Upgrade();
3117     if (!context) {
3118         return;
3119     }
3120     context->GetTaskExecutor()->PostTask(
3121         [weak = WeakClaim(this), onLineImageAccessEnabled]() {
3122             auto delegate = weak.Upgrade();
3123             if (delegate && delegate->nweb_) {
3124                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3125                 CHECK_NULL_VOID(setting);
3126                 setting->PutLoadImageFromNetworkDisabled(onLineImageAccessEnabled);
3127             }
3128         },
3129         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBlockNetworkImage");
3130 }
3131 
UpdateLoadsImagesAutomatically(const bool & isImageAccessEnabled)3132 void WebDelegate::UpdateLoadsImagesAutomatically(const bool& isImageAccessEnabled)
3133 {
3134     auto context = context_.Upgrade();
3135     if (!context) {
3136         return;
3137     }
3138     context->GetTaskExecutor()->PostTask(
3139         [weak = WeakClaim(this), isImageAccessEnabled]() {
3140             auto delegate = weak.Upgrade();
3141             if (delegate && delegate->nweb_) {
3142                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3143                 CHECK_NULL_VOID(setting);
3144                 setting->PutImageLoadingAllowed(isImageAccessEnabled);
3145             }
3146         },
3147         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateLoadImageAccessEnabled");
3148 }
3149 
UpdateMixedContentMode(const MixedModeContent & mixedMode)3150 void WebDelegate::UpdateMixedContentMode(const MixedModeContent& mixedMode)
3151 {
3152     auto context = context_.Upgrade();
3153     if (!context) {
3154         return;
3155     }
3156     context->GetTaskExecutor()->PostTask(
3157         [weak = WeakClaim(this), mixedMode]() {
3158             auto delegate = weak.Upgrade();
3159             if (delegate && delegate->nweb_) {
3160                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3161                 CHECK_NULL_VOID(setting);
3162                 setting->PutAccessModeForSecureOriginLoadFromInsecure(
3163                     static_cast<OHOS::NWeb::NWebPreference::AccessMode>(mixedMode));
3164             }
3165         },
3166         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMixedContentMode");
3167 }
3168 
UpdateSupportZoom(const bool & isZoomAccessEnabled)3169 void WebDelegate::UpdateSupportZoom(const bool& isZoomAccessEnabled)
3170 {
3171     auto context = context_.Upgrade();
3172     if (!context) {
3173         return;
3174     }
3175     context->GetTaskExecutor()->PostTask(
3176         [weak = WeakClaim(this), isZoomAccessEnabled]() {
3177             auto delegate = weak.Upgrade();
3178             if (delegate && delegate->nweb_) {
3179                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3180                 CHECK_NULL_VOID(setting);
3181                 setting->PutZoomingFunctionEnabled(isZoomAccessEnabled);
3182             }
3183         },
3184         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateSupportZoom");
3185 }
UpdateDomStorageEnabled(const bool & isDomStorageAccessEnabled)3186 void WebDelegate::UpdateDomStorageEnabled(const bool& isDomStorageAccessEnabled)
3187 {
3188     auto context = context_.Upgrade();
3189     if (!context) {
3190         return;
3191     }
3192     context->GetTaskExecutor()->PostTask(
3193         [weak = WeakClaim(this), isDomStorageAccessEnabled]() {
3194             auto delegate = weak.Upgrade();
3195             if (delegate && delegate->nweb_) {
3196                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3197                 CHECK_NULL_VOID(setting);
3198                 setting->PutDomStorageEnabled(isDomStorageAccessEnabled);
3199             }
3200         },
3201         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDomStorageEnabled");
3202 }
UpdateGeolocationEnabled(const bool & isGeolocationAccessEnabled)3203 void WebDelegate::UpdateGeolocationEnabled(const bool& isGeolocationAccessEnabled)
3204 {
3205     auto context = context_.Upgrade();
3206     if (!context) {
3207         return;
3208     }
3209     context->GetTaskExecutor()->PostTask(
3210         [weak = WeakClaim(this), isGeolocationAccessEnabled]() {
3211             auto delegate = weak.Upgrade();
3212             if (delegate && delegate->nweb_) {
3213                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3214                 CHECK_NULL_VOID(setting);
3215                 setting->PutGeolocationAllowed(isGeolocationAccessEnabled);
3216             }
3217         },
3218         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateGeolocationEnabled");
3219 }
3220 
UpdateCacheMode(const WebCacheMode & mode)3221 void WebDelegate::UpdateCacheMode(const WebCacheMode& mode)
3222 {
3223     auto context = context_.Upgrade();
3224     if (!context) {
3225         return;
3226     }
3227 
3228     context->GetTaskExecutor()->PostTask(
3229         [weak = WeakClaim(this), mode]() {
3230             auto delegate = weak.Upgrade();
3231             if (delegate && delegate->nweb_) {
3232                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3233                 CHECK_NULL_VOID(setting);
3234                 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(mode));
3235             }
3236         },
3237         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateCacheMode");
3238 }
3239 
GetNweb()3240 std::shared_ptr<OHOS::NWeb::NWeb> WebDelegate::GetNweb()
3241 {
3242     return nweb_;
3243 }
3244 
GetForceDarkMode()3245 bool WebDelegate::GetForceDarkMode()
3246 {
3247     return forceDarkMode_;
3248 }
3249 
UpdateDarkMode(const WebDarkMode & mode)3250 void WebDelegate::UpdateDarkMode(const WebDarkMode& mode)
3251 {
3252     auto context = context_.Upgrade();
3253     if (!context) {
3254         return;
3255     }
3256 
3257     current_dark_mode_ = mode;
3258     context->GetTaskExecutor()->PostTask(
3259         [weak = WeakClaim(this), mode]() {
3260             auto delegate = weak.Upgrade();
3261             CHECK_NULL_VOID(delegate);
3262             CHECK_NULL_VOID(delegate->nweb_);
3263             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3264             CHECK_NULL_VOID(setting);
3265 
3266             if (mode == WebDarkMode::On) {
3267                 setting->PutDarkSchemeEnabled(true);
3268                 if (delegate->forceDarkMode_) {
3269                     setting->PutForceDarkModeEnabled(true);
3270                 }
3271             } else if (mode == WebDarkMode::Off) {
3272                 setting->PutDarkSchemeEnabled(false);
3273                 setting->PutForceDarkModeEnabled(false);
3274             } else if (mode == WebDarkMode::Auto) {
3275                 delegate->UpdateDarkModeAuto(delegate, setting);
3276             }
3277         },
3278         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDarkMode");
3279 }
3280 
UpdateDarkModeAuto(RefPtr<WebDelegate> delegate,std::shared_ptr<OHOS::NWeb::NWebPreference> setting)3281 void WebDelegate::UpdateDarkModeAuto(RefPtr<WebDelegate> delegate, std::shared_ptr<OHOS::NWeb::NWebPreference> setting)
3282 {
3283     CHECK_NULL_VOID(setting);
3284     auto abilityContext = OHOS::AbilityRuntime::Context::GetApplicationContext();
3285     CHECK_NULL_VOID(abilityContext);
3286     auto appConfig = abilityContext->GetConfiguration();
3287     CHECK_NULL_VOID(appConfig);
3288     auto colorMode = appConfig->GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
3289     if (colorMode == "dark") {
3290         setting->PutDarkSchemeEnabled(true);
3291         if (delegate->GetForceDarkMode()) {
3292             setting->PutForceDarkModeEnabled(true);
3293         }
3294     }
3295     if (colorMode == "light") {
3296         setting->PutDarkSchemeEnabled(false);
3297         setting->PutForceDarkModeEnabled(false);
3298     }
3299 }
3300 
UpdateForceDarkAccess(const bool & access)3301 void WebDelegate::UpdateForceDarkAccess(const bool& access)
3302 {
3303     auto context = context_.Upgrade();
3304     if (!context) {
3305         return;
3306     }
3307     context->GetTaskExecutor()->PostTask(
3308         [weak = WeakClaim(this), access]() {
3309             auto delegate = weak.Upgrade();
3310             CHECK_NULL_VOID(delegate);
3311             CHECK_NULL_VOID(delegate->nweb_);
3312             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3313             CHECK_NULL_VOID(setting);
3314             delegate->forceDarkMode_ = access;
3315             if (setting->DarkSchemeEnabled()) {
3316                 setting->PutForceDarkModeEnabled(access);
3317             } else {
3318                 setting->PutForceDarkModeEnabled(false);
3319             }
3320         },
3321         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateForceDarkAccess");
3322 }
3323 
UpdateAudioResumeInterval(const int32_t & resumeInterval)3324 void WebDelegate::UpdateAudioResumeInterval(const int32_t& resumeInterval)
3325 {
3326     auto context = context_.Upgrade();
3327     if (!context) {
3328         return;
3329     }
3330     context->GetTaskExecutor()->PostTask(
3331         [weak = WeakClaim(this), resumeInterval]() {
3332             auto delegate = weak.Upgrade();
3333             CHECK_NULL_VOID(delegate);
3334             CHECK_NULL_VOID(delegate->nweb_);
3335             delegate->nweb_->SetAudioResumeInterval(resumeInterval);
3336         },
3337         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAudioResumeInterval");
3338 }
3339 
UpdateAudioExclusive(const bool & audioExclusive)3340 void WebDelegate::UpdateAudioExclusive(const bool& audioExclusive)
3341 {
3342     auto context = context_.Upgrade();
3343     if (!context) {
3344         return;
3345     }
3346     context->GetTaskExecutor()->PostTask(
3347         [weak = WeakClaim(this), audioExclusive]() {
3348             auto delegate = weak.Upgrade();
3349             CHECK_NULL_VOID(delegate);
3350             CHECK_NULL_VOID(delegate->nweb_);
3351             delegate->nweb_->SetAudioExclusive(audioExclusive);
3352         },
3353         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAudioExclusive");
3354 }
3355 
UpdateOverviewModeEnabled(const bool & isOverviewModeAccessEnabled)3356 void WebDelegate::UpdateOverviewModeEnabled(const bool& isOverviewModeAccessEnabled)
3357 {
3358     auto context = context_.Upgrade();
3359     if (!context) {
3360         return;
3361     }
3362     context->GetTaskExecutor()->PostTask(
3363         [weak = WeakClaim(this), isOverviewModeAccessEnabled]() {
3364             auto delegate = weak.Upgrade();
3365             if (delegate && delegate->nweb_) {
3366                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3367                 CHECK_NULL_VOID(setting);
3368                 setting->PutLoadWithOverviewMode(isOverviewModeAccessEnabled);
3369             }
3370         },
3371         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateOverviewModeEnabled");
3372 }
3373 
UpdateFileFromUrlEnabled(const bool & isFileFromUrlAccessEnabled)3374 void WebDelegate::UpdateFileFromUrlEnabled(const bool& isFileFromUrlAccessEnabled)
3375 {
3376     auto context = context_.Upgrade();
3377     if (!context) {
3378         return;
3379     }
3380     context->GetTaskExecutor()->PostTask(
3381         [weak = WeakClaim(this), isFileFromUrlAccessEnabled]() {
3382             auto delegate = weak.Upgrade();
3383             if (delegate && delegate->nweb_) {
3384                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3385                 CHECK_NULL_VOID(setting);
3386                 setting->PutEnableRawFileAccessFromFileURLs(isFileFromUrlAccessEnabled);
3387             }
3388         },
3389         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateFileFromUrlEnabled");
3390 }
3391 
UpdateDatabaseEnabled(const bool & isDatabaseAccessEnabled)3392 void WebDelegate::UpdateDatabaseEnabled(const bool& isDatabaseAccessEnabled)
3393 {
3394     auto context = context_.Upgrade();
3395     if (!context) {
3396         return;
3397     }
3398     context->GetTaskExecutor()->PostTask(
3399         [weak = WeakClaim(this), isDatabaseAccessEnabled]() {
3400             auto delegate = weak.Upgrade();
3401             if (delegate && delegate->nweb_) {
3402                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3403                 CHECK_NULL_VOID(setting);
3404                 setting->PutDatabaseAllowed(isDatabaseAccessEnabled);
3405             }
3406         },
3407         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDatabaseEnabled");
3408 }
3409 
UpdateTextZoomRatio(const int32_t & textZoomRatioNum)3410 void WebDelegate::UpdateTextZoomRatio(const int32_t& textZoomRatioNum)
3411 {
3412     auto context = context_.Upgrade();
3413     if (!context) {
3414         return;
3415     }
3416     context->GetTaskExecutor()->PostTask(
3417         [weak = WeakClaim(this), textZoomRatioNum]() {
3418             auto delegate = weak.Upgrade();
3419             if (delegate && delegate->nweb_) {
3420                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3421                 CHECK_NULL_VOID(setting);
3422                 setting->PutZoomingForTextFactor(textZoomRatioNum);
3423             }
3424         },
3425         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateTextZoomRatio");
3426 }
3427 
UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)3428 void WebDelegate::UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)
3429 {
3430     auto context = context_.Upgrade();
3431     if (!context) {
3432         return;
3433     }
3434     context->GetTaskExecutor()->PostTask(
3435         [weak = WeakClaim(this), isWebDebuggingAccessEnabled]() {
3436             auto delegate = weak.Upgrade();
3437             if (delegate && delegate->nweb_) {
3438                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3439                 CHECK_NULL_VOID(setting);
3440                 setting->PutWebDebuggingAccess(isWebDebuggingAccessEnabled);
3441             }
3442         },
3443         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDebuggingAccess");
3444 }
3445 
UpdatePinchSmoothModeEnabled(bool isPinchSmoothModeEnabled)3446 void WebDelegate::UpdatePinchSmoothModeEnabled(bool isPinchSmoothModeEnabled)
3447 {
3448     auto context = context_.Upgrade();
3449     if (!context) {
3450         return;
3451     }
3452     context->GetTaskExecutor()->PostTask(
3453         [weak = WeakClaim(this), isPinchSmoothModeEnabled]() {
3454             auto delegate = weak.Upgrade();
3455             if (delegate && delegate->nweb_) {
3456                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3457                 CHECK_NULL_VOID(setting);
3458                 setting->PutPinchSmoothMode(isPinchSmoothModeEnabled);
3459             }
3460         },
3461         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdatePinchSmoothModeEnabled");
3462 }
3463 
UpdateMediaPlayGestureAccess(bool isNeedGestureAccess)3464 void WebDelegate::UpdateMediaPlayGestureAccess(bool isNeedGestureAccess)
3465 {
3466     auto context = context_.Upgrade();
3467     if (!context) {
3468         return;
3469     }
3470     context->GetTaskExecutor()->PostTask(
3471         [weak = WeakClaim(this), isNeedGestureAccess]() {
3472             auto delegate = weak.Upgrade();
3473             if (delegate && delegate->nweb_) {
3474                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3475                 if (setting) {
3476                     setting->PutMediaPlayGestureAccess(isNeedGestureAccess);
3477                 }
3478             }
3479         },
3480         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMediaPlayGestureAccess");
3481 }
3482 
UpdateMultiWindowAccess(bool isMultiWindowAccessEnabled)3483 void WebDelegate::UpdateMultiWindowAccess(bool isMultiWindowAccessEnabled)
3484 {
3485     auto context = context_.Upgrade();
3486     if (!context) {
3487         return;
3488     }
3489     context->GetTaskExecutor()->PostTask(
3490         [weak = WeakClaim(this), isMultiWindowAccessEnabled]() {
3491             auto delegate = weak.Upgrade();
3492             if (delegate && delegate->nweb_) {
3493                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3494                 CHECK_NULL_VOID(setting);
3495                 setting->PutMultiWindowAccess(isMultiWindowAccessEnabled);
3496             }
3497         },
3498         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMultiWindowAccess");
3499 }
3500 
UpdateAllowWindowOpenMethod(bool isAllowWindowOpenMethod)3501 void WebDelegate::UpdateAllowWindowOpenMethod(bool isAllowWindowOpenMethod)
3502 {
3503     auto context = context_.Upgrade();
3504     if (!context) {
3505         return;
3506     }
3507     context->GetTaskExecutor()->PostTask(
3508         [weak = WeakClaim(this), isAllowWindowOpenMethod]() {
3509             auto delegate = weak.Upgrade();
3510             if (delegate && delegate->nweb_) {
3511                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3512                 CHECK_NULL_VOID(setting);
3513                 setting->PutIsCreateWindowsByJavaScriptAllowed(isAllowWindowOpenMethod);
3514             }
3515         },
3516         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateAllowWindowOpen");
3517 }
3518 
UpdateWebCursiveFont(const std::string & cursiveFontFamily)3519 void WebDelegate::UpdateWebCursiveFont(const std::string& cursiveFontFamily)
3520 {
3521     auto context = context_.Upgrade();
3522     if (!context) {
3523         return;
3524     }
3525     context->GetTaskExecutor()->PostTask(
3526         [weak = WeakClaim(this), cursiveFontFamily]() {
3527             auto delegate = weak.Upgrade();
3528             if (delegate && delegate->nweb_) {
3529                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3530                 if (setting) {
3531                     setting->PutCursiveFontFamilyName(cursiveFontFamily);
3532                 }
3533             }
3534         },
3535         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebCursiveFont");
3536 }
3537 
UpdateWebFantasyFont(const std::string & fantasyFontFamily)3538 void WebDelegate::UpdateWebFantasyFont(const std::string& fantasyFontFamily)
3539 {
3540     auto context = context_.Upgrade();
3541     if (!context) {
3542         return;
3543     }
3544     context->GetTaskExecutor()->PostTask(
3545         [weak = WeakClaim(this), fantasyFontFamily]() {
3546             auto delegate = weak.Upgrade();
3547             if (delegate && delegate->nweb_) {
3548                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3549                 if (setting) {
3550                     setting->PutFantasyFontFamilyName(fantasyFontFamily);
3551                 }
3552             }
3553         },
3554         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebFantasyFont");
3555 }
3556 
UpdateWebFixedFont(const std::string & fixedFontFamily)3557 void WebDelegate::UpdateWebFixedFont(const std::string& fixedFontFamily)
3558 {
3559     auto context = context_.Upgrade();
3560     if (!context) {
3561         return;
3562     }
3563     context->GetTaskExecutor()->PostTask(
3564         [weak = WeakClaim(this), fixedFontFamily]() {
3565             auto delegate = weak.Upgrade();
3566             if (delegate && delegate->nweb_) {
3567                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3568                 if (setting) {
3569                     setting->PutFixedFontFamilyName(fixedFontFamily);
3570                 }
3571             }
3572         },
3573         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebFixedFont");
3574 }
3575 
UpdateWebSansSerifFont(const std::string & sansSerifFontFamily)3576 void WebDelegate::UpdateWebSansSerifFont(const std::string& sansSerifFontFamily)
3577 {
3578     auto context = context_.Upgrade();
3579     if (!context) {
3580         return;
3581     }
3582     context->GetTaskExecutor()->PostTask(
3583         [weak = WeakClaim(this), sansSerifFontFamily]() {
3584             auto delegate = weak.Upgrade();
3585             if (delegate && delegate->nweb_) {
3586                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3587                 if (setting) {
3588                     setting->PutSansSerifFontFamilyName(sansSerifFontFamily);
3589                 }
3590             }
3591         },
3592         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebSansSerifFont");
3593 }
3594 
UpdateWebSerifFont(const std::string & serifFontFamily)3595 void WebDelegate::UpdateWebSerifFont(const std::string& serifFontFamily)
3596 {
3597     auto context = context_.Upgrade();
3598     if (!context) {
3599         return;
3600     }
3601     context->GetTaskExecutor()->PostTask(
3602         [weak = WeakClaim(this), serifFontFamily]() {
3603             auto delegate = weak.Upgrade();
3604             if (delegate && delegate->nweb_) {
3605                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3606                 if (setting) {
3607                     setting->PutSerifFontFamilyName(serifFontFamily);
3608                 }
3609             }
3610         },
3611         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebSerifFont");
3612 }
3613 
UpdateWebStandardFont(const std::string & standardFontFamily)3614 void WebDelegate::UpdateWebStandardFont(const std::string& standardFontFamily)
3615 {
3616     auto context = context_.Upgrade();
3617     if (!context) {
3618         return;
3619     }
3620     context->GetTaskExecutor()->PostTask(
3621         [weak = WeakClaim(this), standardFontFamily]() {
3622             auto delegate = weak.Upgrade();
3623             if (delegate && delegate->nweb_) {
3624                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3625                 if (setting) {
3626                     setting->PutStandardFontFamilyName(standardFontFamily);
3627                 }
3628             }
3629         },
3630         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateWebStandardFont");
3631 }
3632 
UpdateDefaultFixedFontSize(int32_t defaultFixedFontSize)3633 void WebDelegate::UpdateDefaultFixedFontSize(int32_t defaultFixedFontSize)
3634 {
3635     auto context = context_.Upgrade();
3636     if (!context) {
3637         return;
3638     }
3639     context->GetTaskExecutor()->PostTask(
3640         [weak = WeakClaim(this), defaultFixedFontSize]() {
3641             auto delegate = weak.Upgrade();
3642             if (delegate && delegate->nweb_) {
3643                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3644                 if (setting) {
3645                     setting->PutDefaultFixedFontSize(defaultFixedFontSize);
3646                 }
3647             }
3648         },
3649         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDefaultFixedFontSize");
3650 }
3651 
OnConfigurationUpdated(const OHOS::AppExecFwk::Configuration & configuration)3652 void WebDelegate::OnConfigurationUpdated(const OHOS::AppExecFwk::Configuration& configuration)
3653 {
3654     auto context = context_.Upgrade();
3655     CHECK_NULL_VOID(context);
3656 
3657     auto executor = context->GetTaskExecutor();
3658     CHECK_NULL_VOID(executor);
3659 
3660     std::string colorMode = configuration.GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
3661     std::string themeTag = configuration.GetItem(OHOS::AAFwk::GlobalConfigurationKey::THEME);
3662     uint8_t themeFlags = static_cast<uint8_t>(OHOS::NWeb::SystemThemeFlags::NONE);
3663     if (!themeTag.empty()) {
3664         std::unique_ptr<JsonValue> json = JsonUtil::ParseJsonString(themeTag);
3665         if (json->GetInt("fonts")) {
3666             themeFlags |= static_cast<uint8_t>(OHOS::NWeb::SystemThemeFlags::THEME_FONT);
3667             TAG_LOGI(AceLogTag::ACE_WEB, "OnConfigurationUpdated fonts:%{public}s", themeTag.c_str());
3668         }
3669     }
3670 
3671     executor->PostTask(
3672         [weak = WeakClaim(this), colorMode, themeFlags, dark_mode = current_dark_mode_]() {
3673             auto delegate = weak.Upgrade();
3674             CHECK_NULL_VOID(delegate);
3675             auto nweb = delegate->GetNweb();
3676             CHECK_NULL_VOID(nweb);
3677 
3678             std::shared_ptr<NWebSystemConfigurationImpl> configuration =
3679                     std::make_shared<NWebSystemConfigurationImpl>(themeFlags);
3680             nweb->OnConfigurationUpdated(configuration);
3681 
3682             auto setting = nweb->GetPreference();
3683             CHECK_NULL_VOID(setting);
3684             bool auto_dark_mode = (dark_mode == WebDarkMode::Auto);
3685             if (auto_dark_mode && colorMode == "dark") {
3686                 setting->PutDarkSchemeEnabled(true);
3687                 if (delegate->GetForceDarkMode()) {
3688                     setting->PutForceDarkModeEnabled(true);
3689                 }
3690             } else if (auto_dark_mode && colorMode == "light") {
3691                 setting->PutDarkSchemeEnabled(false);
3692                 setting->PutForceDarkModeEnabled(false);
3693             }
3694         },
3695         TaskExecutor::TaskType::PLATFORM, "ArkUIWebConfigurationUpdated");
3696 }
3697 
UpdateDefaultFontSize(int32_t defaultFontSize)3698 void WebDelegate::UpdateDefaultFontSize(int32_t defaultFontSize)
3699 {
3700     auto context = context_.Upgrade();
3701     if (!context) {
3702         return;
3703     }
3704     context->GetTaskExecutor()->PostTask(
3705         [weak = WeakClaim(this), defaultFontSize]() {
3706             auto delegate = weak.Upgrade();
3707             if (delegate && delegate->nweb_) {
3708                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3709                 if (setting) {
3710                     setting->PutDefaultFontSize(defaultFontSize);
3711                 }
3712             }
3713         },
3714         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDefaultFontSize");
3715 }
3716 
UpdateMinFontSize(int32_t minFontSize)3717 void WebDelegate::UpdateMinFontSize(int32_t minFontSize)
3718 {
3719     auto context = context_.Upgrade();
3720     if (!context) {
3721         return;
3722     }
3723     context->GetTaskExecutor()->PostTask(
3724         [weak = WeakClaim(this), minFontSize]() {
3725             auto delegate = weak.Upgrade();
3726             if (delegate && delegate->nweb_) {
3727                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3728                 if (setting) {
3729                     setting->PutFontSizeLowerLimit(minFontSize);
3730                 }
3731             }
3732         },
3733         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMinFontSize");
3734 }
3735 
UpdateMinLogicalFontSize(int32_t minLogicalFontSize)3736 void WebDelegate::UpdateMinLogicalFontSize(int32_t minLogicalFontSize)
3737 {
3738     auto context = context_.Upgrade();
3739     if (!context) {
3740         return;
3741     }
3742     context->GetTaskExecutor()->PostTask(
3743         [weak = WeakClaim(this), minLogicalFontSize]() {
3744             auto delegate = weak.Upgrade();
3745             if (delegate && delegate->nweb_) {
3746                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3747                 if (setting) {
3748                     setting->PutLogicalFontSizeLowerLimit(minLogicalFontSize);
3749                 }
3750             }
3751         },
3752         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMinLogicalFontSize");
3753 }
3754 
UpdateBlockNetwork(bool isNetworkBlocked)3755 void WebDelegate::UpdateBlockNetwork(bool isNetworkBlocked)
3756 {
3757     auto context = context_.Upgrade();
3758     if (!context) {
3759         return;
3760     }
3761     context->GetTaskExecutor()->PostTask(
3762         [weak = WeakClaim(this), isNetworkBlocked]() {
3763             auto delegate = weak.Upgrade();
3764             if (delegate && delegate->nweb_) {
3765                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3766                 if (setting) {
3767                     setting->PutBlockNetwork(isNetworkBlocked);
3768                 }
3769             }
3770         },
3771         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBlockNetwork");
3772 }
3773 
UpdateHorizontalScrollBarAccess(bool isHorizontalScrollBarAccessEnabled)3774 void WebDelegate::UpdateHorizontalScrollBarAccess(bool isHorizontalScrollBarAccessEnabled)
3775 {
3776     auto context = context_.Upgrade();
3777     if (!context) {
3778         return;
3779     }
3780     context->GetTaskExecutor()->PostTask(
3781         [weak = WeakClaim(this), isHorizontalScrollBarAccessEnabled]() {
3782             auto delegate = weak.Upgrade();
3783             if (delegate && delegate->nweb_) {
3784                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3785                 if (setting) {
3786                     setting->PutHorizontalScrollBarAccess(isHorizontalScrollBarAccessEnabled);
3787                 }
3788             }
3789         },
3790         TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutHorizontalScrollBarAccess");
3791 }
3792 
UpdateVerticalScrollBarAccess(bool isVerticalScrollBarAccessEnabled)3793 void WebDelegate::UpdateVerticalScrollBarAccess(bool isVerticalScrollBarAccessEnabled)
3794 {
3795     auto context = context_.Upgrade();
3796     if (!context) {
3797         return;
3798     }
3799     context->GetTaskExecutor()->PostTask(
3800         [weak = WeakClaim(this), isVerticalScrollBarAccessEnabled]() {
3801             auto delegate = weak.Upgrade();
3802             if (delegate && delegate->nweb_) {
3803                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3804                 if (setting) {
3805                     setting->PutVerticalScrollBarAccess(isVerticalScrollBarAccessEnabled);
3806                 }
3807             }
3808         },
3809         TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutVerticalScrollBarAccess");
3810 }
3811 
UpdateOverlayScrollbarEnabled(bool isEnabled)3812 void WebDelegate::UpdateOverlayScrollbarEnabled(bool isEnabled)
3813 {
3814     auto context = context_.Upgrade();
3815     if (!context) {
3816         return;
3817     }
3818     context->GetTaskExecutor()->PostTask(
3819         [weak = WeakClaim(this), isEnabled]() {
3820             auto delegate = weak.Upgrade();
3821             if (delegate && delegate->nweb_) {
3822                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3823                 if (setting) {
3824                     setting->PutOverlayScrollbarEnabled(isEnabled);
3825                 }
3826             }
3827         },
3828         TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutOverlayScrollbarEnabled");
3829 }
3830 
UpdateNativeEmbedModeEnabled(bool isEmbedModeEnabled)3831 void WebDelegate::UpdateNativeEmbedModeEnabled(bool isEmbedModeEnabled)
3832 {
3833     auto context = context_.Upgrade();
3834     if (!context) {
3835         return;
3836     }
3837     isEmbedModeEnabled_ = isEmbedModeEnabled;
3838     context->GetTaskExecutor()->PostTask(
3839         [weak = WeakClaim(this), isEmbedModeEnabled]() {
3840             auto delegate = weak.Upgrade();
3841             if (delegate && delegate->nweb_) {
3842                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3843                 if (setting) {
3844                     setting->SetNativeEmbedMode(isEmbedModeEnabled);
3845                 }
3846             }
3847         },
3848         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetNativeEmbedMode");
3849 }
3850 
UpdateNativeEmbedRuleTag(const std::string & tag)3851 void WebDelegate::UpdateNativeEmbedRuleTag(const std::string& tag)
3852 {
3853     auto context = context_.Upgrade();
3854     if (!context) {
3855         return;
3856     }
3857     tag_ = tag;
3858     if (tag_.empty() || tag_type_.empty()) {
3859         return;
3860     }
3861 
3862     context->GetTaskExecutor()->PostTask(
3863         [weak = WeakClaim(this)]() {
3864             auto delegate = weak.Upgrade();
3865             if (delegate && delegate->nweb_) {
3866                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3867                 if (setting) {
3868                     setting->RegisterNativeEmbedRule(delegate->tag_, delegate->tag_type_);
3869                 }
3870             }
3871         },
3872         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateNativeEmbedRuleTag");
3873 }
3874 
UpdateNativeEmbedRuleType(const std::string & type)3875 void WebDelegate::UpdateNativeEmbedRuleType(const std::string& type)
3876 {
3877     auto context = context_.Upgrade();
3878     if (!context) {
3879         return;
3880     }
3881     tag_type_ = type;
3882     if (tag_.empty() || tag_type_.empty()) {
3883         return;
3884     }
3885     context->GetTaskExecutor()->PostTask(
3886         [weak = WeakClaim(this)]() {
3887             auto delegate = weak.Upgrade();
3888             if (delegate && delegate->nweb_) {
3889                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3890                 if (setting) {
3891                     setting->RegisterNativeEmbedRule(delegate->tag_, delegate->tag_type_);
3892                 }
3893             }
3894         },
3895         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateNativeEmbedRuleType");
3896 }
3897 
UpdateScrollBarColor(const std::string & colorValue)3898 void WebDelegate::UpdateScrollBarColor(const std::string& colorValue)
3899 {
3900     auto context = context_.Upgrade();
3901     if (!context) {
3902         return;
3903     }
3904 
3905     auto pipeline = PipelineContext::GetCurrentContext();
3906     if (pipeline == nullptr) {
3907         return;
3908     }
3909 
3910     auto themeManager = pipeline->GetThemeManager();
3911     if (themeManager == nullptr) {
3912         return;
3913     }
3914 
3915     auto themeConstants = themeManager->GetThemeConstants();
3916     if (themeConstants == nullptr) {
3917         return;
3918     }
3919     Color color = themeConstants->GetColorByName(colorValue);
3920     uint32_t colorContent = color.GetValue();
3921     context->GetTaskExecutor()->PostTask(
3922         [weak = WeakClaim(this), colorContent]() {
3923             auto delegate = weak.Upgrade();
3924             if (delegate && delegate->nweb_) {
3925                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3926                 if (setting) {
3927                     setting->PutScrollBarColor(colorContent);
3928                 }
3929             }
3930         },
3931         TaskExecutor::TaskType::PLATFORM, "ArkUIWebPutScrollBarColor");
3932 }
3933 
LoadUrl()3934 void WebDelegate::LoadUrl()
3935 {
3936     auto context = context_.Upgrade();
3937     CHECK_NULL_VOID(context);
3938     context->GetTaskExecutor()->PostTask(
3939         [weak = WeakClaim(this)]() {
3940             auto delegate = weak.Upgrade();
3941             if (delegate && delegate->nweb_) {
3942                 std::optional<std::string> src;
3943                 if (Container::IsCurrentUseNewPipeline()) {
3944                     auto webPattern = delegate->webPattern_.Upgrade();
3945                     if (webPattern) {
3946                         src = webPattern->GetWebSrc();
3947                     }
3948                 } else {
3949                     auto webCom = delegate->webComponent_.Upgrade();
3950                     if (webCom) {
3951                         src = webCom->GetSrc();
3952                     }
3953                 }
3954                 CHECK_NULL_VOID(src);
3955                 delegate->nweb_->Load(src.value());
3956             }
3957         },
3958         TaskExecutor::TaskType::PLATFORM, "ArkUIWebLoadSrcUrl");
3959 }
3960 
OnInactive()3961 void WebDelegate::OnInactive()
3962 {
3963     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnInactive, webId:%{public}d", GetWebId());
3964     auto context = context_.Upgrade();
3965     if (!context) {
3966         return;
3967     }
3968     context->GetTaskExecutor()->PostTask(
3969         [weak = WeakClaim(this)]() {
3970             auto delegate = weak.Upgrade();
3971             if (!delegate) {
3972                 return;
3973             }
3974             if (delegate->nweb_) {
3975                 delegate->nweb_->OnPause();
3976             }
3977         },
3978         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnInactive");
3979 }
3980 
OnActive()3981 void WebDelegate::OnActive()
3982 {
3983     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnActive, webId:%{public}d", GetWebId());
3984     auto context = context_.Upgrade();
3985     if (!context) {
3986         return;
3987     }
3988     context->GetTaskExecutor()->PostTask(
3989         [weak = WeakClaim(this)]() {
3990             auto delegate = weak.Upgrade();
3991             if (!delegate) {
3992                 return;
3993             }
3994             if (delegate->nweb_) {
3995                 delegate->nweb_->OnContinue();
3996             }
3997         },
3998         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnActive");
3999 }
4000 
GestureBackBlur()4001 void WebDelegate::GestureBackBlur()
4002 {
4003     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::GestureBackBlur, webId:%{public}d", GetWebId());
4004     auto context = context_.Upgrade();
4005     if (!context) {
4006         return;
4007     }
4008     context->GetTaskExecutor()->PostTask(
4009         [weak = WeakClaim(this)]() {
4010             auto delegate = weak.Upgrade();
4011             if (!delegate) {
4012                 return;
4013             }
4014             if (delegate->nweb_) {
4015                 delegate->nweb_->WebComponentsBlur();
4016             }
4017         },
4018         TaskExecutor::TaskType::PLATFORM, "ArkUIWebGestureBackBlur");
4019 }
4020 
OnWebviewHide()4021 void WebDelegate::OnWebviewHide()
4022 {
4023     auto context = context_.Upgrade();
4024     if (!context) {
4025         return;
4026     }
4027     context->GetTaskExecutor()->PostTask(
4028         [weak = WeakClaim(this)]() {
4029             auto delegate = weak.Upgrade();
4030             if (!delegate) {
4031                 return;
4032             }
4033             if (delegate->nweb_) {
4034                 delegate->nweb_->OnWebviewHide();
4035             }
4036         },
4037         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnWebviewHide");
4038 }
4039 
OnWebviewShow()4040 void WebDelegate::OnWebviewShow()
4041 {
4042     auto context = context_.Upgrade();
4043     if (!context) {
4044         return;
4045     }
4046     context->GetTaskExecutor()->PostTask(
4047         [weak = WeakClaim(this)]() {
4048             auto delegate = weak.Upgrade();
4049             if (!delegate) {
4050                 return;
4051             }
4052             if (delegate->nweb_) {
4053                 delegate->nweb_->OnWebviewShow();
4054             }
4055         },
4056         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnWebviewShow");
4057 }
4058 
OnRenderToForeground()4059 void WebDelegate::OnRenderToForeground()
4060 {
4061     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnRenderToForeground");
4062     auto context = context_.Upgrade();
4063     if (!context) {
4064         return;
4065     }
4066     context->GetTaskExecutor()->PostTask(
4067         [weak = WeakClaim(this)]() {
4068             auto delegate = weak.Upgrade();
4069             if (!delegate) {
4070                 return;
4071             }
4072             if (delegate->nweb_) {
4073                 TAG_LOGD(AceLogTag::ACE_WEB, "delegate->nweb_->OnRenderToForeground");
4074                 delegate->nweb_->OnRenderToForeground();
4075             }
4076         },
4077         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnRenderToForeground");
4078 }
4079 
OnRenderToBackground()4080 void WebDelegate::OnRenderToBackground()
4081 {
4082     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnRenderToBackground");
4083     auto context = context_.Upgrade();
4084     if (!context) {
4085         return;
4086     }
4087     context->GetTaskExecutor()->PostTask(
4088         [weak = WeakClaim(this)]() {
4089             auto delegate = weak.Upgrade();
4090             if (!delegate) {
4091                 return;
4092             }
4093             if (delegate->nweb_) {
4094                 TAG_LOGD(AceLogTag::ACE_WEB, "delegate->nweb_->OnRenderToBackground");
4095                 delegate->nweb_->OnRenderToBackground();
4096             }
4097         },
4098         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnRenderToBackground");
4099 }
4100 
OnOnlineRenderToForeground()4101 void WebDelegate::OnOnlineRenderToForeground()
4102 {
4103     TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::OnOnlineRenderToForeground");
4104     auto context = context_.Upgrade();
4105     if (!context) {
4106         return;
4107     }
4108     context->GetTaskExecutor()->PostTask(
4109         [weak = WeakClaim(this)]() {
4110             auto delegate = weak.Upgrade();
4111             if (!delegate) {
4112                 return;
4113             }
4114             if (delegate->nweb_) {
4115                 TAG_LOGD(AceLogTag::ACE_WEB, "delegate->nweb_->OnOnlineRenderToForeground");
4116                 delegate->nweb_->OnOnlineRenderToForeground();
4117             }
4118         },
4119         TaskExecutor::TaskType::PLATFORM, "ArkUIWebOnOnlineRenderToForeground");
4120 }
4121 
SetShouldFrameSubmissionBeforeDraw(bool should)4122 void WebDelegate::SetShouldFrameSubmissionBeforeDraw(bool should)
4123 {
4124     auto context = context_.Upgrade();
4125     if (!context) {
4126         return;
4127     }
4128     context->GetTaskExecutor()->PostTask(
4129         [weak = WeakClaim(this), should]() {
4130             auto delegate = weak.Upgrade();
4131             if (!delegate) {
4132                 return;
4133             }
4134             if (delegate->nweb_) {
4135                 delegate->nweb_->SetShouldFrameSubmissionBeforeDraw(should);
4136             }
4137         },
4138         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetShouldFrameSubmissionBeforeDraw");
4139 }
4140 
NotifyMemoryLevel(int32_t level)4141 void WebDelegate::NotifyMemoryLevel(int32_t level)
4142 {
4143     auto context = context_.Upgrade();
4144     if (!context) {
4145         return;
4146     }
4147     context->GetTaskExecutor()->PostTask(
4148         [weak = WeakClaim(this), level]() {
4149             auto delegate = weak.Upgrade();
4150             if (!delegate) {
4151                 return;
4152             }
4153             if (delegate->nweb_) {
4154                 delegate->nweb_->NotifyMemoryLevel(level);
4155             }
4156         },
4157         TaskExecutor::TaskType::PLATFORM, "ArkUIWebNotifyMemoryLevel");
4158 }
4159 
SetAudioMuted(bool muted)4160 void WebDelegate::SetAudioMuted(bool muted)
4161 {
4162     ACE_DCHECK(nweb_ != nullptr);
4163     if (nweb_) {
4164         nweb_->SetAudioMuted(muted);
4165     }
4166 }
4167 
Zoom(float factor)4168 void WebDelegate::Zoom(float factor)
4169 {
4170     auto context = context_.Upgrade();
4171     if (!context) {
4172         return;
4173     }
4174 
4175     context->GetTaskExecutor()->PostTask(
4176         [weak = WeakClaim(this), factor]() {
4177             auto delegate = weak.Upgrade();
4178             if (!delegate) {
4179                 return;
4180             }
4181             if (delegate->nweb_) {
4182                 delegate->nweb_->Zoom(factor);
4183             }
4184         },
4185         TaskExecutor::TaskType::PLATFORM, "ArkUIWebZoom");
4186 }
4187 
ZoomIn()4188 bool WebDelegate::ZoomIn()
4189 {
4190     auto context = context_.Upgrade();
4191     if (!context) {
4192         return false;
4193     }
4194     bool result = false;
4195     context->GetTaskExecutor()->PostSyncTask(
4196         [weak = WeakClaim(this), &result]() {
4197             auto delegate = weak.Upgrade();
4198             if (!delegate) {
4199                 return;
4200             }
4201             if (delegate->nweb_) {
4202                 result = delegate->nweb_->ZoomIn();
4203             }
4204         },
4205         TaskExecutor::TaskType::PLATFORM, "ArkUIWebZoomIn");
4206     return result;
4207 }
4208 
ZoomOut()4209 bool WebDelegate::ZoomOut()
4210 {
4211     auto context = context_.Upgrade();
4212     if (!context) {
4213         return false;
4214     }
4215     bool result = false;
4216     context->GetTaskExecutor()->PostSyncTask(
4217         [weak = WeakClaim(this), &result]() {
4218             auto delegate = weak.Upgrade();
4219             if (!delegate) {
4220                 return;
4221             }
4222             if (delegate->nweb_) {
4223                 result = delegate->nweb_->ZoomOut();
4224             }
4225         },
4226         TaskExecutor::TaskType::PLATFORM, "ArkUIWebZoomOut");
4227     return result;
4228 }
4229 
CreateWindow()4230 sptr<OHOS::Rosen::Window> WebDelegate::CreateWindow()
4231 {
4232     auto context = context_.Upgrade();
4233     if (!context) {
4234         return nullptr;
4235     }
4236     float scale = context->GetViewScale();
4237 
4238     constexpr int DEFAULT_HEIGHT = 1600;
4239     int DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR = (int)(scale * context->GetRootHeight());
4240     int DEFAULT_STATUS_BAR_HEIGHT = (DEFAULT_HEIGHT - DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR) / 2;
4241     constexpr int DEFAULT_LEFT = 0;
4242     int DEFAULT_TOP = DEFAULT_STATUS_BAR_HEIGHT;
4243     int DEFAULT_WIDTH = (int)(scale * context->GetRootWidth());
4244     sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
4245     option->SetWindowRect({ DEFAULT_LEFT, DEFAULT_TOP, DEFAULT_WIDTH, DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR });
4246     option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_LAUNCHING);
4247     option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
4248     auto window = Rosen::Window::Create("ohos_web_window", option);
4249     return window;
4250 }
4251 #endif
4252 
RegisterWebEvent()4253 void WebDelegate::RegisterWebEvent()
4254 {
4255     auto context = DynamicCast<PipelineContext>(context_.Upgrade());
4256     CHECK_NULL_VOID(context);
4257     auto resRegister = context->GetPlatformResRegister();
4258     if (resRegister == nullptr) {
4259         return;
4260     }
4261     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGESTART), [weak = WeakClaim(this)](const std::string& param) {
4262         auto delegate = weak.Upgrade();
4263         if (delegate) {
4264             delegate->OnPageStarted(param);
4265         }
4266     });
4267     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH), [weak = WeakClaim(this)](const std::string& param) {
4268         auto delegate = weak.Upgrade();
4269         if (delegate) {
4270             delegate->OnPageFinished(param);
4271         }
4272     });
4273     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR), [weak = WeakClaim(this)](const std::string& param) {
4274         auto delegate = weak.Upgrade();
4275         if (delegate) {
4276             delegate->OnPageError(param);
4277         }
4278     });
4279     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH), [weak = WeakClaim(this)](const std::string& param) {
4280         auto delegate = weak.Upgrade();
4281         if (delegate) {
4282             delegate->OnRouterPush(param);
4283         }
4284     });
4285     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE), [weak = WeakClaim(this)](const std::string& param) {
4286         auto delegate = weak.Upgrade();
4287         if (delegate) {
4288             delegate->OnMessage(param);
4289         }
4290     });
4291 }
4292 
4293 // upper ui component which inherited from WebComponent
4294 // could implement some curtain createdCallback to customized controller interface
4295 // eg: web.loadurl.
AddCreatedCallback(const CreatedCallback & createdCallback)4296 void WebDelegate::AddCreatedCallback(const CreatedCallback& createdCallback)
4297 {
4298     ACE_DCHECK(createdCallback != nullptr);
4299     ACE_DCHECK(state_ != State::RELEASED);
4300     createdCallbacks_.emplace_back(createdCallback);
4301 }
4302 
RemoveCreatedCallback()4303 void WebDelegate::RemoveCreatedCallback()
4304 {
4305     ACE_DCHECK(state_ != State::RELEASED);
4306     createdCallbacks_.pop_back();
4307 }
4308 
AddReleasedCallback(const ReleasedCallback & releasedCallback)4309 void WebDelegate::AddReleasedCallback(const ReleasedCallback& releasedCallback)
4310 {
4311     ACE_DCHECK(releasedCallback != nullptr && state_ != State::RELEASED);
4312     releasedCallbacks_.emplace_back(releasedCallback);
4313 }
4314 
RemoveReleasedCallback()4315 void WebDelegate::RemoveReleasedCallback()
4316 {
4317     ACE_DCHECK(state_ != State::RELEASED);
4318     releasedCallbacks_.pop_back();
4319 }
4320 
Reload()4321 void WebDelegate::Reload()
4322 {
4323 #ifdef OHOS_STANDARD_SYSTEM
4324     auto context = context_.Upgrade();
4325     if (!context) {
4326         return;
4327     }
4328     context->GetTaskExecutor()->PostTask(
4329         [weak = WeakClaim(this)]() {
4330             auto delegate = weak.Upgrade();
4331             if (!delegate) {
4332                 return;
4333             }
4334             if (delegate->nweb_) {
4335                 delegate->nweb_->Reload();
4336             }
4337         },
4338         TaskExecutor::TaskType::PLATFORM, "ArkUIWebReload");
4339 #else
4340     hash_ = MakeResourceHash();
4341     reloadMethod_ = MakeMethodHash("reload");
4342     CallResRegisterMethod(reloadMethod_, WEB_PARAM_NONE, nullptr);
4343 #endif
4344 }
4345 
UpdateUrl(const std::string & url)4346 void WebDelegate::UpdateUrl(const std::string& url)
4347 {
4348     hash_ = MakeResourceHash();
4349     updateUrlMethod_ = MakeMethodHash(WEB_METHOD_UPDATEURL);
4350     std::stringstream paramStream;
4351     paramStream << NTC_PARAM_SRC << WEB_PARAM_EQUALS << url;
4352     std::string param = paramStream.str();
4353     CallResRegisterMethod(updateUrlMethod_, param, nullptr);
4354 }
4355 
CallWebRouterBack()4356 void WebDelegate::CallWebRouterBack()
4357 {
4358     hash_ = MakeResourceHash();
4359     routerBackMethod_ = MakeMethodHash(WEB_METHOD_ROUTER_BACK);
4360     CallResRegisterMethod(routerBackMethod_, WEB_PARAM_NONE, nullptr);
4361 }
4362 
CallPopPageSuccessPageUrl(const std::string & url)4363 void WebDelegate::CallPopPageSuccessPageUrl(const std::string& url)
4364 {
4365     hash_ = MakeResourceHash();
4366     changePageUrlMethod_ = MakeMethodHash(WEB_METHOD_CHANGE_PAGE_URL);
4367     std::stringstream paramStream;
4368     paramStream << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS << url;
4369     std::string param = paramStream.str();
4370     CallResRegisterMethod(changePageUrlMethod_, param, nullptr);
4371 }
4372 
CallIsPagePathInvalid(const bool & isPageInvalid)4373 void WebDelegate::CallIsPagePathInvalid(const bool& isPageInvalid)
4374 {
4375     hash_ = MakeResourceHash();
4376     isPagePathInvalidMethod_ = MakeMethodHash(WEB_METHOD_PAGE_PATH_INVALID);
4377     std::stringstream paramStream;
4378     paramStream << NTC_PARAM_PAGE_INVALID << WEB_PARAM_EQUALS << isPageInvalid;
4379     std::string param = paramStream.str();
4380     CallResRegisterMethod(isPagePathInvalidMethod_, param, nullptr);
4381 }
4382 
RecordWebEvent(Recorder::EventType eventType,const std::string & param) const4383 void WebDelegate::RecordWebEvent(Recorder::EventType eventType, const std::string& param) const
4384 {
4385     if (!Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
4386         return;
4387     }
4388     auto pattern = webPattern_.Upgrade();
4389     CHECK_NULL_VOID(pattern);
4390     auto host = pattern->GetHost();
4391     CHECK_NULL_VOID(host);
4392     Recorder::EventParamsBuilder builder;
4393     builder.SetId(host->GetInspectorIdValue(""))
4394         .SetType(host->GetHostTag())
4395         .SetEventType(eventType)
4396         .SetText(param)
4397         .SetDescription(host->GetAutoEventParamValue(""));
4398     Recorder::EventRecorder::Get().OnEvent(std::move(builder));
4399 }
4400 
OnPageStarted(const std::string & param)4401 void WebDelegate::OnPageStarted(const std::string& param)
4402 {
4403     auto context = context_.Upgrade();
4404     CHECK_NULL_VOID(context);
4405     context->GetTaskExecutor()->PostTask(
4406         [weak = WeakClaim(this), param]() {
4407             auto delegate = weak.Upgrade();
4408             CHECK_NULL_VOID(delegate);
4409             auto webPattern = delegate->webPattern_.Upgrade();
4410             CHECK_NULL_VOID(webPattern);
4411             auto webEventHub = webPattern->GetWebEventHub();
4412             CHECK_NULL_VOID(webEventHub);
4413             webEventHub->FireOnPageStartedEvent(std::make_shared<LoadWebPageStartEvent>(param));
4414             delegate->RecordWebEvent(Recorder::EventType::WEB_PAGE_BEGIN, param);
4415         },
4416         TaskExecutor::TaskType::JS, "ArkUIWebPageStarted");
4417     auto pattern = webPattern_.Upgrade();
4418     CHECK_NULL_VOID(pattern);
4419     pattern->DestroyAnalyzerOverlay();
4420 }
4421 
OnPageFinished(const std::string & param)4422 void WebDelegate::OnPageFinished(const std::string& param)
4423 {
4424     auto context = context_.Upgrade();
4425     CHECK_NULL_VOID(context);
4426     context->GetTaskExecutor()->PostTask(
4427         [weak = WeakClaim(this), param]() {
4428             auto delegate = weak.Upgrade();
4429             CHECK_NULL_VOID(delegate);
4430             auto webPattern = delegate->webPattern_.Upgrade();
4431             CHECK_NULL_VOID(webPattern);
4432             auto webEventHub = webPattern->GetWebEventHub();
4433             CHECK_NULL_VOID(webEventHub);
4434             webEventHub->FireOnPageFinishedEvent(std::make_shared<LoadWebPageFinishEvent>(param));
4435             webPattern->OnScrollEndRecursive(std::nullopt);
4436             delegate->RecordWebEvent(Recorder::EventType::WEB_PAGE_END, param);
4437         },
4438         TaskExecutor::TaskType::JS, "ArkUIWebPageFinished");
4439 }
4440 
OnProgressChanged(int param)4441 void WebDelegate::OnProgressChanged(int param)
4442 {
4443     auto webPattern = webPattern_.Upgrade();
4444     CHECK_NULL_VOID(webPattern);
4445     webPattern->OnProgressChanged(param);
4446 
4447     auto context = context_.Upgrade();
4448     CHECK_NULL_VOID(context);
4449     context->GetTaskExecutor()->PostTask(
4450         [weak = WeakClaim(this), param]() {
4451             auto delegate = weak.Upgrade();
4452             CHECK_NULL_VOID(delegate);
4453             auto eventParam = std::make_shared<LoadWebProgressChangeEvent>(param);
4454             if (Container::IsCurrentUseNewPipeline()) {
4455                 auto webPattern = delegate->webPattern_.Upgrade();
4456                 CHECK_NULL_VOID(webPattern);
4457                 auto webEventHub = webPattern->GetWebEventHub();
4458                 CHECK_NULL_VOID(webEventHub);
4459                 webEventHub->FireOnProgressChangeEvent(eventParam);
4460                 return;
4461             }
4462             auto webCom = delegate->webComponent_.Upgrade();
4463             CHECK_NULL_VOID(webCom);
4464             webCom->OnProgressChange(eventParam.get());
4465         },
4466         TaskExecutor::TaskType::JS, "ArkUIWebProgressChanged");
4467 }
4468 
OnReceivedTitle(const std::string & param)4469 void WebDelegate::OnReceivedTitle(const std::string& param)
4470 {
4471     auto context = context_.Upgrade();
4472     CHECK_NULL_VOID(context);
4473     context->GetTaskExecutor()->PostTask(
4474         [weak = WeakClaim(this), param]() {
4475             auto delegate = weak.Upgrade();
4476             CHECK_NULL_VOID(delegate);
4477             // ace 2.0
4478             auto onTitleReceiveV2 = delegate->onTitleReceiveV2_;
4479             if (onTitleReceiveV2) {
4480                 onTitleReceiveV2(std::make_shared<LoadWebTitleReceiveEvent>(param));
4481             }
4482         },
4483         TaskExecutor::TaskType::JS, "ArkUIWebReceivedTitle");
4484 }
4485 
ExitFullScreen()4486 void WebDelegate::ExitFullScreen()
4487 {
4488     if (Container::IsCurrentUseNewPipeline()) {
4489         auto webPattern = webPattern_.Upgrade();
4490         CHECK_NULL_VOID(webPattern);
4491         webPattern->ExitFullScreen();
4492     }
4493 }
4494 
OnFullScreenExit()4495 void WebDelegate::OnFullScreenExit()
4496 {
4497     auto context = context_.Upgrade();
4498     CHECK_NULL_VOID(context);
4499     context->GetTaskExecutor()->PostTask(
4500         [weak = WeakClaim(this)]() {
4501             auto delegate = weak.Upgrade();
4502             CHECK_NULL_VOID(delegate);
4503             auto param = std::make_shared<FullScreenExitEvent>(false);
4504 #ifdef NG_BUILD
4505             auto webPattern = delegate->webPattern_.Upgrade();
4506             CHECK_NULL_VOID(webPattern);
4507             auto webEventHub = webPattern->GetWebEventHub();
4508             CHECK_NULL_VOID(webEventHub);
4509             auto propOnFullScreenExitEvent = webEventHub->GetOnFullScreenExitEvent();
4510             CHECK_NULL_VOID(propOnFullScreenExitEvent);
4511             propOnFullScreenExitEvent(param);
4512             return;
4513 #else
4514             if (Container::IsCurrentUseNewPipeline()) {
4515                 auto webPattern = delegate->webPattern_.Upgrade();
4516                 CHECK_NULL_VOID(webPattern);
4517                 auto webEventHub = webPattern->GetWebEventHub();
4518                 CHECK_NULL_VOID(webEventHub);
4519                 auto propOnFullScreenExitEvent = webEventHub->GetOnFullScreenExitEvent();
4520                 CHECK_NULL_VOID(propOnFullScreenExitEvent);
4521                 propOnFullScreenExitEvent(param);
4522                 return;
4523             }
4524             // ace 2.0
4525             auto onFullScreenExitV2 = delegate->onFullScreenExitV2_;
4526             if (onFullScreenExitV2) {
4527                 onFullScreenExitV2(param);
4528             }
4529 #endif
4530         },
4531         TaskExecutor::TaskType::JS, "ArkUIWebFullScreenExit");
4532 }
4533 
OnGeolocationPermissionsHidePrompt()4534 void WebDelegate::OnGeolocationPermissionsHidePrompt()
4535 {
4536     auto context = context_.Upgrade();
4537     CHECK_NULL_VOID(context);
4538     context->GetTaskExecutor()->PostTask(
4539         [weak = WeakClaim(this)]() {
4540             auto delegate = weak.Upgrade();
4541             CHECK_NULL_VOID(delegate);
4542             // ace 2.0
4543             auto onGeolocationHideV2 = delegate->onGeolocationHideV2_;
4544             if (onGeolocationHideV2) {
4545                 onGeolocationHideV2(std::make_shared<LoadWebGeolocationHideEvent>(""));
4546             }
4547         },
4548         TaskExecutor::TaskType::JS, "ArkUIWebGeolocationPermissionsHidePrompt");
4549 }
4550 
OnGeolocationPermissionsShowPrompt(const std::string & origin,const std::shared_ptr<OHOS::NWeb::NWebGeolocationCallbackInterface> & callback)4551 void WebDelegate::OnGeolocationPermissionsShowPrompt(
4552     const std::string& origin, const std::shared_ptr<OHOS::NWeb::NWebGeolocationCallbackInterface>& callback)
4553 {
4554     auto context = context_.Upgrade();
4555     CHECK_NULL_VOID(context);
4556     context->GetTaskExecutor()->PostTask(
4557         [weak = WeakClaim(this), origin, callback]() {
4558             auto delegate = weak.Upgrade();
4559             CHECK_NULL_VOID(delegate);
4560             // ace 2.0
4561             auto onGeolocationShowV2 = delegate->onGeolocationShowV2_;
4562             if (onGeolocationShowV2) {
4563                 auto geolocation =
4564                     AceType::MakeRefPtr<WebGeolocationOhos>(callback,
4565                                                             delegate->incognitoMode_);
4566                 onGeolocationShowV2(std::make_shared<LoadWebGeolocationShowEvent>(origin, geolocation));
4567             }
4568         },
4569         TaskExecutor::TaskType::JS, "ArkUIWebGeolocationPermissionsShowPrompt");
4570 }
4571 
OnPermissionRequestPrompt(const std::shared_ptr<OHOS::NWeb::NWebAccessRequest> & request)4572 void WebDelegate::OnPermissionRequestPrompt(const std::shared_ptr<OHOS::NWeb::NWebAccessRequest>& request)
4573 {
4574     auto context = context_.Upgrade();
4575     CHECK_NULL_VOID(context);
4576     context->GetTaskExecutor()->PostTask(
4577         [weak = WeakClaim(this), request]() {
4578             auto delegate = weak.Upgrade();
4579             CHECK_NULL_VOID(delegate);
4580             if (static_cast<uint32_t>(request->ResourceAcessId())
4581                 & OHOS::NWeb::NWebAccessRequest::Resources::CLIPBOARD_READ_WRITE) {
4582                 auto webPattern = delegate->webPattern_.Upgrade();
4583                 CHECK_NULL_VOID(webPattern);
4584                 auto clipboardCallback = webPattern->GetPermissionClipboardCallback();
4585                 CHECK_NULL_VOID(clipboardCallback);
4586                 clipboardCallback(std::make_shared<WebPermissionRequestEvent>(
4587                     AceType::MakeRefPtr<WebPermissionRequestOhos>(request)));
4588                 return;
4589             }
4590             // ace 2.0
4591             auto onPermissionRequestV2 = delegate->onPermissionRequestV2_;
4592             if (onPermissionRequestV2) {
4593                 onPermissionRequestV2(std::make_shared<WebPermissionRequestEvent>(
4594                     AceType::MakeRefPtr<WebPermissionRequestOhos>(request)));
4595             }
4596         },
4597         TaskExecutor::TaskType::JS, "ArkUIWebPermissionRequestPrompt");
4598 }
4599 
OnScreenCaptureRequest(const std::shared_ptr<OHOS::NWeb::NWebScreenCaptureAccessRequest> & request)4600 void WebDelegate::OnScreenCaptureRequest(const std::shared_ptr<OHOS::NWeb::NWebScreenCaptureAccessRequest>& request)
4601 {
4602     auto context = context_.Upgrade();
4603     CHECK_NULL_VOID(context);
4604     context->GetTaskExecutor()->PostTask(
4605         [weak = WeakClaim(this), request]() {
4606             auto delegate = weak.Upgrade();
4607             CHECK_NULL_VOID(delegate);
4608             // ace 2.0
4609             auto onScreenCaptureRequestV2 = delegate->onScreenCaptureRequestV2_;
4610             if (onScreenCaptureRequestV2) {
4611                 onScreenCaptureRequestV2(std::make_shared<WebScreenCaptureRequestEvent>(
4612                     AceType::MakeRefPtr<WebScreenCaptureRequestOhos>(request)));
4613             }
4614         },
4615         TaskExecutor::TaskType::JS, "ArkUIWebScreenCaptureRequest");
4616 }
4617 
OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)4618 bool WebDelegate::OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)
4619 {
4620     auto context = context_.Upgrade();
4621     CHECK_NULL_RETURN(context, false);
4622     bool result = false;
4623     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4624     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), message, &result]() {
4625         auto delegate = weak.Upgrade();
4626         CHECK_NULL_VOID(delegate);
4627         auto param = std::make_shared<LoadWebConsoleLogEvent>(AceType::MakeRefPtr<ConsoleLogOhos>(message));
4628         if (Container::IsCurrentUseNewPipeline()) {
4629             auto webPattern = delegate->webPattern_.Upgrade();
4630             CHECK_NULL_VOID(webPattern);
4631             auto webEventHub = webPattern->GetWebEventHub();
4632             CHECK_NULL_VOID(webEventHub);
4633             auto propOnConsoleEvent = webEventHub->GetOnConsoleEvent();
4634             CHECK_NULL_VOID(propOnConsoleEvent);
4635             result = propOnConsoleEvent(param);
4636         }
4637         auto webCom = delegate->webComponent_.Upgrade();
4638         CHECK_NULL_VOID(webCom);
4639         result = webCom->OnConsole(param.get());
4640         return;
4641     }, "ArkUIWebConsoleLog");
4642     return result;
4643 }
4644 
OnCommonDialog(const std::shared_ptr<BaseEventInfo> & info,DialogEventType dialogEventType)4645 bool WebDelegate::OnCommonDialog(const std::shared_ptr<BaseEventInfo>& info, DialogEventType dialogEventType)
4646 {
4647     auto context = context_.Upgrade();
4648     CHECK_NULL_RETURN(context, false);
4649     bool result = false;
4650     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4651     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, dialogEventType, &result]() {
4652         auto delegate = weak.Upgrade();
4653         CHECK_NULL_VOID(delegate);
4654 #ifdef NG_BUILD
4655         auto webPattern = delegate->webPattern_.Upgrade();
4656         CHECK_NULL_VOID(webPattern);
4657         auto webEventHub = webPattern->GetWebEventHub();
4658         CHECK_NULL_VOID(webEventHub);
4659         result = webEventHub->FireOnCommonDialogEvent(info, dialogEventType);
4660         return;
4661 #else
4662         if (Container::IsCurrentUseNewPipeline()) {
4663             auto webPattern = delegate->webPattern_.Upgrade();
4664             CHECK_NULL_VOID(webPattern);
4665             auto webEventHub = webPattern->GetWebEventHub();
4666             CHECK_NULL_VOID(webEventHub);
4667             result = webEventHub->FireOnCommonDialogEvent(info, dialogEventType);
4668             return;
4669         }
4670         auto webCom = delegate->webComponent_.Upgrade();
4671         CHECK_NULL_VOID(webCom);
4672         result = webCom->OnCommonDialog(info.get(), dialogEventType);
4673         return;
4674 #endif
4675     }, "ArkUIWebCommonDialogEvent");
4676     return result;
4677 }
4678 
OnFullScreenEnter(std::shared_ptr<OHOS::NWeb::NWebFullScreenExitHandler> handler,int videoNaturalWidth,int videoNaturalHeight)4679 void WebDelegate::OnFullScreenEnter(
4680     std::shared_ptr<OHOS::NWeb::NWebFullScreenExitHandler> handler, int videoNaturalWidth, int videoNaturalHeight)
4681 {
4682     auto context = context_.Upgrade();
4683     CHECK_NULL_VOID(context);
4684     context->GetTaskExecutor()->PostTask(
4685         [weak = WeakClaim(this), handler, videoNaturalWidth, videoNaturalHeight]() {
4686             auto delegate = weak.Upgrade();
4687             CHECK_NULL_VOID(delegate);
4688             auto param =
4689                 std::make_shared<FullScreenEnterEvent>(AceType::MakeRefPtr<FullScreenExitHandlerOhos>(handler, weak),
4690 		    videoNaturalWidth, videoNaturalHeight);
4691 #ifdef NG_BUILD
4692             auto webPattern = delegate->webPattern_.Upgrade();
4693             CHECK_NULL_VOID(webPattern);
4694             webPattern->RequestFullScreen();
4695             webPattern->SetFullScreenExitHandler(param);
4696             auto webEventHub = webPattern->GetWebEventHub();
4697             CHECK_NULL_VOID(webEventHub);
4698             auto propOnFullScreenEnterEvent = webEventHub->GetOnFullScreenEnterEvent();
4699             CHECK_NULL_VOID(propOnFullScreenEnterEvent);
4700             propOnFullScreenEnterEvent(param);
4701             return;
4702 #else
4703             if (Container::IsCurrentUseNewPipeline()) {
4704                 auto webPattern = delegate->webPattern_.Upgrade();
4705                 CHECK_NULL_VOID(webPattern);
4706                 webPattern->RequestFullScreen();
4707                 webPattern->SetFullScreenExitHandler(param);
4708                 auto webEventHub = webPattern->GetWebEventHub();
4709                 CHECK_NULL_VOID(webEventHub);
4710                 auto propOnFullScreenEnterEvent = webEventHub->GetOnFullScreenEnterEvent();
4711                 CHECK_NULL_VOID(propOnFullScreenEnterEvent);
4712                 propOnFullScreenEnterEvent(param);
4713                 return;
4714             }
4715             auto webCom = delegate->webComponent_.Upgrade();
4716             CHECK_NULL_VOID(webCom);
4717             webCom->OnFullScreenEnter(param.get());
4718 #endif
4719         },
4720         TaskExecutor::TaskType::JS, "ArkUIWebFullScreenEnter");
4721 }
4722 
OnHttpAuthRequest(const std::shared_ptr<BaseEventInfo> & info)4723 bool WebDelegate::OnHttpAuthRequest(const std::shared_ptr<BaseEventInfo>& info)
4724 {
4725     auto context = context_.Upgrade();
4726     CHECK_NULL_RETURN(context, false);
4727     bool result = false;
4728     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4729     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4730         auto delegate = weak.Upgrade();
4731         CHECK_NULL_VOID(delegate);
4732 #ifdef NG_BUILD
4733         auto webPattern = delegate->webPattern_.Upgrade();
4734         CHECK_NULL_VOID(webPattern);
4735         auto webEventHub = webPattern->GetWebEventHub();
4736         CHECK_NULL_VOID(webEventHub);
4737         auto propOnHttpAuthRequestEvent = webEventHub->GetOnHttpAuthRequestEvent();
4738         CHECK_NULL_VOID(propOnHttpAuthRequestEvent);
4739         result = propOnHttpAuthRequestEvent(info);
4740         return;
4741 #else
4742         if (Container::IsCurrentUseNewPipeline()) {
4743             auto webPattern = delegate->webPattern_.Upgrade();
4744             CHECK_NULL_VOID(webPattern);
4745             auto webEventHub = webPattern->GetWebEventHub();
4746             CHECK_NULL_VOID(webEventHub);
4747             auto propOnHttpAuthRequestEvent = webEventHub->GetOnHttpAuthRequestEvent();
4748             CHECK_NULL_VOID(propOnHttpAuthRequestEvent);
4749             result = propOnHttpAuthRequestEvent(info);
4750             return;
4751         }
4752         auto webCom = delegate->webComponent_.Upgrade();
4753         CHECK_NULL_VOID(webCom);
4754         result = webCom->OnHttpAuthRequest(info.get());
4755 #endif
4756     }, "ArkUIWebHttpAuthRequest");
4757     return result;
4758 }
4759 
OnSslErrorRequest(const std::shared_ptr<BaseEventInfo> & info)4760 bool WebDelegate::OnSslErrorRequest(const std::shared_ptr<BaseEventInfo>& info)
4761 {
4762     auto context = context_.Upgrade();
4763     CHECK_NULL_RETURN(context, false);
4764     bool result = false;
4765     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4766     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4767         auto delegate = weak.Upgrade();
4768         CHECK_NULL_VOID(delegate);
4769 #ifdef NG_BUILD
4770         auto webPattern = delegate->webPattern_.Upgrade();
4771         CHECK_NULL_VOID(webPattern);
4772         auto webEventHub = webPattern->GetWebEventHub();
4773         CHECK_NULL_VOID(webEventHub);
4774         auto propOnSslErrorEvent = webEventHub->GetOnSslErrorRequestEvent();
4775         CHECK_NULL_VOID(propOnSslErrorEvent);
4776         result = propOnSslErrorEvent(info);
4777         return;
4778 #else
4779         if (Container::IsCurrentUseNewPipeline()) {
4780             auto webPattern = delegate->webPattern_.Upgrade();
4781             CHECK_NULL_VOID(webPattern);
4782             auto webEventHub = webPattern->GetWebEventHub();
4783             CHECK_NULL_VOID(webEventHub);
4784             auto propOnSslErrorEvent = webEventHub->GetOnSslErrorRequestEvent();
4785             CHECK_NULL_VOID(propOnSslErrorEvent);
4786             result = propOnSslErrorEvent(info);
4787             return;
4788         }
4789         auto webCom = delegate->webComponent_.Upgrade();
4790         CHECK_NULL_VOID(webCom);
4791         result = webCom->OnSslErrorRequest(info.get());
4792 #endif
4793     }, "ArkUIWebSslErrorRequest");
4794     return result;
4795 }
4796 
OnAllSslErrorRequest(const std::shared_ptr<BaseEventInfo> & info)4797 bool WebDelegate::OnAllSslErrorRequest(const std::shared_ptr<BaseEventInfo>& info)
4798 {
4799     auto context = context_.Upgrade();
4800     CHECK_NULL_RETURN(context, false);
4801     bool result = false;
4802     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4803     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4804         auto delegate = weak.Upgrade();
4805         CHECK_NULL_VOID(delegate);
4806         auto webPattern = delegate->webPattern_.Upgrade();
4807         CHECK_NULL_VOID(webPattern);
4808         auto webEventHub = webPattern->GetWebEventHub();
4809         CHECK_NULL_VOID(webEventHub);
4810         auto propOnAllSslErrorEvent = webEventHub->GetOnAllSslErrorRequestEvent();
4811         CHECK_NULL_VOID(propOnAllSslErrorEvent);
4812         result = propOnAllSslErrorEvent(info);
4813         return;
4814     }, "ArkUIWebAllSslErrorRequest");
4815     return result;
4816 }
4817 
OnSslSelectCertRequest(const std::shared_ptr<BaseEventInfo> & info)4818 bool WebDelegate::OnSslSelectCertRequest(const std::shared_ptr<BaseEventInfo>& info)
4819 {
4820     auto context = context_.Upgrade();
4821     CHECK_NULL_RETURN(context, false);
4822     bool result = false;
4823     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4824     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4825         auto delegate = weak.Upgrade();
4826         CHECK_NULL_VOID(delegate);
4827 #ifdef NG_BUILD
4828         auto webPattern = delegate->webPattern_.Upgrade();
4829         CHECK_NULL_VOID(webPattern);
4830         auto webEventHub = webPattern->GetWebEventHub();
4831         CHECK_NULL_VOID(webEventHub);
4832         auto propOnSslSelectCertRequestEvent = webEventHub->GetOnSslSelectCertRequestEvent();
4833         CHECK_NULL_VOID(propOnSslSelectCertRequestEvent);
4834         result = propOnSslSelectCertRequestEvent(info);
4835         return;
4836 #else
4837         if (Container::IsCurrentUseNewPipeline()) {
4838             auto webPattern = delegate->webPattern_.Upgrade();
4839             CHECK_NULL_VOID(webPattern);
4840             auto webEventHub = webPattern->GetWebEventHub();
4841             CHECK_NULL_VOID(webEventHub);
4842             auto propOnSslSelectCertRequestEvent = webEventHub->GetOnSslSelectCertRequestEvent();
4843             CHECK_NULL_VOID(propOnSslSelectCertRequestEvent);
4844             result = propOnSslSelectCertRequestEvent(info);
4845             return;
4846         }
4847         auto webCom = delegate->webComponent_.Upgrade();
4848         CHECK_NULL_VOID(webCom);
4849         result = webCom->OnSslSelectCertRequest(info.get());
4850 #endif
4851     }, "ArkUIWebSslSelectCertRequest");
4852     return result;
4853 }
4854 
OnDownloadStart(const std::string & url,const std::string & userAgent,const std::string & contentDisposition,const std::string & mimetype,long contentLength)4855 void WebDelegate::OnDownloadStart(const std::string& url, const std::string& userAgent,
4856     const std::string& contentDisposition, const std::string& mimetype, long contentLength)
4857 {
4858     auto context = context_.Upgrade();
4859     CHECK_NULL_VOID(context);
4860     context->GetTaskExecutor()->PostTask(
4861         [weak = WeakClaim(this), url, userAgent, contentDisposition, mimetype, contentLength]() {
4862             auto delegate = weak.Upgrade();
4863             CHECK_NULL_VOID(delegate);
4864             auto onDownloadStartV2 = delegate->onDownloadStartV2_;
4865             if (onDownloadStartV2) {
4866                 onDownloadStartV2(
4867                     std::make_shared<DownloadStartEvent>(url, userAgent, contentDisposition, mimetype, contentLength));
4868             }
4869         },
4870         TaskExecutor::TaskType::JS, "ArkUIWebDownloadStart");
4871 }
4872 
OnAccessibilityEvent(int64_t accessibilityId,AccessibilityEventType eventType)4873 void WebDelegate::OnAccessibilityEvent(int64_t accessibilityId, AccessibilityEventType eventType)
4874 {
4875     if (!accessibilityState_) {
4876         return;
4877     }
4878     auto context = context_.Upgrade();
4879     CHECK_NULL_VOID(context);
4880     AccessibilityEvent event;
4881     auto webPattern = webPattern_.Upgrade();
4882     CHECK_NULL_VOID(webPattern);
4883     auto accessibilityManager = context->GetAccessibilityManager();
4884     CHECK_NULL_VOID(accessibilityManager);
4885     if (eventType == AccessibilityEventType::ACCESSIBILITY_FOCUSED) {
4886         webPattern->UpdateFocusedAccessibilityId(accessibilityId);
4887     } else if (eventType == AccessibilityEventType::ACCESSIBILITY_FOCUS_CLEARED ||
4888                eventType == AccessibilityEventType::CLICK) {
4889         webPattern->ClearFocusedAccessibilityId();
4890     } else if (eventType == AccessibilityEventType::PAGE_CHANGE || eventType == AccessibilityEventType::SCROLL_END) {
4891         webPattern->UpdateFocusedAccessibilityId();
4892     }
4893     if (eventType == AccessibilityEventType::CLICK) {
4894         WebComponentClickReport(accessibilityId);
4895     }
4896     if (eventType == AccessibilityEventType::FOCUS) {
4897         TextBlurReportByFocusEvent(accessibilityId);
4898     }
4899     if (eventType == AccessibilityEventType::BLUR) {
4900         TextBlurReportByBlurEvent(accessibilityId);
4901     }
4902     event.nodeId = accessibilityId;
4903     event.type = eventType;
4904     accessibilityManager->SendWebAccessibilityAsyncEvent(event, webPattern);
4905 }
4906 
WebComponentClickReport(int64_t accessibilityId)4907 void WebDelegate::WebComponentClickReport(int64_t accessibilityId)
4908 {
4909     auto webPattern = webPattern_.Upgrade();
4910     CHECK_NULL_VOID(webPattern);
4911     auto webAccessibilityNode = webPattern->GetAccessibilityNodeById(accessibilityId);
4912     CHECK_NULL_VOID(webAccessibilityNode);
4913     auto webComponentClickCallback = webPattern->GetWebComponentClickCallback();
4914     CHECK_NULL_VOID(webComponentClickCallback);
4915     webComponentClickCallback(accessibilityId, webAccessibilityNode->GetContent());
4916 }
4917 
TextBlurReportByFocusEvent(int64_t accessibilityId)4918 void WebDelegate::TextBlurReportByFocusEvent(int64_t accessibilityId)
4919 {
4920     auto webPattern = webPattern_.Upgrade();
4921     CHECK_NULL_VOID(webPattern);
4922     auto textBlurCallback = webPattern->GetTextBlurCallback();
4923     CHECK_NULL_VOID(textBlurCallback);
4924     auto lastFocusNode = webPattern->GetAccessibilityNodeById(lastFocusInputId_);
4925     if (lastFocusNode && lastFocusNode->GetIsEditable() && lastFocusInputId_ != accessibilityId) {
4926         if (lastFocusNode->GetIsPassword()) {
4927             TAG_LOGW(AceLogTag::ACE_WEB, "the input type is password, do not report");
4928         } else {
4929             std::string blurText = lastFocusNode->GetContent();
4930             if (!blurText.empty()) {
4931                 TAG_LOGD(AceLogTag::ACE_WEB, "report text blur, the content length is %{public}u",
4932                     static_cast<int32_t>(blurText.length()));
4933                 textBlurCallback(lastFocusInputId_, blurText);
4934                 lastFocusReportId_ = lastFocusInputId_;
4935             }
4936         }
4937     }
4938     if (accessibilityId != 0) {
4939         auto focusNode = webPattern->GetAccessibilityNodeById(accessibilityId);
4940         if (focusNode) {
4941             // record last editable focus id
4942             lastFocusInputId_ = accessibilityId;
4943         }
4944     }
4945 }
4946 
TextBlurReportByBlurEvent(int64_t accessibilityId)4947 void WebDelegate::TextBlurReportByBlurEvent(int64_t accessibilityId)
4948 {
4949     auto webPattern = webPattern_.Upgrade();
4950     CHECK_NULL_VOID(webPattern);
4951     auto textBlurCallback = webPattern->GetTextBlurCallback();
4952     CHECK_NULL_VOID(textBlurCallback);
4953     auto blurNode = webPattern->GetAccessibilityNodeById(accessibilityId);
4954     if (blurNode && blurNode->GetIsEditable() && lastFocusReportId_ != accessibilityId) {
4955         std::string blurText = blurNode->GetContent();
4956         if (!blurNode->GetIsPassword() && !blurText.empty()) {
4957             TAG_LOGD(AceLogTag::ACE_WEB, "report text blur, the content length is %{public}u",
4958                 static_cast<int32_t>(blurText.length()));
4959             textBlurCallback(accessibilityId, blurText);
4960         }
4961     }
4962 }
4963 
OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)4964 void WebDelegate::OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
4965     std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)
4966 {
4967     auto context = context_.Upgrade();
4968     CHECK_NULL_VOID(context);
4969     context->GetTaskExecutor()->PostTask(
4970         [weak = WeakClaim(this), request, error]() {
4971             auto delegate = weak.Upgrade();
4972             CHECK_NULL_VOID(delegate);
4973             auto webPattern = delegate->webPattern_.Upgrade();
4974             CHECK_NULL_VOID(webPattern);
4975             auto webEventHub = webPattern->GetWebEventHub();
4976             CHECK_NULL_VOID(webEventHub);
4977             webEventHub->FireOnErrorReceiveEvent(std::make_shared<ReceivedErrorEvent>(
4978                     AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
4979                         request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
4980                     AceType::MakeRefPtr<WebError>(error->ErrorInfo(), error->ErrorCode())));
4981         },
4982         TaskExecutor::TaskType::JS, "ArkUIWebErrorReceive");
4983 }
4984 
OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)4985 void WebDelegate::OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
4986     std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)
4987 {
4988     if (onHttpErrorReceiveV2_) {
4989         onHttpErrorReceiveV2_(std::make_shared<ReceivedHttpErrorEvent>(
4990             AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
4991                 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
4992             AceType::MakeRefPtr<WebResponse>(response->ResponseHeaders(), response->ResponseData(),
4993                 response->ResponseEncoding(), response->ResponseMimeType(), response->ResponseStatus(),
4994                 response->ResponseStatusCode())));
4995     }
4996 }
4997 
IsEmptyOnInterceptRequest()4998 bool WebDelegate::IsEmptyOnInterceptRequest()
4999 {
5000 #ifdef NG_BUILD
5001     auto webPattern = webPattern_.Upgrade();
5002     CHECK_NULL_RETURN(webPattern, false);
5003     auto webEventHub = webPattern->GetWebEventHub();
5004     CHECK_NULL_RETURN(webEventHub, false);
5005     return webEventHub->GetOnInterceptRequestEvent() == nullptr;
5006 #else
5007     if (Container::IsCurrentUseNewPipeline()) {
5008         auto webPattern = webPattern_.Upgrade();
5009         CHECK_NULL_RETURN(webPattern, false);
5010         auto webEventHub = webPattern->GetWebEventHub();
5011         CHECK_NULL_RETURN(webEventHub, false);
5012         return webEventHub->GetOnInterceptRequestEvent() == nullptr;
5013     }
5014     auto webCom = webComponent_.Upgrade();
5015     CHECK_NULL_RETURN(webCom, true);
5016     return webCom->IsEmptyOnInterceptRequest();
5017 #endif
5018 }
5019 
OnInterceptRequest(const std::shared_ptr<BaseEventInfo> & info)5020 RefPtr<WebResponse> WebDelegate::OnInterceptRequest(const std::shared_ptr<BaseEventInfo>& info)
5021 {
5022     auto context = context_.Upgrade();
5023     CHECK_NULL_RETURN(context, nullptr);
5024     RefPtr<WebResponse> result = nullptr;
5025     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5026     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5027         auto delegate = weak.Upgrade();
5028         CHECK_NULL_VOID(delegate);
5029         if (Container::IsCurrentUseNewPipeline()) {
5030             auto webPattern = delegate->webPattern_.Upgrade();
5031             CHECK_NULL_VOID(webPattern);
5032             auto webEventHub = webPattern->GetWebEventHub();
5033             CHECK_NULL_VOID(webEventHub);
5034             auto propOnInterceptRequestEvent = webEventHub->GetOnInterceptRequestEvent();
5035             CHECK_NULL_VOID(propOnInterceptRequestEvent);
5036             result = propOnInterceptRequestEvent(info);
5037         }
5038         auto webCom = delegate->webComponent_.Upgrade();
5039         CHECK_NULL_VOID(webCom);
5040         result = webCom->OnInterceptRequest(info.get());
5041     }, "ArkUIWebInterceptRequest");
5042     return result;
5043 }
5044 
OnTooltip(const std::string & tooltip)5045 void WebDelegate::OnTooltip(const std::string& tooltip)
5046 {
5047     auto context = context_.Upgrade();
5048     CHECK_NULL_VOID(context);
5049     context->GetTaskExecutor()->PostTask(
5050         [weak = WeakClaim(this), tooltip]() {
5051             auto delegate = weak.Upgrade();
5052             CHECK_NULL_VOID(delegate);
5053             auto webPattern = delegate->webPattern_.Upgrade();
5054             CHECK_NULL_VOID(webPattern);
5055             webPattern->OnTooltip(tooltip);
5056         },
5057         TaskExecutor::TaskType::UI, "ArkUIWebTooltip");
5058 }
5059 
GetVisibleRectToWeb(int & visibleX,int & visibleY,int & visibleWidth,int & visibleHeight)5060 void WebDelegate::GetVisibleRectToWeb(int& visibleX, int& visibleY, int& visibleWidth, int& visibleHeight)
5061 {
5062     auto webPattern = webPattern_.Upgrade();
5063     CHECK_NULL_VOID(webPattern);
5064     webPattern->GetVisibleRectToWeb(visibleX, visibleY, visibleWidth, visibleHeight);
5065 }
5066 
OnRequestFocus()5067 void WebDelegate::OnRequestFocus()
5068 {
5069     if (onRequestFocusV2_) {
5070         onRequestFocusV2_(std::make_shared<LoadWebRequestFocusEvent>(""));
5071     }
5072 }
5073 
OnRenderExited(OHOS::NWeb::RenderExitReason reason)5074 void WebDelegate::OnRenderExited(OHOS::NWeb::RenderExitReason reason)
5075 {
5076     auto context = context_.Upgrade();
5077     CHECK_NULL_VOID(context);
5078     context->GetTaskExecutor()->PostTask(
5079         [weak = WeakClaim(this), reason]() {
5080             auto delegate = weak.Upgrade();
5081             CHECK_NULL_VOID(delegate);
5082             auto onRenderExitedV2 = delegate->onRenderExitedV2_;
5083             if (onRenderExitedV2) {
5084                 onRenderExitedV2(std::make_shared<RenderExitedEvent>(static_cast<int32_t>(reason)));
5085             }
5086         },
5087         TaskExecutor::TaskType::JS, "ArkUIWebRenderExited");
5088 }
5089 
OnRefreshAccessedHistory(const std::string & url,bool isRefreshed)5090 void WebDelegate::OnRefreshAccessedHistory(const std::string& url, bool isRefreshed)
5091 {
5092     auto context = context_.Upgrade();
5093     CHECK_NULL_VOID(context);
5094     context->GetTaskExecutor()->PostTask(
5095         [weak = WeakClaim(this), url, isRefreshed]() {
5096             auto delegate = weak.Upgrade();
5097             CHECK_NULL_VOID(delegate);
5098             auto onRefreshAccessedHistoryV2 = delegate->onRefreshAccessedHistoryV2_;
5099             if (onRefreshAccessedHistoryV2) {
5100                 onRefreshAccessedHistoryV2(std::make_shared<RefreshAccessedHistoryEvent>(url, isRefreshed));
5101             }
5102         },
5103         TaskExecutor::TaskType::JS, "ArkUIWebRefreshAccessedHistory");
5104 }
5105 
OnPageError(const std::string & param)5106 void WebDelegate::OnPageError(const std::string& param)
5107 {
5108     if (onPageError_) {
5109         int32_t errorCode = GetIntParam(param, NTC_PARAM_ERROR_CODE);
5110         std::string url = GetUrlStringParam(param, NTC_PARAM_URL);
5111         std::string description = GetStringParam(param, NTC_PARAM_DESCRIPTION);
5112 
5113         std::string paramUrl = std::string(R"(")").append(url).append(std::string(R"(")")).append(",");
5114 
5115         std::string paramErrorCode = std::string(R"(")")
5116                                          .append(NTC_PARAM_ERROR_CODE)
5117                                          .append(std::string(R"(")"))
5118                                          .append(":")
5119                                          .append(std::to_string(errorCode))
5120                                          .append(",");
5121 
5122         std::string paramDesc = std::string(R"(")")
5123                                     .append(NTC_PARAM_DESCRIPTION)
5124                                     .append(std::string(R"(")"))
5125                                     .append(":")
5126                                     .append(std::string(R"(")").append(description).append(std::string(R"(")")));
5127         std::string errorParam =
5128             std::string(R"("error",{"url":)").append((paramUrl + paramErrorCode + paramDesc).append("},null"));
5129         onPageError_(errorParam);
5130     }
5131 }
5132 
OnMessage(const std::string & param)5133 void WebDelegate::OnMessage(const std::string& param)
5134 {
5135     std::string removeQuotes = param;
5136     removeQuotes.erase(std::remove(removeQuotes.begin(), removeQuotes.end(), '\"'), removeQuotes.end());
5137     if (onMessage_) {
5138         std::string paramMessage = std::string(R"(")").append(removeQuotes).append(std::string(R"(")"));
5139         std::string messageParam = std::string(R"("message",{"message":)").append(paramMessage.append("},null"));
5140         onMessage_(messageParam);
5141     }
5142 }
5143 
OnRouterPush(const std::string & param)5144 void WebDelegate::OnRouterPush(const std::string& param)
5145 {
5146     OHOS::Ace::Framework::DelegateClient::GetInstance().RouterPush(param);
5147 }
5148 
OnFileSelectorShow(const std::shared_ptr<BaseEventInfo> & info)5149 bool WebDelegate::OnFileSelectorShow(const std::shared_ptr<BaseEventInfo>& info)
5150 {
5151     auto context = context_.Upgrade();
5152     CHECK_NULL_RETURN(context, false);
5153     bool result = false;
5154     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5155     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5156         auto delegate = weak.Upgrade();
5157         CHECK_NULL_VOID(delegate);
5158         if (Container::IsCurrentUseNewPipeline()) {
5159             auto webPattern = delegate->webPattern_.Upgrade();
5160             CHECK_NULL_VOID(webPattern);
5161             auto webEventHub = webPattern->GetWebEventHub();
5162             CHECK_NULL_VOID(webEventHub);
5163             auto propOnFileSelectorShowEvent = webEventHub->GetOnFileSelectorShowEvent();
5164             CHECK_NULL_VOID(propOnFileSelectorShowEvent);
5165             result = propOnFileSelectorShowEvent(info);
5166         }
5167         auto webCom = delegate->webComponent_.Upgrade();
5168         CHECK_NULL_VOID(webCom);
5169         result = webCom->OnFileSelectorShow(info.get());
5170     }, "ArkUIWebFileSelectorShow");
5171 
5172     if (!result) {
5173         TAG_LOGI(AceLogTag::ACE_WEB, "default file selector show handled");
5174         auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5175         jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5176             auto delegate = weak.Upgrade();
5177             CHECK_NULL_VOID(delegate);
5178             auto webPattern = delegate->webPattern_.Upgrade();
5179             CHECK_NULL_VOID(webPattern);
5180             auto fileSelectCallback = webPattern->GetDefaultFileSelectorShowCallback();
5181             CHECK_NULL_VOID(fileSelectCallback);
5182             fileSelectCallback(info);
5183             result = true;
5184             }, "ArkUIWebDefaultFileSelectorShow");
5185     }
5186     return result;
5187 }
5188 
OnContextMenuShow(const std::shared_ptr<BaseEventInfo> & info)5189 bool WebDelegate::OnContextMenuShow(const std::shared_ptr<BaseEventInfo>& info)
5190 {
5191     auto context = context_.Upgrade();
5192     CHECK_NULL_RETURN(context, false);
5193     bool result = false;
5194     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5195     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
5196         auto delegate = weak.Upgrade();
5197         CHECK_NULL_VOID(delegate);
5198 #ifdef NG_BUILD
5199         auto webPattern = delegate->webPattern_.Upgrade();
5200         CHECK_NULL_VOID(webPattern);
5201         if (delegate->richtextData_) {
5202             webPattern->OnContextMenuShow(info, true, true);
5203             result = true;
5204         }
5205         auto webEventHub = webPattern->GetWebEventHub();
5206         CHECK_NULL_VOID(webEventHub);
5207         auto propOnContextMenuShowEvent = webEventHub->GetOnContextMenuShowEvent();
5208         CHECK_NULL_VOID(propOnContextMenuShowEvent);
5209         result = propOnContextMenuShowEvent(info);
5210         if (!delegate->richtextData_) {
5211             webPattern->OnContextMenuShow(info, false, result);
5212         }
5213         return;
5214 #else
5215         if (Container::IsCurrentUseNewPipeline()) {
5216             auto webPattern = delegate->webPattern_.Upgrade();
5217             CHECK_NULL_VOID(webPattern);
5218             if (delegate->richtextData_) {
5219                 webPattern->OnContextMenuShow(info, true, true);
5220                 result = true;
5221             }
5222             auto webEventHub = webPattern->GetWebEventHub();
5223             CHECK_NULL_VOID(webEventHub);
5224             auto propOnContextMenuShowEvent = webEventHub->GetOnContextMenuShowEvent();
5225             CHECK_NULL_VOID(propOnContextMenuShowEvent);
5226             result = propOnContextMenuShowEvent(info);
5227             if (!delegate->richtextData_) {
5228                 webPattern->OnContextMenuShow(info, false, result);
5229             }
5230             return;
5231         }
5232         auto webCom = delegate->webComponent_.Upgrade();
5233         CHECK_NULL_VOID(webCom);
5234         result = webCom->OnContextMenuShow(info.get());
5235 #endif
5236     }, "ArkUIWebContextMenuShow");
5237     return result;
5238 }
5239 
OnContextMenuHide(const std::string & info)5240 void WebDelegate::OnContextMenuHide(const std::string& info)
5241 {
5242     auto context = context_.Upgrade();
5243     CHECK_NULL_VOID(context);
5244     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5245     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info]() {
5246         auto delegate = weak.Upgrade();
5247         CHECK_NULL_VOID(delegate);
5248         if (Container::IsCurrentUseNewPipeline()) {
5249             auto webPattern = delegate->webPattern_.Upgrade();
5250             CHECK_NULL_VOID(webPattern);
5251             webPattern->OnContextMenuHide();
5252             auto webEventHub = webPattern->GetWebEventHub();
5253             CHECK_NULL_VOID(webEventHub);
5254             auto propOnContextMenuHideEvent = webEventHub->GetOnContextMenuHideEvent();
5255             CHECK_NULL_VOID(propOnContextMenuHideEvent);
5256             propOnContextMenuHideEvent(std::make_shared<ContextMenuHideEvent>(info));
5257             return;
5258         } else {
5259             TAG_LOGW(AceLogTag::ACE_WEB, "current is not new pipeline");
5260         }
5261     }, "ArkUIWebContextMenuHide");
5262     return;
5263 }
5264 
OnHandleInterceptUrlLoading(const std::string & data)5265 bool WebDelegate::OnHandleInterceptUrlLoading(const std::string& data)
5266 {
5267     auto context = context_.Upgrade();
5268     CHECK_NULL_RETURN(context, false);
5269     bool result = false;
5270     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5271     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), data, &result]() {
5272         auto delegate = weak.Upgrade();
5273         CHECK_NULL_VOID(delegate);
5274         auto param = std::make_shared<UrlLoadInterceptEvent>(data);
5275         if (Container::IsCurrentUseNewPipeline()) {
5276             auto webPattern = delegate->webPattern_.Upgrade();
5277             CHECK_NULL_VOID(webPattern);
5278             auto webEventHub = webPattern->GetWebEventHub();
5279             CHECK_NULL_VOID(webEventHub);
5280             auto propOnUrlLoadInterceptEvent = webEventHub->GetOnUrlLoadInterceptEvent();
5281             CHECK_NULL_VOID(propOnUrlLoadInterceptEvent);
5282             result = propOnUrlLoadInterceptEvent(param);
5283         }
5284         auto webCom = delegate->webComponent_.Upgrade();
5285         CHECK_NULL_VOID(webCom);
5286         result = webCom->OnUrlLoadIntercept(param.get());
5287     }, "ArkUIWebHandleInterceptUrlLoading");
5288     return result;
5289 }
5290 
OnHandleInterceptLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)5291 bool WebDelegate::OnHandleInterceptLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)
5292 {
5293     auto context = context_.Upgrade();
5294     CHECK_NULL_RETURN(context, false);
5295     bool result = false;
5296     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
5297     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), request, &result]() {
5298         auto delegate = weak.Upgrade();
5299         CHECK_NULL_VOID(delegate);
5300         auto webRequest = AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
5301             request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect());
5302         auto param = std::make_shared<LoadInterceptEvent>(webRequest);
5303         if (Container::IsCurrentUseNewPipeline()) {
5304             auto webPattern = delegate->webPattern_.Upgrade();
5305             CHECK_NULL_VOID(webPattern);
5306             auto webEventHub = webPattern->GetWebEventHub();
5307             CHECK_NULL_VOID(webEventHub);
5308             auto propOnLoadInterceptEvent = webEventHub->GetOnLoadInterceptEvent();
5309             CHECK_NULL_VOID(propOnLoadInterceptEvent);
5310             result = propOnLoadInterceptEvent(param);
5311         }
5312         auto webCom = delegate->webComponent_.Upgrade();
5313         CHECK_NULL_VOID(webCom);
5314         result = webCom->OnLoadIntercept(param.get());
5315     }, "ArkUIWebHandleInterceptLoading");
5316     return result;
5317 }
5318 
OnResourceLoad(const std::string & url)5319 void WebDelegate::OnResourceLoad(const std::string& url)
5320 {
5321     if (onResourceLoadV2_) {
5322         onResourceLoadV2_(std::make_shared<ResourceLoadEvent>(url));
5323     }
5324 }
5325 
OnScaleChange(float oldScaleFactor,float newScaleFactor)5326 void WebDelegate::OnScaleChange(float oldScaleFactor, float newScaleFactor)
5327 {
5328     auto context = context_.Upgrade();
5329     CHECK_NULL_VOID(context);
5330     context->GetTaskExecutor()->PostTask(
5331         [weak = WeakClaim(this), oldScaleFactor, newScaleFactor]() {
5332             auto delegate = weak.Upgrade();
5333             CHECK_NULL_VOID(delegate);
5334             auto onScaleChangeV2 = delegate->onScaleChangeV2_;
5335             if (onScaleChangeV2) {
5336                 onScaleChangeV2(std::make_shared<ScaleChangeEvent>(oldScaleFactor, newScaleFactor));
5337             }
5338         },
5339         TaskExecutor::TaskType::JS, "ArkUIWebScaleChange");
5340 }
5341 
OnScroll(double xOffset,double yOffset)5342 void WebDelegate::OnScroll(double xOffset, double yOffset)
5343 {
5344     auto context = context_.Upgrade();
5345     CHECK_NULL_VOID(context);
5346     context->GetTaskExecutor()->PostTask(
5347         [weak = WeakClaim(this), xOffset, yOffset]() {
5348             auto delegate = weak.Upgrade();
5349             CHECK_NULL_VOID(delegate);
5350             auto onScrollV2 = delegate->onScrollV2_;
5351             if (onScrollV2) {
5352                 onScrollV2(std::make_shared<WebOnScrollEvent>(xOffset, yOffset));
5353             }
5354         },
5355         TaskExecutor::TaskType::JS, "ArkUIWebScroll");
5356 }
5357 
OnSearchResultReceive(int activeMatchOrdinal,int numberOfMatches,bool isDoneCounting)5358 void WebDelegate::OnSearchResultReceive(int activeMatchOrdinal, int numberOfMatches, bool isDoneCounting)
5359 {
5360     auto context = context_.Upgrade();
5361     CHECK_NULL_VOID(context);
5362     context->GetTaskExecutor()->PostTask(
5363         [weak = WeakClaim(this), activeMatchOrdinal, numberOfMatches, isDoneCounting]() {
5364             auto delegate = weak.Upgrade();
5365             CHECK_NULL_VOID(delegate);
5366             auto onSearchResultReceiveV2 = delegate->onSearchResultReceiveV2_;
5367             if (onSearchResultReceiveV2) {
5368                 onSearchResultReceiveV2(
5369                     std::make_shared<SearchResultReceiveEvent>(activeMatchOrdinal, numberOfMatches, isDoneCounting));
5370             }
5371         },
5372         TaskExecutor::TaskType::JS, "ArkUIWebSearchResultReceive");
5373 }
5374 
OnDragAndDropData(const void * data,size_t len,int width,int height)5375 bool WebDelegate::OnDragAndDropData(const void* data, size_t len, int width, int height)
5376 {
5377     pixelMap_ = PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
5378     if (pixelMap_ == nullptr) {
5379         return false;
5380     }
5381     isRefreshPixelMap_ = true;
5382 
5383     auto webPattern = webPattern_.Upgrade();
5384     if (!webPattern) {
5385         return false;
5386     }
5387     return webPattern->NotifyStartDragTask();
5388 }
5389 
OnDragAndDropDataUdmf(std::shared_ptr<OHOS::NWeb::NWebDragData> dragData)5390 bool WebDelegate::OnDragAndDropDataUdmf(std::shared_ptr<OHOS::NWeb::NWebDragData> dragData)
5391 {
5392     const void* data = nullptr;
5393     size_t len = 0;
5394     int width = 0;
5395     int height = 0;
5396     dragData->GetPixelMapSetting(&data, len, width, height);
5397     pixelMap_ = PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
5398     CHECK_NULL_RETURN(pixelMap_, false);
5399     isRefreshPixelMap_ = true;
5400 
5401     dragData_ = dragData;
5402     auto webPattern = webPattern_.Upgrade();
5403     CHECK_NULL_RETURN(webPattern, false);
5404 
5405     if (webPattern->IsRootNeedExportTexture()) {
5406         return false;
5407     }
5408 
5409     if (dragData->IsDragNewStyle() && (!webPattern->IsNewDragStyle() || !webPattern->IsPreviewImageNodeExist())) {
5410         TAG_LOGI(AceLogTag::ACE_WEB, "OnDragAndDropDataUdmf not a new style");
5411         auto context = context_.Upgrade();
5412         CHECK_NULL_RETURN(context, false);
5413         CHECK_NULL_RETURN(context->GetTaskExecutor(), false);
5414         context->GetTaskExecutor()->PostDelayedTask(
5415             [weak = WeakClaim(this)]() {
5416                 auto delegate = weak.Upgrade();
5417                 CHECK_NULL_VOID(delegate);
5418                 auto pattern = delegate->webPattern_.Upgrade();
5419                 CHECK_NULL_VOID(pattern);
5420                 pattern->NotifyStartDragTask(true);
5421             },
5422             TaskExecutor::TaskType::UI, DRAG_DELAY_MILLISECONDS, "OnDragAndDropDataUdmf");
5423         return true;
5424     } else if (!dragData->IsDragNewStyle()) {
5425         webPattern->SetNewDragStyle(false);
5426     }
5427     return webPattern->NotifyStartDragTask();
5428 }
5429 
IsDragging()5430 bool WebDelegate::IsDragging()
5431 {
5432     auto webPattern = webPattern_.Upgrade();
5433     CHECK_NULL_RETURN(webPattern, false);
5434     return webPattern->IsDragging();
5435 }
5436 
IsImageDrag()5437 bool WebDelegate::IsImageDrag()
5438 {
5439     if (dragData_) {
5440         return dragData_->IsSingleImageContent();
5441     }
5442     return false;
5443 }
5444 
GetOrCreateDragData()5445 std::shared_ptr<OHOS::NWeb::NWebDragData> WebDelegate::GetOrCreateDragData()
5446 {
5447     if (dragData_) {
5448         return dragData_;
5449     }
5450 
5451     if (nweb_) {
5452         dragData_ = nweb_->GetOrCreateDragData();
5453         return dragData_;
5454     }
5455     return nullptr;
5456 }
5457 
OnWindowNew(const std::string & targetUrl,bool isAlert,bool isUserTrigger,const std::shared_ptr<OHOS::NWeb::NWebControllerHandler> & handler)5458 void WebDelegate::OnWindowNew(const std::string& targetUrl, bool isAlert, bool isUserTrigger,
5459     const std::shared_ptr<OHOS::NWeb::NWebControllerHandler>& handler)
5460 {
5461     auto context = context_.Upgrade();
5462     CHECK_NULL_VOID(context);
5463     context->GetTaskExecutor()->PostSyncTask(
5464         [weak = WeakClaim(this), targetUrl, isAlert, isUserTrigger, handler]() {
5465             auto delegate = weak.Upgrade();
5466             CHECK_NULL_VOID(delegate);
5467             int32_t parentNWebId = (delegate->nweb_ ? static_cast<int32_t>(delegate->nweb_->GetWebId()) : -1);
5468             auto param = std::make_shared<WebWindowNewEvent>(
5469                 targetUrl, isAlert, isUserTrigger, AceType::MakeRefPtr<WebWindowNewHandlerOhos>(handler, parentNWebId));
5470 #ifdef NG_BUILD
5471             auto webPattern = delegate->webPattern_.Upgrade();
5472             CHECK_NULL_VOID(webPattern);
5473             auto webEventHub = webPattern->GetWebEventHub();
5474             CHECK_NULL_VOID(webEventHub);
5475             auto propOnWindowNewEvent = webEventHub->GetOnWindowNewEvent();
5476             CHECK_NULL_VOID(propOnWindowNewEvent);
5477             propOnWindowNewEvent(param);
5478             return;
5479 #else
5480             if (Container::IsCurrentUseNewPipeline()) {
5481                 auto webPattern = delegate->webPattern_.Upgrade();
5482                 CHECK_NULL_VOID(webPattern);
5483                 auto webEventHub = webPattern->GetWebEventHub();
5484                 CHECK_NULL_VOID(webEventHub);
5485                 auto propOnWindowNewEvent = webEventHub->GetOnWindowNewEvent();
5486                 CHECK_NULL_VOID(propOnWindowNewEvent);
5487                 propOnWindowNewEvent(param);
5488                 return;
5489             }
5490             auto webCom = delegate->webComponent_.Upgrade();
5491             CHECK_NULL_VOID(webCom);
5492             webCom->OnWindowNewEvent(param);
5493 #endif
5494         },
5495         TaskExecutor::TaskType::JS, "ArkUIWebWindowNewEvent");
5496 }
5497 
OnWindowExit()5498 void WebDelegate::OnWindowExit()
5499 {
5500     auto context = context_.Upgrade();
5501     CHECK_NULL_VOID(context);
5502     context->GetTaskExecutor()->PostTask(
5503         [weak = WeakClaim(this)]() {
5504             auto delegate = weak.Upgrade();
5505             CHECK_NULL_VOID(delegate);
5506             auto onWindowExitV2 = delegate->onWindowExitV2_;
5507             if (onWindowExitV2) {
5508                 onWindowExitV2(std::make_shared<WebWindowExitEvent>());
5509             }
5510         },
5511         TaskExecutor::TaskType::JS, "ArkUIWebWindowExit");
5512 }
5513 
OnPageVisible(const std::string & url)5514 void WebDelegate::OnPageVisible(const std::string& url)
5515 {
5516     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnPageVisible, web id = %{public}d", GetWebId());
5517     if (onPageVisibleV2_) {
5518         onPageVisibleV2_(std::make_shared<PageVisibleEvent>(url));
5519     } else {
5520         TAG_LOGI(AceLogTag::ACE_WEB, "The developer has not registered this OnPageVisible event");
5521     }
5522 
5523     if (isEnableHardwareComposition_) {
5524         return;
5525     }
5526     auto context = context_.Upgrade();
5527     CHECK_NULL_VOID(context);
5528     context->GetTaskExecutor()->PostDelayedTask(
5529         [weak = WeakClaim(this)]() {
5530             auto delegate = weak.Upgrade();
5531             CHECK_NULL_VOID(delegate);
5532             delegate->EnableHardware();
5533         },
5534         TaskExecutor::TaskType::UI, DELAY_MILLISECONDS_1000, "ArkUIWebEnableHardware");
5535 }
5536 
OnFirstContentfulPaint(int64_t navigationStartTick,int64_t firstContentfulPaintMs)5537 void WebDelegate::OnFirstContentfulPaint(int64_t navigationStartTick, int64_t firstContentfulPaintMs)
5538 {
5539     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnFirstContentfulPaint, web id = %{public}d", GetWebId());
5540     if (onFirstContentfulPaintV2_) {
5541         onFirstContentfulPaintV2_(
5542             std::make_shared<FirstContentfulPaintEvent>(navigationStartTick, firstContentfulPaintMs));
5543     }
5544 }
5545 
OnFirstMeaningfulPaint(std::shared_ptr<OHOS::NWeb::NWebFirstMeaningfulPaintDetails> details)5546 void WebDelegate::OnFirstMeaningfulPaint(std::shared_ptr<OHOS::NWeb::NWebFirstMeaningfulPaintDetails> details)
5547 {
5548     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnFirstMeaningfulPaint, web id = %{public}d", GetWebId());
5549     if (OnFirstMeaningfulPaintV2_) {
5550         OnFirstMeaningfulPaintV2_(std::make_shared<FirstMeaningfulPaintEvent>(
5551             details->GetNavigationStartTime(), details->GetFirstMeaningfulPaintTime()));
5552     }
5553 }
5554 
OnLargestContentfulPaint(std::shared_ptr<OHOS::NWeb::NWebLargestContentfulPaintDetails> details)5555 void WebDelegate::OnLargestContentfulPaint(std::shared_ptr<OHOS::NWeb::NWebLargestContentfulPaintDetails> details)
5556 {
5557     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::OnLargestContentfulPaint, web id = %{public}d", GetWebId());
5558     if (OnLargestContentfulPaintV2_) {
5559         OnLargestContentfulPaintV2_(std::make_shared<LargestContentfulPaintEvent>(details->GetNavigationStartTime(),
5560             details->GetLargestImagePaintTime(), details->GetLargestTextPaintTime(),
5561             details->GetLargestImageLoadStartTime(), details->GetLargestImageLoadEndTime(), details->GetImageBPP()));
5562     }
5563 }
5564 
EnableHardware()5565 void WebDelegate::EnableHardware()
5566 {
5567     if (isEnableHardwareComposition_) {
5568         return;
5569     }
5570 
5571     auto surfaceNode = OHOS::Rosen::RSBaseNode::ReinterpretCast<OHOS::Rosen::RSSurfaceNode>(surfaceRsNode_);
5572     CHECK_NULL_VOID(surfaceNode);
5573     TAG_LOGI(AceLogTag::ACE_WEB, "WebDelegate::EnableHardware, web id = %{public}d", GetWebId());
5574     ACE_SCOPED_TRACE("WebDelegate::EnableHardware, web id = %d", GetWebId());
5575     surfaceNode->SetHardwareEnabled(true);
5576     isEnableHardwareComposition_ = true;
5577 }
5578 
OnSafeBrowsingCheckResult(int threat_type)5579 void WebDelegate::OnSafeBrowsingCheckResult(int threat_type)
5580 {
5581     if (onSafeBrowsingCheckResultV2_) {
5582         onSafeBrowsingCheckResultV2_(
5583             std::make_shared<SafeBrowsingCheckResultEvent>(threat_type));
5584     }
5585 }
5586 
OnDataResubmitted(std::shared_ptr<OHOS::NWeb::NWebDataResubmissionCallback> handler)5587 void WebDelegate::OnDataResubmitted(std::shared_ptr<OHOS::NWeb::NWebDataResubmissionCallback> handler)
5588 {
5589     auto param = std::make_shared<DataResubmittedEvent>(AceType::MakeRefPtr<DataResubmittedOhos>(handler));
5590     if (Container::IsCurrentUseNewPipeline()) {
5591         auto webPattern = webPattern_.Upgrade();
5592         CHECK_NULL_VOID(webPattern);
5593         auto webEventHub = webPattern->GetWebEventHub();
5594         CHECK_NULL_VOID(webEventHub);
5595         auto propOnDataResubmittedEvent = webEventHub->GetOnDataResubmittedEvent();
5596         CHECK_NULL_VOID(propOnDataResubmittedEvent);
5597         propOnDataResubmittedEvent(param);
5598         return;
5599     }
5600 }
5601 
OnNavigationEntryCommitted(std::shared_ptr<OHOS::NWeb::NWebLoadCommittedDetails> details)5602 void WebDelegate::OnNavigationEntryCommitted(std::shared_ptr<OHOS::NWeb::NWebLoadCommittedDetails> details)
5603 {
5604     if (onNavigationEntryCommittedV2_) {
5605         NavigationType type = static_cast<NavigationType>(details->GetNavigationType());
5606         onNavigationEntryCommittedV2_(std::make_shared<NavigationEntryCommittedEvent>(details->GetURL(),
5607             type, details->IsMainFrame(), details->IsSameDocument(),
5608             details->DidReplaceEntry()));
5609     }
5610     auto webPattern = webPattern_.Upgrade();
5611     CHECK_NULL_VOID(webPattern);
5612     webPattern->DestroyAnalyzerOverlay();
5613 }
5614 
OnFaviconReceived(const void * data,size_t width,size_t height,OHOS::NWeb::ImageColorType colorType,OHOS::NWeb::ImageAlphaType alphaType)5615 void WebDelegate::OnFaviconReceived(const void* data, size_t width, size_t height, OHOS::NWeb::ImageColorType colorType,
5616     OHOS::NWeb::ImageAlphaType alphaType)
5617 {
5618     auto param = std::make_shared<FaviconReceivedEvent>(
5619         AceType::MakeRefPtr<FaviconReceivedOhos>(data, width, height, colorType, alphaType));
5620     if (Container::IsCurrentUseNewPipeline()) {
5621         auto webPattern = webPattern_.Upgrade();
5622         CHECK_NULL_VOID(webPattern);
5623         auto webEventHub = webPattern->GetWebEventHub();
5624         CHECK_NULL_VOID(webEventHub);
5625         auto propOnFaviconReceivedEvent = webEventHub->GetOnFaviconReceivedEvent();
5626         CHECK_NULL_VOID(propOnFaviconReceivedEvent);
5627         propOnFaviconReceivedEvent(param);
5628         return;
5629     }
5630 }
5631 
OnTouchIconUrl(const std::string & iconUrl,bool precomposed)5632 void WebDelegate::OnTouchIconUrl(const std::string& iconUrl, bool precomposed)
5633 {
5634     if (onTouchIconUrlV2_) {
5635         onTouchIconUrlV2_(std::make_shared<TouchIconUrlEvent>(iconUrl, precomposed));
5636     }
5637 }
5638 
OnAudioStateChanged(bool audible)5639 void WebDelegate::OnAudioStateChanged(bool audible)
5640 {
5641     if (onAudioStateChangedV2_) {
5642         onAudioStateChangedV2_(std::make_shared<AudioStateChangedEvent>(audible));
5643     }
5644 }
5645 
OnGetTouchHandleHotZone(std::shared_ptr<OHOS::NWeb::NWebTouchHandleHotZone> hotZone)5646 void WebDelegate::OnGetTouchHandleHotZone(std::shared_ptr<OHOS::NWeb::NWebTouchHandleHotZone> hotZone)
5647 {
5648     auto pipeline = PipelineContext::GetCurrentContext();
5649     CHECK_NULL_VOID(pipeline);
5650     auto theme = pipeline->GetTheme<TextOverlayTheme>();
5651     CHECK_NULL_VOID(theme);
5652     auto touchHandleSize = theme->GetHandleHotZoneRadius().ConvertToPx();
5653     if (hotZone) {
5654         hotZone->SetWidth(touchHandleSize);
5655         hotZone->SetHeight(touchHandleSize);
5656     }
5657 }
5658 
GetDragPixelMap()5659 RefPtr<PixelMap> WebDelegate::GetDragPixelMap()
5660 {
5661     return pixelMap_;
5662 }
5663 
5664 #ifdef OHOS_STANDARD_SYSTEM
HandleTouchDown(const int32_t & id,const double & x,const double & y,bool from_overlay)5665 void WebDelegate::HandleTouchDown(const int32_t& id, const double& x, const double& y, bool from_overlay)
5666 {
5667     ACE_DCHECK(nweb_ != nullptr);
5668     if (nweb_) {
5669         nweb_->OnTouchPress(id, x, y, from_overlay);
5670     }
5671 }
5672 
HandleTouchUp(const int32_t & id,const double & x,const double & y,bool from_overlay)5673 void WebDelegate::HandleTouchUp(const int32_t& id, const double& x, const double& y, bool from_overlay)
5674 {
5675     ACE_DCHECK(nweb_ != nullptr);
5676     if (nweb_) {
5677         nweb_->OnTouchRelease(id, x, y, from_overlay);
5678     }
5679 }
5680 
HandleTouchMove(const int32_t & id,const double & x,const double & y,bool from_overlay)5681 void WebDelegate::HandleTouchMove(const int32_t& id, const double& x, const double& y, bool from_overlay)
5682 {
5683     ACE_DCHECK(nweb_ != nullptr);
5684     if (nweb_) {
5685         nweb_->OnTouchMove(id, x, y, from_overlay);
5686     }
5687 }
5688 
HandleTouchMove(const std::vector<std::shared_ptr<OHOS::NWeb::NWebTouchPointInfo>> & touch_point_infos,bool from_overlay)5689 void WebDelegate::HandleTouchMove(const std::vector<std::shared_ptr<OHOS::NWeb::NWebTouchPointInfo>> &touch_point_infos,
5690                                   bool from_overlay)
5691 {
5692     ACE_DCHECK(nweb_ != nullptr);
5693     if (nweb_) {
5694         nweb_->OnTouchMove(touch_point_infos, from_overlay);
5695     }
5696 }
5697 
HandleTouchCancel()5698 void WebDelegate::HandleTouchCancel()
5699 {
5700     ACE_DCHECK(nweb_ != nullptr);
5701     if (nweb_) {
5702         nweb_->OnTouchCancel();
5703     }
5704 }
5705 
HandleTouchpadFlingEvent(const double & x,const double & y,const double & vx,const double & vy)5706 void WebDelegate::HandleTouchpadFlingEvent(const double& x, const double& y, const double& vx, const double& vy)
5707 {
5708     if (nweb_) {
5709         nweb_->SendTouchpadFlingEvent(x, y, vx, vy);
5710     }
5711 }
5712 
WebHandleTouchpadFlingEvent(const double & x,const double & y,const double & vx,const double & vy,const std::vector<int32_t> & pressedCodes)5713 void WebDelegate::WebHandleTouchpadFlingEvent(const double& x, const double& y,
5714     const double& vx, const double& vy, const std::vector<int32_t>& pressedCodes)
5715 {
5716     if (nweb_) {
5717         nweb_->WebSendTouchpadFlingEvent(x, y, vx, vy, pressedCodes);
5718     }
5719 }
5720 
HandleAxisEvent(const double & x,const double & y,const double & deltaX,const double & deltaY)5721 void WebDelegate::HandleAxisEvent(const double& x, const double& y, const double& deltaX, const double& deltaY)
5722 {
5723     if (nweb_) {
5724         nweb_->SendMouseWheelEvent(x, y, deltaX, deltaY);
5725     }
5726 }
5727 
WebHandleAxisEvent(const double & x,const double & y,const double & deltaX,const double & deltaY,const std::vector<int32_t> & pressedCodes)5728 void WebDelegate::WebHandleAxisEvent(const double& x, const double& y,
5729     const double& deltaX, const double& deltaY, const std::vector<int32_t>& pressedCodes)
5730 {
5731     if (nweb_) {
5732         nweb_->WebSendMouseWheelEvent(x, y, deltaX, deltaY, pressedCodes);
5733     }
5734 }
5735 
OnKeyEvent(int32_t keyCode,int32_t keyAction)5736 bool WebDelegate::OnKeyEvent(int32_t keyCode, int32_t keyAction)
5737 {
5738     if (nweb_) {
5739         return nweb_->SendKeyEvent(keyCode, keyAction);
5740     }
5741     return false;
5742 }
5743 
WebOnKeyEvent(int32_t keyCode,int32_t keyAction,const std::vector<int32_t> & pressedCodes)5744 bool WebDelegate::WebOnKeyEvent(int32_t keyCode, int32_t keyAction,
5745     const std::vector<int32_t>& pressedCodes)
5746 {
5747     CHECK_NULL_RETURN(nweb_, false);
5748     return nweb_->WebSendKeyEvent(keyCode, keyAction, pressedCodes);
5749 }
5750 
OnMouseEvent(int32_t x,int32_t y,const MouseButton button,const MouseAction action,int count)5751 void WebDelegate::OnMouseEvent(int32_t x, int32_t y, const MouseButton button, const MouseAction action, int count)
5752 {
5753     if (nweb_) {
5754         nweb_->SendMouseEvent(x, y, static_cast<int>(button), static_cast<int>(action), count);
5755     }
5756 }
5757 
OnFocus(const OHOS::NWeb::FocusReason & reason)5758 void WebDelegate::OnFocus(const OHOS::NWeb::FocusReason& reason)
5759 {
5760     ACE_DCHECK(nweb_ != nullptr);
5761     if (nweb_) {
5762         nweb_->OnFocus(reason);
5763     }
5764 }
5765 
NeedSoftKeyboard()5766 bool WebDelegate::NeedSoftKeyboard()
5767 {
5768     if (nweb_) {
5769         return nweb_->NeedSoftKeyboard();
5770     }
5771     return false;
5772 }
5773 
OnBlur()5774 void WebDelegate::OnBlur()
5775 {
5776     ACE_DCHECK(nweb_ != nullptr);
5777     if (nweb_) {
5778         nweb_->OnBlur(blurReason_);
5779     }
5780 }
5781 
UpdateClippedSelectionBounds(int32_t x,int32_t y,int32_t w,int32_t h)5782 void WebDelegate::UpdateClippedSelectionBounds(int32_t x, int32_t y, int32_t w, int32_t h)
5783 {
5784     auto webPattern = webPattern_.Upgrade();
5785     CHECK_NULL_VOID(webPattern);
5786     webPattern->UpdateClippedSelectionBounds(x, y, w, h);
5787 }
5788 
RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)5789 bool WebDelegate::RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,
5790     std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)
5791 {
5792 #ifdef NG_BUILD
5793     auto webPattern = webPattern_.Upgrade();
5794     CHECK_NULL_RETURN(webPattern, false);
5795     return webPattern->RunQuickMenu(params, callback);
5796 #else
5797     if (Container::IsCurrentUseNewPipeline()) {
5798         auto webPattern = webPattern_.Upgrade();
5799         CHECK_NULL_RETURN(webPattern, false);
5800         return webPattern->RunQuickMenu(params, callback);
5801     }
5802     auto renderWeb = renderWeb_.Upgrade();
5803     if (!renderWeb || !params || !callback) {
5804         return false;
5805     }
5806 
5807     return renderWeb->RunQuickMenu(params, callback);
5808 #endif
5809 }
5810 
HideHandleAndQuickMenuIfNecessary(bool hide)5811 void WebDelegate::HideHandleAndQuickMenuIfNecessary(bool hide)
5812 {
5813     auto webPattern = webPattern_.Upgrade();
5814     CHECK_NULL_VOID(webPattern);
5815     webPattern->HideHandleAndQuickMenuIfNecessary(hide);
5816 }
5817 
ChangeVisibilityOfQuickMenu()5818 void WebDelegate::ChangeVisibilityOfQuickMenu()
5819 {
5820     auto webPattern = webPattern_.Upgrade();
5821     CHECK_NULL_VOID(webPattern);
5822     webPattern->ChangeVisibilityOfQuickMenu();
5823 }
5824 
OnQuickMenuDismissed()5825 void WebDelegate::OnQuickMenuDismissed()
5826 {
5827 #ifdef NG_BUILD
5828     auto webPattern = webPattern_.Upgrade();
5829     CHECK_NULL_VOID(webPattern);
5830     webPattern->OnQuickMenuDismissed();
5831     return;
5832 #else
5833     if (Container::IsCurrentUseNewPipeline()) {
5834         auto webPattern = webPattern_.Upgrade();
5835         CHECK_NULL_VOID(webPattern);
5836         webPattern->OnQuickMenuDismissed();
5837         return;
5838     }
5839     auto renderWeb = renderWeb_.Upgrade();
5840     CHECK_NULL_VOID(renderWeb);
5841     renderWeb->OnQuickMenuDismissed();
5842 #endif
5843 }
5844 
OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)5845 void WebDelegate::OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,
5846     std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,
5847     std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)
5848 {
5849 #ifdef NG_BUILD
5850     auto webPattern = webPattern_.Upgrade();
5851     CHECK_NULL_VOID(webPattern);
5852     webPattern->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
5853     return;
5854 #else
5855     if (Container::IsCurrentUseNewPipeline()) {
5856         auto webPattern = webPattern_.Upgrade();
5857         CHECK_NULL_VOID(webPattern);
5858         webPattern->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
5859         return;
5860     }
5861     auto renderWeb = renderWeb_.Upgrade();
5862     CHECK_NULL_VOID(renderWeb);
5863     renderWeb->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
5864 #endif
5865 }
5866 
OnCursorChange(const OHOS::NWeb::CursorType & type,std::shared_ptr<OHOS::NWeb::NWebCursorInfo> info)5867 bool WebDelegate::OnCursorChange(const OHOS::NWeb::CursorType& type, std::shared_ptr<OHOS::NWeb::NWebCursorInfo> info)
5868 {
5869 #ifdef NG_BUILD
5870     auto webPattern = webPattern_.Upgrade();
5871     CHECK_NULL_RETURN(webPattern, false);
5872     return webPattern->OnCursorChange(type, info);
5873 #else
5874     if (Container::IsCurrentUseNewPipeline()) {
5875         auto webPattern = webPattern_.Upgrade();
5876         CHECK_NULL_RETURN(webPattern, false);
5877         return webPattern->OnCursorChange(type, info);
5878     }
5879     auto renderWeb = renderWeb_.Upgrade();
5880     CHECK_NULL_RETURN(renderWeb, false);
5881     return renderWeb->OnCursorChange(type, info);
5882 #endif
5883 }
5884 
OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)5885 void WebDelegate::OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,
5886     std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)
5887 {
5888 #ifdef NG_BUILD
5889     auto webPattern = webPattern_.Upgrade();
5890     CHECK_NULL_VOID(webPattern);
5891     webPattern->OnSelectPopupMenu(params, callback);
5892     return;
5893 #else
5894     if (Container::IsCurrentUseNewPipeline()) {
5895         auto webPattern = webPattern_.Upgrade();
5896         CHECK_NULL_VOID(webPattern);
5897         webPattern->OnSelectPopupMenu(params, callback);
5898         return;
5899     }
5900     auto renderWeb = renderWeb_.Upgrade();
5901     CHECK_NULL_VOID(renderWeb);
5902     return renderWeb->OnSelectPopupMenu(params, callback);
5903 #endif
5904 }
5905 
HandleDragEvent(int32_t x,int32_t y,const DragAction & dragAction)5906 void WebDelegate::HandleDragEvent(int32_t x, int32_t y, const DragAction& dragAction)
5907 {
5908     if (nweb_) {
5909         std::shared_ptr<NWebDragEventImpl> dragEvent =
5910 	    std::make_shared<NWebDragEventImpl>(x, y, static_cast<OHOS::NWeb::DragAction>(dragAction));
5911         nweb_->SendDragEvent(dragEvent);
5912     }
5913 }
5914 
GetUrl()5915 std::string WebDelegate::GetUrl()
5916 {
5917     if (nweb_) {
5918         return nweb_->GetUrl();
5919     }
5920     return "";
5921 }
5922 
UpdateLocale()5923 void WebDelegate::UpdateLocale()
5924 {
5925     ACE_DCHECK(nweb_ != nullptr);
5926     if (nweb_) {
5927         std::string language = AceApplicationInfo::GetInstance().GetLanguage();
5928         std::string region = AceApplicationInfo::GetInstance().GetCountryOrRegion();
5929         if (!language.empty() || !region.empty()) {
5930             nweb_->UpdateLocale(language, region);
5931         }
5932     }
5933 }
5934 
SetDrawRect(int32_t x,int32_t y,int32_t width,int32_t height)5935 void WebDelegate::SetDrawRect(int32_t x, int32_t y, int32_t width, int32_t height)
5936 {
5937     ACE_DCHECK(nweb_ != nullptr);
5938     if (nweb_) {
5939         nweb_->SetDrawRect(x, y, width, height);
5940     }
5941 }
5942 
GetPendingSizeStatus()5943 bool WebDelegate::GetPendingSizeStatus()
5944 {
5945     ACE_DCHECK(nweb_ != nullptr);
5946     if (nweb_) {
5947         return nweb_->GetPendingSizeStatus();
5948     }
5949     return false;
5950 }
5951 
NotifyAutoFillViewData(const std::string & jsonStr)5952 void WebDelegate::NotifyAutoFillViewData(const std::string& jsonStr)
5953 {
5954     auto context = context_.Upgrade();
5955     CHECK_NULL_VOID(context);
5956     context->GetTaskExecutor()->PostTask(
5957         [weak = WeakClaim(this), jsonStr]() {
5958             auto delegate = weak.Upgrade();
5959             CHECK_NULL_VOID(delegate);
5960             CHECK_NULL_VOID(delegate->nweb_);
5961             auto webMessage = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
5962             webMessage->SetType(NWebValue::Type::STRING);
5963             webMessage->SetString(jsonStr);
5964             delegate->nweb_->FillAutofillData(webMessage);
5965         },
5966         TaskExecutor::TaskType::PLATFORM, "ArkUIWebNotifyAutoFillViewData");
5967 }
5968 
AutofillCancel(const std::string & fillContent)5969 void WebDelegate::AutofillCancel(const std::string& fillContent)
5970 {
5971     auto context = context_.Upgrade();
5972     CHECK_NULL_VOID(context);
5973     context->GetTaskExecutor()->PostTask(
5974         [weak = WeakClaim(this), fillContent]() {
5975             auto delegate = weak.Upgrade();
5976             CHECK_NULL_VOID(delegate);
5977             CHECK_NULL_VOID(delegate->nweb_);
5978             delegate->nweb_->OnAutofillCancel(fillContent);
5979         },
5980         TaskExecutor::TaskType::UI, "ArkUIWebAutofillCancel");
5981 }
5982 
HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebMessage> & viewDataJson)5983 bool WebDelegate::HandleAutoFillEvent(const std::shared_ptr<OHOS::NWeb::NWebMessage>& viewDataJson)
5984 {
5985     auto pattern = webPattern_.Upgrade();
5986     CHECK_NULL_RETURN(pattern, false);
5987     return pattern->HandleAutoFillEvent(viewDataJson);
5988 }
5989 
HandleAccessibilityHoverEvent(int32_t x,int32_t y)5990 void WebDelegate::HandleAccessibilityHoverEvent(int32_t x, int32_t y)
5991 {
5992     ACE_DCHECK(nweb_ != nullptr);
5993     if (nweb_) {
5994         nweb_->SendAccessibilityHoverEvent(x, y);
5995     }
5996 }
5997 
5998 #endif
5999 
GetUrlStringParam(const std::string & param,const std::string & name) const6000 std::string WebDelegate::GetUrlStringParam(const std::string& param, const std::string& name) const
6001 {
6002     size_t len = name.length();
6003     size_t posErrorCode = param.find(NTC_PARAM_ERROR_CODE);
6004     size_t pos = param.find(name);
6005     std::string result;
6006 
6007     if (pos != std::string::npos && posErrorCode != std::string::npos) {
6008         std::stringstream ss;
6009 
6010         ss << param.substr(pos + 1 + len, posErrorCode - 5);
6011         ss >> result;
6012     }
6013     return result;
6014 }
6015 
SetRenderMode(RenderMode renderMode)6016 void WebDelegate::SetRenderMode(RenderMode renderMode)
6017 {
6018     renderMode_ = static_cast<int32_t>(renderMode);
6019 }
6020 
SetFitContentMode(WebLayoutMode layoutMode)6021 void WebDelegate::SetFitContentMode(WebLayoutMode layoutMode)
6022 {
6023     layoutMode_ = static_cast<int32_t>(layoutMode);
6024 }
6025 
BindRouterBackMethod()6026 void WebDelegate::BindRouterBackMethod()
6027 {
6028     auto context = context_.Upgrade();
6029     if (context) {
6030         context->SetRouterBackEventHandler([weak = WeakClaim(this)] {
6031             auto delegate = weak.Upgrade();
6032             if (delegate) {
6033                 delegate->CallWebRouterBack();
6034             }
6035         });
6036     }
6037 }
6038 
BindPopPageSuccessMethod()6039 void WebDelegate::BindPopPageSuccessMethod()
6040 {
6041     auto context = context_.Upgrade();
6042     if (context) {
6043         context->SetPopPageSuccessEventHandler(
6044             [weak = WeakClaim(this)](const std::string& pageUrl, const int32_t pageId) {
6045                 std::string url = pageUrl.substr(0, pageUrl.length() - 3);
6046                 auto delegate = weak.Upgrade();
6047                 if (delegate) {
6048                     delegate->CallPopPageSuccessPageUrl(url);
6049                 }
6050             });
6051     }
6052 }
6053 
BindIsPagePathInvalidMethod()6054 void WebDelegate::BindIsPagePathInvalidMethod()
6055 {
6056     auto context = context_.Upgrade();
6057     if (context) {
6058         context->SetIsPagePathInvalidEventHandler([weak = WeakClaim(this)](bool& isPageInvalid) {
6059             auto delegate = weak.Upgrade();
6060             if (delegate) {
6061                 delegate->CallIsPagePathInvalid(isPageInvalid);
6062             }
6063         });
6064     }
6065 }
6066 
SetComponent(const RefPtr<WebComponent> & component)6067 void WebDelegate::SetComponent(const RefPtr<WebComponent>& component)
6068 {
6069     webComponent_ = component;
6070 }
6071 
SetNGWebPattern(const RefPtr<NG::WebPattern> & webPattern)6072 void WebDelegate::SetNGWebPattern(const RefPtr<NG::WebPattern>& webPattern)
6073 {
6074     webPattern_ = webPattern;
6075 }
6076 
SetDrawSize(const Size & drawSize)6077 void WebDelegate::SetDrawSize(const Size& drawSize)
6078 {
6079     drawSize_ = drawSize;
6080 }
6081 
SetEnhanceSurfaceFlag(const bool & isEnhanceSurface)6082 void WebDelegate::SetEnhanceSurfaceFlag(const bool& isEnhanceSurface)
6083 {
6084     isEnhanceSurface_ = isEnhanceSurface;
6085 }
6086 
GetSurfaceDelegateClient()6087 sptr<OHOS::SurfaceDelegate> WebDelegate::GetSurfaceDelegateClient()
6088 {
6089     return surfaceDelegate_;
6090 }
6091 
SetBoundsOrResize(const Size & drawSize,const Offset & offset,bool isKeyboard)6092 void WebDelegate::SetBoundsOrResize(const Size& drawSize, const Offset& offset, bool isKeyboard)
6093 {
6094     if ((drawSize.Width() == 0) && (drawSize.Height() == 0)) {
6095         return;
6096     }
6097     if (isEnhanceSurface_) {
6098         if (surfaceDelegate_) {
6099             if (needResizeAtFirst_) {
6100                 Resize(drawSize.Width(), drawSize.Height(), isKeyboard);
6101                 needResizeAtFirst_ = false;
6102             }
6103             Size webSize = GetEnhanceSurfaceSize(drawSize);
6104             surfaceDelegate_->SetBounds(offset.GetX(), (int32_t)offset.GetY(), webSize.Width(), webSize.Height());
6105         }
6106     } else {
6107         Resize(drawSize.Width(), drawSize.Height(), isKeyboard);
6108     }
6109 }
6110 
ResizeVisibleViewport(const Size & visibleSize,bool isKeyboard)6111 void WebDelegate::ResizeVisibleViewport(const Size& visibleSize, bool isKeyboard)
6112 {
6113     double width = visibleSize.Width();
6114     double height = visibleSize.Height();
6115     if (NearEqual(resizeVisibleWidth_, width) && NearEqual(resizeVisibleHeight_, height)) {
6116         return;
6117     }
6118     resizeVisibleWidth_ = width;
6119     resizeVisibleHeight_ = height;
6120     auto context = context_.Upgrade();
6121     if (!context) {
6122         return;
6123     }
6124     context->GetTaskExecutor()->PostTask(
6125         [weak = WeakClaim(this), width, height, isKeyboard]() {
6126             auto delegate = weak.Upgrade();
6127             if (delegate && delegate->nweb_ && !delegate->window_) {
6128                 delegate->nweb_->ResizeVisibleViewport(
6129                     width < 0 ? 0 : std::ceil(width), height < 0 ? 0 : std::ceil(height), isKeyboard);
6130             }
6131         },
6132         TaskExecutor::TaskType::PLATFORM, "ArkUIWebResizeVisibleViewport");
6133     auto webPattern = webPattern_.Upgrade();
6134     CHECK_NULL_VOID(webPattern);
6135     webPattern->DestroyAnalyzerOverlay();
6136 }
6137 
GetWebRenderGlobalPos()6138 Offset WebDelegate::GetWebRenderGlobalPos()
6139 {
6140     return offset_;
6141 }
6142 
GetEnhanceSurfaceSize(const Size & drawSize)6143 Size WebDelegate::GetEnhanceSurfaceSize(const Size& drawSize)
6144 {
6145     auto pipeline = PipelineBase::GetCurrentContext();
6146     CHECK_NULL_RETURN(pipeline, Size());
6147     double dipScale = pipeline->GetDipScale();
6148     if (NearZero(dipScale)) {
6149         return Size();
6150     }
6151     int width = std::ceil(std::floor(drawSize.Width() / dipScale) * dipScale);
6152     int height = std::ceil(std::floor(drawSize.Height() / dipScale) * dipScale);
6153     if (width <= 0) {
6154         width = 1;
6155     }
6156     if (height <= 0) {
6157         height = 1;
6158     }
6159     return Size(width, height);
6160 }
6161 
GetAudioStateChangedCallback(bool useNewPipe,const RefPtr<NG::WebEventHub> & eventHub)6162 WebDelegate::EventCallbackV2 WebDelegate::GetAudioStateChangedCallback(
6163     bool useNewPipe, const RefPtr<NG::WebEventHub>& eventHub)
6164 {
6165     if (eventHub && useNewPipe) {
6166         return eventHub->GetOnAudioStateChangedEvent();
6167     }
6168     return nullptr;
6169 }
6170 
6171 #ifdef ENABLE_ROSEN_BACKEND
SetSurface(const sptr<Surface> & surface)6172 void WebDelegate::SetSurface(const sptr<Surface>& surface)
6173 {
6174     surface_ = surface;
6175     auto webPattern = webPattern_.Upgrade();
6176     CHECK_NULL_VOID(webPattern);
6177     auto host = webPattern->GetHost();
6178     CHECK_NULL_VOID(host);
6179     auto renderContext = host->GetRenderContext();
6180     CHECK_NULL_VOID(renderContext);
6181     auto rosenRenderContext = AceType::DynamicCast<NG::RosenRenderContext>(renderContext);
6182     CHECK_NULL_VOID(rosenRenderContext);
6183     rsNode_ = rosenRenderContext->GetRSNode();
6184     CHECK_NULL_VOID(rsNode_);
6185     surfaceNodeId_ = webPattern->GetWebSurfaceNodeId();
6186     surfaceRsNode_ = webPattern->GetSurfaceRSNode();
6187 }
6188 #endif
6189 
UpdateScreenOffSet(double & offsetX,double & offsetY)6190 void WebDelegate::UpdateScreenOffSet(double& offsetX, double& offsetY)
6191 {
6192 #ifdef NG_BUILD
6193     auto webPattern = webPattern_.Upgrade();
6194     CHECK_NULL_VOID(webPattern);
6195     offsetX += webPattern->GetHost()->GetTransformRelativeOffset().GetX();
6196     offsetY += webPattern->GetHost()->GetTransformRelativeOffset().GetY();
6197     auto context = context_.Upgrade();
6198     CHECK_NULL_VOID(context);
6199     auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
6200     offsetX += windowOffset.GetX();
6201     offsetY += windowOffset.GetY();
6202     return;
6203 #else
6204     if (Container::IsCurrentUseNewPipeline()) {
6205         auto webPattern = webPattern_.Upgrade();
6206         CHECK_NULL_VOID(webPattern);
6207         offsetX += webPattern->GetHost()->GetTransformRelativeOffset().GetX();
6208         offsetY += webPattern->GetHost()->GetTransformRelativeOffset().GetY();
6209         auto context = context_.Upgrade();
6210         CHECK_NULL_VOID(context);
6211         auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
6212         offsetX += windowOffset.GetX();
6213         offsetY += windowOffset.GetY();
6214         return;
6215     }
6216     auto renderWeb = renderWeb_.Upgrade();
6217     CHECK_NULL_VOID(renderWeb);
6218     offsetX += renderWeb->GetGlobalOffset().GetX();
6219     offsetY += renderWeb->GetGlobalOffset().GetY();
6220     auto context = context_.Upgrade();
6221     CHECK_NULL_VOID(context);
6222     auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
6223     offsetX += windowOffset.GetX();
6224     offsetY += windowOffset.GetY();
6225     WindowMode windowMode = context->GetWindowManager()->GetWindowMode();
6226     if (windowMode == WindowMode::WINDOW_MODE_FLOATING) {
6227         offsetX += CONTAINER_BORDER_WIDTH.ConvertToPx();
6228         offsetY += CONTAINER_TITLE_HEIGHT.ConvertToPx();
6229     }
6230 #endif
6231 }
6232 
UpdateOverScrollMode(const int overscrollModeValue)6233 void WebDelegate::UpdateOverScrollMode(const int overscrollModeValue)
6234 {
6235     auto context = context_.Upgrade();
6236     CHECK_NULL_VOID(context);
6237     context->GetTaskExecutor()->PostTask(
6238         [weak = WeakClaim(this), overscrollModeValue]() {
6239             auto delegate = weak.Upgrade();
6240             CHECK_NULL_VOID(delegate);
6241             CHECK_NULL_VOID(delegate->nweb_);
6242             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6243             CHECK_NULL_VOID(setting);
6244             setting->PutOverscrollMode(overscrollModeValue);
6245         },
6246         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateOverScrollMode");
6247 }
6248 
UpdateBlurOnKeyboardHideMode(const int isBlurOnKeyboardHideEnable)6249 void WebDelegate::UpdateBlurOnKeyboardHideMode(const int isBlurOnKeyboardHideEnable)
6250 {
6251     auto context = context_.Upgrade();
6252     CHECK_NULL_VOID(context);
6253     context->GetTaskExecutor()->PostTask(
6254         [weak = WeakClaim(this), isBlurOnKeyboardHideEnable]() {
6255             auto delegate = weak.Upgrade();
6256             CHECK_NULL_VOID(delegate);
6257             CHECK_NULL_VOID(delegate->nweb_);
6258             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6259             CHECK_NULL_VOID(setting);
6260             setting->SetBlurOnKeyboardHideMode(isBlurOnKeyboardHideEnable);
6261         },
6262         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateBlurOnKeyboardHideMode");
6263 }
6264 
UpdateCopyOptionMode(const int copyOptionModeValue)6265 void WebDelegate::UpdateCopyOptionMode(const int copyOptionModeValue)
6266 {
6267     auto context = context_.Upgrade();
6268     CHECK_NULL_VOID(context);
6269     context->GetTaskExecutor()->PostTask(
6270         [weak = WeakClaim(this), copyOptionModeValue]() {
6271             auto delegate = weak.Upgrade();
6272             CHECK_NULL_VOID(delegate);
6273             CHECK_NULL_VOID(delegate->nweb_);
6274             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6275             CHECK_NULL_VOID(setting);
6276             setting->PutCopyOptionMode(
6277                 static_cast<OHOS::NWeb::NWebPreference::CopyOptionMode>(copyOptionModeValue));
6278         },
6279         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateCopyOptionMode");
6280 }
6281 
UpdateNativeVideoPlayerConfig(bool enable,bool shouldOverlay)6282 void WebDelegate::UpdateNativeVideoPlayerConfig(bool enable, bool shouldOverlay)
6283 {
6284     auto context = context_.Upgrade();
6285     CHECK_NULL_VOID(context);
6286     context->GetTaskExecutor()->PostTask(
6287         [weak = WeakClaim(this), enable, shouldOverlay]() {
6288             auto delegate = weak.Upgrade();
6289             CHECK_NULL_VOID(delegate);
6290             CHECK_NULL_VOID(delegate->nweb_);
6291             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6292             CHECK_NULL_VOID(setting);
6293             setting->SetNativeVideoPlayerConfig(enable, shouldOverlay);
6294         },
6295         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateNativeVideoPlayerConfig");
6296 }
6297 
UpdateTextAutosizing(bool isTextAutosizing)6298 void WebDelegate::UpdateTextAutosizing(bool isTextAutosizing)
6299 {
6300     auto context = context_.Upgrade();
6301     if (!context) {
6302         return;
6303     }
6304     context->GetTaskExecutor()->PostTask(
6305         [weak = WeakClaim(this), isTextAutosizing]() {
6306             auto delegate = weak.Upgrade();
6307             if (delegate && delegate->nweb_) {
6308                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6309                 CHECK_NULL_VOID(setting);
6310                 setting->PutTextAutosizingEnabled(isTextAutosizing);
6311             }
6312         },
6313         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateTextAutosizing");
6314 }
6315 
RegisterSurfacePositionChangedCallback()6316 void WebDelegate::RegisterSurfacePositionChangedCallback()
6317 {
6318 #ifdef NG_BUILD
6319     auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
6320     CHECK_NULL_VOID(pipelineContext);
6321     if (callbackId_ <= 0) {
6322         callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
6323             [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
6324                 auto delegate = weak.Upgrade();
6325                 if (delegate && delegate->nweb_ && !delegate->window_) {
6326                     double offsetX = 0;
6327                     double offsetY = 0;
6328                     delegate->UpdateScreenOffSet(offsetX, offsetY);
6329                     delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
6330                 }
6331             });
6332     }
6333     return;
6334 #else
6335     if (Container::IsCurrentUseNewPipeline()) {
6336         auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
6337         CHECK_NULL_VOID(pipelineContext);
6338         if (callbackId_ <= 0) {
6339             callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
6340                 [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
6341                     auto delegate = weak.Upgrade();
6342                     if (delegate && delegate->nweb_ && !delegate->window_) {
6343                         double offsetX = 0;
6344                         double offsetY = 0;
6345                         delegate->UpdateScreenOffSet(offsetX, offsetY);
6346                         delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
6347                     }
6348                 });
6349         }
6350         return;
6351     }
6352     auto pipelineContext = DynamicCast<PipelineContext>(context_.Upgrade());
6353     CHECK_NULL_VOID(pipelineContext);
6354     if (callbackId_ <= 0) {
6355         callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
6356             [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
6357                 auto delegate = weak.Upgrade();
6358                 if (delegate && delegate->nweb_ && !delegate->window_) {
6359                     double offsetX = 0;
6360                     double offsetY = 0;
6361                     delegate->UpdateScreenOffSet(offsetX, offsetY);
6362                     delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
6363                 }
6364             });
6365     }
6366 #endif
6367 }
6368 
UnregisterSurfacePositionChangedCallback()6369 void WebDelegate::UnregisterSurfacePositionChangedCallback()
6370 {
6371     if (callbackId_ <= 0) {
6372         return;
6373     }
6374 #ifdef NG_BUILD
6375     auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
6376     CHECK_NULL_VOID(pipelineContext);
6377     pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
6378     callbackId_ = 0;
6379     return;
6380 #else
6381     if (Container::IsCurrentUseNewPipeline()) {
6382         auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
6383         CHECK_NULL_VOID(pipelineContext);
6384         pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
6385         callbackId_ = 0;
6386         return;
6387     }
6388     auto pipelineContext = DynamicCast<PipelineContext>(context_.Upgrade());
6389     CHECK_NULL_VOID(pipelineContext);
6390     pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
6391     callbackId_ = 0;
6392 #endif
6393 }
6394 
OnCompleteSwapWithNewSize()6395 void WebDelegate::OnCompleteSwapWithNewSize()
6396 {
6397     auto webPattern = webPattern_.Upgrade();
6398     CHECK_NULL_VOID(webPattern);
6399     webPattern->OnCompleteSwapWithNewSize();
6400 }
6401 
OnResizeNotWork()6402 void WebDelegate::OnResizeNotWork()
6403 {
6404     auto webPattern = webPattern_.Upgrade();
6405     CHECK_NULL_VOID(webPattern);
6406     webPattern->OnResizeNotWork();
6407 }
6408 
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)6409 void WebDelegate::OnDateTimeChooserPopup(std::shared_ptr<OHOS::NWeb::NWebDateTimeChooser> chooser,
6410     const std::vector<std::shared_ptr<OHOS::NWeb::NWebDateTimeSuggestion>>& suggestions,
6411     std::shared_ptr<OHOS::NWeb::NWebDateTimeChooserCallback> callback)
6412 {
6413     auto webPattern = webPattern_.Upgrade();
6414     CHECK_NULL_VOID(webPattern);
6415     webPattern->OnDateTimeChooserPopup(chooser, suggestions, callback);
6416 }
6417 
OnDateTimeChooserClose()6418 void WebDelegate::OnDateTimeChooserClose()
6419 {
6420     auto webPattern = webPattern_.Upgrade();
6421     CHECK_NULL_VOID(webPattern);
6422     webPattern->OnDateTimeChooserClose();
6423 }
6424 
OnOverScroll(float xOffset,float yOffset)6425 void WebDelegate::OnOverScroll(float xOffset, float yOffset)
6426 {
6427     auto context = context_.Upgrade();
6428     CHECK_NULL_VOID(context);
6429     context->GetTaskExecutor()->PostTask(
6430         [weak = WeakClaim(this), xOffset, yOffset]() {
6431             auto delegate = weak.Upgrade();
6432             CHECK_NULL_VOID(delegate);
6433             auto onOverScrollV2 = delegate->onOverScrollV2_;
6434             if (onOverScrollV2) {
6435                 onOverScrollV2(std::make_shared<WebOnOverScrollEvent>(xOffset, yOffset));
6436             }
6437         },
6438         TaskExecutor::TaskType::JS, "ArkUIWebOverScroll");
6439 }
6440 
SetTouchEventInfo(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> touchEvent,TouchEventInfo & touchEventInfo)6441 void WebDelegate::SetTouchEventInfo(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> touchEvent,
6442                                     TouchEventInfo& touchEventInfo)
6443 {
6444     auto webPattern = webPattern_.Upgrade();
6445     CHECK_NULL_VOID(webPattern);
6446     if (touchEvent) {
6447         TouchEvent event;
6448         event.SetId(touchEvent->GetId())
6449             .SetX(touchEvent->GetX())
6450             .SetY(touchEvent->GetY())
6451             .SetScreenX(touchEvent->GetScreenX())
6452             .SetScreenY(touchEvent->GetScreenY())
6453             .SetType(static_cast<OHOS::Ace::TouchType>(touchEvent->GetType()));
6454         webPattern->SetTouchEventInfo(event, touchEventInfo, touchEvent->GetEmbedId());
6455     } else {
6456         TouchEvent event;
6457         event.SetId(0);
6458         webPattern->SetTouchEventInfo(event, touchEventInfo, DEFAULT_NATIVE_EMBED_ID);
6459     }
6460 }
6461 
OnNativeEmbedAllDestory()6462 void WebDelegate::OnNativeEmbedAllDestory()
6463 {
6464     if (!isEmbedModeEnabled_) {
6465         return;
6466     }
6467     auto iter = embedDataInfo_.begin();
6468     for (; iter != embedDataInfo_.end(); iter++) {
6469         EmbedInfo info;
6470         std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo  = iter->second;
6471         if (dataInfo == nullptr) {
6472             continue;
6473         }
6474         std::string embedId = dataInfo->GetEmbedId();
6475         TAG_LOGI(AceLogTag::ACE_WEB, "OnNativeEmbedAllDestory embdedid=%{public}s", embedId.c_str());
6476         std::string surfaceId = dataInfo->GetSurfaceId();
6477         auto embedInfo = dataInfo->GetNativeEmbedInfo();
6478         if (embedInfo) {
6479             info = {embedInfo->GetId(), embedInfo->GetType(), embedInfo->GetSrc(),
6480                 embedInfo->GetUrl(), embedInfo->GetTag(), embedInfo->GetWidth(),
6481                 embedInfo->GetHeight(), embedInfo->GetX(), embedInfo->GetY(),
6482                 embedInfo->GetParams()};
6483         }
6484         if (OnNativeEmbedAllDestoryV2_) {
6485             OHOS::Ace::NativeEmbedStatus status = OHOS::Ace::NativeEmbedStatus::DESTROY;
6486             OnNativeEmbedAllDestoryV2_(
6487                 std::make_shared<NativeEmbedDataInfo>(status, surfaceId, embedId, info));
6488         }
6489     }
6490     embedDataInfo_.clear();
6491 }
6492 
OnNativeEmbedLifecycleChange(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo)6493 void WebDelegate::OnNativeEmbedLifecycleChange(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo)
6494 {
6495     if (!isEmbedModeEnabled_) {
6496         return;
6497     }
6498 
6499     EmbedInfo info;
6500     std::string embedId;
6501     std::string surfaceId;
6502     OHOS::Ace::NativeEmbedStatus status = OHOS::Ace::NativeEmbedStatus::CREATE;
6503     if (dataInfo) {
6504         embedId = dataInfo->GetEmbedId();
6505         surfaceId = dataInfo->GetSurfaceId();
6506         status = static_cast<OHOS::Ace::NativeEmbedStatus>(dataInfo->GetStatus());
6507 
6508         auto embedInfo = dataInfo->GetNativeEmbedInfo();
6509         if (embedInfo) {
6510             info = {embedInfo->GetId(), embedInfo->GetType(), embedInfo->GetSrc(),
6511                 embedInfo->GetUrl(), embedInfo->GetTag(), embedInfo->GetWidth(),
6512                 embedInfo->GetHeight(), embedInfo->GetX(), embedInfo->GetY(),
6513                 embedInfo->GetParams()};
6514         }
6515 
6516         if (status == OHOS::Ace::NativeEmbedStatus::CREATE || status == OHOS::Ace::NativeEmbedStatus::UPDATE) {
6517             embedDataInfo_.insert_or_assign(embedId, dataInfo);
6518         } else if (status == OHOS::Ace::NativeEmbedStatus::DESTROY) {
6519             auto iter = embedDataInfo_.find(embedId);
6520             if (iter != embedDataInfo_.end()) {
6521                 embedDataInfo_.erase(iter);
6522             }
6523         }
6524     }
6525 
6526     auto context = context_.Upgrade();
6527     CHECK_NULL_VOID(context);
6528     context->GetTaskExecutor()->PostTask(
6529         [weak = WeakClaim(this), status, surfaceId, embedId, info]() {
6530             auto delegate = weak.Upgrade();
6531             CHECK_NULL_VOID(delegate);
6532             auto OnNativeEmbedLifecycleChangeV2_ = delegate->OnNativeEmbedLifecycleChangeV2_;
6533             if (OnNativeEmbedLifecycleChangeV2_) {
6534                 OnNativeEmbedLifecycleChangeV2_(
6535                     std::make_shared<NativeEmbedDataInfo>(status, surfaceId, embedId, info));
6536             }
6537         },
6538         TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedLifecycleChange");
6539 }
6540 
OnNativeEmbedVisibilityChange(const std::string & embed_id,bool visibility)6541 void WebDelegate::OnNativeEmbedVisibilityChange(const std::string& embed_id, bool visibility)
6542 {
6543     if (!isEmbedModeEnabled_) {
6544         return;
6545     }
6546 
6547     auto context = context_.Upgrade();
6548     CHECK_NULL_VOID(context);
6549     context->GetTaskExecutor()->PostTask(
6550         [weak = WeakClaim(this), embed_id, visibility]() {
6551             auto delegate = weak.Upgrade();
6552             CHECK_NULL_VOID(delegate);
6553             auto OnNativeEmbedVisibilityChangeV2_ = delegate->OnNativeEmbedVisibilityChangeV2_;
6554             if (OnNativeEmbedVisibilityChangeV2_) {
6555                 OnNativeEmbedVisibilityChangeV2_(
6556                     std::make_shared<NativeEmbedVisibilityInfo>(visibility, embed_id));
6557             }
6558         },
6559         TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedVisibilityChange");
6560 }
6561 
OnNativeEmbedGestureEvent(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> event)6562 void WebDelegate::OnNativeEmbedGestureEvent(std::shared_ptr<OHOS::NWeb::NWebNativeEmbedTouchEvent> event)
6563 {
6564     if (event->GetId() == NO_NATIVE_FINGER_TYPE) {
6565         auto webPattern = webPattern_.Upgrade();
6566         CHECK_NULL_VOID(webPattern);
6567         webPattern->RequestFocus();
6568         return;
6569     }
6570     auto context = context_.Upgrade();
6571     TouchEventInfo touchEventInfo("touchEvent");
6572     auto embedId = event ? event->GetEmbedId() : "";
6573     SetTouchEventInfo(event, touchEventInfo);
6574     CHECK_NULL_VOID(context);
6575     TAG_LOGD(AceLogTag::ACE_WEB, "hit Emebed gusture event notify");
6576     auto param = AceType::MakeRefPtr<GestureEventResultOhos>(event->GetResult());
6577     auto type = event->GetType();
6578     context->GetTaskExecutor()->PostTask(
6579         [weak = WeakClaim(this), embedId, touchEventInfo, param, type]() {
6580             auto delegate = weak.Upgrade();
6581             CHECK_NULL_VOID(delegate);
6582             auto OnNativeEmbedGestureEventV2_ = delegate->OnNativeEmbedGestureEventV2_;
6583             if (OnNativeEmbedGestureEventV2_) {
6584                 OnNativeEmbedGestureEventV2_(
6585                     std::make_shared<NativeEmbeadTouchInfo>(embedId, touchEventInfo, param));
6586                 if (!param->HasSendTask()) {
6587                     param->SetGestureEventResult(true);
6588                 }
6589                 if (!param->GetEventResult() && type == OHOS::NWeb::TouchType::DOWN) {
6590                     auto webPattern = delegate->webPattern_.Upgrade();
6591                     CHECK_NULL_VOID(webPattern);
6592                     webPattern->RequestFocus();
6593                 }
6594             }
6595         },
6596         TaskExecutor::TaskType::JS, "ArkUIWebNativeEmbedGestureEvent");
6597 }
6598 
SetToken()6599 void WebDelegate::SetToken()
6600 {
6601     auto container = AceType::DynamicCast<Platform::AceContainer>(Container::Current());
6602     CHECK_NULL_VOID(container);
6603     int32_t instanceId = container->GetInstanceId();
6604     auto window = Platform::AceContainer::GetUIWindow(instanceId);
6605     CHECK_NULL_VOID(window);
6606     auto uiContent = window->GetUIContent();
6607     CHECK_NULL_VOID(nweb_);
6608     CHECK_NULL_VOID(uiContent);
6609     nweb_->SetToken(static_cast<void*>(uiContent));
6610     TAG_LOGD(AceLogTag::ACE_WEB, "setToken success");
6611 }
6612 
OnOverScrollFlingVelocity(float xVelocity,float yVelocity,bool isFling)6613 void WebDelegate::OnOverScrollFlingVelocity(float xVelocity, float yVelocity, bool isFling)
6614 {
6615     auto webPattern = webPattern_.Upgrade();
6616     CHECK_NULL_VOID(webPattern);
6617     webPattern->OnOverScrollFlingVelocity(xVelocity, yVelocity, isFling);
6618 }
6619 
OnScrollState(bool scrollState)6620 void WebDelegate::OnScrollState(bool scrollState)
6621 {
6622     auto webPattern = webPattern_.Upgrade();
6623     CHECK_NULL_VOID(webPattern);
6624     webPattern->OnScrollState(scrollState);
6625 }
6626 
OnRootLayerChanged(int width,int height)6627 void WebDelegate::OnRootLayerChanged(int width, int height)
6628 {
6629     auto webPattern = webPattern_.Upgrade();
6630     CHECK_NULL_VOID(webPattern);
6631     webPattern->OnRootLayerChanged(width, height);
6632 }
6633 
FilterScrollEvent(const float x,const float y,const float xVelocity,const float yVelocity)6634 bool WebDelegate::FilterScrollEvent(const float x, const float y, const float xVelocity, const float yVelocity)
6635 {
6636     auto webPattern = webPattern_.Upgrade();
6637     CHECK_NULL_RETURN(webPattern, false);
6638     return webPattern->FilterScrollEvent(x, y, xVelocity, yVelocity);
6639 }
6640 
ScrollBy(float deltaX,float deltaY)6641 void WebDelegate::ScrollBy(float deltaX, float deltaY)
6642 {
6643     CHECK_NULL_VOID(nweb_);
6644     nweb_->ScrollBy(deltaX, deltaY);
6645 }
6646 
ReleaseResizeHold()6647 void WebDelegate::ReleaseResizeHold()
6648 {
6649     auto webPattern = webPattern_.Upgrade();
6650     CHECK_NULL_VOID(webPattern);
6651     webPattern->ReleaseResizeHold();
6652 }
6653 
ScrollByRefScreen(float deltaX,float deltaY,float vx,float vy)6654 void WebDelegate::ScrollByRefScreen(float deltaX, float deltaY, float vx, float vy)
6655 {
6656     CHECK_NULL_VOID(nweb_);
6657     nweb_->ScrollByRefScreen(deltaX, deltaY, vx, vy);
6658 }
6659 
SetVirtualKeyBoardArg(int32_t width,int32_t height,double keyboard)6660 void WebDelegate::SetVirtualKeyBoardArg(int32_t width, int32_t height, double keyboard)
6661 {
6662     if (nweb_) {
6663         nweb_->SetVirtualKeyBoardArg(width, height, keyboard);
6664     }
6665 }
6666 
ShouldVirtualKeyboardOverlay()6667 bool WebDelegate::ShouldVirtualKeyboardOverlay()
6668 {
6669     if (nweb_) {
6670         return nweb_->ShouldVirtualKeyboardOverlay();
6671     }
6672     return false;
6673 }
6674 
SetJavaScriptItems(const ScriptItems & scriptItems,const ScriptItemType & type)6675 void WebDelegate::SetJavaScriptItems(const ScriptItems& scriptItems, const ScriptItemType& type)
6676 {
6677     if (type == ScriptItemType::DOCUMENT_START) {
6678         onDocumentStartScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6679     } else {
6680         onDocumentEndScriptItems_ = std::make_optional<ScriptItems>(scriptItems);
6681     }
6682 }
6683 
JavaScriptOnDocumentStart()6684 void WebDelegate::JavaScriptOnDocumentStart()
6685 {
6686     CHECK_NULL_VOID(nweb_);
6687     if (onDocumentStartScriptItems_.has_value()) {
6688         nweb_->JavaScriptOnDocumentStart(onDocumentStartScriptItems_.value());
6689         onDocumentStartScriptItems_ = std::nullopt;
6690     }
6691 }
6692 
JavaScriptOnDocumentEnd()6693 void WebDelegate::JavaScriptOnDocumentEnd()
6694 {
6695     CHECK_NULL_VOID(nweb_);
6696     if (onDocumentEndScriptItems_.has_value()) {
6697         nweb_->JavaScriptOnDocumentEnd(onDocumentEndScriptItems_.value());
6698         onDocumentEndScriptItems_ = std::nullopt;
6699     }
6700 }
6701 
ExecuteAction(int64_t accessibilityId,AceAction action,const std::map<std::string,std::string> & actionArguments)6702 bool WebDelegate::ExecuteAction(int64_t accessibilityId, AceAction action,
6703     const std::map<std::string, std::string>& actionArguments)
6704 {
6705     if (!accessibilityState_) {
6706         return false;
6707     }
6708     auto context = context_.Upgrade();
6709     CHECK_NULL_RETURN(context, false);
6710     uint32_t nwebAction = static_cast<uint32_t>(action);
6711     context->GetTaskExecutor()->PostTask(
6712         [weak = WeakClaim(this), accessibilityId, nwebAction, actionArguments]() {
6713             auto delegate = weak.Upgrade();
6714             CHECK_NULL_VOID(delegate);
6715             CHECK_NULL_VOID(delegate->nweb_);
6716             delegate->nweb_->PerformAction(accessibilityId, nwebAction, actionArguments);
6717         },
6718         TaskExecutor::TaskType::PLATFORM, "ArkUIWebExecuteAction");
6719     return true;
6720 }
6721 
SetAccessibilityState(bool state)6722 void WebDelegate::SetAccessibilityState(bool state)
6723 {
6724     if (state == accessibilityState_) {
6725         return;
6726     }
6727     accessibilityState_ = state;
6728     if (state) {
6729         auto context = context_.Upgrade();
6730         CHECK_NULL_VOID(context);
6731         context->GetTaskExecutor()->PostTask(
6732             [weak = WeakClaim(this), state]() {
6733                 auto delegate = weak.Upgrade();
6734                 CHECK_NULL_VOID(delegate);
6735                 CHECK_NULL_VOID(delegate->nweb_);
6736                 delegate->nweb_->SetAccessibilityState(state);
6737                 auto accessibilityEventListenerImpl =
6738                     std::make_shared<AccessibilityEventListenerImpl>();
6739                 CHECK_NULL_VOID(accessibilityEventListenerImpl);
6740                 accessibilityEventListenerImpl->SetWebDelegate(weak);
6741                 delegate->nweb_->PutAccessibilityEventCallback(accessibilityEventListenerImpl);
6742             },
6743             TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetAccessibilityState");
6744     } else {
6745         CHECK_NULL_VOID(nweb_);
6746         nweb_->SetAccessibilityState(state);
6747     }
6748 }
6749 
GetFocusedAccessibilityNodeInfo(int64_t accessibilityId,bool isAccessibilityFocus)6750 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> WebDelegate::GetFocusedAccessibilityNodeInfo(
6751     int64_t accessibilityId, bool isAccessibilityFocus)
6752 {
6753     CHECK_NULL_RETURN(nweb_, nullptr);
6754     if (!accessibilityState_) {
6755         return nullptr;
6756     }
6757     return nweb_->GetFocusedAccessibilityNodeInfo(accessibilityId, isAccessibilityFocus);
6758 }
6759 
GetAccessibilityNodeInfoById(int64_t accessibilityId)6760 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> WebDelegate::GetAccessibilityNodeInfoById(
6761     int64_t accessibilityId)
6762 {
6763     CHECK_NULL_RETURN(nweb_, nullptr);
6764     if (!accessibilityState_) {
6765         return nullptr;
6766     }
6767     return nweb_->GetAccessibilityNodeInfoById(accessibilityId);
6768 }
6769 
GetAccessibilityNodeInfoByFocusMove(int64_t accessibilityId,int32_t direction)6770 std::shared_ptr<OHOS::NWeb::NWebAccessibilityNodeInfo> WebDelegate::GetAccessibilityNodeInfoByFocusMove(
6771     int64_t accessibilityId, int32_t direction)
6772 {
6773     CHECK_NULL_RETURN(nweb_, nullptr);
6774     if (!accessibilityState_) {
6775         return nullptr;
6776     }
6777     return nweb_->GetAccessibilityNodeInfoByFocusMove(accessibilityId, direction);
6778 }
6779 
GetCopyOptionMode() const6780 OHOS::NWeb::NWebPreference::CopyOptionMode WebDelegate::GetCopyOptionMode() const
6781 {
6782     CHECK_NULL_RETURN(nweb_, OHOS::NWeb::NWebPreference::CopyOptionMode::CROSS_DEVICE);
6783     std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_->GetPreference();
6784     CHECK_NULL_RETURN(setting, OHOS::NWeb::NWebPreference::CopyOptionMode::CROSS_DEVICE);
6785     auto copyOption = setting->GetCopyOptionMode();
6786     return copyOption;
6787 }
6788 
OnOpenAppLink(const std::string & url,std::shared_ptr<OHOS::NWeb::NWebAppLinkCallback> callback)6789 bool WebDelegate::OnOpenAppLink(
6790     const std::string& url, std::shared_ptr<OHOS::NWeb::NWebAppLinkCallback> callback)
6791 {
6792     if (!callback) {
6793         TAG_LOGE(AceLogTag::ACE_WEB, "open app link callback is nullptr");
6794         return false;
6795     }
6796     auto context = context_.Upgrade();
6797     CHECK_NULL_RETURN(context, false);
6798     bool result = false;
6799     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
6800     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), url, callback, &result]() {
6801         auto delegate = weak.Upgrade();
6802         CHECK_NULL_VOID(delegate);
6803         auto webPattern = delegate->webPattern_.Upgrade();
6804         CHECK_NULL_VOID(webPattern);
6805         auto openAppLinkCallback = webPattern->GetOnOpenAppLinkCallback();
6806         CHECK_NULL_VOID(openAppLinkCallback);
6807         openAppLinkCallback(std::make_shared<WebAppLinkEvent>(url,
6808             AceType::MakeRefPtr<WebAppLinkCallbackOhos>(callback)));
6809         result = true;
6810         }, "ArkUIWebOnOpenAppLink");
6811     return result;
6812 }
6813 
GetCanonicalEncodingName(const std::string & alias_name) const6814 std::string WebDelegate::GetCanonicalEncodingName(const std::string& alias_name) const
6815 {
6816     const char* standards[3] = { "HTML", "MIME", "IANA" };
6817     for (auto* standard : standards) {
6818         UErrorCode errorCode = U_ZERO_ERROR;
6819         const char* result =
6820             ucnv_getStandardName(alias_name.c_str(), standard, &errorCode);
6821         if (!U_SUCCESS(errorCode) || !result)
6822             continue;
6823         std::string canonicalName(result);
6824         for (const auto& encodingName : CANONICALENCODINGNAMES) {
6825             if (encodingName == canonicalName)
6826                 return canonicalName;
6827         }
6828     }
6829     return DEFAULT_CANONICAL_ENCODING_NAME;
6830 }
6831 
UpdateDefaultTextEncodingFormat(const std::string & textEncodingFormat)6832 void WebDelegate::UpdateDefaultTextEncodingFormat(const std::string& textEncodingFormat)
6833 {
6834     auto context = context_.Upgrade();
6835     if (!context || textEncodingFormat.empty()) {
6836         return;
6837     }
6838     auto canonicalEncodingName = GetCanonicalEncodingName(textEncodingFormat);
6839     context->GetTaskExecutor()->PostTask(
6840         [weak = WeakClaim(this), canonicalEncodingName]() {
6841             auto delegate = weak.Upgrade();
6842             if (delegate && delegate->nweb_) {
6843                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6844                 if (setting) {
6845                     setting->PutDefaultTextEncodingFormat(canonicalEncodingName);
6846                 }
6847             }
6848         },
6849         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateDefaultTextEncodingFormat");
6850 }
6851 
OnIntelligentTrackingPreventionResult(const std::string & websiteHost,const std::string & trackerHost)6852 void WebDelegate::OnIntelligentTrackingPreventionResult(
6853     const std::string& websiteHost, const std::string& trackerHost)
6854 {
6855     if (onIntelligentTrackingPreventionResultV2_) {
6856         onIntelligentTrackingPreventionResultV2_(
6857             std::make_shared<IntelligentTrackingPreventionResultEvent>(
6858                 websiteHost, trackerHost));
6859     }
6860 }
6861 
OnHandleOverrideLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)6862 bool WebDelegate::OnHandleOverrideLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)
6863 {
6864     if (!request) {
6865         return false;
6866     }
6867     auto context = context_.Upgrade();
6868     CHECK_NULL_RETURN(context, false);
6869     bool result = false;
6870     auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
6871     jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), request, &result]() {
6872         auto delegate = weak.Upgrade();
6873         CHECK_NULL_VOID(delegate);
6874         auto webRequest = AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
6875             request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect());
6876         auto param = std::make_shared<LoadOverrideEvent>(webRequest);
6877         if (Container::IsCurrentUseNewPipeline()) {
6878             auto webPattern = delegate->webPattern_.Upgrade();
6879             CHECK_NULL_VOID(webPattern);
6880             auto webEventHub = webPattern->GetWebEventHub();
6881             CHECK_NULL_VOID(webEventHub);
6882             auto propOnOverrideUrlLoadingEvent = webEventHub->GetOnOverrideUrlLoadingEvent();
6883             CHECK_NULL_VOID(propOnOverrideUrlLoadingEvent);
6884             result = propOnOverrideUrlLoadingEvent(param);
6885         }
6886         auto webCom = delegate->webComponent_.Upgrade();
6887         CHECK_NULL_VOID(webCom);
6888         result = webCom->OnOverrideUrlLoading(param.get());
6889         }, "ArkUIWebHandleOverrideLoading");
6890     return result;
6891 }
6892 
OnDetachContext()6893 void WebDelegate::OnDetachContext()
6894 {
6895     UnRegisterScreenLockFunction();
6896     UnregisterSurfacePositionChangedCallback();
6897     auto context = context_.Upgrade();
6898     CHECK_NULL_VOID(context);
6899     auto pipelineContext = DynamicCast<NG::PipelineContext>(context);
6900     CHECK_NULL_VOID(pipelineContext);
6901     pipelineContext->AddAfterRenderTask(
6902         [weak = WeakClaim(this)]() {
6903             auto delegate = weak.Upgrade();
6904             CHECK_NULL_VOID(delegate);
6905             delegate->UnregisterAvoidAreaChangeListener();
6906         });
6907 }
6908 
OnAttachContext(const RefPtr<NG::PipelineContext> & context)6909 void WebDelegate::OnAttachContext(const RefPtr<NG::PipelineContext> &context)
6910 {
6911     instanceId_ = context->GetInstanceId();
6912     context_ = context;
6913     RegisterSurfacePositionChangedCallback();
6914     if (nweb_) {
6915         auto screenLockCallback = std::make_shared<NWebScreenLockCallbackImpl>(context);
6916         nweb_->RegisterScreenLockFunction(instanceId_, screenLockCallback);
6917         auto windowId = context->GetFocusWindowId();
6918         nweb_->SetWindowId(windowId);
6919     }
6920     auto pipelineContext = DynamicCast<NG::PipelineContext>(context);
6921     CHECK_NULL_VOID(pipelineContext);
6922     pipelineContext->AddAfterRenderTask(
6923         [weak = WeakClaim(this)]() {
6924             auto delegate = weak.Upgrade();
6925             CHECK_NULL_VOID(delegate);
6926             delegate->RegisterAvoidAreaChangeListener();
6927         });
6928 }
6929 
UpdateMetaViewport(bool isMetaViewportEnabled)6930 void WebDelegate::UpdateMetaViewport(bool isMetaViewportEnabled)
6931 {
6932     auto context = context_.Upgrade();
6933     CHECK_NULL_VOID(context);
6934     context->GetTaskExecutor()->PostTask(
6935         [weak = WeakClaim(this), isMetaViewportEnabled]() {
6936             auto delegate = weak.Upgrade();
6937             if (delegate && delegate->nweb_) {
6938                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
6939                 if (setting) {
6940                     setting->SetViewportEnable(isMetaViewportEnabled);
6941                 }
6942             }
6943         },
6944         TaskExecutor::TaskType::PLATFORM, "ArkUIWebUpdateMetaViewport");
6945 }
6946 
GetWordSelection(const std::string & text,int8_t offset)6947 std::vector<int8_t> WebDelegate::GetWordSelection(const std::string& text, int8_t offset)
6948 {
6949     auto webPattern = webPattern_.Upgrade();
6950     std::vector<int8_t> vec = { -1, -1 };
6951     CHECK_NULL_RETURN(webPattern, vec);
6952     return webPattern->GetWordSelection(text, offset);
6953 }
6954 
NotifyForNextTouchEvent()6955 void WebDelegate::NotifyForNextTouchEvent()
6956 {
6957     ACE_DCHECK(nweb_ != nullptr);
6958     if (nweb_) {
6959         nweb_->NotifyForNextTouchEvent();
6960     }
6961 }
6962 
OnRenderProcessNotResponding(const std::string & jsStack,int pid,OHOS::NWeb::RenderProcessNotRespondingReason reason)6963 void WebDelegate::OnRenderProcessNotResponding(
6964     const std::string& jsStack, int pid, OHOS::NWeb::RenderProcessNotRespondingReason reason)
6965 {
6966     auto context = context_.Upgrade();
6967     CHECK_NULL_VOID(context);
6968     context->GetTaskExecutor()->PostTask(
6969         [weak = WeakClaim(this), jsStack, pid, reason]() {
6970             auto delegate = weak.Upgrade();
6971             CHECK_NULL_VOID(delegate);
6972             auto onRenderProcessNotRespondingV2 = delegate->onRenderProcessNotRespondingV2_;
6973             if (onRenderProcessNotRespondingV2) {
6974                 onRenderProcessNotRespondingV2(std::make_shared<RenderProcessNotRespondingEvent>(
6975                     jsStack, pid, static_cast<int>(reason)));
6976             }
6977         },
6978         TaskExecutor::TaskType::JS, "ArkUIWebHandleRenderProcessNotResponding");
6979 }
6980 
OnRenderProcessResponding()6981 void WebDelegate::OnRenderProcessResponding()
6982 {
6983     auto context = context_.Upgrade();
6984     CHECK_NULL_VOID(context);
6985     context->GetTaskExecutor()->PostTask(
6986         [weak = WeakClaim(this)]() {
6987             auto delegate = weak.Upgrade();
6988             CHECK_NULL_VOID(delegate);
6989             auto onRenderProcessRespondingV2 = delegate->onRenderProcessRespondingV2_;
6990             if (onRenderProcessRespondingV2) {
6991                 onRenderProcessRespondingV2(std::make_shared<RenderProcessRespondingEvent>());
6992             }
6993         },
6994         TaskExecutor::TaskType::JS, "ArkUIWebHandleRenderProcessResponding");
6995 }
6996 
ScaleGestureChange(double scale,double centerX,double centerY)6997 void WebDelegate::ScaleGestureChange(double scale, double centerX, double centerY)
6998 {
6999 #ifdef OHOS_STANDARD_SYSTEM
7000     ACE_DCHECK(nweb_ != nullptr);
7001     if (nweb_) {
7002         nweb_->ScaleGestureChange(scale, centerX, centerY);
7003     }
7004 #endif
7005 }
7006 
GetSelectInfo() const7007 std::string WebDelegate::GetSelectInfo() const
7008 {
7009     CHECK_NULL_RETURN(nweb_, std::string());
7010     return nweb_->GetSelectInfo();
7011 }
7012 
GetPosition(const std::string & embedId)7013 Offset WebDelegate::GetPosition(const std::string& embedId)
7014 {
7015     auto iter = embedDataInfo_.find(embedId);
7016     if (iter != embedDataInfo_.end()) {
7017         std::shared_ptr<OHOS::NWeb::NWebNativeEmbedDataInfo> dataInfo  = iter->second;
7018         if (dataInfo) {
7019             auto embedInfo = dataInfo->GetNativeEmbedInfo();
7020             return Offset(embedInfo->GetX(), embedInfo->GetY());
7021         }
7022     }
7023     return Offset();
7024 }
7025 
OnShowAutofillPopup(const float offsetX,const float offsetY,const std::vector<std::string> & menu_items)7026 void WebDelegate::OnShowAutofillPopup(
7027     const float offsetX, const float offsetY, const std::vector<std::string>& menu_items)
7028 {
7029     auto webPattern = webPattern_.Upgrade();
7030     CHECK_NULL_VOID(webPattern);
7031     webPattern->OnShowAutofillPopup(offsetX, offsetY, menu_items);
7032 }
7033 
SuggestionSelected(int32_t index)7034 void WebDelegate::SuggestionSelected(int32_t index)
7035 {
7036     CHECK_NULL_VOID(nweb_);
7037     nweb_->SuggestionSelected(index);
7038 }
7039 
OnHideAutofillPopup()7040 void WebDelegate::OnHideAutofillPopup()
7041 {
7042     auto webPattern = webPattern_.Upgrade();
7043     CHECK_NULL_VOID(webPattern);
7044     webPattern->OnHideAutofillPopup();
7045 }
7046 
OnAreaChange(const OHOS::Ace::Rect & area)7047 void WebDelegate::OnAreaChange(const OHOS::Ace::Rect& area)
7048 {
7049     if (currentArea_ == area) {
7050         return;
7051     }
7052     currentArea_ = area;
7053     if (nweb_) {
7054         double offsetX = 0;
7055         double offsetY = 0;
7056         UpdateScreenOffSet(offsetX, offsetY);
7057         nweb_->SetScreenOffSet(offsetX, offsetY);
7058     }
7059     OnSafeInsetsChange();
7060 }
7061 
OnViewportFitChange(OHOS::NWeb::ViewportFit viewportFit)7062 void WebDelegate::OnViewportFitChange(OHOS::NWeb::ViewportFit viewportFit)
7063 {
7064     auto context = context_.Upgrade();
7065     CHECK_NULL_VOID(context);
7066     context->GetTaskExecutor()->PostTask(
7067         [weak = WeakClaim(this), viewportFit]() {
7068             auto delegate = weak.Upgrade();
7069             CHECK_NULL_VOID(delegate);
7070             auto onViewportFitChangedV2 = delegate->onViewportFitChangedV2_;
7071             if (onViewportFitChangedV2) {
7072                 onViewportFitChangedV2(std::make_shared<ViewportFitChangedEvent>(static_cast<int32_t>(viewportFit)));
7073             }
7074         },
7075         TaskExecutor::TaskType::JS, "ArkUIWebViewportFitChanged");
7076 }
7077 
OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea,OHOS::Rosen::AvoidAreaType type)7078 void WebDelegate::OnAvoidAreaChanged(const OHOS::Rosen::AvoidArea avoidArea, OHOS::Rosen::AvoidAreaType type)
7079 {
7080     bool changed = false;
7081     auto safeArea = ConvertAvoidArea(avoidArea);
7082 
7083     if (type == Rosen::AvoidAreaType::TYPE_SYSTEM) {
7084         changed = (systemSafeArea_ != safeArea);
7085         systemSafeArea_ = safeArea;
7086     } else if (type == Rosen::AvoidAreaType::TYPE_CUTOUT) {
7087         changed = (cutoutSafeArea_ != safeArea);
7088         cutoutSafeArea_ = safeArea;
7089     } else if (type == Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR) {
7090         changed = (navigationIndicatorSafeArea_ != safeArea);
7091         navigationIndicatorSafeArea_ = safeArea;
7092     }
7093 
7094     if (changed) {
7095         OnSafeInsetsChange();
7096     }
7097 }
7098 
OnInterceptKeyboardAttach(const std::shared_ptr<OHOS::NWeb::NWebCustomKeyboardHandler> keyboardHandler,const std::map<std::string,std::string> & attributes,bool & useSystemKeyboard,int32_t & enterKeyType)7099 void WebDelegate::OnInterceptKeyboardAttach(
7100     const std::shared_ptr<OHOS::NWeb::NWebCustomKeyboardHandler> keyboardHandler,
7101     const std::map<std::string, std::string> &attributes, bool &useSystemKeyboard, int32_t &enterKeyType)
7102 {
7103     CHECK_NULL_VOID(onInterceptKeyboardAttachV2_);
7104     auto context = context_.Upgrade();
7105     CHECK_NULL_VOID(context);
7106     keyboardHandler_ = keyboardHandler;
7107     WebKeyboardOption keyboardOpt;
7108     std::function<void()> buildFunc = nullptr;
7109     context->GetTaskExecutor()->PostSyncTask(
7110         [weak = WeakClaim(this), &keyboardHandler, &attributes, &keyboardOpt]() {
7111             auto delegate = weak.Upgrade();
7112             CHECK_NULL_VOID(delegate);
7113             auto onInterceptKeyboardAttachV2_ = delegate->onInterceptKeyboardAttachV2_;
7114             if (onInterceptKeyboardAttachV2_) {
7115                 auto param = AceType::MakeRefPtr<WebCustomKeyboardHandlerOhos>(keyboardHandler);
7116                 keyboardOpt = onInterceptKeyboardAttachV2_(std::make_shared<InterceptKeyboardEvent>(param, attributes));
7117             }
7118         },
7119         TaskExecutor::TaskType::JS, "ArkUIWebHandleInterceptKeyboardAttach");
7120 
7121     useSystemKeyboard = keyboardOpt.isSystemKeyboard_;
7122     enterKeyType = keyboardOpt.enterKeyTpye_;
7123     auto webPattern = webPattern_.Upgrade();
7124     CHECK_NULL_VOID(webPattern);
7125     webPattern->SetCustomKeyboardBuilder(keyboardOpt.customKeyboardBuilder_);
7126     TAG_LOGI(AceLogTag::ACE_WEB, "WebCustomKeyboard OnInterceptKeyboardAttach sync task end");
7127 }
7128 
OnCustomKeyboardAttach()7129 void WebDelegate::OnCustomKeyboardAttach()
7130 {
7131     auto webPattern = webPattern_.Upgrade();
7132     CHECK_NULL_VOID(webPattern);
7133     webPattern->AttachCustomKeyboard();
7134 }
7135 
OnCustomKeyboardClose()7136 void WebDelegate::OnCustomKeyboardClose()
7137 {
7138     auto webPattern = webPattern_.Upgrade();
7139     CHECK_NULL_VOID(webPattern);
7140     webPattern->CloseCustomKeyboard();
7141 }
7142 
KeyboardReDispatch(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent> & event,bool isUsed)7143 void WebDelegate::KeyboardReDispatch(const std::shared_ptr<OHOS::NWeb::NWebKeyEvent>& event, bool isUsed)
7144 {
7145     auto webPattern = webPattern_.Upgrade();
7146     CHECK_NULL_VOID(webPattern);
7147     webPattern->KeyboardReDispatch(event, isUsed);
7148 }
7149 
OnCursorUpdate(double x,double y,double width,double height)7150 void WebDelegate::OnCursorUpdate(double x, double y, double width, double height)
7151 {
7152     auto webPattern = webPattern_.Upgrade();
7153     CHECK_NULL_VOID(webPattern);
7154     webPattern->OnCursorUpdate(x, y, width, height);
7155 }
7156 
OnSafeInsetsChange()7157 void WebDelegate::OnSafeInsetsChange()
7158 {
7159     NG::SafeAreaInsets resultSafeArea({0, 0}, {0, 0}, {0, 0}, {0, 0});
7160     resultSafeArea = resultSafeArea.Combine(systemSafeArea_);
7161     resultSafeArea = resultSafeArea.Combine(cutoutSafeArea_);
7162     resultSafeArea = resultSafeArea.Combine(navigationIndicatorSafeArea_);
7163 
7164     int left = 0;
7165     if (resultSafeArea.left_.IsValid() && resultSafeArea.left_.end > currentArea_.Left()) {
7166         left = static_cast<int>(resultSafeArea.left_.start + resultSafeArea.left_.end);
7167     }
7168     int top = 0;
7169     if (resultSafeArea.top_.IsValid() && resultSafeArea.top_.end > currentArea_.Top()) {
7170         top = static_cast<int>(resultSafeArea.top_.end - resultSafeArea.top_.start);
7171     }
7172     int right = 0;
7173     if (resultSafeArea.right_.IsValid() && resultSafeArea.right_.start < currentArea_.Right()) {
7174         constexpr static int32_t CUTOUT_EDGES_BALANCE_FACTOR = 2;
7175         right = static_cast<int>(resultSafeArea.right_.end - resultSafeArea.right_.start +
7176                 (currentArea_.Right() - resultSafeArea.right_.end) * CUTOUT_EDGES_BALANCE_FACTOR);
7177     }
7178     int bottom = 0;
7179     if (resultSafeArea.bottom_.IsValid() && resultSafeArea.bottom_.start < currentArea_.Bottom()) {
7180         bottom = static_cast<int>(resultSafeArea.bottom_.end - resultSafeArea.bottom_.start);
7181     }
7182 
7183     if (left < 0 || bottom < 0 || right < 0 || top < 0) {
7184         TAG_LOGE(AceLogTag::ACE_WEB, "WebDelegate::OnSafeInsetsChange occur errors "
7185                 "ltrb:%{public}d,%{public}d,%{public}d,%{public}d", left, top, right, bottom);
7186         return;
7187     }
7188 
7189     TAG_LOGD(AceLogTag::ACE_WEB,
7190         "WebDelegate::OnSafeInsetsChange left:%{public}d top:%{public}d right:%{public}d bottom:%{public}d "
7191         "systemSafeArea:%{public}s cutoutSafeArea:%{public}s navigationIndicatorSafeArea:%{public}s "
7192         "resultSafeArea:%{public}s currentArea:%{public}s", left, top, right, bottom,
7193         systemSafeArea_.ToString().c_str(), cutoutSafeArea_.ToString().c_str(),
7194         navigationIndicatorSafeArea_.ToString().c_str(), resultSafeArea.ToString().c_str(),
7195         currentArea_.ToString().c_str());
7196 
7197     auto context = context_.Upgrade();
7198     if (!context) {
7199         return;
7200     }
7201     context->GetTaskExecutor()->PostTask(
7202         [weak = WeakClaim(this), left, top, right, bottom]() {
7203             auto delegate = weak.Upgrade();
7204             if (delegate && delegate->nweb_ && !delegate->window_) {
7205                 delegate->nweb_->OnSafeInsetsChange(left, top, right, bottom);
7206             }
7207         },
7208         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSafeInsetsChange");
7209 }
7210 
CreateOverlay(void * data,size_t len,int width,int height,int offsetX,int offsetY,int rectWidth,int rectHeight,int pointX,int pointY)7211 void WebDelegate::CreateOverlay(void* data, size_t len, int width, int height, int offsetX, int offsetY, int rectWidth,
7212     int rectHeight, int pointX, int pointY)
7213 {
7214     auto webPattern = webPattern_.Upgrade();
7215     CHECK_NULL_VOID(webPattern);
7216     webPattern->CreateOverlay(PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height),
7217         offsetX,
7218         offsetY,
7219         rectWidth,
7220         rectHeight,
7221         pointX,
7222         pointY);
7223 }
7224 
OnOverlayStateChanged(int offsetX,int offsetY,int rectWidth,int rectHeight)7225 void WebDelegate::OnOverlayStateChanged(int offsetX, int offsetY, int rectWidth, int rectHeight)
7226 {
7227     auto webPattern = webPattern_.Upgrade();
7228     CHECK_NULL_VOID(webPattern);
7229     webPattern->OnOverlayStateChanged(offsetX, offsetY, rectWidth, rectHeight);
7230 }
7231 
OnTextSelected()7232 void WebDelegate::OnTextSelected()
7233 {
7234     auto delegate = WeakClaim(this).Upgrade();
7235     CHECK_NULL_VOID(delegate);
7236     if (delegate->nweb_) {
7237         delegate->nweb_->OnTextSelected();
7238     }
7239 }
7240 
OnDestroyImageAnalyzerOverlay()7241 void WebDelegate::OnDestroyImageAnalyzerOverlay()
7242 {
7243     CHECK_NULL_VOID(nweb_);
7244     nweb_->OnDestroyImageAnalyzerOverlay();
7245 }
7246 
GetWebInfoType()7247 std::string WebDelegate::GetWebInfoType()
7248 {
7249     std::string factoryLevel = NWebAdapterHelper::Instance()
7250         .ParsePerfConfig("factoryConfig", "factoryLevel");
7251     if (factoryLevel.empty()) {
7252         NWebAdapterHelper::Instance().ReadConfigIfNeeded();
7253         factoryLevel = NWebAdapterHelper::Instance().
7254             ParsePerfConfig("factoryConfig", "factoryLevel");
7255     }
7256     TAG_LOGD(AceLogTag::ACE_WEB, "read config factoryLevel: %{public}s ", factoryLevel.c_str());
7257     return factoryLevel;
7258 }
7259 
SetSurfaceId(const std::string & surfaceId)7260 void WebDelegate::SetSurfaceId(const std::string& surfaceId)
7261 {
7262     auto context = context_.Upgrade();
7263     if (!context) {
7264         return;
7265     }
7266     context->GetTaskExecutor()->PostTask(
7267         [weak = WeakClaim(this), surfaceId]() {
7268             auto delegate = weak.Upgrade();
7269             if (delegate && delegate->nweb_) {
7270                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
7271                 CHECK_NULL_VOID(setting);
7272                 setting->SetSurfaceId(surfaceId);
7273             }
7274         },
7275         TaskExecutor::TaskType::PLATFORM, "ArkUIWebSetSurfaceId");
7276 }
7277 
OnAdsBlocked(const std::string & url,const std::vector<std::string> & adsBlocked)7278 void WebDelegate::OnAdsBlocked(const std::string& url, const std::vector<std::string>& adsBlocked)
7279 {
7280     auto context = context_.Upgrade();
7281     CHECK_NULL_VOID(context);
7282     context->GetTaskExecutor()->PostTask(
7283         [weak = WeakClaim(this), url, adsBlocked]() {
7284             auto delegate = weak.Upgrade();
7285             CHECK_NULL_VOID(delegate);
7286             auto onAdsBlockedV2 = delegate->onAdsBlockedV2_;
7287             if (onAdsBlockedV2) {
7288                 onAdsBlockedV2(std::make_shared<AdsBlockedEvent>(url, adsBlocked));
7289             }
7290         },
7291         TaskExecutor::TaskType::JS, "ArkUiWebAdsBlocked");
7292 }
7293 
SpanstringConvertHtml(const std::vector<uint8_t> & content)7294 std::string WebDelegate::SpanstringConvertHtml(const std::vector<uint8_t> &content)
7295 {
7296     std::vector<uint8_t> tempVec(content.begin(), content.end());
7297     std::string htmlStr = OHOS::Ace::SpanToHtml::ToHtml(tempVec);
7298     TAG_LOGD(AceLogTag::ACE_WEB, "pasteboard spasntring convert html success,"
7299         " string length = %{public}u", static_cast<int32_t>(htmlStr.length()));
7300     return htmlStr;
7301 }
7302 
StartVibraFeedback(const std::string & vibratorType)7303 void WebDelegate::StartVibraFeedback(const std::string& vibratorType)
7304 {
7305     auto webPattern = webPattern_.Upgrade();
7306     CHECK_NULL_VOID(webPattern);
7307     webPattern->StartVibraFeedback(vibratorType);
7308 }
7309 
CloseImageOverlaySelection()7310 bool WebDelegate::CloseImageOverlaySelection()
7311 {
7312     auto webPattern = webPattern_.Upgrade();
7313     CHECK_NULL_RETURN(webPattern, false);
7314     return webPattern->CloseImageOverlaySelection();
7315 }
7316 
GetAccessibilityVisible(int64_t accessibilityId)7317 bool WebDelegate::GetAccessibilityVisible(int64_t accessibilityId)
7318 {
7319     CHECK_NULL_RETURN(nweb_, true);
7320     return nweb_->GetAccessibilityVisible(accessibilityId);
7321 }
7322 } // namespace OHOS::Ace
7323