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