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