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