• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "core/components/web/resource/web_delegate.h"
17 
18 #include <algorithm>
19 #include <iomanip>
20 #include <sstream>
21 
22 #include "base/json/json_util.h"
23 #include "base/log/log.h"
24 #include "core/common/container.h"
25 #include "core/components/web/web_event.h"
26 #include "core/event/ace_event_helper.h"
27 #include "core/event/back_end_event_manager.h"
28 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h"
29 #ifdef OHOS_STANDARD_SYSTEM
30 #include "application_env.h"
31 #include "nweb_adapter_helper.h"
32 #include "nweb_hit_testresult.h"
33 #include "web_javascript_execute_callback.h"
34 #include "web_javascript_result_callback.h"
35 #endif
36 
37 namespace OHOS::Ace {
38 
39 namespace {
40 
41 constexpr char WEB_METHOD_ROUTER_BACK[] = "routerBack";
42 constexpr char WEB_METHOD_UPDATEURL[] = "updateUrl";
43 constexpr char WEB_METHOD_CHANGE_PAGE_URL[] = "changePageUrl";
44 constexpr char WEB_METHOD_PAGE_PATH_INVALID[] = "pagePathInvalid";
45 constexpr char WEB_EVENT_PAGESTART[] = "onPageStarted";
46 constexpr char WEB_EVENT_PAGEFINISH[] = "onPageFinished";
47 constexpr char WEB_EVENT_PAGEERROR[] = "onPageError";
48 constexpr char WEB_EVENT_ONMESSAGE[] = "onMessage";
49 constexpr char WEB_EVENT_ROUTERPUSH[] = "routerPush";
50 
51 constexpr char WEB_CREATE[] = "web";
52 constexpr char NTC_PARAM_WEB[] = "web";
53 constexpr char NTC_PARAM_WIDTH[] = "width";
54 constexpr char NTC_PARAM_HEIGHT[] = "height";
55 constexpr char NTC_PARAM_LEFT[] = "left";
56 constexpr char NTC_PARAM_TOP[] = "top";
57 constexpr char NTC_ERROR[] = "create error";
58 constexpr char NTC_PARAM_SRC[] = "src";
59 constexpr char NTC_PARAM_ERROR_CODE[] = "errorCode";
60 constexpr char NTC_PARAM_URL[] = "url";
61 constexpr char NTC_PARAM_PAGE_URL[] = "pageUrl";
62 constexpr char NTC_PARAM_PAGE_INVALID[] = "pageInvalid";
63 constexpr char NTC_PARAM_DESCRIPTION[] = "description";
64 constexpr char WEB_ERROR_CODE_CREATEFAIL[] = "error-web-delegate-000001";
65 constexpr char WEB_ERROR_MSG_CREATEFAIL[] = "create web_delegate failed.";
66 
67 } // namespace
68 
GetLineNumber()69 int ConsoleLogOhos::GetLineNumber()
70 {
71     if (message_) {
72         return message_->LineNumer();
73     }
74     return -1;
75 }
76 
GetLog()77 std::string ConsoleLogOhos::GetLog()
78 {
79     if (message_) {
80         return message_->Log();
81     }
82     return "";
83 }
84 
GetLogLevel()85 int ConsoleLogOhos::GetLogLevel()
86 {
87     if (message_) {
88         return message_->LogLevel();
89     }
90     return -1;
91 }
92 
GetSourceId()93 std::string ConsoleLogOhos::GetSourceId()
94 {
95     if (message_) {
96         return message_->SourceId();
97     }
98     return "";
99 }
100 
Confirm()101 void ResultOhos::Confirm()
102 {
103     if (result_) {
104         result_->Confirm();
105     }
106 }
107 
Confirm(const std::string & message)108 void ResultOhos::Confirm(const std::string &message)
109 {
110     if (result_) {
111         result_->Confirm(message);
112     }
113 }
114 
Cancel()115 void ResultOhos::Cancel()
116 {
117     if (result_) {
118         result_->Cancel();
119     }
120 }
121 
GetTitle()122 std::string FileSelectorParamOhos::GetTitle()
123 {
124     if (param_) {
125         return param_->Title();
126     }
127     return "";
128 }
129 
GetMode()130 int FileSelectorParamOhos::GetMode()
131 {
132     if (param_) {
133         return param_->Mode();
134     }
135     return 0;
136 }
137 
GetDefaultFileName()138 std::string FileSelectorParamOhos::GetDefaultFileName()
139 {
140     if (param_) {
141         return param_->DefaultFilename();
142     }
143     return "";
144 }
145 
GetAcceptType()146 std::vector<std::string> FileSelectorParamOhos::GetAcceptType()
147 {
148     if (param_) {
149         return param_->AcceptType();
150     }
151     return std::vector<std::string>();
152 }
153 
IsCapture()154 bool FileSelectorParamOhos::IsCapture()
155 {
156     if (param_) {
157         return param_->IsCapture();
158     }
159     return false;
160 }
161 
HandleFileList(std::vector<std::string> & result)162 void FileSelectorResultOhos::HandleFileList(std::vector<std::string>& result)
163 {
164     if (callback_) {
165         callback_->OnReceiveValue(result);
166     }
167 }
168 
~WebDelegate()169 WebDelegate::~WebDelegate()
170 {
171     ReleasePlatformResource();
172 }
173 
ReleasePlatformResource()174 void WebDelegate::ReleasePlatformResource()
175 {
176     auto delegate = WeakClaim(this).Upgrade();
177     if (delegate) {
178         delegate->Stop();
179         delegate->Release();
180     }
181 }
182 
Invoke(const std::string & origin,const bool & allow,const bool & retain)183 void WebGeolocationOhos::Invoke(const std::string &origin, const bool& allow, const bool& retain)
184 {
185     if (geolocationCallback_) {
186         geolocationCallback_->GeolocationCallbackInvoke(origin, allow, retain);
187     }
188 }
189 
Stop()190 void WebDelegate::Stop()
191 {
192     auto context = context_.Upgrade();
193     if (!context) {
194         LOGI("fail to get context");
195         return;
196     }
197     auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
198     if (platformTaskExecutor.IsRunOnCurrentThread()) {
199         UnregisterEvent();
200     } else {
201         platformTaskExecutor.PostTask([weak = WeakClaim(this)] {
202             auto delegate = weak.Upgrade();
203             if (delegate) {
204                 delegate->UnregisterEvent();
205             }
206         });
207     }
208 }
209 
UnregisterEvent()210 void WebDelegate::UnregisterEvent()
211 {
212     auto context = context_.Upgrade();
213     if (!context) {
214         LOGI("fail to get context");
215         return;
216     }
217     auto resRegister = context->GetPlatformResRegister();
218     if (resRegister == nullptr) {
219         return;
220     }
221     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGESTART));
222     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH));
223     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR));
224     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH));
225     resRegister->UnregisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE));
226 }
227 
CreatePlatformResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)228 void WebDelegate::CreatePlatformResource(
229     const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
230 {
231     ReleasePlatformResource();
232     context_ = context;
233     CreatePluginResource(size, position, context);
234 
235     auto reloadCallback = [weak = WeakClaim(this)]() {
236         auto delegate = weak.Upgrade();
237         if (!delegate) {
238             return false;
239         }
240         delegate->Reload();
241         return true;
242     };
243     WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
244 
245     auto updateUrlCallback = [weak = WeakClaim(this)](const std::string& url) {
246         auto delegate = weak.Upgrade();
247         if (!delegate) {
248             return false;
249         }
250         delegate->UpdateUrl(url);
251         return true;
252     };
253     WebClient::GetInstance().RegisterUpdageUrlCallback(updateUrlCallback);
254     InitWebEvent();
255 }
256 
LoadUrl(const std::string & url,const std::map<std::string,std::string> & httpHeaders)257 void WebDelegate::LoadUrl(const std::string& url, const std::map<std::string, std::string>& httpHeaders)
258 {
259     auto context = context_.Upgrade();
260     if (!context) {
261         return;
262     }
263     context->GetTaskExecutor()->PostTask(
264         [weak = WeakClaim(this), url, httpHeaders]() {
265             auto delegate = weak.Upgrade();
266             if (!delegate) {
267                 return;
268             }
269             if (delegate->nweb_) {
270                 delegate->nweb_->Load(
271                     const_cast<std::string&>(url), const_cast<std::map<std::string, std::string>&>(httpHeaders));
272             }
273         },
274         TaskExecutor::TaskType::PLATFORM);
275 }
276 
277 #ifdef OHOS_STANDARD_SYSTEM
Backward()278 void WebDelegate::Backward()
279 {
280     auto context = context_.Upgrade();
281     if (!context) {
282         LOGE("Get context failed, it is null.");
283         return;
284     }
285     context->GetTaskExecutor()->PostTask(
286         [weak = WeakClaim(this)]() {
287             auto delegate = weak.Upgrade();
288             if (!delegate) {
289                 LOGE("Get delegate failed, it is null.");
290                 return;
291             }
292             if (delegate->nweb_) {
293                 delegate->nweb_->NavigateBack();
294             }
295         },
296         TaskExecutor::TaskType::PLATFORM);
297 }
298 
Forward()299 void WebDelegate::Forward()
300 {
301     auto context = context_.Upgrade();
302     if (!context) {
303         LOGE("Get context failed, it is null.");
304         return;
305     }
306     context->GetTaskExecutor()->PostTask(
307         [weak = WeakClaim(this)]() {
308             auto delegate = weak.Upgrade();
309             if (!delegate) {
310                 LOGE("Get delegate failed, it is null.");
311                 return;
312             }
313             if (delegate->nweb_) {
314                 delegate->nweb_->NavigateForward();
315             }
316         },
317         TaskExecutor::TaskType::PLATFORM);
318 }
319 
ClearHistory()320 void WebDelegate::ClearHistory()
321 {
322     auto context = context_.Upgrade();
323     if (!context) {
324         LOGE("Get context failed, it is null.");
325         return;
326     }
327     context->GetTaskExecutor()->PostTask(
328         [weak = WeakClaim(this)]() {
329             auto delegate = weak.Upgrade();
330             if (!delegate) {
331                 LOGE("Get delegate failed, it is null.");
332                 return;
333             }
334             if (delegate->nweb_) {
335                 delegate->nweb_->DeleteNavigateHistory();
336             }
337         },
338         TaskExecutor::TaskType::PLATFORM);
339 }
340 
AccessStep(int32_t step)341 bool WebDelegate::AccessStep(int32_t step)
342 {
343     auto delegate = WeakClaim(this).Upgrade();
344     if (!delegate) {
345         LOGE("Get delegate failed, it is null.");
346         return false;
347     }
348     if (delegate->nweb_) {
349         return delegate->nweb_->CanNavigateBackOrForward(step);
350     }
351     return false;
352 }
353 
AccessBackward()354 bool WebDelegate::AccessBackward()
355 {
356     auto delegate = WeakClaim(this).Upgrade();
357     if (!delegate) {
358         LOGE("Get delegate failed, it is null.");
359         return false;
360     }
361     if (delegate->nweb_) {
362         return delegate->nweb_->IsNavigatebackwardAllowed();
363     }
364     return false;
365 }
366 
AccessForward()367 bool WebDelegate::AccessForward()
368 {
369     auto delegate = WeakClaim(this).Upgrade();
370     if (!delegate) {
371         LOGE("Get delegate failed, it is null.");
372         return false;
373     }
374     if (delegate->nweb_) {
375         return delegate->nweb_->IsNavigateForwardAllowed();
376     }
377     return false;
378 }
379 
380 #endif
381 
ExecuteTypeScript(const std::string & jscode,const std::function<void (const std::string)> && callback)382 void WebDelegate::ExecuteTypeScript(const std::string& jscode, const std::function<void(const std::string)>&& callback)
383 {
384     auto context = context_.Upgrade();
385     if (!context) {
386         return;
387     }
388     context->GetTaskExecutor()->PostTask(
389         [weak = WeakClaim(this), jscode, callback]() {
390             auto delegate = weak.Upgrade();
391             if (!delegate) {
392                 return;
393             }
394             if (delegate->nweb_) {
395                 auto callbackImpl = std::make_shared<WebJavaScriptExecuteCallBack>(Container::CurrentId());
396                 if (callbackImpl && callback) {
397                     callbackImpl->SetCallBack([weak, func = std::move(callback)](std::string result) {
398                         auto delegate = weak.Upgrade();
399                         if (!delegate) {
400                             return;
401                         }
402                         auto context = delegate->context_.Upgrade();
403                         if (context) {
404                             context->GetTaskExecutor()->PostTask(
405                                 [callback = std::move(func), result]() { callback(result); },
406                                 TaskExecutor::TaskType::JS);
407                         }
408                     });
409                 }
410                 delegate->nweb_->ExecuteJavaScript(jscode, callbackImpl);
411             }
412         },
413         TaskExecutor::TaskType::PLATFORM);
414 }
415 
LoadDataWithBaseUrl(const std::string & baseUrl,const std::string & data,const std::string & mimeType,const std::string & encoding,const std::string & historyUrl)416 void WebDelegate::LoadDataWithBaseUrl(const std::string& baseUrl, const std::string& data, const std::string& mimeType,
417     const std::string& encoding, const std::string& historyUrl)
418 {
419     auto context = context_.Upgrade();
420     if (!context) {
421         return;
422     }
423     context->GetTaskExecutor()->PostTask(
424         [weak = WeakClaim(this), baseUrl, data, mimeType, encoding, historyUrl]() {
425             auto delegate = weak.Upgrade();
426             if (!delegate) {
427                 return;
428             }
429             if (delegate->nweb_) {
430                 if (baseUrl.empty() && historyUrl.empty()) {
431                     delegate->nweb_->LoadWithData(data, mimeType, encoding);
432                 } else {
433                     delegate->nweb_->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
434                 }
435             }
436         },
437         TaskExecutor::TaskType::PLATFORM);
438 }
439 
LoadDataWithRichText(const std::string & data)440 void WebDelegate::LoadDataWithRichText(const std::string& data)
441 {
442     auto context = context_.Upgrade();
443     if (!context) {
444         return;
445     }
446     context->GetTaskExecutor()->PostTask(
447         [weak = WeakClaim(this), data]() {
448             auto delegate = weak.Upgrade();
449             if (!delegate) {
450                 return;
451             }
452             if (delegate->nweb_) {
453                 delegate->nweb_->LoadWithDataAndBaseUrl("", data, "", "", "");
454             }
455         },
456         TaskExecutor::TaskType::PLATFORM);
457 }
458 
Refresh()459 void WebDelegate::Refresh()
460 {
461     auto context = context_.Upgrade();
462     if (!context) {
463         return;
464     }
465     context->GetTaskExecutor()->PostTask(
466         [weak = WeakClaim(this)]() {
467             auto delegate = weak.Upgrade();
468             if (!delegate) {
469                 return;
470             }
471             if (delegate->nweb_) {
472                 delegate->nweb_->Reload();
473             }
474         },
475         TaskExecutor::TaskType::PLATFORM);
476 }
477 
StopLoading()478 void WebDelegate::StopLoading()
479 {
480     auto context = context_.Upgrade();
481     if (!context) {
482         return;
483     }
484     context->GetTaskExecutor()->PostTask(
485         [weak = WeakClaim(this)]() {
486             auto delegate = weak.Upgrade();
487             if (!delegate) {
488                 return;
489             }
490             if (delegate->nweb_) {
491                 delegate->nweb_->Stop();
492             }
493         },
494         TaskExecutor::TaskType::PLATFORM);
495 }
496 
AddJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)497 void WebDelegate::AddJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
498 {
499     auto context = context_.Upgrade();
500     if (!context) {
501         return;
502     }
503     context->GetTaskExecutor()->PostTask(
504         [weak = WeakClaim(this), objectName, methodList]() {
505             auto delegate = weak.Upgrade();
506             if (!delegate) {
507                 return;
508             }
509             if (delegate->nweb_) {
510                 delegate->nweb_->RegisterArkJSfunction(objectName, methodList);
511             }
512         },
513         TaskExecutor::TaskType::PLATFORM);
514 }
RemoveJavascriptInterface(const std::string & objectName,const std::vector<std::string> & methodList)515 void WebDelegate::RemoveJavascriptInterface(const std::string& objectName, const std::vector<std::string>& methodList)
516 {
517     auto context = context_.Upgrade();
518     if (!context) {
519         return;
520     }
521     context->GetTaskExecutor()->PostTask(
522         [weak = WeakClaim(this), objectName, methodList]() {
523             auto delegate = weak.Upgrade();
524             if (!delegate) {
525                 return;
526             }
527             if (delegate->nweb_) {
528                 delegate->nweb_->UnregisterArkJSfunction(objectName, methodList);
529             }
530         },
531         TaskExecutor::TaskType::PLATFORM);
532 }
533 
SetWebViewJavaScriptResultCallBack(const WebController::JavaScriptCallBackImpl && javaScriptCallBackImpl)534 void WebDelegate::SetWebViewJavaScriptResultCallBack(
535     const WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl)
536 {
537     auto context = context_.Upgrade();
538     if (!context) {
539         return;
540     }
541 
542     context->GetTaskExecutor()->PostTask(
543         [weak = WeakClaim(this), javaScriptCallBackImpl]() {
544             auto delegate = weak.Upgrade();
545             if (delegate == nullptr || delegate->nweb_ == nullptr) {
546                 return;
547             }
548             auto webJSResultCallBack =
549                 std::make_shared<WebJavaScriptResultCallBack>(Container::CurrentId());
550             if (webJSResultCallBack) {
551                 LOGI("WebDelegate SetWebViewJavaScriptResultCallBack");
552                 webJSResultCallBack->SetJavaScriptCallBack(std::move(javaScriptCallBackImpl));
553                 delegate->nweb_->SetNWebJavaScriptResultCallBack(webJSResultCallBack);
554             }
555         },
556         TaskExecutor::TaskType::PLATFORM);
557 }
558 
RequestFocus()559 void WebDelegate::RequestFocus()
560 {
561     auto context = context_.Upgrade();
562     if (!context) {
563         return;
564     }
565     context->GetTaskExecutor()->PostTask(
566         [weak = WeakClaim(this)]() {
567             auto delegate = weak.Upgrade();
568             if (!delegate) {
569                 return;
570             }
571             if (delegate->webComponent_) {
572                 delegate->webComponent_->RequestFocus();
573             }
574         },
575         TaskExecutor::TaskType::PLATFORM);
576 }
577 
GetHitTestResult()578 int WebDelegate::GetHitTestResult()
579 {
580     WebHitTestType webHitType = WebHitTestType::UNKNOWN;
581     if (nweb_) {
582         int hitType = nweb_->GetHitTestResult().GetType();
583         switch (hitType) {
584             case OHOS::NWeb::HitTestResult::UNKNOWN_TYPE:
585                 webHitType = WebHitTestType::UNKNOWN;
586                 break;
587             case OHOS::NWeb::HitTestResult::ANCHOR_TYPE:
588                 webHitType = WebHitTestType::HTTP;
589                 break;
590             case OHOS::NWeb::HitTestResult::PHONE_TYPE:
591                 webHitType = WebHitTestType::PHONE;
592                 break;
593             case OHOS::NWeb::HitTestResult::GEO_TYPE:
594                 webHitType = WebHitTestType::MAP;
595                 break;
596             case OHOS::NWeb::HitTestResult::EMAIL_TYPE:
597                 webHitType = WebHitTestType::EMAIL;
598                 break;
599             case OHOS::NWeb::HitTestResult::IMAGE_TYPE:
600                 webHitType = WebHitTestType::IMG;
601                 break;
602             case OHOS::NWeb::HitTestResult::IMAGE_ANCHOR_TYPE:
603                 webHitType = WebHitTestType::HTTP_IMG;
604                 break;
605             case OHOS::NWeb::HitTestResult::SRC_ANCHOR_TYPE:
606                 webHitType = WebHitTestType::HTTP;
607                 break;
608             case OHOS::NWeb::HitTestResult::SRC_IMAGE_ANCHOR_TYPE:
609                 webHitType = WebHitTestType::HTTP_IMG;
610                 break;
611             case OHOS::NWeb::HitTestResult::EDIT_TEXT_TYPE:
612                 webHitType = WebHitTestType::EDIT;
613                 break;
614             default:
615                 LOGW("unknow hit test type:%{public}d", static_cast<int>(hitType));
616                 break;
617         }
618     }
619     return static_cast<int>(webHitType);
620 }
621 
SaveCookieSync()622 bool WebDelegate::SaveCookieSync()
623 {
624     if (cookieManager_) {
625         return cookieManager_->Store();
626     }
627     return false;
628 }
629 
SetCookie(const std::string & url,const std::string & value)630 bool WebDelegate::SetCookie(const std::string& url, const std::string& value)
631 {
632     if (cookieManager_) {
633         return cookieManager_->SetCookie(url, value);
634     }
635     return false;
636 }
637 
GetCookie(const std::string & url) const638 std::string WebDelegate::GetCookie(const std::string& url) const
639 {
640     if (cookieManager_) {
641         return cookieManager_->ReturnCookie(url);
642     }
643     return "";
644 }
645 
DeleteEntirelyCookie()646 void WebDelegate::DeleteEntirelyCookie()
647 {
648     if (cookieManager_) {
649         cookieManager_->DeleteCookieEntirely(nullptr);
650     }
651 }
652 
CreatePluginResource(const Size & size,const Offset & position,const WeakPtr<PipelineContext> & context)653 void WebDelegate::CreatePluginResource(
654     const Size& size, const Offset& position, const WeakPtr<PipelineContext>& context)
655 {
656     state_ = State::CREATING;
657 
658     auto webCom = webComponent_;
659     if (!webCom) {
660         LOGI("webCom is null");
661         state_ = State::CREATEFAILED;
662         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
663         return;
664     }
665 
666     auto pipelineContext = context.Upgrade();
667     if (!pipelineContext) {
668         LOGI("pipelineContext is null");
669         state_ = State::CREATEFAILED;
670         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to context is null");
671         return;
672     }
673     context_ = context;
674     auto platformTaskExecutor =
675         SingleTaskExecutor::Make(pipelineContext->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
676     auto resRegister = pipelineContext->GetPlatformResRegister();
677     auto weakRes = AceType::WeakClaim(AceType::RawPtr(resRegister));
678     platformTaskExecutor.PostTask([weakWeb = AceType::WeakClaim(this), weakRes, size, position] {
679         auto webDelegate = weakWeb.Upgrade();
680         if (webDelegate == nullptr) {
681             LOGI("webDelegate is null!");
682             return;
683         }
684         auto webCom = webDelegate->webComponent_;
685         if (!webCom) {
686             LOGI("webCom is null!");
687             webDelegate->OnError(NTC_ERROR, "fail to call WebDelegate::SetSrc PostTask");
688             return;
689         }
690         auto resRegister = weakRes.Upgrade();
691         if (!resRegister) {
692             if (webDelegate->onError_) {
693                 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
694             }
695             return;
696         }
697         auto context = webDelegate->context_.Upgrade();
698         if (!context) {
699             LOGI("context is null");
700             return;
701         }
702 
703         std::string pageUrl;
704         int32_t pageId;
705         OHOS::Ace::Framework::DelegateClient::GetInstance().GetWebPageUrl(pageUrl, pageId);
706 
707         std::stringstream paramStream;
708         paramStream << NTC_PARAM_WEB << WEB_PARAM_EQUALS << webDelegate->id_ << WEB_PARAM_AND << NTC_PARAM_WIDTH
709                     << WEB_PARAM_EQUALS << size.Width() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_HEIGHT
710                     << WEB_PARAM_EQUALS << size.Height() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_LEFT
711                     << WEB_PARAM_EQUALS << position.GetX() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_TOP
712                     << WEB_PARAM_EQUALS << position.GetY() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_SRC
713                     << WEB_PARAM_EQUALS << webCom->GetSrc() << WEB_PARAM_AND << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS
714                     << pageUrl;
715 
716         std::string param = paramStream.str();
717         webDelegate->id_ = resRegister->CreateResource(WEB_CREATE, param);
718         if (webDelegate->id_ == INVALID_ID) {
719             if (webDelegate->onError_) {
720                 webDelegate->onError_(WEB_ERROR_CODE_CREATEFAIL, WEB_ERROR_MSG_CREATEFAIL);
721             }
722             return;
723         }
724         webDelegate->state_ = State::CREATED;
725         webDelegate->hash_ = webDelegate->MakeResourceHash();
726         webDelegate->RegisterWebEvent();
727         webDelegate->BindRouterBackMethod();
728         webDelegate->BindPopPageSuccessMethod();
729         webDelegate->BindIsPagePathInvalidMethod();
730     });
731 }
732 
InitWebEvent()733 void WebDelegate::InitWebEvent()
734 {
735     auto webCom = webComponent_;
736     if (!webCom) {
737         state_ = State::CREATEFAILED;
738         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
739         return;
740     }
741     if (!webCom->GetPageStartedEventId().IsEmpty()) {
742         onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context_);
743     }
744     if (!webCom->GetPageFinishedEventId().IsEmpty()) {
745         onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context_);
746     }
747     if (!webCom->GetPageErrorEventId().IsEmpty()) {
748         onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context_);
749     }
750     if (!webCom->GetMessageEventId().IsEmpty()) {
751         onMessage_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetMessageEventId(), context_);
752     }
753 }
754 
755 #ifdef OHOS_STANDARD_SYSTEM
ShowWebView()756 void WebDelegate::ShowWebView()
757 {
758     if (window_) {
759         window_->Show();
760     }
761 
762     LOGI("OnContinue webview");
763     OnActive();
764 }
765 
HideWebView()766 void WebDelegate::HideWebView()
767 {
768     if (window_) {
769         window_->Hide();
770     }
771 
772     LOGI("OnPause webview");
773     OnInactive();
774 }
775 
InitOHOSWeb(const WeakPtr<PipelineContext> & context,sptr<Surface> surface)776 void WebDelegate::InitOHOSWeb(const WeakPtr<PipelineContext>& context, sptr<Surface> surface)
777 {
778     state_ = State::CREATING;
779     // obtain hap data path
780     auto container = Container::Current();
781     if (container == nullptr) {
782         LOGE("Fail to get container");
783         return;
784     }
785     const std::string& bundlePath = container->GetBundlePath();
786     const std::string& filesDataPath = container->GetFilesDataPath();
787     std::string baseDir = "base";
788     std::size_t baseIndex = filesDataPath.find(baseDir);
789     if (baseIndex == std::string::npos) {
790         LOGE("Fail to parse hap data base path");
791         return;
792     }
793     std::string dataPath = filesDataPath.substr(0, baseIndex + baseDir.length());
794     bundlePath_ = bundlePath;
795     bundleDataPath_ = dataPath;
796     // load webview so
797     OHOS::NWeb::NWebHelper::Instance().SetBundlePath(bundlePath_);
798     if (!OHOS::NWeb::NWebHelper::Instance().Init()) {
799         LOGE("Fail to init NWebHelper");
800         return;
801     }
802 
803     auto webCom = webComponent_;
804     if (!webCom) {
805         state_ = State::CREATEFAILED;
806         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to webComponent is null");
807         return;
808     }
809     context_ = context;
810     auto pipelineContext = context.Upgrade();
811     if (!pipelineContext) {
812         state_ = State::CREATEFAILED;
813         OnError(NTC_ERROR, "fail to call WebDelegate::Create due to context is null");
814         return;
815     }
816     state_ = State::CREATED;
817 
818     if (!isCreateWebView_) {
819         isCreateWebView_ = true;
820         if (surface != nullptr) {
821             InitWebViewWithSurface(surface);
822         } else {
823             InitWebViewWithWindow();
824         }
825     }
826 
827     SetWebCallBack();
828     if (!pipelineContext->GetIsDeclarative()) {
829         RegisterOHOSWebEventAndMethord();
830     } else {
831         onPageFinishedV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
832             webComponent_->GetPageFinishedEventId(), pipelineContext);
833         onPageStartedV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
834             webComponent_->GetPageStartedEventId(), pipelineContext);
835         onProgressChangeV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
836             webComponent_->GetProgressChangeEventId(), pipelineContext);
837         onTitleReceiveV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
838             webComponent_->GetTitleReceiveEventId(), pipelineContext);
839         onGeolocationHideV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
840             webComponent_->GetGeolocationHideEventId(), pipelineContext);
841         onGeolocationShowV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
842             webComponent_->GetGeolocationShowEventId(), pipelineContext);
843         onFocusV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
844             webComponent_->GetOnFocusEventId(), pipelineContext);
845         onRequestFocusV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
846             webComponent_->GetRequestFocusEventId(), pipelineContext);
847         onErrorReceiveV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
848             webComponent_->GetPageErrorEventId(), pipelineContext);
849         onHttpErrorReceiveV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
850             webComponent_->GetHttpErrorEventId(), pipelineContext);
851         onDownloadStartV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
852             webComponent_->GetDownloadStartEventId(), pipelineContext);
853         onRenderExitedV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
854             webComponent_->GetRenderExitedId(), pipelineContext);
855         onRefreshAccessedHistoryV2_ = AceAsyncEvent<void(const std::shared_ptr<BaseEventInfo>&)>::Create(
856             webComponent_->GetRefreshAccessedHistoryId(), pipelineContext);
857     }
858 }
859 
RegisterOHOSWebEventAndMethord()860 void WebDelegate::RegisterOHOSWebEventAndMethord()
861 {
862     auto reloadCallback = [weak = WeakClaim(this)]() {
863     auto delegate = weak.Upgrade();
864         if (!delegate) {
865             return false;
866         }
867         delegate->Reload();
868         return true;
869     };
870     WebClient::GetInstance().RegisterReloadCallback(reloadCallback);
871 
872     auto webCom = webComponent_;
873     if (!webCom->GetPageStartedEventId().IsEmpty()) {
874         onPageStarted_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageStartedEventId(), context_);
875     }
876     if (!webCom->GetPageFinishedEventId().IsEmpty()) {
877         onPageFinished_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageFinishedEventId(), context_);
878     }
879     if (!webCom->GetPageErrorEventId().IsEmpty()) {
880         onPageError_ = AceAsyncEvent<void(const std::string&)>::Create(webCom->GetPageErrorEventId(), context_);
881     }
882 }
883 
SetWebCallBack()884 void WebDelegate::SetWebCallBack()
885 {
886     auto webController = webComponent_->GetController();
887     if (webController) {
888         auto context = context_.Upgrade();
889         if (!context) {
890             return;
891         }
892         auto uiTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::UI);
893         webController->SetLoadUrlImpl([weak = WeakClaim(this), uiTaskExecutor](
894             std::string url, const std::map<std::string, std::string>& httpHeaders) {
895             uiTaskExecutor.PostTask([weak, url, httpHeaders]() {
896                 auto delegate = weak.Upgrade();
897                 if (delegate) {
898                     delegate->LoadUrl(url, httpHeaders);
899                 }
900             });
901         });
902         webController->SetBackwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
903             uiTaskExecutor.PostTask([weak]() {
904                 auto delegate = weak.Upgrade();
905                 if (delegate) {
906                     delegate->Backward();
907                 }
908             });
909         });
910         webController->SetForwardImpl([weak = WeakClaim(this), uiTaskExecutor]() {
911             uiTaskExecutor.PostTask([weak]() {
912                 auto delegate = weak.Upgrade();
913                 if (delegate) {
914                     delegate->Forward();
915                 }
916             });
917         });
918         webController->SetClearHistoryImpl([weak = WeakClaim(this), uiTaskExecutor]() {
919             uiTaskExecutor.PostTask([weak]() {
920                 auto delegate = weak.Upgrade();
921                 if (delegate) {
922                     delegate->ClearHistory();
923                 }
924             });
925         });
926         webController->SetAccessStepImpl([weak = WeakClaim(this)](int32_t step) {
927             auto delegate = weak.Upgrade();
928             if (delegate) {
929                 return delegate->AccessStep(step);
930             }
931             return false;
932         });
933         webController->SetAccessBackwardImpl([weak = WeakClaim(this)]() {
934             auto delegate = weak.Upgrade();
935             if (delegate) {
936                 return delegate->AccessBackward();
937             }
938             return false;
939         });
940         webController->SetAccessForwardImpl([weak = WeakClaim(this)]() {
941             auto delegate = weak.Upgrade();
942             if (delegate) {
943                 return delegate->AccessForward();
944             }
945             return false;
946         });
947         webController->SetExecuteTypeScriptImpl([weak = WeakClaim(this), uiTaskExecutor](
948             std::string jscode, std::function<void(const std::string)>&& callback) {
949             uiTaskExecutor.PostTask([weak, jscode, callback]() {
950                 auto delegate = weak.Upgrade();
951                 if (delegate) {
952                     delegate->ExecuteTypeScript(jscode, std::move(callback));
953                 }
954             });
955         });
956         webController->SetLoadDataWithBaseUrlImpl(
957             [weak = WeakClaim(this), uiTaskExecutor](std::string baseUrl, std::string data, std::string mimeType,
958                 std::string encoding, std::string historyUrl) {
959                 uiTaskExecutor.PostTask([weak, baseUrl, data, mimeType, encoding, historyUrl]() {
960                     auto delegate = weak.Upgrade();
961                     if (delegate) {
962                         delegate->LoadDataWithBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
963                     }
964                 });
965             });
966         webController->SetRefreshImpl(
967             [weak = WeakClaim(this), uiTaskExecutor]() {
968                 uiTaskExecutor.PostTask([weak]() {
969                     auto delegate = weak.Upgrade();
970                     if (delegate) {
971                         delegate->Refresh();
972                     }
973                 });
974             });
975         webController->SetStopLoadingImpl(
976             [weak = WeakClaim(this), uiTaskExecutor]() {
977                 uiTaskExecutor.PostTask([weak]() {
978                     auto delegate = weak.Upgrade();
979                     if (delegate) {
980                         delegate->StopLoading();
981                     }
982                 });
983             });
984         webController->SetGetHitTestResultImpl(
985             [weak = WeakClaim(this)]() {
986                 auto delegate = weak.Upgrade();
987                 if (delegate) {
988                     return delegate->GetHitTestResult();
989                 }
990                 return 0;
991             });
992         webController->SetSaveCookieSyncImpl(
993             [weak = WeakClaim(this)]() {
994                 auto delegate = weak.Upgrade();
995                 if (delegate) {
996                     return delegate->SaveCookieSync();
997                 }
998                 return false;
999             });
1000         webController->SetSetCookieImpl(
1001             [weak = WeakClaim(this)](const std::string& url, const std::string& value) {
1002                 auto delegate = weak.Upgrade();
1003                 if (delegate) {
1004                     return delegate->SetCookie(url, value);
1005                 }
1006                 return false;
1007             });
1008         webController->SetGetCookieImpl(
1009             [weak = WeakClaim(this)](const std::string& url) {
1010                 auto delegate = weak.Upgrade();
1011                 if (delegate) {
1012                     return delegate->GetCookie(url);
1013                 }
1014                 return std::string();
1015             });
1016         webController->SetDeleteEntirelyCookieImpl(
1017             [weak = WeakClaim(this)]() {
1018                 auto delegate = weak.Upgrade();
1019                 if (delegate) {
1020                     delegate->DeleteEntirelyCookie();
1021                 }
1022             });
1023         webController->SetWebViewJavaScriptResultCallBackImpl([weak = WeakClaim(this), uiTaskExecutor](
1024             WebController::JavaScriptCallBackImpl&& javaScriptCallBackImpl) {
1025                 uiTaskExecutor.PostTask([weak, javaScriptCallBackImpl]() {
1026                     auto delegate = weak.Upgrade();
1027                     if (delegate) {
1028                         delegate->SetWebViewJavaScriptResultCallBack(std::move(javaScriptCallBackImpl));
1029                     }
1030                 });
1031             });
1032         webController->SetAddJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](
1033             std::string objectName, const std::vector<std::string>& methodList) {
1034                 uiTaskExecutor.PostTask([weak, objectName, methodList]() {
1035                     auto delegate = weak.Upgrade();
1036                     if (delegate) {
1037                         delegate->AddJavascriptInterface(objectName, methodList);
1038                     }
1039                 });
1040             });
1041         webController->LoadInitJavascriptInterface();
1042         webController->SetRemoveJavascriptInterfaceImpl([weak = WeakClaim(this), uiTaskExecutor](
1043             std::string objectName, const std::vector<std::string>& methodList) {
1044                 uiTaskExecutor.PostTask([weak, objectName, methodList]() {
1045                     auto delegate = weak.Upgrade();
1046                     if (delegate) {
1047                         delegate->RemoveJavascriptInterface(objectName, methodList);
1048                     }
1049                 });
1050             });
1051         webController->SetOnInactiveImpl(
1052             [weak = WeakClaim(this), uiTaskExecutor]() {
1053                 uiTaskExecutor.PostTask([weak]() {
1054                     auto delegate = weak.Upgrade();
1055                     if (delegate) {
1056                         delegate->OnInactive();
1057                     }
1058                 });
1059             });
1060         webController->SetOnActiveImpl(
1061             [weak = WeakClaim(this), uiTaskExecutor]() {
1062                 uiTaskExecutor.PostTask([weak]() {
1063                     auto delegate = weak.Upgrade();
1064                     if (delegate) {
1065                         delegate->OnActive();
1066                     }
1067                 });
1068             });
1069         webController->SetZoomImpl(
1070             [weak = WeakClaim(this), uiTaskExecutor](float factor) {
1071                 uiTaskExecutor.PostTask([weak, factor]() {
1072                     auto delegate = weak.Upgrade();
1073                     if (delegate) {
1074                         delegate->Zoom(factor);
1075                     }
1076                 });
1077             });
1078         webController->SetOnFocusImpl(
1079             [weak = WeakClaim(this), uiTaskExecutor]() {
1080                 uiTaskExecutor.PostTask([weak]() {
1081                     auto delegate = weak.Upgrade();
1082                     if (delegate) {
1083                         delegate->OnFocus();
1084                     }
1085                 });
1086             });
1087         webController->SetRequestFocusImpl(
1088             [weak = WeakClaim(this), uiTaskExecutor]() {
1089                 uiTaskExecutor.PostTask([weak]() {
1090                     auto delegate = weak.Upgrade();
1091                     if (delegate) {
1092                         delegate->RequestFocus();
1093                     }
1094                 });
1095             });
1096     }
1097 }
1098 
InitWebViewWithWindow()1099 void WebDelegate::InitWebViewWithWindow()
1100 {
1101     LOGI("Create webview with window");
1102     auto context = context_.Upgrade();
1103     if (!context) {
1104         return;
1105     }
1106     context->GetTaskExecutor()->PostTask(
1107         [weak = WeakClaim(this)]() {
1108             auto delegate = weak.Upgrade();
1109             if (!delegate) {
1110                 return;
1111             }
1112             OHOS::NWeb::NWebInitArgs initArgs;
1113             std::string app_path = GetDataPath();
1114             if (!app_path.empty()) {
1115                 initArgs.web_engine_args_to_add.push_back(std::string("--user-data-dir=").append(app_path));
1116             }
1117 
1118             delegate->window_ = delegate->CreateWindow();
1119             if (!delegate->window_) {
1120                 return;
1121             }
1122             delegate->nweb_ =
1123                 OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(delegate->window_.GetRefPtr(), initArgs);
1124             if (delegate->nweb_ == nullptr) {
1125                 delegate->window_ = nullptr;
1126                 LOGE("fail to get webview instance");
1127                 return;
1128             }
1129             delegate->cookieManager_ =
1130                 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
1131             if (delegate->cookieManager_ == nullptr) {
1132                 LOGE("fail to get webview instance");
1133                 return;
1134             }
1135             auto component = delegate->webComponent_;
1136             if (!component) {
1137                 return;
1138             }
1139             bool isJsEnabled = component->GetJsEnabled();
1140             bool isContentAccessEnabled = component->GetContentAccessEnabled();
1141             bool isFileAccessEnabled = component->GetFileAccessEnabled();
1142 
1143             auto webviewClient = std::make_shared<WebClientImpl>(Container::CurrentId());
1144             webviewClient->SetWebDelegate(weak);
1145             delegate->nweb_->SetNWebHandler(webviewClient);
1146 
1147             // Set downloadListenerImpl
1148             auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>(Container::CurrentId());
1149             downloadListenerImpl->SetWebDelegate(weak);
1150             delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
1151 
1152             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1153             setting->PutDomStorageEnabled(true);
1154             setting->PutIsCreateWindowsByJavaScriptAllowed(true);
1155             setting->PutJavaScriptEnabled(isJsEnabled);
1156             setting->PutEnableRawFileAccess(isFileAccessEnabled);
1157             setting->PutEnableContentAccess(isContentAccessEnabled);
1158 
1159             delegate->nweb_->Load(component->GetSrc());
1160             delegate->window_->Show();
1161         },
1162         TaskExecutor::TaskType::PLATFORM);
1163 }
1164 
1165 #if defined(ENABLE_ROSEN_BACKEND)
InitWebViewWithSurface(sptr<Surface> surface)1166 void WebDelegate::InitWebViewWithSurface(sptr<Surface> surface)
1167 {
1168     LOGI("Create webview with surface");
1169     auto context = context_.Upgrade();
1170     if (!context || !surface) {
1171         return;
1172     }
1173     context->GetTaskExecutor()->PostTask(
1174         [weak = WeakClaim(this), surface]() {
1175             wptr<Surface> surfaceWeak(surface);
1176             auto delegate = weak.Upgrade();
1177             if (!delegate) {
1178                 return;
1179             }
1180             OHOS::NWeb::NWebInitArgs initArgs;
1181             initArgs.web_engine_args_to_add.push_back(
1182                 std::string("--user-data-dir=").append(delegate->bundleDataPath_));
1183             initArgs.web_engine_args_to_add.push_back(
1184                 std::string("--bundle-installation-dir=").append(delegate->bundlePath_));
1185             sptr<Surface> surface = surfaceWeak.promote();
1186             if (surface == nullptr) {
1187                 LOGE("surface is nullptr or has expired");
1188                 return;
1189             }
1190             delegate->nweb_ =
1191                 OHOS::NWeb::NWebAdapterHelper::Instance().CreateNWeb(surface, initArgs);
1192             if (delegate->nweb_ == nullptr) {
1193                 LOGE("fail to get webview instance");
1194                 return;
1195             }
1196             delegate->cookieManager_ =
1197                 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
1198             if (delegate->cookieManager_ == nullptr) {
1199                 LOGE("fail to get webview instance");
1200                 return;
1201             }
1202             auto component = delegate->webComponent_;
1203             if (component == nullptr) {
1204                 return;
1205             }
1206             if (!component->GetData().empty()) {
1207                 delegate->LoadDataWithRichText(component->GetData());
1208             }
1209             auto nweb_handler = std::make_shared<WebClientImpl>(Container::CurrentId());
1210             nweb_handler->SetWebDelegate(weak);
1211             auto downloadListenerImpl = std::make_shared<DownloadListenerImpl>(Container::CurrentId());
1212             downloadListenerImpl->SetWebDelegate(weak);
1213             delegate->nweb_->SetNWebHandler(nweb_handler);
1214             delegate->nweb_->PutDownloadCallback(downloadListenerImpl);
1215 
1216             std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1217             setting->PutDomStorageEnabled(component->GetDomStorageAccessEnabled());
1218             setting->PutIsCreateWindowsByJavaScriptAllowed(true);
1219             setting->PutJavaScriptEnabled(component->GetJsEnabled());
1220             setting->PutEnableRawFileAccess(component->GetFileAccessEnabled());
1221             setting->PutEnableContentAccess(component->GetContentAccessEnabled());
1222             setting->PutLoadImageFromNetworkDisabled(component->GetOnLineImageAccessEnabled());
1223             setting->PutImageLoadingAllowed(component->GetImageAccessEnabled());
1224             setting->PutAccessModeForSecureOriginLoadFromInsecure(
1225                 static_cast<OHOS::NWeb::NWebPreference::AccessMode>(component->GetMixedMode()));
1226             setting->PutZoomingFunctionEnabled(component->GetZoomAccessEnabled());
1227             setting->PutGeolocationAllowed(component->GetGeolocationAccessEnabled());
1228             setting->PutCacheMode(
1229                 static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(component->GetCacheMode()));
1230             setting->PutLoadWithOverviewMode(component->GetOverviewModeAccessEnabled());
1231             setting->PutEnableRawFileAccessFromFileURLs(component->GetFileFromUrlAccessEnabled());
1232             setting->PutDatabaseAllowed(component->GetDatabaseAccessEnabled());
1233             setting->PutZoomingForTextFactor(component->GetTextZoomAtio());
1234             setting->PutWebDebuggingAccess(component->GetWebDebuggingAccessEnabled());
1235         },
1236         TaskExecutor::TaskType::PLATFORM);
1237 }
1238 #endif
1239 
UpdateUserAgent(const std::string & userAgent)1240 void WebDelegate::UpdateUserAgent(const std::string& userAgent)
1241 {
1242     auto context = context_.Upgrade();
1243     if (!context) {
1244         return;
1245     }
1246     context->GetTaskExecutor()->PostTask(
1247         [weak = WeakClaim(this), userAgent]() {
1248             auto delegate = weak.Upgrade();
1249             if (delegate && delegate->nweb_) {
1250                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1251                 setting->PutUserAgent(userAgent);
1252             }
1253         },
1254         TaskExecutor::TaskType::PLATFORM);
1255 }
1256 
Resize(const double & width,const double & height)1257 void WebDelegate::Resize(const double& width, const double& height)
1258 {
1259     auto context = context_.Upgrade();
1260     if (!context) {
1261         return;
1262     }
1263     context->GetTaskExecutor()->PostTask(
1264         [weak = WeakClaim(this), width, height] () {
1265             auto delegate = weak.Upgrade();
1266             if (delegate && delegate->nweb_ && !delegate->window_) {
1267                 delegate->nweb_->Resize(width, height);
1268             }
1269         },
1270         TaskExecutor::TaskType::PLATFORM);
1271 }
1272 
UpdateJavaScriptEnabled(const bool & isJsEnabled)1273 void WebDelegate::UpdateJavaScriptEnabled(const bool& isJsEnabled)
1274 {
1275     auto context = context_.Upgrade();
1276     if (!context) {
1277         return;
1278     }
1279     context->GetTaskExecutor()->PostTask(
1280         [weak = WeakClaim(this), isJsEnabled]() {
1281             auto delegate = weak.Upgrade();
1282             if (delegate && delegate->nweb_) {
1283                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1284                 setting->PutJavaScriptEnabled(isJsEnabled);
1285             }
1286         },
1287         TaskExecutor::TaskType::PLATFORM);
1288 }
1289 
UpdateAllowFileAccess(const bool & isFileAccessEnabled)1290 void WebDelegate::UpdateAllowFileAccess(const bool& isFileAccessEnabled)
1291 {
1292     auto context = context_.Upgrade();
1293     if (!context) {
1294         return;
1295     }
1296     context->GetTaskExecutor()->PostTask(
1297         [weak = WeakClaim(this), isFileAccessEnabled]() {
1298             auto delegate = weak.Upgrade();
1299             if (delegate && delegate->nweb_) {
1300                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1301                 setting->PutEnableRawFileAccess(isFileAccessEnabled);
1302             }
1303         },
1304         TaskExecutor::TaskType::PLATFORM);
1305 }
1306 
UpdateBlockNetworkImage(const bool & onLineImageAccessEnabled)1307 void WebDelegate::UpdateBlockNetworkImage(const bool& onLineImageAccessEnabled)
1308 {
1309     auto context = context_.Upgrade();
1310     if (!context) {
1311         return;
1312     }
1313     context->GetTaskExecutor()->PostTask(
1314         [weak = WeakClaim(this), onLineImageAccessEnabled]() {
1315             auto delegate = weak.Upgrade();
1316             if (delegate && delegate->nweb_) {
1317                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1318                 setting->PutLoadImageFromNetworkDisabled(onLineImageAccessEnabled);
1319             }
1320         },
1321         TaskExecutor::TaskType::PLATFORM);
1322 }
1323 
UpdateLoadsImagesAutomatically(const bool & isImageAccessEnabled)1324 void WebDelegate::UpdateLoadsImagesAutomatically(const bool& isImageAccessEnabled)
1325 {
1326     auto context = context_.Upgrade();
1327     if (!context) {
1328         return;
1329     }
1330     context->GetTaskExecutor()->PostTask(
1331         [weak = WeakClaim(this), isImageAccessEnabled]() {
1332             auto delegate = weak.Upgrade();
1333             if (delegate && delegate->nweb_) {
1334                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1335                 setting->PutImageLoadingAllowed(isImageAccessEnabled);
1336             }
1337         },
1338         TaskExecutor::TaskType::PLATFORM);
1339 }
1340 
UpdateMixedContentMode(const MixedModeContent & mixedMode)1341 void WebDelegate::UpdateMixedContentMode(const MixedModeContent& mixedMode)
1342 {
1343     auto context = context_.Upgrade();
1344     if (!context) {
1345         return;
1346     }
1347     context->GetTaskExecutor()->PostTask(
1348         [weak = WeakClaim(this), mixedMode]() {
1349             auto delegate = weak.Upgrade();
1350             if (delegate && delegate->nweb_) {
1351                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1352                 setting->PutAccessModeForSecureOriginLoadFromInsecure(
1353                     static_cast<OHOS::NWeb::NWebPreference::AccessMode>(mixedMode));
1354             }
1355         },
1356         TaskExecutor::TaskType::PLATFORM);
1357 }
1358 
UpdateSupportZoom(const bool & isZoomAccessEnabled)1359 void WebDelegate::UpdateSupportZoom(const bool& isZoomAccessEnabled)
1360 {
1361     auto context = context_.Upgrade();
1362     if (!context) {
1363         return;
1364     }
1365     context->GetTaskExecutor()->PostTask(
1366         [weak = WeakClaim(this), isZoomAccessEnabled]() {
1367             auto delegate = weak.Upgrade();
1368             if (delegate && delegate->nweb_) {
1369                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1370                 setting->PutZoomingFunctionEnabled(isZoomAccessEnabled);
1371             }
1372         },
1373         TaskExecutor::TaskType::PLATFORM);
1374 }
UpdateDomStorageEnabled(const bool & isDomStorageAccessEnabled)1375 void WebDelegate::UpdateDomStorageEnabled(const bool& isDomStorageAccessEnabled)
1376 {
1377     auto context = context_.Upgrade();
1378     if (!context) {
1379         return;
1380     }
1381     context->GetTaskExecutor()->PostTask(
1382         [weak = WeakClaim(this), isDomStorageAccessEnabled]() {
1383             auto delegate = weak.Upgrade();
1384             if (delegate && delegate->nweb_) {
1385                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1386                 setting->PutDomStorageEnabled(isDomStorageAccessEnabled);
1387             }
1388         },
1389         TaskExecutor::TaskType::PLATFORM);
1390 }
UpdateGeolocationEnabled(const bool & isGeolocationAccessEnabled)1391 void WebDelegate::UpdateGeolocationEnabled(const bool& isGeolocationAccessEnabled)
1392 {
1393     auto context = context_.Upgrade();
1394     if (!context) {
1395         return;
1396     }
1397     context->GetTaskExecutor()->PostTask(
1398         [weak = WeakClaim(this), isGeolocationAccessEnabled]() {
1399             auto delegate = weak.Upgrade();
1400             if (delegate && delegate->nweb_) {
1401                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1402                 setting->PutGeolocationAllowed(isGeolocationAccessEnabled);
1403             }
1404         },
1405         TaskExecutor::TaskType::PLATFORM);
1406 }
1407 
UpdateCacheMode(const WebCacheMode & mode)1408 void WebDelegate::UpdateCacheMode(const WebCacheMode& mode)
1409 {
1410     auto context = context_.Upgrade();
1411     if (!context) {
1412         return;
1413     }
1414     context->GetTaskExecutor()->PostTask(
1415         [weak = WeakClaim(this), mode]() {
1416             auto delegate = weak.Upgrade();
1417             if (delegate && delegate->nweb_) {
1418                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1419                 setting->PutCacheMode(static_cast<OHOS::NWeb::NWebPreference::CacheModeFlag>(mode));
1420             }
1421         },
1422         TaskExecutor::TaskType::PLATFORM);
1423 }
1424 
UpdateOverviewModeEnabled(const bool & isOverviewModeAccessEnabled)1425 void WebDelegate::UpdateOverviewModeEnabled(const bool& isOverviewModeAccessEnabled)
1426 {
1427     auto context = context_.Upgrade();
1428     if (!context) {
1429         return;
1430     }
1431     context->GetTaskExecutor()->PostTask(
1432         [weak = WeakClaim(this), isOverviewModeAccessEnabled]() {
1433             auto delegate = weak.Upgrade();
1434             if (delegate && delegate->nweb_) {
1435                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1436                 setting->PutLoadWithOverviewMode(isOverviewModeAccessEnabled);
1437             }
1438         },
1439         TaskExecutor::TaskType::PLATFORM);
1440 }
1441 
UpdateFileFromUrlEnabled(const bool & isFileFromUrlAccessEnabled)1442 void WebDelegate::UpdateFileFromUrlEnabled(const bool& isFileFromUrlAccessEnabled)
1443 {
1444     auto context = context_.Upgrade();
1445     if (!context) {
1446         return;
1447     }
1448     context->GetTaskExecutor()->PostTask(
1449         [weak = WeakClaim(this), isFileFromUrlAccessEnabled]() {
1450             auto delegate = weak.Upgrade();
1451             if (delegate && delegate->nweb_) {
1452                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1453                 setting->PutEnableRawFileAccessFromFileURLs(isFileFromUrlAccessEnabled);
1454             }
1455         },
1456         TaskExecutor::TaskType::PLATFORM);
1457 }
1458 
UpdateDatabaseEnabled(const bool & isDatabaseAccessEnabled)1459 void WebDelegate::UpdateDatabaseEnabled(const bool& isDatabaseAccessEnabled)
1460 {
1461     auto context = context_.Upgrade();
1462     if (!context) {
1463         return;
1464     }
1465     context->GetTaskExecutor()->PostTask(
1466         [weak = WeakClaim(this), isDatabaseAccessEnabled]() {
1467             auto delegate = weak.Upgrade();
1468             if (delegate && delegate->nweb_) {
1469                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1470                 setting->PutDatabaseAllowed(isDatabaseAccessEnabled);
1471             }
1472         },
1473         TaskExecutor::TaskType::PLATFORM);
1474 }
1475 
UpdateTextZoomAtio(const int32_t & textZoomAtioNum)1476 void WebDelegate::UpdateTextZoomAtio(const int32_t& textZoomAtioNum)
1477 {
1478     auto context = context_.Upgrade();
1479     if (!context) {
1480         return;
1481     }
1482     context->GetTaskExecutor()->PostTask(
1483         [weak = WeakClaim(this), textZoomAtioNum]() {
1484             auto delegate = weak.Upgrade();
1485             if (delegate && delegate->nweb_) {
1486                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1487                 setting->PutZoomingForTextFactor(textZoomAtioNum);
1488             }
1489         },
1490         TaskExecutor::TaskType::PLATFORM);
1491 }
1492 
UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)1493 void WebDelegate::UpdateWebDebuggingAccess(bool isWebDebuggingAccessEnabled)
1494 {
1495     auto context = context_.Upgrade();
1496     if (!context) {
1497         return;
1498     }
1499     context->GetTaskExecutor()->PostTask(
1500         [weak = WeakClaim(this), isWebDebuggingAccessEnabled]() {
1501             auto delegate = weak.Upgrade();
1502             if (delegate && delegate->nweb_) {
1503                 std::shared_ptr<OHOS::NWeb::NWebPreference> setting = delegate->nweb_->GetPreference();
1504                 setting->PutWebDebuggingAccess(isWebDebuggingAccessEnabled);
1505             }
1506         },
1507         TaskExecutor::TaskType::PLATFORM);
1508 }
1509 
LoadUrl()1510 void WebDelegate::LoadUrl()
1511 {
1512     auto context = context_.Upgrade();
1513     if (!context) {
1514         return;
1515     }
1516     context->GetTaskExecutor()->PostTask(
1517         [weak = WeakClaim(this)] () {
1518             auto delegate = weak.Upgrade();
1519             if (delegate && delegate->nweb_) {
1520                 delegate->nweb_->Load(delegate->webComponent_->GetSrc());
1521             }
1522         },
1523         TaskExecutor::TaskType::PLATFORM);
1524 }
1525 
OnInactive()1526 void WebDelegate::OnInactive()
1527 {
1528     auto context = context_.Upgrade();
1529     if (!context) {
1530         return;
1531     }
1532     context->GetTaskExecutor()->PostTask(
1533         [weak = WeakClaim(this)]() {
1534             auto delegate = weak.Upgrade();
1535             if (!delegate) {
1536                 return;
1537             }
1538             if (delegate->nweb_) {
1539                 delegate->nweb_->OnPause();
1540             }
1541         },
1542         TaskExecutor::TaskType::PLATFORM);
1543 }
1544 
OnActive()1545 void WebDelegate::OnActive()
1546 {
1547     auto context = context_.Upgrade();
1548     if (!context) {
1549         return;
1550     }
1551     context->GetTaskExecutor()->PostTask(
1552         [weak = WeakClaim(this)]() {
1553             auto delegate = weak.Upgrade();
1554             if (!delegate) {
1555                 return;
1556             }
1557             if (delegate->nweb_) {
1558                 delegate->nweb_->OnContinue();
1559             }
1560         },
1561         TaskExecutor::TaskType::PLATFORM);
1562 }
1563 
Zoom(float factor)1564 void WebDelegate::Zoom(float factor)
1565 {
1566     auto context = context_.Upgrade();
1567     if (!context) {
1568         return;
1569     }
1570 
1571     context->GetTaskExecutor()->PostTask(
1572         [weak = WeakClaim(this), factor]() {
1573             auto delegate = weak.Upgrade();
1574             if (!delegate) {
1575                 LOGE("Get delegate failed, it is null.");
1576                 return;
1577             }
1578             if (delegate->nweb_) {
1579                 delegate->nweb_->Zoom(factor);
1580             }
1581         },
1582         TaskExecutor::TaskType::PLATFORM);
1583 }
1584 
OnFocus()1585 void WebDelegate::OnFocus()
1586 {
1587     if (onFocusV2_) {
1588         onFocusV2_(std::make_shared<LoadWebOnFocusEvent>(""));
1589     }
1590 }
1591 
CreateWindow()1592 sptr<OHOS::Rosen::Window> WebDelegate::CreateWindow()
1593 {
1594     auto context = context_.Upgrade();
1595     if (!context) {
1596         return nullptr;
1597     }
1598     float scale = context->GetViewScale();
1599 
1600     constexpr int DEFAULT_HEIGHT = 1600;
1601     int DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR = (int)(scale * context->GetRootHeight());
1602     int DEFAULT_STATUS_BAR_HEIGHT = (DEFAULT_HEIGHT - DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR) / 2;
1603     constexpr int DEFAULT_LEFT = 0;
1604     int DEFAULT_TOP = DEFAULT_STATUS_BAR_HEIGHT;
1605     int DEFAULT_WIDTH = (int)(scale * context->GetRootWidth());
1606     sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
1607     option->SetWindowRect({ DEFAULT_LEFT, DEFAULT_TOP, DEFAULT_WIDTH, DEFAULT_HEIGHT_WITHOUT_SYSTEM_BAR });
1608     option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_LAUNCHING);
1609     option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
1610     auto window = Rosen::Window::Create("ohos_web_window", option);
1611     return window;
1612 }
1613 #endif
1614 
RegisterWebEvent()1615 void WebDelegate::RegisterWebEvent()
1616 {
1617     auto context = context_.Upgrade();
1618     if (!context) {
1619         return;
1620     }
1621     auto resRegister = context->GetPlatformResRegister();
1622     if (resRegister == nullptr) {
1623         return;
1624     }
1625     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGESTART), [weak = WeakClaim(this)](const std::string& param) {
1626         auto delegate = weak.Upgrade();
1627         if (delegate) {
1628             delegate->OnPageStarted(param);
1629         }
1630     });
1631     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEFINISH), [weak = WeakClaim(this)](const std::string& param) {
1632         auto delegate = weak.Upgrade();
1633         if (delegate) {
1634             delegate->OnPageFinished(param);
1635         }
1636     });
1637     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_PAGEERROR), [weak = WeakClaim(this)](const std::string& param) {
1638         auto delegate = weak.Upgrade();
1639         if (delegate) {
1640             delegate->OnPageError(param);
1641         }
1642     });
1643     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ROUTERPUSH), [weak = WeakClaim(this)](const std::string& param) {
1644         auto delegate = weak.Upgrade();
1645         if (delegate) {
1646             delegate->OnRouterPush(param);
1647         }
1648     });
1649     resRegister->RegisterEvent(MakeEventHash(WEB_EVENT_ONMESSAGE), [weak = WeakClaim(this)](const std::string& param) {
1650         auto delegate = weak.Upgrade();
1651         if (delegate) {
1652             delegate->OnMessage(param);
1653         }
1654     });
1655 }
1656 
1657 // upper ui component which inherited from WebComponent
1658 // could implement some curtain createdCallback to customized controller interface
1659 // eg: web.loadurl.
AddCreatedCallback(const CreatedCallback & createdCallback)1660 void WebDelegate::AddCreatedCallback(const CreatedCallback& createdCallback)
1661 {
1662     ACE_DCHECK(createdCallback != nullptr);
1663     ACE_DCHECK(state_ != State::RELEASED);
1664     createdCallbacks_.emplace_back(createdCallback);
1665 }
1666 
RemoveCreatedCallback()1667 void WebDelegate::RemoveCreatedCallback()
1668 {
1669     ACE_DCHECK(state_ != State::RELEASED);
1670     createdCallbacks_.pop_back();
1671 }
1672 
AddReleasedCallback(const ReleasedCallback & releasedCallback)1673 void WebDelegate::AddReleasedCallback(const ReleasedCallback& releasedCallback)
1674 {
1675     ACE_DCHECK(releasedCallback != nullptr && state_ != State::RELEASED);
1676     releasedCallbacks_.emplace_back(releasedCallback);
1677 }
1678 
RemoveReleasedCallback()1679 void WebDelegate::RemoveReleasedCallback()
1680 {
1681     ACE_DCHECK(state_ != State::RELEASED);
1682     releasedCallbacks_.pop_back();
1683 }
1684 
Reload()1685 void WebDelegate::Reload()
1686 {
1687 #ifdef OHOS_STANDARD_SYSTEM
1688     auto context = context_.Upgrade();
1689     if (!context) {
1690         return;
1691     }
1692     context->GetTaskExecutor()->PostTask(
1693         [weak = WeakClaim(this)]() {
1694             auto delegate = weak.Upgrade();
1695             if (!delegate) {
1696                 return;
1697             }
1698             if (delegate->nweb_) {
1699                 delegate->nweb_->Reload();
1700             }
1701         },
1702         TaskExecutor::TaskType::PLATFORM);
1703 #else
1704     hash_ = MakeResourceHash();
1705     reloadMethod_ = MakeMethodHash("reload");
1706     CallResRegisterMethod(reloadMethod_, WEB_PARAM_NONE, nullptr);
1707 #endif
1708 }
1709 
UpdateUrl(const std::string & url)1710 void WebDelegate::UpdateUrl(const std::string& url)
1711 {
1712     hash_ = MakeResourceHash();
1713     updateUrlMethod_ = MakeMethodHash(WEB_METHOD_UPDATEURL);
1714     std::stringstream paramStream;
1715     paramStream << NTC_PARAM_SRC << WEB_PARAM_EQUALS << url;
1716     std::string param = paramStream.str();
1717     CallResRegisterMethod(updateUrlMethod_, param, nullptr);
1718 }
1719 
CallWebRouterBack()1720 void WebDelegate::CallWebRouterBack()
1721 {
1722     hash_ = MakeResourceHash();
1723     routerBackMethod_ = MakeMethodHash(WEB_METHOD_ROUTER_BACK);
1724     CallResRegisterMethod(routerBackMethod_, WEB_PARAM_NONE, nullptr);
1725 }
1726 
CallPopPageSuccessPageUrl(const std::string & url)1727 void WebDelegate::CallPopPageSuccessPageUrl(const std::string& url)
1728 {
1729     hash_ = MakeResourceHash();
1730     changePageUrlMethod_ = MakeMethodHash(WEB_METHOD_CHANGE_PAGE_URL);
1731     std::stringstream paramStream;
1732     paramStream << NTC_PARAM_PAGE_URL << WEB_PARAM_EQUALS << url;
1733     std::string param = paramStream.str();
1734     CallResRegisterMethod(changePageUrlMethod_, param, nullptr);
1735 }
1736 
CallIsPagePathInvalid(const bool & isPageInvalid)1737 void WebDelegate::CallIsPagePathInvalid(const bool& isPageInvalid)
1738 {
1739     hash_ = MakeResourceHash();
1740     isPagePathInvalidMethod_ = MakeMethodHash(WEB_METHOD_PAGE_PATH_INVALID);
1741     std::stringstream paramStream;
1742     paramStream << NTC_PARAM_PAGE_INVALID << WEB_PARAM_EQUALS << isPageInvalid;
1743     std::string param = paramStream.str();
1744     CallResRegisterMethod(isPagePathInvalidMethod_, param, nullptr);
1745 }
1746 
OnPageStarted(const std::string & param)1747 void WebDelegate::OnPageStarted(const std::string& param)
1748 {
1749     if (onPageStarted_) {
1750         std::string paramStart = std::string(R"(")").append(param).append(std::string(R"(")"));
1751         std::string urlParam = std::string(R"("pagestart",{"url":)").append(paramStart.append("},null"));
1752         onPageStarted_(urlParam);
1753     }
1754 
1755     // ace 2.0
1756     if (onPageStartedV2_) {
1757         onPageStartedV2_(std::make_shared<LoadWebPageStartEvent>(param));
1758     }
1759 }
1760 
OnPageFinished(const std::string & param)1761 void WebDelegate::OnPageFinished(const std::string& param)
1762 {
1763     if (onPageFinished_) {
1764         std::string paramFinish = std::string(R"(")").append(param).append(std::string(R"(")"));
1765         std::string urlParam = std::string(R"("pagefinish",{"url":)").append(paramFinish.append("},null"));
1766         onPageFinished_(urlParam);
1767     }
1768     // ace 2.0
1769     if (onPageFinishedV2_) {
1770         onPageFinishedV2_(std::make_shared<LoadWebPageFinishEvent>(param));
1771     }
1772 }
1773 
OnProgressChanged(int param)1774 void WebDelegate::OnProgressChanged(int param)
1775 {
1776     // ace 2.0
1777     if (onProgressChangeV2_) {
1778         onProgressChangeV2_(std::make_shared<LoadWebProgressChangeEvent>(param));
1779     }
1780 }
1781 
OnReceivedTitle(const std::string & param)1782 void WebDelegate::OnReceivedTitle(const std::string& param)
1783 {
1784     // ace 2.0
1785     if (onTitleReceiveV2_) {
1786         onTitleReceiveV2_(std::make_shared<LoadWebTitleReceiveEvent>(param));
1787     }
1788 }
1789 
OnGeolocationPermissionsHidePrompt()1790 void WebDelegate::OnGeolocationPermissionsHidePrompt()
1791 {
1792     // ace 2.0
1793     if (onGeolocationHideV2_) {
1794         onGeolocationHideV2_(std::make_shared<LoadWebGeolocationHideEvent>(""));
1795     }
1796 }
1797 
OnGeolocationPermissionsShowPrompt(const std::string & origin,OHOS::NWeb::NWebGeolocationCallbackInterface * callback)1798 void WebDelegate::OnGeolocationPermissionsShowPrompt(const std::string& origin,
1799     OHOS::NWeb::NWebGeolocationCallbackInterface* callback)
1800 {
1801     // ace 2.0
1802     if (onGeolocationShowV2_) {
1803         auto geolocation = AceType::MakeRefPtr<WebGeolocationOhos>(callback);
1804         onGeolocationShowV2_(std::make_shared<LoadWebGeolocationShowEvent>(origin, geolocation));
1805     }
1806 }
1807 
OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)1808 bool WebDelegate::OnConsoleLog(std::shared_ptr<OHOS::NWeb::NWebConsoleLog> message)
1809 {
1810     auto param = std::make_shared<LoadWebConsoleLogEvent>(AceType::MakeRefPtr<ConsoleLogOhos>(message));
1811     return webComponent_->OnConsole(param.get());
1812 }
1813 
OnCommonDialog(const BaseEventInfo * info,DialogEventType dialogEventType)1814 bool WebDelegate::OnCommonDialog(const BaseEventInfo* info, DialogEventType dialogEventType)
1815 {
1816     return webComponent_->OnCommonDialog(info, dialogEventType);
1817 }
1818 
OnDownloadStart(const std::string & url,const std::string & userAgent,const std::string & contentDisposition,const std::string & mimetype,long contentLength)1819 void WebDelegate::OnDownloadStart(const std::string& url, const std::string& userAgent,
1820     const std::string& contentDisposition, const std::string& mimetype, long contentLength)
1821 {
1822     if (onDownloadStartV2_) {
1823         onDownloadStartV2_(std::make_shared<DownloadStartEvent>(url, userAgent, contentDisposition,
1824             mimetype, contentLength));
1825     }
1826 }
1827 
OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)1828 void WebDelegate::OnErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
1829     std::shared_ptr<OHOS::NWeb::NWebUrlResourceError> error)
1830 {
1831     if (onPageError_) {
1832         std::string url = request->Url();
1833         int errorCode = error->ErrorCode();
1834         std::string description = error->ErrorInfo();
1835         std::string paramUrl = std::string(R"(")").append(url).append(std::string(R"(")")).append(",");
1836         std::string paramErrorCode = std::string(R"(")")
1837                                          .append(NTC_PARAM_ERROR_CODE)
1838                                          .append(std::string(R"(")"))
1839                                          .append(":")
1840                                          .append(std::to_string(errorCode))
1841                                          .append(",");
1842 
1843         std::string paramDesc = std::string(R"(")")
1844                                     .append(NTC_PARAM_DESCRIPTION)
1845                                     .append(std::string(R"(")"))
1846                                     .append(":")
1847                                     .append(std::string(R"(")").append(description).append(std::string(R"(")")));
1848         std::string errorParam =
1849             std::string(R"("error",{"url":)").append((paramUrl + paramErrorCode + paramDesc).append("},null"));
1850         onPageError_(errorParam);
1851     }
1852 
1853     if (onErrorReceiveV2_) {
1854         onErrorReceiveV2_(std::make_shared<ReceivedErrorEvent>(
1855             AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
1856                 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
1857             AceType::MakeRefPtr<WebError>(error->ErrorInfo(), error->ErrorCode())));
1858     }
1859 }
1860 
OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)1861 void WebDelegate::OnHttpErrorReceive(std::shared_ptr<OHOS::NWeb::NWebUrlResourceRequest> request,
1862     std::shared_ptr<OHOS::NWeb::NWebUrlResourceResponse> response)
1863 {
1864     if (onHttpErrorReceiveV2_) {
1865         onHttpErrorReceiveV2_(std::make_shared<ReceivedHttpErrorEvent>(
1866             AceType::MakeRefPtr<WebRequest>(request->RequestHeaders(), request->Method(), request->Url(),
1867                 request->FromGesture(), request->IsAboutMainFrame(), request->IsRequestRedirect()),
1868             AceType::MakeRefPtr<WebResponse>(response->ResponseHeaders(), response->ResponseData(),
1869                 response->ResponseEncoding(), response->ResponseMimeType(), response->ResponseStatus(),
1870                 response->ResponseStatusCode())));
1871     }
1872 }
1873 
OnRequestFocus()1874 void WebDelegate::OnRequestFocus()
1875 {
1876     if (onRequestFocusV2_) {
1877         onRequestFocusV2_(std::make_shared<LoadWebRequestFocusEvent>(""));
1878     }
1879 }
1880 
OnRenderExited(OHOS::NWeb::RenderExitReason reason)1881 void WebDelegate::OnRenderExited(OHOS::NWeb::RenderExitReason reason)
1882 {
1883     if (onRenderExitedV2_) {
1884         onRenderExitedV2_(std::make_shared<RenderExitedEvent>(static_cast<int32_t>(reason)));
1885     }
1886 }
1887 
OnRefreshAccessedHistory(const std::string & url,bool isRefreshed)1888 void WebDelegate::OnRefreshAccessedHistory(const std::string& url, bool isRefreshed)
1889 {
1890     if (onRefreshAccessedHistoryV2_) {
1891         onRefreshAccessedHistoryV2_(std::make_shared<RefreshAccessedHistoryEvent>(url, isRefreshed));
1892     }
1893 }
1894 
OnPageError(const std::string & param)1895 void WebDelegate::OnPageError(const std::string& param)
1896 {
1897     if (onPageError_) {
1898         int32_t errorCode = GetIntParam(param, NTC_PARAM_ERROR_CODE);
1899         std::string url = GetUrlStringParam(param, NTC_PARAM_URL);
1900         std::string description = GetStringParam(param, NTC_PARAM_DESCRIPTION);
1901 
1902         std::string paramUrl = std::string(R"(")").append(url).append(std::string(R"(")")).append(",");
1903 
1904         std::string paramErrorCode = std::string(R"(")")
1905                                          .append(NTC_PARAM_ERROR_CODE)
1906                                          .append(std::string(R"(")"))
1907                                          .append(":")
1908                                          .append(std::to_string(errorCode))
1909                                          .append(",");
1910 
1911         std::string paramDesc = std::string(R"(")")
1912                                     .append(NTC_PARAM_DESCRIPTION)
1913                                     .append(std::string(R"(")"))
1914                                     .append(":")
1915                                     .append(std::string(R"(")").append(description).append(std::string(R"(")")));
1916         std::string errorParam =
1917             std::string(R"("error",{"url":)").append((paramUrl + paramErrorCode + paramDesc).append("},null"));
1918         onPageError_(errorParam);
1919     }
1920 }
1921 
OnMessage(const std::string & param)1922 void WebDelegate::OnMessage(const std::string& param)
1923 {
1924     std::string removeQuotes;
1925     removeQuotes = param;
1926     removeQuotes.erase(std::remove(removeQuotes.begin(), removeQuotes.end(), '\"'), removeQuotes.end());
1927     if (onMessage_) {
1928         std::string paramMessage = std::string(R"(")").append(removeQuotes).append(std::string(R"(")"));
1929         std::string messageParam = std::string(R"("message",{"message":)").append(paramMessage.append("},null"));
1930         onMessage_(messageParam);
1931     }
1932 }
1933 
OnRouterPush(const std::string & param)1934 void WebDelegate::OnRouterPush(const std::string& param)
1935 {
1936     OHOS::Ace::Framework::DelegateClient::GetInstance().RouterPush(param);
1937 }
1938 
OnFileSelectorShow(const BaseEventInfo * info)1939 bool WebDelegate::OnFileSelectorShow(const BaseEventInfo* info)
1940 {
1941     return webComponent_->OnFileSelectorShow(info);
1942 }
1943 
OnHandleInterceptUrlLoading(const std::string & data)1944 bool WebDelegate::OnHandleInterceptUrlLoading(const std::string& data)
1945 {
1946     auto param = std::make_shared<UrlLoadInterceptEvent>(data);
1947     return webComponent_->OnUrlLoadIntercept(param.get());
1948 }
1949 
1950 #ifdef OHOS_STANDARD_SYSTEM
HandleTouchDown(const int32_t & id,const double & x,const double & y)1951 void WebDelegate::HandleTouchDown(const int32_t& id, const double& x, const double& y)
1952 {
1953     ACE_DCHECK(nweb_ != nullptr);
1954     if (nweb_) {
1955         nweb_->OnTouchPress(id, x, y);
1956     }
1957 }
1958 
HandleTouchUp(const int32_t & id,const double & x,const double & y)1959 void WebDelegate::HandleTouchUp(const int32_t& id, const double& x, const double& y)
1960 {
1961     ACE_DCHECK(nweb_ != nullptr);
1962     if (nweb_) {
1963         nweb_->OnTouchRelease(id, x, y);
1964     }
1965 }
1966 
HandleTouchMove(const int32_t & id,const double & x,const double & y)1967 void WebDelegate::HandleTouchMove(const int32_t& id, const double& x, const double& y)
1968 {
1969     ACE_DCHECK(nweb_ != nullptr);
1970     if (nweb_) {
1971         nweb_->OnTouchMove(id, x, y);
1972     }
1973 }
1974 
HandleTouchCancel()1975 void WebDelegate::HandleTouchCancel()
1976 {
1977     ACE_DCHECK(nweb_ != nullptr);
1978     if (nweb_) {
1979         nweb_->OnTouchCancel();
1980     }
1981 }
1982 #endif
1983 
GetUrlStringParam(const std::string & param,const std::string & name) const1984 std::string WebDelegate::GetUrlStringParam(const std::string& param, const std::string& name) const
1985 {
1986     size_t len = name.length();
1987     size_t posErrorCode = param.find(NTC_PARAM_ERROR_CODE);
1988     size_t pos = param.find(name);
1989     std::string result;
1990 
1991     if (pos != std::string::npos && posErrorCode != std::string::npos) {
1992         std::stringstream ss;
1993 
1994         ss << param.substr(pos + 1 + len, posErrorCode - 5);
1995         ss >> result;
1996     }
1997     return result;
1998 }
1999 
BindRouterBackMethod()2000 void WebDelegate::BindRouterBackMethod()
2001 {
2002     auto context = context_.Upgrade();
2003     if (context) {
2004         context->SetRouterBackEventHandler([weak = WeakClaim(this)] {
2005             auto delegate = weak.Upgrade();
2006             if (delegate) {
2007                 delegate->CallWebRouterBack();
2008             }
2009         });
2010     }
2011 }
2012 
BindPopPageSuccessMethod()2013 void WebDelegate::BindPopPageSuccessMethod()
2014 {
2015     auto context = context_.Upgrade();
2016     if (context) {
2017         context->SetPopPageSuccessEventHandler(
2018             [weak = WeakClaim(this)](const std::string& pageUrl, const int32_t pageId) {
2019                 std::string url = pageUrl.substr(0, pageUrl.length() - 3);
2020                 auto delegate = weak.Upgrade();
2021                 if (delegate) {
2022                     delegate->CallPopPageSuccessPageUrl(url);
2023                 }
2024             });
2025     }
2026 }
2027 
BindIsPagePathInvalidMethod()2028 void WebDelegate::BindIsPagePathInvalidMethod()
2029 {
2030     auto context = context_.Upgrade();
2031     if (context) {
2032         context->SetIsPagePathInvalidEventHandler([weak = WeakClaim(this)](bool& isPageInvalid) {
2033             auto delegate = weak.Upgrade();
2034             if (delegate) {
2035                 delegate->CallIsPagePathInvalid(isPageInvalid);
2036             }
2037         });
2038     }
2039 }
2040 
SetComponent(const RefPtr<WebComponent> & component)2041 void WebDelegate::SetComponent(const RefPtr<WebComponent>& component)
2042 {
2043     webComponent_ = component;
2044 }
2045 
2046 } // namespace OHOS::Ace
2047