• 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 "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