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 "core/components/web/resource/web_javascript_result_callback.h"
17
18 #include "base/log/log.h"
19 #include "core/common/container.h"
20 #include "core/common/container_scope.h"
21 #include "core/components/web/resource/web_javascript_value.h"
22
23 namespace OHOS::Ace {
24 using namespace OHOS::Ace::Framework;
25 using namespace OHOS::NWeb;
26
GetWebJSValue(const std::vector<std::shared_ptr<NWebValue>> & args)27 std::vector<std::shared_ptr<WebJSValue>> GetWebJSValue(const std::vector<std::shared_ptr<NWebValue>>& args)
28 {
29 std::vector<std::shared_ptr<WebJSValue>> webJSValues;
30 for (auto value : args) {
31 if (value == nullptr) {
32 continue;
33 }
34 NWebValue::Type type = value->GetType();
35 auto webJsValue = std::make_shared<WebJSValue>(WebJSValue::Type::NONE);
36 switch (type) {
37 case NWebValue::Type::INTEGER:
38 webJsValue->SetType(WebJSValue::Type::INTEGER);
39 webJsValue->SetInt(value->GetInt());
40 webJSValues.push_back(webJsValue);
41 break;
42 case NWebValue::Type::DOUBLE:
43 webJsValue->SetType(WebJSValue::Type::DOUBLE);
44 webJsValue->SetDouble(value->GetDouble());
45 webJSValues.push_back(webJsValue);
46 break;
47 case NWebValue::Type::BOOLEAN:
48 webJsValue->SetType(WebJSValue::Type::BOOLEAN);
49 webJsValue->SetBoolean(value->GetBoolean());
50 webJSValues.push_back(webJsValue);
51 break;
52 case NWebValue::Type::STRING:
53 webJsValue->SetType(WebJSValue::Type::STRING);
54 webJsValue->SetString(value->GetString());
55 webJSValues.push_back(webJsValue);
56 break;
57 case NWebValue::Type::NONE:
58 break;
59 default:
60 LOGI("WebJavaScriptResultCallBack: jsvalue type not support!");
61 break;
62 }
63 }
64 return webJSValues;
65 }
66
GetWebViewValue(const std::shared_ptr<WebJSValue> & webJSValue)67 std::shared_ptr<NWebValue> GetWebViewValue(const std::shared_ptr<WebJSValue>& webJSValue)
68 {
69 std::shared_ptr<NWebValue> webViewValue = std::make_shared<NWebValue>(NWebValue::Type::NONE);
70 WebJSValue::Type type = webJSValue->GetType();
71 switch (type) {
72 case WebJSValue::Type::INTEGER:
73 webViewValue->SetType(NWebValue::Type::INTEGER);
74 webViewValue->SetInt(webJSValue->GetInt());
75 break;
76 case WebJSValue::Type::DOUBLE:
77 webViewValue->SetType(NWebValue::Type::DOUBLE);
78 webViewValue->SetDouble(webJSValue->GetDouble());
79 break;
80 case WebJSValue::Type::BOOLEAN:
81 webViewValue->SetType(NWebValue::Type::BOOLEAN);
82 webViewValue->SetBoolean(webJSValue->GetBoolean());
83 break;
84 case WebJSValue::Type::STRING:
85 webViewValue->SetType(NWebValue::Type::STRING);
86 webViewValue->SetString(webJSValue->GetString());
87 break;
88 case WebJSValue::Type::NONE:
89 break;
90 default:
91 LOGI("WebJavaScriptResultCallBack: jsvalue type not support!");
92 break;
93 }
94 return webViewValue;
95 }
96
GetJavaScriptResult(std::vector<std::shared_ptr<NWebValue>> args,const std::string & method,const std::string & object_name)97 std::shared_ptr<NWebValue> WebJavaScriptResultCallBack::GetJavaScriptResult(
98 std::vector<std::shared_ptr<NWebValue>> args, const std::string& method, const std::string& object_name)
99 {
100 LOGI("GetJavaScriptResult");
101 ContainerScope scope(instanceId_);
102 std::shared_ptr<WebJSValue> result;
103 auto jsArgs = GetWebJSValue(args);
104
105 auto task = Container::CurrentTaskExecutor();
106 if (task == nullptr) {
107 LOGW("can't get task executor");
108 return std::make_shared<NWebValue>(NWebValue::Type::NONE);
109 }
110
111 task->PostSyncTask(
112 [webJSCallBack = this, object_name, method, jsArgs, &result] {
113 if (webJSCallBack->javaScriptCallBackImpl_) {
114 result = webJSCallBack->javaScriptCallBackImpl_(object_name, method, jsArgs);
115 }
116 },
117 OHOS::Ace::TaskExecutor::TaskType::JS);
118
119 return GetWebViewValue(result);
120 }
121 } // namespace OHOS::Ace