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