mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
[spidermonkey] URLSearchparams constructor with array or object
This commit is contained in:
parent
9c9a11d73d
commit
c22b63b857
@ -11,9 +11,11 @@
|
|||||||
#include "elinks.h"
|
#include "elinks.h"
|
||||||
|
|
||||||
#include "ecmascript/spidermonkey/util.h"
|
#include "ecmascript/spidermonkey/util.h"
|
||||||
|
#include <js/Array.h>
|
||||||
#include <js/BigInt.h>
|
#include <js/BigInt.h>
|
||||||
#include <js/Conversions.h>
|
#include <js/Conversions.h>
|
||||||
#include <js/MapAndSet.h>
|
#include <js/MapAndSet.h>
|
||||||
|
#include <js/PropertyAndElement.h>
|
||||||
|
|
||||||
#include "bfu/dialog.h"
|
#include "bfu/dialog.h"
|
||||||
#include "cache/cache.h"
|
#include "cache/cache.h"
|
||||||
@ -146,17 +148,72 @@ urlSearchParams_constructor(JSContext* ctx, unsigned argc, JS::Value* vp)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
JS::SetReservedSlot(newObj, 0, JS::PrivateValue(u));
|
JS::SetReservedSlot(newObj, 0, JS::PrivateValue(u));
|
||||||
|
JS::RootedObject r(ctx, JS::NewMapObject(ctx));
|
||||||
|
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
char *urlstring = jsval_to_string(ctx, args[0]);
|
if (args[0].isObject()) {
|
||||||
|
JS::RootedObject ar(ctx, &args[0].toObject());
|
||||||
|
uint32_t len = 0;
|
||||||
|
JS::GetArrayLength(ctx, ar, &len);
|
||||||
|
|
||||||
if (!urlstring) {
|
if (len > 0) {
|
||||||
return false;
|
for (int i = 0; i < len; i++) {
|
||||||
|
JS::RootedValue val(ctx);
|
||||||
|
|
||||||
|
if (!JS_GetElement(ctx, ar, i, &val)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JS::RootedObject ar2(ctx, &val.toObject());
|
||||||
|
uint32_t len2 = 0;
|
||||||
|
JS::GetArrayLength(ctx, ar2, &len2);
|
||||||
|
|
||||||
|
if (len2 != 2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JS::RootedValue k(ctx);
|
||||||
|
JS::RootedValue v(ctx);
|
||||||
|
|
||||||
|
if (!JS_GetElement(ctx, ar2, 0, &k)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!JS_GetElement(ctx, ar2, 1, &v)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JS::MapSet(ctx, r, k, v);
|
||||||
|
}
|
||||||
|
u->map = r;
|
||||||
|
} else {
|
||||||
|
JS::Rooted<JS::IdVector> props(ctx, JS::IdVector(ctx));
|
||||||
|
JS_Enumerate(ctx, ar, &props);
|
||||||
|
uint32_t len = props.length();
|
||||||
|
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
JS::RootedValue v(ctx);
|
||||||
|
JS::RootedString rst(ctx, props[i].toString());
|
||||||
|
JS::UniqueChars utf8chars = JS_EncodeStringToUTF8(ctx, rst);
|
||||||
|
char *name = utf8chars.get();
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
if (!JS_GetProperty(ctx, ar, name, &v)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JS::RootedValue k(ctx, JS::StringValue(props[i].toString()));
|
||||||
|
JS::MapSet(ctx, r, k, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u->map = r;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
char *urlstring = jsval_to_string(ctx, args[0]);
|
||||||
|
|
||||||
|
if (!urlstring) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
parse_text(ctx, r, urlstring);
|
||||||
|
u->map = r;
|
||||||
|
mem_free(urlstring);
|
||||||
}
|
}
|
||||||
JS::RootedObject r(ctx, JS::NewMapObject(ctx));
|
|
||||||
u->map = r;
|
|
||||||
parse_text(ctx, r, urlstring);
|
|
||||||
mem_free(urlstring);
|
|
||||||
}
|
}
|
||||||
args.rval().setObject(*newObj);
|
args.rval().setObject(*newObj);
|
||||||
|
|
||||||
|
@ -11,5 +11,22 @@ console.assert(param.has('cc'), 'cc');
|
|||||||
console.assert(param.has('bar', '2'), 'bar=2');
|
console.assert(param.has('bar', '2'), 'bar=2');
|
||||||
console.assert(param.get('bar') === '2', 'bar = 2');
|
console.assert(param.get('bar') === '2', 'bar = 2');
|
||||||
console.assert(param.toString() === 'foo=1&bar=2&cc=3', 'without ?');
|
console.assert(param.toString() === 'foo=1&bar=2&cc=3', 'without ?');
|
||||||
|
|
||||||
|
var params3 = new URLSearchParams([
|
||||||
|
["foo", "a1"],
|
||||||
|
["bar", "a2"],
|
||||||
|
["baz", "a3"],
|
||||||
|
]);
|
||||||
|
console.assert(params3.get('bar') === 'a2', 'bar = a2');
|
||||||
|
|
||||||
|
var params4 = new URLSearchParams({
|
||||||
|
foo : "c1",
|
||||||
|
bar : "c2",
|
||||||
|
baz : "c3",
|
||||||
|
});
|
||||||
|
console.assert(params4.get('bar') === 'c2', params4.get('bar'));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
console.exit();
|
console.exit();
|
||||||
</script>
|
</script>
|
||||||
|
Loading…
Reference in New Issue
Block a user