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", ¶Array);
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