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