Skip to content

Commit 10fd791

Browse files
Jake ChampionJakeChampion
authored andcommitted
Allow URLSearchParams to be used as a base class to extend from within application javascript
1 parent 299e782 commit 10fd791

File tree

2 files changed

+76
-47
lines changed

2 files changed

+76
-47
lines changed

c-dependencies/js-compute-runtime/js-compute-builtins.cpp

Lines changed: 75 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -954,11 +954,63 @@ bool SetBackpressure(JSContext *cx, HandleObject stream, bool backpressure);
954954
bool Error(JSContext *cx, HandleObject stream, HandleValue error);
955955
} // namespace TransformStream
956956

957+
#define ITERTYPE_ENTRIES 0
958+
#define ITERTYPE_KEYS 1
959+
#define ITERTYPE_VALUES 2
957960
namespace URLSearchParams {
958-
bool is_instance(JSObject *obj);
959-
JSObject *create(JSContext *cx, jsurl::JSUrl *url);
961+
962+
namespace Slots {
963+
enum { Url, Params, Count };
964+
};
965+
960966
JSUrlSearchParams *get_params(JSObject *self);
967+
968+
namespace detail {
969+
bool append(JSContext *cx, HandleObject self, HandleValue key, HandleValue val, const char *_);
970+
} // namespace detail
971+
961972
SpecSlice serialize(JSContext *cx, HandleObject self);
973+
974+
bool check_receiver(JSContext *cx, HandleValue receiver, const char *method_name);
975+
976+
const unsigned ctor_length = 1;
977+
978+
bool append(JSContext *cx, unsigned argc, Value *vp);
979+
980+
bool delete_(JSContext *cx, unsigned argc, Value *vp);
981+
982+
bool has(JSContext *cx, unsigned argc, Value *vp);
983+
984+
bool get(JSContext *cx, unsigned argc, Value *vp);
985+
986+
bool getAll(JSContext *cx, unsigned argc, Value *vp);
987+
988+
bool set(JSContext *cx, unsigned argc, Value *vp);
989+
990+
bool sort(JSContext *cx, unsigned argc, Value *vp);
991+
992+
bool toString(JSContext *cx, unsigned argc, Value *vp);
993+
994+
bool forEach(JSContext *cx, unsigned argc, Value *vp);
995+
996+
template <auto type> bool get_iter(JSContext *cx, unsigned argc, Value *vp);
997+
998+
const JSFunctionSpec methods[] = {
999+
JS_FN("append", append, 2, JSPROP_ENUMERATE), JS_FN("delete", delete_, 1, JSPROP_ENUMERATE),
1000+
JS_FN("has", has, 1, JSPROP_ENUMERATE), JS_FN("get", get, 1, JSPROP_ENUMERATE),
1001+
JS_FN("getAll", getAll, 1, JSPROP_ENUMERATE), JS_FN("set", set, 2, JSPROP_ENUMERATE),
1002+
JS_FN("sort", sort, 0, JSPROP_ENUMERATE), JS_FN("toString", toString, 0, JSPROP_ENUMERATE),
1003+
JS_FN("forEach", forEach, 0, JSPROP_ENUMERATE),
1004+
JS_FN("entries", get_iter<ITERTYPE_ENTRIES>, 0, 0),
1005+
JS_FN("keys", get_iter<ITERTYPE_KEYS>, 0, 0), JS_FN("values", get_iter<ITERTYPE_VALUES>, 0, 0),
1006+
// [Symbol.iterator] added in init_class.
1007+
JS_FS_END};
1008+
1009+
const JSPropertySpec properties[] = {JS_PS_END};
1010+
bool constructor(JSContext *cx, unsigned argc, Value *vp);
1011+
CLASS_BOILERPLATE_CUSTOM_INIT(URLSearchParams)
1012+
1013+
JSObject *create(JSContext *cx, HandleObject self, jsurl::JSUrl *url);
9621014
} // namespace URLSearchParams
9631015

9641016
namespace RequestOrResponse {
@@ -6690,7 +6742,11 @@ bool searchParams_get(JSContext *cx, unsigned argc, Value *vp) {
66906742
RootedObject params(cx);
66916743
if (params_val.isNullOrUndefined()) {
66926744
JSUrl *url = (JSUrl *)JS::GetReservedSlot(self, Slots::Url).toPrivate();
6693-
params = URLSearchParams::create(cx, url);
6745+
RootedObject url_search_params_intance(
6746+
cx, JS_NewObjectWithGivenProto(cx, &URLSearchParams::class_, URLSearchParams::proto_obj));
6747+
if (!self)
6748+
return false;
6749+
params = URLSearchParams::create(cx, url_search_params_intance, url);
66946750
if (!params)
66956751
return false;
66966752
JS::SetReservedSlot(self, Slots::Params, JS::ObjectValue(*params));
@@ -6793,10 +6849,6 @@ JSObject *create(JSContext *cx, HandleValue url_val, HandleValue base_val) {
67936849
}
67946850
} // namespace URL
67956851

6796-
#define ITERTYPE_ENTRIES 0
6797-
#define ITERTYPE_KEYS 1
6798-
#define ITERTYPE_VALUES 2
6799-
68006852
namespace URLSearchParamsIterator {
68016853
namespace Slots {
68026854
enum { Params, Type, Index, Count };
@@ -6923,9 +6975,6 @@ JSObject *create(JSContext *cx, HandleObject params, uint8_t type) {
69236975
} // namespace URLSearchParamsIterator
69246976

69256977
namespace URLSearchParams {
6926-
namespace Slots {
6927-
enum { Url, Params, Count };
6928-
};
69296978

69306979
JSUrlSearchParams *get_params(JSObject *self) {
69316980
return (JSUrlSearchParams *)JS::GetReservedSlot(self, Slots::Params).toPrivate();
@@ -6953,20 +7002,6 @@ SpecSlice serialize(JSContext *cx, HandleObject self) {
69537002
}
69547003

69557004
bool check_receiver(JSContext *cx, HandleValue receiver, const char *method_name);
6956-
JSObject *create(JSContext *cx, HandleValue params_val);
6957-
6958-
const unsigned ctor_length = 1;
6959-
6960-
bool constructor(JSContext *cx, unsigned argc, Value *vp) {
6961-
CTOR_HEADER("URLSearchParams", 0);
6962-
6963-
RootedObject self(cx, create(cx, args.get(0)));
6964-
if (!self)
6965-
return false;
6966-
6967-
args.rval().setObject(*self);
6968-
return true;
6969-
}
69707005

69717006
bool append(JSContext *cx, unsigned argc, Value *vp) {
69727007
METHOD_HEADER(2)
@@ -7148,20 +7183,18 @@ template <auto type> bool get_iter(JSContext *cx, unsigned argc, Value *vp) {
71487183
return true;
71497184
}
71507185

7151-
const JSFunctionSpec methods[] = {
7152-
JS_FN("append", append, 2, JSPROP_ENUMERATE), JS_FN("delete", delete_, 1, JSPROP_ENUMERATE),
7153-
JS_FN("has", has, 1, JSPROP_ENUMERATE), JS_FN("get", get, 1, JSPROP_ENUMERATE),
7154-
JS_FN("getAll", getAll, 1, JSPROP_ENUMERATE), JS_FN("set", set, 2, JSPROP_ENUMERATE),
7155-
JS_FN("sort", sort, 0, JSPROP_ENUMERATE), JS_FN("toString", toString, 0, JSPROP_ENUMERATE),
7156-
JS_FN("forEach", forEach, 0, JSPROP_ENUMERATE),
7157-
JS_FN("entries", get_iter<ITERTYPE_ENTRIES>, 0, 0),
7158-
JS_FN("keys", get_iter<ITERTYPE_KEYS>, 0, 0), JS_FN("values", get_iter<ITERTYPE_VALUES>, 0, 0),
7159-
// [Symbol.iterator] added in init_class.
7160-
JS_FS_END};
7186+
JSObject *create(JSContext *cx, HandleObject self, HandleValue params_val);
7187+
bool constructor(JSContext *cx, unsigned argc, Value *vp) {
7188+
CTOR_HEADER("URLSearchParams", 0);
71617189

7162-
const JSPropertySpec properties[] = {JS_PS_END};
7190+
RootedObject urlSearchParamsInstance(cx, JS_NewObjectForConstructor(cx, &class_, args));
7191+
RootedObject self(cx, create(cx, urlSearchParamsInstance, args.get(0)));
7192+
if (!self)
7193+
return false;
71637194

7164-
CLASS_BOILERPLATE_CUSTOM_INIT(URLSearchParams)
7195+
args.rval().setObject(*self);
7196+
return true;
7197+
}
71657198

71667199
bool init_class(JSContext *cx, HandleObject global) {
71677200
if (!init_class_impl(cx, global))
@@ -7176,11 +7209,8 @@ bool init_class(JSContext *cx, HandleObject global) {
71767209
return JS_DefinePropertyById(cx, proto_obj, iteratorId, entries, 0);
71777210
}
71787211

7179-
JSObject *create(JSContext *cx, HandleValue params_val = JS::UndefinedHandleValue) {
7180-
RootedObject self(cx, JS_NewObjectWithGivenProto(cx, &class_, proto_obj));
7181-
if (!self)
7182-
return nullptr;
7183-
7212+
JSObject *create(JSContext *cx, HandleObject self,
7213+
HandleValue params_val = JS::UndefinedHandleValue) {
71847214
auto params = jsurl::new_params();
71857215
JS::SetReservedSlot(self, Slots::Params, JS::PrivateValue(params));
71867216

@@ -7202,10 +7232,7 @@ JSObject *create(JSContext *cx, HandleValue params_val = JS::UndefinedHandleValu
72027232
return self;
72037233
}
72047234

7205-
JSObject *create(JSContext *cx, JSUrl *url) {
7206-
RootedObject self(cx, JS_NewObjectWithGivenProto(cx, &class_, proto_obj));
7207-
if (!self)
7208-
return nullptr;
7235+
JSObject *create(JSContext *cx, HandleObject self, JSUrl *url) {
72097236

72107237
JSUrlSearchParams *params = jsurl::url_search_params(url);
72117238
if (!params)
@@ -7452,7 +7479,9 @@ JSObject *ReadStructuredClone(JSContext *cx, JSStructuredCloneReader *r,
74527479
uint32_t len, void *closure) {
74537480
MOZ_ASSERT(tag == SCTAG_DOM_URLSEARCHPARAMS);
74547481

7455-
RootedObject params_obj(cx, URLSearchParams::create(cx));
7482+
RootedObject urlSearchParamsInstance(
7483+
cx, JS_NewObjectWithGivenProto(cx, &URLSearchParams::class_, URLSearchParams::proto_obj));
7484+
RootedObject params_obj(cx, URLSearchParams::create(cx, urlSearchParamsInstance));
74567485
if (!params_obj) {
74577486
return nullptr;
74587487
}

integration-tests/js-compute/fixtures/extend-from-builtins/extend-from-builtins.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const builtins = [
1111
TextEncoder,
1212
TextDecoder,
1313
// URL,
14-
// URLSearchParams,
14+
URLSearchParams,
1515
]
1616

1717
addEventListener("fetch", event => {

0 commit comments

Comments
 (0)