Skip to content

Commit 9eb9b7d

Browse files
committed
fix: encoding problem with utf16 strings used in console
1 parent 5d3f41f commit 9eb9b7d

File tree

4 files changed

+55
-33
lines changed

4 files changed

+55
-33
lines changed

test-app/runtime/src/main/cpp/Util.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -112,5 +112,7 @@ u16string Util::ConvertFromUtf8ToUtf16(const string& str) {
112112
}
113113

114114
uint16_t* Util::ConvertFromUtf8ToProtocolUtf16(const string& str) {
115-
return ((uint16_t*)ConvertFromUtf8ToUtf16(str).c_str());
115+
auto utf16String = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>().from_bytes(str);
116+
117+
return (uint16_t*)utf16String.c_str();
116118
}

test-app/runtime/src/main/cpp/console/Console.cpp

+43-23
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void Console::sendToDevToolsFrontEnd(v8::Isolate* isolate, const std::string& me
7272
v8_inspector::V8LogAgentImpl::EntryAdded(message, logLevel, ArgConverter::ConvertToString(frame->GetScriptNameOrSourceURL()), frame->GetLineNumber());
7373
}
7474

75-
const std::string& buildLogString(const v8::FunctionCallbackInfo<v8::Value>& info) {
75+
const std::string buildLogString(const v8::FunctionCallbackInfo<v8::Value>& info) {
7676
auto isolate = info.GetIsolate();
7777

7878
v8::HandleScope scope(isolate);
@@ -99,9 +99,13 @@ const std::string& buildLogString(const v8::FunctionCallbackInfo<v8::Value>& inf
9999

100100
ss << ArgConverter::ConvertToString(argString);
101101
}
102+
} else {
103+
ss << std::endl;
102104
}
103105

104-
return ss.str();
106+
std::string stringResult = ss.str();
107+
108+
return stringResult;
105109
}
106110

107111
void Console::assertCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
@@ -111,20 +115,20 @@ void Console::assertCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
111115
auto expressionPasses = argLen && info[0]->BooleanValue();
112116

113117
if (!expressionPasses) {
114-
std::stringstream ss;
118+
std::stringstream assertionError;
115119

116-
ss << "Assertion failed: ";
120+
assertionError << "Assertion failed: ";
117121

118122
if (argLen > 1) {
119123
v8::Local<v8::String> argString;
120124
info[1]->ToDetailString(isolate->GetCurrentContext()).ToLocal(&argString);
121125

122-
ss << ArgConverter::ConvertToString(argString);
126+
assertionError << ArgConverter::ConvertToString(argString);
123127
} else {
124-
ss << "console.assert";
128+
assertionError << "console.assert";
125129
}
126130

127-
std::string log = ss.str();
131+
std::string log = assertionError.str();
128132
sendToADBLogcat(log, ANDROID_LOG_ERROR);
129133
sendToDevToolsFrontEnd(isolate, log, "error");
130134
}
@@ -177,12 +181,12 @@ void Console::dirCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
177181

178182
auto propertiesLen = propNames->Length();
179183
for (int i = 0; i < propertiesLen; i++) {
180-
auto propName = propNames->Get(context, i).ToLocalChecked();
181-
auto property = argObject->Get(context, propName).ToLocalChecked();
184+
auto propertyName = propNames->Get(context, i).ToLocalChecked();
185+
auto propertyValue = argObject->Get(context, propertyName).ToLocalChecked();
182186

183-
auto propIsFunction = property->IsFunction();
187+
auto propIsFunction = propertyValue->IsFunction();
184188

185-
ss << ArgConverter::ConvertToString(propName->ToString(isolate));
189+
ss << ArgConverter::ConvertToString(propertyName->ToString(isolate));
186190

187191
if (propIsFunction) {
188192
ss << "()";
@@ -206,41 +210,57 @@ void Console::dirCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
206210
sendToDevToolsFrontEnd(isolate, log, "info");
207211
}
208212

209-
const std::string& buildStacktraceFrameLocationPart(v8::Local<v8::StackFrame> frame) {
213+
const std::string buildStacktraceFrameLocationPart(v8::Local<v8::StackFrame> frame) {
210214
std::stringstream ss;
211215

212-
ss << ArgConverter::ConvertToString(frame->GetScriptNameOrSourceURL()) << ":" << frame->GetLineNumber() << ":" << frame->GetColumn();
216+
auto scriptName = frame->GetScriptNameOrSourceURL();
217+
auto scriptNameConverted = ArgConverter::ConvertToString(scriptName);
218+
if (scriptNameConverted.length() < 1) {
219+
ss << "VM";
220+
} else {
221+
ss << scriptNameConverted << ":" << frame->GetLineNumber() << ":" << frame->GetColumn();
222+
}
223+
224+
std::string stringResult = ss.str();
213225

214-
return ss.str();
226+
return stringResult;
215227
}
216228

217-
const std::string& buildStacktraceFrameMessage(v8::Local<v8::StackFrame> frame) {
229+
const std::string buildStacktraceFrameMessage(v8::Local<v8::StackFrame> frame) {
218230
std::stringstream ss;
219231

232+
auto functionName = frame->GetFunctionName();
233+
auto functionNameConverted = ArgConverter::ConvertToString(functionName);
234+
if (functionNameConverted.length() < 1) {
235+
functionNameConverted = "<anonymous>";
236+
}
237+
220238
if (frame->IsConstructor()) {
221-
ss << "at new " << ArgConverter::ConvertToString(frame->GetFunctionName()) << " (" << buildStacktraceFrameLocationPart(frame) << ")";
239+
ss << "at new " << functionNameConverted << " (" << buildStacktraceFrameLocationPart(frame) << ")";
222240
} else if (frame->IsEval()) {
223241
ss << "eval at " << buildStacktraceFrameLocationPart(frame) << std::endl;
224242
} else {
225-
ss << "at " << ArgConverter::ConvertToString(frame->GetFunctionName()) << " (" << buildStacktraceFrameLocationPart(frame) << ")";
243+
ss << "at " << functionNameConverted << " (" << buildStacktraceFrameLocationPart(frame) << ")";
226244
}
227245

228-
return ss.str();
246+
std::string stringResult = ss.str();
247+
248+
return stringResult;
229249
}
230250

231251
void Console::traceCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
232252
auto isolate = info.GetIsolate();
233253
std::stringstream ss;
234254

235255
std::string logString = buildLogString(info);
236-
ss << logString;
237256

238-
// append a new line
239-
if (logString.length()) {
240-
ss << std::endl;
257+
if (logString.compare("\n") == 0) {
258+
ss << "Trace";
259+
} else {
260+
ss << "Trace: " << logString;
241261
}
242262

243-
ss << "Trace" << std::endl;
263+
ss << std::endl;
244264

245265
v8::HandleScope scope(isolate);
246266

test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-log-agent-impl.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,17 @@ void V8LogAgentImpl::disable(ErrorString*) {
4646
m_enabled = false;
4747
}
4848

49-
void V8LogAgentImpl::startViolationsReport(ErrorString*,
49+
void V8LogAgentImpl::startViolationsReport(ErrorString* errorString,
5050
std::unique_ptr<protocol::Array<protocol::Log::ViolationSetting>> in_config) {
51-
51+
*errorString = "startViolationsReport not implemented.";
5252
}
5353

54-
void V8LogAgentImpl::stopViolationsReport(ErrorString*) {
55-
54+
void V8LogAgentImpl::stopViolationsReport(ErrorString* errorString) {
55+
*errorString = "stopViolationsReport not implemented.";
5656
}
5757

58-
void V8LogAgentImpl::clear(ErrorString*) {
59-
58+
void V8LogAgentImpl::clear(ErrorString* errorString) {
59+
*errorString = "clear not implemented.";
6060
}
6161

6262
void V8LogAgentImpl::EntryAdded(const std::string& text, std::string verbosityLevel, std::string url, int lineNumber) {

test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-log-agent-impl.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ class V8LogAgentImpl : public protocol::Log::Backend {
3333

3434
static void EntryAdded(const std::string& text, std::string verbosityLevel, std::string url, int lineNumber);
3535

36-
static V8LogAgentImpl* Instance;
37-
protocol::Log::Frontend m_frontend;
38-
3936
private:
4037
V8InspectorSessionImpl* m_session;
4138
protocol::DictionaryValue* m_state;
39+
protocol::Log::Frontend m_frontend;
4240
bool m_enabled;
41+
42+
static V8LogAgentImpl* Instance;
4343
};
4444

4545
}

0 commit comments

Comments
 (0)