1 /*
2 * Copyright (c) 2021 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 "frameworks/bridge/declarative_frontend/engine/quickjs/qjs_helpers.h"
17
18 #include "base/log/log.h"
19 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_utils.h"
20
21 namespace OHOS::Ace::Framework {
22
23 enum class JsLogLevel : int32_t {
24 DEBUG = 0,
25 INFO,
26 WARNING,
27 ERROR,
28 };
29
ParseLogContent(JSContext * ctx,int32_t argc,JSValueConst * argv)30 std::string ParseLogContent(JSContext* ctx, int32_t argc, JSValueConst* argv)
31 {
32 std::string formatStr = ScopedString(ctx, argv[0]).get();
33 if (argc == 1 || formatStr.empty()) {
34 return formatStr;
35 }
36 std::string ret;
37 int32_t len = static_cast<int32_t>(formatStr.size());
38 int32_t pos = 0;
39 int32_t count = 1;
40 for (; pos < len; ++pos) {
41 if (count >= argc) {
42 break;
43 }
44 if (formatStr[pos] == '%') {
45 if (pos + 1 >= len) {
46 break;
47 }
48 switch (formatStr[pos + 1]) {
49 case 's':
50 case 'j':
51 case 'd':
52 case 'O':
53 case 'o':
54 case 'i':
55 case 'f':
56 case 'c':
57 ret += ScopedString(ctx, argv[count++]).get();
58 ++pos;
59 break;
60 case '%':
61 ret += formatStr[pos];
62 ++pos;
63 break;
64 default:
65 ret += formatStr[pos];
66 break;
67 }
68 } else {
69 ret += formatStr[pos];
70 }
71 }
72 if (pos < len) {
73 ret += formatStr.substr(pos, len - pos);
74 }
75 return ret;
76 }
77
JsLogPrint(JSContext * ctx,JsLogLevel level,JSValueConst value,int32_t argc,JSValueConst * argv)78 JSValue JsLogPrint(JSContext* ctx, JsLogLevel level, JSValueConst value, int32_t argc, JSValueConst* argv)
79 {
80 // Should have 1 parameters.
81 if ((argv == nullptr) || (argc == 0)) {
82 LOGE("the arg is error");
83 return JS_EXCEPTION;
84 }
85 std::string printLog = ParseLogContent(ctx, argc, argv);
86 switch (level) {
87 case JsLogLevel::DEBUG:
88 LOGD("ace Log: %{public}s", printLog.c_str());
89 break;
90 case JsLogLevel::INFO:
91 LOGI("ace Log: %{public}s", printLog.c_str());
92 break;
93 case JsLogLevel::WARNING:
94 LOGW("ace Log: %{public}s", printLog.c_str());
95 break;
96 case JsLogLevel::ERROR:
97 LOGE("ace Log: %{public}s", printLog.c_str());
98 break;
99 default:
100 break;
101 }
102
103 return JS_NULL;
104 }
105
JsLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)106 JSValue JsLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
107 {
108 return JsLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
109 }
110
JsDebugLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)111 JSValue JsDebugLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
112 {
113 return JsLogPrint(ctx, JsLogLevel::DEBUG, value, argc, argv);
114 }
115
JsInfoLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)116 JSValue JsInfoLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
117 {
118 return JsLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
119 }
120
JsWarnLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)121 JSValue JsWarnLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
122 {
123 return JsLogPrint(ctx, JsLogLevel::WARNING, value, argc, argv);
124 }
125
JsErrorLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)126 JSValue JsErrorLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
127 {
128 return JsLogPrint(ctx, JsLogLevel::ERROR, value, argc, argv);
129 }
130
AppLogPrint(JSContext * ctx,JsLogLevel level,JSValueConst value,int32_t argc,JSValueConst * argv)131 JSValue AppLogPrint(JSContext* ctx, JsLogLevel level, JSValueConst value, int32_t argc, JSValueConst* argv)
132 {
133 // Should have 1 parameters.
134 if ((argv == nullptr) || (argc == 0)) {
135 LOGE("the arg is error");
136 return JS_EXCEPTION;
137 }
138 std::string printLog = ParseLogContent(ctx, argc, argv);
139 switch (level) {
140 case JsLogLevel::DEBUG:
141 APP_LOGD("app Log: %{public}s", printLog.c_str());
142 break;
143 case JsLogLevel::INFO:
144 APP_LOGI("app Log: %{public}s", printLog.c_str());
145 break;
146 case JsLogLevel::WARNING:
147 APP_LOGW("app Log: %{public}s", printLog.c_str());
148 break;
149 case JsLogLevel::ERROR:
150 APP_LOGE("app Log: %{public}s", printLog.c_str());
151 break;
152 default:
153 break;
154 }
155
156 return JS_NULL;
157 }
158
AppLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)159 JSValue AppLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
160 {
161 return AppLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
162 }
163
AppDebugLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)164 JSValue AppDebugLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
165 {
166 return AppLogPrint(ctx, JsLogLevel::DEBUG, value, argc, argv);
167 }
168
AppInfoLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)169 JSValue AppInfoLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
170 {
171 return AppLogPrint(ctx, JsLogLevel::INFO, value, argc, argv);
172 }
173
AppWarnLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)174 JSValue AppWarnLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
175 {
176 return AppLogPrint(ctx, JsLogLevel::WARNING, value, argc, argv);
177 }
178
AppErrorLogPrint(JSContext * ctx,JSValueConst value,int32_t argc,JSValueConst * argv)179 JSValue AppErrorLogPrint(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv)
180 {
181 return AppLogPrint(ctx, JsLogLevel::ERROR, value, argc, argv);
182 }
183
InitConsole(JSContext * ctx)184 void InitConsole(JSContext* ctx)
185 {
186 JSValue globalObj;
187 globalObj = JS_GetGlobalObject(ctx);
188 JSValue console = JS_NewObject(ctx);
189 JS_SetPropertyStr(ctx, console, "log", JS_NewCFunction(ctx, AppLogPrint, "log", 1));
190 JS_SetPropertyStr(ctx, console, "debug", JS_NewCFunction(ctx, AppDebugLogPrint, "debug", 1));
191 JS_SetPropertyStr(ctx, console, "info", JS_NewCFunction(ctx, AppInfoLogPrint, "info", 1));
192 JS_SetPropertyStr(ctx, console, "warn", JS_NewCFunction(ctx, AppWarnLogPrint, "warn", 1));
193 JS_SetPropertyStr(ctx, console, "error", JS_NewCFunction(ctx, AppErrorLogPrint, "error", 1));
194 JS_SetPropertyStr(ctx, globalObj, "console", console);
195
196 // js framework log method
197 JSValue aceConsole = JS_NewObject(ctx);
198 JS_SetPropertyStr(ctx, aceConsole, "log", JS_NewCFunction(ctx, JsLogPrint, "log", 1));
199 JS_SetPropertyStr(ctx, aceConsole, "debug", JS_NewCFunction(ctx, JsDebugLogPrint, "debug", 1));
200 JS_SetPropertyStr(ctx, aceConsole, "info", JS_NewCFunction(ctx, JsInfoLogPrint, "info", 1));
201 JS_SetPropertyStr(ctx, aceConsole, "warn", JS_NewCFunction(ctx, JsWarnLogPrint, "warn", 1));
202 JS_SetPropertyStr(ctx, aceConsole, "error", JS_NewCFunction(ctx, JsErrorLogPrint, "error", 1));
203 JS_SetPropertyStr(ctx, globalObj, "aceConsole", aceConsole);
204 JS_FreeValue(ctx, globalObj);
205 }
206
207 } // namespace OHOS::Ace::Framework
208