• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "webview_controller.h"
17 
18 #include "application_context.h"
19 #include "business_error.h"
20 #include "napi_parse_utils.h"
21 #include "nweb_log.h"
22 #include "nweb_store_web_archive_callback.h"
23 #include "web_errors.h"
24 #include "webview_hasimage_callback.h"
25 #include "webview_javascript_execute_callback.h"
26 #include "webview_javascript_result_callback.h"
27 
28 namespace {
29 constexpr int32_t PARAMZERO = 0;
30 constexpr int32_t PARAMONE = 1;
31 constexpr int32_t RESULT_COUNT = 2;
32 } // namespace
33 
34 namespace OHOS {
35 namespace NWeb {
36 using namespace NWebError;
37 std::string WebviewController::customeSchemeCmdLine_ = "";
38 bool WebviewController::existNweb_ = false;
39 bool WebviewController::webDebuggingAccess_ = false;
WebviewController(int32_t nwebId)40 WebviewController::WebviewController(int32_t nwebId) : nweb_(NWebHelper::Instance().GetNWeb(nwebId)) {}
41 
SetWebId(int32_t nwebId)42 void WebviewController::SetWebId(int32_t nwebId)
43 {
44     nweb_ = NWebHelper::Instance().GetNWeb(nwebId);
45 }
46 
IsInit()47 bool WebviewController::IsInit()
48 {
49     return nweb_.lock() ? true : false;
50 }
51 
AccessForward()52 bool WebviewController::AccessForward()
53 {
54     bool access = false;
55     auto nweb_ptr = nweb_.lock();
56     if (nweb_ptr) {
57         access = nweb_ptr->IsNavigateForwardAllowed();
58     }
59     return access;
60 }
61 
AccessBackward()62 bool WebviewController::AccessBackward()
63 {
64     bool access = false;
65     auto nweb_ptr = nweb_.lock();
66     if (nweb_ptr) {
67         access = nweb_ptr->IsNavigatebackwardAllowed();
68     }
69     return access;
70 }
71 
AccessStep(int32_t step)72 bool WebviewController::AccessStep(int32_t step)
73 {
74     bool access = false;
75     auto nweb_ptr = nweb_.lock();
76     if (nweb_ptr) {
77         access = nweb_ptr->CanNavigateBackOrForward(step);
78     }
79     return access;
80 }
81 
ClearHistory()82 void WebviewController::ClearHistory()
83 {
84     auto nweb_ptr = nweb_.lock();
85     if (nweb_ptr) {
86         nweb_ptr->DeleteNavigateHistory();
87     }
88 }
89 
Forward()90 void WebviewController::Forward()
91 {
92     auto nweb_ptr = nweb_.lock();
93     if (nweb_ptr) {
94         nweb_ptr->NavigateForward();
95     }
96 }
97 
Backward()98 void WebviewController::Backward()
99 {
100     auto nweb_ptr = nweb_.lock();
101     if (nweb_ptr) {
102         nweb_ptr->NavigateBack();
103     }
104 }
105 
OnActive()106 void WebviewController::OnActive()
107 {
108     auto nweb_ptr = nweb_.lock();
109     if (nweb_ptr) {
110         nweb_ptr->OnContinue();
111     }
112 }
113 
OnInactive()114 void WebviewController::OnInactive()
115 {
116     auto nweb_ptr = nweb_.lock();
117     if (nweb_ptr) {
118         nweb_ptr->OnPause();
119     }
120 }
121 
Refresh()122 void WebviewController::Refresh()
123 {
124     auto nweb_ptr = nweb_.lock();
125     if (nweb_ptr) {
126         nweb_ptr->Reload();
127     }
128 }
129 
ZoomIn()130 ErrCode WebviewController::ZoomIn()
131 {
132     auto nweb_ptr = nweb_.lock();
133     if (!nweb_ptr) {
134         return INIT_ERROR;
135     }
136     ErrCode result = NWebError::NO_ERROR;
137     result = nweb_ptr->ZoomIn();
138 
139     return result;
140 }
141 
ZoomOut()142 ErrCode WebviewController::ZoomOut()
143 {
144     auto nweb_ptr = nweb_.lock();
145     if (!nweb_ptr) {
146         return INIT_ERROR;
147     }
148     ErrCode result = NWebError::NO_ERROR;
149     result = nweb_ptr->ZoomOut();
150 
151     return result;
152 }
153 
GetWebId() const154 int32_t WebviewController::GetWebId() const
155 {
156     int32_t webId = -1;
157     auto nweb_ptr = nweb_.lock();
158     if (nweb_ptr) {
159         webId = static_cast<int32_t>(nweb_ptr->GetWebId());
160     }
161     return webId;
162 }
163 
GetUserAgent()164 std::string WebviewController::GetUserAgent()
165 {
166     auto nweb_ptr = nweb_.lock();
167     if (!nweb_ptr) {
168         return "";
169     }
170     std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
171     if (!setting) {
172         return "";
173     }
174     return setting->DefaultUserAgent();
175 }
176 
GetCustomUserAgent() const177 std::string WebviewController::GetCustomUserAgent() const
178 {
179     auto nweb_ptr = nweb_.lock();
180     if (!nweb_ptr) {
181         return "";
182     }
183     std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
184     if (!setting) {
185         return "";
186     }
187     return setting->UserAgent();
188 }
189 
SetCustomUserAgent(const std::string & userAgent)190 ErrCode WebviewController::SetCustomUserAgent(const std::string& userAgent)
191 {
192     auto nweb_ptr = nweb_.lock();
193     if (!nweb_ptr) {
194         return NWebError::INIT_ERROR;
195     }
196     std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
197     if (!setting) {
198         return NWebError::INIT_ERROR;
199     }
200     setting->PutUserAgent(userAgent);
201     return NWebError::NO_ERROR;
202 }
203 
GetTitle()204 std::string WebviewController::GetTitle()
205 {
206     std::string title = "";
207     auto nweb_ptr = nweb_.lock();
208     if (nweb_ptr) {
209         title = nweb_ptr->Title();
210     }
211     return title;
212 }
213 
GetPageHeight()214 int32_t WebviewController::GetPageHeight()
215 {
216     int32_t pageHeight = 0;
217     auto nweb_ptr = nweb_.lock();
218     if (nweb_ptr) {
219         pageHeight = nweb_ptr->ContentHeight();
220     }
221     return pageHeight;
222 }
223 
BackOrForward(int32_t step)224 ErrCode WebviewController::BackOrForward(int32_t step)
225 {
226     auto nweb_ptr = nweb_.lock();
227     if (!nweb_ptr) {
228         return INIT_ERROR;
229     }
230 
231     nweb_ptr->NavigateBackOrForward(step);
232     return NWebError::NO_ERROR;
233 }
234 
StoreWebArchiveCallback(const std::string & baseName,bool autoName,napi_env env,napi_ref jsCallback)235 void WebviewController::StoreWebArchiveCallback(const std::string &baseName, bool autoName, napi_env env,
236     napi_ref jsCallback)
237 {
238     auto nweb_ptr = nweb_.lock();
239     if (!nweb_ptr) {
240         napi_value setResult[RESULT_COUNT] = {0};
241         setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
242         napi_get_null(env, &setResult[PARAMONE]);
243 
244         napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
245         napi_value callback = nullptr;
246         napi_get_reference_value(env, jsCallback, &callback);
247         napi_value callbackResult = nullptr;
248         napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
249         napi_delete_reference(env, jsCallback);
250         return;
251     }
252 
253     if (jsCallback == nullptr) {
254         return;
255     }
256 
257     auto callbackImpl = std::make_shared<OHOS::NWeb::NWebStoreWebArchiveCallback>();
258     callbackImpl->SetCallBack([env, jCallback = std::move(jsCallback)](std::string result) {
259         if (!env) {
260             return;
261         }
262         napi_handle_scope scope = nullptr;
263         napi_open_handle_scope(env, &scope);
264         if (scope == nullptr) {
265             return;
266         }
267 
268         napi_value setResult[RESULT_COUNT] = {0};
269         if (result.empty()) {
270             setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INVALID_RESOURCE);
271             napi_get_null(env, &setResult[PARAMONE]);
272         } else {
273             napi_get_undefined(env, &setResult[PARAMZERO]);
274             napi_create_string_utf8(env, result.c_str(), NAPI_AUTO_LENGTH, &setResult[PARAMONE]);
275         }
276         napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
277         napi_value callback = nullptr;
278         napi_get_reference_value(env, jCallback, &callback);
279         napi_value callbackResult = nullptr;
280         napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
281 
282         napi_delete_reference(env, jCallback);
283         napi_close_handle_scope(env, scope);
284     });
285     nweb_ptr->StoreWebArchive(baseName, autoName, callbackImpl);
286     return;
287 }
288 
StoreWebArchivePromise(const std::string & baseName,bool autoName,napi_env env,napi_deferred deferred)289 void WebviewController::StoreWebArchivePromise(const std::string &baseName, bool autoName, napi_env env,
290     napi_deferred deferred)
291 {
292     auto nweb_ptr = nweb_.lock();
293     if (!nweb_ptr) {
294         napi_value jsResult = nullptr;
295         jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
296         napi_reject_deferred(env, deferred, jsResult);
297         return;
298     }
299 
300     if (deferred == nullptr) {
301         return;
302     }
303 
304     auto callbackImpl = std::make_shared<OHOS::NWeb::NWebStoreWebArchiveCallback>();
305     callbackImpl->SetCallBack([env, deferred](std::string result) {
306         if (!env) {
307             return;
308         }
309         napi_handle_scope scope = nullptr;
310         napi_open_handle_scope(env, &scope);
311         if (scope == nullptr) {
312             return;
313         }
314 
315         napi_value setResult[RESULT_COUNT] = {0};
316         setResult[PARAMZERO] = NWebError::BusinessError::CreateError(env, NWebError::INVALID_RESOURCE);
317         napi_create_string_utf8(env, result.c_str(), NAPI_AUTO_LENGTH, &setResult[PARAMONE]);
318         napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
319         if (!result.empty()) {
320             napi_resolve_deferred(env, deferred, args[PARAMONE]);
321         } else {
322             napi_reject_deferred(env, deferred, args[PARAMZERO]);
323         }
324         napi_close_handle_scope(env, scope);
325     });
326     nweb_ptr->StoreWebArchive(baseName, autoName, callbackImpl);
327     return;
328 }
329 
CreateWebMessagePorts(std::vector<std::string> & ports)330 ErrCode WebviewController::CreateWebMessagePorts(std::vector<std::string>& ports)
331 {
332     auto nweb_ptr = nweb_.lock();
333     if (!nweb_ptr) {
334         return INIT_ERROR;
335     }
336 
337     nweb_ptr->CreateWebMessagePorts(ports);
338     return NWebError::NO_ERROR;
339 }
340 
PostWebMessage(std::string & message,std::vector<std::string> & ports,std::string & targetUrl)341 ErrCode WebviewController::PostWebMessage(std::string& message, std::vector<std::string>& ports, std::string& targetUrl)
342 {
343     auto nweb_ptr = nweb_.lock();
344     if (!nweb_ptr) {
345         return INIT_ERROR;
346     }
347 
348     nweb_ptr->PostWebMessage(message, ports, targetUrl);
349     return NWebError::NO_ERROR;
350 }
351 
WebMessagePort(int32_t nwebId,std::string & port,bool isExtentionType)352 WebMessagePort::WebMessagePort(int32_t nwebId, std::string& port, bool isExtentionType)
353     : nweb_(NWebHelper::Instance().GetNWeb(nwebId)), portHandle_(port), isExtentionType_(isExtentionType)
354 {}
355 
ClosePort()356 ErrCode WebMessagePort::ClosePort()
357 {
358     auto nweb_ptr = nweb_.lock();
359     if (!nweb_ptr) {
360         return INIT_ERROR;
361     }
362 
363     nweb_ptr->ClosePort(portHandle_);
364     portHandle_.clear();
365     return NWebError::NO_ERROR;
366 }
367 
PostPortMessage(std::shared_ptr<NWebMessage> data)368 ErrCode WebMessagePort::PostPortMessage(std::shared_ptr<NWebMessage> data)
369 {
370     auto nweb_ptr = nweb_.lock();
371     if (!nweb_ptr) {
372         return INIT_ERROR;
373     }
374 
375     if (portHandle_.empty()) {
376         WVLOG_E("can't post message, message port already closed");
377         return CAN_NOT_POST_MESSAGE;
378     }
379     nweb_ptr->PostPortMessage(portHandle_, data);
380     return NWebError::NO_ERROR;
381 }
382 
SetPortMessageCallback(std::shared_ptr<NWebValueCallback<std::shared_ptr<NWebMessage>>> callback)383 ErrCode WebMessagePort::SetPortMessageCallback(
384     std::shared_ptr<NWebValueCallback<std::shared_ptr<NWebMessage>>> callback)
385 {
386     auto nweb_ptr = nweb_.lock();
387     if (!nweb_ptr) {
388         return INIT_ERROR;
389     }
390 
391     if (portHandle_.empty()) {
392         WVLOG_E("can't register message port callback event, message port already closed");
393         return CAN_NOT_REGISTER_MESSAGE_EVENT;
394     }
395     nweb_ptr->SetPortMessageCallback(portHandle_, callback);
396     return NWebError::NO_ERROR;
397 }
398 
GetPortHandle() const399 std::string WebMessagePort::GetPortHandle() const
400 {
401     return portHandle_;
402 }
403 
GetHitTestValue()404 HitTestResult WebviewController::GetHitTestValue()
405 {
406     OHOS::NWeb::HitTestResult nwebResult;
407     auto nweb_ptr = nweb_.lock();
408     if (nweb_ptr) {
409         nwebResult = nweb_ptr->GetHitTestResult();
410         nwebResult.SetType(ConverToWebHitTestType(nwebResult.GetType()));
411     }
412     return nwebResult;
413 }
414 
RequestFocus()415 void WebviewController::RequestFocus()
416 {
417     auto nweb_ptr = nweb_.lock();
418     if (nweb_ptr) {
419         nweb_ptr->OnFocus();
420     }
421 }
422 
GetRawFileUrl(const std::string & fileName,std::string & result)423 bool WebviewController::GetRawFileUrl(const std::string &fileName, std::string &result)
424 {
425     if (fileName.empty()) {
426         WVLOG_E("File name is empty.");
427         return false;
428     }
429     if (hapPath_.empty()) {
430         std::shared_ptr<AbilityRuntime::ApplicationContext> context =
431             AbilityRuntime::ApplicationContext::GetApplicationContext();
432         std::string packagePath = "file:///" + context->GetBundleCodeDir() + "/";
433         std::string bundleName = context->GetBundleName() + "/";
434         std::shared_ptr<AppExecFwk::ApplicationInfo> appInfo = context->GetApplicationInfo();
435         std::string entryDir = appInfo->entryDir;
436         bool isStage = entryDir.find("entry") == std::string::npos ? false : true;
437         result = isStage ? packagePath + "entry/resources/rawfile/" + fileName :
438             packagePath + bundleName + "assets/entry/resources/rawfile/" + fileName;
439     } else {
440         result = "resource://RAWFILE/" + fileName;
441     }
442     WVLOG_D("The parsed url is: %{public}s", result.c_str());
443     return true;
444 }
445 
ParseUrl(napi_env env,napi_value urlObj,std::string & result)446 bool WebviewController::ParseUrl(napi_env env, napi_value urlObj, std::string& result)
447 {
448     napi_valuetype valueType = napi_null;
449     napi_typeof(env, urlObj, &valueType);
450     if ((valueType != napi_object) && (valueType != napi_string)) {
451         WVLOG_E("Unable to parse url object.");
452         return false;
453     }
454     if (valueType == napi_string) {
455         NapiParseUtils::ParseString(env, urlObj, result);
456         WVLOG_D("The parsed url is: %{public}s", result.c_str());
457         return true;
458     }
459     napi_value type = nullptr;
460     napi_valuetype typeVlueType = napi_null;
461     napi_get_named_property(env, urlObj, "type", &type);
462     napi_typeof(env, type, &typeVlueType);
463     if (typeVlueType == napi_number) {
464         int32_t typeInteger;
465         NapiParseUtils::ParseInt32(env, type, typeInteger);
466         if (typeInteger == static_cast<int>(ResourceType::RAWFILE)) {
467             napi_value paraArray = nullptr;
468             napi_get_named_property(env, urlObj, "params", &paraArray);
469             bool isArray = false;
470             napi_is_array(env, paraArray, &isArray);
471             if (!isArray) {
472                 WVLOG_E("Unable to parse parameter array from url object.");
473                 return false;
474             }
475             napi_value fileNameObj;
476             std::string fileName;
477             napi_get_element(env, paraArray, 0, &fileNameObj);
478             NapiParseUtils::ParseString(env, fileNameObj, fileName);
479             return GetRawFileUrl(fileName, result);
480         }
481         WVLOG_E("The type parsed from url object is not RAWFILE.");
482         return false;
483     }
484     WVLOG_E("Unable to parse type from url object.");
485     return false;
486 }
487 
LoadUrl(std::string url)488 ErrCode WebviewController::LoadUrl(std::string url)
489 {
490     auto nweb_ptr = nweb_.lock();
491     if (!nweb_ptr) {
492         return INIT_ERROR;
493     }
494     return nweb_ptr->Load(url);
495 }
496 
LoadUrl(std::string url,std::map<std::string,std::string> httpHeaders)497 ErrCode WebviewController::LoadUrl(std::string url, std::map<std::string, std::string> httpHeaders)
498 {
499     auto nweb_ptr = nweb_.lock();
500     if (!nweb_ptr) {
501         return INIT_ERROR;
502     }
503     return nweb_ptr->Load(url, httpHeaders);
504 }
505 
LoadData(std::string data,std::string mimeType,std::string encoding,std::string baseUrl,std::string historyUrl)506 ErrCode WebviewController::LoadData(std::string data, std::string mimeType, std::string encoding,
507     std::string baseUrl, std::string historyUrl)
508 {
509     auto nweb_ptr = nweb_.lock();
510     if (!nweb_ptr) {
511         return INIT_ERROR;
512     }
513     if (baseUrl.empty() && historyUrl.empty()) {
514         return nweb_ptr->LoadWithData(data, mimeType, encoding);
515     }
516     return nweb_ptr->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
517 }
518 
ConverToWebHitTestType(int hitType)519 int WebviewController::ConverToWebHitTestType(int hitType)
520 {
521     WebHitTestType webHitType;
522     switch (hitType) {
523         case HitTestResult::UNKNOWN_TYPE:
524             webHitType = WebHitTestType::UNKNOWN;
525             break;
526         case HitTestResult::ANCHOR_TYPE:
527             webHitType = WebHitTestType::HTTP;
528             break;
529         case HitTestResult::PHONE_TYPE:
530             webHitType = WebHitTestType::PHONE;
531             break;
532         case HitTestResult::GEO_TYPE:
533             webHitType = WebHitTestType::MAP;
534             break;
535         case HitTestResult::EMAIL_TYPE:
536             webHitType = WebHitTestType::EMAIL;
537             break;
538         case HitTestResult::IMAGE_TYPE:
539             webHitType = WebHitTestType::IMG;
540             break;
541         case HitTestResult::IMAGE_ANCHOR_TYPE:
542             webHitType = WebHitTestType::HTTP_IMG;
543             break;
544         case HitTestResult::SRC_ANCHOR_TYPE:
545             webHitType = WebHitTestType::HTTP;
546             break;
547         case HitTestResult::SRC_IMAGE_ANCHOR_TYPE:
548             webHitType = WebHitTestType::HTTP_IMG;
549             break;
550         case HitTestResult::EDIT_TEXT_TYPE:
551             webHitType = WebHitTestType::EDIT;
552             break;
553         default:
554             webHitType = WebHitTestType::UNKNOWN;
555             break;
556     }
557     return static_cast<int>(webHitType);
558 }
559 
GetHitTest()560 int WebviewController::GetHitTest()
561 {
562     auto nweb_ptr = nweb_.lock();
563     if (nweb_ptr) {
564         return ConverToWebHitTestType(nweb_ptr->GetHitTestResult().GetType());
565     }
566     return static_cast<int>(WebHitTestType::UNKNOWN);
567 }
568 
569 
ClearMatches()570 void WebviewController::ClearMatches()
571 {
572     auto nweb_ptr = nweb_.lock();
573     if (nweb_ptr) {
574         nweb_ptr->ClearMatches();
575     }
576 }
577 
SearchNext(bool forward)578 void WebviewController::SearchNext(bool forward)
579 {
580     auto nweb_ptr = nweb_.lock();
581     if (nweb_ptr) {
582         nweb_ptr->FindNext(forward);
583     }
584 }
585 
SearchAllAsync(const std::string & searchString)586 void WebviewController::SearchAllAsync(const std::string& searchString)
587 {
588     auto nweb_ptr = nweb_.lock();
589     if (nweb_ptr) {
590         nweb_ptr->FindAllAsync(searchString);
591     }
592 }
593 
ClearSslCache()594 void WebviewController::ClearSslCache()
595 {
596     auto nweb_ptr = nweb_.lock();
597     if (nweb_ptr) {
598         nweb_ptr->ClearSslCache();
599     }
600 }
601 
ClearClientAuthenticationCache()602 void WebviewController::ClearClientAuthenticationCache()
603 {
604     auto nweb_ptr = nweb_.lock();
605     if (nweb_ptr) {
606         nweb_ptr->ClearClientAuthenticationCache();
607     }
608 }
609 
Stop()610 void WebviewController::Stop()
611 {
612     auto nweb_ptr = nweb_.lock();
613     if (nweb_ptr) {
614         nweb_ptr->Stop();
615     }
616 }
617 
Zoom(float factor)618 ErrCode WebviewController::Zoom(float factor)
619 {
620     auto nweb_ptr = nweb_.lock();
621     if (!nweb_ptr) {
622         return INIT_ERROR;
623     }
624     ErrCode result = NWebError::NO_ERROR;
625     result = nweb_ptr->Zoom(factor);
626 
627     return result;
628 }
629 
DeleteJavaScriptRegister(const std::string & objName,const std::vector<std::string> & methodList)630 ErrCode WebviewController::DeleteJavaScriptRegister(const std::string& objName,
631     const std::vector<std::string>& methodList)
632 {
633     auto nweb_ptr = nweb_.lock();
634     if (nweb_ptr) {
635         nweb_ptr->UnregisterArkJSfunction(objName, methodList);
636     }
637 
638     if (javaScriptResultCb_) {
639         bool ret = javaScriptResultCb_->DeleteJavaScriptRegister(objName);
640         if (!ret) {
641             return CANNOT_DEL_JAVA_SCRIPT_PROXY;
642         }
643     }
644 
645     return NWebError::NO_ERROR;
646 }
647 
SetNWebJavaScriptResultCallBack()648 void WebviewController::SetNWebJavaScriptResultCallBack()
649 {
650     auto nweb_ptr = nweb_.lock();
651     if (!nweb_ptr || javaScriptResultCb_) {
652         return;
653     }
654 
655     javaScriptResultCb_ = std::make_shared<WebviewJavaScriptResultCallBack>();
656     nweb_ptr->SetNWebJavaScriptResultCallBack(javaScriptResultCb_);
657 }
658 
RegisterJavaScriptProxy(napi_env env,napi_value obj,const std::string & objName,const std::vector<std::string> & methodList)659 void WebviewController::RegisterJavaScriptProxy(napi_env env, napi_value obj,
660     const std::string& objName, const std::vector<std::string>& methodList)
661 {
662     auto nweb_ptr = nweb_.lock();
663     if (!nweb_ptr) {
664         return;
665     }
666     if (javaScriptResultCb_) {
667         javaScriptResultCb_->RegisterJavaScriptProxy(env, obj, objName, methodList);
668     }
669     nweb_ptr->RegisterArkJSfunction(objName, methodList);
670 }
671 
RunJavaScriptCallback(const std::string & script,napi_env env,napi_ref jsCallback,bool extention)672 void WebviewController::RunJavaScriptCallback(
673     const std::string& script, napi_env env, napi_ref jsCallback, bool extention)
674 {
675     auto nweb_ptr = nweb_.lock();
676     if (!nweb_ptr) {
677         napi_value setResult[RESULT_COUNT] = {0};
678         setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
679         napi_get_null(env, &setResult[PARAMONE]);
680 
681         napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
682         napi_value callback = nullptr;
683         napi_get_reference_value(env, jsCallback, &callback);
684         napi_value callbackResult = nullptr;
685         napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
686         napi_delete_reference(env, jsCallback);
687         return;
688     }
689 
690     if (jsCallback == nullptr) {
691         return;
692     }
693 
694     auto callbackImpl = std::make_shared<WebviewJavaScriptExecuteCallback>(env, jsCallback, nullptr, extention);
695     nweb_ptr->ExecuteJavaScript(script, callbackImpl, extention);
696 }
697 
RunJavaScriptPromise(const std::string & script,napi_env env,napi_deferred deferred,bool extention)698 void WebviewController::RunJavaScriptPromise(const std::string &script, napi_env env,
699     napi_deferred deferred, bool extention)
700 {
701     auto nweb_ptr = nweb_.lock();
702     if (!nweb_ptr) {
703         napi_value jsResult = nullptr;
704         jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
705         napi_reject_deferred(env, deferred, jsResult);
706         return;
707     }
708 
709     if (deferred == nullptr) {
710         return;
711     }
712 
713     auto callbackImpl = std::make_shared<WebviewJavaScriptExecuteCallback>(env, nullptr, deferred, extention);
714     nweb_ptr->ExecuteJavaScript(script, callbackImpl, extention);
715 }
716 
GetUrl()717 std::string WebviewController::GetUrl()
718 {
719     std::string url = "";
720     auto nweb_ptr = nweb_.lock();
721     if (nweb_ptr) {
722         url = nweb_ptr->GetUrl();
723     }
724     return url;
725 }
726 
GetOriginalUrl()727 std::string WebviewController::GetOriginalUrl()
728 {
729     std::string url = "";
730     auto nweb_ptr = nweb_.lock();
731     if (nweb_ptr) {
732         url = nweb_ptr->GetOriginalUrl();
733     }
734     return url;
735 }
736 
PutNetworkAvailable(bool available)737 void WebviewController::PutNetworkAvailable(bool available)
738 {
739     auto nweb_ptr = nweb_.lock();
740     if (nweb_ptr) {
741         nweb_ptr->PutNetworkAvailable(available);
742     }
743 }
744 
HasImagesCallback(napi_env env,napi_ref jsCallback)745 ErrCode WebviewController::HasImagesCallback(napi_env env, napi_ref jsCallback)
746 {
747     auto nweb_ptr = nweb_.lock();
748     if (!nweb_ptr) {
749         napi_value setResult[RESULT_COUNT] = {0};
750         setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
751         napi_get_null(env, &setResult[PARAMONE]);
752 
753         napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
754         napi_value callback = nullptr;
755         napi_get_reference_value(env, jsCallback, &callback);
756         napi_value callbackResult = nullptr;
757         napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
758         napi_delete_reference(env, jsCallback);
759         return NWebError::INIT_ERROR;
760     }
761 
762     if (jsCallback == nullptr) {
763         return NWebError::PARAM_CHECK_ERROR;
764     }
765 
766     auto callbackImpl = std::make_shared<WebviewHasImageCallback>(env, jsCallback, nullptr);
767     nweb_ptr->HasImages(callbackImpl);
768     return NWebError::NO_ERROR;
769 }
770 
HasImagesPromise(napi_env env,napi_deferred deferred)771 ErrCode WebviewController::HasImagesPromise(napi_env env, napi_deferred deferred)
772 {
773     auto nweb_ptr = nweb_.lock();
774     if (!nweb_ptr) {
775         napi_value jsResult = nullptr;
776         jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
777         napi_reject_deferred(env, deferred, jsResult);
778         return NWebError::INIT_ERROR;
779     }
780 
781     if (deferred == nullptr) {
782         return NWebError::PARAM_CHECK_ERROR;
783     }
784 
785     auto callbackImpl = std::make_shared<WebviewHasImageCallback>(env, nullptr, deferred);
786     nweb_ptr->HasImages(callbackImpl);
787     return NWebError::NO_ERROR;
788 }
789 
RemoveCache(bool include_disk_files)790 void WebviewController::RemoveCache(bool include_disk_files)
791 {
792     auto nweb_ptr = nweb_.lock();
793     if (nweb_ptr) {
794         nweb_ptr->RemoveCache(include_disk_files);
795     }
796 }
797 
GetHistoryList()798 std::shared_ptr<NWebHistoryList> WebviewController::GetHistoryList()
799 {
800     auto nweb_ptr = nweb_.lock();
801     if (!nweb_ptr) {
802         return nullptr;
803     }
804     return nweb_ptr->GetHistoryList();
805 }
806 
GetItem(int32_t index)807 std::shared_ptr<NWebHistoryItem> WebHistoryList::GetItem(int32_t index)
808 {
809     if (!sptrHistoryList_) {
810         return nullptr;
811     }
812     return sptrHistoryList_->GetItem(index);
813 }
814 
GetListSize()815 int32_t WebHistoryList::GetListSize()
816 {
817     int32_t listSize = 0;
818 
819     if (!sptrHistoryList_) {
820         return listSize;
821     }
822     listSize = sptrHistoryList_->GetListSize();
823     return listSize;
824 }
825 
GetFavicon(const void ** data,size_t & width,size_t & height,ImageColorType & colorType,ImageAlphaType & alphaType)826 bool WebviewController::GetFavicon(
827     const void **data, size_t &width, size_t &height, ImageColorType &colorType, ImageAlphaType &alphaType)
828 {
829     bool isGetFavicon = false;
830     auto nweb_ptr = nweb_.lock();
831     if (nweb_ptr) {
832         isGetFavicon = nweb_ptr->GetFavicon(data, width, height, colorType, alphaType);
833     }
834     return isGetFavicon;
835 }
836 
SerializeWebState()837 WebState WebviewController::SerializeWebState()
838 {
839     auto nweb_ptr = nweb_.lock();
840     if (nweb_ptr) {
841         return nweb_ptr->SerializeWebState();
842     }
843     return nullptr;
844 }
845 
RestoreWebState(WebState state)846 bool WebviewController::RestoreWebState(WebState state)
847 {
848     bool isRestored = false;
849     auto nweb_ptr = nweb_.lock();
850     if (nweb_ptr) {
851         isRestored = nweb_ptr->RestoreWebState(state);
852     }
853     return isRestored;
854 }
855 
ScrollPageDown(bool bottom)856 void WebviewController::ScrollPageDown(bool bottom)
857 {
858     auto nweb_ptr = nweb_.lock();
859     if (nweb_ptr) {
860         nweb_ptr->PageDown(bottom);
861     }
862     return;
863 }
864 
ScrollPageUp(bool top)865 void WebviewController::ScrollPageUp(bool top)
866 {
867     auto nweb_ptr = nweb_.lock();
868     if (nweb_ptr) {
869         nweb_ptr->PageUp(top);
870     }
871     return;
872 }
873 
ScrollTo(float x,float y)874 void WebviewController::ScrollTo(float x, float y)
875 {
876     auto nweb_ptr = nweb_.lock();
877     if (nweb_ptr) {
878         nweb_ptr->ScrollTo(x, y);
879     }
880     return;
881 }
882 
ScrollBy(float deltaX,float deltaY)883 void WebviewController::ScrollBy(float deltaX, float deltaY)
884 {
885     auto nweb_ptr = nweb_.lock();
886     if (nweb_ptr) {
887         nweb_ptr->ScrollBy(deltaX, deltaY);
888     }
889     return;
890 }
891 
SlideScroll(float vx,float vy)892 void WebviewController::SlideScroll(float vx, float vy)
893 {
894     auto nweb_ptr = nweb_.lock();
895     if (nweb_ptr) {
896         nweb_ptr->SlideScroll(vx, vy);
897     }
898     return;
899 }
900 
InnerSetHapPath(const std::string & hapPath)901 void WebviewController::InnerSetHapPath(const std::string &hapPath)
902 {
903     hapPath_ = hapPath;
904 }
905 
GetCertChainDerData(std::vector<std::string> & certChainDerData)906 bool WebviewController::GetCertChainDerData(std::vector<std::string> &certChainDerData)
907 {
908     auto nweb_ptr = nweb_.lock();
909     if (!nweb_ptr) {
910         WVLOG_E("GetCertChainDerData failed, nweb ptr is null");
911         return false;
912     }
913 
914     return nweb_ptr->GetCertChainDerData(certChainDerData, true);
915 }
916 
SetAudioMuted(bool muted)917 ErrCode WebviewController::SetAudioMuted(bool muted)
918 {
919     auto nweb_ptr = nweb_.lock();
920     if (!nweb_ptr) {
921         return NWebError::INIT_ERROR;
922     }
923 
924     nweb_ptr->SetAudioMuted(muted);
925     return NWebError::NO_ERROR;
926 }
927 
PrefetchPage(std::string & url,std::map<std::string,std::string> additionalHttpHeaders)928 ErrCode WebviewController::PrefetchPage(std::string& url, std::map<std::string, std::string> additionalHttpHeaders)
929 {
930     auto nweb_ptr = nweb_.lock();
931     if (!nweb_ptr) {
932         return NWebError::INIT_ERROR;
933     }
934 
935     nweb_ptr->PrefetchPage(url, additionalHttpHeaders);
936     return NWebError::NO_ERROR;
937 }
938 } // namespace NWeb
939 } // namespace OHOS
940