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