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