From a714a3a446a47b3ac18de6cea1e6c4ca01535170 Mon Sep 17 00:00:00 2001 From: Maximilian Goldstein Date: Thu, 9 Apr 2020 13:34:01 +0200 Subject: Implement URLSearchParams Implements URLSearchParams (https://url.spec.whatwg.org/#urlsearchparams), completing our implementation of the URL object. Still needs the for..of iterator to get implemented. Change-Id: Iad33ed2f3fe0b2598ca2b0b21a4743f5f7dc19fd Reviewed-by: Ulf Hermann --- src/qml/jsruntime/qv4urlobject_p.h | 103 +++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) (limited to 'src/qml/jsruntime/qv4urlobject_p.h') diff --git a/src/qml/jsruntime/qv4urlobject_p.h b/src/qml/jsruntime/qv4urlobject_p.h index bc066818b6..aa0e7a062f 100644 --- a/src/qml/jsruntime/qv4urlobject_p.h +++ b/src/qml/jsruntime/qv4urlobject_p.h @@ -85,6 +85,24 @@ struct UrlCtor : FunctionObject { void init(QV4::ExecutionContext *scope); }; + +// clang-format on +#define UrlSearchParamsObjectMembers(class, Member) \ + Member(class, Pointer, ArrayObject *, params) \ + Member(class, Pointer, ArrayObject *, keys) \ + Member(class, Pointer, ArrayObject *, values) +// clang-format off + +DECLARE_HEAP_OBJECT(UrlSearchParamsObject, Object) +{ + DECLARE_MARKOBJECTS(UrlSearchParamsObject); + void init() { Object::init(); } +}; + +struct UrlSearchParamsCtor : FunctionObject +{ + void init(QV4::ExecutionContext *scope); +}; } struct UrlObject : Object @@ -205,6 +223,91 @@ struct UrlPrototype : Object const Value *argv, int argc); static ReturnedValue method_setUsername(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + + static ReturnedValue method_getSearchParams(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); +}; + +struct UrlSearchParamsObject : Object +{ + V4_OBJECT2(UrlSearchParamsObject, Object) + Q_MANAGED_TYPE(UrlSearchParamsObject) + V4_PROTOTYPE(urlSearchParamsPrototype) + + void initializeParams(); + void initializeParams(QString params); + void initializeParams(ScopedArrayObject& params); + void initializeParams(ScopedObject& params); + + QList params() const; + void setParams(QList params); + + QString nameAt(int index) const; + Heap::String * nameAtRaw(int index) const; + QString valueAt(int index) const; + Heap::String * valueAtRaw(int index) const; + + void append(Heap::String *name, Heap::String *value); + + int indexOf(QString name, int last = -1) const; + int length() const; + + using Object::getOwnProperty; +protected: + static OwnPropertyKeyIterator *virtualOwnPropertyKeys(const Object *m, Value *target); + static PropertyAttributes virtualGetOwnProperty(const Managed *m, PropertyKey id, Property *p); +private: + QString stringAt(int index, int pairIndex) const; + Heap::String * stringAtRaw(int index, int pairIndex) const; +}; + +template<> +inline const UrlSearchParamsObject *Value::as() const +{ + return isManaged() && m()->internalClass->vtable->type == Managed::Type_UrlSearchParamsObject + ? static_cast(this) + : nullptr; +} + +struct UrlSearchParamsCtor : FunctionObject +{ + V4_OBJECT2(UrlSearchParamsCtor, FunctionObject) + + static ReturnedValue virtualCallAsConstructor(const FunctionObject *, const Value *argv, + int argc, const Value *); +}; + +struct UrlSearchParamsPrototype : Object +{ + V4_PROTOTYPE(objectPrototype) + + void init(ExecutionEngine *engine, Object *ctor); + + static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_sort(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_append(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_delete(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_has(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_set(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_get(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_getAll(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_forEach(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_entries(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_keys(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + static ReturnedValue method_values(const FunctionObject *, const Value *thisObject, + const Value *argv, int argc); + }; } -- cgit v1.2.3