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