Skip to content

Commit 7c5a136

Browse files
triniwizNathanWalker
authored andcommitted
chore: rename classes, implement createObjectURL, revokeObjectURL & use lite url version
1 parent 7f7a70b commit 7c5a136

File tree

4 files changed

+124
-48
lines changed

4 files changed

+124
-48
lines changed

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

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,12 @@
3131
#include <thread>
3232
#include "File.h"
3333
#include "ModuleBinding.h"
34+
#include "URLImpl.h"
35+
#include "URLSearchParamsImpl.h"
3436

3537
#ifdef APPLICATION_IN_DEBUG
3638
// #include "NetworkDomainCallbackHandlers.h"
3739
#include "JsV8InspectorClient.h"
38-
#include "URLImpl.h"
39-
#include "URLSearchParamsImpl.h"
40-
4140
#endif
4241

4342
using namespace v8;
@@ -522,8 +521,8 @@ Isolate* Runtime::PrepareV8Runtime(const string& filesPath, const string& native
522521
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "__runOnMainThread"), FunctionTemplate::New(isolate, CallbackHandlers::RunOnMainThreadCallback));
523522
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "__postFrameCallback"), FunctionTemplate::New(isolate, CallbackHandlers::PostFrameCallback));
524523
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "__removeFrameCallback"), FunctionTemplate::New(isolate, CallbackHandlers::RemoveFrameCallback));
525-
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "URLImpl"), URLImpl::GetCtor(isolate));
526-
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "URLSearchParamsImpl"), URLSearchParamsImpl::GetCtor(isolate));
524+
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "URL"), URLImpl::GetCtor(isolate));
525+
globalTemplate->Set(ArgConverter::ConvertToV8String(isolate, "URLSearchParams"), URLSearchParamsImpl::GetCtor(isolate));
527526

528527
/*
529528
* Attach `Worker` object constructor only to the main thread (isolate)'s global object
@@ -592,10 +591,85 @@ Isolate* Runtime::PrepareV8Runtime(const string& filesPath, const string& native
592591

593592
Local<Context> context = Context::New(isolate, nullptr, globalTemplate);
594593

594+
auto blob_methods =
595+
"const BLOB_STORE = new Map();\n"
596+
"URL.createObjectURL = function (object, options = null) {\n"
597+
"try {\n"
598+
"if (object instanceof Blob || object instanceof File) {\n"
599+
"const id = java.util.UUID.randomUUID().toString();\n"
600+
"const ret = `blob:nativescript/${id}`;\n"
601+
"BLOB_STORE.set(ret, {\n"
602+
"blob: object,\n"
603+
"type: object?.type,\n"
604+
"ext: options?.ext,\n"
605+
"});\n"
606+
"return ret;\n"
607+
"}\n"
608+
"} catch (error) {\n"
609+
"return null;\n"
610+
"}\n"
611+
"return null;\n"
612+
"};\n"
613+
"\n"
614+
"URL.revokeObjectURL = function (url) {\n"
615+
"BLOB_STORE.delete(url);\n"
616+
"};\n"
617+
"\n"
618+
"const InternalAccessor = class {};\n"
619+
"\n"
620+
"InternalAccessor.getData = function (url) {\n"
621+
"return BLOB_STORE.get(url);\n"
622+
"};\n"
623+
"\n"
624+
"URL.InternalAccessor = InternalAccessor;\n"
625+
"Object.defineProperty(URL.prototype, 'searchParams', {\n"
626+
"get() {\n"
627+
"if (this._searchParams == null) {\n"
628+
"this._searchParams = new URLSearchParams(this.search);\n"
629+
"Object.defineProperty(this._searchParams, '_url', {\n"
630+
"enumerable: false,\n"
631+
"writable: false,\n"
632+
"value: this,\n"
633+
"});\n"
634+
"\n"
635+
"this._searchParams._append = this._searchParams.append;\n"
636+
"this._searchParams.append = function (name, value) {\n"
637+
"this._append(name, value);\n"
638+
"this._url.search = this.toString();\n"
639+
"};\n"
640+
"\n"
641+
"this._searchParams._delete = this._searchParams.delete;\n"
642+
"this._searchParams.delete = function (name) {\n"
643+
"this._delete(name);\n"
644+
"this._url.search = this.toString();\n"
645+
"};\n"
646+
"\n"
647+
"this._searchParams._set = this._searchParams.set;\n"
648+
"this._searchParams.set = function (name, value) {\n"
649+
"this._set(name, value);\n"
650+
"this._url.search = this.toString();\n"
651+
"};\n"
652+
"\n"
653+
"this._searchParams._sort = this._searchParams.sort;\n"
654+
"this._searchParams.sort = function () {\n"
655+
"this._sort();\n"
656+
"this._url.search = this.toString();\n"
657+
"};\n"
658+
"}\n"
659+
"return this._searchParams;\n"
660+
"},\n"
661+
"});";
662+
663+
595664
auto global = context->Global();
596665

597666
v8::Context::Scope contextScope{context};
598667

668+
v8::Local<v8::Script> script;
669+
v8::Script::Compile(context, ArgConverter::ConvertToV8String(isolate, blob_methods)).ToLocal(&script);
670+
671+
v8::Local<v8::Value> out;
672+
script->Run(context).ToLocal(&out);
599673
m_objectManager->Init(isolate);
600674

601675
m_module.Init(isolate, callingDir);

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

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using namespace tns;
88
using namespace ada;
99

10-
URLImpl::URLImpl(url url) : url_(url) {}
10+
URLImpl::URLImpl(url_aggregator url) : url_(url) {}
1111

1212
URLImpl *URLImpl::GetPointer(v8::Local<v8::Object> object) {
1313
auto ptr = object->GetAlignedPointerFromInternalField(0);
@@ -17,7 +17,7 @@ URLImpl *URLImpl::GetPointer(v8::Local<v8::Object> object) {
1717
return static_cast<URLImpl *>(ptr);
1818
}
1919

20-
url *URLImpl::GetURL() {
20+
url_aggregator *URLImpl::GetURL() {
2121
return &this->url_;
2222
}
2323

@@ -86,11 +86,11 @@ void URLImpl::Ctor(const v8::FunctionCallbackInfo<v8::Value> &args) {
8686
auto context = isolate->GetCurrentContext();
8787
if (count >= 1 && !value->IsString()) {
8888
isolate->ThrowException(
89-
v8::Exception::TypeError(ArgConverter::ConvertToV8String(isolate, "")));
89+
v8::Exception::TypeError(v8::String::Empty(isolate)));
9090
return;
9191
}
9292

93-
url url;
93+
url_aggregator url;
9494

9595
auto url_string = ArgConverter::ConvertToString(args[0].As<v8::String>());
9696

@@ -101,18 +101,18 @@ void URLImpl::Ctor(const v8::FunctionCallbackInfo<v8::Value> &args) {
101101

102102
if (!can_parse(url_string, &base_string_view)) {
103103
isolate->ThrowException(
104-
v8::Exception::TypeError(ArgConverter::ConvertToV8String(isolate, "")));
104+
v8::Exception::TypeError(v8::String::Empty(isolate)));
105105
return;
106106
}
107-
auto base_url = ada::parse<ada::url>(base_string_view, nullptr);
107+
auto base_url = ada::parse<ada::url_aggregator>(base_string_view, nullptr);
108108

109-
auto result = ada::parse<ada::url>(url_string, &base_url.value());
109+
auto result = ada::parse<ada::url_aggregator>(url_string, &base_url.value());
110110

111111
if (result) {
112112
url = result.value();
113113
} else {
114114
isolate->ThrowException(
115-
v8::Exception::TypeError(ArgConverter::ConvertToV8String(isolate, "")));
115+
v8::Exception::TypeError(v8::String::Empty(isolate)));
116116
return;
117117
}
118118
} else if (args[1]->IsObject()) {
@@ -122,31 +122,31 @@ void URLImpl::Ctor(const v8::FunctionCallbackInfo<v8::Value> &args) {
122122
if (!can_parse(std::string_view(url_string.data(), url_string.length()),
123123
&base_string_view)) {
124124
isolate->ThrowException(
125-
v8::Exception::TypeError(ArgConverter::ConvertToV8String(isolate, "")));
125+
v8::Exception::TypeError(v8::String::Empty(isolate)));
126126
return;
127127
}
128128

129129

130-
auto base_url = ada::parse<ada::url>(base_string_view, nullptr);
130+
auto base_url = ada::parse<ada::url_aggregator>(base_string_view, nullptr);
131131

132-
auto result = ada::parse<ada::url>(url_string, &base_url.value());
132+
auto result = ada::parse<ada::url_aggregator>(url_string, &base_url.value());
133133

134134
if (result) {
135135
url = result.value();
136136
} else {
137137
isolate->ThrowException(
138-
v8::Exception::TypeError(ArgConverter::ConvertToV8String(isolate, "")));
138+
v8::Exception::TypeError(v8::String::Empty(isolate)));
139139
return;
140140
}
141141
}
142142

143143
} else {
144-
auto result = ada::parse<ada::url>(url_string, nullptr);
144+
auto result = ada::parse<ada::url_aggregator>(url_string, nullptr);
145145
if (result) {
146146
url = result.value();
147147
} else {
148148
isolate->ThrowException(
149-
v8::Exception::TypeError(ArgConverter::ConvertToV8String(isolate, "")));
149+
v8::Exception::TypeError(v8::String::Empty(isolate)));
150150
return;
151151
}
152152

@@ -156,6 +156,7 @@ void URLImpl::Ctor(const v8::FunctionCallbackInfo<v8::Value> &args) {
156156

157157
auto urlImpl = new URLImpl(url);
158158

159+
159160
ret->SetAlignedPointerInInternalField(0, urlImpl);
160161

161162
urlImpl->BindFinalizer(isolate, ret);
@@ -174,12 +175,9 @@ void URLImpl::GetHash(v8::Local<v8::String> property,
174175
}
175176
auto isolate = info.GetIsolate();
176177

177-
auto value = ptr->GetURL()->hash;
178-
if (value) {
179-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.value()));
180-
} else {
181-
info.GetReturnValue().SetEmptyString();
182-
}
178+
auto value = ptr->GetURL()->get_hash();
179+
info.GetReturnValue().Set(
180+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
183181

184182
}
185183

@@ -206,12 +204,9 @@ void URLImpl::GetHost(v8::Local<v8::String> property,
206204
}
207205
auto isolate = info.GetIsolate();
208206

209-
auto value = ptr->GetURL()->host;
210-
if (value) {
211-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.value()));
212-
} else {
213-
info.GetReturnValue().SetEmptyString();
214-
}
207+
auto value = ptr->GetURL()->get_host();
208+
info.GetReturnValue().Set(
209+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
215210
}
216211

217212
void URLImpl::SetHost(v8::Local<v8::String> property,
@@ -238,7 +233,8 @@ void URLImpl::GetHostName(v8::Local<v8::String> property,
238233
auto isolate = info.GetIsolate();
239234
auto value = ptr->GetURL()->get_hostname();
240235

241-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
236+
info.GetReturnValue().Set(
237+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
242238

243239
}
244240

@@ -267,7 +263,8 @@ void URLImpl::GetHref(v8::Local<v8::String> property,
267263

268264
auto value = ptr->GetURL()->get_hostname();
269265

270-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
266+
info.GetReturnValue().Set(
267+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
271268

272269
}
273270

@@ -295,7 +292,8 @@ void URLImpl::GetOrigin(v8::Local<v8::String> property,
295292

296293
auto value = ptr->GetURL()->get_origin();
297294

298-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
295+
info.GetReturnValue().Set(
296+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
299297

300298
}
301299

@@ -310,7 +308,8 @@ void URLImpl::GetPassword(v8::Local<v8::String> property,
310308

311309
auto value = ptr->GetURL()->get_password();
312310

313-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
311+
info.GetReturnValue().Set(
312+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
314313

315314
}
316315

@@ -338,7 +337,8 @@ void URLImpl::GetPathName(v8::Local<v8::String> property,
338337

339338
auto value = ptr->GetURL()->get_pathname();
340339

341-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.data()));
340+
info.GetReturnValue().Set(
341+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
342342

343343
}
344344

@@ -366,7 +366,8 @@ void URLImpl::GetPort(v8::Local<v8::String> property,
366366

367367
auto value = ptr->GetURL()->get_port();
368368

369-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
369+
info.GetReturnValue().Set(
370+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
370371

371372
}
372373

@@ -394,7 +395,8 @@ void URLImpl::GetProtocol(v8::Local<v8::String> property,
394395

395396
auto value = ptr->GetURL()->get_protocol();
396397

397-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
398+
info.GetReturnValue().Set(
399+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
398400

399401
}
400402

@@ -423,7 +425,8 @@ void URLImpl::GetSearch(v8::Local<v8::String> property,
423425

424426
auto value = ptr->GetURL()->get_search();
425427

426-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
428+
info.GetReturnValue().Set(
429+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
427430

428431
}
429432

@@ -452,7 +455,8 @@ void URLImpl::GetUserName(v8::Local<v8::String> property,
452455

453456
auto value = ptr->GetURL()->get_username();
454457

455-
info.GetReturnValue().Set(ArgConverter::ConvertToV8String(isolate, value.c_str()));
458+
info.GetReturnValue().Set(
459+
ArgConverter::ConvertToV8String(isolate, value.data(), value.length()));
456460

457461
}
458462

@@ -479,9 +483,9 @@ void URLImpl::ToString(const v8::FunctionCallbackInfo<v8::Value> &args) {
479483
auto isolate = args.GetIsolate();
480484

481485

482-
auto value = ptr->GetURL()->to_string();
486+
auto value = ptr->GetURL()->get_href();
483487

484-
auto ret = ArgConverter::ConvertToV8String(isolate, value.c_str());
488+
auto ret = ArgConverter::ConvertToV8String(isolate, value.data(), value.length());
485489

486490
args.GetReturnValue().Set(ret);
487491
}

test-app/runtime/src/main/cpp/URLImpl.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ using namespace ada;
1313
namespace tns {
1414
class URLImpl {
1515
public:
16-
URLImpl(url url);
16+
URLImpl(url_aggregator url);
1717

18-
url *GetURL();
18+
url_aggregator *GetURL();
1919

2020
static URLImpl *GetPointer(v8::Local<v8::Object> object);
2121

@@ -91,7 +91,6 @@ namespace tns {
9191
v8::Local<v8::Value> value,
9292
const v8::PropertyCallbackInfo<void> &info);
9393

94-
9594
static void
9695
GetSearch(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value> &info);
9796

@@ -124,7 +123,7 @@ namespace tns {
124123
}
125124

126125
private:
127-
url url_;
126+
url_aggregator url_;
128127
v8::Global<v8::Object> weakHandle_;
129128
};
130129
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace tns {
1919

2020
v8::Local<v8::FunctionTemplate> URLSearchParamsImpl::GetCtor(v8::Isolate *isolate) {
2121
v8::Local<v8::FunctionTemplate> ctorTmpl = v8::FunctionTemplate::New(isolate, Ctor);
22-
ctorTmpl->SetClassName(ArgConverter::ConvertToV8String(isolate, "URLSearchParamsImpl"));
22+
ctorTmpl->SetClassName(ArgConverter::ConvertToV8String(isolate, "URLSearchParams"));
2323

2424
auto tmpl = ctorTmpl->InstanceTemplate();
2525
tmpl->SetInternalFieldCount(1);
@@ -94,7 +94,6 @@ namespace tns {
9494
ArgConverter::ConvertToString(value->ToString(context).ToLocalChecked()));
9595
}
9696

97-
9897
auto searchParams = new URLSearchParamsImpl(params);
9998

10099
ret->SetAlignedPointerInInternalField(0, searchParams);

0 commit comments

Comments
 (0)