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