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