Skip to content

Commit 9ebf503

Browse files
authored
Merge pull request #781 from NativeScript/pete/fix-inspector-encoding
Fix inspector string encoding utf8-utf16
2 parents 3784d78 + 9d3e38b commit 9ebf503

12 files changed

+242
-196
lines changed

runtime/src/main/jni/ArgConverter.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,17 @@ string ArgConverter::ConvertToString(const v8::Local<String>& s) {
244244
}
245245
}
246246

247+
u16string ArgConverter::ConvertToUtf16String(const v8::Local<String>& s) {
248+
if (s.IsEmpty()) {
249+
return u16string();
250+
} else {
251+
auto str = ConvertToString(s);
252+
auto utf16str = Util::ConvertFromUtf8ToUtf16(str);
253+
254+
return utf16str;
255+
}
256+
}
257+
247258
jstring ArgConverter::ConvertToJavaString(const Local<Value>& value) {
248259
JEnv env;
249260
String::Value stringValue(value);
@@ -263,5 +274,18 @@ Local<String> ArgConverter::ConvertToV8String(Isolate* isolate, const char* data
263274
return String::NewFromUtf8(isolate, (const char*) data, String::kNormalString, length);
264275
}
265276

277+
Local<String> ArgConverter::ConvertToV8UTF16String(Isolate* isolate, const string& string) {
278+
auto utf16str = Util::ConvertFromUtf8ToUtf16(string);
279+
280+
return ConvertToV8UTF16String(isolate, utf16str);
281+
}
282+
283+
Local<String> ArgConverter::ConvertToV8UTF16String(Isolate* isolate, const u16string& utf16string) {
284+
return String::NewFromTwoByte(isolate, ((const uint16_t*) utf16string.data()));
285+
}
286+
287+
Local<String> ArgConverter::ConvertToV8UTF16String(v8::Isolate* isolate, const uint16_t* utf16string, int size) {
288+
return String::NewFromTwoByte(isolate, utf16string, NewStringType::kNormal, size).ToLocalChecked();
289+
}
266290

267291
std::map<Isolate*, ArgConverter::TypeLongOperationsCache*> ArgConverter::s_type_long_operations_cache;

runtime/src/main/jni/ArgConverter.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class ArgConverter {
3030

3131
static std::string ConvertToString(const v8::Local<v8::String>& s);
3232

33+
static std::u16string ConvertToUtf16String(const v8::Local<v8::String>& s);
34+
3335
static jstring ConvertToJavaString(const v8::Local<v8::Value>& jsValue);
3436

3537
static v8::Local<v8::String> ConvertToV8String(v8::Isolate* isolate, const jchar* data, int length);
@@ -38,6 +40,12 @@ class ArgConverter {
3840

3941
static v8::Local<v8::String> ConvertToV8String(v8::Isolate* isolate, const char* data, int length);
4042

43+
static v8::Local<v8::String> ConvertToV8UTF16String(v8::Isolate* isolate, const std::string& string);
44+
45+
static v8::Local<v8::String> ConvertToV8UTF16String(v8::Isolate* isolate, const uint16_t* utf16string, int size);
46+
47+
static v8::Local<v8::String> ConvertToV8UTF16String(v8::Isolate* isolate, const std::u16string& utf16string);
48+
4149
private:
4250

4351
// TODO: plamen5kov: rewrite logic for java long number operations in javascript (java long -> javascript number operations check)

runtime/src/main/jni/DOMDomainCallbackHandlers.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
using namespace tns;
1111

12-
void DOMDomainCallbackHandlers::DocumentUpdatedCallback(const v8::FunctionCallbackInfo<v8::Value> &args) {
12+
void DOMDomainCallbackHandlers::DocumentUpdatedCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
1313
auto domAgentInstance = V8DOMAgentImpl::Instance;
1414

1515
if (!domAgentInstance) {
@@ -19,7 +19,7 @@ void DOMDomainCallbackHandlers::DocumentUpdatedCallback(const v8::FunctionCallba
1919
domAgentInstance->m_frontend.documentUpdated();
2020
}
2121

22-
void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCallbackInfo<v8::Value> &args) {
22+
void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
2323
try {
2424
auto domAgentInstance = V8DOMAgentImpl::Instance;
2525

@@ -39,9 +39,7 @@ void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCall
3939
auto lastId = args[1]->ToNumber(isolate);
4040
auto node = args[2]->ToString(isolate);
4141

42-
auto nodeString = ArgConverter::ConvertToString(node);
43-
auto nodeCStr = nodeString.c_str();
44-
auto nodeJson = protocol::parseJSON(nodeCStr);
42+
auto nodeJson = protocol::parseJSON(v8_inspector::toProtocolString(node));
4543

4644
protocol::ErrorSupport errorSupport;
4745
auto domNode = protocol::DOM::Node::parse(nodeJson.get(), &errorSupport);
@@ -66,7 +64,7 @@ void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCall
6664
}
6765
}
6866

69-
void DOMDomainCallbackHandlers::ChildNodeRemovedCallback(const v8::FunctionCallbackInfo<v8::Value> &args) {
67+
void DOMDomainCallbackHandlers::ChildNodeRemovedCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
7068
try {
7169
auto domAgentInstance = V8DOMAgentImpl::Instance;
7270

@@ -99,7 +97,7 @@ void DOMDomainCallbackHandlers::ChildNodeRemovedCallback(const v8::FunctionCallb
9997
}
10098
}
10199

102-
void DOMDomainCallbackHandlers::AttributeModifiedCallback(const v8::FunctionCallbackInfo<v8::Value> &args) {
100+
void DOMDomainCallbackHandlers::AttributeModifiedCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
103101
try {
104102
auto domAgentInstance = V8DOMAgentImpl::Instance;
105103

@@ -119,9 +117,9 @@ void DOMDomainCallbackHandlers::AttributeModifiedCallback(const v8::FunctionCall
119117
auto attributeName = args[1]->ToString();
120118
auto attributeValue = args[2]->ToString();
121119

122-
domAgentInstance->m_frontend.attributeModified(nodeId->Int32Value(),
123-
ArgConverter::ConvertToString(attributeName).c_str(),
124-
ArgConverter::ConvertToString(attributeValue).c_str());
120+
domAgentInstance->m_frontend.attributeModified(nodeId->Int32Value(),
121+
v8_inspector::toProtocolString(attributeName),
122+
v8_inspector::toProtocolString(attributeValue));
125123
} catch (NativeScriptException& e) {
126124
e.ReThrowToV8();
127125
} catch (std::exception e) {
@@ -135,7 +133,7 @@ void DOMDomainCallbackHandlers::AttributeModifiedCallback(const v8::FunctionCall
135133
}
136134
}
137135

138-
void DOMDomainCallbackHandlers::AttributeRemovedCallback(const v8::FunctionCallbackInfo<v8::Value> &args) {
136+
void DOMDomainCallbackHandlers::AttributeRemovedCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
139137
try {
140138
auto domAgentInstance = V8DOMAgentImpl::Instance;
141139

@@ -154,7 +152,7 @@ void DOMDomainCallbackHandlers::AttributeRemovedCallback(const v8::FunctionCallb
154152
auto attributeName = args[1]->ToString();
155153

156154
domAgentInstance->m_frontend.attributeRemoved(nodeId->Int32Value(),
157-
ArgConverter::ConvertToString(attributeName).c_str());
155+
v8_inspector::toProtocolString(attributeName));
158156
} catch (NativeScriptException& e) {
159157
e.ReThrowToV8();
160158
} catch (std::exception e) {

runtime/src/main/jni/NetworkDomainCallbackHandlers.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ void NetworkDomainCallbackHandlers::ResponseReceivedCallback(const v8::FunctionC
4949
throw NativeScriptException("`response` parameter not in the correct format.");
5050
}
5151

52-
auto responseJsonString = ArgConverter::ConvertToString(responseJson);
53-
auto responseJsonCString = responseJsonString.c_str();
54-
auto protocolResponseJson = protocol::parseJSON(responseJsonCString);
52+
auto responseJsonString = ArgConverter::ConvertToUtf16String(responseJson);
53+
auto responseUtf16Data = responseJsonString.data();
54+
auto protocolResponseJson = protocol::parseJSON(String16((const uint16_t*) responseUtf16Data));
5555

5656
protocol::ErrorSupport errorSupport;
5757

@@ -133,9 +133,9 @@ void NetworkDomainCallbackHandlers::RequestWillBeSentCallback(const v8::Function
133133
throw NativeScriptException("`request` parameter not in the correct format.");
134134
}
135135

136-
auto requestJsonString = ArgConverter::ConvertToString(requestJson);
137-
auto requestJsonCString = requestJsonString.c_str();
138-
auto protocolRequestJson = protocol::parseJSON(requestJsonCString);
136+
auto requestJsonString = ArgConverter::ConvertToUtf16String(requestJson);
137+
auto requestUtf16Data = requestJsonString.data();
138+
auto protocolRequestJson = protocol::parseJSON(String16((const uint16_t*) requestUtf16Data));
139139

140140
protocol::ErrorSupport errorSupport;
141141

@@ -207,7 +207,7 @@ void NetworkDomainCallbackHandlers::DataForRequestIdCallback(const v8::FunctionC
207207
auto hasTextContent = argsObj->Get(context, ArgConverter::ConvertToV8String(isolate, "hasTextContent")).ToLocalChecked()->ToBoolean();
208208

209209
auto requestIdString = ArgConverter::ConvertToString(requestId).c_str();
210-
auto dataString = ArgConverter::ConvertToString(data);
210+
auto dataString = ArgConverter::ConvertToUtf16String(data);
211211
auto hasTextContentBool = hasTextContent->BooleanValue();
212212

213213
auto responses = networkAgentInstance->m_responses;
@@ -219,11 +219,7 @@ void NetworkDomainCallbackHandlers::DataForRequestIdCallback(const v8::FunctionC
219219
} else {
220220
v8_inspector::utils::NetworkRequestData* response = it->second;
221221

222-
if (!hasTextContentBool) {
223-
response->setData(dataString);
224-
} else {
225-
response->setData(ArgConverter::ConvertToString(data));
226-
}
222+
response->setData(dataString);
227223

228224
response->setHasTextContent(hasTextContentBool);
229225
}

runtime/src/main/jni/Util.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "Util.h"
22
#include <sstream>
3+
#include <iostream>
4+
#include <codecvt>
35

46
using namespace v8;
57
using namespace std;
@@ -77,28 +79,34 @@ bool Util::EndsWith(const string& str, const string& suffix) {
7779
return res;
7880
}
7981

80-
string Util::ConvertFromJniToCanonicalName(const std::string& name) {
82+
string Util::ConvertFromJniToCanonicalName(const string& name) {
8183
string converted = name;
8284
replace(converted.begin(), converted.end(), '/', '.');
8385
return converted;
8486
}
8587

86-
string Util::ConvertFromCanonicalToJniName(const std::string& name) {
88+
string Util::ConvertFromCanonicalToJniName(const string& name) {
8789
string converted = name;
8890
replace(converted.begin(), converted.end(), '.', '/');
8991
return converted;
9092
}
9193

92-
string Util::ReplaceAll(std::string& str, const std::string& from, const std::string& to) {
94+
string Util::ReplaceAll(string& str, const string& from, const string& to) {
9395
if (from.empty()) {
9496
return str;
9597
}
9698

9799
size_t start_pos = 0;
98-
while ((start_pos = str.find(from, start_pos)) != std::string::npos) {
100+
while ((start_pos = str.find(from, start_pos)) != string::npos) {
99101
str.replace(start_pos, from.length(), to);
100102
start_pos += to.length();
101103
}
102104

103105
return str;
106+
}
107+
108+
u16string Util::ConvertFromUtf8ToUtf16(const string& str) {
109+
auto utf16String = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>().from_bytes(str);
110+
111+
return utf16String;
104112
}

runtime/src/main/jni/Util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class Util {
1919
static std::string ConvertFromCanonicalToJniName(const std::string& name);
2020

2121
static std::string ReplaceAll(std::string& str, const std::string& from, const std::string& to);
22+
23+
static std::u16string ConvertFromUtf8ToUtf16(const std::string& str);
2224
};
2325
}
2426

runtime/src/main/jni/v8_inspector/src/inspector/utils/v8-network-request-data.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
namespace v8_inspector {
88
namespace utils {
99
NetworkRequestData::NetworkRequestData()
10-
: m_data(""),
10+
: m_data(),
1111
m_hasTextContent(true) { }
12-
NetworkRequestData::NetworkRequestData(std::string data, bool hasTextContent)
12+
NetworkRequestData::NetworkRequestData(std::u16string data, bool hasTextContent)
1313
: m_data(data),
1414
m_hasTextContent(hasTextContent) { }
1515
}

runtime/src/main/jni/v8_inspector/src/inspector/utils/v8-network-request-data.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ namespace utils {
1313
class NetworkRequestData {
1414
public:
1515
NetworkRequestData();
16-
NetworkRequestData(std::string data, bool hasTextContent);
17-
const char* getData() {
18-
return m_data.c_str();
16+
NetworkRequestData(std::u16string data, bool hasTextContent);
17+
const char16_t* getData() {
18+
return m_data.data();
1919
};
2020

2121
const bool hasTextContent() {
2222
return m_hasTextContent;
2323
}
2424

25-
void setData(const std::string& data) {
25+
void setData(const std::u16string& data) {
2626
m_data = data;
2727
}
2828

@@ -31,7 +31,7 @@ class NetworkRequestData {
3131
}
3232

3333
private:
34-
std::string m_data;
34+
std::u16string m_data;
3535
bool m_hasTextContent;
3636
};
3737
}

runtime/src/main/jni/v8_inspector/src/inspector/utils/v8-page-resources.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <fstream>
1010
#include <iostream>
1111
#include <JniLocalRef.h>
12+
#include <Util.h>
1213
#include "base64.h"
1314
#include "v8_inspector/src/inspector/utils/v8-page-resources.h"
1415
#include "JEnv.h"
@@ -19,7 +20,7 @@ namespace utils {
1920
PageResource::PageResource(std::string filePath, std::string mimeType)
2021
: m_filePath(filePath),
2122
m_mimeType(mimeType),
22-
m_content("") {
23+
m_content() {
2324

2425
m_type = PageResource::resourceTypeByMimeType(m_mimeType);
2526
}
@@ -82,15 +83,17 @@ String16 PageResource::getContent(protocol::ErrorString* errorString) {
8283

8384
if (shouldEncode) {
8485
auto base64EncodedString = base64_encode(buff, size);
85-
m_content = base64EncodedString;
86+
m_content = tns::Util::ConvertFromUtf8ToUtf16(base64EncodedString);
8687
} else {
87-
m_content = std::string(reinterpret_cast<char*>(buff));
88+
auto utf8Content = std::string(reinterpret_cast<char*>(buff));
89+
auto utf16Content = tns::Util::ConvertFromUtf8ToUtf16(utf8Content);
90+
m_content = utf16Content;
8891
}
8992

9093
free(buff);
9194
}
9295

93-
return m_content.c_str();
96+
return String16((const uint16_t*) m_content.data());
9497
}
9598

9699
const char* PageResource::resourceTypeByMimeType(std::string mimeType) {

runtime/src/main/jni/v8_inspector/src/inspector/utils/v8-page-resources.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class PageResource {
4646
private:
4747
std::string m_filePath;
4848
std::string m_mimeType;
49-
std::string m_content;
49+
std::u16string m_content;
5050
const char* m_type;
5151

5252
static std::map<std::string, const char*> s_mimeTypeMap;

0 commit comments

Comments
 (0)