1/*
2 This file is part of the WebKit open source project.
3 This file has been generated by generate-bindings.pl. DO NOT MODIFY!
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#include "config.h"
22#include "JSNavigator.h"
23
24#include "Document.h"
25#include "JSBlob.h"
26#include "JSDOMAttribute.h"
27#include "JSDOMBinding.h"
28#include "JSDOMConstructorNotConstructable.h"
29#include "JSDOMConvertBoolean.h"
30#include "JSDOMConvertBufferSource.h"
31#include "JSDOMConvertDictionary.h"
32#include "JSDOMConvertInterface.h"
33#include "JSDOMConvertNullable.h"
34#include "JSDOMConvertSequences.h"
35#include "JSDOMConvertStrings.h"
36#include "JSDOMConvertUnion.h"
37#include "JSDOMExceptionHandling.h"
38#include "JSDOMFormData.h"
39#include "JSDOMGlobalObject.h"
40#include "JSDOMMimeTypeArray.h"
41#include "JSDOMOperation.h"
42#include "JSDOMOperationReturningPromise.h"
43#include "JSDOMPluginArray.h"
44#include "JSDOMWrapperCache.h"
45#include "JSMediaCapabilities.h"
46#include "JSReadableStream.h"
47#include "JSShareData.h"
48#include "JSURLSearchParams.h"
49#include "JSVRDisplay.h"
50#include "NavigatorBeacon.h"
51#include "NavigatorMediaCapabilities.h"
52#include "NavigatorWebDriver.h"
53#include "NavigatorWebVR.h"
54#include "Quirks.h"
55#include "RuntimeEnabledFeatures.h"
56#include "ScriptExecutionContext.h"
57#include "Settings.h"
58#include <JavaScriptCore/FunctionPrototype.h>
59#include <JavaScriptCore/HeapSnapshotBuilder.h>
60#include <JavaScriptCore/JSArray.h>
61#include <JavaScriptCore/JSCInlines.h>
62#include <wtf/GetPtr.h>
63#include <wtf/PointerPreparations.h>
64#include <wtf/URL.h>
65#include <wtf/Variant.h>
66
67#if ENABLE(ENCRYPTED_MEDIA)
68#include "JSMediaKeySystemConfiguration.h"
69#include "NavigatorEME.h"
70#endif
71
72#if ENABLE(GEOLOCATION)
73#include "JSGeolocation.h"
74#include "NavigatorGeolocation.h"
75#endif
76
77#if ENABLE(MEDIA_STREAM)
78#include "JSMediaDevices.h"
79#include "NavigatorMediaDevices.h"
80#endif
81
82#if ENABLE(SERVICE_WORKER)
83#include "JSServiceWorkerContainer.h"
84#endif
85
86#if ENABLE(WEBGPU)
87#include "JSWebGPU.h"
88#include "NavigatorGPU.h"
89#endif
90
91#if ENABLE(WEB_AUTHN)
92#include "JSCredentialsContainer.h"
93#include "NavigatorCredentials.h"
94#endif
95
96
97namespace WebCore {
98using namespace JSC;
99
100// Functions
101
102JSC::EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionJavaEnabled(JSC::ExecState*);
103JSC::EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionGetStorageUpdates(JSC::ExecState*);
104JSC::EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionSendBeacon(JSC::ExecState*);
105#if ENABLE(ENCRYPTED_MEDIA)
106JSC::EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionRequestMediaKeySystemAccess(JSC::ExecState*);
107#endif
108JSC::EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionGetVRDisplays(JSC::ExecState*);
109JSC::EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionShare(JSC::ExecState*);
110
111// Attributes
112
113JSC::EncodedJSValue jsNavigatorConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
114bool setJSNavigatorConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
115JSC::EncodedJSValue jsNavigatorPlugins(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
116JSC::EncodedJSValue jsNavigatorMimeTypes(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
117JSC::EncodedJSValue jsNavigatorCookieEnabled(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
118#if ENABLE(NAVIGATOR_STANDALONE)
119JSC::EncodedJSValue jsNavigatorStandalone(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
120#endif
121#if ENABLE(WEB_AUTHN)
122JSC::EncodedJSValue jsNavigatorCredentials(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
123#endif
124#if ENABLE(GEOLOCATION)
125JSC::EncodedJSValue jsNavigatorGeolocation(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
126#endif
127JSC::EncodedJSValue jsNavigatorMediaCapabilities(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
128#if ENABLE(MEDIA_STREAM)
129JSC::EncodedJSValue jsNavigatorMediaDevices(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
130#endif
131JSC::EncodedJSValue jsNavigatorWebdriver(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
132#if ENABLE(WEBGPU)
133JSC::EncodedJSValue jsNavigatorGpu(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
134#endif
135JSC::EncodedJSValue jsNavigatorActiveVRDisplays(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
136JSC::EncodedJSValue jsNavigatorAppCodeName(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
137JSC::EncodedJSValue jsNavigatorAppName(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
138JSC::EncodedJSValue jsNavigatorAppVersion(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
139JSC::EncodedJSValue jsNavigatorPlatform(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
140JSC::EncodedJSValue jsNavigatorProduct(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
141JSC::EncodedJSValue jsNavigatorProductSub(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
142JSC::EncodedJSValue jsNavigatorUserAgent(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
143JSC::EncodedJSValue jsNavigatorVendor(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
144JSC::EncodedJSValue jsNavigatorVendorSub(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
145JSC::EncodedJSValue jsNavigatorLanguage(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
146JSC::EncodedJSValue jsNavigatorLanguages(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
147JSC::EncodedJSValue jsNavigatorOnLine(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
148#if ENABLE(SERVICE_WORKER)
149JSC::EncodedJSValue jsNavigatorServiceWorker(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
150#endif
151
152class JSNavigatorPrototype : public JSC::JSNonFinalObject {
153public:
154 using Base = JSC::JSNonFinalObject;
155 static JSNavigatorPrototype* create(JSC::VM& vm, JSDOMGlobalObject* globalObject, JSC::Structure* structure)
156 {
157 JSNavigatorPrototype* ptr = new (NotNull, JSC::allocateCell<JSNavigatorPrototype>(vm.heap)) JSNavigatorPrototype(vm, globalObject, structure);
158 ptr->finishCreation(vm);
159 return ptr;
160 }
161
162 DECLARE_INFO;
163 static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
164 {
165 return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
166 }
167
168private:
169 JSNavigatorPrototype(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure)
170 : JSC::JSNonFinalObject(vm, structure)
171 {
172 }
173
174 void finishCreation(JSC::VM&);
175};
176
177using JSNavigatorConstructor = JSDOMConstructorNotConstructable<JSNavigator>;
178
179template<> JSValue JSNavigatorConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
180{
181 UNUSED_PARAM(vm);
182 return globalObject.functionPrototype();
183}
184
185template<> void JSNavigatorConstructor::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)
186{
187 putDirect(vm, vm.propertyNames->prototype, JSNavigator::prototype(vm, globalObject), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
188 putDirect(vm, vm.propertyNames->name, jsNontrivialString(&vm, String("Navigator"_s)), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
189 putDirect(vm, vm.propertyNames->length, jsNumber(0), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
190}
191
192template<> const ClassInfo JSNavigatorConstructor::s_info = { "Navigator", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSNavigatorConstructor) };
193
194/* Hash table for prototype */
195
196static const HashTableValue JSNavigatorPrototypeTableValues[] =
197{
198 { "constructor", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSNavigatorConstructor) } },
199 { "plugins", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorPlugins), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
200 { "mimeTypes", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorMimeTypes), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
201 { "cookieEnabled", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorCookieEnabled), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
202#if ENABLE(NAVIGATOR_STANDALONE)
203 { "standalone", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorStandalone), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
204#else
205 { 0, 0, NoIntrinsic, { 0, 0 } },
206#endif
207#if ENABLE(WEB_AUTHN)
208 { "credentials", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorCredentials), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
209#else
210 { 0, 0, NoIntrinsic, { 0, 0 } },
211#endif
212#if ENABLE(GEOLOCATION)
213 { "geolocation", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorGeolocation), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
214#else
215 { 0, 0, NoIntrinsic, { 0, 0 } },
216#endif
217 { "mediaCapabilities", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorMediaCapabilities), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
218#if ENABLE(MEDIA_STREAM)
219 { "mediaDevices", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorMediaDevices), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
220#else
221 { 0, 0, NoIntrinsic, { 0, 0 } },
222#endif
223 { "webdriver", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorWebdriver), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
224#if ENABLE(WEBGPU)
225 { "gpu", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorGpu), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
226#else
227 { 0, 0, NoIntrinsic, { 0, 0 } },
228#endif
229 { "activeVRDisplays", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorActiveVRDisplays), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
230 { "appCodeName", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorAppCodeName), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
231 { "appName", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorAppName), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
232 { "appVersion", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorAppVersion), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
233 { "platform", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorPlatform), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
234 { "product", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorProduct), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
235 { "productSub", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorProductSub), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
236 { "userAgent", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorUserAgent), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
237 { "vendor", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorVendor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
238 { "vendorSub", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorVendorSub), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
239 { "language", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorLanguage), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
240 { "languages", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorLanguages), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
241 { "onLine", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorOnLine), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
242#if ENABLE(SERVICE_WORKER)
243 { "serviceWorker", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNavigatorServiceWorker), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
244#else
245 { 0, 0, NoIntrinsic, { 0, 0 } },
246#endif
247 { "javaEnabled", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNavigatorPrototypeFunctionJavaEnabled), (intptr_t) (0) } },
248 { "getStorageUpdates", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNavigatorPrototypeFunctionGetStorageUpdates), (intptr_t) (0) } },
249 { "sendBeacon", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNavigatorPrototypeFunctionSendBeacon), (intptr_t) (1) } },
250#if ENABLE(ENCRYPTED_MEDIA)
251 { "requestMediaKeySystemAccess", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNavigatorPrototypeFunctionRequestMediaKeySystemAccess), (intptr_t) (2) } },
252#else
253 { 0, 0, NoIntrinsic, { 0, 0 } },
254#endif
255 { "getVRDisplays", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNavigatorPrototypeFunctionGetVRDisplays), (intptr_t) (0) } },
256 { "share", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNavigatorPrototypeFunctionShare), (intptr_t) (0) } },
257};
258
259const ClassInfo JSNavigatorPrototype::s_info = { "NavigatorPrototype", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSNavigatorPrototype) };
260
261void JSNavigatorPrototype::finishCreation(VM& vm)
262{
263 Base::finishCreation(vm);
264 reifyStaticProperties(vm, JSNavigator::info(), JSNavigatorPrototypeTableValues, *this);
265 bool hasDisabledRuntimeProperties = false;
266 if (!downcast<Document>(jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext())->settings().beaconAPIEnabled()) {
267 hasDisabledRuntimeProperties = true;
268 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("sendBeacon"), strlen("sendBeacon"));
269 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
270 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
271 }
272#if ENABLE(ENCRYPTED_MEDIA)
273 if (!(!downcast<Document>(jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext())->quirks().hasBrokenEncryptedMediaAPISupportQuirk() && RuntimeEnabledFeatures::sharedFeatures().encryptedMediaAPIEnabled())) {
274 hasDisabledRuntimeProperties = true;
275 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("requestMediaKeySystemAccess"), strlen("requestMediaKeySystemAccess"));
276 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
277 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
278 }
279#endif
280 if (!RuntimeEnabledFeatures::sharedFeatures().webVREnabled()) {
281 hasDisabledRuntimeProperties = true;
282 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("getVRDisplays"), strlen("getVRDisplays"));
283 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
284 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
285 }
286 if (!(jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isSecureContext() && RuntimeEnabledFeatures::sharedFeatures().webShareEnabled())) {
287 hasDisabledRuntimeProperties = true;
288 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("share"), strlen("share"));
289 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
290 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
291 }
292#if ENABLE(WEB_AUTHN)
293 if (!(jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isSecureContext() && RuntimeEnabledFeatures::sharedFeatures().webAuthenticationEnabled())) {
294 hasDisabledRuntimeProperties = true;
295 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("credentials"), strlen("credentials"));
296 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
297 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
298 }
299#endif
300 if (!downcast<Document>(jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext())->settings().mediaCapabilitiesEnabled()) {
301 hasDisabledRuntimeProperties = true;
302 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("mediaCapabilities"), strlen("mediaCapabilities"));
303 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
304 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
305 }
306#if ENABLE(MEDIA_STREAM)
307 if (!((jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isSecureContext()|| jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->allowsMediaDevices()) && RuntimeEnabledFeatures::sharedFeatures().mediaDevicesEnabled())) {
308 hasDisabledRuntimeProperties = true;
309 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("mediaDevices"), strlen("mediaDevices"));
310 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
311 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
312 }
313#endif
314#if ENABLE(WEBGPU)
315 if (!(jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isDocument() && RuntimeEnabledFeatures::sharedFeatures().webGPUEnabled())) {
316 hasDisabledRuntimeProperties = true;
317 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("gpu"), strlen("gpu"));
318 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
319 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
320 }
321#endif
322 if (!RuntimeEnabledFeatures::sharedFeatures().webVREnabled()) {
323 hasDisabledRuntimeProperties = true;
324 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("activeVRDisplays"), strlen("activeVRDisplays"));
325 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
326 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
327 }
328#if ENABLE(SERVICE_WORKER)
329 if (!((jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isSecureContext()|| jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->hasServiceWorkerScheme()) && RuntimeEnabledFeatures::sharedFeatures().serviceWorkerEnabled())) {
330 hasDisabledRuntimeProperties = true;
331 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("serviceWorker"), strlen("serviceWorker"));
332 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
333 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
334 }
335#endif
336 if (hasDisabledRuntimeProperties && structure()->isDictionary())
337 flattenDictionaryObject(vm);
338}
339
340const ClassInfo JSNavigator::s_info = { "Navigator", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSNavigator) };
341
342JSNavigator::JSNavigator(Structure* structure, JSDOMGlobalObject& globalObject, Ref<Navigator>&& impl)
343 : JSDOMWrapper<Navigator>(structure, globalObject, WTFMove(impl))
344{
345}
346
347void JSNavigator::finishCreation(VM& vm)
348{
349 Base::finishCreation(vm);
350 ASSERT(inherits(vm, info()));
351
352}
353
354JSObject* JSNavigator::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)
355{
356 return JSNavigatorPrototype::create(vm, &globalObject, JSNavigatorPrototype::createStructure(vm, &globalObject, globalObject.objectPrototype()));
357}
358
359JSObject* JSNavigator::prototype(VM& vm, JSDOMGlobalObject& globalObject)
360{
361 return getDOMPrototype<JSNavigator>(vm, globalObject);
362}
363
364JSValue JSNavigator::getConstructor(VM& vm, const JSGlobalObject* globalObject)
365{
366 return getDOMConstructor<JSNavigatorConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));
367}
368
369void JSNavigator::destroy(JSC::JSCell* cell)
370{
371 JSNavigator* thisObject = static_cast<JSNavigator*>(cell);
372 thisObject->JSNavigator::~JSNavigator();
373}
374
375template<> inline JSNavigator* IDLAttribute<JSNavigator>::cast(ExecState& state, EncodedJSValue thisValue)
376{
377 return jsDynamicCast<JSNavigator*>(state.vm(), JSValue::decode(thisValue));
378}
379
380template<> inline JSNavigator* IDLOperation<JSNavigator>::cast(ExecState& state)
381{
382 return jsDynamicCast<JSNavigator*>(state.vm(), state.thisValue());
383}
384
385EncodedJSValue jsNavigatorConstructor(ExecState* state, EncodedJSValue thisValue, PropertyName)
386{
387 VM& vm = state->vm();
388 auto throwScope = DECLARE_THROW_SCOPE(vm);
389 auto* prototype = jsDynamicCast<JSNavigatorPrototype*>(vm, JSValue::decode(thisValue));
390 if (UNLIKELY(!prototype))
391 return throwVMTypeError(state, throwScope);
392 return JSValue::encode(JSNavigator::getConstructor(state->vm(), prototype->globalObject()));
393}
394
395bool setJSNavigatorConstructor(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
396{
397 VM& vm = state->vm();
398 auto throwScope = DECLARE_THROW_SCOPE(vm);
399 auto* prototype = jsDynamicCast<JSNavigatorPrototype*>(vm, JSValue::decode(thisValue));
400 if (UNLIKELY(!prototype)) {
401 throwVMTypeError(state, throwScope);
402 return false;
403 }
404 // Shadowing a built-in constructor
405 return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue));
406}
407
408static inline JSValue jsNavigatorPluginsGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
409{
410 UNUSED_PARAM(throwScope);
411 UNUSED_PARAM(state);
412 auto& impl = thisObject.wrapped();
413 JSValue result = toJS<IDLInterface<DOMPluginArray>>(state, *thisObject.globalObject(), throwScope, impl.plugins());
414 return result;
415}
416
417EncodedJSValue jsNavigatorPlugins(ExecState* state, EncodedJSValue thisValue, PropertyName)
418{
419 return IDLAttribute<JSNavigator>::get<jsNavigatorPluginsGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "plugins");
420}
421
422static inline JSValue jsNavigatorMimeTypesGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
423{
424 UNUSED_PARAM(throwScope);
425 UNUSED_PARAM(state);
426 auto& impl = thisObject.wrapped();
427 JSValue result = toJS<IDLInterface<DOMMimeTypeArray>>(state, *thisObject.globalObject(), throwScope, impl.mimeTypes());
428 return result;
429}
430
431EncodedJSValue jsNavigatorMimeTypes(ExecState* state, EncodedJSValue thisValue, PropertyName)
432{
433 return IDLAttribute<JSNavigator>::get<jsNavigatorMimeTypesGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "mimeTypes");
434}
435
436static inline JSValue jsNavigatorCookieEnabledGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
437{
438 UNUSED_PARAM(throwScope);
439 UNUSED_PARAM(state);
440 auto& impl = thisObject.wrapped();
441 JSValue result = toJS<IDLBoolean>(state, throwScope, impl.cookieEnabled());
442 return result;
443}
444
445EncodedJSValue jsNavigatorCookieEnabled(ExecState* state, EncodedJSValue thisValue, PropertyName)
446{
447 return IDLAttribute<JSNavigator>::get<jsNavigatorCookieEnabledGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "cookieEnabled");
448}
449
450#if ENABLE(NAVIGATOR_STANDALONE)
451static inline JSValue jsNavigatorStandaloneGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
452{
453 UNUSED_PARAM(throwScope);
454 UNUSED_PARAM(state);
455 auto& impl = thisObject.wrapped();
456 JSValue result = toJS<IDLBoolean>(state, throwScope, impl.standalone());
457 return result;
458}
459
460EncodedJSValue jsNavigatorStandalone(ExecState* state, EncodedJSValue thisValue, PropertyName)
461{
462 return IDLAttribute<JSNavigator>::get<jsNavigatorStandaloneGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "standalone");
463}
464
465#endif
466
467#if ENABLE(WEB_AUTHN)
468static inline JSValue jsNavigatorCredentialsGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
469{
470 UNUSED_PARAM(throwScope);
471 UNUSED_PARAM(state);
472 auto& impl = thisObject.wrapped();
473 JSValue result = toJS<IDLInterface<CredentialsContainer>>(state, *thisObject.globalObject(), throwScope, WebCore::NavigatorCredentials::credentials(impl));
474 return result;
475}
476
477EncodedJSValue jsNavigatorCredentials(ExecState* state, EncodedJSValue thisValue, PropertyName)
478{
479 return IDLAttribute<JSNavigator>::get<jsNavigatorCredentialsGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "credentials");
480}
481
482#endif
483
484#if ENABLE(GEOLOCATION)
485static inline JSValue jsNavigatorGeolocationGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
486{
487 UNUSED_PARAM(throwScope);
488 UNUSED_PARAM(state);
489 auto& impl = thisObject.wrapped();
490 JSValue result = toJS<IDLInterface<Geolocation>>(state, *thisObject.globalObject(), throwScope, WebCore::NavigatorGeolocation::geolocation(impl));
491 return result;
492}
493
494EncodedJSValue jsNavigatorGeolocation(ExecState* state, EncodedJSValue thisValue, PropertyName)
495{
496 return IDLAttribute<JSNavigator>::get<jsNavigatorGeolocationGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "geolocation");
497}
498
499#endif
500
501static inline JSValue jsNavigatorMediaCapabilitiesGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
502{
503 UNUSED_PARAM(throwScope);
504 UNUSED_PARAM(state);
505 auto& impl = thisObject.wrapped();
506 JSValue result = toJS<IDLInterface<MediaCapabilities>>(state, *thisObject.globalObject(), throwScope, WebCore::NavigatorMediaCapabilities::mediaCapabilities(impl));
507 return result;
508}
509
510EncodedJSValue jsNavigatorMediaCapabilities(ExecState* state, EncodedJSValue thisValue, PropertyName)
511{
512 return IDLAttribute<JSNavigator>::get<jsNavigatorMediaCapabilitiesGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "mediaCapabilities");
513}
514
515#if ENABLE(MEDIA_STREAM)
516static inline JSValue jsNavigatorMediaDevicesGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
517{
518 UNUSED_PARAM(throwScope);
519 UNUSED_PARAM(state);
520 auto& impl = thisObject.wrapped();
521 JSValue result = toJS<IDLInterface<MediaDevices>>(state, *thisObject.globalObject(), throwScope, WebCore::NavigatorMediaDevices::mediaDevices(impl));
522 return result;
523}
524
525EncodedJSValue jsNavigatorMediaDevices(ExecState* state, EncodedJSValue thisValue, PropertyName)
526{
527 return IDLAttribute<JSNavigator>::get<jsNavigatorMediaDevicesGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "mediaDevices");
528}
529
530#endif
531
532static inline JSValue jsNavigatorWebdriverGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
533{
534 UNUSED_PARAM(throwScope);
535 UNUSED_PARAM(state);
536 auto& impl = thisObject.wrapped();
537 JSValue result = toJS<IDLBoolean>(state, throwScope, WebCore::NavigatorWebDriver::webdriver(impl));
538 return result;
539}
540
541EncodedJSValue jsNavigatorWebdriver(ExecState* state, EncodedJSValue thisValue, PropertyName)
542{
543 return IDLAttribute<JSNavigator>::get<jsNavigatorWebdriverGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "webdriver");
544}
545
546#if ENABLE(WEBGPU)
547static inline JSValue jsNavigatorGpuGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
548{
549 UNUSED_PARAM(throwScope);
550 UNUSED_PARAM(state);
551 auto& impl = thisObject.wrapped();
552 JSValue result = toJS<IDLInterface<WebGPU>>(state, *thisObject.globalObject(), throwScope, WebCore::NavigatorGPU::gpu(impl));
553 return result;
554}
555
556EncodedJSValue jsNavigatorGpu(ExecState* state, EncodedJSValue thisValue, PropertyName)
557{
558 return IDLAttribute<JSNavigator>::get<jsNavigatorGpuGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "gpu");
559}
560
561#endif
562
563static inline JSValue jsNavigatorActiveVRDisplaysGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
564{
565 UNUSED_PARAM(throwScope);
566 UNUSED_PARAM(state);
567 auto& impl = thisObject.wrapped();
568 JSValue result = toJS<IDLFrozenArray<IDLInterface<VRDisplay>>>(state, *thisObject.globalObject(), throwScope, WebCore::NavigatorWebVR::activeVRDisplays(impl));
569 return result;
570}
571
572EncodedJSValue jsNavigatorActiveVRDisplays(ExecState* state, EncodedJSValue thisValue, PropertyName)
573{
574 return IDLAttribute<JSNavigator>::get<jsNavigatorActiveVRDisplaysGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "activeVRDisplays");
575}
576
577static inline JSValue jsNavigatorAppCodeNameGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
578{
579 UNUSED_PARAM(throwScope);
580 UNUSED_PARAM(state);
581 auto& impl = thisObject.wrapped();
582 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.appCodeName());
583 return result;
584}
585
586EncodedJSValue jsNavigatorAppCodeName(ExecState* state, EncodedJSValue thisValue, PropertyName)
587{
588 return IDLAttribute<JSNavigator>::get<jsNavigatorAppCodeNameGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "appCodeName");
589}
590
591static inline JSValue jsNavigatorAppNameGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
592{
593 UNUSED_PARAM(throwScope);
594 UNUSED_PARAM(state);
595 auto& impl = thisObject.wrapped();
596 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.appName());
597 return result;
598}
599
600EncodedJSValue jsNavigatorAppName(ExecState* state, EncodedJSValue thisValue, PropertyName)
601{
602 return IDLAttribute<JSNavigator>::get<jsNavigatorAppNameGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "appName");
603}
604
605static inline JSValue jsNavigatorAppVersionGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
606{
607 UNUSED_PARAM(throwScope);
608 UNUSED_PARAM(state);
609 auto& impl = thisObject.wrapped();
610 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.appVersion());
611 return result;
612}
613
614EncodedJSValue jsNavigatorAppVersion(ExecState* state, EncodedJSValue thisValue, PropertyName)
615{
616 return IDLAttribute<JSNavigator>::get<jsNavigatorAppVersionGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "appVersion");
617}
618
619static inline JSValue jsNavigatorPlatformGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
620{
621 UNUSED_PARAM(throwScope);
622 UNUSED_PARAM(state);
623 auto& impl = thisObject.wrapped();
624 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.platform());
625 return result;
626}
627
628EncodedJSValue jsNavigatorPlatform(ExecState* state, EncodedJSValue thisValue, PropertyName)
629{
630 return IDLAttribute<JSNavigator>::get<jsNavigatorPlatformGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "platform");
631}
632
633static inline JSValue jsNavigatorProductGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
634{
635 UNUSED_PARAM(throwScope);
636 UNUSED_PARAM(state);
637 auto& impl = thisObject.wrapped();
638 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.product());
639 return result;
640}
641
642EncodedJSValue jsNavigatorProduct(ExecState* state, EncodedJSValue thisValue, PropertyName)
643{
644 return IDLAttribute<JSNavigator>::get<jsNavigatorProductGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "product");
645}
646
647static inline JSValue jsNavigatorProductSubGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
648{
649 UNUSED_PARAM(throwScope);
650 UNUSED_PARAM(state);
651 auto& impl = thisObject.wrapped();
652 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.productSub());
653 return result;
654}
655
656EncodedJSValue jsNavigatorProductSub(ExecState* state, EncodedJSValue thisValue, PropertyName)
657{
658 return IDLAttribute<JSNavigator>::get<jsNavigatorProductSubGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "productSub");
659}
660
661static inline JSValue jsNavigatorUserAgentGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
662{
663 UNUSED_PARAM(throwScope);
664 UNUSED_PARAM(state);
665 auto& impl = thisObject.wrapped();
666 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.userAgent());
667 return result;
668}
669
670EncodedJSValue jsNavigatorUserAgent(ExecState* state, EncodedJSValue thisValue, PropertyName)
671{
672 return IDLAttribute<JSNavigator>::get<jsNavigatorUserAgentGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "userAgent");
673}
674
675static inline JSValue jsNavigatorVendorGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
676{
677 UNUSED_PARAM(throwScope);
678 UNUSED_PARAM(state);
679 auto& impl = thisObject.wrapped();
680 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.vendor());
681 return result;
682}
683
684EncodedJSValue jsNavigatorVendor(ExecState* state, EncodedJSValue thisValue, PropertyName)
685{
686 return IDLAttribute<JSNavigator>::get<jsNavigatorVendorGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "vendor");
687}
688
689static inline JSValue jsNavigatorVendorSubGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
690{
691 UNUSED_PARAM(throwScope);
692 UNUSED_PARAM(state);
693 auto& impl = thisObject.wrapped();
694 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.vendorSub());
695 return result;
696}
697
698EncodedJSValue jsNavigatorVendorSub(ExecState* state, EncodedJSValue thisValue, PropertyName)
699{
700 return IDLAttribute<JSNavigator>::get<jsNavigatorVendorSubGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "vendorSub");
701}
702
703static inline JSValue jsNavigatorLanguageGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
704{
705 UNUSED_PARAM(throwScope);
706 UNUSED_PARAM(state);
707 auto& impl = thisObject.wrapped();
708 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.language());
709 return result;
710}
711
712EncodedJSValue jsNavigatorLanguage(ExecState* state, EncodedJSValue thisValue, PropertyName)
713{
714 return IDLAttribute<JSNavigator>::get<jsNavigatorLanguageGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "language");
715}
716
717static inline JSValue jsNavigatorLanguagesGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
718{
719 UNUSED_PARAM(throwScope);
720 UNUSED_PARAM(state);
721 auto& impl = thisObject.wrapped();
722 JSValue result = toJS<IDLFrozenArray<IDLDOMString>>(state, *thisObject.globalObject(), throwScope, impl.languages());
723 return result;
724}
725
726EncodedJSValue jsNavigatorLanguages(ExecState* state, EncodedJSValue thisValue, PropertyName)
727{
728 return IDLAttribute<JSNavigator>::get<jsNavigatorLanguagesGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "languages");
729}
730
731static inline JSValue jsNavigatorOnLineGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
732{
733 UNUSED_PARAM(throwScope);
734 UNUSED_PARAM(state);
735 auto& impl = thisObject.wrapped();
736 JSValue result = toJS<IDLBoolean>(state, throwScope, impl.onLine());
737 return result;
738}
739
740EncodedJSValue jsNavigatorOnLine(ExecState* state, EncodedJSValue thisValue, PropertyName)
741{
742 return IDLAttribute<JSNavigator>::get<jsNavigatorOnLineGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "onLine");
743}
744
745#if ENABLE(SERVICE_WORKER)
746static inline JSValue jsNavigatorServiceWorkerGetter(ExecState& state, JSNavigator& thisObject, ThrowScope& throwScope)
747{
748 UNUSED_PARAM(throwScope);
749 UNUSED_PARAM(state);
750 auto* context = jsCast<JSDOMGlobalObject*>(state.lexicalGlobalObject())->scriptExecutionContext();
751 if (UNLIKELY(!context))
752 return jsUndefined();
753 auto& impl = thisObject.wrapped();
754 JSValue result = toJS<IDLInterface<ServiceWorkerContainer>>(state, *thisObject.globalObject(), throwScope, impl.serviceWorker(*context));
755 return result;
756}
757
758EncodedJSValue jsNavigatorServiceWorker(ExecState* state, EncodedJSValue thisValue, PropertyName)
759{
760 return IDLAttribute<JSNavigator>::get<jsNavigatorServiceWorkerGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "serviceWorker");
761}
762
763#endif
764
765static inline JSC::EncodedJSValue jsNavigatorPrototypeFunctionJavaEnabledBody(JSC::ExecState* state, typename IDLOperation<JSNavigator>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
766{
767 UNUSED_PARAM(state);
768 UNUSED_PARAM(throwScope);
769 auto& impl = castedThis->wrapped();
770 return JSValue::encode(toJS<IDLBoolean>(impl.javaEnabled()));
771}
772
773EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionJavaEnabled(ExecState* state)
774{
775 return IDLOperation<JSNavigator>::call<jsNavigatorPrototypeFunctionJavaEnabledBody>(*state, "javaEnabled");
776}
777
778static inline JSC::EncodedJSValue jsNavigatorPrototypeFunctionGetStorageUpdatesBody(JSC::ExecState* state, typename IDLOperation<JSNavigator>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
779{
780 UNUSED_PARAM(state);
781 UNUSED_PARAM(throwScope);
782 auto& impl = castedThis->wrapped();
783 impl.getStorageUpdates();
784 return JSValue::encode(jsUndefined());
785}
786
787EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionGetStorageUpdates(ExecState* state)
788{
789 return IDLOperation<JSNavigator>::call<jsNavigatorPrototypeFunctionGetStorageUpdatesBody>(*state, "getStorageUpdates");
790}
791
792static inline JSC::EncodedJSValue jsNavigatorPrototypeFunctionSendBeaconBody(JSC::ExecState* state, typename IDLOperation<JSNavigator>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
793{
794 UNUSED_PARAM(state);
795 UNUSED_PARAM(throwScope);
796 auto& impl = castedThis->wrapped();
797 if (UNLIKELY(state->argumentCount() < 1))
798 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
799 auto* context = jsCast<JSDOMGlobalObject*>(state->lexicalGlobalObject())->scriptExecutionContext();
800 if (UNLIKELY(!context))
801 return JSValue::encode(jsUndefined());
802 ASSERT(context->isDocument());
803 auto& document = downcast<Document>(*context);
804 auto url = convert<IDLUSVString>(*state, state->uncheckedArgument(0));
805 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
806 auto data = state->argument(1).isUndefined() ? WTF::nullopt : convert<IDLNullable<IDLUnion<IDLInterface<Blob>, IDLArrayBufferView, IDLArrayBuffer, IDLInterface<DOMFormData>, IDLInterface<URLSearchParams>, IDLInterface<ReadableStream>, IDLUSVString>>>(*state, state->uncheckedArgument(1));
807 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
808 return JSValue::encode(toJS<IDLBoolean>(*state, throwScope, WebCore::NavigatorBeacon::sendBeacon(impl, document, WTFMove(url), WTFMove(data))));
809}
810
811EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionSendBeacon(ExecState* state)
812{
813 return IDLOperation<JSNavigator>::call<jsNavigatorPrototypeFunctionSendBeaconBody>(*state, "sendBeacon");
814}
815
816#if ENABLE(ENCRYPTED_MEDIA)
817static inline JSC::EncodedJSValue jsNavigatorPrototypeFunctionRequestMediaKeySystemAccessBody(JSC::ExecState* state, typename IDLOperationReturningPromise<JSNavigator>::ClassParameter castedThis, Ref<DeferredPromise>&& promise, JSC::ThrowScope& throwScope)
818{
819 UNUSED_PARAM(state);
820 UNUSED_PARAM(throwScope);
821 auto& impl = castedThis->wrapped();
822 if (UNLIKELY(state->argumentCount() < 2))
823 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
824 auto* context = jsCast<JSDOMGlobalObject*>(state->lexicalGlobalObject())->scriptExecutionContext();
825 if (UNLIKELY(!context))
826 return JSValue::encode(jsUndefined());
827 ASSERT(context->isDocument());
828 auto& document = downcast<Document>(*context);
829 auto keySystem = convert<IDLDOMString>(*state, state->uncheckedArgument(0));
830 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
831 auto supportedConfiguration = convert<IDLSequence<IDLDictionary<MediaKeySystemConfiguration>>>(*state, state->uncheckedArgument(1));
832 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
833 WebCore::NavigatorEME::requestMediaKeySystemAccess(impl, document, WTFMove(keySystem), WTFMove(supportedConfiguration), WTFMove(promise));
834 return JSValue::encode(jsUndefined());
835}
836
837EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionRequestMediaKeySystemAccess(ExecState* state)
838{
839 return IDLOperationReturningPromise<JSNavigator>::call<jsNavigatorPrototypeFunctionRequestMediaKeySystemAccessBody, PromiseExecutionScope::WindowOnly>(*state, "requestMediaKeySystemAccess");
840}
841
842#endif
843
844static inline JSC::EncodedJSValue jsNavigatorPrototypeFunctionGetVRDisplaysBody(JSC::ExecState* state, typename IDLOperationReturningPromise<JSNavigator>::ClassParameter castedThis, Ref<DeferredPromise>&& promise, JSC::ThrowScope& throwScope)
845{
846 UNUSED_PARAM(state);
847 UNUSED_PARAM(throwScope);
848 auto& impl = castedThis->wrapped();
849 auto* context = jsCast<JSDOMGlobalObject*>(state->lexicalGlobalObject())->scriptExecutionContext();
850 if (UNLIKELY(!context))
851 return JSValue::encode(jsUndefined());
852 ASSERT(context->isDocument());
853 auto& document = downcast<Document>(*context);
854 WebCore::NavigatorWebVR::getVRDisplays(impl, document, WTFMove(promise));
855 return JSValue::encode(jsUndefined());
856}
857
858EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionGetVRDisplays(ExecState* state)
859{
860 return IDLOperationReturningPromise<JSNavigator>::call<jsNavigatorPrototypeFunctionGetVRDisplaysBody, PromiseExecutionScope::WindowOnly>(*state, "getVRDisplays");
861}
862
863static inline JSC::EncodedJSValue jsNavigatorPrototypeFunctionShareBody(JSC::ExecState* state, typename IDLOperationReturningPromise<JSNavigator>::ClassParameter castedThis, Ref<DeferredPromise>&& promise, JSC::ThrowScope& throwScope)
864{
865 UNUSED_PARAM(state);
866 UNUSED_PARAM(throwScope);
867 auto& impl = castedThis->wrapped();
868 auto* context = jsCast<JSDOMGlobalObject*>(state->lexicalGlobalObject())->scriptExecutionContext();
869 if (UNLIKELY(!context))
870 return JSValue::encode(jsUndefined());
871 auto shareData = convert<IDLDictionary<ShareData>>(*state, state->argument(0));
872 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
873 impl.share(*context, WTFMove(shareData), WTFMove(promise));
874 return JSValue::encode(jsUndefined());
875}
876
877EncodedJSValue JSC_HOST_CALL jsNavigatorPrototypeFunctionShare(ExecState* state)
878{
879 return IDLOperationReturningPromise<JSNavigator>::call<jsNavigatorPrototypeFunctionShareBody, PromiseExecutionScope::WindowOnly>(*state, "share");
880}
881
882void JSNavigator::visitChildren(JSCell* cell, SlotVisitor& visitor)
883{
884 auto* thisObject = jsCast<JSNavigator*>(cell);
885 ASSERT_GC_OBJECT_INHERITS(thisObject, info());
886 Base::visitChildren(thisObject, visitor);
887 thisObject->visitAdditionalChildren(visitor);
888}
889
890void JSNavigator::visitOutputConstraints(JSCell* cell, SlotVisitor& visitor)
891{
892 auto* thisObject = jsCast<JSNavigator*>(cell);
893 ASSERT_GC_OBJECT_INHERITS(thisObject, info());
894 Base::visitOutputConstraints(thisObject, visitor);
895 thisObject->visitAdditionalChildren(visitor);
896}
897
898void JSNavigator::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder)
899{
900 auto* thisObject = jsCast<JSNavigator*>(cell);
901 builder.setWrappedObjectForCell(cell, &thisObject->wrapped());
902 if (thisObject->scriptExecutionContext())
903 builder.setLabelForCell(cell, "url " + thisObject->scriptExecutionContext()->url().string());
904 Base::heapSnapshot(cell, builder);
905}
906
907bool JSNavigatorOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason)
908{
909 auto* jsNavigator = jsCast<JSNavigator*>(handle.slot()->asCell());
910 Frame* root = WTF::getPtr(jsNavigator->wrapped().frame());
911 if (!root)
912 return false;
913 if (UNLIKELY(reason))
914 *reason = "Reachable from Frame";
915 return visitor.containsOpaqueRoot(root);
916}
917
918void JSNavigatorOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)
919{
920 auto* jsNavigator = static_cast<JSNavigator*>(handle.slot()->asCell());
921 auto& world = *static_cast<DOMWrapperWorld*>(context);
922 uncacheWrapper(world, &jsNavigator->wrapped(), jsNavigator);
923}
924
925#if ENABLE(BINDING_INTEGRITY)
926#if PLATFORM(WIN)
927#pragma warning(disable: 4483)
928extern "C" { extern void (*const __identifier("??_7Navigator@WebCore@@6B@")[])(); }
929#else
930extern "C" { extern void* _ZTVN7WebCore9NavigatorE[]; }
931#endif
932#endif
933
934JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject* globalObject, Ref<Navigator>&& impl)
935{
936
937#if ENABLE(BINDING_INTEGRITY)
938 void* actualVTablePointer = *(reinterpret_cast<void**>(impl.ptr()));
939#if PLATFORM(WIN)
940 void* expectedVTablePointer = WTF_PREPARE_VTBL_POINTER_FOR_INSPECTION(__identifier("??_7Navigator@WebCore@@6B@"));
941#else
942 void* expectedVTablePointer = WTF_PREPARE_VTBL_POINTER_FOR_INSPECTION(&_ZTVN7WebCore9NavigatorE[2]);
943#endif
944
945 // If this fails Navigator does not have a vtable, so you need to add the
946 // ImplementationLacksVTable attribute to the interface definition
947 static_assert(std::is_polymorphic<Navigator>::value, "Navigator is not polymorphic");
948
949 // If you hit this assertion you either have a use after free bug, or
950 // Navigator has subclasses. If Navigator has subclasses that get passed
951 // to toJS() we currently require Navigator you to opt out of binding hardening
952 // by adding the SkipVTableValidation attribute to the interface IDL definition
953 RELEASE_ASSERT(actualVTablePointer == expectedVTablePointer);
954#endif
955 return createWrapper<Navigator>(globalObject, WTFMove(impl));
956}
957
958JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, Navigator& impl)
959{
960 return wrap(state, globalObject, impl);
961}
962
963Navigator* JSNavigator::toWrapped(JSC::VM& vm, JSC::JSValue value)
964{
965 if (auto* wrapper = jsDynamicCast<JSNavigator*>(vm, value))
966 return &wrapper->wrapped();
967 return nullptr;
968}
969
970}
971