Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dom/bindings/FrameLoaderBinding.cpp
Line
Count
Source (jump to first uncovered line)
1
/* THIS FILE IS AUTOGENERATED FROM FrameLoader.webidl BY Codegen.py - DO NOT EDIT */
2
3
#include "FrameLoaderBinding.h"
4
#include "WrapperFactory.h"
5
#include "mozilla/FloatingPoint.h"
6
#include "mozilla/OwningNonNull.h"
7
#include "mozilla/dom/BindingUtils.h"
8
#include "mozilla/dom/DOMJSClass.h"
9
#include "mozilla/dom/Element.h"
10
#include "mozilla/dom/MessageSender.h"
11
#include "mozilla/dom/NonRefcountedDOMObject.h"
12
#include "mozilla/dom/Nullable.h"
13
#include "mozilla/dom/ParentSHistory.h"
14
#include "mozilla/dom/PrimitiveConversions.h"
15
#include "mozilla/dom/Promise.h"
16
#include "mozilla/dom/ToJSValue.h"
17
#include "mozilla/dom/XrayExpandoClass.h"
18
#include "nsContentUtils.h"
19
#include "nsFrameLoader.h"
20
#include "nsIDocShell.h"
21
#include "nsILoadContext.h"
22
#include "nsIPrintSettings.h"
23
#include "nsITabParent.h"
24
#include "nsIWebBrowserPersistDocument.h"
25
#include "nsIWebProgressListener.h"
26
27
namespace mozilla {
28
namespace dom {
29
30
namespace binding_detail {}; // Just to make sure it's known as a namespace
31
using namespace mozilla::dom::binding_detail;
32
33
34
namespace FrameLoader_Binding {
35
36
MOZ_CAN_RUN_SCRIPT static bool
37
get_docShell(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
38
0
{
39
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.docShell", DOM, cx);
40
0
41
0
  FastErrorResult rv;
42
0
  auto result(StrongOrRawPtr<nsIDocShell>(self->GetDocShell(rv)));
43
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
44
0
    return false;
45
0
  }
46
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
47
0
  if (!result) {
48
0
    args.rval().setNull();
49
0
    return true;
50
0
  }
51
0
  if (!WrapObject(cx, result, &NS_GET_IID(nsIDocShell), args.rval())) {
52
0
    return false;
53
0
  }
54
0
  return true;
55
0
}
56
57
static const JSJitInfo docShell_getterinfo = {
58
  { (JSJitGetterOp)get_docShell },
59
  { prototypes::id::FrameLoader },
60
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
61
  JSJitInfo::Getter,
62
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
63
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
64
  false,  /* isInfallible. False in setters. */
65
  false,  /* isMovable.  Not relevant for setters. */
66
  false, /* isEliminatable.  Not relevant for setters. */
67
  false, /* isAlwaysInSlot.  Only relevant for getters. */
68
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
69
  false,  /* isTypedMethod.  Only relevant for methods. */
70
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
71
};
72
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
73
static_assert(0 < 1, "There is no slot for us");
74
75
MOZ_CAN_RUN_SCRIPT static bool
76
get_tabParent(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
77
0
{
78
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.tabParent", DOM, cx);
79
0
80
0
  auto result(StrongOrRawPtr<nsITabParent>(self->GetTabParent()));
81
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
82
0
  if (!result) {
83
0
    args.rval().setNull();
84
0
    return true;
85
0
  }
86
0
  if (!WrapObject(cx, result, &NS_GET_IID(nsITabParent), args.rval())) {
87
0
    return false;
88
0
  }
89
0
  return true;
90
0
}
91
92
static const JSJitInfo tabParent_getterinfo = {
93
  { (JSJitGetterOp)get_tabParent },
94
  { prototypes::id::FrameLoader },
95
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
96
  JSJitInfo::Getter,
97
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
98
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
99
  false,  /* isInfallible. False in setters. */
100
  false,  /* isMovable.  Not relevant for setters. */
101
  false, /* isEliminatable.  Not relevant for setters. */
102
  false, /* isAlwaysInSlot.  Only relevant for getters. */
103
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
104
  false,  /* isTypedMethod.  Only relevant for methods. */
105
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
106
};
107
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
108
static_assert(0 < 1, "There is no slot for us");
109
110
MOZ_CAN_RUN_SCRIPT static bool
111
get_loadContext(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
112
0
{
113
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.loadContext", DOM, cx);
114
0
115
0
  auto result(StrongOrRawPtr<nsILoadContext>(self->LoadContext()));
116
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
117
0
  if (!WrapObject(cx, result, &NS_GET_IID(nsILoadContext), args.rval())) {
118
0
    return false;
119
0
  }
120
0
  return true;
121
0
}
122
123
static const JSJitInfo loadContext_getterinfo = {
124
  { (JSJitGetterOp)get_loadContext },
125
  { prototypes::id::FrameLoader },
126
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
127
  JSJitInfo::Getter,
128
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
129
  JSVAL_TYPE_OBJECT,  /* returnType.  Not relevant for setters. */
130
  false,  /* isInfallible. False in setters. */
131
  false,  /* isMovable.  Not relevant for setters. */
132
  false, /* isEliminatable.  Not relevant for setters. */
133
  false, /* isAlwaysInSlot.  Only relevant for getters. */
134
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
135
  false,  /* isTypedMethod.  Only relevant for methods. */
136
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
137
};
138
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
139
static_assert(0 < 1, "There is no slot for us");
140
141
MOZ_CAN_RUN_SCRIPT static bool
142
get_parentSHistory(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
143
0
{
144
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.parentSHistory", DOM, cx);
145
0
146
0
  auto result(StrongOrRawPtr<mozilla::dom::ParentSHistory>(self->GetParentSHistory()));
147
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
148
0
  if (!result) {
149
0
    args.rval().setNull();
150
0
    return true;
151
0
  }
152
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
153
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
154
0
    return false;
155
0
  }
156
0
  return true;
157
0
}
158
159
static const JSJitInfo parentSHistory_getterinfo = {
160
  { (JSJitGetterOp)get_parentSHistory },
161
  { prototypes::id::FrameLoader },
162
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
163
  JSJitInfo::Getter,
164
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
165
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
166
  false,  /* isInfallible. False in setters. */
167
  false,  /* isMovable.  Not relevant for setters. */
168
  false, /* isEliminatable.  Not relevant for setters. */
169
  false, /* isAlwaysInSlot.  Only relevant for getters. */
170
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
171
  false,  /* isTypedMethod.  Only relevant for methods. */
172
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
173
};
174
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
175
static_assert(0 < 1, "There is no slot for us");
176
177
MOZ_CAN_RUN_SCRIPT static bool
178
addProcessChangeBlockingPromise(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
179
0
{
180
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.addProcessChangeBlockingPromise", DOM, cx);
181
0
182
0
  if (MOZ_UNLIKELY(args.length() < 1)) {
183
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "FrameLoader.addProcessChangeBlockingPromise");
184
0
  }
185
0
  OwningNonNull<Promise> arg0;
186
0
  { // Scope for our GlobalObject, FastErrorResult, JSAutoRealm,
187
0
    // etc.
188
0
189
0
    JS::Rooted<JSObject*> globalObj(cx);
190
0
    globalObj = JS::CurrentGlobalOrNull(cx);
191
0
    JSAutoRealm ar(cx, globalObj);
192
0
    GlobalObject promiseGlobal(cx, globalObj);
193
0
    if (promiseGlobal.Failed()) {
194
0
      return false;
195
0
    }
196
0
197
0
    JS::Rooted<JS::Value> valueToResolve(cx, args[0]);
198
0
    if (!JS_WrapValue(cx, &valueToResolve)) {
199
0
      return false;
200
0
    }
201
0
    binding_detail::FastErrorResult promiseRv;
202
0
    nsCOMPtr<nsIGlobalObject> global =
203
0
      do_QueryInterface(promiseGlobal.GetAsSupports());
204
0
    if (!global) {
205
0
      promiseRv.ThrowWithCustomCleanup(NS_ERROR_UNEXPECTED);
206
0
      MOZ_ALWAYS_TRUE(promiseRv.MaybeSetPendingException(cx));
207
0
      return false;
208
0
    }
209
0
    arg0 = Promise::Resolve(global, cx, valueToResolve,
210
0
                                    promiseRv);
211
0
    if (promiseRv.MaybeSetPendingException(cx)) {
212
0
      return false;
213
0
    }
214
0
  }
215
0
  FastErrorResult rv;
216
0
  self->AddProcessChangeBlockingPromise(NonNullHelper(arg0), rv);
217
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
218
0
    return false;
219
0
  }
220
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
221
0
  args.rval().setUndefined();
222
0
  return true;
223
0
}
224
225
static const JSJitInfo addProcessChangeBlockingPromise_methodinfo = {
226
  { (JSJitGetterOp)addProcessChangeBlockingPromise },
227
  { prototypes::id::FrameLoader },
228
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
229
  JSJitInfo::Method,
230
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
231
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
232
  false,  /* isInfallible. False in setters. */
233
  false,  /* isMovable.  Not relevant for setters. */
234
  false, /* isEliminatable.  Not relevant for setters. */
235
  false, /* isAlwaysInSlot.  Only relevant for getters. */
236
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
237
  false,  /* isTypedMethod.  Only relevant for methods. */
238
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
239
};
240
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
241
static_assert(0 < 1, "There is no slot for us");
242
243
MOZ_CAN_RUN_SCRIPT static bool
244
get_depthTooGreat(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
245
0
{
246
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.depthTooGreat", DOM, cx);
247
0
248
0
  bool result(self->DepthTooGreat());
249
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
250
0
  args.rval().setBoolean(result);
251
0
  return true;
252
0
}
253
254
static const JSJitInfo depthTooGreat_getterinfo = {
255
  { (JSJitGetterOp)get_depthTooGreat },
256
  { prototypes::id::FrameLoader },
257
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
258
  JSJitInfo::Getter,
259
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
260
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
261
  true,  /* isInfallible. False in setters. */
262
  true,  /* isMovable.  Not relevant for setters. */
263
  true, /* isEliminatable.  Not relevant for setters. */
264
  false, /* isAlwaysInSlot.  Only relevant for getters. */
265
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
266
  false,  /* isTypedMethod.  Only relevant for methods. */
267
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
268
};
269
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
270
static_assert(0 < 1, "There is no slot for us");
271
272
MOZ_CAN_RUN_SCRIPT static bool
273
activateRemoteFrame(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
274
0
{
275
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.activateRemoteFrame", DOM, cx);
276
0
277
0
  FastErrorResult rv;
278
0
  self->ActivateRemoteFrame(rv);
279
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
280
0
    return false;
281
0
  }
282
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
283
0
  args.rval().setUndefined();
284
0
  return true;
285
0
}
286
287
static const JSJitInfo activateRemoteFrame_methodinfo = {
288
  { (JSJitGetterOp)activateRemoteFrame },
289
  { prototypes::id::FrameLoader },
290
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
291
  JSJitInfo::Method,
292
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
293
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
294
  false,  /* isInfallible. False in setters. */
295
  false,  /* isMovable.  Not relevant for setters. */
296
  false, /* isEliminatable.  Not relevant for setters. */
297
  false, /* isAlwaysInSlot.  Only relevant for getters. */
298
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
299
  false,  /* isTypedMethod.  Only relevant for methods. */
300
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
301
};
302
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
303
static_assert(0 < 1, "There is no slot for us");
304
305
MOZ_CAN_RUN_SCRIPT static bool
306
deactivateRemoteFrame(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
307
0
{
308
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.deactivateRemoteFrame", DOM, cx);
309
0
310
0
  FastErrorResult rv;
311
0
  self->DeactivateRemoteFrame(rv);
312
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
313
0
    return false;
314
0
  }
315
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
316
0
  args.rval().setUndefined();
317
0
  return true;
318
0
}
319
320
static const JSJitInfo deactivateRemoteFrame_methodinfo = {
321
  { (JSJitGetterOp)deactivateRemoteFrame },
322
  { prototypes::id::FrameLoader },
323
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
324
  JSJitInfo::Method,
325
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
326
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
327
  false,  /* isInfallible. False in setters. */
328
  false,  /* isMovable.  Not relevant for setters. */
329
  false, /* isEliminatable.  Not relevant for setters. */
330
  false, /* isAlwaysInSlot.  Only relevant for getters. */
331
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
332
  false,  /* isTypedMethod.  Only relevant for methods. */
333
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
334
};
335
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
336
static_assert(0 < 1, "There is no slot for us");
337
338
MOZ_CAN_RUN_SCRIPT static bool
339
sendCrossProcessMouseEvent(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
340
0
{
341
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.sendCrossProcessMouseEvent", DOM, cx);
342
0
343
0
  if (MOZ_UNLIKELY(args.length() < 6)) {
344
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "FrameLoader.sendCrossProcessMouseEvent");
345
0
  }
346
0
  binding_detail::FakeString arg0;
347
0
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
348
0
    return false;
349
0
  }
350
0
  float arg1;
351
0
  if (!ValueToPrimitive<float, eDefault>(cx, args[1], &arg1)) {
352
0
    return false;
353
0
  } else if (!mozilla::IsFinite(arg1)) {
354
0
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Argument 2 of FrameLoader.sendCrossProcessMouseEvent");
355
0
    return false;
356
0
  }
357
0
  float arg2;
358
0
  if (!ValueToPrimitive<float, eDefault>(cx, args[2], &arg2)) {
359
0
    return false;
360
0
  } else if (!mozilla::IsFinite(arg2)) {
361
0
    ThrowErrorMessage(cx, MSG_NOT_FINITE, "Argument 3 of FrameLoader.sendCrossProcessMouseEvent");
362
0
    return false;
363
0
  }
364
0
  int32_t arg3;
365
0
  if (!ValueToPrimitive<int32_t, eDefault>(cx, args[3], &arg3)) {
366
0
    return false;
367
0
  }
368
0
  int32_t arg4;
369
0
  if (!ValueToPrimitive<int32_t, eDefault>(cx, args[4], &arg4)) {
370
0
    return false;
371
0
  }
372
0
  int32_t arg5;
373
0
  if (!ValueToPrimitive<int32_t, eDefault>(cx, args[5], &arg5)) {
374
0
    return false;
375
0
  }
376
0
  bool arg6;
377
0
  if (args.hasDefined(6)) {
378
0
    if (!ValueToPrimitive<bool, eDefault>(cx, args[6], &arg6)) {
379
0
      return false;
380
0
    }
381
0
  } else {
382
0
    arg6 = false;
383
0
  }
384
0
  FastErrorResult rv;
385
0
  self->SendCrossProcessMouseEvent(NonNullHelper(Constify(arg0)), arg1, arg2, arg3, arg4, arg5, arg6, rv);
386
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
387
0
    return false;
388
0
  }
389
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
390
0
  args.rval().setUndefined();
391
0
  return true;
392
0
}
393
394
static const JSJitInfo sendCrossProcessMouseEvent_methodinfo = {
395
  { (JSJitGetterOp)sendCrossProcessMouseEvent },
396
  { prototypes::id::FrameLoader },
397
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
398
  JSJitInfo::Method,
399
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
400
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
401
  false,  /* isInfallible. False in setters. */
402
  false,  /* isMovable.  Not relevant for setters. */
403
  false, /* isEliminatable.  Not relevant for setters. */
404
  false, /* isAlwaysInSlot.  Only relevant for getters. */
405
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
406
  false,  /* isTypedMethod.  Only relevant for methods. */
407
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
408
};
409
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
410
static_assert(0 < 1, "There is no slot for us");
411
412
MOZ_CAN_RUN_SCRIPT static bool
413
activateFrameEvent(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
414
0
{
415
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.activateFrameEvent", DOM, cx);
416
0
417
0
  if (MOZ_UNLIKELY(args.length() < 2)) {
418
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "FrameLoader.activateFrameEvent");
419
0
  }
420
0
  binding_detail::FakeString arg0;
421
0
  if (!ConvertJSValueToString(cx, args[0], eStringify, eStringify, arg0)) {
422
0
    return false;
423
0
  }
424
0
  bool arg1;
425
0
  if (!ValueToPrimitive<bool, eDefault>(cx, args[1], &arg1)) {
426
0
    return false;
427
0
  }
428
0
  FastErrorResult rv;
429
0
  self->ActivateFrameEvent(NonNullHelper(Constify(arg0)), arg1, rv);
430
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
431
0
    return false;
432
0
  }
433
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
434
0
  args.rval().setUndefined();
435
0
  return true;
436
0
}
437
438
static const JSJitInfo activateFrameEvent_methodinfo = {
439
  { (JSJitGetterOp)activateFrameEvent },
440
  { prototypes::id::FrameLoader },
441
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
442
  JSJitInfo::Method,
443
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
444
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
445
  false,  /* isInfallible. False in setters. */
446
  false,  /* isMovable.  Not relevant for setters. */
447
  false, /* isEliminatable.  Not relevant for setters. */
448
  false, /* isAlwaysInSlot.  Only relevant for getters. */
449
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
450
  false,  /* isTypedMethod.  Only relevant for methods. */
451
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
452
};
453
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
454
static_assert(0 < 1, "There is no slot for us");
455
456
MOZ_CAN_RUN_SCRIPT static bool
457
get_messageManager(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
458
0
{
459
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.messageManager", DOM, cx);
460
0
461
0
  auto result(StrongOrRawPtr<mozilla::dom::MessageSender>(self->GetMessageManager()));
462
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
463
0
  if (!result) {
464
0
    args.rval().setNull();
465
0
    return true;
466
0
  }
467
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
468
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
469
0
    return false;
470
0
  }
471
0
  return true;
472
0
}
473
474
static const JSJitInfo messageManager_getterinfo = {
475
  { (JSJitGetterOp)get_messageManager },
476
  { prototypes::id::FrameLoader },
477
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
478
  JSJitInfo::Getter,
479
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
480
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
481
  false,  /* isInfallible. False in setters. */
482
  false,  /* isMovable.  Not relevant for setters. */
483
  false, /* isEliminatable.  Not relevant for setters. */
484
  false, /* isAlwaysInSlot.  Only relevant for getters. */
485
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
486
  false,  /* isTypedMethod.  Only relevant for methods. */
487
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
488
};
489
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
490
static_assert(0 < 1, "There is no slot for us");
491
492
MOZ_CAN_RUN_SCRIPT static bool
493
requestNotifyAfterRemotePaint(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
494
0
{
495
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.requestNotifyAfterRemotePaint", DOM, cx);
496
0
497
0
  self->RequestNotifyAfterRemotePaint();
498
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
499
0
  args.rval().setUndefined();
500
0
  return true;
501
0
}
502
503
static const JSJitInfo requestNotifyAfterRemotePaint_methodinfo = {
504
  { (JSJitGetterOp)requestNotifyAfterRemotePaint },
505
  { prototypes::id::FrameLoader },
506
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
507
  JSJitInfo::Method,
508
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
509
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
510
  true,  /* isInfallible. False in setters. */
511
  false,  /* isMovable.  Not relevant for setters. */
512
  false, /* isEliminatable.  Not relevant for setters. */
513
  false, /* isAlwaysInSlot.  Only relevant for getters. */
514
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
515
  false,  /* isTypedMethod.  Only relevant for methods. */
516
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
517
};
518
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
519
static_assert(0 < 1, "There is no slot for us");
520
521
MOZ_CAN_RUN_SCRIPT static bool
522
requestFrameLoaderClose(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
523
0
{
524
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.requestFrameLoaderClose", DOM, cx);
525
0
526
0
  FastErrorResult rv;
527
0
  self->RequestFrameLoaderClose(rv);
528
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
529
0
    return false;
530
0
  }
531
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
532
0
  args.rval().setUndefined();
533
0
  return true;
534
0
}
535
536
static const JSJitInfo requestFrameLoaderClose_methodinfo = {
537
  { (JSJitGetterOp)requestFrameLoaderClose },
538
  { prototypes::id::FrameLoader },
539
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
540
  JSJitInfo::Method,
541
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
542
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
543
  false,  /* isInfallible. False in setters. */
544
  false,  /* isMovable.  Not relevant for setters. */
545
  false, /* isEliminatable.  Not relevant for setters. */
546
  false, /* isAlwaysInSlot.  Only relevant for getters. */
547
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
548
  false,  /* isTypedMethod.  Only relevant for methods. */
549
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
550
};
551
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
552
static_assert(0 < 1, "There is no slot for us");
553
554
MOZ_CAN_RUN_SCRIPT static bool
555
requestUpdatePosition(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
556
0
{
557
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.requestUpdatePosition", DOM, cx);
558
0
559
0
  FastErrorResult rv;
560
0
  self->RequestUpdatePosition(rv);
561
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
562
0
    return false;
563
0
  }
564
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
565
0
  args.rval().setUndefined();
566
0
  return true;
567
0
}
568
569
static const JSJitInfo requestUpdatePosition_methodinfo = {
570
  { (JSJitGetterOp)requestUpdatePosition },
571
  { prototypes::id::FrameLoader },
572
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
573
  JSJitInfo::Method,
574
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
575
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
576
  false,  /* isInfallible. False in setters. */
577
  false,  /* isMovable.  Not relevant for setters. */
578
  false, /* isEliminatable.  Not relevant for setters. */
579
  false, /* isAlwaysInSlot.  Only relevant for getters. */
580
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
581
  false,  /* isTypedMethod.  Only relevant for methods. */
582
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
583
};
584
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
585
static_assert(0 < 1, "There is no slot for us");
586
587
MOZ_CAN_RUN_SCRIPT static bool
588
print(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
589
0
{
590
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.print", DOM, cx);
591
0
592
0
  if (MOZ_UNLIKELY(args.length() < 2)) {
593
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "FrameLoader.print");
594
0
  }
595
0
  uint64_t arg0;
596
0
  if (!ValueToPrimitive<uint64_t, eDefault>(cx, args[0], &arg0)) {
597
0
    return false;
598
0
  }
599
0
  nsIPrintSettings* arg1;
600
0
  RefPtr<nsIPrintSettings> arg1_holder;
601
0
  if (args[1].isObject()) {
602
0
    JS::Rooted<JSObject*> source(cx, &args[1].toObject());
603
0
    if (NS_FAILED(UnwrapArg<nsIPrintSettings>(cx, source, getter_AddRefs(arg1_holder)))) {
604
0
      ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of FrameLoader.print", "nsIPrintSettings");
605
0
      return false;
606
0
    }
607
0
    MOZ_ASSERT(arg1_holder);
608
0
    arg1 = arg1_holder;
609
0
  } else {
610
0
    ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of FrameLoader.print");
611
0
    return false;
612
0
  }
613
0
  nsIWebProgressListener* arg2;
614
0
  RefPtr<nsIWebProgressListener> arg2_holder;
615
0
  if (args.hasDefined(2)) {
616
0
    if (args[2].isObject()) {
617
0
      JS::Rooted<JSObject*> source(cx, &args[2].toObject());
618
0
      if (NS_FAILED(UnwrapArg<nsIWebProgressListener>(cx, source, getter_AddRefs(arg2_holder)))) {
619
0
        ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 3 of FrameLoader.print", "nsIWebProgressListener");
620
0
        return false;
621
0
      }
622
0
      MOZ_ASSERT(arg2_holder);
623
0
      arg2 = arg2_holder;
624
0
    } else if (args[2].isNullOrUndefined()) {
625
0
      arg2 = nullptr;
626
0
    } else {
627
0
      ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 3 of FrameLoader.print");
628
0
      return false;
629
0
    }
630
0
  } else {
631
0
    arg2 = nullptr;
632
0
  }
633
0
  FastErrorResult rv;
634
0
  self->Print(arg0, MOZ_KnownLive(NonNullHelper(arg1)), MOZ_KnownLive(Constify(arg2)), rv);
635
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
636
0
    return false;
637
0
  }
638
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
639
0
  args.rval().setUndefined();
640
0
  return true;
641
0
}
642
643
static const JSJitInfo print_methodinfo = {
644
  { (JSJitGetterOp)print },
645
  { prototypes::id::FrameLoader },
646
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
647
  JSJitInfo::Method,
648
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
649
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
650
  false,  /* isInfallible. False in setters. */
651
  false,  /* isMovable.  Not relevant for setters. */
652
  false, /* isEliminatable.  Not relevant for setters. */
653
  false, /* isAlwaysInSlot.  Only relevant for getters. */
654
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
655
  false,  /* isTypedMethod.  Only relevant for methods. */
656
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
657
};
658
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
659
static_assert(0 < 1, "There is no slot for us");
660
661
MOZ_CAN_RUN_SCRIPT static bool
662
get_clipSubdocument(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
663
0
{
664
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.clipSubdocument", DOM, cx);
665
0
666
0
  bool result(self->ClipSubdocument());
667
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
668
0
  args.rval().setBoolean(result);
669
0
  return true;
670
0
}
671
672
MOZ_CAN_RUN_SCRIPT static bool
673
set_clipSubdocument(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitSetterCallArgs args)
674
0
{
675
0
  AUTO_PROFILER_LABEL_FAST("set FrameLoader.clipSubdocument", DOM, cx);
676
0
677
0
  bool arg0;
678
0
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
679
0
    return false;
680
0
  }
681
0
  self->SetClipSubdocument(arg0);
682
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
683
0
684
0
  return true;
685
0
}
686
687
static const JSJitInfo clipSubdocument_getterinfo = {
688
  { (JSJitGetterOp)get_clipSubdocument },
689
  { prototypes::id::FrameLoader },
690
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
691
  JSJitInfo::Getter,
692
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
693
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
694
  true,  /* isInfallible. False in setters. */
695
  false,  /* isMovable.  Not relevant for setters. */
696
  false, /* isEliminatable.  Not relevant for setters. */
697
  false, /* isAlwaysInSlot.  Only relevant for getters. */
698
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
699
  false,  /* isTypedMethod.  Only relevant for methods. */
700
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
701
};
702
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
703
static_assert(0 < 1, "There is no slot for us");
704
static const JSJitInfo clipSubdocument_setterinfo = {
705
  { (JSJitGetterOp)set_clipSubdocument },
706
  { prototypes::id::FrameLoader },
707
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
708
  JSJitInfo::Setter,
709
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
710
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
711
  false,  /* isInfallible. False in setters. */
712
  false,  /* isMovable.  Not relevant for setters. */
713
  false, /* isEliminatable.  Not relevant for setters. */
714
  false, /* isAlwaysInSlot.  Only relevant for getters. */
715
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
716
  false,  /* isTypedMethod.  Only relevant for methods. */
717
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
718
};
719
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
720
static_assert(0 < 1, "There is no slot for us");
721
722
MOZ_CAN_RUN_SCRIPT static bool
723
get_clampScrollPosition(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
724
0
{
725
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.clampScrollPosition", DOM, cx);
726
0
727
0
  bool result(self->ClampScrollPosition());
728
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
729
0
  args.rval().setBoolean(result);
730
0
  return true;
731
0
}
732
733
MOZ_CAN_RUN_SCRIPT static bool
734
set_clampScrollPosition(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitSetterCallArgs args)
735
0
{
736
0
  AUTO_PROFILER_LABEL_FAST("set FrameLoader.clampScrollPosition", DOM, cx);
737
0
738
0
  bool arg0;
739
0
  if (!ValueToPrimitive<bool, eDefault>(cx, args[0], &arg0)) {
740
0
    return false;
741
0
  }
742
0
  self->SetClampScrollPosition(arg0);
743
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
744
0
745
0
  return true;
746
0
}
747
748
static const JSJitInfo clampScrollPosition_getterinfo = {
749
  { (JSJitGetterOp)get_clampScrollPosition },
750
  { prototypes::id::FrameLoader },
751
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
752
  JSJitInfo::Getter,
753
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
754
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
755
  true,  /* isInfallible. False in setters. */
756
  false,  /* isMovable.  Not relevant for setters. */
757
  false, /* isEliminatable.  Not relevant for setters. */
758
  false, /* isAlwaysInSlot.  Only relevant for getters. */
759
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
760
  false,  /* isTypedMethod.  Only relevant for methods. */
761
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
762
};
763
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
764
static_assert(0 < 1, "There is no slot for us");
765
static const JSJitInfo clampScrollPosition_setterinfo = {
766
  { (JSJitGetterOp)set_clampScrollPosition },
767
  { prototypes::id::FrameLoader },
768
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
769
  JSJitInfo::Setter,
770
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
771
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
772
  false,  /* isInfallible. False in setters. */
773
  false,  /* isMovable.  Not relevant for setters. */
774
  false, /* isEliminatable.  Not relevant for setters. */
775
  false, /* isAlwaysInSlot.  Only relevant for getters. */
776
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
777
  false,  /* isTypedMethod.  Only relevant for methods. */
778
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
779
};
780
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
781
static_assert(0 < 1, "There is no slot for us");
782
783
MOZ_CAN_RUN_SCRIPT static bool
784
get_ownerElement(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
785
0
{
786
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.ownerElement", DOM, cx);
787
0
788
0
  auto result(StrongOrRawPtr<mozilla::dom::Element>(self->GetOwnerElement()));
789
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
790
0
  if (!result) {
791
0
    args.rval().setNull();
792
0
    return true;
793
0
  }
794
0
  if (!GetOrCreateDOMReflector(cx, result, args.rval())) {
795
0
    MOZ_ASSERT(JS_IsExceptionPending(cx));
796
0
    return false;
797
0
  }
798
0
  return true;
799
0
}
800
801
static const JSJitInfo ownerElement_getterinfo = {
802
  { (JSJitGetterOp)get_ownerElement },
803
  { prototypes::id::FrameLoader },
804
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
805
  JSJitInfo::Getter,
806
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
807
  JSVAL_TYPE_UNKNOWN,  /* returnType.  Not relevant for setters. */
808
  false,  /* isInfallible. False in setters. */
809
  true,  /* isMovable.  Not relevant for setters. */
810
  true, /* isEliminatable.  Not relevant for setters. */
811
  false, /* isAlwaysInSlot.  Only relevant for getters. */
812
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
813
  false,  /* isTypedMethod.  Only relevant for methods. */
814
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
815
};
816
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
817
static_assert(0 < 1, "There is no slot for us");
818
819
MOZ_CAN_RUN_SCRIPT static bool
820
get_childID(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
821
0
{
822
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.childID", DOM, cx);
823
0
824
0
  uint64_t result(self->ChildID());
825
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
826
0
  args.rval().set(JS_NumberValue(double(result)));
827
0
  return true;
828
0
}
829
830
static const JSJitInfo childID_getterinfo = {
831
  { (JSJitGetterOp)get_childID },
832
  { prototypes::id::FrameLoader },
833
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
834
  JSJitInfo::Getter,
835
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
836
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
837
  true,  /* isInfallible. False in setters. */
838
  true,  /* isMovable.  Not relevant for setters. */
839
  true, /* isEliminatable.  Not relevant for setters. */
840
  false, /* isAlwaysInSlot.  Only relevant for getters. */
841
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
842
  false,  /* isTypedMethod.  Only relevant for methods. */
843
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
844
};
845
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
846
static_assert(0 < 1, "There is no slot for us");
847
848
MOZ_CAN_RUN_SCRIPT static bool
849
get_ownerIsMozBrowserFrame(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
850
0
{
851
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.ownerIsMozBrowserFrame", DOM, cx);
852
0
853
0
  bool result(self->OwnerIsMozBrowserFrame());
854
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
855
0
  args.rval().setBoolean(result);
856
0
  return true;
857
0
}
858
859
static const JSJitInfo ownerIsMozBrowserFrame_getterinfo = {
860
  { (JSJitGetterOp)get_ownerIsMozBrowserFrame },
861
  { prototypes::id::FrameLoader },
862
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
863
  JSJitInfo::Getter,
864
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
865
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
866
  true,  /* isInfallible. False in setters. */
867
  true,  /* isMovable.  Not relevant for setters. */
868
  true, /* isEliminatable.  Not relevant for setters. */
869
  false, /* isAlwaysInSlot.  Only relevant for getters. */
870
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
871
  false,  /* isTypedMethod.  Only relevant for methods. */
872
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
873
};
874
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
875
static_assert(0 < 1, "There is no slot for us");
876
877
MOZ_CAN_RUN_SCRIPT static bool
878
get_lazyWidth(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
879
0
{
880
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.lazyWidth", DOM, cx);
881
0
882
0
  uint32_t result(self->LazyWidth());
883
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
884
0
  args.rval().setNumber(result);
885
0
  return true;
886
0
}
887
888
static const JSJitInfo lazyWidth_getterinfo = {
889
  { (JSJitGetterOp)get_lazyWidth },
890
  { prototypes::id::FrameLoader },
891
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
892
  JSJitInfo::Getter,
893
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
894
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
895
  true,  /* isInfallible. False in setters. */
896
  true,  /* isMovable.  Not relevant for setters. */
897
  true, /* isEliminatable.  Not relevant for setters. */
898
  false, /* isAlwaysInSlot.  Only relevant for getters. */
899
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
900
  false,  /* isTypedMethod.  Only relevant for methods. */
901
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
902
};
903
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
904
static_assert(0 < 1, "There is no slot for us");
905
906
MOZ_CAN_RUN_SCRIPT static bool
907
get_lazyHeight(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
908
0
{
909
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.lazyHeight", DOM, cx);
910
0
911
0
  uint32_t result(self->LazyHeight());
912
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
913
0
  args.rval().setNumber(result);
914
0
  return true;
915
0
}
916
917
static const JSJitInfo lazyHeight_getterinfo = {
918
  { (JSJitGetterOp)get_lazyHeight },
919
  { prototypes::id::FrameLoader },
920
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
921
  JSJitInfo::Getter,
922
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
923
  JSVAL_TYPE_DOUBLE,  /* returnType.  Not relevant for setters. */
924
  true,  /* isInfallible. False in setters. */
925
  true,  /* isMovable.  Not relevant for setters. */
926
  true, /* isEliminatable.  Not relevant for setters. */
927
  false, /* isAlwaysInSlot.  Only relevant for getters. */
928
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
929
  false,  /* isTypedMethod.  Only relevant for methods. */
930
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
931
};
932
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
933
static_assert(0 < 1, "There is no slot for us");
934
935
MOZ_CAN_RUN_SCRIPT static bool
936
get_isDead(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, JSJitGetterCallArgs args)
937
0
{
938
0
  AUTO_PROFILER_LABEL_FAST("get FrameLoader.isDead", DOM, cx);
939
0
940
0
  bool result(self->IsDead());
941
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
942
0
  args.rval().setBoolean(result);
943
0
  return true;
944
0
}
945
946
static const JSJitInfo isDead_getterinfo = {
947
  { (JSJitGetterOp)get_isDead },
948
  { prototypes::id::FrameLoader },
949
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
950
  JSJitInfo::Getter,
951
  JSJitInfo::AliasDOMSets, /* aliasSet.  Not relevant for setters. */
952
  JSVAL_TYPE_BOOLEAN,  /* returnType.  Not relevant for setters. */
953
  true,  /* isInfallible. False in setters. */
954
  true,  /* isMovable.  Not relevant for setters. */
955
  true, /* isEliminatable.  Not relevant for setters. */
956
  false, /* isAlwaysInSlot.  Only relevant for getters. */
957
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
958
  false,  /* isTypedMethod.  Only relevant for methods. */
959
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
960
};
961
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
962
static_assert(0 < 1, "There is no slot for us");
963
964
MOZ_CAN_RUN_SCRIPT static bool
965
startPersistence(JSContext* cx, JS::Handle<JSObject*> obj, nsFrameLoader* self, const JSJitMethodCallArgs& args)
966
0
{
967
0
  AUTO_PROFILER_LABEL_FAST("FrameLoader.startPersistence", DOM, cx);
968
0
969
0
  if (MOZ_UNLIKELY(args.length() < 2)) {
970
0
    return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, "FrameLoader.startPersistence");
971
0
  }
972
0
  uint64_t arg0;
973
0
  if (!ValueToPrimitive<uint64_t, eDefault>(cx, args[0], &arg0)) {
974
0
    return false;
975
0
  }
976
0
  nsIWebBrowserPersistDocumentReceiver* arg1;
977
0
  RefPtr<nsIWebBrowserPersistDocumentReceiver> arg1_holder;
978
0
  if (args[1].isObject()) {
979
0
    JS::Rooted<JSObject*> source(cx, &args[1].toObject());
980
0
    if (NS_FAILED(UnwrapArg<nsIWebBrowserPersistDocumentReceiver>(cx, source, getter_AddRefs(arg1_holder)))) {
981
0
      ThrowErrorMessage(cx, MSG_DOES_NOT_IMPLEMENT_INTERFACE, "Argument 2 of FrameLoader.startPersistence", "nsIWebBrowserPersistDocumentReceiver");
982
0
      return false;
983
0
    }
984
0
    MOZ_ASSERT(arg1_holder);
985
0
    arg1 = arg1_holder;
986
0
  } else {
987
0
    ThrowErrorMessage(cx, MSG_NOT_OBJECT, "Argument 2 of FrameLoader.startPersistence");
988
0
    return false;
989
0
  }
990
0
  FastErrorResult rv;
991
0
  self->StartPersistence(arg0, MOZ_KnownLive(NonNullHelper(arg1)), rv);
992
0
  if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) {
993
0
    return false;
994
0
  }
995
0
  MOZ_ASSERT(!JS_IsExceptionPending(cx));
996
0
  args.rval().setUndefined();
997
0
  return true;
998
0
}
999
1000
static const JSJitInfo startPersistence_methodinfo = {
1001
  { (JSJitGetterOp)startPersistence },
1002
  { prototypes::id::FrameLoader },
1003
  { PrototypeTraits<prototypes::id::FrameLoader>::Depth },
1004
  JSJitInfo::Method,
1005
  JSJitInfo::AliasEverything, /* aliasSet.  Not relevant for setters. */
1006
  JSVAL_TYPE_UNDEFINED,  /* returnType.  Not relevant for setters. */
1007
  false,  /* isInfallible. False in setters. */
1008
  false,  /* isMovable.  Not relevant for setters. */
1009
  false, /* isEliminatable.  Not relevant for setters. */
1010
  false, /* isAlwaysInSlot.  Only relevant for getters. */
1011
  false, /* isLazilyCachedInSlot.  Only relevant for getters. */
1012
  false,  /* isTypedMethod.  Only relevant for methods. */
1013
  0   /* Reserved slot index, if we're stored in a slot, else 0. */
1014
};
1015
static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
1016
static_assert(0 < 1, "There is no slot for us");
1017
1018
static bool
1019
_addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
1020
0
{
1021
0
  nsFrameLoader* self = UnwrapPossiblyNotInitializedDOMObject<nsFrameLoader>(obj);
1022
0
  // We don't want to preserve if we don't have a wrapper, and we
1023
0
  // obviously can't preserve if we're not initialized.
1024
0
  if (self && self->GetWrapperPreserveColor()) {
1025
0
    PreserveWrapper(self);
1026
0
  }
1027
0
  return true;
1028
0
}
1029
1030
static void
1031
_finalize(js::FreeOp* fop, JSObject* obj)
1032
0
{
1033
0
  nsFrameLoader* self = UnwrapPossiblyNotInitializedDOMObject<nsFrameLoader>(obj);
1034
0
  if (self) {
1035
0
    ClearWrapper(self, self, obj);
1036
0
    AddForDeferredFinalization<nsFrameLoader>(self);
1037
0
  }
1038
0
}
1039
1040
static size_t
1041
_objectMoved(JSObject* obj, JSObject* old)
1042
0
{
1043
0
  nsFrameLoader* self = UnwrapPossiblyNotInitializedDOMObject<nsFrameLoader>(obj);
1044
0
  if (self) {
1045
0
    UpdateWrapper(self, self, obj, old);
1046
0
  }
1047
0
1048
0
  return 0;
1049
0
}
1050
1051
// We deliberately use brace-elision to make Visual Studio produce better initalization code.
1052
#if defined(__clang__)
1053
#pragma clang diagnostic push
1054
#pragma clang diagnostic ignored "-Wmissing-braces"
1055
#endif
1056
static const JSFunctionSpec sMethods_specs[] = {
1057
  JS_FNSPEC("addProcessChangeBlockingPromise", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&addProcessChangeBlockingPromise_methodinfo), 1, JSPROP_ENUMERATE, nullptr),
1058
  JS_FNSPEC("activateRemoteFrame", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&activateRemoteFrame_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1059
  JS_FNSPEC("deactivateRemoteFrame", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&deactivateRemoteFrame_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1060
  JS_FNSPEC("sendCrossProcessMouseEvent", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&sendCrossProcessMouseEvent_methodinfo), 6, JSPROP_ENUMERATE, nullptr),
1061
  JS_FNSPEC("activateFrameEvent", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&activateFrameEvent_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1062
  JS_FNSPEC("requestNotifyAfterRemotePaint", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&requestNotifyAfterRemotePaint_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1063
  JS_FNSPEC("requestFrameLoaderClose", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&requestFrameLoaderClose_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1064
  JS_FNSPEC("requestUpdatePosition", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&requestUpdatePosition_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
1065
  JS_FNSPEC("print", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&print_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1066
  JS_FNSPEC("startPersistence", (GenericMethod<NormalThisPolicy, ThrowExceptions>), reinterpret_cast<const JSJitInfo*>(&startPersistence_methodinfo), 2, JSPROP_ENUMERATE, nullptr),
1067
  JS_FS_END
1068
};
1069
#if defined(__clang__)
1070
#pragma clang diagnostic pop
1071
#endif
1072
1073
1074
static const Prefable<const JSFunctionSpec> sMethods[] = {
1075
  { nullptr, &sMethods_specs[0] },
1076
  { nullptr, nullptr }
1077
};
1078
1079
static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1080
    "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1081
static_assert(10 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1082
    "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1083
1084
// We deliberately use brace-elision to make Visual Studio produce better initalization code.
1085
#if defined(__clang__)
1086
#pragma clang diagnostic push
1087
#pragma clang diagnostic ignored "-Wmissing-braces"
1088
#endif
1089
static const JSPropertySpec sAttributes_specs[] = {
1090
  { "docShell", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &docShell_getterinfo, nullptr, nullptr },
1091
  { "tabParent", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &tabParent_getterinfo, nullptr, nullptr },
1092
  { "loadContext", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &loadContext_getterinfo, nullptr, nullptr },
1093
  { "parentSHistory", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &parentSHistory_getterinfo, nullptr, nullptr },
1094
  { "depthTooGreat", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &depthTooGreat_getterinfo, nullptr, nullptr },
1095
  { "messageManager", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &messageManager_getterinfo, nullptr, nullptr },
1096
  { "clipSubdocument", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &clipSubdocument_getterinfo, GenericSetter<NormalThisPolicy>, &clipSubdocument_setterinfo },
1097
  { "clampScrollPosition", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &clampScrollPosition_getterinfo, GenericSetter<NormalThisPolicy>, &clampScrollPosition_setterinfo },
1098
  { "ownerElement", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &ownerElement_getterinfo, nullptr, nullptr },
1099
  { "childID", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &childID_getterinfo, nullptr, nullptr },
1100
  { "ownerIsMozBrowserFrame", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &ownerIsMozBrowserFrame_getterinfo, nullptr, nullptr },
1101
  { "lazyWidth", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &lazyWidth_getterinfo, nullptr, nullptr },
1102
  { "lazyHeight", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &lazyHeight_getterinfo, nullptr, nullptr },
1103
  { "isDead", JSPROP_ENUMERATE, GenericGetter<NormalThisPolicy, ThrowExceptions>, &isDead_getterinfo, nullptr, nullptr },
1104
  { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
1105
};
1106
#if defined(__clang__)
1107
#pragma clang diagnostic pop
1108
#endif
1109
1110
1111
static const Prefable<const JSPropertySpec> sAttributes[] = {
1112
  { nullptr, &sAttributes_specs[0] },
1113
  { nullptr, nullptr }
1114
};
1115
1116
static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
1117
    "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
1118
static_assert(14 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
1119
    "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
1120
1121
1122
static uint16_t sNativeProperties_sortedPropertyIndices[24];
1123
static PropertyInfo sNativeProperties_propertyInfos[24];
1124
1125
static const NativePropertiesN<2> sNativeProperties = {
1126
  false, 0,
1127
  false, 0,
1128
  true,  0 /* sMethods */,
1129
  true,  1 /* sAttributes */,
1130
  false, 0,
1131
  false, 0,
1132
  false, 0,
1133
  -1,
1134
  24,
1135
  sNativeProperties_sortedPropertyIndices,
1136
  {
1137
    { sMethods, &sNativeProperties_propertyInfos[0] },
1138
    { sAttributes, &sNativeProperties_propertyInfos[10] }
1139
  }
1140
};
1141
static_assert(24 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
1142
    "We have a property info count that is oversized");
1143
1144
static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
1145
  {
1146
    "Function",
1147
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
1148
    &sBoringInterfaceObjectClassClassOps,
1149
    JS_NULL_CLASS_SPEC,
1150
    JS_NULL_CLASS_EXT,
1151
    &sInterfaceObjectClassObjectOps
1152
  },
1153
  eInterface,
1154
  true,
1155
  prototypes::id::FrameLoader,
1156
  PrototypeTraits<prototypes::id::FrameLoader>::Depth,
1157
  sNativePropertyHooks,
1158
  "function FrameLoader() {\n    [native code]\n}",
1159
  JS::GetRealmFunctionPrototype
1160
};
1161
1162
static const DOMIfaceAndProtoJSClass sPrototypeClass = {
1163
  {
1164
    "FrameLoaderPrototype",
1165
    JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
1166
    JS_NULL_CLASS_OPS,
1167
    JS_NULL_CLASS_SPEC,
1168
    JS_NULL_CLASS_EXT,
1169
    JS_NULL_OBJECT_OPS
1170
  },
1171
  eInterfacePrototype,
1172
  false,
1173
  prototypes::id::FrameLoader,
1174
  PrototypeTraits<prototypes::id::FrameLoader>::Depth,
1175
  sNativePropertyHooks,
1176
  "[object FrameLoaderPrototype]",
1177
  JS::GetRealmObjectPrototype
1178
};
1179
1180
bool
1181
ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj)
1182
0
{
1183
0
  return nsContentUtils::ThreadsafeIsSystemCaller(aCx);
1184
0
}
1185
1186
static const js::ClassOps sClassOps = {
1187
  _addProperty, /* addProperty */
1188
  nullptr,               /* delProperty */
1189
  nullptr,               /* enumerate */
1190
  nullptr, /* newEnumerate */
1191
  nullptr, /* resolve */
1192
  nullptr, /* mayResolve */
1193
  _finalize, /* finalize */
1194
  nullptr, /* call */
1195
  nullptr,               /* hasInstance */
1196
  nullptr,               /* construct */
1197
  nullptr, /* trace */
1198
};
1199
1200
static const js::ClassExtension sClassExtension = {
1201
  nullptr, /* weakmapKeyDelegateOp */
1202
  _objectMoved /* objectMovedOp */
1203
};
1204
1205
static const DOMJSClass sClass = {
1206
  { "FrameLoader",
1207
    JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
1208
    &sClassOps,
1209
    JS_NULL_CLASS_SPEC,
1210
    &sClassExtension,
1211
    JS_NULL_OBJECT_OPS
1212
  },
1213
  { prototypes::id::FrameLoader, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
1214
  IsBaseOf<nsISupports, nsFrameLoader >::value,
1215
  sNativePropertyHooks,
1216
  FindAssociatedGlobalForNative<nsFrameLoader>::Get,
1217
  GetProtoObjectHandle,
1218
  GetCCParticipant<nsFrameLoader>::Get()
1219
};
1220
static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
1221
              "Must have the right minimal number of reserved slots.");
1222
static_assert(1 >= 1,
1223
              "Must have enough reserved slots.");
1224
1225
const JSClass*
1226
GetJSClass()
1227
0
{
1228
0
  return sClass.ToJSClass();
1229
0
}
1230
1231
bool
1232
Wrap(JSContext* aCx, nsFrameLoader* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
1233
0
{
1234
0
  static_assert(!IsBaseOf<NonRefcountedDOMObject, nsFrameLoader>::value,
1235
0
                "Shouldn't have wrappercached things that are not refcounted.");
1236
0
  MOZ_ASSERT(static_cast<nsFrameLoader*>(aObject) ==
1237
0
             reinterpret_cast<nsFrameLoader*>(aObject),
1238
0
             "Multiple inheritance for nsFrameLoader is broken.");
1239
0
  MOZ_ASSERT(ToSupportsIsCorrect(aObject));
1240
0
  MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
1241
0
  MOZ_ASSERT(!aCache->GetWrapper(),
1242
0
             "You should probably not be using Wrap() directly; use "
1243
0
             "GetOrCreateDOMReflector instead");
1244
0
1245
0
  MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
1246
0
             "nsISupports must be on our primary inheritance chain");
1247
0
1248
0
  JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
1249
0
  if (!global) {
1250
0
    return false;
1251
0
  }
1252
0
  MOZ_ASSERT(JS_IsGlobalObject(global));
1253
0
  MOZ_ASSERT(JS::ObjectIsNotGray(global));
1254
0
1255
0
  // That might have ended up wrapping us already, due to the wonders
1256
0
  // of XBL.  Check for that, and bail out as needed.
1257
0
  aReflector.set(aCache->GetWrapper());
1258
0
  if (aReflector) {
1259
#ifdef DEBUG
1260
    AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
1261
#endif // DEBUG
1262
    return true;
1263
0
  }
1264
0
1265
0
  JSAutoRealm ar(aCx, global);
1266
0
  JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
1267
0
  if (!canonicalProto) {
1268
0
    return false;
1269
0
  }
1270
0
  JS::Rooted<JSObject*> proto(aCx);
1271
0
  if (aGivenProto) {
1272
0
    proto = aGivenProto;
1273
0
    // Unfortunately, while aGivenProto was in the compartment of aCx
1274
0
    // coming in, we changed compartments to that of "parent" so may need
1275
0
    // to wrap the proto here.
1276
0
    if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
1277
0
      if (!JS_WrapObject(aCx, &proto)) {
1278
0
        return false;
1279
0
      }
1280
0
    }
1281
0
  } else {
1282
0
    proto = canonicalProto;
1283
0
  }
1284
0
1285
0
  BindingJSObjectCreator<nsFrameLoader> creator(aCx);
1286
0
  creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
1287
0
  if (!aReflector) {
1288
0
    return false;
1289
0
  }
1290
0
1291
0
  aCache->SetWrapper(aReflector);
1292
0
  creator.InitializationSucceeded();
1293
0
1294
0
  MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
1295
0
             aCache->GetWrapperPreserveColor() == aReflector);
1296
0
  // If proto != canonicalProto, we have to preserve our wrapper;
1297
0
  // otherwise we won't be able to properly recreate it later, since
1298
0
  // we won't know what proto to use.  Note that we don't check
1299
0
  // aGivenProto here, since it's entirely possible (and even
1300
0
  // somewhat common) to have a non-null aGivenProto which is the
1301
0
  // same as canonicalProto.
1302
0
  if (proto != canonicalProto) {
1303
0
    PreserveWrapper(aObject);
1304
0
  }
1305
0
1306
0
  return true;
1307
0
}
1308
1309
const NativePropertyHooks sNativePropertyHooks[] = { {
1310
  nullptr,
1311
  nullptr,
1312
  nullptr,
1313
  { sNativeProperties.Upcast(), nullptr },
1314
  prototypes::id::FrameLoader,
1315
  constructors::id::FrameLoader,
1316
  nullptr,
1317
  &DefaultXrayExpandoObjectClass
1318
} };
1319
1320
void
1321
CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
1322
0
{
1323
0
  JS::Rooted<JSObject*> parentProto(aCx, JS::GetRealmObjectPrototype(aCx));
1324
0
  if (!parentProto) {
1325
0
    return;
1326
0
  }
1327
0
1328
0
  JS::Rooted<JSObject*> constructorProto(aCx, JS::GetRealmFunctionPrototype(aCx));
1329
0
  if (!constructorProto) {
1330
0
    return;
1331
0
  }
1332
0
1333
0
  static bool sIdsInited = false;
1334
0
  if (!sIdsInited && NS_IsMainThread()) {
1335
0
    if (!InitIds(aCx, sNativeProperties.Upcast())) {
1336
0
      return;
1337
0
    }
1338
0
    sIdsInited = true;
1339
0
  }
1340
0
1341
0
  JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::FrameLoader);
1342
0
  JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::FrameLoader);
1343
0
  dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
1344
0
                              &sPrototypeClass.mBase, protoCache,
1345
0
                              nullptr,
1346
0
                              constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
1347
0
                              interfaceCache,
1348
0
                              sNativeProperties.Upcast(),
1349
0
                              nullptr,
1350
0
                              "FrameLoader", aDefineOnGlobal,
1351
0
                              nullptr,
1352
0
                              false);
1353
0
}
1354
1355
JSObject*
1356
GetConstructorObject(JSContext* aCx)
1357
0
{
1358
0
  return GetConstructorObjectHandle(aCx);
1359
0
}
1360
1361
} // namespace FrameLoader_Binding
1362
1363
1364
1365
} // namespace dom
1366
} // namespace mozilla