• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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