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