Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qv4urlobject_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4#ifndef QV4URLOBJECT_P_H
5#define QV4URLOBJECT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qv4object_p.h"
20
21#include <QtCore/QString>
22#include <QtCore/QUrl>
23
25
26namespace QV4 {
27namespace Heap {
28#define UrlObjectMembers(class, Member)
29DECLARE_HEAP_OBJECT(UrlObject, Object)
30{
31 DECLARE_MARKOBJECTS(UrlObject)
32 void init()
33 {
34 new (&m_url) QUrl;
35 Object::init();
36 }
37 void init(const QUrl &url)
38 {
39 new (&m_url) QUrl(url);
40 Object::init();
41 }
42
43 void destroy()
44 {
45 std::destroy_at<QUrl>(reinterpret_cast<QUrl *>(&m_url));
46 }
47
48 QUrl url() const { return *reinterpret_cast<const QUrl *>(&m_url); }
49 void setUrl(QUrl &&url) { *reinterpret_cast<QUrl *>(&m_url) = std::move(url); }
50
51 static constexpr auto alignment = alignof(QUrl);
52 alignas(alignment) std::byte m_url[sizeof(QUrl)];
53};
54
56{
57 void init(ExecutionEngine *engine);
58};
59
60// clang-format off
61#define UrlSearchParamsObjectMembers(class, Member)
62 Member(class, Pointer, ArrayObject *, params)
63 Member(class, Pointer, ArrayObject *, keys)
64 Member(class, Pointer, ArrayObject *, values)
65 Member(class, Pointer, UrlObject *, url)
66// clang-format on
67
68DECLARE_HEAP_OBJECT(UrlSearchParamsObject, Object)
69{
70 DECLARE_MARKOBJECTS(UrlSearchParamsObject)
71 void init() { Object::init(); }
72};
73
75{
76 void init(ExecutionEngine *engine);
77};
78}
79
81{
82 V4_OBJECT2(UrlObject, Object)
85 V4_PROTOTYPE(urlPrototype)
86
87 QString hash() const
88 {
89 const QUrl url = constD()->url();
90 return QLatin1Char('#') + url.fragment();
91 }
92 bool setHash(const QString &hash);
93
94 QString host() const
95 {
96 const QUrl url = constD()->url();
97 const int port = url.port();
98 return port == -1 ? url.host() : (url.host() + QLatin1Char(':') + QString::number(port));
99 }
100 bool setHost(const QString &host);
101
102 QString hostname() const
103 {
104 const QUrl url = constD()->url();
105 return url.isValid() ? url.host() : QString();
106 }
107 bool setHostname(const QString &hostname);
108
109 QString href() const
110 {
111 return constD()->url().toString(QUrl::ComponentFormattingOption::FullyEncoded);
112 }
113 bool setHref(const QString &href);
114
115 QString origin() const
116 {
117 const auto resolve = [](const QUrl &url) {
118 const QString proto = url.scheme();
119 if (proto != QLatin1String("http") && proto != QLatin1String("https")
120 && proto != QLatin1String("ftp")) {
121 return QString();
122 }
123
124 if (const int port = url.port(); port != -1)
125 return QLatin1String("%1://%2:%3").arg(proto, url.host(), QString::number(port));
126
127 return QLatin1String("%1://%2").arg(proto, url.host());
128 };
129
130 const QUrl url = constD()->url();
131
132 // A blob's origin is the origin of the URL that it points to
133 return url.scheme() == QLatin1String("blob") ? resolve(QUrl(url.path())) : resolve(url);
134 }
135
136 QString password() const { return constD()->url().password(); }
137 bool setPassword(const QString &password);
138
139 QString pathname() const { return constD()->url().path(); }
140 bool setPathname(const QString &pathname);
141
142 QString port() const
143 {
144 const int port = constD()->url().port();
145 return port == -1 ? QString() : QString::number(port);
146 }
147 bool setPort(const QString &port);
148
149 QString protocol() const { return constD()->url().scheme() + QLatin1Char(':'); }
150 bool setProtocol(const QString &protocol);
151
152 Q_QML_AUTOTEST_EXPORT QString search() const;
153 bool setSearch(const QString &search);
154
155 QString username() const { return constD()->url().userName(); }
156 bool setUsername(const QString &username);
157
158 QUrl toQUrl() const
159 {
160 return d()->url();
161 }
162 void setUrl(const QUrl &url);
163
164private:
165 const Heap::UrlObject *constD() const { return d(); }
166
167 template<typename F>
168 bool updateUrl(F &&f) {
169 QUrl url = d()->url();
170 f(&url);
171 if (!url.isValid())
172 return false;
173
174 d()->setUrl(std::move(url));
175 return true;
176 }
177};
178
179template<>
180inline const UrlObject *Value::as() const
181{
183 ? static_cast<const UrlObject *>(this)
184 : nullptr;
185}
186
188{
189 V4_OBJECT2(UrlCtor, FunctionObject)
190
192 int argc, const Value *);
193};
194
196{
197 V4_PROTOTYPE(objectPrototype)
198
200
201 static ReturnedValue method_getHash(const FunctionObject *, const Value *thisObject,
202 const Value *argv, int argc);
203 static ReturnedValue method_setHash(const FunctionObject *, const Value *thisObject,
204 const Value *argv, int argc);
205
206 static ReturnedValue method_getHost(const FunctionObject *, const Value *thisObject,
207 const Value *argv, int argc);
208 static ReturnedValue method_setHost(const FunctionObject *, const Value *thisObject,
209 const Value *argv, int argc);
210
211 static ReturnedValue method_getHostname(const FunctionObject *, const Value *thisObject,
212 const Value *argv, int argc);
213 static ReturnedValue method_setHostname(const FunctionObject *, const Value *thisObject,
214 const Value *argv, int argc);
215
216 static ReturnedValue method_getHref(const FunctionObject *, const Value *thisObject,
217 const Value *argv, int argc);
218 static ReturnedValue method_setHref(const FunctionObject *, const Value *thisObject,
219 const Value *argv, int argc);
220
221 static ReturnedValue method_getOrigin(const FunctionObject *, const Value *thisObject,
222 const Value *argv, int argc);
223
224 static ReturnedValue method_getPassword(const FunctionObject *, const Value *thisObject,
225 const Value *argv, int argc);
226 static ReturnedValue method_setPassword(const FunctionObject *, const Value *thisObject,
227 const Value *argv, int argc);
228
229 static ReturnedValue method_getPathname(const FunctionObject *, const Value *thisObject,
230 const Value *argv, int argc);
231 static ReturnedValue method_setPathname(const FunctionObject *, const Value *thisObject,
232 const Value *argv, int argc);
233
234 static ReturnedValue method_getPort(const FunctionObject *, const Value *thisObject,
235 const Value *argv, int argc);
236 static ReturnedValue method_setPort(const FunctionObject *, const Value *thisObject,
237 const Value *argv, int argc);
238
239 static ReturnedValue method_getProtocol(const FunctionObject *, const Value *thisObject,
240 const Value *argv, int argc);
241 static ReturnedValue method_setProtocol(const FunctionObject *, const Value *thisObject,
242 const Value *argv, int argc);
243
244 static ReturnedValue method_getSearch(const FunctionObject *, const Value *thisObject,
245 const Value *argv, int argc);
246 static ReturnedValue method_setSearch(const FunctionObject *, const Value *thisObject,
247 const Value *argv, int argc);
248
249 static ReturnedValue method_getUsername(const FunctionObject *, const Value *thisObject,
250 const Value *argv, int argc);
251 static ReturnedValue method_setUsername(const FunctionObject *, const Value *thisObject,
252 const Value *argv, int argc);
253
254 static ReturnedValue method_getSearchParams(const FunctionObject *, const Value *thisObject,
255 const Value *argv, int argc);
256};
257
259{
260 V4_OBJECT2(UrlSearchParamsObject, Object)
262 V4_PROTOTYPE(urlSearchParamsPrototype)
263
264 void initializeParams();
265 void initializeParams(QString params);
267 void initializeParams(ScopedObject& params);
268
269 QList<QStringList> params() const;
270 void setParams(QList<QStringList> params);
271 Heap::UrlObject *urlObject() const;
272 void setUrlObject(const UrlObject *url);
273
274 QString searchString() const;
275
276 QString nameAt(int index) const;
277 Heap::String * nameAtRaw(int index) const;
278 QString valueAt(int index) const;
279 Heap::String * valueAtRaw(int index) const;
280
281 void append(Heap::String *name, Heap::String *value);
282
283 int indexOf(QString name, int last = -1) const;
284 int length() const;
285
286 using Object::getOwnProperty;
287protected:
288 static OwnPropertyKeyIterator *virtualOwnPropertyKeys(const Object *m, Value *target);
289 static PropertyAttributes virtualGetOwnProperty(const Managed *m, PropertyKey id, Property *p);
290private:
291 QString stringAt(int index, int pairIndex) const;
292 Heap::String * stringAtRaw(int index, int pairIndex) const;
293};
294
295template<>
296inline const UrlSearchParamsObject *Value::as() const
297{
299 ? static_cast<const UrlSearchParamsObject *>(this)
300 : nullptr;
301}
302
304{
305 V4_OBJECT2(UrlSearchParamsCtor, FunctionObject)
306
308 int argc, const Value *);
309};
310
312{
313 V4_PROTOTYPE(objectPrototype)
314
316
317 static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject,
318 const Value *argv, int argc);
319 static ReturnedValue method_sort(const FunctionObject *, const Value *thisObject,
320 const Value *argv, int argc);
321 static ReturnedValue method_append(const FunctionObject *, const Value *thisObject,
322 const Value *argv, int argc);
323 static ReturnedValue method_delete(const FunctionObject *, const Value *thisObject,
324 const Value *argv, int argc);
325 static ReturnedValue method_has(const FunctionObject *, const Value *thisObject,
326 const Value *argv, int argc);
327 static ReturnedValue method_set(const FunctionObject *, const Value *thisObject,
328 const Value *argv, int argc);
329 static ReturnedValue method_get(const FunctionObject *, const Value *thisObject,
330 const Value *argv, int argc);
331 static ReturnedValue method_getAll(const FunctionObject *, const Value *thisObject,
332 const Value *argv, int argc);
333 static ReturnedValue method_forEach(const FunctionObject *, const Value *thisObject,
334 const Value *argv, int argc);
335 static ReturnedValue method_entries(const FunctionObject *, const Value *thisObject,
336 const Value *argv, int argc);
337 static ReturnedValue method_keys(const FunctionObject *, const Value *thisObject,
338 const Value *argv, int argc);
339 static ReturnedValue method_values(const FunctionObject *, const Value *thisObject,
340 const Value *argv, int argc);
341
342};
343
344}
345
346QT_END_NAMESPACE
347
348#endif // QV4URLOBJECT_P_H
Combined button and popup list for selecting options.
DECLARE_HEAP_OBJECT(UrlSearchParamsObject, Object)
DECLARE_HEAP_OBJECT(UrlObject, Object)
Definition qjsvalue.h:23
Scoped< Object > ScopedObject
Scoped< ArrayObject > ScopedArrayObject
#define V4_NEEDS_DESTROY
#define Q_MANAGED_TYPE(type)
DEFINE_OBJECT_VTABLE(UrlCtor)
DEFINE_OBJECT_VTABLE(UrlSearchParamsObject)
DEFINE_OBJECT_VTABLE(UrlSearchParamsCtor)
static bool checkSearchParamsType(ExecutionEngine *v4, const Scoped< UrlSearchParamsObject > &o)
static bool checkUrlObjectType(ExecutionEngine *v4, const Scoped< UrlObject > &r)
DEFINE_OBJECT_VTABLE(UrlObject)
void init(ExecutionEngine *engine)
void init(ExecutionEngine *engine)
bool setPathname(const QString &pathname)
bool setProtocol(const QString &protocol)
QString hostname() const
QString username() const
bool setHost(const QString &host)
QString password() const
QString origin() const
void setUrl(const QUrl &url)
QString protocol() const
QString pathname() const
QString port() const
bool setSearch(const QString &search)
bool setHostname(const QString &hostname)
bool setHref(const QString &href)
QString href() const
bool setUsername(const QString &username)
QUrl toQUrl() const
bool setPort(const QString &port)
bool setPassword(const QString &password)
QString host() const
static ReturnedValue method_getPathname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getPort(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getSearchParams(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setProtocol(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUsername(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getProtocol(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHostname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHref(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setSearch(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHash(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHost(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setPort(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getPassword(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getOrigin(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUsername(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getSearch(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setPassword(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHost(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHostname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHref(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setPathname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHash(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void setParams(QList< QStringList > params)
QString valueAt(int index) const
void initializeParams(ScopedArrayObject &params)
QList< QStringList > params() const
Heap::UrlObject * urlObject() const
int indexOf(QString name, int last=-1) const
void initializeParams(QString params)
Heap::String * nameAtRaw(int index) const
void append(Heap::String *name, Heap::String *value)
Heap::String * valueAtRaw(int index) const
void setUrlObject(const UrlObject *url)
static OwnPropertyKeyIterator * virtualOwnPropertyKeys(const Object *m, Value *target)
QString nameAt(int index) const
void initializeParams(ScopedObject &params)
static PropertyAttributes virtualGetOwnProperty(const Managed *m, PropertyKey id, Property *p)
static ReturnedValue method_keys(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_get(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_delete(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_toString(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_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_entries(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_values(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)