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