1 /*
2 * Copyright (c) 2021-2022 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 <iomanip>
20 #include <optional>
21 #include <sstream>
22
23 #include "base/json/json_util.h"
24 #include "base/log/log.h"
25 #include "base/log/ace_trace.h"
26 #include "base/memory/referenced.h"
27 #include "base/ressched/ressched_report.h"
28 #include "base/utils/utils.h"
29 #include "core/common/container.h"
30 #include "core/components/container_modal/container_modal_constants.h"
31 #include "core/components/web/render_web.h"
32 #include "core/components/web/web_event.h"
33 #include "core/components/web/web_property.h"
34 #include "core/components_ng/pattern/web/web_pattern.h"
35 #include "core/pipeline_ng/pipeline_context.h"
36 #ifdef ENABLE_ROSEN_BACKEND
37 #include "core/components_ng/render/adapter/rosen_render_context.h"
38 #include "core/components_ng/render/adapter/rosen_render_surface.h"
39 #endif
40 #include "core/event/ace_event_helper.h"
41 #include "core/event/ace_events.h"
42 #include "core/event/back_end_event_manager.h"
43 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h"
44 #include "core/common/ace_application_info.h"
45 #ifdef OHOS_STANDARD_SYSTEM
46 #include "application_env.h"
47 #include "nweb_adapter_helper.h"
48 #include "nweb_handler.h"
49 #include "parameters.h"
50 #include "web_configuration_observer.h"
51 #include "web_javascript_execute_callback.h"
52 #include "web_javascript_result_callback.h"
53 #endif
54
55 namespace OHOS::Ace {
56
57 namespace {
58
59 constexpr char WEB_METHOD_ROUTER_BACK[] = "routerBack";
60 constexpr char WEB_METHOD_UPDATEURL[] = "updateUrl";
61 constexpr char WEB_METHOD_CHANGE_PAGE_URL[] = "changePageUrl";
62 constexpr char WEB_METHOD_PAGE_PATH_INVALID[] = "pagePathInvalid";
63 constexpr char WEB_EVENT_PAGESTART[] = "onPageStarted";
64 constexpr char WEB_EVENT_PAGEFINISH[] = "onPageFinished";
65 constexpr char WEB_EVENT_PAGEERROR[] = "onPageError";
66 constexpr char WEB_EVENT_ONMESSAGE[] = "onMessage";
67 constexpr char WEB_EVENT_ROUTERPUSH[] = "routerPush";
68
69 constexpr char WEB_CREATE[] = "web";
70 constexpr char NTC_PARAM_WEB[] = "web";
71 constexpr char NTC_PARAM_WIDTH[] = "width";
72 constexpr char NTC_PARAM_HEIGHT[] = "height";
73 constexpr char NTC_PARAM_LEFT[] = "left";
74 constexpr char NTC_PARAM_TOP[] = "top";
75 constexpr char NTC_ERROR[] = "create error";
76 constexpr char NTC_PARAM_SRC[] = "src";
77 constexpr char NTC_PARAM_ERROR_CODE[] = "errorCode";
78 constexpr char NTC_PARAM_URL[] = "url";
79 constexpr char NTC_PARAM_PAGE_URL[] = "pageUrl";
80 constexpr char NTC_PARAM_PAGE_INVALID[] = "pageInvalid";
81 constexpr char NTC_PARAM_DESCRIPTION[] = "description";
82 constexpr char WEB_ERROR_CODE_CREATEFAIL[] = "error-web-delegate-000001";
83 constexpr char WEB_ERROR_MSG_CREATEFAIL[] = "create web_delegate failed.";
84
85 const std::string RESOURCE_VIDEO_CAPTURE = "TYPE_VIDEO_CAPTURE";
86 const std::string RESOURCE_AUDIO_CAPTURE = "TYPE_AUDIO_CAPTURE";
87 const std::string RESOURCE_PROTECTED_MEDIA_ID = "TYPE_PROTECTED_MEDIA_ID";
88 const std::string RESOURCE_MIDI_SYSEX = "TYPE_MIDI_SYSEX";
89
90 constexpr uint32_t DESTRUCT_DELAY_MILLISECONDS = 1000;
91 } // namespace
92
93 #define EGLCONFIG_VERSION 3
94
SetPortHandle(std::string & handle)95 void WebMessagePortOhos::SetPortHandle(std::string& handle)
96 {
97 handle_ = handle;
98 }
99
GetPortHandle()100 std::string WebMessagePortOhos::GetPortHandle()
101 {
102 return handle_;
103 }
104
Close()105 void WebMessagePortOhos::Close()
106 {
107 auto delegate = webDelegate_.Upgrade();
108 if (!delegate) {
109 LOGE("delegate its null");
110 return;
111 }
112 delegate->ClosePort(handle_);
113 }
114
PostMessage(std::string & data)115 void WebMessagePortOhos::PostMessage(std::string& data)
116 {
117 auto delegate = webDelegate_.Upgrade();
118 if (!delegate) {
119 LOGE("delegate its null");
120 return;
121 }
122 delegate->PostPortMessage(handle_, data);
123 }
124
SetWebMessageCallback(std::function<void (const std::string &)> && callback)125 void WebMessagePortOhos::SetWebMessageCallback(std::function<void(const std::string&)>&& callback)
126 {
127 auto delegate = webDelegate_.Upgrade();
128 if (!delegate) {
129 LOGE("delegate its null");
130 return;
131 }
132 delegate->SetPortMessageCallback(handle_, std::move(callback));
133 }
134
GetLineNumber()135 int ConsoleLogOhos::GetLineNumber()
136 {
137 if (message_) {
138 return message_->LineNumer();
139 }
140 return -1;
141 }
142
GetLog()143 std::string ConsoleLogOhos::GetLog()
144 {
145 if (message_) {
146 return message_->Log();
147 }
148 return "";
149 }
150
GetLogLevel()151 int ConsoleLogOhos::GetLogLevel()
152 {
153 if (message_) {
154 return message_->LogLevel();
155 }
156 return -1;
157 }
158
GetSourceId()159 std::string ConsoleLogOhos::GetSourceId()
160 {
161 if (message_) {
162 return message_->SourceId();
163 }
164 return "";
165 }
166
Confirm()167 void ResultOhos::Confirm()
168 {
169 if (result_) {
170 result_->Confirm();
171 }
172 }
173
Confirm(const std::string & message)174 void ResultOhos::Confirm(const std::string& message)
175 {
176 if (result_) {
177 result_->Confirm(message);
178 }
179 }
180
Cancel()181 void ResultOhos::Cancel()
182 {
183 if (result_) {
184 result_->Cancel();
185 }
186 }
187
ExitFullScreen()188 void FullScreenExitHandlerOhos::ExitFullScreen()
189 {
190 auto delegate = webDelegate_.Upgrade();
191 CHECK_NULL_VOID(delegate);
192 CHECK_NULL_VOID(handler_);
193 if (Container::IsCurrentUseNewPipeline()) {
194 // notify chromium to exit fullscreen mode.
195 handler_->ExitFullScreen();
196 // notify web component in arkui to exit fullscreen mode.
197 delegate->ExitFullScreen();
198 }
199 }
200
Confirm(std::string & userName,std::string & pwd)201 bool AuthResultOhos::Confirm(std::string& userName, std::string& pwd)
202 {
203 if (result_) {
204 return result_->Confirm(userName, pwd);
205 }
206 return false;
207 }
208
IsHttpAuthInfoSaved()209 bool AuthResultOhos::IsHttpAuthInfoSaved()
210 {
211 if (result_) {
212 return result_->IsHttpAuthInfoSaved();
213 }
214 return false;
215 }
216
Cancel()217 void AuthResultOhos::Cancel()
218 {
219 if (result_) {
220 result_->Cancel();
221 }
222 }
223
HandleConfirm()224 void SslErrorResultOhos::HandleConfirm()
225 {
226 if (result_) {
227 result_->HandleConfirm();
228 }
229 }
230
HandleCancel()231 void SslErrorResultOhos::HandleCancel()
232 {
233 if (result_) {
234 result_->HandleCancel();
235 }
236 }
237
HandleConfirm(const std::string & privateKeyFile,const std::string & certChainFile)238 void SslSelectCertResultOhos::HandleConfirm(const std::string& privateKeyFile, const std::string& certChainFile)
239 {
240 if (result_) {
241 result_->Confirm(privateKeyFile, certChainFile);
242 }
243 }
244
HandleCancel()245 void SslSelectCertResultOhos::HandleCancel()
246 {
247 if (result_) {
248 result_->Cancel();
249 }
250 }
251
HandleIgnore()252 void SslSelectCertResultOhos::HandleIgnore()
253 {
254 if (result_) {
255 result_->Ignore();
256 }
257 }
258
GetTitle()259 std::string FileSelectorParamOhos::GetTitle()
260 {
261 if (param_) {
262 return param_->Title();
263 }
264 return "";
265 }
266
GetMode()267 int FileSelectorParamOhos::GetMode()
268 {
269 if (param_) {
270 return param_->Mode();
271 }
272 return 0;
273 }
274
GetDefaultFileName()275 std::string FileSelectorParamOhos::GetDefaultFileName()
276 {
277 if (param_) {
278 return param_->DefaultFilename();
279 }
280 return "";
281 }
282
GetAcceptType()283 std::vector<std::string> FileSelectorParamOhos::GetAcceptType()
284 {
285 if (param_) {
286 return param_->AcceptType();
287 }
288 return std::vector<std::string>();
289 }
290
IsCapture()291 bool FileSelectorParamOhos::IsCapture()
292 {
293 if (param_) {
294 return param_->IsCapture();
295 }
296 return false;
297 }
298
HandleFileList(std::vector<std::string> & result)299 void FileSelectorResultOhos::HandleFileList(std::vector<std::string>& result)
300 {
301 if (callback_) {
302 callback_->OnReceiveValue(result);
303 }
304 }
305
Deny() const306 void WebPermissionRequestOhos::Deny() const
307 {
308 if (request_) {
309 request_->Refuse();
310 }
311 }
312
GetOrigin() const313 std::string WebPermissionRequestOhos::GetOrigin() const
314 {
315 if (request_) {
316 return request_->Origin();
317 }
318 return "";
319 }
320
GetResources() const321 std::vector<std::string> WebPermissionRequestOhos::GetResources() const
322 {
323 std::vector<std::string> resources;
324 if (request_) {
325 uint32_t resourcesId = static_cast<uint32_t>(request_->ResourceAcessId());
326 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::VIDEO_CAPTURE) {
327 resources.push_back(RESOURCE_VIDEO_CAPTURE);
328 }
329 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::AUDIO_CAPTURE) {
330 resources.push_back(RESOURCE_AUDIO_CAPTURE);
331 }
332 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::PROTECTED_MEDIA_ID) {
333 resources.push_back(RESOURCE_PROTECTED_MEDIA_ID);
334 }
335 if (resourcesId & OHOS::NWeb::NWebAccessRequest::Resources::MIDI_SYSEX) {
336 resources.push_back(RESOURCE_MIDI_SYSEX);
337 }
338 }
339 return resources;
340 }
341
Grant(std::vector<std::string> & resources) const342 void WebPermissionRequestOhos::Grant(std::vector<std::string>& resources) const
343 {
344 if (request_) {
345 uint32_t resourcesId = 0;
346 for (auto res : resources) {
347 if (res == RESOURCE_VIDEO_CAPTURE) {
348 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::VIDEO_CAPTURE;
349 } else if (res == RESOURCE_AUDIO_CAPTURE) {
350 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::AUDIO_CAPTURE;
351 } else if (res == RESOURCE_PROTECTED_MEDIA_ID) {
352 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::PROTECTED_MEDIA_ID;
353 } else if (res == RESOURCE_MIDI_SYSEX) {
354 resourcesId |= OHOS::NWeb::NWebAccessRequest::Resources::MIDI_SYSEX;
355 }
356 }
357 request_->Agree(resourcesId);
358 }
359 }
360
Deny() const361 void WebScreenCaptureRequestOhos::Deny() const
362 {
363 if (request_) {
364 request_->Refuse();
365 }
366 }
367
GetOrigin() const368 std::string WebScreenCaptureRequestOhos::GetOrigin() const
369 {
370 if (request_) {
371 return request_->Origin();
372 }
373 return "";
374 }
375
SetCaptureMode(int32_t mode)376 void WebScreenCaptureRequestOhos::SetCaptureMode(int32_t mode)
377 {
378 config_.mode = mode;
379 }
380
SetSourceId(int32_t sourceId)381 void WebScreenCaptureRequestOhos::SetSourceId(int32_t sourceId)
382 {
383 config_.sourceId = sourceId;
384 }
385
Grant() const386 void WebScreenCaptureRequestOhos::Grant() const
387 {
388 if (request_) {
389 request_->Agree(config_);
390 }
391 }
392
GetXCoord() const393 int32_t ContextMenuParamOhos::GetXCoord() const
394 {
395 if (param_) {
396 return param_->GetXCoord();
397 }
398 return -1;
399 }
400
GetYCoord() const401 int32_t ContextMenuParamOhos::GetYCoord() const
402 {
403 if (param_) {
404 return param_->GetYCoord();
405 }
406 return -1;
407 }
408
GetLinkUrl() const409 std::string ContextMenuParamOhos::GetLinkUrl() const
410 {
411 if (param_) {
412 return param_->GetLinkUrl();
413 }
414 return "";
415 }
416
GetUnfilteredLinkUrl() const417 std::string ContextMenuParamOhos::GetUnfilteredLinkUrl() const
418 {
419 if (param_) {
420 return param_->GetUnfilteredLinkUrl();
421 }
422 return "";
423 }
424
GetSourceUrl() const425 std::string ContextMenuParamOhos::GetSourceUrl() const
426 {
427 if (param_) {
428 return param_->GetSourceUrl();
429 }
430 return "";
431 }
432
HasImageContents() const433 bool ContextMenuParamOhos::HasImageContents() const
434 {
435 if (param_) {
436 return param_->HasImageContents();
437 }
438 return false;
439 }
440
IsEditable() const441 bool ContextMenuParamOhos::IsEditable() const
442 {
443 if (param_) {
444 return param_->IsEditable();
445 }
446 return false;
447 }
448
GetEditStateFlags() const449 int ContextMenuParamOhos::GetEditStateFlags() const
450 {
451 if (param_) {
452 return param_->GetEditStateFlags();
453 }
454 return OHOS::NWeb::NWebContextMenuParams::ContextMenuEditStateFlags::CM_ES_NONE;
455 }
456
GetSourceType() const457 int ContextMenuParamOhos::GetSourceType() const
458 {
459 if (param_) {
460 return param_->GetSourceType();
461 }
462 return OHOS::NWeb::NWebContextMenuParams::ContextMenuSourceType::CM_ST_NONE;
463 }
464
GetMediaType() const465 int ContextMenuParamOhos::GetMediaType() const
466 {
467 if (param_) {
468 return param_->GetMediaType();
469 }
470 return OHOS::NWeb::NWebContextMenuParams::ContextMenuMediaType::CM_MT_NONE;
471 }
472
GetInputFieldType() const473 int ContextMenuParamOhos::GetInputFieldType() const
474 {
475 if (param_) {
476 return param_->GetInputFieldType();
477 }
478 return OHOS::NWeb::NWebContextMenuParams::ContextMenuInputFieldType::CM_IT_NONE;
479 }
480
GetSelectionText() const481 std::string ContextMenuParamOhos::GetSelectionText() const
482 {
483 if (param_) {
484 return param_->GetSelectionText();
485 }
486 return "";
487 }
488
Cancel() const489 void ContextMenuResultOhos::Cancel() const
490 {
491 if (callback_) {
492 callback_->Cancel();
493 }
494 }
495
CopyImage() const496 void ContextMenuResultOhos::CopyImage() const
497 {
498 if (callback_) {
499 callback_->Continue(CI_IMAGE_COPY, EF_NONE);
500 }
501 }
502
Copy() const503 void ContextMenuResultOhos::Copy() const
504 {
505 if (callback_) {
506 callback_->Continue(CI_COPY, EF_NONE);
507 }
508 }
509
Paste() const510 void ContextMenuResultOhos::Paste() const
511 {
512 if (callback_) {
513 callback_->Continue(CI_PASTE, EF_NONE);
514 }
515 }
516
Cut() const517 void ContextMenuResultOhos::Cut() const
518 {
519 if (callback_) {
520 callback_->Continue(CI_CUT, EF_NONE);
521 }
522 }
523
SelectAll() const524 void ContextMenuResultOhos::SelectAll() const
525 {
526 if (callback_) {
527 callback_->Continue(CI_SELECT_ALL, EF_NONE);
528 }
529 }
530
SetWebController(int32_t id)531 void WebWindowNewHandlerOhos::SetWebController(int32_t id)
532 {
533 if (handler_) {
534 handler_->SetNWebHandlerById(id);
535 }
536 }
537
IsFrist() const538 bool WebWindowNewHandlerOhos::IsFrist() const
539 {
540 if (handler_) {
541 return handler_->IsFrist();
542 }
543 return true;
544 }
545
GetId() const546 int32_t WebWindowNewHandlerOhos::GetId() const
547 {
548 if (handler_) {
549 return handler_->GetId();
550 }
551 return -1;
552 }
553
GetParentNWebId() const554 int32_t WebWindowNewHandlerOhos::GetParentNWebId() const
555 {
556 return parentNWebId_;
557 }
558
Resend()559 void DataResubmittedOhos::Resend()
560 {
561 if (handler_) {
562 handler_->Resend();
563 }
564 }
565
Cancel()566 void DataResubmittedOhos::Cancel()
567 {
568 if (handler_) {
569 handler_->Cancel();
570 }
571 }
572
GetData()573 const void* FaviconReceivedOhos::GetData()
574 {
575 return data_;
576 }
577
GetWidth()578 size_t FaviconReceivedOhos::GetWidth()
579 {
580 return width_;
581 }
582
GetHeight()583 size_t FaviconReceivedOhos::GetHeight()
584 {
585 return height_;
586 }
587
GetColorType()588 int FaviconReceivedOhos::GetColorType()
589 {
590 return static_cast<int>(colorType_);
591 }
592
GetAlphaType()593 int FaviconReceivedOhos::GetAlphaType()
594 {
595 return static_cast<int>(alphaType_);
596 }
597
~WebDelegateObserver()598 WebDelegateObserver::~WebDelegateObserver()
599 {
600 LOGI("WebDelegateObserver::~WebDelegateObserver");
601 }
602
NotifyDestory()603 void WebDelegateObserver::NotifyDestory()
604 {
605 LOGI("WebDelegateObserver::NotifyDestory");
606 auto context = context_.Upgrade();
607 CHECK_NULL_VOID(context);
608 auto taskExecutor = context->GetTaskExecutor();
609 CHECK_NULL_VOID(taskExecutor);
610 taskExecutor->PostDelayedTask(
611 [weak = WeakClaim(this)]() {
612 auto observer = weak.Upgrade();
613 CHECK_NULL_VOID(observer);
614 if (observer->delegate_) {
615 observer->delegate_.Reset();
616 }
617 },
618 TaskExecutor::TaskType::UI, DESTRUCT_DELAY_MILLISECONDS);
619 }
620
~WebDelegate()621 WebDelegate::~WebDelegate()
622 {
623 ReleasePlatformResource();
624 if (nweb_) {
625 nweb_->UnRegisterScreenLockFunction(GetRosenWindowId());
626 nweb_->OnDestroy();
627 }
628 UnregisterSurfacePositionChangedCallback();
629 }
630
ReleasePlatformResource()631 void WebDelegate::ReleasePlatformResource()
632 {
633 Stop();
634 Release();
635 }
636
Invoke(const std::string & origin,const bool & allow,const bool & retain)637 void WebGeolocationOhos::Invoke(const std::string& origin, const bool& allow, const bool& retain)
638 {
639 if (geolocationCallback_) {
640 geolocationCallback_->GeolocationCallbackInvoke(origin, allow, retain);
641 }
642 }
643
Stop()644 void WebDelegate::Stop()
645 {
646 auto context = context_.Upgrade();
647 if (!context) {
648 LOGI("fail to get context");
649 return;
650 }
651 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
652 if (platformTaskExecutor.IsRunOnCurrentThread()) {
653 UnregisterEvent();
654 } else {
655 platformTaskExecutor.PostTask([weak = WeakClaim(this)] {
656 auto delegate = weak.Upgrade();
657 if (delegate) {
658 delegate->UnregisterEvent();
659 }
660 });
661 }
662 }
663
UnregisterEvent()664 void WebDelegate::UnregisterEvent()
665 {
666 // TODO: add support for ng.
667 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
668 if (!context) {
669 LOGI("fail to get context");
670 return;
671 }
672 auto resRegister = context->GetPlatformResRegister();
673 if (resRegister == nullptr) {
674 return;
675 }
676 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGESTART));
677 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH));
678 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR));
679 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH));
680 resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE));
681 }
682
SetRenderWeb(const WeakPtr<RenderWeb> & renderWeb)683 void WebDelegate::SetRenderWeb(const WeakPtr<RenderWeb>& renderWeb)
684 {
685 renderWeb_ = renderWeb;
686 }
687
CreatePlatformResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)688 void WebDelegate::CreatePlatformResource(
689 const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
690 {
691 ReleasePlatformResource();
692 context_ = context;
693 CreatePluginResource(size, position, context);
694
695 auto reloadCallback = [weak = WeakClaim(this)]() {
696 auto delegate = weak.Upgrade();
697 if (!delegate) {
698 return false;
699 }
700 delegate->Reload();
701 return true;
702 };
703 WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
704
705 auto updateUrlCallback = [weak = WeakClaim(this)](const std::string& url) {
706 auto delegate = weak.Upgrade();
707 if (!delegate) {
708 return false;
709 }
710 delegate->UpdateUrl(url);
711 return true;
712 };
713 WebClient::GetInstance().RegisterUpdageUrlCallback(updateUrlCallback);
714 InitWebEvent();
715 }
716
LoadUrl(const std::string & url,const std::map<std::string,std::string> & httpHeaders)717 void WebDelegate::LoadUrl(const std::string& url, const std::map<std::string, std::string>& httpHeaders)
718 {
719 auto context = context_.Upgrade();
720 if (!context) {
721 return;
722 }
723 context->GetTaskExecutor()->PostTask(
724 [weak = WeakClaim(this), url, httpHeaders]() {
725 auto delegate = weak.Upgrade();
726 if (!delegate) {
727 return;
728 }
729 if (delegate->nweb_) {
730 delegate->nweb_->Load(
731 const_cast<std::string&>(url), const_cast<std::map<std::string, std::string>&>(httpHeaders));
732 }
733 },
734 TaskExecutor::TaskType::PLATFORM);
735 }
736
737 #ifdef OHOS_STANDARD_SYSTEM
Backward()738 void WebDelegate::Backward()
739 {
740 auto context = context_.Upgrade();
741 if (!context) {
742 LOGE("Get context failed, it is null.");
743 return;
744 }
745 context->GetTaskExecutor()->PostTask(
746 [weak = WeakClaim(this)]() {
747 auto delegate = weak.Upgrade();
748 if (!delegate) {
749 LOGE("Get delegate failed, it is null.");
750 return;
751 }
752 if (delegate->nweb_) {
753 delegate->nweb_->NavigateBack();
754 }
755 },
756 TaskExecutor::TaskType::PLATFORM);
757 }
758
Forward()759 void WebDelegate::Forward()
760 {
761 auto context = context_.Upgrade();
762 if (!context) {
763 LOGE("Get context failed, it is null.");
764 return;
765 }
766 context->GetTaskExecutor()->PostTask(
767 [weak = WeakClaim(this)]() {
768 auto delegate = weak.Upgrade();
769 if (!delegate) {
770 LOGE("Get delegate failed, it is null.");
771 return;
772 }
773 if (delegate->nweb_) {
774 delegate->nweb_->NavigateForward();
775 }
776 },
777 TaskExecutor::TaskType::PLATFORM);
778 }
779
ClearHistory()780 void WebDelegate::ClearHistory()
781 {
782 auto context = context_.Upgrade();
783 if (!context) {
784 LOGE("Get context failed, it is null.");
785 return;
786 }
787 context->GetTaskExecutor()->PostTask(
788 [weak = WeakClaim(this)]() {
789 auto delegate = weak.Upgrade();
790 if (!delegate) {
791 LOGE("Get delegate failed, it is null.");
792 return;
793 }
794 if (delegate->nweb_) {
795 delegate->nweb_->DeleteNavigateHistory();
796 }
797 },
798 TaskExecutor::TaskType::PLATFORM);
799 }
800
ClearSslCache()801 void WebDelegate::ClearSslCache()
802 {
803 LOGE("WebDelegate ClearSslCache");
804 auto context = context_.Upgrade();
805 if (!context) {
806 LOGE("Get context failed, it is null.");
807 return;
808 }
809 context->GetTaskExecutor()->PostTask(
810 [weak = WeakClaim(this)]() {
811 auto delegate = weak.Upgrade();
812 if (!delegate) {
813 LOGE("Get delegate failed, it is null.");
814 return;
815 }
816 if (delegate->nweb_) {
817 delegate->nweb_->ClearSslCache();
818 }
819 },
820 TaskExecutor::TaskType::PLATFORM);
821 }
822
ClearClientAuthenticationCache()823 void WebDelegate::ClearClientAuthenticationCache()
824 {
825 LOGE("WebDelegate::ClearClientAuthenticationCache");
826 auto context = context_.Upgrade();
827 if (!context) {
828 LOGE("Get context failed, it is null.");
829 return;
830 }
831 context->GetTaskExecutor()->PostTask(
832 [weak = WeakClaim(this)]() {
833 auto delegate = weak.Upgrade();
834 if (!delegate) {
835 LOGE("Get delegate failed, it is null.");
836 return;
837 }
838 if (delegate->nweb_) {
839 delegate->nweb_->ClearClientAuthenticationCache();
840 }
841 },
842 TaskExecutor::TaskType::PLATFORM);
843 }
844
AccessStep(int32_t step)845 bool WebDelegate::AccessStep(int32_t step)
846 {
847 auto delegate = WeakClaim(this).Upgrade();
848 if (!delegate) {
849 LOGE("Get delegate failed, it is null.");
850 return false;
851 }
852 if (delegate->nweb_) {
853 return delegate->nweb_->CanNavigateBackOrForward(step);
854 }
855 return false;
856 }
857
BackOrForward(int32_t step)858 void WebDelegate::BackOrForward(int32_t step)
859 {
860 auto context = context_.Upgrade();
861 if (!context) {
862 LOGE("Get context failed, it is null.");
863 return;
864 }
865
866 context->GetTaskExecutor()->PostTask(
867 [weak = WeakClaim(this), step] {
868 auto delegate = weak.Upgrade();
869 if (!delegate) {
870 LOGE("Get delegate failed, it is null.");
871 return;
872 }
873 if (delegate->nweb_) {
874 delegate->nweb_->NavigateBackOrForward(step);
875 }
876 },
877 TaskExecutor::TaskType::PLATFORM);
878 }
879
AccessBackward()880 bool WebDelegate::AccessBackward()
881 {
882 auto delegate = WeakClaim(this).Upgrade();
883 if (!delegate) {
884 LOGE("Get delegate failed, it is null.");
885 return false;
886 }
887 if (delegate->nweb_) {
888 return delegate->nweb_->IsNavigatebackwardAllowed();
889 }
890 return false;
891 }
892
AccessForward()893 bool WebDelegate::AccessForward()
894 {
895 auto delegate = WeakClaim(this).Upgrade();
896 if (!delegate) {
897 LOGE("Get delegate failed, it is null.");
898 return false;
899 }
900 if (delegate->nweb_) {
901 return delegate->nweb_->IsNavigateForwardAllowed();
902 }
903 return false;
904 }
905
906 #endif
907
ExecuteTypeScript(const std::string & jscode,const std::function<void (const std::string)> && callback)908 void WebDelegate::ExecuteTypeScript(const std::string& jscode, const std::function<void(const std::string)>&& callback)
909 {
910 auto context = context_.Upgrade();
911 if (!context) {
912 return;
913 }
914 context->GetTaskExecutor()->PostTask(
915 [weak = WeakClaim(this), jscode, callback]() {
916 auto delegate = weak.Upgrade();
917 if (!delegate) {
918 return;
919 }
920 if (delegate->nweb_) {
921 auto callbackImpl = std::make_shared<WebJavaScriptExecuteCallBack>(Container::CurrentId());
922 if (callbackImpl && callback) {
923 callbackImpl->SetCallBack([weak, func = std::move(callback)](std::string result) {
924 auto delegate = weak.Upgrade();
925 if (!delegate) {
926 return;
927 }
928 auto context = delegate->context_.Upgrade();
929 if (context) {
930 context->GetTaskExecutor()->PostTask(
931 [callback = std::move(func), result]() { callback(result); },
932 TaskExecutor::TaskType::JS);
933 }
934 });
935 }
936 delegate->nweb_->ExecuteJavaScript(jscode, callbackImpl, false);
937 }
938 },
939 TaskExecutor::TaskType::PLATFORM);
940 }
941
LoadDataWithBaseUrl(const std::string & baseUrl,const std::string & data,const std::string & mimeType,const std::string & encoding,const std::string & historyUrl)942 void WebDelegate::LoadDataWithBaseUrl(const std::string& baseUrl, const std::string& data, const std::string& mimeType,
943 const std::string& encoding, const std::string& historyUrl)
944 {
945 auto context = context_.Upgrade();
946 if (!context) {
947 return;
948 }
949 context->GetTaskExecutor()->PostTask(
950 [weak = WeakClaim(this), baseUrl, data, mimeType, encoding, historyUrl]() {
951 auto delegate = weak.Upgrade();
952 if (!delegate) {
953 return;
954 }
955 if (delegate->nweb_) {
956 if (baseUrl.empty() && historyUrl.empty()) {
957 delegate->nweb_->LoadWithData(data, mimeType, encoding);
958 } else {
959 delegate->nweb_->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
960 }
961 }
962 },
963 TaskExecutor::TaskType::PLATFORM);
964 }
965
LoadDataWithRichText()966 bool WebDelegate::LoadDataWithRichText()
967 {
968 auto context = context_.Upgrade();
969 if (!context) {
970 return false;
971 }
972 if (Container::IsCurrentUseNewPipeline()) {
973 auto webPattern = webPattern_.Upgrade();
974 CHECK_NULL_RETURN(webPattern, false);
975 auto webData = webPattern->GetWebData();
976 CHECK_NULL_RETURN(webData, false);
977 const std::string& data = webData.value();
978 if (data.empty()) {
979 return false;
980 }
981
982 context->GetTaskExecutor()->PostTask(
983 [weak = WeakClaim(this), data]() {
984 auto delegate = weak.Upgrade();
985 if (!delegate) {
986 return;
987 }
988 if (delegate->nweb_) {
989 delegate->nweb_->LoadWithDataAndBaseUrl("", data, "", "", "");
990 }
991 },
992 TaskExecutor::TaskType::PLATFORM);
993 return true;
994 }
995
996 auto webCom = webComponent_.Upgrade();
997 CHECK_NULL_RETURN(webCom, false);
998 if (webCom->GetData().empty()) {
999 return false;
1000 }
1001 const std::string& data = webCom->GetData();
1002 context->GetTaskExecutor()->PostTask(
1003 [weak = WeakClaim(this), data]() {
1004 auto delegate = weak.Upgrade();
1005 if (!delegate) {
1006 return;
1007 }
1008 if (delegate->nweb_) {
1009 delegate->nweb_->LoadWithDataAndBaseUrl("", data, "", "", "");
1010 }
1011 },
1012 TaskExecutor::TaskType::PLATFORM);
1013 return true;
1014 }
1015
Refresh()1016 void WebDelegate::Refresh()
1017 {
1018 auto context = context_.Upgrade();
1019 if (!context) {
1020 return;
1021 }
1022 context->GetTaskExecutor()->PostTask(
1023 [weak = WeakClaim(this)]() {
1024 auto delegate = weak.Upgrade();
1025 if (!delegate) {
1026 return;
1027 }
1028 if (delegate->nweb_) {
1029 delegate->nweb_->Reload();
1030 }
1031 },
1032 TaskExecutor::TaskType::PLATFORM);
1033 }
1034
StopLoading()1035 void WebDelegate::StopLoading()
1036 {
1037 auto context = context_.Upgrade();
1038 if (!context) {
1039 return;
1040 }
1041 context->GetTaskExecutor()->PostTask(
1042 [weak = WeakClaim(this)]() {
1043 auto delegate = weak.Upgrade();
1044 if (!delegate) {
1045 return;
1046 }
1047 if (delegate->nweb_) {
1048 delegate->nweb_->Stop();
1049 }
1050 },
1051 TaskExecutor::TaskType::PLATFORM);
1052 }
1053
AddJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)1054 void WebDelegate::AddJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
1055 {
1056 auto context = context_.Upgrade();
1057 if (!context) {
1058 return;
1059 }
1060 context->GetTaskExecutor()->PostTask(
1061 [weak = WeakClaim(this), objectName, methodList]() {
1062 auto delegate = weak.Upgrade();
1063 if (!delegate) {
1064 return;
1065 }
1066 if (delegate->nweb_) {
1067 delegate->nweb_->RegisterArkJSfunction(objectName, methodList);
1068 }
1069 },
1070 TaskExecutor::TaskType::PLATFORM);
1071 }
RemoveJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)1072 void WebDelegate::RemoveJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
1073 {
1074 auto context = context_.Upgrade();
1075 if (!context) {
1076 return;
1077 }
1078 context->GetTaskExecutor()->PostTask(
1079 [weak = WeakClaim(this), objectName, methodList]() {
1080 auto delegate = weak.Upgrade();
1081 if (!delegate) {
1082 return;
1083 }
1084 if (delegate->nweb_) {
1085 delegate->nweb_->UnregisterArkJSfunction(objectName, methodList);
1086 }
1087 },
1088 TaskExecutor::TaskType::PLATFORM);
1089 }
1090
SetWebViewJavaScriptResultCallBack(const WebController::JavaScriptCallBackImpl && javaScriptCallBackImpl)1091 void WebDelegate::SetWebViewJavaScriptResultCallBack(
1092 const WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl)
1093 {
1094 auto context = context_.Upgrade();
1095 if (!context) {
1096 return;
1097 }
1098
1099 context->GetTaskExecutor()->PostTask(
1100 [weak = WeakClaim(this), javaScriptCallBackImpl]() {
1101 auto delegate = weak.Upgrade();
1102 if (delegate == nullptr || delegate->nweb_ == nullptr) {
1103 return;
1104 }
1105 auto webJSResultCallBack = std::make_shared<WebJavaScriptResultCallBack>(Container::CurrentId());
1106 if (webJSResultCallBack) {
1107 LOGI("WebDelegate SetWebViewJavaScriptResultCallBack");
1108 webJSResultCallBack->SetJavaScriptCallBack(std::move(javaScriptCallBackImpl));
1109 delegate->nweb_->SetNWebJavaScriptResultCallBack(webJSResultCallBack);
1110 }
1111 },
1112 TaskExecutor::TaskType::PLATFORM);
1113 }
1114
CreateWebMessagePorts(std::vector<RefPtr<WebMessagePort>> & ports)1115 void WebDelegate::CreateWebMessagePorts(std::vector<RefPtr<WebMessagePort>>& ports)
1116 {
1117 if (nweb_) {
1118 std::vector<std::string> portStr;
1119 nweb_->CreateWebMessagePorts(portStr);
1120 RefPtr<WebMessagePort> port0 = AceType::MakeRefPtr<WebMessagePortOhos>(WeakClaim(this));
1121 RefPtr<WebMessagePort> port1 = AceType::MakeRefPtr<WebMessagePortOhos>(WeakClaim(this));
1122 port0->SetPortHandle(portStr[0]);
1123 port1->SetPortHandle(portStr[1]);
1124 ports.push_back(port0);
1125 ports.push_back(port1);
1126 }
1127 }
1128
PostWebMessage(std::string & message,std::vector<RefPtr<WebMessagePort>> & ports,std::string & uri)1129 void WebDelegate::PostWebMessage(std::string& message, std::vector<RefPtr<WebMessagePort>>& ports, std::string& uri)
1130 {
1131 if (nweb_) {
1132 std::vector<std::string> sendPorts;
1133 for (RefPtr<WebMessagePort> port : ports) {
1134 sendPorts.push_back(port->GetPortHandle());
1135 }
1136 nweb_->PostWebMessage(message, sendPorts, uri);
1137 }
1138 }
1139
ClosePort(std::string & port)1140 void WebDelegate::ClosePort(std::string& port)
1141 {
1142 if (nweb_) {
1143 nweb_->ClosePort(port);
1144 }
1145 }
1146
PostPortMessage(std::string & port,std::string & data)1147 void WebDelegate::PostPortMessage(std::string& port, std::string& data)
1148 {
1149 if (nweb_) {
1150 auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
1151 webMsg->SetType(NWebValue::Type::STRING);
1152 webMsg->SetString(data);
1153 nweb_->PostPortMessage(port, webMsg);
1154 }
1155 }
1156
SetPortMessageCallback(std::string & port,std::function<void (const std::string &)> && callback)1157 void WebDelegate::SetPortMessageCallback(std::string& port, std::function<void(const std::string&)>&& callback)
1158 {
1159 if (nweb_) {
1160 auto callbackImpl = std::make_shared<WebMessageValueCallBackImpl>(Container::CurrentId());
1161 if (callbackImpl && callback) {
1162 callbackImpl->SetCallBack([weak = WeakClaim(this), func = std::move(callback)](std::string result) {
1163 auto delegate = weak.Upgrade();
1164 if (!delegate) {
1165 return;
1166 }
1167 auto context = delegate->context_.Upgrade();
1168 if (context) {
1169 context->GetTaskExecutor()->PostTask(
1170 [callback = std::move(func), result]() { callback(result); }, TaskExecutor::TaskType::JS);
1171 }
1172 });
1173 }
1174 nweb_->SetPortMessageCallback(port, callbackImpl);
1175 }
1176 }
1177
RequestFocus()1178 void WebDelegate::RequestFocus()
1179 {
1180 auto context = context_.Upgrade();
1181 if (!context) {
1182 return;
1183 }
1184 context->GetTaskExecutor()->PostTask(
1185 [weak = WeakClaim(this)]() {
1186 auto delegate = weak.Upgrade();
1187 if (!delegate) {
1188 return;
1189 }
1190
1191 if (Container::IsCurrentUseNewPipeline()) {
1192 auto webPattern = delegate->webPattern_.Upgrade();
1193 CHECK_NULL_VOID(webPattern);
1194 auto eventHub = webPattern->GetWebEventHub();
1195 CHECK_NULL_VOID(eventHub);
1196 auto focusHub = eventHub->GetOrCreateFocusHub();
1197 CHECK_NULL_VOID(focusHub);
1198
1199 focusHub->RequestFocusImmediately();
1200 }
1201
1202 auto webCom = delegate->webComponent_.Upgrade();
1203 CHECK_NULL_VOID(webCom);
1204 webCom->RequestFocus();
1205 },
1206 TaskExecutor::TaskType::PLATFORM);
1207 }
1208
SearchAllAsync(const std::string & searchStr)1209 void WebDelegate::SearchAllAsync(const std::string& searchStr)
1210 {
1211 auto context = context_.Upgrade();
1212 if (!context) {
1213 return;
1214 }
1215 context->GetTaskExecutor()->PostTask(
1216 [weak = WeakClaim(this), searchStr]() {
1217 auto delegate = weak.Upgrade();
1218 if (!delegate) {
1219 return;
1220 }
1221 if (delegate->nweb_) {
1222 delegate->nweb_->FindAllAsync(searchStr);
1223 }
1224 },
1225 TaskExecutor::TaskType::PLATFORM);
1226 }
1227
ClearMatches()1228 void WebDelegate::ClearMatches()
1229 {
1230 auto context = context_.Upgrade();
1231 if (!context) {
1232 return;
1233 }
1234 context->GetTaskExecutor()->PostTask(
1235 [weak = WeakClaim(this)]() {
1236 auto delegate = weak.Upgrade();
1237 if (!delegate) {
1238 return;
1239 }
1240 if (delegate->nweb_) {
1241 delegate->nweb_->ClearMatches();
1242 }
1243 },
1244 TaskExecutor::TaskType::PLATFORM);
1245 }
1246
SearchNext(bool forward)1247 void WebDelegate::SearchNext(bool forward)
1248 {
1249 auto context = context_.Upgrade();
1250 if (!context) {
1251 return;
1252 }
1253 context->GetTaskExecutor()->PostTask(
1254 [weak = WeakClaim(this), forward]() {
1255 auto delegate = weak.Upgrade();
1256 if (!delegate) {
1257 return;
1258 }
1259 if (delegate->nweb_) {
1260 delegate->nweb_->FindNext(forward);
1261 }
1262 },
1263 TaskExecutor::TaskType::PLATFORM);
1264 }
1265
ConverToWebHitTestType(int hitType)1266 int WebDelegate::ConverToWebHitTestType(int hitType)
1267 {
1268 WebHitTestType webHitType;
1269 switch (hitType) {
1270 case OHOS::NWeb::HitTestResult::UNKNOWN_TYPE:
1271 webHitType = WebHitTestType::UNKNOWN;
1272 break;
1273 case OHOS::NWeb::HitTestResult::ANCHOR_TYPE:
1274 webHitType = WebHitTestType::HTTP;
1275 break;
1276 case OHOS::NWeb::HitTestResult::PHONE_TYPE:
1277 webHitType = WebHitTestType::PHONE;
1278 break;
1279 case OHOS::NWeb::HitTestResult::GEO_TYPE:
1280 webHitType = WebHitTestType::MAP;
1281 break;
1282 case OHOS::NWeb::HitTestResult::EMAIL_TYPE:
1283 webHitType = WebHitTestType::EMAIL;
1284 break;
1285 case OHOS::NWeb::HitTestResult::IMAGE_TYPE:
1286 webHitType = WebHitTestType::IMG;
1287 break;
1288 case OHOS::NWeb::HitTestResult::IMAGE_ANCHOR_TYPE:
1289 webHitType = WebHitTestType::HTTP_IMG;
1290 break;
1291 case OHOS::NWeb::HitTestResult::SRC_ANCHOR_TYPE:
1292 webHitType = WebHitTestType::HTTP;
1293 break;
1294 case OHOS::NWeb::HitTestResult::SRC_IMAGE_ANCHOR_TYPE:
1295 webHitType = WebHitTestType::HTTP_IMG;
1296 break;
1297 case OHOS::NWeb::HitTestResult::EDIT_TEXT_TYPE:
1298 webHitType = WebHitTestType::EDIT;
1299 break;
1300 default:
1301 LOGW("unknow hit test type:%{public}d", static_cast<int>(hitType));
1302 webHitType = WebHitTestType::UNKNOWN;
1303 break;
1304 }
1305 return static_cast<int>(webHitType);
1306 }
1307
GetHitTestResult()1308 int WebDelegate::GetHitTestResult()
1309 {
1310 if (nweb_) {
1311 return ConverToWebHitTestType(nweb_->GetHitTestResult().GetType());
1312 }
1313 return static_cast<int>(WebHitTestType::UNKNOWN);
1314 }
1315
GetHitTestValue(HitTestResult & result)1316 void WebDelegate::GetHitTestValue(HitTestResult& result)
1317 {
1318 if (nweb_) {
1319 OHOS::NWeb::HitTestResult nwebResult = nweb_->GetHitTestResult();
1320 result.SetExtraData(nwebResult.GetExtra());
1321 result.SetHitType(ConverToWebHitTestType(nwebResult.GetType()));
1322 }
1323 }
1324
GetPageHeight()1325 int WebDelegate::GetPageHeight()
1326 {
1327 if (nweb_) {
1328 return nweb_->ContentHeight();
1329 }
1330 return 0;
1331 }
1332
GetWebId()1333 int WebDelegate::GetWebId()
1334 {
1335 if (nweb_) {
1336 return nweb_->GetWebId();
1337 }
1338 return -1;
1339 }
1340
GetTitle()1341 std::string WebDelegate::GetTitle()
1342 {
1343 if (nweb_) {
1344 return nweb_->Title();
1345 }
1346 return "";
1347 }
1348
GetDefaultUserAgent()1349 std::string WebDelegate::GetDefaultUserAgent()
1350 {
1351 if (!nweb_) {
1352 return "";
1353 }
1354 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_->GetPreference();
1355 if (!setting) {
1356 return "";
1357 }
1358 return setting->DefaultUserAgent();
1359 }
1360
SaveCookieSync()1361 bool WebDelegate::SaveCookieSync()
1362 {
1363 if (cookieManager_) {
1364 return cookieManager_->Store();
1365 }
1366 return false;
1367 }
1368
SetCookie(const std::string & url,const std::string & value)1369 bool WebDelegate::SetCookie(const std::string& url, const std::string& value)
1370 {
1371 if (cookieManager_) {
1372 return cookieManager_->SetCookie(url, value);
1373 }
1374 return false;
1375 }
1376
GetCookie(const std::string & url) const1377 std::string WebDelegate::GetCookie(const std::string& url) const
1378 {
1379 if (cookieManager_) {
1380 bool isValid = true;
1381 return cookieManager_->ReturnCookie(url, isValid);
1382 }
1383 return "";
1384 }
1385
DeleteEntirelyCookie()1386 void WebDelegate::DeleteEntirelyCookie()
1387 {
1388 if (cookieManager_) {
1389 cookieManager_->DeleteCookieEntirely(nullptr);
1390 }
1391 }
1392
CreatePluginResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)1393 void WebDelegate::CreatePluginResource(
1394 const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
1395 {
1396 state_ = State::CREATING;
1397 // TODO: add ng pattern.
1398 auto webCom = webComponent_.Upgrade();
1399 if (!webCom) {
1400 LOGI("webCom is null");
1401 state_ = State::CREATEFAILED;
1402 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1403 return;
1404 }
1405
1406 auto pipelineContext = context.Upgrade();
1407 if (!pipelineContext) {
1408 LOGI("pipelineContext is null");
1409 state_ = State::CREATEFAILED;
1410 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to context is null");
1411 return;
1412 }
1413 context_ = context;
1414 auto platformTaskExecutor =
1415 SingleTaskExecutor::Make(pipelineContext->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
1416 auto resRegister = pipelineContext->GetPlatformResRegister();
1417 auto weakRes = AceType::WeakClaim(AceType::RawPtr(resRegister));
1418 platformTaskExecutor.PostTask([weakWeb = AceType::WeakClaim(this), weakRes, size, position] {
1419 auto webDelegate = weakWeb.Upgrade();
1420 if (webDelegate == nullptr) {
1421 LOGI("webDelegate is null!");
1422 return;
1423 }
1424 // TODO: add ng pattern.
1425 auto webCom = webDelegate->webComponent_.Upgrade();
1426 if (!webCom) {
1427 LOGI("webCom is null!");
1428 webDelegate->OnError(NTC_ERROR, "fail to call WebDelegate::SetSrc PostTask");
1429 return;
1430 }
1431 auto resRegister = weakRes.Upgrade();
1432 if (!resRegister) {
1433 if (webDelegate->onError_) {
1434 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
1435 }
1436 return;
1437 }
1438 auto context = webDelegate->context_.Upgrade();
1439 if (!context) {
1440 LOGI("context is null");
1441 return;
1442 }
1443
1444 std::string pageUrl;
1445 int32_t pageId;
1446 OHOS::Ace::Framework::DelegateClient::GetInstance().GetWebPageUrl(pageUrl, pageId);
1447
1448 std::stringstream paramStream;
1449 paramStream << NTC_PARAM_WEB << WEB_PARAM_EQUALS << webDelegate->id_ << WEB_PARAM_AND << NTC_PARAM_WIDTH
1450 << WEB_PARAM_EQUALS << size.Width() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_HEIGHT
1451 << WEB_PARAM_EQUALS << size.Height() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_LEFT
1452 << WEB_PARAM_EQUALS << position.GetX() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_TOP
1453 << WEB_PARAM_EQUALS << position.GetY() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_SRC
1454 << WEB_PARAM_EQUALS << webCom->GetSrc() << WEB_PARAM_AND << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS
1455 << pageUrl;
1456
1457 std::string param = paramStream.str();
1458 webDelegate->id_ = resRegister->CreateResource(WEB_CREATE, param);
1459 if (webDelegate->id_ == INVALID_ID) {
1460 if (webDelegate->onError_) {
1461 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
1462 }
1463 return;
1464 }
1465 webDelegate->state_ = State::CREATED;
1466 webDelegate->hash_ = webDelegate->MakeResourceHash();
1467 webDelegate->RegisterWebEvent();
1468 webDelegate->BindRouterBackMethod();
1469 webDelegate->BindPopPageSuccessMethod();
1470 webDelegate->BindIsPagePathInvalidMethod();
1471 });
1472 }
1473
InitWebEvent()1474 void WebDelegate::InitWebEvent()
1475 {
1476 auto webCom = webComponent_.Upgrade();
1477 if (!webCom) {
1478 state_ = State::CREATEFAILED;
1479 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1480 return;
1481 }
1482 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
1483 if (!context) {
1484 state_ = State::CREATEFAILED;
1485 OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
1486 return;
1487 }
1488 CHECK_NULL_VOID(context);
1489 if (!webCom->GetPageStartedEventId().IsEmpty()) {
1490 onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context);
1491 }
1492 if (!webCom->GetPageFinishedEventId().IsEmpty()) {
1493 onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context);
1494 }
1495 if (!webCom->GetPageErrorEventId().IsEmpty()) {
1496 onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context);
1497 }
1498 if (!webCom->GetMessageEventId().IsEmpty()) {
1499 onMessage_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetMessageEventId(), context);
1500 }
1501 }
1502
1503 #ifdef OHOS_STANDARD_SYSTEM
ShowWebView()1504 void WebDelegate::ShowWebView()
1505 {
1506 if (window_) {
1507 window_->Show();
1508 }
1509
1510 LOGI("OnContinue webview");
1511 OnActive();
1512 OnWebviewShow();
1513 }
1514
HideWebView()1515 void WebDelegate::HideWebView()
1516 {
1517 if (window_) {
1518 window_->Hide();
1519 }
1520
1521 LOGI("OnPause webview");
1522 OnInactive();
1523 OnWebviewHide();
1524 }
1525
InitOHOSWeb(const RefPtr<PipelineBase> & context,const RefPtr<NG::RenderSurface> & surface)1526 void WebDelegate::InitOHOSWeb(const RefPtr<PipelineBase>& context, const RefPtr<NG::RenderSurface>& surface)
1527 {
1528 #ifdef ENABLE_ROSEN_BACKEND
1529 CHECK_NULL_VOID(context);
1530 auto rosenRenderSurface = DynamicCast<NG::RosenRenderSurface>(surface);
1531 if (!rosenRenderSurface) {
1532 LOGI("source is nullptr, initialize with window");
1533 if (PrepareInitOHOSWeb(context)) {
1534 if (!isCreateWebView_) {
1535 #ifndef ENABLE_ROSEN_BACKEND
1536 InitWebViewWithWindow();
1537 isCreateWebView_ = true;
1538 #endif
1539 }
1540 } else {
1541 LOGE("prepare init web failed");
1542 }
1543 return;
1544 }
1545 SetSurface(rosenRenderSurface->GetSurface());
1546 InitOHOSWeb(context);
1547 #endif
1548 }
1549
PrepareInitOHOSWeb(const WeakPtr<PipelineBase> & context)1550 bool WebDelegate::PrepareInitOHOSWeb(const WeakPtr<PipelineBase>& context)
1551 {
1552 ACE_SCOPED_TRACE("PrepareInitOHOSWeb");
1553 LOGI("PrepareInitOHOSWeb");
1554
1555 state_ = State::CREATING;
1556 // obtain hap data path
1557 auto container = Container::Current();
1558 if (container == nullptr) {
1559 LOGE("Fail to get container");
1560 return false;
1561 }
1562 const std::string& bundlePath = container->GetBundlePath();
1563 const std::string& filesDataPath = container->GetFilesDataPath();
1564 std::string baseDir = "base";
1565 std::size_t baseIndex = filesDataPath.find(baseDir);
1566 if (baseIndex == std::string::npos) {
1567 LOGE("Fail to parse hap data base path");
1568 return false;
1569 }
1570 std::string dataPath = filesDataPath.substr(0, baseIndex + baseDir.length());
1571 bundlePath_ = bundlePath;
1572 bundleDataPath_ = dataPath;
1573 hapPath_ = container->GetWebHapPath();
1574 // load webview so
1575 OHOS::NWeb::NWebHelper::Instance().SetBundlePath(bundlePath_);
1576 if (!OHOS::NWeb::NWebHelper::Instance().Init()) {
1577 LOGE("Fail to init NWebHelper");
1578 return false;
1579 }
1580 auto webCom = webComponent_.Upgrade();
1581 auto webPattern = webPattern_.Upgrade();
1582 auto eventHub = webPattern ? webPattern->GetWebEventHub() : nullptr;
1583 auto useNewPipe = Container::IsCurrentUseNewPipeline();
1584 if (useNewPipe && !webPattern && !eventHub) {
1585 LOGE("fail to call WebDelegate::Create due to webComponent is null");
1586 return false;
1587 }
1588 if (!useNewPipe && !webCom) {
1589 LOGE("fail to call WebDelegate::Create due to webComponent is null");
1590 return false;
1591 }
1592 context_ = context;
1593 RegisterSurfacePositionChangedCallback();
1594 auto pipelineContext = context.Upgrade();
1595 if (!pipelineContext) {
1596 LOGE("fail to call WebDelegate::Create due to context is null");
1597 return false;
1598 }
1599 state_ = State::CREATED;
1600
1601 SetWebCallBack();
1602 if (!pipelineContext->GetIsDeclarative()) {
1603 RegisterOHOSWebEventAndMethord();
1604 } else {
1605 auto oldContext = DynamicCast<PipelineContext>(pipelineContext);
1606
1607 onPageFinishedV2_ = useNewPipe ? eventHub->GetOnPageFinishedEvent()
1608 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1609 webCom->GetPageFinishedEventId(), oldContext);
1610 onPageStartedV2_ = useNewPipe ? eventHub->GetOnPageStartedEvent()
1611 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1612 webCom->GetPageStartedEventId(), oldContext);
1613 onTitleReceiveV2_ = useNewPipe ? eventHub->GetOnTitleReceiveEvent()
1614 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1615 webCom->GetTitleReceiveEventId(), oldContext);
1616 onFullScreenExitV2_ = useNewPipe ? eventHub->GetOnFullScreenExitEvent()
1617 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1618 webCom->GetOnFullScreenExitEventId(), oldContext);
1619 onGeolocationHideV2_ = useNewPipe ? eventHub->GetOnGeolocationHideEvent()
1620 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1621 webCom->GetGeolocationHideEventId(), oldContext);
1622 onGeolocationShowV2_ = useNewPipe ? eventHub->GetOnGeolocationShowEvent()
1623 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1624 webCom->GetGeolocationShowEventId(), oldContext);
1625 onErrorReceiveV2_ = useNewPipe ? eventHub->GetOnErrorReceiveEvent()
1626 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1627 webCom->GetPageErrorEventId(), oldContext);
1628 onHttpErrorReceiveV2_ = useNewPipe ? eventHub->GetOnHttpErrorReceiveEvent()
1629 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1630 webCom->GetHttpErrorEventId(), oldContext);
1631 onRequestFocusV2_ = useNewPipe ? eventHub->GetOnRequestFocusEvent()
1632 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1633 webCom->GetRequestFocusEventId(), oldContext);
1634 onDownloadStartV2_ = useNewPipe ? eventHub->GetOnDownloadStartEvent()
1635 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1636 webCom->GetDownloadStartEventId(), oldContext);
1637 onRenderExitedV2_ = useNewPipe ? eventHub->GetOnRenderExitedEvent()
1638 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1639 webCom->GetRenderExitedId(), oldContext);
1640 onRefreshAccessedHistoryV2_ = useNewPipe ? eventHub->GetOnRefreshAccessedHistoryEvent()
1641 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1642 webCom->GetRefreshAccessedHistoryId(), oldContext);
1643 onResourceLoadV2_ = useNewPipe ? eventHub->GetOnResourceLoadEvent()
1644 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1645 webCom->GetResourceLoadId(), oldContext);
1646 onScaleChangeV2_ = useNewPipe ? eventHub->GetOnScaleChangeEvent()
1647 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1648 webCom->GetScaleChangeId(), oldContext);
1649 onPermissionRequestV2_ = useNewPipe ? eventHub->GetOnPermissionRequestEvent()
1650 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1651 webCom->GetPermissionRequestEventId(), oldContext);
1652 onSearchResultReceiveV2_ = useNewPipe ? eventHub->GetOnSearchResultReceiveEvent()
1653 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1654 webCom->GetSearchResultReceiveEventId(), oldContext);
1655 onScrollV2_ = useNewPipe ? eventHub->GetOnScrollEvent()
1656 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1657 webCom->GetScrollId(), oldContext);
1658 onWindowExitV2_ = useNewPipe ? eventHub->GetOnWindowExitEvent()
1659 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1660 webCom->GetWindowExitEventId(), oldContext);
1661 onPageVisibleV2_ = useNewPipe ? eventHub->GetOnPageVisibleEvent() : nullptr;
1662 onTouchIconUrlV2_ = useNewPipe ? eventHub->GetOnTouchIconUrlEvent() : nullptr;
1663 onAudioStateChangedV2_ = GetAudioStateChangedCallback(useNewPipe, eventHub);
1664 onFirstContentfulPaintV2_ = useNewPipe ? eventHub->GetOnFirstContentfulPaintEvent() : nullptr;
1665 onOverScrollV2_ = useNewPipe ? eventHub->GetOnOverScrollEvent()
1666 : AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
1667 webCom->GetOverScrollId(), oldContext);
1668 onScreenCaptureRequestV2_ = useNewPipe ? eventHub->GetOnScreenCaptureRequestEvent() : nullptr;
1669 }
1670 return true;
1671 }
1672
OnSurfaceCreated(const sptr<OHOS::Surface> & surface)1673 void WebSurfaceCallback::OnSurfaceCreated(const sptr<OHOS::Surface>& surface)
1674 {
1675 LOGI("WebSurfaceCallback::OnSurfaceCreated");
1676 }
1677
OnSurfaceChanged(const sptr<OHOS::Surface> & surface,int32_t width,int32_t height)1678 void WebSurfaceCallback::OnSurfaceChanged(const sptr<OHOS::Surface>& surface, int32_t width, int32_t height)
1679 {
1680 auto delegate = delegate_.Upgrade();
1681 if (!delegate) {
1682 LOGE("WebSurfaceCallback::OnSurfaceChanged get delegate fail");
1683 return;
1684 }
1685 LOGI("OnSurfaceChanged w:%{public}d, h:%{public}d", width, height);
1686 delegate->Resize((double)width, (double)height);
1687 }
1688
OnSurfaceDestroyed()1689 void WebSurfaceCallback::OnSurfaceDestroyed()
1690 {
1691 LOGI("WebSurfaceCallback::OnSurfaceDestroyed");
1692 }
1693
GLGetConfig(int version,EGLDisplay eglDisplay)1694 EGLConfig WebDelegate::GLGetConfig(int version, EGLDisplay eglDisplay)
1695 {
1696 int attribList[] = {
1697 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1698 EGL_RED_SIZE, 8,
1699 EGL_GREEN_SIZE, 8,
1700 EGL_BLUE_SIZE, 8,
1701 EGL_ALPHA_SIZE, 8,
1702 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1703 EGL_NONE
1704 };
1705 EGLConfig configs = NULL;
1706 int configsNum;
1707 if (!eglChooseConfig(eglDisplay, attribList, &configs, 1, &configsNum)) {
1708 LOGE("eglChooseConfig ERROR");
1709 return NULL;
1710 }
1711 return configs;
1712 }
1713
GLContextInit(void * window)1714 void WebDelegate::GLContextInit(void* window)
1715 {
1716 if (!window) {
1717 LOGE("unable to get EGL window.");
1718 return;
1719 }
1720 mEglWindow = static_cast<EGLNativeWindowType>(window);
1721
1722 // 1. create sharedcontext
1723 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1724 if (mEGLDisplay == EGL_NO_DISPLAY) {
1725 LOGE("unable to get EGL display.");
1726 return;
1727 }
1728
1729 EGLint eglMajVers, eglMinVers;
1730 if (!eglInitialize(mEGLDisplay, &eglMajVers, &eglMinVers)) {
1731 mEGLDisplay = EGL_NO_DISPLAY;
1732 LOGE("unable to initialize display");
1733 return;
1734 }
1735
1736 mEGLConfig = GLGetConfig(EGLCONFIG_VERSION, mEGLDisplay);
1737 if (mEGLConfig == nullptr) {
1738 LOGE("GLContextInit config ERROR");
1739 return;
1740 }
1741
1742 // 2. Create EGL Surface from Native Window
1743 mEGLSurface = eglCreateWindowSurface(mEGLDisplay, mEGLConfig, mEglWindow, nullptr);
1744 if (mEGLSurface == nullptr) {
1745 LOGE("eglCreateContext eglSurface is null");
1746 return;
1747 }
1748
1749 // 3. Create EGLContext from
1750 int attrib3_list[] = {
1751 EGL_CONTEXT_CLIENT_VERSION, 2,
1752 EGL_NONE
1753 };
1754
1755 mEGLContext = eglCreateContext(mEGLDisplay, mEGLConfig, mSharedEGLContext, attrib3_list);
1756
1757 if (!eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
1758 LOGE("eglMakeCurrent error = %{public}d", eglGetError());
1759 return;
1760 }
1761
1762 glViewport(offset_.GetX(), offset_.GetY(), drawSize_.Width(), drawSize_.Height());
1763 glClearColor(1.0, 1.0, 1.0, 1.0);
1764 glClear(GL_COLOR_BUFFER_BIT);
1765
1766 glFlush();
1767 glFinish();
1768 eglSwapBuffers(mEGLDisplay, mEGLSurface);
1769
1770 eglDestroySurface(mEGLDisplay, mEGLSurface);
1771 eglDestroyContext(mEGLDisplay, mEGLContext);
1772 }
1773
InitWebSurfaceDelegate(const WeakPtr<PipelineBase> & context)1774 bool WebDelegate::InitWebSurfaceDelegate(const WeakPtr<PipelineBase>& context)
1775 {
1776 auto pipelineContext = context.Upgrade();
1777 if (!pipelineContext) {
1778 LOGE("fail to call WebDelegate::InitWebSurfaceDelegate Create due to context is null");
1779 return false;
1780 }
1781 uint32_t windowId = pipelineContext->GetWindowId();
1782 surfaceDelegate_ = new OHOS::SurfaceDelegate(windowId);
1783 if (surfaceDelegate_ == nullptr) {
1784 LOGE("fail to call WebDelegate::InitWebSurfaceDelegate Create surfaceDelegate is null");
1785 return false;
1786 }
1787 surfaceCallback_ = new WebSurfaceCallback(AceType::WeakClaim(this));
1788 if (surfaceCallback_ == nullptr) {
1789 LOGE("fail to call WebDelegate::InitWebSurfaceDelegate Create surfaceCallback is null");
1790 return false;
1791 }
1792 surfaceDelegate_->AddSurfaceCallback(surfaceCallback_);
1793 surfaceDelegate_->CreateSurface();
1794 SetBoundsOrResize(drawSize_, offset_);
1795 needResizeAtFirst_ = true;
1796 auto aNativeSurface = surfaceDelegate_->GetNativeWindow();
1797 if (aNativeSurface == nullptr) {
1798 LOGE("fail to call WebDelegate::InitWebSurfaceDelegate Create get NativeWindow is null");
1799 return false;
1800 }
1801 GLContextInit(aNativeSurface);
1802 surfaceInfo_.window = aNativeSurface;
1803 return true;
1804 }
1805
InitOHOSWeb(const WeakPtr<PipelineBase> & context)1806 void WebDelegate::InitOHOSWeb(const WeakPtr<PipelineBase>& context)
1807 {
1808 if (!PrepareInitOHOSWeb(context)) {
1809 LOGE("prepare init web failed");
1810 return;
1811 }
1812 if (!isCreateWebView_) {
1813 isCreateWebView_ = true;
1814 if (isEnhanceSurface_) {
1815 if (!InitWebSurfaceDelegate(context)) {
1816 LOGE("init web surfacedelegate failed");
1817 return;
1818 }
1819 InitWebViewWithSurface();
1820 } else {
1821 #ifdef ENABLE_ROSEN_BACKEND
1822 InitWebViewWithSurface();
1823 #else
1824 InitWebViewWithWindow();
1825 #endif
1826 }
1827 }
1828 }
RegisterOHOSWebEventAndMethord()1829 void WebDelegate::RegisterOHOSWebEventAndMethord()
1830 {
1831 auto reloadCallback = [weak = WeakClaim(this)]() {
1832 auto delegate = weak.Upgrade();
1833 if (!delegate) {
1834 return false;
1835 }
1836 delegate->Reload();
1837 return true;
1838 };
1839 WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
1840
1841 auto webCom = webComponent_.Upgrade();
1842 CHECK_NULL_VOID(webCom);
1843 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
1844 CHECK_NULL_VOID(context);
1845 if (!webCom->GetPageStartedEventId().IsEmpty()) {
1846 onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context);
1847 }
1848 if (!webCom->GetPageFinishedEventId().IsEmpty()) {
1849 onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context);
1850 }
1851 if (!webCom->GetPageErrorEventId().IsEmpty()) {
1852 onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context);
1853 }
1854 }
1855
NotifyPopupWindowResult(bool result)1856 void WebDelegate::NotifyPopupWindowResult(bool result)
1857 {
1858 if (parentNWebId_ != -1) {
1859 std::weak_ptr<OHOS::NWeb::NWeb> parentNWebWeak = OHOS::NWeb::NWebHelper::Instance().GetNWeb(parentNWebId_);
1860 auto parentNWebSptr = parentNWebWeak.lock();
1861 if (parentNWebSptr) {
1862 parentNWebSptr->NotifyPopupWindowResult(result);
1863 }
1864 }
1865 }
1866
RunSetWebIdAndHapPathCallback()1867 void WebDelegate::RunSetWebIdAndHapPathCallback()
1868 {
1869 CHECK_NULL_VOID(nweb_);
1870 auto webId = nweb_->GetWebId();
1871
1872 if (Container::IsCurrentUseNewPipeline()) {
1873 auto pattern = webPattern_.Upgrade();
1874 CHECK_NULL_VOID(pattern);
1875 auto setWebIdCallback = pattern->GetSetWebIdCallback();
1876 CHECK_NULL_VOID(setWebIdCallback);
1877 setWebIdCallback(webId);
1878 auto onControllerAttachedCallback = pattern->GetOnControllerAttachedCallback();
1879 if (onControllerAttachedCallback) {
1880 onControllerAttachedCallback();
1881 }
1882 if (!hapPath_.empty()) {
1883 auto setHapPathCallback = pattern->GetSetHapPathCallback();
1884 CHECK_NULL_VOID(setHapPathCallback);
1885 setHapPathCallback(hapPath_);
1886 }
1887 NotifyPopupWindowResult(true);
1888 return;
1889 }
1890 auto webCom = webComponent_.Upgrade();
1891 CHECK_NULL_VOID(webCom);
1892 auto setWebIdCallback = webCom->GetSetWebIdCallback();
1893 CHECK_NULL_VOID(setWebIdCallback);
1894 setWebIdCallback(webId);
1895 if (!hapPath_.empty()) {
1896 auto setHapPathCallback = webCom->GetSetHapPathCallback();
1897 CHECK_NULL_VOID(setHapPathCallback);
1898 setHapPathCallback(hapPath_);
1899 }
1900 NotifyPopupWindowResult(true);
1901 }
1902
RunJsProxyCallback()1903 void WebDelegate::RunJsProxyCallback()
1904 {
1905 if (Container::IsCurrentUseNewPipeline()) {
1906 auto pattern = webPattern_.Upgrade();
1907 CHECK_NULL_VOID(pattern);
1908 pattern->CallJsProxyCallback();
1909 return;
1910 }
1911 auto webCom = webComponent_.Upgrade();
1912 CHECK_NULL_VOID(webCom);
1913 webCom->CallJsProxyCallback();
1914 }
1915
RegisterConfigObserver()1916 void WebDelegate::RegisterConfigObserver()
1917 {
1918 auto context = context_.Upgrade();
1919 if (!context) {
1920 return;
1921 }
1922 context->GetTaskExecutor()->PostTask(
1923 [weak = WeakClaim(this)]() {
1924 auto delegate = weak.Upgrade();
1925 CHECK_NULL_VOID(delegate);
1926 CHECK_NULL_VOID(delegate->nweb_);
1927 auto appMgrClient = std::make_shared<AppExecFwk::AppMgrClient>();
1928 if (appMgrClient->ConnectAppMgrService()) {
1929 LOGE("connect to app mgr service failed");
1930 return;
1931 }
1932 delegate->configChangeObserver_ = sptr<AppExecFwk::IConfigurationObserver>(
1933 new (std::nothrow) WebConfigurationObserver(delegate));
1934 if (appMgrClient->RegisterConfigurationObserver(delegate->configChangeObserver_)) {
1935 return;
1936 }
1937 },
1938 TaskExecutor::TaskType::PLATFORM);
1939 }
1940
UnRegisterConfigObserver()1941 void WebDelegate::UnRegisterConfigObserver()
1942 {
1943 auto context = context_.Upgrade();
1944 if (!context) {
1945 return;
1946 }
1947 context->GetTaskExecutor()->PostTask(
1948 [weak = WeakClaim(this)]() {
1949 auto delegate = weak.Upgrade();
1950 CHECK_NULL_VOID(delegate);
1951 CHECK_NULL_VOID(delegate->nweb_);
1952 if (delegate->configChangeObserver_) {
1953 auto appMgrClient = std::make_shared<AppExecFwk::AppMgrClient>();
1954 if (appMgrClient->ConnectAppMgrService()) {
1955 LOGE("connect to app mgr service failed");
1956 return;
1957 }
1958 appMgrClient->UnregisterConfigurationObserver(delegate->configChangeObserver_);
1959 delegate->configChangeObserver_ = nullptr;
1960 }
1961 },
1962 TaskExecutor::TaskType::PLATFORM);
1963 }
1964
SetWebCallBack()1965 void WebDelegate::SetWebCallBack()
1966 {
1967 RefPtr<WebController> webController;
1968 if (Container::IsCurrentUseNewPipeline()) {
1969 auto pattern = webPattern_.Upgrade();
1970 webController = pattern ? pattern->GetWebController() : nullptr;
1971 } else {
1972 auto webCom = webComponent_.Upgrade();
1973 webController = webCom ? webCom->GetController() : nullptr;
1974 }
1975 if (webController) {
1976 auto context = context_.Upgrade();
1977 if (!context) {
1978 return;
1979 }
1980 auto uiTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::UI);
1981 webController->SetLoadUrlImpl([weak = WeakClaim(this), uiTaskExecutor](
1982 std::string url, const std::map<std::string, std::string>& httpHeaders) {
1983 uiTaskExecutor.PostTask([weak, url, httpHeaders]() {
1984 auto delegate = weak.Upgrade();
1985 if (delegate) {
1986 delegate->LoadUrl(url, httpHeaders);
1987 }
1988 });
1989 });
1990 webController->SetBackwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
1991 uiTaskExecutor.PostTask([weak]() {
1992 auto delegate = weak.Upgrade();
1993 if (delegate) {
1994 delegate->Backward();
1995 }
1996 });
1997 });
1998 webController->SetForwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
1999 uiTaskExecutor.PostTask([weak]() {
2000 auto delegate = weak.Upgrade();
2001 if (delegate) {
2002 delegate->Forward();
2003 }
2004 });
2005 });
2006 webController->SetClearHistoryImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2007 uiTaskExecutor.PostTask([weak]() {
2008 auto delegate = weak.Upgrade();
2009 if (delegate) {
2010 delegate->ClearHistory();
2011 }
2012 });
2013 });
2014 webController->SetClearSslCacheImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2015 uiTaskExecutor.PostTask([weak]() {
2016 auto delegate = weak.Upgrade();
2017 if (delegate) {
2018 delegate->ClearSslCache();
2019 }
2020 });
2021 });
2022 webController->SetClearClientAuthenticationCacheImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2023 uiTaskExecutor.PostTask([weak]() {
2024 auto delegate = weak.Upgrade();
2025 if (delegate) {
2026 delegate->ClearClientAuthenticationCache();
2027 }
2028 });
2029 });
2030 webController->SetAccessStepImpl([weak = WeakClaim(this)](int32_t step) {
2031 auto delegate = weak.Upgrade();
2032 if (delegate) {
2033 return delegate->AccessStep(step);
2034 }
2035 return false;
2036 });
2037 webController->SetBackOrForwardImpl([weak = WeakClaim(this)](int32_t step) {
2038 auto delegate = weak.Upgrade();
2039 if (delegate) {
2040 delegate->BackOrForward(step);
2041 }
2042 });
2043 webController->SetAccessBackwardImpl([weak = WeakClaim(this)]() {
2044 auto delegate = weak.Upgrade();
2045 if (delegate) {
2046 return delegate->AccessBackward();
2047 }
2048 return false;
2049 });
2050 webController->SetAccessForwardImpl([weak = WeakClaim(this)]() {
2051 auto delegate = weak.Upgrade();
2052 if (delegate) {
2053 return delegate->AccessForward();
2054 }
2055 return false;
2056 });
2057 webController->SetExecuteTypeScriptImpl([weak = WeakClaim(this), uiTaskExecutor](std::string jscode,
2058 std::function<void(const std::string)>&& callback) {
2059 uiTaskExecutor.PostTask([weak, jscode, callback]() {
2060 auto delegate = weak.Upgrade();
2061 if (delegate) {
2062 delegate->ExecuteTypeScript(jscode, std::move(callback));
2063 }
2064 });
2065 });
2066 webController->SetLoadDataWithBaseUrlImpl(
2067 [weak = WeakClaim(this), uiTaskExecutor](std::string baseUrl, std::string data, std::string mimeType,
2068 std::string encoding, std::string historyUrl) {
2069 uiTaskExecutor.PostTask([weak, baseUrl, data, mimeType, encoding, historyUrl]() {
2070 auto delegate = weak.Upgrade();
2071 if (delegate) {
2072 delegate->LoadDataWithBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
2073 }
2074 });
2075 });
2076 webController->SetRefreshImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2077 uiTaskExecutor.PostTask([weak]() {
2078 auto delegate = weak.Upgrade();
2079 if (delegate) {
2080 delegate->Refresh();
2081 }
2082 });
2083 });
2084 webController->SetStopLoadingImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2085 uiTaskExecutor.PostTask([weak]() {
2086 auto delegate = weak.Upgrade();
2087 if (delegate) {
2088 delegate->StopLoading();
2089 }
2090 });
2091 });
2092 webController->SetGetHitTestResultImpl([weak = WeakClaim(this)]() {
2093 auto delegate = weak.Upgrade();
2094 if (delegate) {
2095 return delegate->GetHitTestResult();
2096 }
2097 return 0;
2098 });
2099 webController->SetGetHitTestValueImpl([weak = WeakClaim(this)](HitTestResult& result) {
2100 auto delegate = weak.Upgrade();
2101 if (delegate) {
2102 delegate->GetHitTestValue(result);
2103 }
2104 });
2105 webController->SetGetPageHeightImpl([weak = WeakClaim(this)]() {
2106 auto delegate = weak.Upgrade();
2107 if (delegate) {
2108 return delegate->GetPageHeight();
2109 }
2110 return 0;
2111 });
2112 webController->SetGetWebIdImpl([weak = WeakClaim(this)]() {
2113 auto delegate = weak.Upgrade();
2114 if (delegate) {
2115 return delegate->GetWebId();
2116 }
2117 return -1;
2118 });
2119 webController->SetGetTitleImpl([weak = WeakClaim(this)]() {
2120 auto delegate = weak.Upgrade();
2121 if (delegate) {
2122 return delegate->GetTitle();
2123 }
2124 return std::string();
2125 });
2126 webController->SetCreateMsgPortsImpl([weak = WeakClaim(this)](std::vector<RefPtr<WebMessagePort>>& ports) {
2127 auto delegate = weak.Upgrade();
2128 if (delegate) {
2129 delegate->CreateWebMessagePorts(ports);
2130 }
2131 });
2132 webController->SetPostWebMessageImpl([weak = WeakClaim(this)](std::string& message,
2133 std::vector<RefPtr<WebMessagePort>>& ports, std::string& uri) {
2134 auto delegate = weak.Upgrade();
2135 if (delegate) {
2136 delegate->PostWebMessage(message, ports, uri);
2137 }
2138 });
2139 webController->SetGetDefaultUserAgentImpl([weak = WeakClaim(this)]() {
2140 auto delegate = weak.Upgrade();
2141 if (delegate) {
2142 return delegate->GetDefaultUserAgent();
2143 }
2144 return std::string();
2145 });
2146 webController->SetSaveCookieSyncImpl([weak = WeakClaim(this)]() {
2147 auto delegate = weak.Upgrade();
2148 if (delegate) {
2149 return delegate->SaveCookieSync();
2150 }
2151 return false;
2152 });
2153 webController->SetSetCookieImpl([weak = WeakClaim(this)](const std::string& url, const std::string& value) {
2154 auto delegate = weak.Upgrade();
2155 if (delegate) {
2156 return delegate->SetCookie(url, value);
2157 }
2158 return false;
2159 });
2160 webController->SetGetCookieImpl([weak = WeakClaim(this)](const std::string& url) {
2161 auto delegate = weak.Upgrade();
2162 if (delegate) {
2163 return delegate->GetCookie(url);
2164 }
2165 return std::string();
2166 });
2167 webController->SetDeleteEntirelyCookieImpl([weak = WeakClaim(this)]() {
2168 auto delegate = weak.Upgrade();
2169 if (delegate) {
2170 delegate->DeleteEntirelyCookie();
2171 }
2172 });
2173 webController->SetWebViewJavaScriptResultCallBackImpl(
2174 [weak = WeakClaim(this), uiTaskExecutor](WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl) {
2175 uiTaskExecutor.PostTask([weak, javaScriptCallBackImpl]() {
2176 auto delegate = weak.Upgrade();
2177 if (delegate) {
2178 delegate->SetWebViewJavaScriptResultCallBack(std::move(javaScriptCallBackImpl));
2179 }
2180 });
2181 });
2182 webController->SetAddJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](std::string objectName,
2183 const std::vector<std::string>& methodList) {
2184 uiTaskExecutor.PostTask([weak, objectName, methodList]() {
2185 auto delegate = weak.Upgrade();
2186 if (delegate) {
2187 delegate->AddJavascriptInterface(objectName, methodList);
2188 }
2189 });
2190 });
2191 webController->LoadInitJavascriptInterface();
2192 webController->SetRemoveJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](std::string objectName,
2193 const std::vector<std::string>& methodList) {
2194 uiTaskExecutor.PostTask([weak, objectName, methodList]() {
2195 auto delegate = weak.Upgrade();
2196 if (delegate) {
2197 delegate->RemoveJavascriptInterface(objectName, methodList);
2198 }
2199 });
2200 });
2201 webController->SetOnInactiveImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2202 uiTaskExecutor.PostTask([weak]() {
2203 auto delegate = weak.Upgrade();
2204 if (delegate) {
2205 delegate->OnInactive();
2206 }
2207 });
2208 });
2209 webController->SetOnActiveImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2210 uiTaskExecutor.PostTask([weak]() {
2211 auto delegate = weak.Upgrade();
2212 if (delegate) {
2213 delegate->OnActive();
2214 }
2215 });
2216 });
2217 webController->SetZoomImpl([weak = WeakClaim(this), uiTaskExecutor](float factor) {
2218 uiTaskExecutor.PostTask([weak, factor]() {
2219 auto delegate = weak.Upgrade();
2220 if (delegate) {
2221 delegate->Zoom(factor);
2222 }
2223 });
2224 });
2225 webController->SetZoomInImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2226 bool result = false;
2227 uiTaskExecutor.PostSyncTask([weak, &result]() {
2228 auto delegate = weak.Upgrade();
2229 if (delegate) {
2230 result = delegate->ZoomIn();
2231 }
2232 });
2233 return result;
2234 });
2235 webController->SetZoomOutImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2236 bool result = false;
2237 uiTaskExecutor.PostSyncTask([weak, &result]() {
2238 auto delegate = weak.Upgrade();
2239 if (delegate) {
2240 result = delegate->ZoomOut();
2241 }
2242 });
2243 return result;
2244 });
2245 webController->SetRequestFocusImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2246 uiTaskExecutor.PostTask([weak]() {
2247 auto delegate = weak.Upgrade();
2248 if (delegate) {
2249 delegate->RequestFocus();
2250 }
2251 });
2252 });
2253
2254 webController->SetSearchAllAsyncImpl([weak = WeakClaim(this), uiTaskExecutor](const std::string& searchStr) {
2255 uiTaskExecutor.PostTask([weak, searchStr]() {
2256 auto delegate = weak.Upgrade();
2257 if (delegate) {
2258 delegate->SearchAllAsync(searchStr);
2259 }
2260 });
2261 });
2262 webController->SetClearMatchesImpl([weak = WeakClaim(this), uiTaskExecutor]() {
2263 uiTaskExecutor.PostTask([weak]() {
2264 auto delegate = weak.Upgrade();
2265 if (delegate) {
2266 delegate->ClearMatches();
2267 }
2268 });
2269 });
2270 webController->SetSearchNextImpl([weak = WeakClaim(this), uiTaskExecutor](bool forward) {
2271 uiTaskExecutor.PostTask([weak, forward]() {
2272 auto delegate = weak.Upgrade();
2273 if (delegate) {
2274 delegate->SearchNext(forward);
2275 }
2276 });
2277 });
2278 webController->SetGetUrlImpl([weak = WeakClaim(this)]() {
2279 auto delegate = weak.Upgrade();
2280 if (delegate) {
2281 return delegate->GetUrl();
2282 }
2283 return std::string();
2284 });
2285
2286 } else {
2287 LOGE("web controller is nullptr");
2288 }
2289 }
2290
InitWebViewWithWindow()2291 void WebDelegate::InitWebViewWithWindow()
2292 {
2293 LOGI("Create webview with window");
2294 auto context = context_.Upgrade();
2295 CHECK_NULL_VOID(context);
2296 context->GetTaskExecutor()->PostTask(
2297 [weak = WeakClaim(this)]() {
2298 auto delegate = weak.Upgrade();
2299 if (!delegate) {
2300 return;
2301 }
2302 OHOS::NWeb::NWebInitArgs initArgs;
2303 std::string app_path = GetDataPath();
2304 if (!app_path.empty()) {
2305 initArgs.web_engine_args_to_add.push_back(std::string("--user-data-dir=").append(app_path));
2306 }
2307
2308 delegate->window_ = delegate->CreateWindow();
2309 if (!delegate->window_) {
2310 return;
2311 }
2312 delegate->nweb_ =
2313 OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(delegate->window_.GetRefPtr(), initArgs);
2314 if (delegate->nweb_ == nullptr) {
2315 delegate->window_ = nullptr;
2316 LOGE("fail to get webview instance");
2317 return;
2318 }
2319 delegate->cookieManager_ = OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
2320 if (delegate->cookieManager_ == nullptr) {
2321 LOGE("fail to get webview instance");
2322 return;
2323 }
2324 auto webviewClient = std::make_shared<WebClientImpl>(Container::CurrentId());
2325 webviewClient->SetWebDelegate(weak);
2326 delegate->nweb_->SetNWebHandler(webviewClient);
2327
2328 // Set downloadListenerImpl
2329 auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>(Container::CurrentId());
2330 downloadListenerImpl->SetWebDelegate(weak);
2331 delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
2332
2333 auto findListenerImpl = std::make_shared<FindListenerImpl>(Container::CurrentId());
2334 findListenerImpl->SetWebDelegate(weak);
2335 delegate->nweb_->PutFindCallback(findListenerImpl);
2336
2337 auto isNewPipe = Container::IsCurrentUseNewPipeline();
2338 delegate->UpdateSettting(isNewPipe);
2339
2340 std::optional<std::string> src;
2341 if (isNewPipe) {
2342 auto webPattern = delegate->webPattern_.Upgrade();
2343 if (webPattern) {
2344 src = webPattern->GetWebSrc();
2345 }
2346 } else {
2347 auto webCom = delegate->webComponent_.Upgrade();
2348 if (webCom) {
2349 src = webCom->GetSrc();
2350 }
2351 }
2352 if (src) {
2353 delegate->nweb_->Load(src.value());
2354 }
2355 delegate->window_->Show();
2356 },
2357 TaskExecutor::TaskType::PLATFORM);
2358 }
2359
UpdateSettting(bool useNewPipe)2360 void WebDelegate::UpdateSettting(bool useNewPipe)
2361 {
2362 CHECK_NULL_VOID(nweb_);
2363 auto setting = nweb_->GetPreference();
2364 CHECK_NULL_VOID(setting);
2365 if (useNewPipe) {
2366 auto webPattern = webPattern_.Upgrade();
2367 CHECK_NULL_VOID(webPattern);
2368 setting->PutDomStorageEnabled(webPattern->GetDomStorageAccessEnabledValue(false));
2369 setting->PutJavaScriptEnabled(webPattern->GetJsEnabledValue(true));
2370 setting->PutEnableRawFileAccess(webPattern->GetFileAccessEnabledValue(true));
2371 setting->PutEnableContentAccess(true);
2372 setting->PutLoadImageFromNetworkDisabled(!webPattern->GetOnLineImageAccessEnabledValue(true));
2373 setting->PutImageLoadingAllowed(webPattern->GetImageAccessEnabledValue(true));
2374 setting->PutAccessModeForSecureOriginLoadFromInsecure(static_cast<OHOS::NWeb::NWebPreference::AccessMode>(
2375 webPattern->GetMixedModeValue(MixedModeContent::MIXED_CONTENT_NEVER_ALLOW)));
2376 setting->PutZoomingFunctionEnabled(webPattern->GetZoomAccessEnabledValue(true));
2377 setting->PutGeolocationAllowed(webPattern->GetGeolocationAccessEnabledValue(true));
2378 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(
2379 webPattern->GetCacheModeValue(WebCacheMode::DEFAULT)));
2380 setting->PutLoadWithOverviewMode(webPattern->GetOverviewModeAccessEnabledValue(true));
2381 setting->PutEnableRawFileAccessFromFileURLs(webPattern->GetFileFromUrlAccessEnabledValue(true));
2382 setting->PutDatabaseAllowed(webPattern->GetDatabaseAccessEnabledValue(false));
2383 setting->PutZoomingForTextFactor(webPattern->GetTextZoomRatioValue(DEFAULT_TEXT_ZOOM_RATIO));
2384 setting->PutWebDebuggingAccess(webPattern->GetWebDebuggingAccessEnabledValue(false));
2385 setting->PutMediaPlayGestureAccess(webPattern->GetMediaPlayGestureAccessValue(true));
2386 return;
2387 }
2388 auto component = webComponent_.Upgrade();
2389 CHECK_NULL_VOID(component);
2390 setting->PutDomStorageEnabled(component->GetDomStorageAccessEnabled());
2391 setting->PutJavaScriptEnabled(component->GetJsEnabled());
2392 setting->PutEnableRawFileAccess(component->GetFileAccessEnabled());
2393 setting->PutEnableContentAccess(component->GetContentAccessEnabled());
2394 setting->PutLoadImageFromNetworkDisabled(component->GetOnLineImageAccessEnabled());
2395 setting->PutImageLoadingAllowed(component->GetImageAccessEnabled());
2396 setting->PutAccessModeForSecureOriginLoadFromInsecure(
2397 static_cast<OHOS::NWeb::NWebPreference::AccessMode>(component->GetMixedMode()));
2398 setting->PutZoomingFunctionEnabled(component->GetZoomAccessEnabled());
2399 setting->PutGeolocationAllowed(component->GetGeolocationAccessEnabled());
2400 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(component->GetCacheMode()));
2401 setting->PutLoadWithOverviewMode(component->GetOverviewModeAccessEnabled());
2402 setting->PutEnableRawFileAccessFromFileURLs(component->GetFileFromUrlAccessEnabled());
2403 setting->PutDatabaseAllowed(component->GetDatabaseAccessEnabled());
2404 setting->PutZoomingForTextFactor(component->GetTextZoomRatio());
2405 setting->PutWebDebuggingAccess(component->GetWebDebuggingAccessEnabled());
2406 setting->PutMediaPlayGestureAccess(component->IsMediaPlayGestureAccess());
2407 }
2408
GetCustomScheme()2409 std::string WebDelegate::GetCustomScheme()
2410 {
2411 std::string customScheme;
2412 if (Container::IsCurrentUseNewPipeline()) {
2413 auto webPattern = webPattern_.Upgrade();
2414 if (webPattern) {
2415 auto webData = webPattern->GetCustomScheme();
2416 if (webData) {
2417 customScheme = webData.value();
2418 }
2419 }
2420 } else {
2421 auto webCom = webComponent_.Upgrade();
2422 if (webCom) {
2423 customScheme = webCom->GetCustomScheme();
2424 }
2425 }
2426 return customScheme;
2427 }
2428
InitWebViewWithSurface()2429 void WebDelegate::InitWebViewWithSurface()
2430 {
2431 auto context = context_.Upgrade();
2432 CHECK_NULL_VOID(context);
2433 auto window = context->GetWindow();
2434 CHECK_NULL_VOID(window);
2435 rosenWindowId_ = window->GetWindowId();
2436 LOGI("Init WebView With Surface");
2437 context->GetTaskExecutor()->PostTask(
2438 [weak = WeakClaim(this), context = context_]() {
2439 auto delegate = weak.Upgrade();
2440 CHECK_NULL_VOID(delegate);
2441 OHOS::NWeb::NWebInitArgs initArgs;
2442 initArgs.web_engine_args_to_add.push_back(
2443 std::string("--user-data-dir=").append(delegate->bundleDataPath_));
2444 initArgs.web_engine_args_to_add.push_back(
2445 std::string("--bundle-installation-dir=").append(delegate->bundlePath_));
2446 initArgs.web_engine_args_to_add.push_back(
2447 std::string("--lang=").append(AceApplicationInfo::GetInstance().GetLanguage() +
2448 "-" + AceApplicationInfo::GetInstance().GetCountryOrRegion()));
2449 initArgs.web_engine_args_to_add.push_back(std::string("--user-api-version=").append(
2450 std::to_string(AceApplicationInfo::GetInstance().GetApiTargetVersion())));
2451 bool isEnhanceSurface = delegate->isEnhanceSurface_;
2452 initArgs.is_enhance_surface = isEnhanceSurface;
2453 initArgs.is_popup = delegate->isPopup_;
2454 if (!delegate->hapPath_.empty()) {
2455 initArgs.web_engine_args_to_add.push_back(
2456 std::string("--user-hap-path=").append(delegate->hapPath_));
2457 }
2458 std::string customScheme = delegate->GetCustomScheme();
2459 if (!customScheme.empty()) {
2460 LOGI("custome scheme %{public}s", customScheme.c_str());
2461 initArgs.web_engine_args_to_add.push_back(
2462 std::string("--ohos-custom-scheme=").append(customScheme));
2463 }
2464 initArgs.web_engine_args_to_add.push_back(
2465 std::string("--init-background-color=").append(std::to_string(delegate->backgroundColor_)));
2466 if (isEnhanceSurface) {
2467 LOGI("Create webview with isEnhanceSurface");
2468 delegate->nweb_ = OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
2469 (void *)(&delegate->surfaceInfo_),
2470 initArgs,
2471 delegate->drawSize_.Width(), delegate->drawSize_.Height());
2472 } else {
2473 #ifdef ENABLE_ROSEN_BACKEND
2474 LOGI("Create webview with surface in");
2475 wptr<Surface> surfaceWeak(delegate->surface_);
2476 sptr<Surface> surface = surfaceWeak.promote();
2477 CHECK_NULL_VOID(surface);
2478 delegate->nweb_ = OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(
2479 surface,
2480 initArgs,
2481 delegate->drawSize_.Width(), delegate->drawSize_.Height());
2482 #endif
2483 }
2484 CHECK_NULL_VOID(delegate->nweb_);
2485 delegate->cookieManager_ = OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
2486 CHECK_NULL_VOID(delegate->cookieManager_);
2487 auto nweb_handler = std::make_shared<WebClientImpl>(Container::CurrentId());
2488 nweb_handler->SetWebDelegate(weak);
2489 auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>(Container::CurrentId());
2490 downloadListenerImpl->SetWebDelegate(weak);
2491 delegate->nweb_->SetNWebHandler(nweb_handler);
2492 delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
2493 #ifdef OHOS_STANDARD_SYSTEM
2494 delegate->nweb_->RegisterScreenLockFunction(delegate->GetRosenWindowId(), [context](bool key) {
2495 LOGD("SetKeepScreenOn %{public}d", key);
2496 auto weakContext = context.Upgrade();
2497 CHECK_NULL_VOID(weakContext);
2498 auto window = weakContext->GetWindow();
2499 CHECK_NULL_VOID(window);
2500 window->SetKeepScreenOn(key);
2501 });
2502 #endif
2503 auto findListenerImpl = std::make_shared<FindListenerImpl>(Container::CurrentId());
2504 findListenerImpl->SetWebDelegate(weak);
2505 delegate->nweb_->PutFindCallback(findListenerImpl);
2506 delegate->UpdateSettting(Container::IsCurrentUseNewPipeline());
2507 delegate->RunSetWebIdAndHapPathCallback();
2508 delegate->RunJsProxyCallback();
2509 auto releaseSurfaceListenerImpl = std::make_shared<ReleaseSurfaceImpl>(Container::CurrentId());
2510 releaseSurfaceListenerImpl->SetSurfaceDelegate(delegate->GetSurfaceDelegateClient());
2511 delegate->nweb_->PutReleaseSurfaceCallback(releaseSurfaceListenerImpl);
2512 },
2513 TaskExecutor::TaskType::PLATFORM);
2514 }
2515
SetKeepScreenOn(bool key)2516 void WebDelegate::SetKeepScreenOn(bool key)
2517 {
2518 auto context = context_.Upgrade();
2519 CHECK_NULL_VOID(context);
2520 auto window = context->GetWindow();
2521 CHECK_NULL_VOID(window);
2522 window->SetKeepScreenOn(key);
2523 }
2524
UpdateUserAgent(const std::string & userAgent)2525 void WebDelegate::UpdateUserAgent(const std::string& userAgent)
2526 {
2527 auto context = context_.Upgrade();
2528 if (!context) {
2529 return;
2530 }
2531 context->GetTaskExecutor()->PostTask(
2532 [weak = WeakClaim(this), userAgent]() {
2533 auto delegate = weak.Upgrade();
2534 if (delegate && delegate->nweb_) {
2535 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2536 CHECK_NULL_VOID(setting);
2537 setting->PutUserAgent(userAgent);
2538 }
2539 },
2540 TaskExecutor::TaskType::PLATFORM);
2541 }
2542
UpdateBackgroundColor(const int backgroundColor)2543 void WebDelegate::UpdateBackgroundColor(const int backgroundColor)
2544 {
2545 auto context = context_.Upgrade();
2546 if (!context) {
2547 return;
2548 }
2549 context->GetTaskExecutor()->PostTask(
2550 [weak = WeakClaim(this), backgroundColor]() {
2551 auto delegate = weak.Upgrade();
2552 if (delegate && delegate->nweb_) {
2553 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2554 delegate->nweb_->PutBackgroundColor(backgroundColor);
2555 }
2556 },
2557 TaskExecutor::TaskType::PLATFORM);
2558 }
2559
UpdateInitialScale(float scale)2560 void WebDelegate::UpdateInitialScale(float scale)
2561 {
2562 auto context = context_.Upgrade();
2563 if (!context) {
2564 return;
2565 }
2566 context->GetTaskExecutor()->PostTask(
2567 [weak = WeakClaim(this), scale]() {
2568 auto delegate = weak.Upgrade();
2569 if (delegate && delegate->nweb_) {
2570 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2571 delegate->nweb_->InitialScale(scale);
2572 }
2573 },
2574 TaskExecutor::TaskType::PLATFORM);
2575 }
2576
Resize(const double & width,const double & height)2577 void WebDelegate::Resize(const double& width, const double& height)
2578 {
2579 if (width <= 0 || height <= 0) {
2580 return;
2581 }
2582
2583 auto context = context_.Upgrade();
2584 if (!context) {
2585 return;
2586 }
2587 context->GetTaskExecutor()->PostTask(
2588 [weak = WeakClaim(this), width, height]() {
2589 auto delegate = weak.Upgrade();
2590 if (delegate && delegate->nweb_ && !delegate->window_) {
2591 // Sur need int value, greater than this value in case show black line.
2592 delegate->nweb_->Resize(std::ceil(width), std::ceil(height));
2593 double offsetX = 0;
2594 double offsetY = 0;
2595 delegate->UpdateScreenOffSet(offsetX, offsetY);
2596 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
2597 }
2598 },
2599 TaskExecutor::TaskType::PLATFORM);
2600 }
2601
UpdateJavaScriptEnabled(const bool & isJsEnabled)2602 void WebDelegate::UpdateJavaScriptEnabled(const bool& isJsEnabled)
2603 {
2604 auto context = context_.Upgrade();
2605 if (!context) {
2606 return;
2607 }
2608 context->GetTaskExecutor()->PostTask(
2609 [weak = WeakClaim(this), isJsEnabled]() {
2610 auto delegate = weak.Upgrade();
2611 if (delegate && delegate->nweb_) {
2612 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2613 CHECK_NULL_VOID(setting);
2614 setting->PutJavaScriptEnabled(isJsEnabled);
2615 }
2616 },
2617 TaskExecutor::TaskType::PLATFORM);
2618 }
2619
UpdateAllowFileAccess(const bool & isFileAccessEnabled)2620 void WebDelegate::UpdateAllowFileAccess(const bool& isFileAccessEnabled)
2621 {
2622 auto context = context_.Upgrade();
2623 if (!context) {
2624 return;
2625 }
2626 context->GetTaskExecutor()->PostTask(
2627 [weak = WeakClaim(this), isFileAccessEnabled]() {
2628 auto delegate = weak.Upgrade();
2629 if (delegate && delegate->nweb_) {
2630 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2631 CHECK_NULL_VOID(setting);
2632 setting->PutEnableRawFileAccess(isFileAccessEnabled);
2633 }
2634 },
2635 TaskExecutor::TaskType::PLATFORM);
2636 }
2637
UpdateBlockNetworkImage(const bool & onLineImageAccessEnabled)2638 void WebDelegate::UpdateBlockNetworkImage(const bool& onLineImageAccessEnabled)
2639 {
2640 auto context = context_.Upgrade();
2641 if (!context) {
2642 return;
2643 }
2644 context->GetTaskExecutor()->PostTask(
2645 [weak = WeakClaim(this), onLineImageAccessEnabled]() {
2646 auto delegate = weak.Upgrade();
2647 if (delegate && delegate->nweb_) {
2648 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2649 CHECK_NULL_VOID(setting);
2650 setting->PutLoadImageFromNetworkDisabled(onLineImageAccessEnabled);
2651 }
2652 },
2653 TaskExecutor::TaskType::PLATFORM);
2654 }
2655
UpdateLoadsImagesAutomatically(const bool & isImageAccessEnabled)2656 void WebDelegate::UpdateLoadsImagesAutomatically(const bool& isImageAccessEnabled)
2657 {
2658 auto context = context_.Upgrade();
2659 if (!context) {
2660 return;
2661 }
2662 context->GetTaskExecutor()->PostTask(
2663 [weak = WeakClaim(this), isImageAccessEnabled]() {
2664 auto delegate = weak.Upgrade();
2665 if (delegate && delegate->nweb_) {
2666 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2667 CHECK_NULL_VOID(setting);
2668 setting->PutImageLoadingAllowed(isImageAccessEnabled);
2669 }
2670 },
2671 TaskExecutor::TaskType::PLATFORM);
2672 }
2673
UpdateMixedContentMode(const MixedModeContent & mixedMode)2674 void WebDelegate::UpdateMixedContentMode(const MixedModeContent& mixedMode)
2675 {
2676 auto context = context_.Upgrade();
2677 if (!context) {
2678 return;
2679 }
2680 context->GetTaskExecutor()->PostTask(
2681 [weak = WeakClaim(this), mixedMode]() {
2682 auto delegate = weak.Upgrade();
2683 if (delegate && delegate->nweb_) {
2684 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2685 CHECK_NULL_VOID(setting);
2686 setting->PutAccessModeForSecureOriginLoadFromInsecure(
2687 static_cast<OHOS::NWeb::NWebPreference::AccessMode>(mixedMode));
2688 }
2689 },
2690 TaskExecutor::TaskType::PLATFORM);
2691 }
2692
UpdateSupportZoom(const bool & isZoomAccessEnabled)2693 void WebDelegate::UpdateSupportZoom(const bool& isZoomAccessEnabled)
2694 {
2695 auto context = context_.Upgrade();
2696 if (!context) {
2697 return;
2698 }
2699 context->GetTaskExecutor()->PostTask(
2700 [weak = WeakClaim(this), isZoomAccessEnabled]() {
2701 auto delegate = weak.Upgrade();
2702 if (delegate && delegate->nweb_) {
2703 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2704 CHECK_NULL_VOID(setting);
2705 setting->PutZoomingFunctionEnabled(isZoomAccessEnabled);
2706 }
2707 },
2708 TaskExecutor::TaskType::PLATFORM);
2709 }
UpdateDomStorageEnabled(const bool & isDomStorageAccessEnabled)2710 void WebDelegate::UpdateDomStorageEnabled(const bool& isDomStorageAccessEnabled)
2711 {
2712 auto context = context_.Upgrade();
2713 if (!context) {
2714 return;
2715 }
2716 context->GetTaskExecutor()->PostTask(
2717 [weak = WeakClaim(this), isDomStorageAccessEnabled]() {
2718 auto delegate = weak.Upgrade();
2719 if (delegate && delegate->nweb_) {
2720 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2721 CHECK_NULL_VOID(setting);
2722 setting->PutDomStorageEnabled(isDomStorageAccessEnabled);
2723 }
2724 },
2725 TaskExecutor::TaskType::PLATFORM);
2726 }
UpdateGeolocationEnabled(const bool & isGeolocationAccessEnabled)2727 void WebDelegate::UpdateGeolocationEnabled(const bool& isGeolocationAccessEnabled)
2728 {
2729 auto context = context_.Upgrade();
2730 if (!context) {
2731 return;
2732 }
2733 context->GetTaskExecutor()->PostTask(
2734 [weak = WeakClaim(this), isGeolocationAccessEnabled]() {
2735 auto delegate = weak.Upgrade();
2736 if (delegate && delegate->nweb_) {
2737 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2738 CHECK_NULL_VOID(setting);
2739 setting->PutGeolocationAllowed(isGeolocationAccessEnabled);
2740 }
2741 },
2742 TaskExecutor::TaskType::PLATFORM);
2743 }
2744
UpdateCacheMode(const WebCacheMode & mode)2745 void WebDelegate::UpdateCacheMode(const WebCacheMode& mode)
2746 {
2747 auto context = context_.Upgrade();
2748 if (!context) {
2749 return;
2750 }
2751 context->GetTaskExecutor()->PostTask(
2752 [weak = WeakClaim(this), mode]() {
2753 auto delegate = weak.Upgrade();
2754 if (delegate && delegate->nweb_) {
2755 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2756 CHECK_NULL_VOID(setting);
2757 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(mode));
2758 }
2759 },
2760 TaskExecutor::TaskType::PLATFORM);
2761 }
2762
GetNweb()2763 std::shared_ptr<OHOS::NWeb::NWeb> WebDelegate::GetNweb()
2764 {
2765 return nweb_;
2766 }
2767
GetForceDarkMode()2768 bool WebDelegate::GetForceDarkMode()
2769 {
2770 return forceDarkMode_;
2771 }
2772
UpdateDarkMode(const WebDarkMode & mode)2773 void WebDelegate::UpdateDarkMode(const WebDarkMode& mode)
2774 {
2775 auto context = context_.Upgrade();
2776 if (!context) {
2777 return;
2778 }
2779 context->GetTaskExecutor()->PostTask(
2780 [weak = WeakClaim(this), mode]() {
2781 auto delegate = weak.Upgrade();
2782 CHECK_NULL_VOID(delegate);
2783 CHECK_NULL_VOID(delegate->nweb_);
2784 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2785 CHECK_NULL_VOID(setting);
2786 if (mode == WebDarkMode::On) {
2787 delegate->UnRegisterConfigObserver();
2788 setting->PutDarkSchemeEnabled(true);
2789 if (delegate->forceDarkMode_) {
2790 setting->PutForceDarkModeEnabled(true);
2791 }
2792 return;
2793 }
2794 if (mode == WebDarkMode::Off) {
2795 delegate->UnRegisterConfigObserver();
2796 setting->PutDarkSchemeEnabled(false);
2797 setting->PutForceDarkModeEnabled(false);
2798 return;
2799 }
2800 if (mode == WebDarkMode::Auto) {
2801 delegate->UpdateDarkModeAuto(delegate, setting);
2802 }
2803 },
2804 TaskExecutor::TaskType::PLATFORM);
2805 }
2806
UpdateDarkModeAuto(RefPtr<WebDelegate> delegate,std::shared_ptr<OHOS::NWeb::NWebPreference> setting)2807 void WebDelegate::UpdateDarkModeAuto(RefPtr<WebDelegate> delegate,
2808 std::shared_ptr<OHOS::NWeb::NWebPreference> setting)
2809 {
2810 auto appMgrClient = std::make_shared<AppExecFwk::AppMgrClient>();
2811 if (appMgrClient->ConnectAppMgrService()) {
2812 return;
2813 }
2814 auto systemConfig = OHOS::AppExecFwk::Configuration();
2815 appMgrClient->GetConfiguration(systemConfig);
2816 std::string colorMode =
2817 systemConfig.GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE);
2818 CHECK_NULL_VOID(setting);
2819 if (colorMode == "dark") {
2820 setting->PutDarkSchemeEnabled(true);
2821 if (delegate->GetForceDarkMode()) {
2822 setting->PutForceDarkModeEnabled(true);
2823 }
2824 }
2825 if (colorMode == "light") {
2826 setting->PutDarkSchemeEnabled(false);
2827 setting->PutForceDarkModeEnabled(false);
2828 }
2829 delegate->RegisterConfigObserver();
2830 }
2831
UpdateForceDarkAccess(const bool & access)2832 void WebDelegate::UpdateForceDarkAccess(const bool& access)
2833 {
2834 auto context = context_.Upgrade();
2835 if (!context) {
2836 return;
2837 }
2838 context->GetTaskExecutor()->PostTask(
2839 [weak = WeakClaim(this), access]() {
2840 auto delegate = weak.Upgrade();
2841 CHECK_NULL_VOID(delegate);
2842 CHECK_NULL_VOID(delegate->nweb_);
2843 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2844 CHECK_NULL_VOID(setting);
2845 delegate->forceDarkMode_ = access;
2846 if (setting->DarkSchemeEnabled()) {
2847 setting->PutForceDarkModeEnabled(access);
2848 } else {
2849 setting->PutForceDarkModeEnabled(false);
2850 }
2851 },
2852 TaskExecutor::TaskType::PLATFORM);
2853 }
2854
UpdateAudioResumeInterval(const int32_t & resumeInterval)2855 void WebDelegate::UpdateAudioResumeInterval(const int32_t& resumeInterval)
2856 {
2857 auto context = context_.Upgrade();
2858 if (!context) {
2859 return;
2860 }
2861 context->GetTaskExecutor()->PostTask(
2862 [weak = WeakClaim(this), resumeInterval]() {
2863 auto delegate = weak.Upgrade();
2864 CHECK_NULL_VOID(delegate);
2865 CHECK_NULL_VOID(delegate->nweb_);
2866 delegate->nweb_->SetAudioResumeInterval(resumeInterval);
2867 },
2868 TaskExecutor::TaskType::PLATFORM);
2869 }
2870
UpdateAudioExclusive(const bool & audioExclusive)2871 void WebDelegate::UpdateAudioExclusive(const bool& audioExclusive)
2872 {
2873 auto context = context_.Upgrade();
2874 if (!context) {
2875 return;
2876 }
2877 context->GetTaskExecutor()->PostTask(
2878 [weak = WeakClaim(this), audioExclusive]() {
2879 auto delegate = weak.Upgrade();
2880 CHECK_NULL_VOID(delegate);
2881 CHECK_NULL_VOID(delegate->nweb_);
2882 delegate->nweb_->SetAudioExclusive(audioExclusive);
2883 },
2884 TaskExecutor::TaskType::PLATFORM);
2885 }
2886
UpdateOverviewModeEnabled(const bool & isOverviewModeAccessEnabled)2887 void WebDelegate::UpdateOverviewModeEnabled(const bool& isOverviewModeAccessEnabled)
2888 {
2889 auto context = context_.Upgrade();
2890 if (!context) {
2891 return;
2892 }
2893 context->GetTaskExecutor()->PostTask(
2894 [weak = WeakClaim(this), isOverviewModeAccessEnabled]() {
2895 auto delegate = weak.Upgrade();
2896 if (delegate && delegate->nweb_) {
2897 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2898 CHECK_NULL_VOID(setting);
2899 setting->PutLoadWithOverviewMode(isOverviewModeAccessEnabled);
2900 }
2901 },
2902 TaskExecutor::TaskType::PLATFORM);
2903 }
2904
UpdateFileFromUrlEnabled(const bool & isFileFromUrlAccessEnabled)2905 void WebDelegate::UpdateFileFromUrlEnabled(const bool& isFileFromUrlAccessEnabled)
2906 {
2907 auto context = context_.Upgrade();
2908 if (!context) {
2909 return;
2910 }
2911 context->GetTaskExecutor()->PostTask(
2912 [weak = WeakClaim(this), isFileFromUrlAccessEnabled]() {
2913 auto delegate = weak.Upgrade();
2914 if (delegate && delegate->nweb_) {
2915 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2916 CHECK_NULL_VOID(setting);
2917 setting->PutEnableRawFileAccessFromFileURLs(isFileFromUrlAccessEnabled);
2918 }
2919 },
2920 TaskExecutor::TaskType::PLATFORM);
2921 }
2922
UpdateDatabaseEnabled(const bool & isDatabaseAccessEnabled)2923 void WebDelegate::UpdateDatabaseEnabled(const bool& isDatabaseAccessEnabled)
2924 {
2925 auto context = context_.Upgrade();
2926 if (!context) {
2927 return;
2928 }
2929 context->GetTaskExecutor()->PostTask(
2930 [weak = WeakClaim(this), isDatabaseAccessEnabled]() {
2931 auto delegate = weak.Upgrade();
2932 if (delegate && delegate->nweb_) {
2933 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2934 CHECK_NULL_VOID(setting);
2935 setting->PutDatabaseAllowed(isDatabaseAccessEnabled);
2936 }
2937 },
2938 TaskExecutor::TaskType::PLATFORM);
2939 }
2940
UpdateTextZoomRatio(const int32_t & textZoomRatioNum)2941 void WebDelegate::UpdateTextZoomRatio(const int32_t& textZoomRatioNum)
2942 {
2943 auto context = context_.Upgrade();
2944 if (!context) {
2945 return;
2946 }
2947 context->GetTaskExecutor()->PostTask(
2948 [weak = WeakClaim(this), textZoomRatioNum]() {
2949 auto delegate = weak.Upgrade();
2950 if (delegate && delegate->nweb_) {
2951 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2952 CHECK_NULL_VOID(setting);
2953 setting->PutZoomingForTextFactor(textZoomRatioNum);
2954 }
2955 },
2956 TaskExecutor::TaskType::PLATFORM);
2957 }
2958
UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)2959 void WebDelegate::UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)
2960 {
2961 auto context = context_.Upgrade();
2962 if (!context) {
2963 return;
2964 }
2965 context->GetTaskExecutor()->PostTask(
2966 [weak = WeakClaim(this), isWebDebuggingAccessEnabled]() {
2967 auto delegate = weak.Upgrade();
2968 if (delegate && delegate->nweb_) {
2969 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2970 CHECK_NULL_VOID(setting);
2971 setting->PutWebDebuggingAccess(isWebDebuggingAccessEnabled);
2972 }
2973 },
2974 TaskExecutor::TaskType::PLATFORM);
2975 }
2976
UpdatePinchSmoothModeEnabled(bool isPinchSmoothModeEnabled)2977 void WebDelegate::UpdatePinchSmoothModeEnabled(bool isPinchSmoothModeEnabled)
2978 {
2979 auto context = context_.Upgrade();
2980 if (!context) {
2981 return;
2982 }
2983 context->GetTaskExecutor()->PostTask(
2984 [weak = WeakClaim(this), isPinchSmoothModeEnabled]() {
2985 auto delegate = weak.Upgrade();
2986 if (delegate && delegate->nweb_) {
2987 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
2988 CHECK_NULL_VOID(setting);
2989 setting->PutPinchSmoothMode(isPinchSmoothModeEnabled);
2990 }
2991 },
2992 TaskExecutor::TaskType::PLATFORM);
2993 }
2994
UpdateMediaPlayGestureAccess(bool isNeedGestureAccess)2995 void WebDelegate::UpdateMediaPlayGestureAccess(bool isNeedGestureAccess)
2996 {
2997 auto context = context_.Upgrade();
2998 if (!context) {
2999 return;
3000 }
3001 context->GetTaskExecutor()->PostTask(
3002 [weak = WeakClaim(this), isNeedGestureAccess]() {
3003 auto delegate = weak.Upgrade();
3004 if (delegate && delegate->nweb_) {
3005 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3006 if (setting) {
3007 setting->PutMediaPlayGestureAccess(isNeedGestureAccess);
3008 }
3009 }
3010 },
3011 TaskExecutor::TaskType::PLATFORM);
3012 }
3013
UpdateMultiWindowAccess(bool isMultiWindowAccessEnabled)3014 void WebDelegate::UpdateMultiWindowAccess(bool isMultiWindowAccessEnabled)
3015 {
3016 auto context = context_.Upgrade();
3017 if (!context) {
3018 return;
3019 }
3020 context->GetTaskExecutor()->PostTask(
3021 [weak = WeakClaim(this), isMultiWindowAccessEnabled]() {
3022 auto delegate = weak.Upgrade();
3023 if (delegate && delegate->nweb_) {
3024 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3025 CHECK_NULL_VOID(setting);
3026 setting->PutMultiWindowAccess(isMultiWindowAccessEnabled);
3027 }
3028 },
3029 TaskExecutor::TaskType::PLATFORM);
3030 }
3031
UpdateAllowWindowOpenMethod(bool isAllowWindowOpenMethod)3032 void WebDelegate::UpdateAllowWindowOpenMethod(bool isAllowWindowOpenMethod)
3033 {
3034 auto context = context_.Upgrade();
3035 if (!context) {
3036 return;
3037 }
3038 context->GetTaskExecutor()->PostTask(
3039 [weak = WeakClaim(this), isAllowWindowOpenMethod]() {
3040 auto delegate = weak.Upgrade();
3041 if (delegate && delegate->nweb_) {
3042 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3043 setting->PutIsCreateWindowsByJavaScriptAllowed(isAllowWindowOpenMethod);
3044 }
3045 },
3046 TaskExecutor::TaskType::PLATFORM);
3047 }
3048
UpdateWebCursiveFont(const std::string & cursiveFontFamily)3049 void WebDelegate::UpdateWebCursiveFont(const std::string& cursiveFontFamily)
3050 {
3051 auto context = context_.Upgrade();
3052 if (!context) {
3053 return;
3054 }
3055 context->GetTaskExecutor()->PostTask(
3056 [weak = WeakClaim(this), cursiveFontFamily]() {
3057 auto delegate = weak.Upgrade();
3058 if (delegate && delegate->nweb_) {
3059 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3060 if (setting) {
3061 setting->PutCursiveFontFamilyName(cursiveFontFamily);
3062 }
3063 }
3064 },
3065 TaskExecutor::TaskType::PLATFORM);
3066 }
3067
UpdateWebFantasyFont(const std::string & fantasyFontFamily)3068 void WebDelegate::UpdateWebFantasyFont(const std::string& fantasyFontFamily)
3069 {
3070 auto context = context_.Upgrade();
3071 if (!context) {
3072 return;
3073 }
3074 context->GetTaskExecutor()->PostTask(
3075 [weak = WeakClaim(this), fantasyFontFamily]() {
3076 auto delegate = weak.Upgrade();
3077 if (delegate && delegate->nweb_) {
3078 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3079 if (setting) {
3080 setting->PutFantasyFontFamilyName(fantasyFontFamily);
3081 }
3082 }
3083 },
3084 TaskExecutor::TaskType::PLATFORM);
3085 }
3086
UpdateWebFixedFont(const std::string & fixedFontFamily)3087 void WebDelegate::UpdateWebFixedFont(const std::string& fixedFontFamily)
3088 {
3089 auto context = context_.Upgrade();
3090 if (!context) {
3091 return;
3092 }
3093 context->GetTaskExecutor()->PostTask(
3094 [weak = WeakClaim(this), fixedFontFamily]() {
3095 auto delegate = weak.Upgrade();
3096 if (delegate && delegate->nweb_) {
3097 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3098 if (setting) {
3099 setting->PutFixedFontFamilyName(fixedFontFamily);
3100 }
3101 }
3102 },
3103 TaskExecutor::TaskType::PLATFORM);
3104 }
3105
UpdateWebSansSerifFont(const std::string & sansSerifFontFamily)3106 void WebDelegate::UpdateWebSansSerifFont(const std::string& sansSerifFontFamily)
3107 {
3108 auto context = context_.Upgrade();
3109 if (!context) {
3110 return;
3111 }
3112 context->GetTaskExecutor()->PostTask(
3113 [weak = WeakClaim(this), sansSerifFontFamily]() {
3114 auto delegate = weak.Upgrade();
3115 if (delegate && delegate->nweb_) {
3116 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3117 if (setting) {
3118 setting->PutSansSerifFontFamilyName(sansSerifFontFamily);
3119 }
3120 }
3121 },
3122 TaskExecutor::TaskType::PLATFORM);
3123 }
3124
UpdateWebSerifFont(const std::string & serifFontFamily)3125 void WebDelegate::UpdateWebSerifFont(const std::string& serifFontFamily)
3126 {
3127 auto context = context_.Upgrade();
3128 if (!context) {
3129 return;
3130 }
3131 context->GetTaskExecutor()->PostTask(
3132 [weak = WeakClaim(this), serifFontFamily]() {
3133 auto delegate = weak.Upgrade();
3134 if (delegate && delegate->nweb_) {
3135 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3136 if (setting) {
3137 setting->PutSerifFontFamilyName(serifFontFamily);
3138 }
3139 }
3140 },
3141 TaskExecutor::TaskType::PLATFORM);
3142 }
3143
UpdateWebStandardFont(const std::string & standardFontFamily)3144 void WebDelegate::UpdateWebStandardFont(const std::string& standardFontFamily)
3145 {
3146 auto context = context_.Upgrade();
3147 if (!context) {
3148 return;
3149 }
3150 context->GetTaskExecutor()->PostTask(
3151 [weak = WeakClaim(this), standardFontFamily]() {
3152 auto delegate = weak.Upgrade();
3153 if (delegate && delegate->nweb_) {
3154 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3155 if (setting) {
3156 setting->PutStandardFontFamilyName(standardFontFamily);
3157 }
3158 }
3159 },
3160 TaskExecutor::TaskType::PLATFORM);
3161 }
3162
UpdateDefaultFixedFontSize(int32_t defaultFixedFontSize)3163 void WebDelegate::UpdateDefaultFixedFontSize(int32_t defaultFixedFontSize)
3164 {
3165 auto context = context_.Upgrade();
3166 if (!context) {
3167 return;
3168 }
3169 context->GetTaskExecutor()->PostTask(
3170 [weak = WeakClaim(this), defaultFixedFontSize]() {
3171 auto delegate = weak.Upgrade();
3172 if (delegate && delegate->nweb_) {
3173 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3174 if (setting) {
3175 setting->PutDefaultFixedFontSize(defaultFixedFontSize);
3176 }
3177 }
3178 },
3179 TaskExecutor::TaskType::PLATFORM);
3180 }
3181
UpdateDefaultFontSize(int32_t defaultFontSize)3182 void WebDelegate::UpdateDefaultFontSize(int32_t defaultFontSize)
3183 {
3184 auto context = context_.Upgrade();
3185 if (!context) {
3186 return;
3187 }
3188 context->GetTaskExecutor()->PostTask(
3189 [weak = WeakClaim(this), defaultFontSize]() {
3190 auto delegate = weak.Upgrade();
3191 if (delegate && delegate->nweb_) {
3192 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3193 if (setting) {
3194 setting->PutDefaultFontSize(defaultFontSize);
3195 }
3196 }
3197 },
3198 TaskExecutor::TaskType::PLATFORM);
3199 }
3200
UpdateMinFontSize(int32_t minFontSize)3201 void WebDelegate::UpdateMinFontSize(int32_t minFontSize)
3202 {
3203 auto context = context_.Upgrade();
3204 if (!context) {
3205 return;
3206 }
3207 context->GetTaskExecutor()->PostTask(
3208 [weak = WeakClaim(this), minFontSize]() {
3209 auto delegate = weak.Upgrade();
3210 if (delegate && delegate->nweb_) {
3211 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3212 if (setting) {
3213 setting->PutFontSizeLowerLimit(minFontSize);
3214 }
3215 }
3216 },
3217 TaskExecutor::TaskType::PLATFORM);
3218 }
3219
UpdateMinLogicalFontSize(int32_t minLogicalFontSize)3220 void WebDelegate::UpdateMinLogicalFontSize(int32_t minLogicalFontSize)
3221 {
3222 auto context = context_.Upgrade();
3223 if (!context) {
3224 return;
3225 }
3226 context->GetTaskExecutor()->PostTask(
3227 [weak = WeakClaim(this), minLogicalFontSize]() {
3228 auto delegate = weak.Upgrade();
3229 if (delegate && delegate->nweb_) {
3230 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3231 if (setting) {
3232 setting->PutLogicalFontSizeLowerLimit(minLogicalFontSize);
3233 }
3234 }
3235 },
3236 TaskExecutor::TaskType::PLATFORM);
3237 }
3238
UpdateBlockNetwork(bool isNetworkBlocked)3239 void WebDelegate::UpdateBlockNetwork(bool isNetworkBlocked)
3240 {
3241 auto context = context_.Upgrade();
3242 if (!context) {
3243 return;
3244 }
3245 context->GetTaskExecutor()->PostTask(
3246 [weak = WeakClaim(this), isNetworkBlocked]() {
3247 auto delegate = weak.Upgrade();
3248 if (delegate && delegate->nweb_) {
3249 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3250 if (setting) {
3251 setting->PutBlockNetwork(isNetworkBlocked);
3252 }
3253 }
3254 },
3255 TaskExecutor::TaskType::PLATFORM);
3256 }
3257
UpdateHorizontalScrollBarAccess(bool isHorizontalScrollBarAccessEnabled)3258 void WebDelegate::UpdateHorizontalScrollBarAccess(bool isHorizontalScrollBarAccessEnabled)
3259 {
3260 auto context = context_.Upgrade();
3261 if (!context) {
3262 return;
3263 }
3264 context->GetTaskExecutor()->PostTask(
3265 [weak = WeakClaim(this), isHorizontalScrollBarAccessEnabled]() {
3266 auto delegate = weak.Upgrade();
3267 if (delegate && delegate->nweb_) {
3268 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3269 if (setting) {
3270 setting->PutHorizontalScrollBarAccess(isHorizontalScrollBarAccessEnabled);
3271 }
3272 }
3273 },
3274 TaskExecutor::TaskType::PLATFORM);
3275 }
3276
UpdateVerticalScrollBarAccess(bool isVerticalScrollBarAccessEnabled)3277 void WebDelegate::UpdateVerticalScrollBarAccess(bool isVerticalScrollBarAccessEnabled)
3278 {
3279 auto context = context_.Upgrade();
3280 if (!context) {
3281 return;
3282 }
3283 context->GetTaskExecutor()->PostTask(
3284 [weak = WeakClaim(this), isVerticalScrollBarAccessEnabled]() {
3285 auto delegate = weak.Upgrade();
3286 if (delegate && delegate->nweb_) {
3287 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3288 if (setting) {
3289 setting->PutVerticalScrollBarAccess(isVerticalScrollBarAccessEnabled);
3290 }
3291 }
3292 },
3293 TaskExecutor::TaskType::PLATFORM);
3294 }
3295
UpdateScrollBarColor(const std::string & colorValue)3296 void WebDelegate::UpdateScrollBarColor(const std::string& colorValue)
3297 {
3298 auto context = context_.Upgrade();
3299 if (!context) {
3300 return;
3301 }
3302
3303 auto pipeline = PipelineContext::GetCurrentContext();
3304 if (pipeline == nullptr) {
3305 return;
3306 }
3307
3308 auto themeManager = pipeline->GetThemeManager();
3309 if (themeManager == nullptr) {
3310 return;
3311 }
3312
3313 auto themeConstants = themeManager->GetThemeConstants();
3314 if (themeConstants == nullptr) {
3315 return;
3316 }
3317 Color color = themeConstants->GetColorByName(colorValue);
3318 uint32_t colorContent = color.GetValue();
3319 context->GetTaskExecutor()->PostTask(
3320 [weak = WeakClaim(this), colorContent]() {
3321 auto delegate = weak.Upgrade();
3322 if (delegate && delegate->nweb_) {
3323 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
3324 if (setting) {
3325 setting->PutScrollBarColor(colorContent);
3326 }
3327 }
3328 },
3329 TaskExecutor::TaskType::PLATFORM);
3330 }
3331
LoadUrl()3332 void WebDelegate::LoadUrl()
3333 {
3334 auto context = context_.Upgrade();
3335 CHECK_NULL_VOID(context);
3336 context->GetTaskExecutor()->PostTask(
3337 [weak = WeakClaim(this)]() {
3338 auto delegate = weak.Upgrade();
3339 if (delegate && delegate->nweb_) {
3340 std::optional<std::string> src;
3341 if (Container::IsCurrentUseNewPipeline()) {
3342 auto webPattern = delegate->webPattern_.Upgrade();
3343 if (webPattern) {
3344 src = webPattern->GetWebSrc();
3345 }
3346 } else {
3347 auto webCom = delegate->webComponent_.Upgrade();
3348 if (webCom) {
3349 src = webCom->GetSrc();
3350 }
3351 }
3352 CHECK_NULL_VOID(src);
3353 delegate->nweb_->Load(src.value());
3354 }
3355 },
3356 TaskExecutor::TaskType::PLATFORM);
3357 }
3358
OnInactive()3359 void WebDelegate::OnInactive()
3360 {
3361 auto context = context_.Upgrade();
3362 if (!context) {
3363 return;
3364 }
3365 context->GetTaskExecutor()->PostTask(
3366 [weak = WeakClaim(this)]() {
3367 auto delegate = weak.Upgrade();
3368 if (!delegate) {
3369 return;
3370 }
3371 if (delegate->nweb_) {
3372 delegate->nweb_->OnPause();
3373 }
3374 },
3375 TaskExecutor::TaskType::PLATFORM);
3376 }
3377
OnActive()3378 void WebDelegate::OnActive()
3379 {
3380 auto context = context_.Upgrade();
3381 if (!context) {
3382 return;
3383 }
3384 context->GetTaskExecutor()->PostTask(
3385 [weak = WeakClaim(this)]() {
3386 auto delegate = weak.Upgrade();
3387 if (!delegate) {
3388 return;
3389 }
3390 if (delegate->nweb_) {
3391 delegate->nweb_->OnContinue();
3392 }
3393 },
3394 TaskExecutor::TaskType::PLATFORM);
3395 }
3396
OnWebviewHide()3397 void WebDelegate::OnWebviewHide()
3398 {
3399 auto context = context_.Upgrade();
3400 if (!context) {
3401 return;
3402 }
3403 context->GetTaskExecutor()->PostTask(
3404 [weak = WeakClaim(this)]() {
3405 auto delegate = weak.Upgrade();
3406 if (!delegate) {
3407 return;
3408 }
3409 if (delegate->nweb_) {
3410 delegate->nweb_->OnWebviewHide();
3411 }
3412 },
3413 TaskExecutor::TaskType::PLATFORM);
3414 }
3415
OnWebviewShow()3416 void WebDelegate::OnWebviewShow()
3417 {
3418 auto context = context_.Upgrade();
3419 if (!context) {
3420 return;
3421 }
3422 context->GetTaskExecutor()->PostTask(
3423 [weak = WeakClaim(this)]() {
3424 auto delegate = weak.Upgrade();
3425 if (!delegate) {
3426 return;
3427 }
3428 if (delegate->nweb_) {
3429 delegate->nweb_->OnWebviewShow();
3430 }
3431 },
3432 TaskExecutor::TaskType::PLATFORM);
3433 }
3434
SetShouldFrameSubmissionBeforeDraw(bool should)3435 void WebDelegate::SetShouldFrameSubmissionBeforeDraw(bool should)
3436 {
3437 auto context = context_.Upgrade();
3438 if (!context) {
3439 return;
3440 }
3441 context->GetTaskExecutor()->PostTask(
3442 [weak = WeakClaim(this), should]() {
3443 auto delegate = weak.Upgrade();
3444 if (!delegate) {
3445 return;
3446 }
3447 if (delegate->nweb_) {
3448 delegate->nweb_->SetShouldFrameSubmissionBeforeDraw(should);
3449 }
3450 },
3451 TaskExecutor::TaskType::PLATFORM);
3452 }
3453
NotifyMemoryLevel(int32_t level)3454 void WebDelegate::NotifyMemoryLevel(int32_t level)
3455 {
3456 auto context = context_.Upgrade();
3457 if (!context) {
3458 return;
3459 }
3460 context->GetTaskExecutor()->PostTask(
3461 [weak = WeakClaim(this), level]() {
3462 auto delegate = weak.Upgrade();
3463 if (!delegate) {
3464 return;
3465 }
3466 if (delegate->nweb_) {
3467 delegate->nweb_->NotifyMemoryLevel(level);
3468 }
3469 },
3470 TaskExecutor::TaskType::PLATFORM);
3471 }
3472
Zoom(float factor)3473 void WebDelegate::Zoom(float factor)
3474 {
3475 auto context = context_.Upgrade();
3476 if (!context) {
3477 return;
3478 }
3479
3480 context->GetTaskExecutor()->PostTask(
3481 [weak = WeakClaim(this), factor]() {
3482 auto delegate = weak.Upgrade();
3483 if (!delegate) {
3484 LOGE("Get delegate failed, it is null.");
3485 return;
3486 }
3487 if (delegate->nweb_) {
3488 delegate->nweb_->Zoom(factor);
3489 }
3490 },
3491 TaskExecutor::TaskType::PLATFORM);
3492 }
3493
ZoomIn()3494 bool WebDelegate::ZoomIn()
3495 {
3496 auto context = context_.Upgrade();
3497 if (!context) {
3498 return false;
3499 }
3500 bool result = false;
3501 context->GetTaskExecutor()->PostSyncTask(
3502 [weak = WeakClaim(this), &result]() {
3503 auto delegate = weak.Upgrade();
3504 if (!delegate) {
3505 LOGE("Get delegate failed, it is null.");
3506 return;
3507 }
3508 if (delegate->nweb_) {
3509 result = delegate->nweb_->ZoomIn();
3510 }
3511 },
3512 TaskExecutor::TaskType::PLATFORM);
3513 return result;
3514 }
3515
ZoomOut()3516 bool WebDelegate::ZoomOut()
3517 {
3518 auto context = context_.Upgrade();
3519 if (!context) {
3520 return false;
3521 }
3522 bool result = false;
3523 context->GetTaskExecutor()->PostSyncTask(
3524 [weak = WeakClaim(this), &result]() {
3525 auto delegate = weak.Upgrade();
3526 if (!delegate) {
3527 LOGE("Get delegate failed, it is null.");
3528 return;
3529 }
3530 if (delegate->nweb_) {
3531 result = delegate->nweb_->ZoomOut();
3532 }
3533 },
3534 TaskExecutor::TaskType::PLATFORM);
3535 return result;
3536 }
3537
CreateWindow()3538 sptr<OHOS::Rosen::Window> WebDelegate::CreateWindow()
3539 {
3540 auto context = context_.Upgrade();
3541 if (!context) {
3542 return nullptr;
3543 }
3544 float scale = context->GetViewScale();
3545
3546 constexpr int DEFAULT_HEIGHT = 1600;
3547 int DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR = (int)(scale * context->GetRootHeight());
3548 int DEFAULT_STATUS_BAR_HEIGHT = (DEFAULT_HEIGHT - DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR) / 2;
3549 constexpr int DEFAULT_LEFT = 0;
3550 int DEFAULT_TOP = DEFAULT_STATUS_BAR_HEIGHT;
3551 int DEFAULT_WIDTH = (int)(scale * context->GetRootWidth());
3552 sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
3553 option->SetWindowRect({ DEFAULT_LEFT, DEFAULT_TOP, DEFAULT_WIDTH, DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR });
3554 option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_LAUNCHING);
3555 option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
3556 auto window = Rosen::Window::Create("ohos_web_window", option);
3557 return window;
3558 }
3559 #endif
3560
RegisterWebEvent()3561 void WebDelegate::RegisterWebEvent()
3562 {
3563 // TODO: add support for ng.
3564 auto context = DynamicCast<PipelineContext>(context_.Upgrade());
3565 CHECK_NULL_VOID(context);
3566 auto resRegister = context->GetPlatformResRegister();
3567 if (resRegister == nullptr) {
3568 return;
3569 }
3570 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGESTART), [weak = WeakClaim(this)](const std::string& param) {
3571 auto delegate = weak.Upgrade();
3572 if (delegate) {
3573 delegate->OnPageStarted(param);
3574 }
3575 });
3576 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH), [weak = WeakClaim(this)](const std::string& param) {
3577 auto delegate = weak.Upgrade();
3578 if (delegate) {
3579 delegate->OnPageFinished(param);
3580 }
3581 });
3582 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR), [weak = WeakClaim(this)](const std::string& param) {
3583 auto delegate = weak.Upgrade();
3584 if (delegate) {
3585 delegate->OnPageError(param);
3586 }
3587 });
3588 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH), [weak = WeakClaim(this)](const std::string& param) {
3589 auto delegate = weak.Upgrade();
3590 if (delegate) {
3591 delegate->OnRouterPush(param);
3592 }
3593 });
3594 resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE), [weak = WeakClaim(this)](const std::string& param) {
3595 auto delegate = weak.Upgrade();
3596 if (delegate) {
3597 delegate->OnMessage(param);
3598 }
3599 });
3600 }
3601
3602 // upper ui component which inherited from WebComponent
3603 // could implement some curtain createdCallback to customized controller interface
3604 // eg: web.loadurl.
AddCreatedCallback(const CreatedCallback & createdCallback)3605 void WebDelegate::AddCreatedCallback(const CreatedCallback& createdCallback)
3606 {
3607 ACE_DCHECK(createdCallback != nullptr);
3608 ACE_DCHECK(state_ != State::RELEASED);
3609 createdCallbacks_.emplace_back(createdCallback);
3610 }
3611
RemoveCreatedCallback()3612 void WebDelegate::RemoveCreatedCallback()
3613 {
3614 ACE_DCHECK(state_ != State::RELEASED);
3615 createdCallbacks_.pop_back();
3616 }
3617
AddReleasedCallback(const ReleasedCallback & releasedCallback)3618 void WebDelegate::AddReleasedCallback(const ReleasedCallback& releasedCallback)
3619 {
3620 ACE_DCHECK(releasedCallback != nullptr && state_ != State::RELEASED);
3621 releasedCallbacks_.emplace_back(releasedCallback);
3622 }
3623
RemoveReleasedCallback()3624 void WebDelegate::RemoveReleasedCallback()
3625 {
3626 ACE_DCHECK(state_ != State::RELEASED);
3627 releasedCallbacks_.pop_back();
3628 }
3629
Reload()3630 void WebDelegate::Reload()
3631 {
3632 #ifdef OHOS_STANDARD_SYSTEM
3633 auto context = context_.Upgrade();
3634 if (!context) {
3635 return;
3636 }
3637 context->GetTaskExecutor()->PostTask(
3638 [weak = WeakClaim(this)]() {
3639 auto delegate = weak.Upgrade();
3640 if (!delegate) {
3641 return;
3642 }
3643 if (delegate->nweb_) {
3644 delegate->nweb_->Reload();
3645 }
3646 },
3647 TaskExecutor::TaskType::PLATFORM);
3648 #else
3649 hash_ = MakeResourceHash();
3650 reloadMethod_ = MakeMethodHash("reload");
3651 CallResRegisterMethod(reloadMethod_, WEB_PARAM_NONE, nullptr);
3652 #endif
3653 }
3654
UpdateUrl(const std::string & url)3655 void WebDelegate::UpdateUrl(const std::string& url)
3656 {
3657 hash_ = MakeResourceHash();
3658 updateUrlMethod_ = MakeMethodHash(WEB_METHOD_UPDATEURL);
3659 std::stringstream paramStream;
3660 paramStream << NTC_PARAM_SRC << WEB_PARAM_EQUALS << url;
3661 std::string param = paramStream.str();
3662 CallResRegisterMethod(updateUrlMethod_, param, nullptr);
3663 }
3664
CallWebRouterBack()3665 void WebDelegate::CallWebRouterBack()
3666 {
3667 hash_ = MakeResourceHash();
3668 routerBackMethod_ = MakeMethodHash(WEB_METHOD_ROUTER_BACK);
3669 CallResRegisterMethod(routerBackMethod_, WEB_PARAM_NONE, nullptr);
3670 }
3671
CallPopPageSuccessPageUrl(const std::string & url)3672 void WebDelegate::CallPopPageSuccessPageUrl(const std::string& url)
3673 {
3674 hash_ = MakeResourceHash();
3675 changePageUrlMethod_ = MakeMethodHash(WEB_METHOD_CHANGE_PAGE_URL);
3676 std::stringstream paramStream;
3677 paramStream << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS << url;
3678 std::string param = paramStream.str();
3679 CallResRegisterMethod(changePageUrlMethod_, param, nullptr);
3680 }
3681
CallIsPagePathInvalid(const bool & isPageInvalid)3682 void WebDelegate::CallIsPagePathInvalid(const bool& isPageInvalid)
3683 {
3684 hash_ = MakeResourceHash();
3685 isPagePathInvalidMethod_ = MakeMethodHash(WEB_METHOD_PAGE_PATH_INVALID);
3686 std::stringstream paramStream;
3687 paramStream << NTC_PARAM_PAGE_INVALID << WEB_PARAM_EQUALS << isPageInvalid;
3688 std::string param = paramStream.str();
3689 CallResRegisterMethod(isPagePathInvalidMethod_, param, nullptr);
3690 }
3691
OnPageStarted(const std::string & param)3692 void WebDelegate::OnPageStarted(const std::string& param)
3693 {
3694 auto context = context_.Upgrade();
3695 CHECK_NULL_VOID(context);
3696 context->GetTaskExecutor()->PostTask(
3697 [weak = WeakClaim(this), param]() {
3698 auto delegate = weak.Upgrade();
3699 CHECK_NULL_VOID(delegate);
3700 auto onPageStarted = delegate->onPageStarted_;
3701 if (onPageStarted) {
3702 std::string paramStart = std::string(R"(")").append(param).append(std::string(R"(")"));
3703 std::string urlParam = std::string(R"("pagestart",{"url":)").append(paramStart.append("},null"));
3704 onPageStarted(urlParam);
3705 }
3706
3707 // ace 2.0
3708 auto onPageStartedV2 = delegate->onPageStartedV2_;
3709 if (onPageStartedV2) {
3710 onPageStartedV2(std::make_shared<LoadWebPageStartEvent>(param));
3711 }
3712 },
3713 TaskExecutor::TaskType::JS);
3714 }
3715
OnPageFinished(const std::string & param)3716 void WebDelegate::OnPageFinished(const std::string& param)
3717 {
3718 auto context = context_.Upgrade();
3719 CHECK_NULL_VOID(context);
3720 context->GetTaskExecutor()->PostTask(
3721 [weak = WeakClaim(this), param]() {
3722 auto delegate = weak.Upgrade();
3723 CHECK_NULL_VOID(delegate);
3724 auto onPageFinished = delegate->onPageFinished_;
3725 if (onPageFinished) {
3726 std::string paramFinish = std::string(R"(")").append(param).append(std::string(R"(")"));
3727 std::string urlParam = std::string(R"("pagefinish",{"url":)").append(paramFinish.append("},null"));
3728 onPageFinished(urlParam);
3729 }
3730 // ace 2.0
3731 auto onPageFinishedV2 = delegate->onPageFinishedV2_;
3732 if (onPageFinishedV2) {
3733 onPageFinishedV2(std::make_shared<LoadWebPageFinishEvent>(param));
3734 }
3735 },
3736 TaskExecutor::TaskType::JS);
3737 }
3738
OnProgressChanged(int param)3739 void WebDelegate::OnProgressChanged(int param)
3740 {
3741 auto context = context_.Upgrade();
3742 CHECK_NULL_VOID(context);
3743 context->GetTaskExecutor()->PostTask(
3744 [weak = WeakClaim(this), param]() {
3745 auto delegate = weak.Upgrade();
3746 CHECK_NULL_VOID(delegate);
3747 auto eventParam = std::make_shared<LoadWebProgressChangeEvent>(param);
3748 if (Container::IsCurrentUseNewPipeline()) {
3749 auto webPattern = delegate->webPattern_.Upgrade();
3750 CHECK_NULL_VOID(webPattern);
3751 auto webEventHub = webPattern->GetWebEventHub();
3752 CHECK_NULL_VOID(webEventHub);
3753 webEventHub->FireOnProgressChangeEvent(eventParam);
3754 return;
3755 }
3756 auto webCom = delegate->webComponent_.Upgrade();
3757 CHECK_NULL_VOID(webCom);
3758 webCom->OnProgressChange(eventParam.get());
3759 },
3760 TaskExecutor::TaskType::JS);
3761 }
3762
OnReceivedTitle(const std::string & param)3763 void WebDelegate::OnReceivedTitle(const std::string& param)
3764 {
3765 auto context = context_.Upgrade();
3766 CHECK_NULL_VOID(context);
3767 context->GetTaskExecutor()->PostTask(
3768 [weak = WeakClaim(this), param]() {
3769 auto delegate = weak.Upgrade();
3770 CHECK_NULL_VOID(delegate);
3771 // ace 2.0
3772 auto onTitleReceiveV2 = delegate->onTitleReceiveV2_;
3773 if (onTitleReceiveV2) {
3774 onTitleReceiveV2(std::make_shared<LoadWebTitleReceiveEvent>(param));
3775 }
3776 },
3777 TaskExecutor::TaskType::JS);
3778 }
3779
ExitFullScreen()3780 void WebDelegate::ExitFullScreen()
3781 {
3782 if (Container::IsCurrentUseNewPipeline()) {
3783 auto webPattern = webPattern_.Upgrade();
3784 CHECK_NULL_VOID(webPattern);
3785 webPattern->ExitFullScreen();
3786 }
3787 }
3788
OnFullScreenExit()3789 void WebDelegate::OnFullScreenExit()
3790 {
3791 auto context = context_.Upgrade();
3792 CHECK_NULL_VOID(context);
3793 context->GetTaskExecutor()->PostTask(
3794 [weak = WeakClaim(this)]() {
3795 auto delegate = weak.Upgrade();
3796 CHECK_NULL_VOID(delegate);
3797 auto param = std::make_shared<FullScreenExitEvent>(false);
3798 if (Container::IsCurrentUseNewPipeline()) {
3799 auto webPattern = delegate->webPattern_.Upgrade();
3800 CHECK_NULL_VOID(webPattern);
3801 auto webEventHub = webPattern->GetWebEventHub();
3802 CHECK_NULL_VOID(webEventHub);
3803 auto propOnFullScreenExitEvent = webEventHub->GetOnFullScreenExitEvent();
3804 CHECK_NULL_VOID(propOnFullScreenExitEvent);
3805 propOnFullScreenExitEvent(param);
3806 return;
3807 }
3808 // ace 2.0
3809 auto onFullScreenExitV2 = delegate->onFullScreenExitV2_;
3810 if (onFullScreenExitV2) {
3811 onFullScreenExitV2(param);
3812 }
3813 },
3814 TaskExecutor::TaskType::JS);
3815 }
3816
OnGeolocationPermissionsHidePrompt()3817 void WebDelegate::OnGeolocationPermissionsHidePrompt()
3818 {
3819 auto context = context_.Upgrade();
3820 CHECK_NULL_VOID(context);
3821 context->GetTaskExecutor()->PostTask(
3822 [weak = WeakClaim(this)]() {
3823 auto delegate = weak.Upgrade();
3824 CHECK_NULL_VOID(delegate);
3825 // ace 2.0
3826 auto onGeolocationHideV2 = delegate->onGeolocationHideV2_;
3827 if (onGeolocationHideV2) {
3828 onGeolocationHideV2(std::make_shared<LoadWebGeolocationHideEvent>(""));
3829 }
3830 },
3831 TaskExecutor::TaskType::JS);
3832 }
3833
OnGeolocationPermissionsShowPrompt(const std::string & origin,const std::shared_ptr<OHOS::NWeb::NWebGeolocationCallbackInterface> & callback)3834 void WebDelegate::OnGeolocationPermissionsShowPrompt(
3835 const std::string& origin, const std::shared_ptr<OHOS::NWeb::NWebGeolocationCallbackInterface>& callback)
3836 {
3837 auto context = context_.Upgrade();
3838 CHECK_NULL_VOID(context);
3839 context->GetTaskExecutor()->PostTask(
3840 [weak = WeakClaim(this), origin, callback]() {
3841 auto delegate = weak.Upgrade();
3842 CHECK_NULL_VOID(delegate);
3843 // ace 2.0
3844 auto onGeolocationShowV2 = delegate->onGeolocationShowV2_;
3845 if (onGeolocationShowV2) {
3846 auto geolocation = AceType::MakeRefPtr<WebGeolocationOhos>(callback);
3847 onGeolocationShowV2(std::make_shared<LoadWebGeolocationShowEvent>(origin, geolocation));
3848 }
3849 },
3850 TaskExecutor::TaskType::JS);
3851 }
3852
OnPermissionRequestPrompt(const std::shared_ptr<OHOS::NWeb::NWebAccessRequest> & request)3853 void WebDelegate::OnPermissionRequestPrompt(const std::shared_ptr<OHOS::NWeb::NWebAccessRequest>& request)
3854 {
3855 auto context = context_.Upgrade();
3856 CHECK_NULL_VOID(context);
3857 context->GetTaskExecutor()->PostTask(
3858 [weak = WeakClaim(this), request]() {
3859 auto delegate = weak.Upgrade();
3860 CHECK_NULL_VOID(delegate);
3861 // ace 2.0
3862 auto onPermissionRequestV2 = delegate->onPermissionRequestV2_;
3863 if (onPermissionRequestV2) {
3864 onPermissionRequestV2(
3865 std::make_shared<WebPermissionRequestEvent>(
3866 AceType::MakeRefPtr<WebPermissionRequestOhos>(request)));
3867 }
3868 },
3869 TaskExecutor::TaskType::JS);
3870 }
3871
OnScreenCaptureRequest(const std::shared_ptr<OHOS::NWeb::NWebScreenCaptureAccessRequest> & request)3872 void WebDelegate::OnScreenCaptureRequest(const std::shared_ptr<OHOS::NWeb::NWebScreenCaptureAccessRequest>& request)
3873 {
3874 auto context = context_.Upgrade();
3875 CHECK_NULL_VOID(context);
3876 context->GetTaskExecutor()->PostTask(
3877 [weak = WeakClaim(this), request]() {
3878 auto delegate = weak.Upgrade();
3879 CHECK_NULL_VOID(delegate);
3880 // ace 2.0
3881 auto onScreenCaptureRequestV2 = delegate->onScreenCaptureRequestV2_;
3882 if (onScreenCaptureRequestV2) {
3883 onScreenCaptureRequestV2(
3884 std::make_shared<WebScreenCaptureRequestEvent>(
3885 AceType::MakeRefPtr<WebScreenCaptureRequestOhos>(request)));
3886 }
3887 },
3888 TaskExecutor::TaskType::JS);
3889 }
3890
OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)3891 bool WebDelegate::OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)
3892 {
3893 auto context = context_.Upgrade();
3894 CHECK_NULL_RETURN(context, false);
3895 bool result = false;
3896 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
3897 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), message, &result]() {
3898 auto delegate = weak.Upgrade();
3899 CHECK_NULL_VOID(delegate);
3900 auto param = std::make_shared<LoadWebConsoleLogEvent>(AceType::MakeRefPtr<ConsoleLogOhos>(message));
3901 if (Container::IsCurrentUseNewPipeline()) {
3902 auto webPattern = delegate->webPattern_.Upgrade();
3903 CHECK_NULL_VOID(webPattern);
3904 auto webEventHub = webPattern->GetWebEventHub();
3905 CHECK_NULL_VOID(webEventHub);
3906 auto propOnConsoleEvent = webEventHub->GetOnConsoleEvent();
3907 CHECK_NULL_VOID(propOnConsoleEvent);
3908 result = propOnConsoleEvent(param);
3909 }
3910 auto webCom = delegate->webComponent_.Upgrade();
3911 CHECK_NULL_VOID(webCom);
3912 result = webCom->OnConsole(param.get());
3913 return;
3914 });
3915 return result;
3916 }
3917
3918
OnCommonDialog(const std::shared_ptr<BaseEventInfo> & info,DialogEventType dialogEventType)3919 bool WebDelegate::OnCommonDialog(const std::shared_ptr<BaseEventInfo>& info, DialogEventType dialogEventType)
3920 {
3921 auto context = context_.Upgrade();
3922 CHECK_NULL_RETURN(context, false);
3923 bool result = false;
3924 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
3925 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, dialogEventType, &result]() {
3926 auto delegate = weak.Upgrade();
3927 CHECK_NULL_VOID(delegate);
3928 if (Container::IsCurrentUseNewPipeline()) {
3929 auto webPattern = delegate->webPattern_.Upgrade();
3930 CHECK_NULL_VOID(webPattern);
3931 auto webEventHub = webPattern->GetWebEventHub();
3932 CHECK_NULL_VOID(webEventHub);
3933 result = webEventHub->FireOnCommonDialogEvent(info, dialogEventType);
3934 return;
3935 }
3936 auto webCom = delegate->webComponent_.Upgrade();
3937 CHECK_NULL_VOID(webCom);
3938 result = webCom->OnCommonDialog(info.get(), dialogEventType);
3939 return;
3940 });
3941 return result;
3942 }
3943
OnFullScreenEnter(std::shared_ptr<OHOS::NWeb::NWebFullScreenExitHandler> handler)3944 void WebDelegate::OnFullScreenEnter(std::shared_ptr<OHOS::NWeb::NWebFullScreenExitHandler> handler)
3945 {
3946 auto context = context_.Upgrade();
3947 CHECK_NULL_VOID(context);
3948 context->GetTaskExecutor()->PostTask(
3949 [weak = WeakClaim(this), handler]() {
3950 auto delegate = weak.Upgrade();
3951 CHECK_NULL_VOID(delegate);
3952 auto param = std::make_shared<FullScreenEnterEvent>(
3953 AceType::MakeRefPtr<FullScreenExitHandlerOhos>(handler, weak));
3954 if (Container::IsCurrentUseNewPipeline()) {
3955 auto webPattern = delegate->webPattern_.Upgrade();
3956 CHECK_NULL_VOID(webPattern);
3957 webPattern->RequestFullScreen();
3958 webPattern->SetFullScreenExitHandler(param);
3959 auto webEventHub = webPattern->GetWebEventHub();
3960 CHECK_NULL_VOID(webEventHub);
3961 auto propOnFullScreenEnterEvent = webEventHub->GetOnFullScreenEnterEvent();
3962 CHECK_NULL_VOID(propOnFullScreenEnterEvent);
3963 propOnFullScreenEnterEvent(param);
3964 return;
3965 }
3966 auto webCom = delegate->webComponent_.Upgrade();
3967 CHECK_NULL_VOID(webCom);
3968 webCom->OnFullScreenEnter(param.get());
3969 },
3970 TaskExecutor::TaskType::JS);
3971 }
3972
OnHttpAuthRequest(const std::shared_ptr<BaseEventInfo> & info)3973 bool WebDelegate::OnHttpAuthRequest(const std::shared_ptr<BaseEventInfo>& info)
3974 {
3975 auto context = context_.Upgrade();
3976 CHECK_NULL_RETURN(context, false);
3977 bool result = false;
3978 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
3979 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
3980 auto delegate = weak.Upgrade();
3981 CHECK_NULL_VOID(delegate);
3982 if (Container::IsCurrentUseNewPipeline()) {
3983 auto webPattern = delegate->webPattern_.Upgrade();
3984 CHECK_NULL_VOID(webPattern);
3985 auto webEventHub = webPattern->GetWebEventHub();
3986 CHECK_NULL_VOID(webEventHub);
3987 auto propOnHttpAuthRequestEvent = webEventHub->GetOnHttpAuthRequestEvent();
3988 CHECK_NULL_VOID(propOnHttpAuthRequestEvent);
3989 result = propOnHttpAuthRequestEvent(info);
3990 return;
3991 }
3992 auto webCom = delegate->webComponent_.Upgrade();
3993 CHECK_NULL_VOID(webCom);
3994 result = webCom->OnHttpAuthRequest(info.get());
3995 });
3996 return result;
3997 }
3998
OnSslErrorRequest(const std::shared_ptr<BaseEventInfo> & info)3999 bool WebDelegate::OnSslErrorRequest(const std::shared_ptr<BaseEventInfo>& info)
4000 {
4001 auto context = context_.Upgrade();
4002 CHECK_NULL_RETURN(context, false);
4003 bool result = false;
4004 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4005 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4006 auto delegate = weak.Upgrade();
4007 CHECK_NULL_VOID(delegate);
4008 if (Container::IsCurrentUseNewPipeline()) {
4009 auto webPattern = delegate->webPattern_.Upgrade();
4010 CHECK_NULL_VOID(webPattern);
4011 auto webEventHub = webPattern->GetWebEventHub();
4012 CHECK_NULL_VOID(webEventHub);
4013 auto propOnSslErrorEvent = webEventHub->GetOnSslErrorRequestEvent();
4014 CHECK_NULL_VOID(propOnSslErrorEvent);
4015 result = propOnSslErrorEvent(info);
4016 return;
4017 }
4018 auto webCom = delegate->webComponent_.Upgrade();
4019 CHECK_NULL_VOID(webCom);
4020 result = webCom->OnSslErrorRequest(info.get());
4021 });
4022 return result;
4023 }
4024
OnSslSelectCertRequest(const std::shared_ptr<BaseEventInfo> & info)4025 bool WebDelegate::OnSslSelectCertRequest(const std::shared_ptr<BaseEventInfo>& info)
4026 {
4027 auto context = context_.Upgrade();
4028 CHECK_NULL_RETURN(context, false);
4029 bool result = false;
4030 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4031 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4032 auto delegate = weak.Upgrade();
4033 CHECK_NULL_VOID(delegate);
4034 if (Container::IsCurrentUseNewPipeline()) {
4035 auto webPattern = delegate->webPattern_.Upgrade();
4036 CHECK_NULL_VOID(webPattern);
4037 auto webEventHub = webPattern->GetWebEventHub();
4038 CHECK_NULL_VOID(webEventHub);
4039 auto propOnSslSelectCertRequestEvent = webEventHub->GetOnSslSelectCertRequestEvent();
4040 CHECK_NULL_VOID(propOnSslSelectCertRequestEvent);
4041 result = propOnSslSelectCertRequestEvent(info);
4042 return;
4043 }
4044 auto webCom = delegate->webComponent_.Upgrade();
4045 CHECK_NULL_VOID(webCom);
4046 result = webCom->OnSslSelectCertRequest(info.get());
4047 });
4048 return result;
4049 }
4050
OnDownloadStart(const std::string & url,const std::string & userAgent,const std::string & contentDisposition,const std::string & mimetype,long contentLength)4051 void WebDelegate::OnDownloadStart(const std::string& url, const std::string& userAgent,
4052 const std::string& contentDisposition, const std::string& mimetype, long contentLength)
4053 {
4054 auto context = context_.Upgrade();
4055 CHECK_NULL_VOID(context);
4056 context->GetTaskExecutor()->PostTask(
4057 [weak = WeakClaim(this), url, userAgent, contentDisposition,
4058 mimetype, contentLength]() {
4059 auto delegate = weak.Upgrade();
4060 CHECK_NULL_VOID(delegate);
4061 auto onDownloadStartV2 = delegate->onDownloadStartV2_;
4062 if (onDownloadStartV2) {
4063 onDownloadStartV2(
4064 std::make_shared<DownloadStartEvent>(url, userAgent, contentDisposition, mimetype, contentLength));
4065 }
4066 },
4067 TaskExecutor::TaskType::JS);
4068 }
4069
OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)4070 void WebDelegate::OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
4071 std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)
4072 {
4073 auto context = context_.Upgrade();
4074 CHECK_NULL_VOID(context);
4075 context->GetTaskExecutor()->PostTask(
4076 [weak = WeakClaim(this), request, error]() {
4077 auto delegate = weak.Upgrade();
4078 CHECK_NULL_VOID(delegate);
4079 auto onPageError = delegate->onPageError_;
4080 if (onPageError) {
4081 std::string url = request->Url();
4082 int errorCode = error->ErrorCode();
4083 std::string description = error->ErrorInfo();
4084 std::string paramUrl = std::string(R"(")").append(url).append(std::string(R"(")")).append(",");
4085 std::string paramErrorCode = std::string(R"(")")
4086 .append(NTC_PARAM_ERROR_CODE)
4087 .append(std::string(R"(")"))
4088 .append(":")
4089 .append(std::to_string(errorCode))
4090 .append(",");
4091
4092 std::string paramDesc = std::string(R"(")")
4093 .append(NTC_PARAM_DESCRIPTION)
4094 .append(std::string(R"(")"))
4095 .append(":")
4096 .append(std::string(R"(")")
4097 .append(description)
4098 .append(std::string(R"(")")));
4099 std::string errorParam =
4100 std::string(R"("error",{"url":)").append((paramUrl + paramErrorCode + paramDesc).append("},null"));
4101 onPageError(errorParam);
4102 }
4103 auto onErrorReceiveV2 = delegate->onErrorReceiveV2_;
4104 if (onErrorReceiveV2) {
4105 onErrorReceiveV2(std::make_shared<ReceivedErrorEvent>(
4106 AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
4107 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
4108 AceType::MakeRefPtr<WebError>(error->ErrorInfo(), error->ErrorCode())));
4109 }
4110 },
4111 TaskExecutor::TaskType::JS);
4112 }
4113
OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)4114 void WebDelegate::OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
4115 std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)
4116 {
4117 auto context = context_.Upgrade();
4118 CHECK_NULL_VOID(context);
4119 context->GetTaskExecutor()->PostTask(
4120 [weak = WeakClaim(this), request, response]() {
4121 auto delegate = weak.Upgrade();
4122 CHECK_NULL_VOID(delegate);
4123 auto onHttpErrorReceiveV2 = delegate->onHttpErrorReceiveV2_;
4124 if (onHttpErrorReceiveV2) {
4125 onHttpErrorReceiveV2(std::make_shared<ReceivedHttpErrorEvent>(
4126 AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
4127 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
4128 AceType::MakeRefPtr<WebResponse>(response->ResponseHeaders(), response->ResponseData(),
4129 response->ResponseEncoding(), response->ResponseMimeType(), response->ResponseStatus(),
4130 response->ResponseStatusCode())));
4131 }
4132 },
4133 TaskExecutor::TaskType::JS);
4134 }
4135
IsEmptyOnInterceptRequest()4136 bool WebDelegate::IsEmptyOnInterceptRequest()
4137 {
4138 if (Container::IsCurrentUseNewPipeline()) {
4139 auto webPattern = webPattern_.Upgrade();
4140 CHECK_NULL_RETURN(webPattern, false);
4141 auto webEventHub = webPattern->GetWebEventHub();
4142 CHECK_NULL_RETURN(webEventHub, false);
4143 return webEventHub->GetOnInterceptRequestEvent() == nullptr;
4144 }
4145 auto webCom = webComponent_.Upgrade();
4146 CHECK_NULL_RETURN(webCom, true);
4147 return webCom->IsEmptyOnInterceptRequest();
4148 }
4149
OnInterceptRequest(const std::shared_ptr<BaseEventInfo> & info)4150 RefPtr<WebResponse> WebDelegate::OnInterceptRequest(const std::shared_ptr<BaseEventInfo>& info)
4151 {
4152 auto context = context_.Upgrade();
4153 CHECK_NULL_RETURN(context, nullptr);
4154 RefPtr<WebResponse> result = nullptr;
4155 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4156 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4157 auto delegate = weak.Upgrade();
4158 CHECK_NULL_VOID(delegate);
4159 if (Container::IsCurrentUseNewPipeline()) {
4160 auto webPattern = delegate->webPattern_.Upgrade();
4161 CHECK_NULL_VOID(webPattern);
4162 auto webEventHub = webPattern->GetWebEventHub();
4163 CHECK_NULL_VOID(webEventHub);
4164 auto propOnInterceptRequestEvent = webEventHub->GetOnInterceptRequestEvent();
4165 CHECK_NULL_VOID(propOnInterceptRequestEvent);
4166 result = propOnInterceptRequestEvent(info);
4167 }
4168 auto webCom = delegate->webComponent_.Upgrade();
4169 CHECK_NULL_VOID(webCom);
4170 result = webCom->OnInterceptRequest(info.get());
4171 });
4172 return result;
4173 }
4174
OnRequestFocus()4175 void WebDelegate::OnRequestFocus()
4176 {
4177 if (onRequestFocusV2_) {
4178 onRequestFocusV2_(std::make_shared<LoadWebRequestFocusEvent>(""));
4179 }
4180 }
4181
OnRenderExited(OHOS::NWeb::RenderExitReason reason)4182 void WebDelegate::OnRenderExited(OHOS::NWeb::RenderExitReason reason)
4183 {
4184 auto context = context_.Upgrade();
4185 CHECK_NULL_VOID(context);
4186 context->GetTaskExecutor()->PostTask(
4187 [weak = WeakClaim(this), reason]() {
4188 auto delegate = weak.Upgrade();
4189 CHECK_NULL_VOID(delegate);
4190 auto onRenderExitedV2 = delegate->onRenderExitedV2_;
4191 if (onRenderExitedV2) {
4192 onRenderExitedV2(std::make_shared<RenderExitedEvent>(static_cast<int32_t>(reason)));
4193 }
4194 },
4195 TaskExecutor::TaskType::JS);
4196 }
4197
OnRefreshAccessedHistory(const std::string & url,bool isRefreshed)4198 void WebDelegate::OnRefreshAccessedHistory(const std::string& url, bool isRefreshed)
4199 {
4200 auto context = context_.Upgrade();
4201 CHECK_NULL_VOID(context);
4202 context->GetTaskExecutor()->PostTask(
4203 [weak = WeakClaim(this), url, isRefreshed]() {
4204 auto delegate = weak.Upgrade();
4205 CHECK_NULL_VOID(delegate);
4206 auto onRefreshAccessedHistoryV2 = delegate->onRefreshAccessedHistoryV2_;
4207 if (onRefreshAccessedHistoryV2) {
4208 onRefreshAccessedHistoryV2(std::make_shared<RefreshAccessedHistoryEvent>(url, isRefreshed));
4209 }
4210 },
4211 TaskExecutor::TaskType::JS);
4212 }
4213
OnPageError(const std::string & param)4214 void WebDelegate::OnPageError(const std::string& param)
4215 {
4216 if (onPageError_) {
4217 int32_t errorCode = GetIntParam(param, NTC_PARAM_ERROR_CODE);
4218 std::string url = GetUrlStringParam(param, NTC_PARAM_URL);
4219 std::string description = GetStringParam(param, NTC_PARAM_DESCRIPTION);
4220
4221 std::string paramUrl = std::string(R"(")").append(url).append(std::string(R"(")")).append(",");
4222
4223 std::string paramErrorCode = std::string(R"(")")
4224 .append(NTC_PARAM_ERROR_CODE)
4225 .append(std::string(R"(")"))
4226 .append(":")
4227 .append(std::to_string(errorCode))
4228 .append(",");
4229
4230 std::string paramDesc = std::string(R"(")")
4231 .append(NTC_PARAM_DESCRIPTION)
4232 .append(std::string(R"(")"))
4233 .append(":")
4234 .append(std::string(R"(")").append(description).append(std::string(R"(")")));
4235 std::string errorParam =
4236 std::string(R"("error",{"url":)").append((paramUrl + paramErrorCode + paramDesc).append("},null"));
4237 onPageError_(errorParam);
4238 }
4239 }
4240
OnMessage(const std::string & param)4241 void WebDelegate::OnMessage(const std::string& param)
4242 {
4243 std::string removeQuotes;
4244 removeQuotes = param;
4245 removeQuotes.erase(std::remove(removeQuotes.begin(), removeQuotes.end(), '\"'), removeQuotes.end());
4246 if (onMessage_) {
4247 std::string paramMessage = std::string(R"(")").append(removeQuotes).append(std::string(R"(")"));
4248 std::string messageParam = std::string(R"("message",{"message":)").append(paramMessage.append("},null"));
4249 onMessage_(messageParam);
4250 }
4251 }
4252
OnRouterPush(const std::string & param)4253 void WebDelegate::OnRouterPush(const std::string& param)
4254 {
4255 OHOS::Ace::Framework::DelegateClient::GetInstance().RouterPush(param);
4256 }
4257
OnFileSelectorShow(const std::shared_ptr<BaseEventInfo> & info)4258 bool WebDelegate::OnFileSelectorShow(const std::shared_ptr<BaseEventInfo>& info)
4259 {
4260 auto context = context_.Upgrade();
4261 CHECK_NULL_RETURN(context, false);
4262 bool result = false;
4263 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4264 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4265 auto delegate = weak.Upgrade();
4266 CHECK_NULL_VOID(delegate);
4267 if (Container::IsCurrentUseNewPipeline()) {
4268 auto webPattern = delegate->webPattern_.Upgrade();
4269 CHECK_NULL_VOID(webPattern);
4270 auto webEventHub = webPattern->GetWebEventHub();
4271 CHECK_NULL_VOID(webEventHub);
4272 auto propOnFileSelectorShowEvent = webEventHub->GetOnFileSelectorShowEvent();
4273 CHECK_NULL_VOID(propOnFileSelectorShowEvent);
4274 result = propOnFileSelectorShowEvent(info);
4275 }
4276 auto webCom = delegate->webComponent_.Upgrade();
4277 CHECK_NULL_VOID(webCom);
4278 result = webCom->OnFileSelectorShow(info.get());
4279 });
4280 return result;
4281 }
4282
OnContextMenuShow(const std::shared_ptr<BaseEventInfo> & info)4283 bool WebDelegate::OnContextMenuShow(const std::shared_ptr<BaseEventInfo>& info)
4284 {
4285 auto context = context_.Upgrade();
4286 CHECK_NULL_RETURN(context, false);
4287 bool result = false;
4288 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4289 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4290 auto delegate = weak.Upgrade();
4291 CHECK_NULL_VOID(delegate);
4292 if (Container::IsCurrentUseNewPipeline()) {
4293 auto webPattern = delegate->webPattern_.Upgrade();
4294 CHECK_NULL_VOID(webPattern);
4295 auto webEventHub = webPattern->GetWebEventHub();
4296 CHECK_NULL_VOID(webEventHub);
4297 auto propOnContextMenuShowEvent = webEventHub->GetOnContextMenuShowEvent();
4298 CHECK_NULL_VOID(propOnContextMenuShowEvent);
4299 result = propOnContextMenuShowEvent(info);
4300 return;
4301 }
4302 auto webCom = delegate->webComponent_.Upgrade();
4303 CHECK_NULL_VOID(webCom);
4304 result = webCom->OnContextMenuShow(info.get());
4305 });
4306 return result;
4307 }
4308
OnContextMenuHide(const std::string & info)4309 void WebDelegate::OnContextMenuHide(const std::string& info)
4310 {
4311 auto context = context_.Upgrade();
4312 CHECK_NULL_VOID(context);
4313 bool result = false;
4314 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4315 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), info, &result]() {
4316 auto delegate = weak.Upgrade();
4317 CHECK_NULL_VOID(delegate);
4318 if (Container::IsCurrentUseNewPipeline()) {
4319 auto webPattern = delegate->webPattern_.Upgrade();
4320 CHECK_NULL_VOID(webPattern);
4321 auto webEventHub = webPattern->GetWebEventHub();
4322 CHECK_NULL_VOID(webEventHub);
4323 auto propOnContextMenuHideEvent = webEventHub->GetOnContextMenuHideEvent();
4324 CHECK_NULL_VOID(propOnContextMenuHideEvent);
4325 propOnContextMenuHideEvent(std::make_shared<ContextMenuHideEvent>(info));
4326 return;
4327 } else {
4328 LOGE("current is not new pipeline");
4329 }
4330 });
4331 return;
4332 }
4333
OnHandleInterceptUrlLoading(const std::string & data)4334 bool WebDelegate::OnHandleInterceptUrlLoading(const std::string& data)
4335 {
4336 auto context = context_.Upgrade();
4337 CHECK_NULL_RETURN(context, false);
4338 bool result = false;
4339 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4340 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), data, &result]() {
4341 auto delegate = weak.Upgrade();
4342 CHECK_NULL_VOID(delegate);
4343 auto param = std::make_shared<UrlLoadInterceptEvent>(data);
4344 if (Container::IsCurrentUseNewPipeline()) {
4345 auto webPattern = delegate->webPattern_.Upgrade();
4346 CHECK_NULL_VOID(webPattern);
4347 auto webEventHub = webPattern->GetWebEventHub();
4348 CHECK_NULL_VOID(webEventHub);
4349 auto propOnUrlLoadInterceptEvent = webEventHub->GetOnUrlLoadInterceptEvent();
4350 CHECK_NULL_VOID(propOnUrlLoadInterceptEvent);
4351 result = propOnUrlLoadInterceptEvent(param);
4352 }
4353 auto webCom = delegate->webComponent_.Upgrade();
4354 CHECK_NULL_VOID(webCom);
4355 result = webCom->OnUrlLoadIntercept(param.get());
4356 });
4357 return result;
4358 }
4359
OnHandleInterceptLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)4360 bool WebDelegate::OnHandleInterceptLoading(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request)
4361 {
4362 auto context = context_.Upgrade();
4363 CHECK_NULL_RETURN(context, false);
4364 bool result = false;
4365 auto jsTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::JS);
4366 jsTaskExecutor.PostSyncTask([weak = WeakClaim(this), request, &result]() {
4367 auto delegate = weak.Upgrade();
4368 CHECK_NULL_VOID(delegate);
4369 auto webRequest = AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(),
4370 request->Method(), request->Url(), request->FromGesture(),
4371 request->IsAboutMainFrame(), request->IsRequestRedirect());
4372 auto param = std::make_shared<LoadInterceptEvent>(webRequest);
4373 if (Container::IsCurrentUseNewPipeline()) {
4374 auto webPattern = delegate->webPattern_.Upgrade();
4375 CHECK_NULL_VOID(webPattern);
4376 auto webEventHub = webPattern->GetWebEventHub();
4377 CHECK_NULL_VOID(webEventHub);
4378 auto propOnLoadInterceptEvent = webEventHub->GetOnLoadInterceptEvent();
4379 CHECK_NULL_VOID(propOnLoadInterceptEvent);
4380 result = propOnLoadInterceptEvent(param);
4381 }
4382 auto webCom = delegate->webComponent_.Upgrade();
4383 CHECK_NULL_VOID(webCom);
4384 result = webCom->OnLoadIntercept(param.get());
4385 });
4386 return result;
4387 }
4388
OnResourceLoad(const std::string & url)4389 void WebDelegate::OnResourceLoad(const std::string& url)
4390 {
4391 auto context = context_.Upgrade();
4392 CHECK_NULL_VOID(context);
4393 context->GetTaskExecutor()->PostTask(
4394 [weak = WeakClaim(this), url]() {
4395 auto delegate = weak.Upgrade();
4396 CHECK_NULL_VOID(delegate);
4397 auto onResourceLoadV2 = delegate->onResourceLoadV2_;
4398 if (onResourceLoadV2) {
4399 onResourceLoadV2(std::make_shared<ResourceLoadEvent>(url));
4400 }
4401 },
4402 TaskExecutor::TaskType::JS);
4403 }
4404
OnScaleChange(float oldScaleFactor,float newScaleFactor)4405 void WebDelegate::OnScaleChange(float oldScaleFactor, float newScaleFactor)
4406 {
4407 auto context = context_.Upgrade();
4408 CHECK_NULL_VOID(context);
4409 context->GetTaskExecutor()->PostTask(
4410 [weak = WeakClaim(this), oldScaleFactor, newScaleFactor]() {
4411 auto delegate = weak.Upgrade();
4412 CHECK_NULL_VOID(delegate);
4413 auto onScaleChangeV2 = delegate->onScaleChangeV2_;
4414 if (onScaleChangeV2) {
4415 onScaleChangeV2(std::make_shared<ScaleChangeEvent>(oldScaleFactor, newScaleFactor));
4416 }
4417 },
4418 TaskExecutor::TaskType::JS);
4419 }
4420
OnScroll(double xOffset,double yOffset)4421 void WebDelegate::OnScroll(double xOffset, double yOffset)
4422 {
4423 auto context = context_.Upgrade();
4424 CHECK_NULL_VOID(context);
4425 context->GetTaskExecutor()->PostTask(
4426 [weak = WeakClaim(this), xOffset, yOffset]() {
4427 auto delegate = weak.Upgrade();
4428 CHECK_NULL_VOID(delegate);
4429 auto onScrollV2 = delegate->onScrollV2_;
4430 if (onScrollV2) {
4431 onScrollV2(std::make_shared<WebOnScrollEvent>(xOffset, yOffset));
4432 }
4433 },
4434 TaskExecutor::TaskType::JS);
4435 }
4436
OnSearchResultReceive(int activeMatchOrdinal,int numberOfMatches,bool isDoneCounting)4437 void WebDelegate::OnSearchResultReceive(int activeMatchOrdinal, int numberOfMatches, bool isDoneCounting)
4438 {
4439 auto context = context_.Upgrade();
4440 CHECK_NULL_VOID(context);
4441 context->GetTaskExecutor()->PostTask(
4442 [weak = WeakClaim(this), activeMatchOrdinal,
4443 numberOfMatches, isDoneCounting]() {
4444 auto delegate = weak.Upgrade();
4445 CHECK_NULL_VOID(delegate);
4446 auto onSearchResultReceiveV2 = delegate->onSearchResultReceiveV2_;
4447 if (onSearchResultReceiveV2) {
4448 onSearchResultReceiveV2(
4449 std::make_shared<SearchResultReceiveEvent>(activeMatchOrdinal, numberOfMatches, isDoneCounting));
4450 }
4451 },
4452 TaskExecutor::TaskType::JS);
4453 }
4454
OnDragAndDropData(const void * data,size_t len,int width,int height)4455 bool WebDelegate::OnDragAndDropData(const void* data, size_t len, int width, int height)
4456 {
4457 LOGI("store pixel map, len = %{public}zu, width = %{public}d, height = %{public}d", len, width, height);
4458 pixelMap_ = PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
4459 if (pixelMap_ == nullptr) {
4460 LOGE("convert drag image to pixel map failed");
4461 return false;
4462 }
4463 isRefreshPixelMap_ = true;
4464
4465 auto webPattern = webPattern_.Upgrade();
4466 if (!webPattern) {
4467 LOGE("web pattern is nullptr");
4468 return false;
4469 }
4470 return webPattern->NotifyStartDragTask();
4471 }
4472
OnDragAndDropDataUdmf(std::shared_ptr<OHOS::NWeb::NWebDragData> dragData)4473 bool WebDelegate::OnDragAndDropDataUdmf(std::shared_ptr<OHOS::NWeb::NWebDragData> dragData)
4474 {
4475 LOGI("DragDrop event OnDragAndDropDataUdmf");
4476
4477 const void *data = nullptr;
4478 size_t len = 0;
4479 int width = 0;
4480 int height = 0;
4481 dragData->GetPixelMapSetting(&data, len, width, height);
4482 pixelMap_ = PixelMap::ConvertSkImageToPixmap(static_cast<const uint32_t*>(data), len, width, height);
4483 if (pixelMap_ == nullptr) {
4484 LOGE("convert drag image to pixel map failed");
4485 return false;
4486 }
4487 isRefreshPixelMap_ = true;
4488
4489 dragData_ = dragData;
4490 auto webPattern = webPattern_.Upgrade();
4491 if (!webPattern) {
4492 LOGE("web pattern is nullptr");
4493 return false;
4494 }
4495 return webPattern->NotifyStartDragTask();
4496 }
4497
IsImageDrag()4498 bool WebDelegate::IsImageDrag()
4499 {
4500 if (dragData_) {
4501 return dragData_->IsSingleImageContent();
4502 }
4503 return false;
4504 }
4505
GetOrCreateDragData()4506 std::shared_ptr<OHOS::NWeb::NWebDragData> WebDelegate::GetOrCreateDragData()
4507 {
4508 if (dragData_) {
4509 return dragData_;
4510 }
4511
4512 if (nweb_) {
4513 dragData_ = nweb_->GetOrCreateDragData();
4514 return dragData_;
4515 }
4516 return nullptr;
4517 }
4518
OnWindowNew(const std::string & targetUrl,bool isAlert,bool isUserTrigger,const std::shared_ptr<OHOS::NWeb::NWebControllerHandler> & handler)4519 void WebDelegate::OnWindowNew(const std::string& targetUrl, bool isAlert, bool isUserTrigger,
4520 const std::shared_ptr<OHOS::NWeb::NWebControllerHandler>& handler)
4521 {
4522 auto context = context_.Upgrade();
4523 CHECK_NULL_VOID(context);
4524 context->GetTaskExecutor()->PostSyncTask(
4525 [weak = WeakClaim(this), targetUrl, isAlert, isUserTrigger, handler]() {
4526 auto delegate = weak.Upgrade();
4527 CHECK_NULL_VOID(delegate);
4528 int32_t parentNWebId = (delegate->nweb_ ? delegate->nweb_->GetWebId() : -1);
4529 auto param = std::make_shared<WebWindowNewEvent>(targetUrl, isAlert, isUserTrigger,
4530 AceType::MakeRefPtr<WebWindowNewHandlerOhos>(handler, parentNWebId));
4531 if (Container::IsCurrentUseNewPipeline()) {
4532 auto webPattern = delegate->webPattern_.Upgrade();
4533 CHECK_NULL_VOID(webPattern);
4534 auto webEventHub = webPattern->GetWebEventHub();
4535 CHECK_NULL_VOID(webEventHub);
4536 auto propOnWindowNewEvent = webEventHub->GetOnWindowNewEvent();
4537 CHECK_NULL_VOID(propOnWindowNewEvent);
4538 propOnWindowNewEvent(param);
4539 return;
4540 }
4541 auto webCom = delegate->webComponent_.Upgrade();
4542 CHECK_NULL_VOID(webCom);
4543 webCom->OnWindowNewEvent(param);
4544 },
4545 TaskExecutor::TaskType::JS);
4546 }
4547
OnWindowExit()4548 void WebDelegate::OnWindowExit()
4549 {
4550 auto context = context_.Upgrade();
4551 CHECK_NULL_VOID(context);
4552 context->GetTaskExecutor()->PostTask(
4553 [weak = WeakClaim(this)]() {
4554 auto delegate = weak.Upgrade();
4555 CHECK_NULL_VOID(delegate);
4556 auto onWindowExitV2 = delegate->onWindowExitV2_;
4557 if (onWindowExitV2) {
4558 onWindowExitV2(std::make_shared<WebWindowExitEvent>());
4559 }
4560 },
4561 TaskExecutor::TaskType::JS);
4562 }
4563
OnPageVisible(const std::string & url)4564 void WebDelegate::OnPageVisible(const std::string& url)
4565 {
4566 if (onPageVisibleV2_) {
4567 onPageVisibleV2_(std::make_shared<PageVisibleEvent>(url));
4568 }
4569 }
4570
OnFirstContentfulPaint(int64_t navigationStartTick,int64_t firstContentfulPaintMs)4571 void WebDelegate::OnFirstContentfulPaint(int64_t navigationStartTick, int64_t firstContentfulPaintMs)
4572 {
4573 if (onFirstContentfulPaintV2_) {
4574 onFirstContentfulPaintV2_(std::make_shared<FirstContentfulPaintEvent>(navigationStartTick,
4575 firstContentfulPaintMs));
4576 }
4577 }
4578
OnDataResubmitted(std::shared_ptr<OHOS::NWeb::NWebDataResubmissionCallback> handler)4579 void WebDelegate::OnDataResubmitted(std::shared_ptr<OHOS::NWeb::NWebDataResubmissionCallback> handler)
4580 {
4581 auto param = std::make_shared<DataResubmittedEvent>(AceType::MakeRefPtr<DataResubmittedOhos>(handler));
4582 if (Container::IsCurrentUseNewPipeline()) {
4583 auto webPattern = webPattern_.Upgrade();
4584 CHECK_NULL_VOID(webPattern);
4585 auto webEventHub = webPattern->GetWebEventHub();
4586 CHECK_NULL_VOID(webEventHub);
4587 auto propOnDataResubmittedEvent = webEventHub->GetOnDataResubmittedEvent();
4588 CHECK_NULL_VOID(propOnDataResubmittedEvent);
4589 propOnDataResubmittedEvent(param);
4590 return;
4591 }
4592 }
4593
OnFaviconReceived(const void * data,size_t width,size_t height,OHOS::NWeb::ImageColorType colorType,OHOS::NWeb::ImageAlphaType alphaType)4594 void WebDelegate::OnFaviconReceived(
4595 const void* data,
4596 size_t width,
4597 size_t height,
4598 OHOS::NWeb::ImageColorType colorType,
4599 OHOS::NWeb::ImageAlphaType alphaType)
4600 {
4601 auto param = std::make_shared<FaviconReceivedEvent>(AceType::MakeRefPtr<FaviconReceivedOhos>(
4602 data,
4603 width,
4604 height,
4605 colorType,
4606 alphaType));
4607 if (Container::IsCurrentUseNewPipeline()) {
4608 auto webPattern = webPattern_.Upgrade();
4609 CHECK_NULL_VOID(webPattern);
4610 auto webEventHub = webPattern->GetWebEventHub();
4611 CHECK_NULL_VOID(webEventHub);
4612 auto propOnFaviconReceivedEvent = webEventHub->GetOnFaviconReceivedEvent();
4613 CHECK_NULL_VOID(propOnFaviconReceivedEvent);
4614 propOnFaviconReceivedEvent(param);
4615 return;
4616 }
4617 }
4618
OnTouchIconUrl(const std::string & iconUrl,bool precomposed)4619 void WebDelegate::OnTouchIconUrl(const std::string& iconUrl, bool precomposed)
4620 {
4621 if (onTouchIconUrlV2_) {
4622 onTouchIconUrlV2_(std::make_shared<TouchIconUrlEvent>(iconUrl, precomposed));
4623 }
4624 }
4625
OnAudioStateChanged(bool audible)4626 void WebDelegate::OnAudioStateChanged(bool audible)
4627 {
4628 if (onAudioStateChangedV2_) {
4629 onAudioStateChangedV2_(std::make_shared<AudioStateChangedEvent>(audible));
4630 }
4631 }
4632
OnGetTouchHandleHotZone(OHOS::NWeb::TouchHandleHotZone & hotZone)4633 void WebDelegate::OnGetTouchHandleHotZone(OHOS::NWeb::TouchHandleHotZone& hotZone)
4634 {
4635 auto pipeline = PipelineContext::GetCurrentContext();
4636 CHECK_NULL_VOID(pipeline);
4637 auto theme = pipeline->GetTheme<TextOverlayTheme>();
4638 CHECK_NULL_VOID(theme);
4639 auto touchHandleSize = theme->GetHandleHotZoneRadius().ConvertToPx();
4640 hotZone.width = touchHandleSize;
4641 hotZone.height = touchHandleSize;
4642 }
4643
GetDragPixelMap()4644 RefPtr<PixelMap> WebDelegate::GetDragPixelMap()
4645 {
4646 return pixelMap_;
4647 }
4648
4649 #ifdef OHOS_STANDARD_SYSTEM
HandleTouchDown(const int32_t & id,const double & x,const double & y,bool from_overlay)4650 void WebDelegate::HandleTouchDown(const int32_t& id, const double& x, const double& y,
4651 bool from_overlay)
4652 {
4653 ACE_DCHECK(nweb_ != nullptr);
4654 if (nweb_) {
4655 ResSchedReport::GetInstance().ResSchedDataReport("web_gesture");
4656 nweb_->OnTouchPress(id, x, y, from_overlay);
4657 }
4658 }
4659
HandleTouchUp(const int32_t & id,const double & x,const double & y,bool from_overlay)4660 void WebDelegate::HandleTouchUp(const int32_t& id, const double& x, const double& y,
4661 bool from_overlay)
4662 {
4663 ACE_DCHECK(nweb_ != nullptr);
4664 if (nweb_) {
4665 ResSchedReport::GetInstance().ResSchedDataReport("web_gesture");
4666 nweb_->OnTouchRelease(id, x, y, from_overlay);
4667 }
4668 }
4669
HandleTouchMove(const int32_t & id,const double & x,const double & y,bool from_overlay)4670 void WebDelegate::HandleTouchMove(const int32_t& id, const double& x, const double& y,
4671 bool from_overlay)
4672 {
4673 ACE_DCHECK(nweb_ != nullptr);
4674 if (nweb_) {
4675 nweb_->OnTouchMove(id, x, y, from_overlay);
4676 }
4677 }
4678
HandleTouchCancel()4679 void WebDelegate::HandleTouchCancel()
4680 {
4681 ACE_DCHECK(nweb_ != nullptr);
4682 if (nweb_) {
4683 nweb_->OnTouchCancel();
4684 }
4685 }
4686
HandleAxisEvent(const double & x,const double & y,const double & deltaX,const double & deltaY)4687 void WebDelegate::HandleAxisEvent(const double& x, const double& y, const double& deltaX, const double& deltaY)
4688 {
4689 if (nweb_) {
4690 nweb_->SendMouseWheelEvent(x, y, deltaX, deltaY);
4691 }
4692 }
4693
OnKeyEvent(int32_t keyCode,int32_t keyAction)4694 bool WebDelegate::OnKeyEvent(int32_t keyCode, int32_t keyAction)
4695 {
4696 if (nweb_) {
4697 return nweb_->SendKeyEvent(keyCode, keyAction);
4698 }
4699 return false;
4700 }
4701
OnMouseEvent(int32_t x,int32_t y,const MouseButton button,const MouseAction action,int count)4702 void WebDelegate::OnMouseEvent(int32_t x, int32_t y, const MouseButton button, const MouseAction action, int count)
4703 {
4704 if (nweb_) {
4705 nweb_->SendMouseEvent(x, y, static_cast<int>(button), static_cast<int>(action), count);
4706 }
4707 }
4708
OnFocus()4709 void WebDelegate::OnFocus()
4710 {
4711 ACE_DCHECK(nweb_ != nullptr);
4712 if (nweb_) {
4713 nweb_->OnFocus(OHOS::NWeb::FocusReason::EVENT_REQUEST);
4714 }
4715 }
4716
OnBlur()4717 void WebDelegate::OnBlur()
4718 {
4719 ACE_DCHECK(nweb_ != nullptr);
4720 if (nweb_) {
4721 nweb_->OnBlur(blurReason_);
4722 }
4723 }
4724
RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)4725 bool WebDelegate::RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params,
4726 std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback)
4727 {
4728 if (Container::IsCurrentUseNewPipeline()) {
4729 auto webPattern = webPattern_.Upgrade();
4730 CHECK_NULL_RETURN(webPattern, false);
4731 return webPattern->RunQuickMenu(params, callback);
4732 }
4733 auto renderWeb = renderWeb_.Upgrade();
4734 if (!renderWeb || !params || !callback) {
4735 LOGE("renderWeb is nullptr");
4736 return false;
4737 }
4738
4739 return renderWeb->RunQuickMenu(params, callback);
4740 }
4741
OnQuickMenuDismissed()4742 void WebDelegate::OnQuickMenuDismissed()
4743 {
4744 if (Container::IsCurrentUseNewPipeline()) {
4745 auto webPattern = webPattern_.Upgrade();
4746 CHECK_NULL_VOID(webPattern);
4747 webPattern->OnQuickMenuDismissed();
4748 return;
4749 }
4750 auto renderWeb = renderWeb_.Upgrade();
4751 CHECK_NULL_VOID(renderWeb);
4752 renderWeb->OnQuickMenuDismissed();
4753 }
4754
OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)4755 void WebDelegate::OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle,
4756 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle,
4757 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle)
4758 {
4759 if (Container::IsCurrentUseNewPipeline()) {
4760 auto webPattern = webPattern_.Upgrade();
4761 CHECK_NULL_VOID(webPattern);
4762 webPattern->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
4763 return;
4764 }
4765 auto renderWeb = renderWeb_.Upgrade();
4766 CHECK_NULL_VOID(renderWeb);
4767 renderWeb->OnTouchSelectionChanged(insertHandle, startSelectionHandle, endSelectionHandle);
4768 }
4769
OnCursorChange(const OHOS::NWeb::CursorType & type,const OHOS::NWeb::NWebCursorInfo & info)4770 bool WebDelegate::OnCursorChange(const OHOS::NWeb::CursorType& type, const OHOS::NWeb::NWebCursorInfo& info)
4771 {
4772 if (Container::IsCurrentUseNewPipeline()) {
4773 auto webPattern = webPattern_.Upgrade();
4774 CHECK_NULL_RETURN(webPattern, false);
4775 return webPattern->OnCursorChange(type, info);
4776 }
4777 auto renderWeb = renderWeb_.Upgrade();
4778 CHECK_NULL_RETURN(renderWeb, false);
4779 return renderWeb->OnCursorChange(type, info);
4780 }
4781
OnSelectPopupMenu(std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)4782 void WebDelegate::OnSelectPopupMenu(
4783 std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuParam> params,
4784 std::shared_ptr<OHOS::NWeb::NWebSelectPopupMenuCallback> callback)
4785 {
4786 if (Container::IsCurrentUseNewPipeline()) {
4787 auto webPattern = webPattern_.Upgrade();
4788 CHECK_NULL_VOID(webPattern);
4789 webPattern->OnSelectPopupMenu(params, callback);
4790 return;
4791 }
4792 auto renderWeb = renderWeb_.Upgrade();
4793 CHECK_NULL_VOID(renderWeb);
4794 return renderWeb->OnSelectPopupMenu(params, callback);
4795 }
4796
HandleDragEvent(int32_t x,int32_t y,const DragAction & dragAction)4797 void WebDelegate::HandleDragEvent(int32_t x, int32_t y, const DragAction& dragAction)
4798 {
4799 if (nweb_) {
4800 OHOS::NWeb::DragEvent dragEvent;
4801 dragEvent.x = x;
4802 dragEvent.y = y;
4803 dragEvent.action = static_cast<OHOS::NWeb::DragAction>(dragAction);
4804 nweb_->SendDragEvent(dragEvent);
4805 }
4806 }
4807
GetUrl()4808 std::string WebDelegate::GetUrl()
4809 {
4810 if (nweb_) {
4811 return nweb_->GetUrl();
4812 }
4813 return "";
4814 }
4815
UpdateLocale()4816 void WebDelegate::UpdateLocale()
4817 {
4818 ACE_DCHECK(nweb_ != nullptr);
4819 if (nweb_) {
4820 std::string language = AceApplicationInfo::GetInstance().GetLanguage();
4821 std::string region = AceApplicationInfo::GetInstance().GetCountryOrRegion();
4822 if (!language.empty() || !region.empty()) {
4823 nweb_->UpdateLocale(language, region);
4824 }
4825 }
4826 }
4827 #endif
4828
GetUrlStringParam(const std::string & param,const std::string & name) const4829 std::string WebDelegate::GetUrlStringParam(const std::string& param, const std::string& name) const
4830 {
4831 size_t len = name.length();
4832 size_t posErrorCode = param.find(NTC_PARAM_ERROR_CODE);
4833 size_t pos = param.find(name);
4834 std::string result;
4835
4836 if (pos != std::string::npos && posErrorCode != std::string::npos) {
4837 std::stringstream ss;
4838
4839 ss << param.substr(pos + 1 + len, posErrorCode - 5);
4840 ss >> result;
4841 }
4842 return result;
4843 }
4844
BindRouterBackMethod()4845 void WebDelegate::BindRouterBackMethod()
4846 {
4847 auto context = context_.Upgrade();
4848 if (context) {
4849 context->SetRouterBackEventHandler([weak = WeakClaim(this)] {
4850 auto delegate = weak.Upgrade();
4851 if (delegate) {
4852 delegate->CallWebRouterBack();
4853 }
4854 });
4855 }
4856 }
4857
BindPopPageSuccessMethod()4858 void WebDelegate::BindPopPageSuccessMethod()
4859 {
4860 auto context = context_.Upgrade();
4861 if (context) {
4862 context->SetPopPageSuccessEventHandler(
4863 [weak = WeakClaim(this)](const std::string& pageUrl, const int32_t pageId) {
4864 std::string url = pageUrl.substr(0, pageUrl.length() - 3);
4865 auto delegate = weak.Upgrade();
4866 if (delegate) {
4867 delegate->CallPopPageSuccessPageUrl(url);
4868 }
4869 });
4870 }
4871 }
4872
BindIsPagePathInvalidMethod()4873 void WebDelegate::BindIsPagePathInvalidMethod()
4874 {
4875 auto context = context_.Upgrade();
4876 if (context) {
4877 context->SetIsPagePathInvalidEventHandler([weak = WeakClaim(this)](bool& isPageInvalid) {
4878 auto delegate = weak.Upgrade();
4879 if (delegate) {
4880 delegate->CallIsPagePathInvalid(isPageInvalid);
4881 }
4882 });
4883 }
4884 }
4885
SetComponent(const RefPtr<WebComponent> & component)4886 void WebDelegate::SetComponent(const RefPtr<WebComponent>& component)
4887 {
4888 webComponent_ = component;
4889 }
4890
SetNGWebPattern(const RefPtr<NG::WebPattern> & webPattern)4891 void WebDelegate::SetNGWebPattern(const RefPtr<NG::WebPattern>& webPattern)
4892 {
4893 webPattern_ = webPattern;
4894 }
4895
SetDrawSize(const Size & drawSize)4896 void WebDelegate::SetDrawSize(const Size& drawSize)
4897 {
4898 drawSize_ = drawSize;
4899 }
4900
SetEnhanceSurfaceFlag(const bool & isEnhanceSurface)4901 void WebDelegate::SetEnhanceSurfaceFlag(const bool& isEnhanceSurface)
4902 {
4903 LOGI("enhance flag %{public}d", isEnhanceSurface);
4904 isEnhanceSurface_ = isEnhanceSurface;
4905 }
4906
GetSurfaceDelegateClient()4907 sptr<OHOS::SurfaceDelegate> WebDelegate::GetSurfaceDelegateClient()
4908 {
4909 return surfaceDelegate_;
4910 }
4911
SetBoundsOrResize(const Size & drawSize,const Offset & offset)4912 void WebDelegate::SetBoundsOrResize(const Size& drawSize, const Offset& offset)
4913 {
4914 if ((drawSize.Width() == 0) && (drawSize.Height() == 0)) {
4915 LOGE("WebDelegate::SetBoundsOrResize width and height error");
4916 return;
4917 }
4918 if (isEnhanceSurface_) {
4919 if (surfaceDelegate_) {
4920 LOGI("WebDelegate::SetBounds: x:%{public}d, y:%{public}d, w::%{public}d, h:%{public}d",
4921 (int32_t)offset.GetX(), (int32_t)offset.GetY(),
4922 (int32_t)drawSize.Width(), (int32_t)drawSize.Height());
4923 if (needResizeAtFirst_) {
4924 LOGI("WebDelegate::SetBounds: resize at first");
4925 Resize(drawSize.Width(), drawSize.Height());
4926 needResizeAtFirst_ = false;
4927 }
4928 Size webSize = GetEnhanceSurfaceSize(drawSize);
4929 surfaceDelegate_->SetBounds(offset.GetX(), (int32_t)offset.GetY(), webSize.Width(), webSize.Height());
4930 }
4931 } else {
4932 Resize(drawSize.Width(), drawSize.Height());
4933 }
4934 }
4935
GetWebRenderGlobalPos()4936 Offset WebDelegate::GetWebRenderGlobalPos()
4937 {
4938 return offset_;
4939 }
4940
GetEnhanceSurfaceSize(const Size & drawSize)4941 Size WebDelegate::GetEnhanceSurfaceSize(const Size& drawSize)
4942 {
4943 auto pipeline = PipelineBase::GetCurrentContext();
4944 CHECK_NULL_RETURN_NOLOG(pipeline, Size());
4945 double dipScale = pipeline->GetDipScale();
4946 if (NearZero(dipScale)) {
4947 return Size();
4948 }
4949 int width = std::ceil(std::floor(drawSize.Width() / dipScale) * dipScale);
4950 int height = std::ceil(std::floor(drawSize.Height() / dipScale) * dipScale);
4951 if (width <= 0) {
4952 width = 1;
4953 }
4954 if (height <= 0) {
4955 height = 1;
4956 }
4957 return Size(width, height);
4958 }
4959
GetAudioStateChangedCallback(bool useNewPipe,const RefPtr<NG::WebEventHub> & eventHub)4960 WebDelegate::EventCallbackV2 WebDelegate::GetAudioStateChangedCallback(
4961 bool useNewPipe, const RefPtr<NG::WebEventHub>& eventHub)
4962 {
4963 if (eventHub && useNewPipe) {
4964 return eventHub->GetOnAudioStateChangedEvent();
4965 }
4966 return nullptr;
4967 }
4968
4969 #ifdef ENABLE_ROSEN_BACKEND
SetSurface(const sptr<Surface> & surface)4970 void WebDelegate::SetSurface(const sptr<Surface>& surface)
4971 {
4972 surface_ = surface;
4973 auto webPattern = webPattern_.Upgrade();
4974 CHECK_NULL_VOID(webPattern);
4975 auto host = webPattern->GetHost();
4976 CHECK_NULL_VOID(host);
4977 auto renderContext = host->GetRenderContext();
4978 CHECK_NULL_VOID(renderContext);
4979 auto rosenRenderContext = AceType::DynamicCast<NG::RosenRenderContext>(renderContext);
4980 CHECK_NULL_VOID(rosenRenderContext);
4981 rsNode_ = rosenRenderContext->GetRSNode();
4982 }
4983 #endif
4984
UpdateScreenOffSet(double & offsetX,double & offsetY)4985 void WebDelegate::UpdateScreenOffSet(double& offsetX, double& offsetY)
4986 {
4987 if (Container::IsCurrentUseNewPipeline()) {
4988 auto webPattern = webPattern_.Upgrade();
4989 CHECK_NULL_VOID(webPattern);
4990 offsetX += webPattern->GetHost()->GetTransformRelativeOffset().GetX();
4991 offsetY += webPattern->GetHost()->GetTransformRelativeOffset().GetY();
4992 auto context = context_.Upgrade();
4993 CHECK_NULL_VOID(context);
4994 auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
4995 offsetX += windowOffset.GetX();
4996 offsetY += windowOffset.GetY();
4997 return;
4998 }
4999 auto renderWeb = renderWeb_.Upgrade();
5000 CHECK_NULL_VOID(renderWeb);
5001 offsetX += renderWeb->GetGlobalOffset().GetX();
5002 offsetY += renderWeb->GetGlobalOffset().GetY();
5003 auto context = context_.Upgrade();
5004 CHECK_NULL_VOID(context);
5005 auto windowOffset = context->GetDisplayWindowRectInfo().GetOffset();
5006 offsetX += windowOffset.GetX();
5007 offsetY += windowOffset.GetY();
5008 WindowMode windowMode = context->GetWindowManager()->GetWindowMode();
5009 if (windowMode == WindowMode::WINDOW_MODE_FLOATING) {
5010 offsetX += CONTAINER_BORDER_WIDTH.ConvertToPx();
5011 offsetY += CONTAINER_TITLE_HEIGHT.ConvertToPx();
5012 }
5013 }
5014
RegisterSurfacePositionChangedCallback()5015 void WebDelegate::RegisterSurfacePositionChangedCallback()
5016 {
5017 if (Container::IsCurrentUseNewPipeline()) {
5018 auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
5019 CHECK_NULL_VOID(pipelineContext);
5020 if (callbackId_ <= 0) {
5021 callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
5022 [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
5023 auto delegate = weak.Upgrade();
5024 if (delegate && delegate->nweb_ && !delegate->window_) {
5025 double offsetX = 0;
5026 double offsetY = 0;
5027 delegate->UpdateScreenOffSet(offsetX, offsetY);
5028 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
5029 }
5030 }
5031 );
5032 }
5033 return;
5034 }
5035 auto pipelineContext = DynamicCast<PipelineContext>(context_.Upgrade());
5036 CHECK_NULL_VOID(pipelineContext);
5037 if (callbackId_ <= 0) {
5038 callbackId_ = pipelineContext->RegisterSurfacePositionChangedCallback(
5039 [weak = WeakClaim(this)](int32_t posX, int32_t posY) {
5040 auto delegate = weak.Upgrade();
5041 if (delegate && delegate->nweb_ && !delegate->window_) {
5042 double offsetX = 0;
5043 double offsetY = 0;
5044 delegate->UpdateScreenOffSet(offsetX, offsetY);
5045 delegate->nweb_->SetScreenOffSet(offsetX, offsetY);
5046 }
5047 }
5048 );
5049 }
5050 }
5051
UnregisterSurfacePositionChangedCallback()5052 void WebDelegate::UnregisterSurfacePositionChangedCallback()
5053 {
5054 if (callbackId_ <= 0) {
5055 LOGE("callbackId_ = %{public}d", callbackId_);
5056 return;
5057 }
5058 if (Container::IsCurrentUseNewPipeline()) {
5059 auto pipelineContext = DynamicCast<NG::PipelineContext>(context_.Upgrade());
5060 CHECK_NULL_VOID(pipelineContext);
5061 pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
5062 callbackId_ = 0;
5063 return;
5064 }
5065 auto pipelineContext = DynamicCast<PipelineContext>(context_.Upgrade());
5066 CHECK_NULL_VOID(pipelineContext);
5067 pipelineContext->UnregisterSurfacePositionChangedCallback(callbackId_);
5068 callbackId_ = 0;
5069 }
5070
OnCompleteSwapWithNewSize()5071 void WebDelegate::OnCompleteSwapWithNewSize()
5072 {
5073 auto webPattern = webPattern_.Upgrade();
5074 CHECK_NULL_VOID(webPattern);
5075 webPattern->OnCompleteSwapWithNewSize();
5076 }
5077
OnResizeNotWork()5078 void WebDelegate::OnResizeNotWork()
5079 {
5080 auto webPattern = webPattern_.Upgrade();
5081 CHECK_NULL_VOID(webPattern);
5082 webPattern->OnResizeNotWork();
5083 }
5084
OnDateTimeChooserPopup(const OHOS::NWeb::DateTimeChooser & chooser,const std::vector<OHOS::NWeb::DateTimeSuggestion> & suggestions,std::shared_ptr<OHOS::NWeb::NWebDateTimeChooserCallback> callback)5085 void WebDelegate::OnDateTimeChooserPopup(
5086 const OHOS::NWeb::DateTimeChooser& chooser,
5087 const std::vector<OHOS::NWeb::DateTimeSuggestion>& suggestions,
5088 std::shared_ptr<OHOS::NWeb::NWebDateTimeChooserCallback> callback)
5089 {
5090 auto webPattern = webPattern_.Upgrade();
5091 CHECK_NULL_VOID(webPattern);
5092 webPattern->OnDateTimeChooserPopup(chooser, suggestions, callback);
5093 }
5094
OnDateTimeChooserClose()5095 void WebDelegate::OnDateTimeChooserClose()
5096 {
5097 auto webPattern = webPattern_.Upgrade();
5098 CHECK_NULL_VOID(webPattern);
5099 webPattern->OnDateTimeChooserClose();
5100 }
5101
OnOverScroll(float xOffset,float yOffset)5102 void WebDelegate::OnOverScroll(float xOffset, float yOffset)
5103 {
5104 auto context = context_.Upgrade();
5105 CHECK_NULL_VOID(context);
5106 context->GetTaskExecutor()->PostTask(
5107 [weak = WeakClaim(this), xOffset, yOffset]() {
5108 auto delegate = weak.Upgrade();
5109 CHECK_NULL_VOID(delegate);
5110 auto onOverScrollV2 = delegate->onOverScrollV2_;
5111 if (onOverScrollV2) {
5112 onOverScrollV2(std::make_shared<WebOnOverScrollEvent>(xOffset, yOffset));
5113 }
5114 },
5115 TaskExecutor::TaskType::JS);
5116 }
5117 } // namespace OHOS::Ace