Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/dom/CanvasRenderingContext2DBinding.h
Line
Count
Source (jump to first uncovered line)
1
/* THIS FILE IS AUTOGENERATED FROM CanvasRenderingContext2D.webidl BY Codegen.py - DO NOT EDIT */
2
3
#ifndef mozilla_dom_CanvasRenderingContext2DBinding_h
4
#define mozilla_dom_CanvasRenderingContext2DBinding_h
5
6
#include "CanvasPath.h"
7
#include "GeckoProfiler.h"
8
#include "js/RootingAPI.h"
9
#include "jspubtd.h"
10
#include "mozilla/ErrorResult.h"
11
#include "mozilla/dom/BindingDeclarations.h"
12
#include "mozilla/dom/Element.h"
13
#include "mozilla/dom/FakeString.h"
14
#include "mozilla/dom/Nullable.h"
15
#include "mozilla/dom/PrototypeList.h"
16
#include "mozilla/dom/UnionMember.h"
17
18
namespace mozilla {
19
namespace dom {
20
21
class CanvasGradient;
22
struct CanvasGradientAtoms;
23
class CanvasPath;
24
struct CanvasPathAtoms;
25
class CanvasPattern;
26
struct CanvasPatternAtoms;
27
class CanvasRenderingContext2D;
28
struct CanvasRenderingContext2DAtoms;
29
struct ContextAttributes2DAtoms;
30
class Element;
31
class HTMLCanvasElement;
32
class HTMLImageElement;
33
class HTMLVideoElement;
34
struct HitRegionOptionsAtoms;
35
class ImageBitmap;
36
struct NativePropertyHooks;
37
class OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap;
38
class OwningStringOrCanvasGradientOrCanvasPattern;
39
class ProtoAndIfaceCache;
40
class SVGImageElement;
41
class TextMetrics;
42
struct TextMetricsAtoms;
43
44
} // namespace dom
45
} // namespace mozilla
46
47
namespace mozilla {
48
namespace dom {
49
50
enum class CanvasWindingRule : uint8_t {
51
  Nonzero,
52
  Evenodd,
53
  EndGuard_
54
};
55
56
namespace CanvasWindingRuleValues {
57
extern const EnumEntry strings[3];
58
} // namespace CanvasWindingRuleValues
59
60
bool
61
ToJSValue(JSContext* aCx, CanvasWindingRule aArgument, JS::MutableHandle<JS::Value> aValue);
62
63
64
void
65
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap& aUnion, const char* aName, uint32_t aFlags = 0);
66
67
68
void
69
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningStringOrCanvasGradientOrCanvasPattern& aUnion, const char* aName, uint32_t aFlags = 0);
70
71
72
void
73
ImplCycleCollectionUnlink(OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap& aUnion);
74
75
76
void
77
ImplCycleCollectionUnlink(OwningStringOrCanvasGradientOrCanvasPattern& aUnion);
78
79
80
struct ContextAttributes2D : public DictionaryBase
81
{
82
  MOZ_INIT_OUTSIDE_CTOR bool mAlpha;
83
  MOZ_INIT_OUTSIDE_CTOR bool mWillReadFrequently;
84
85
  ContextAttributes2D();
86
87
  explicit inline ContextAttributes2D(const FastDictionaryInitializer& )
88
0
  {
89
0
    // Do nothing here; this is used by our "Fast" subclass
90
0
  }
91
92
  explicit inline ContextAttributes2D(const ContextAttributes2D& aOther)
93
0
  {
94
0
    *this = aOther;
95
0
  }
96
97
  bool
98
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);
99
100
  bool
101
  Init(const nsAString& aJSON);
102
103
  bool
104
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;
105
106
  bool
107
  ToJSON(nsAString& aJSON) const;
108
109
  void
110
  TraceDictionary(JSTracer* trc);
111
112
  ContextAttributes2D&
113
  operator=(const ContextAttributes2D& aOther);
114
115
private:
116
  static bool
117
  InitIds(JSContext* cx, ContextAttributes2DAtoms* atomsCache);
118
};
119
120
namespace binding_detail {
121
struct FastContextAttributes2D : public ContextAttributes2D
122
{
123
  inline FastContextAttributes2D()
124
    : ContextAttributes2D(FastDictionaryInitializer())
125
0
  {
126
0
    // Doesn't matter what int we pass to the parent constructor
127
0
  }
128
};
129
} // namespace binding_detail
130
131
132
class HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap
133
{
134
  friend class HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmapArgument;
135
  enum Type
136
  {
137
    eUninitialized,
138
    eHTMLImageElement,
139
    eSVGImageElement,
140
    eHTMLCanvasElement,
141
    eHTMLVideoElement,
142
    eImageBitmap
143
  };
144
145
  union Value
146
  {
147
    UnionMember<NonNull<mozilla::dom::HTMLImageElement> > mHTMLImageElement;
148
    UnionMember<NonNull<mozilla::dom::SVGImageElement> > mSVGImageElement;
149
    UnionMember<NonNull<mozilla::dom::HTMLCanvasElement> > mHTMLCanvasElement;
150
    UnionMember<NonNull<mozilla::dom::HTMLVideoElement> > mHTMLVideoElement;
151
    UnionMember<NonNull<mozilla::dom::ImageBitmap> > mImageBitmap;
152
153
  };
154
155
  Type mType;
156
  Value mValue;
157
158
  HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap(const HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap&) = delete;
159
  HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap& operator=(const HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap&) = delete;
160
public:
161
  explicit inline HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap()
162
    : mType(eUninitialized)
163
0
  {
164
0
  }
165
166
  inline ~HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap()
167
0
  {
168
0
    Uninit();
169
0
  }
170
171
  inline NonNull<mozilla::dom::HTMLImageElement>&
172
  RawSetAsHTMLImageElement()
173
0
  {
174
0
    if (mType == eHTMLImageElement) {
175
0
      return mValue.mHTMLImageElement.Value();
176
0
    }
177
0
    MOZ_ASSERT(mType == eUninitialized);
178
0
    mType = eHTMLImageElement;
179
0
    return mValue.mHTMLImageElement.SetValue();
180
0
  }
181
182
  inline NonNull<mozilla::dom::HTMLImageElement>&
183
  SetAsHTMLImageElement()
184
0
  {
185
0
    if (mType == eHTMLImageElement) {
186
0
      return mValue.mHTMLImageElement.Value();
187
0
    }
188
0
    Uninit();
189
0
    mType = eHTMLImageElement;
190
0
    return mValue.mHTMLImageElement.SetValue();
191
0
  }
192
193
  inline bool
194
  IsHTMLImageElement() const
195
0
  {
196
0
    return mType == eHTMLImageElement;
197
0
  }
198
199
  inline NonNull<mozilla::dom::HTMLImageElement>&
200
  GetAsHTMLImageElement()
201
0
  {
202
0
    MOZ_ASSERT(IsHTMLImageElement(), "Wrong type!");
203
0
    return mValue.mHTMLImageElement.Value();
204
0
  }
205
206
  inline mozilla::dom::HTMLImageElement&
207
  GetAsHTMLImageElement() const
208
0
  {
209
0
    MOZ_ASSERT(IsHTMLImageElement(), "Wrong type!");
210
0
    return mValue.mHTMLImageElement.Value();
211
0
  }
212
213
  inline NonNull<mozilla::dom::SVGImageElement>&
214
  RawSetAsSVGImageElement()
215
0
  {
216
0
    if (mType == eSVGImageElement) {
217
0
      return mValue.mSVGImageElement.Value();
218
0
    }
219
0
    MOZ_ASSERT(mType == eUninitialized);
220
0
    mType = eSVGImageElement;
221
0
    return mValue.mSVGImageElement.SetValue();
222
0
  }
223
224
  inline NonNull<mozilla::dom::SVGImageElement>&
225
  SetAsSVGImageElement()
226
0
  {
227
0
    if (mType == eSVGImageElement) {
228
0
      return mValue.mSVGImageElement.Value();
229
0
    }
230
0
    Uninit();
231
0
    mType = eSVGImageElement;
232
0
    return mValue.mSVGImageElement.SetValue();
233
0
  }
234
235
  inline bool
236
  IsSVGImageElement() const
237
0
  {
238
0
    return mType == eSVGImageElement;
239
0
  }
240
241
  inline NonNull<mozilla::dom::SVGImageElement>&
242
  GetAsSVGImageElement()
243
0
  {
244
0
    MOZ_ASSERT(IsSVGImageElement(), "Wrong type!");
245
0
    return mValue.mSVGImageElement.Value();
246
0
  }
247
248
  inline mozilla::dom::SVGImageElement&
249
  GetAsSVGImageElement() const
250
0
  {
251
0
    MOZ_ASSERT(IsSVGImageElement(), "Wrong type!");
252
0
    return mValue.mSVGImageElement.Value();
253
0
  }
254
255
  inline NonNull<mozilla::dom::HTMLCanvasElement>&
256
  RawSetAsHTMLCanvasElement()
257
0
  {
258
0
    if (mType == eHTMLCanvasElement) {
259
0
      return mValue.mHTMLCanvasElement.Value();
260
0
    }
261
0
    MOZ_ASSERT(mType == eUninitialized);
262
0
    mType = eHTMLCanvasElement;
263
0
    return mValue.mHTMLCanvasElement.SetValue();
264
0
  }
265
266
  inline NonNull<mozilla::dom::HTMLCanvasElement>&
267
  SetAsHTMLCanvasElement()
268
0
  {
269
0
    if (mType == eHTMLCanvasElement) {
270
0
      return mValue.mHTMLCanvasElement.Value();
271
0
    }
272
0
    Uninit();
273
0
    mType = eHTMLCanvasElement;
274
0
    return mValue.mHTMLCanvasElement.SetValue();
275
0
  }
276
277
  inline bool
278
  IsHTMLCanvasElement() const
279
0
  {
280
0
    return mType == eHTMLCanvasElement;
281
0
  }
282
283
  inline NonNull<mozilla::dom::HTMLCanvasElement>&
284
  GetAsHTMLCanvasElement()
285
0
  {
286
0
    MOZ_ASSERT(IsHTMLCanvasElement(), "Wrong type!");
287
0
    return mValue.mHTMLCanvasElement.Value();
288
0
  }
289
290
  inline mozilla::dom::HTMLCanvasElement&
291
  GetAsHTMLCanvasElement() const
292
0
  {
293
0
    MOZ_ASSERT(IsHTMLCanvasElement(), "Wrong type!");
294
0
    return mValue.mHTMLCanvasElement.Value();
295
0
  }
296
297
  inline NonNull<mozilla::dom::HTMLVideoElement>&
298
  RawSetAsHTMLVideoElement()
299
0
  {
300
0
    if (mType == eHTMLVideoElement) {
301
0
      return mValue.mHTMLVideoElement.Value();
302
0
    }
303
0
    MOZ_ASSERT(mType == eUninitialized);
304
0
    mType = eHTMLVideoElement;
305
0
    return mValue.mHTMLVideoElement.SetValue();
306
0
  }
307
308
  inline NonNull<mozilla::dom::HTMLVideoElement>&
309
  SetAsHTMLVideoElement()
310
0
  {
311
0
    if (mType == eHTMLVideoElement) {
312
0
      return mValue.mHTMLVideoElement.Value();
313
0
    }
314
0
    Uninit();
315
0
    mType = eHTMLVideoElement;
316
0
    return mValue.mHTMLVideoElement.SetValue();
317
0
  }
318
319
  inline bool
320
  IsHTMLVideoElement() const
321
0
  {
322
0
    return mType == eHTMLVideoElement;
323
0
  }
324
325
  inline NonNull<mozilla::dom::HTMLVideoElement>&
326
  GetAsHTMLVideoElement()
327
0
  {
328
0
    MOZ_ASSERT(IsHTMLVideoElement(), "Wrong type!");
329
0
    return mValue.mHTMLVideoElement.Value();
330
0
  }
331
332
  inline mozilla::dom::HTMLVideoElement&
333
  GetAsHTMLVideoElement() const
334
0
  {
335
0
    MOZ_ASSERT(IsHTMLVideoElement(), "Wrong type!");
336
0
    return mValue.mHTMLVideoElement.Value();
337
0
  }
338
339
  inline NonNull<mozilla::dom::ImageBitmap>&
340
  RawSetAsImageBitmap()
341
0
  {
342
0
    if (mType == eImageBitmap) {
343
0
      return mValue.mImageBitmap.Value();
344
0
    }
345
0
    MOZ_ASSERT(mType == eUninitialized);
346
0
    mType = eImageBitmap;
347
0
    return mValue.mImageBitmap.SetValue();
348
0
  }
349
350
  inline NonNull<mozilla::dom::ImageBitmap>&
351
  SetAsImageBitmap()
352
0
  {
353
0
    if (mType == eImageBitmap) {
354
0
      return mValue.mImageBitmap.Value();
355
0
    }
356
0
    Uninit();
357
0
    mType = eImageBitmap;
358
0
    return mValue.mImageBitmap.SetValue();
359
0
  }
360
361
  inline bool
362
  IsImageBitmap() const
363
0
  {
364
0
    return mType == eImageBitmap;
365
0
  }
366
367
  inline NonNull<mozilla::dom::ImageBitmap>&
368
  GetAsImageBitmap()
369
0
  {
370
0
    MOZ_ASSERT(IsImageBitmap(), "Wrong type!");
371
0
    return mValue.mImageBitmap.Value();
372
0
  }
373
374
  inline mozilla::dom::ImageBitmap&
375
  GetAsImageBitmap() const
376
0
  {
377
0
    MOZ_ASSERT(IsImageBitmap(), "Wrong type!");
378
0
    return mValue.mImageBitmap.Value();
379
0
  }
380
381
  inline void
382
  Uninit()
383
  {
384
    switch (mType) {
385
      case eUninitialized: {
386
        break;
387
      }
388
      case eHTMLImageElement: {
389
        DestroyHTMLImageElement();
390
        break;
391
      }
392
      case eSVGImageElement: {
393
        DestroySVGImageElement();
394
        break;
395
      }
396
      case eHTMLCanvasElement: {
397
        DestroyHTMLCanvasElement();
398
        break;
399
      }
400
      case eHTMLVideoElement: {
401
        DestroyHTMLVideoElement();
402
        break;
403
      }
404
      case eImageBitmap: {
405
        DestroyImageBitmap();
406
        break;
407
      }
408
    }
409
  }
410
411
  bool
412
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;
413
414
private:
415
  inline void
416
  DestroyHTMLImageElement()
417
0
  {
418
0
    MOZ_ASSERT(IsHTMLImageElement(), "Wrong type!");
419
0
    mValue.mHTMLImageElement.Destroy();
420
0
    mType = eUninitialized;
421
0
  }
422
423
  inline void
424
  DestroySVGImageElement()
425
0
  {
426
0
    MOZ_ASSERT(IsSVGImageElement(), "Wrong type!");
427
0
    mValue.mSVGImageElement.Destroy();
428
0
    mType = eUninitialized;
429
0
  }
430
431
  inline void
432
  DestroyHTMLCanvasElement()
433
0
  {
434
0
    MOZ_ASSERT(IsHTMLCanvasElement(), "Wrong type!");
435
0
    mValue.mHTMLCanvasElement.Destroy();
436
0
    mType = eUninitialized;
437
0
  }
438
439
  inline void
440
  DestroyHTMLVideoElement()
441
0
  {
442
0
    MOZ_ASSERT(IsHTMLVideoElement(), "Wrong type!");
443
0
    mValue.mHTMLVideoElement.Destroy();
444
0
    mType = eUninitialized;
445
0
  }
446
447
  inline void
448
  DestroyImageBitmap()
449
0
  {
450
0
    MOZ_ASSERT(IsImageBitmap(), "Wrong type!");
451
0
    mValue.mImageBitmap.Destroy();
452
0
    mType = eUninitialized;
453
0
  }
454
};
455
456
457
class OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap : public AllOwningUnionBase
458
{
459
  friend void ImplCycleCollectionUnlink(OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap& aUnion);
460
  enum Type
461
  {
462
    eUninitialized,
463
    eHTMLImageElement,
464
    eSVGImageElement,
465
    eHTMLCanvasElement,
466
    eHTMLVideoElement,
467
    eImageBitmap
468
  };
469
470
  union Value
471
  {
472
    UnionMember<OwningNonNull<mozilla::dom::HTMLImageElement> > mHTMLImageElement;
473
    UnionMember<OwningNonNull<mozilla::dom::SVGImageElement> > mSVGImageElement;
474
    UnionMember<OwningNonNull<mozilla::dom::HTMLCanvasElement> > mHTMLCanvasElement;
475
    UnionMember<OwningNonNull<mozilla::dom::HTMLVideoElement> > mHTMLVideoElement;
476
    UnionMember<OwningNonNull<mozilla::dom::ImageBitmap> > mImageBitmap;
477
478
  };
479
480
  Type mType;
481
  Value mValue;
482
483
public:
484
  explicit inline OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap()
485
    : mType(eUninitialized)
486
0
  {
487
0
  }
488
489
  explicit inline OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap(const OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap& aOther)
490
    : mType(eUninitialized)
491
0
  {
492
0
    *this = aOther;
493
0
  }
494
495
  inline ~OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap()
496
0
  {
497
0
    Uninit();
498
0
  }
499
500
  OwningNonNull<mozilla::dom::HTMLImageElement>&
501
  RawSetAsHTMLImageElement();
502
503
  OwningNonNull<mozilla::dom::HTMLImageElement>&
504
  SetAsHTMLImageElement();
505
506
  bool
507
  TrySetToHTMLImageElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
508
509
  inline bool
510
  IsHTMLImageElement() const
511
0
  {
512
0
    return mType == eHTMLImageElement;
513
0
  }
514
515
  inline OwningNonNull<mozilla::dom::HTMLImageElement>&
516
  GetAsHTMLImageElement()
517
0
  {
518
0
    MOZ_ASSERT(IsHTMLImageElement(), "Wrong type!");
519
0
    return mValue.mHTMLImageElement.Value();
520
0
  }
521
522
  inline OwningNonNull<mozilla::dom::HTMLImageElement> const &
523
  GetAsHTMLImageElement() const
524
0
  {
525
0
    MOZ_ASSERT(IsHTMLImageElement(), "Wrong type!");
526
0
    return mValue.mHTMLImageElement.Value();
527
0
  }
528
529
  OwningNonNull<mozilla::dom::SVGImageElement>&
530
  RawSetAsSVGImageElement();
531
532
  OwningNonNull<mozilla::dom::SVGImageElement>&
533
  SetAsSVGImageElement();
534
535
  bool
536
  TrySetToSVGImageElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
537
538
  inline bool
539
  IsSVGImageElement() const
540
0
  {
541
0
    return mType == eSVGImageElement;
542
0
  }
543
544
  inline OwningNonNull<mozilla::dom::SVGImageElement>&
545
  GetAsSVGImageElement()
546
0
  {
547
0
    MOZ_ASSERT(IsSVGImageElement(), "Wrong type!");
548
0
    return mValue.mSVGImageElement.Value();
549
0
  }
550
551
  inline OwningNonNull<mozilla::dom::SVGImageElement> const &
552
  GetAsSVGImageElement() const
553
0
  {
554
0
    MOZ_ASSERT(IsSVGImageElement(), "Wrong type!");
555
0
    return mValue.mSVGImageElement.Value();
556
0
  }
557
558
  OwningNonNull<mozilla::dom::HTMLCanvasElement>&
559
  RawSetAsHTMLCanvasElement();
560
561
  OwningNonNull<mozilla::dom::HTMLCanvasElement>&
562
  SetAsHTMLCanvasElement();
563
564
  bool
565
  TrySetToHTMLCanvasElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
566
567
  inline bool
568
  IsHTMLCanvasElement() const
569
0
  {
570
0
    return mType == eHTMLCanvasElement;
571
0
  }
572
573
  inline OwningNonNull<mozilla::dom::HTMLCanvasElement>&
574
  GetAsHTMLCanvasElement()
575
0
  {
576
0
    MOZ_ASSERT(IsHTMLCanvasElement(), "Wrong type!");
577
0
    return mValue.mHTMLCanvasElement.Value();
578
0
  }
579
580
  inline OwningNonNull<mozilla::dom::HTMLCanvasElement> const &
581
  GetAsHTMLCanvasElement() const
582
0
  {
583
0
    MOZ_ASSERT(IsHTMLCanvasElement(), "Wrong type!");
584
0
    return mValue.mHTMLCanvasElement.Value();
585
0
  }
586
587
  OwningNonNull<mozilla::dom::HTMLVideoElement>&
588
  RawSetAsHTMLVideoElement();
589
590
  OwningNonNull<mozilla::dom::HTMLVideoElement>&
591
  SetAsHTMLVideoElement();
592
593
  bool
594
  TrySetToHTMLVideoElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
595
596
  inline bool
597
  IsHTMLVideoElement() const
598
0
  {
599
0
    return mType == eHTMLVideoElement;
600
0
  }
601
602
  inline OwningNonNull<mozilla::dom::HTMLVideoElement>&
603
  GetAsHTMLVideoElement()
604
0
  {
605
0
    MOZ_ASSERT(IsHTMLVideoElement(), "Wrong type!");
606
0
    return mValue.mHTMLVideoElement.Value();
607
0
  }
608
609
  inline OwningNonNull<mozilla::dom::HTMLVideoElement> const &
610
  GetAsHTMLVideoElement() const
611
0
  {
612
0
    MOZ_ASSERT(IsHTMLVideoElement(), "Wrong type!");
613
0
    return mValue.mHTMLVideoElement.Value();
614
0
  }
615
616
  OwningNonNull<mozilla::dom::ImageBitmap>&
617
  RawSetAsImageBitmap();
618
619
  OwningNonNull<mozilla::dom::ImageBitmap>&
620
  SetAsImageBitmap();
621
622
  bool
623
  TrySetToImageBitmap(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
624
625
  inline bool
626
  IsImageBitmap() const
627
0
  {
628
0
    return mType == eImageBitmap;
629
0
  }
630
631
  inline OwningNonNull<mozilla::dom::ImageBitmap>&
632
  GetAsImageBitmap()
633
0
  {
634
0
    MOZ_ASSERT(IsImageBitmap(), "Wrong type!");
635
0
    return mValue.mImageBitmap.Value();
636
0
  }
637
638
  inline OwningNonNull<mozilla::dom::ImageBitmap> const &
639
  GetAsImageBitmap() const
640
0
  {
641
0
    MOZ_ASSERT(IsImageBitmap(), "Wrong type!");
642
0
    return mValue.mImageBitmap.Value();
643
0
  }
644
645
  void
646
  Uninit();
647
648
  bool
649
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;
650
651
  void
652
  TraceUnion(JSTracer* trc);
653
654
  OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap&
655
  operator=(const OwningHTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap& aOther);
656
657
private:
658
  void
659
  DestroyHTMLImageElement();
660
661
  void
662
  DestroySVGImageElement();
663
664
  void
665
  DestroyHTMLCanvasElement();
666
667
  void
668
  DestroyHTMLVideoElement();
669
670
  void
671
  DestroyImageBitmap();
672
};
673
674
675
struct HitRegionOptions : public DictionaryBase
676
{
677
  MOZ_INIT_OUTSIDE_CTOR RefPtr<mozilla::dom::Element> mControl;
678
  MOZ_INIT_OUTSIDE_CTOR nsString mId;
679
  MOZ_INIT_OUTSIDE_CTOR RefPtr<mozilla::dom::CanvasPath> mPath;
680
681
  HitRegionOptions();
682
683
  explicit inline HitRegionOptions(const FastDictionaryInitializer& )
684
0
  {
685
0
    // Do nothing here; this is used by our "Fast" subclass
686
0
  }
687
688
  explicit inline HitRegionOptions(const HitRegionOptions& aOther)
689
0
  {
690
0
    *this = aOther;
691
0
  }
692
693
  bool
694
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);
695
696
  bool
697
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;
698
699
  void
700
  TraceDictionary(JSTracer* trc);
701
702
  inline void
703
  TraverseForCC(nsCycleCollectionTraversalCallback& aCallback, uint32_t aFlags)
704
0
  {
705
0
    ImplCycleCollectionTraverse(aCallback, mControl, "mControl", aFlags);
706
0
    ImplCycleCollectionTraverse(aCallback, mPath, "mPath", aFlags);
707
0
  }
708
709
  inline void
710
  UnlinkForCC()
711
0
  {
712
0
    ImplCycleCollectionUnlink(mControl);
713
0
    ImplCycleCollectionUnlink(mPath);
714
0
  }
715
716
  HitRegionOptions&
717
  operator=(const HitRegionOptions& aOther);
718
719
private:
720
  static bool
721
  InitIds(JSContext* cx, HitRegionOptionsAtoms* atomsCache);
722
};
723
724
namespace binding_detail {
725
struct FastHitRegionOptions : public HitRegionOptions
726
{
727
  inline FastHitRegionOptions()
728
    : HitRegionOptions(FastDictionaryInitializer())
729
0
  {
730
0
    // Doesn't matter what int we pass to the parent constructor
731
0
  }
732
};
733
} // namespace binding_detail
734
735
736
class StringOrCanvasGradientOrCanvasPattern
737
{
738
  friend class StringOrCanvasGradientOrCanvasPatternArgument;
739
  enum Type
740
  {
741
    eUninitialized,
742
    eString,
743
    eCanvasGradient,
744
    eCanvasPattern
745
  };
746
747
  union Value
748
  {
749
    UnionMember<binding_detail::FakeString > mString;
750
    UnionMember<NonNull<mozilla::dom::CanvasGradient> > mCanvasGradient;
751
    UnionMember<NonNull<mozilla::dom::CanvasPattern> > mCanvasPattern;
752
753
  };
754
755
  Type mType;
756
  Value mValue;
757
758
  StringOrCanvasGradientOrCanvasPattern(const StringOrCanvasGradientOrCanvasPattern&) = delete;
759
  StringOrCanvasGradientOrCanvasPattern& operator=(const StringOrCanvasGradientOrCanvasPattern&) = delete;
760
public:
761
  explicit inline StringOrCanvasGradientOrCanvasPattern()
762
    : mType(eUninitialized)
763
0
  {
764
0
  }
765
766
  inline ~StringOrCanvasGradientOrCanvasPattern()
767
0
  {
768
0
    Uninit();
769
0
  }
770
771
  inline binding_detail::FakeString&
772
  RawSetAsString()
773
0
  {
774
0
    if (mType == eString) {
775
0
      return mValue.mString.Value();
776
0
    }
777
0
    MOZ_ASSERT(mType == eUninitialized);
778
0
    mType = eString;
779
0
    return mValue.mString.SetValue();
780
0
  }
781
782
  inline binding_detail::FakeString&
783
  SetAsString()
784
0
  {
785
0
    if (mType == eString) {
786
0
      return mValue.mString.Value();
787
0
    }
788
0
    Uninit();
789
0
    mType = eString;
790
0
    return mValue.mString.SetValue();
791
0
  }
792
793
  inline bool
794
  IsString() const
795
0
  {
796
0
    return mType == eString;
797
0
  }
798
799
  inline binding_detail::FakeString&
800
  GetAsString()
801
0
  {
802
0
    MOZ_ASSERT(IsString(), "Wrong type!");
803
0
    return mValue.mString.Value();
804
0
  }
805
806
  inline const nsAString&
807
  GetAsString() const
808
0
  {
809
0
    MOZ_ASSERT(IsString(), "Wrong type!");
810
0
    return mValue.mString.Value();
811
0
  }
812
813
  inline NonNull<mozilla::dom::CanvasGradient>&
814
  RawSetAsCanvasGradient()
815
0
  {
816
0
    if (mType == eCanvasGradient) {
817
0
      return mValue.mCanvasGradient.Value();
818
0
    }
819
0
    MOZ_ASSERT(mType == eUninitialized);
820
0
    mType = eCanvasGradient;
821
0
    return mValue.mCanvasGradient.SetValue();
822
0
  }
823
824
  inline NonNull<mozilla::dom::CanvasGradient>&
825
  SetAsCanvasGradient()
826
0
  {
827
0
    if (mType == eCanvasGradient) {
828
0
      return mValue.mCanvasGradient.Value();
829
0
    }
830
0
    Uninit();
831
0
    mType = eCanvasGradient;
832
0
    return mValue.mCanvasGradient.SetValue();
833
0
  }
834
835
  inline bool
836
  IsCanvasGradient() const
837
0
  {
838
0
    return mType == eCanvasGradient;
839
0
  }
840
841
  inline NonNull<mozilla::dom::CanvasGradient>&
842
  GetAsCanvasGradient()
843
0
  {
844
0
    MOZ_ASSERT(IsCanvasGradient(), "Wrong type!");
845
0
    return mValue.mCanvasGradient.Value();
846
0
  }
847
848
  inline mozilla::dom::CanvasGradient&
849
  GetAsCanvasGradient() const
850
0
  {
851
0
    MOZ_ASSERT(IsCanvasGradient(), "Wrong type!");
852
0
    return mValue.mCanvasGradient.Value();
853
0
  }
854
855
  inline NonNull<mozilla::dom::CanvasPattern>&
856
  RawSetAsCanvasPattern()
857
0
  {
858
0
    if (mType == eCanvasPattern) {
859
0
      return mValue.mCanvasPattern.Value();
860
0
    }
861
0
    MOZ_ASSERT(mType == eUninitialized);
862
0
    mType = eCanvasPattern;
863
0
    return mValue.mCanvasPattern.SetValue();
864
0
  }
865
866
  inline NonNull<mozilla::dom::CanvasPattern>&
867
  SetAsCanvasPattern()
868
0
  {
869
0
    if (mType == eCanvasPattern) {
870
0
      return mValue.mCanvasPattern.Value();
871
0
    }
872
0
    Uninit();
873
0
    mType = eCanvasPattern;
874
0
    return mValue.mCanvasPattern.SetValue();
875
0
  }
876
877
  inline bool
878
  IsCanvasPattern() const
879
0
  {
880
0
    return mType == eCanvasPattern;
881
0
  }
882
883
  inline NonNull<mozilla::dom::CanvasPattern>&
884
  GetAsCanvasPattern()
885
0
  {
886
0
    MOZ_ASSERT(IsCanvasPattern(), "Wrong type!");
887
0
    return mValue.mCanvasPattern.Value();
888
0
  }
889
890
  inline mozilla::dom::CanvasPattern&
891
  GetAsCanvasPattern() const
892
0
  {
893
0
    MOZ_ASSERT(IsCanvasPattern(), "Wrong type!");
894
0
    return mValue.mCanvasPattern.Value();
895
0
  }
896
897
  inline void
898
  Uninit()
899
  {
900
    switch (mType) {
901
      case eUninitialized: {
902
        break;
903
      }
904
      case eString: {
905
        DestroyString();
906
        break;
907
      }
908
      case eCanvasGradient: {
909
        DestroyCanvasGradient();
910
        break;
911
      }
912
      case eCanvasPattern: {
913
        DestroyCanvasPattern();
914
        break;
915
      }
916
    }
917
  }
918
919
  bool
920
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;
921
922
private:
923
  inline void
924
  DestroyString()
925
0
  {
926
0
    MOZ_ASSERT(IsString(), "Wrong type!");
927
0
    mValue.mString.Destroy();
928
0
    mType = eUninitialized;
929
0
  }
930
931
  inline void
932
  DestroyCanvasGradient()
933
0
  {
934
0
    MOZ_ASSERT(IsCanvasGradient(), "Wrong type!");
935
0
    mValue.mCanvasGradient.Destroy();
936
0
    mType = eUninitialized;
937
0
  }
938
939
  inline void
940
  DestroyCanvasPattern()
941
0
  {
942
0
    MOZ_ASSERT(IsCanvasPattern(), "Wrong type!");
943
0
    mValue.mCanvasPattern.Destroy();
944
0
    mType = eUninitialized;
945
0
  }
946
};
947
948
949
class OwningStringOrCanvasGradientOrCanvasPattern : public AllOwningUnionBase
950
{
951
  friend void ImplCycleCollectionUnlink(OwningStringOrCanvasGradientOrCanvasPattern& aUnion);
952
  enum Type
953
  {
954
    eUninitialized,
955
    eString,
956
    eCanvasGradient,
957
    eCanvasPattern
958
  };
959
960
  union Value
961
  {
962
    UnionMember<nsString > mString;
963
    UnionMember<OwningNonNull<mozilla::dom::CanvasGradient> > mCanvasGradient;
964
    UnionMember<OwningNonNull<mozilla::dom::CanvasPattern> > mCanvasPattern;
965
966
  };
967
968
  Type mType;
969
  Value mValue;
970
971
public:
972
  explicit inline OwningStringOrCanvasGradientOrCanvasPattern()
973
    : mType(eUninitialized)
974
0
  {
975
0
  }
976
977
  explicit inline OwningStringOrCanvasGradientOrCanvasPattern(const OwningStringOrCanvasGradientOrCanvasPattern& aOther)
978
    : mType(eUninitialized)
979
0
  {
980
0
    *this = aOther;
981
0
  }
982
983
  inline ~OwningStringOrCanvasGradientOrCanvasPattern()
984
0
  {
985
0
    Uninit();
986
0
  }
987
988
  nsString&
989
  RawSetAsString();
990
991
  nsString&
992
  SetAsString();
993
994
  bool
995
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
996
997
  inline void
998
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
999
0
  {
1000
0
    RawSetAsString().Assign(aData, aLength);
1001
0
  }
1002
1003
  inline bool
1004
  IsString() const
1005
0
  {
1006
0
    return mType == eString;
1007
0
  }
1008
1009
  inline nsString&
1010
  GetAsString()
1011
0
  {
1012
0
    MOZ_ASSERT(IsString(), "Wrong type!");
1013
0
    return mValue.mString.Value();
1014
0
  }
1015
1016
  inline nsString const &
1017
  GetAsString() const
1018
0
  {
1019
0
    MOZ_ASSERT(IsString(), "Wrong type!");
1020
0
    return mValue.mString.Value();
1021
0
  }
1022
1023
  OwningNonNull<mozilla::dom::CanvasGradient>&
1024
  RawSetAsCanvasGradient();
1025
1026
  OwningNonNull<mozilla::dom::CanvasGradient>&
1027
  SetAsCanvasGradient();
1028
1029
  bool
1030
  TrySetToCanvasGradient(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
1031
1032
  inline bool
1033
  IsCanvasGradient() const
1034
0
  {
1035
0
    return mType == eCanvasGradient;
1036
0
  }
1037
1038
  inline OwningNonNull<mozilla::dom::CanvasGradient>&
1039
  GetAsCanvasGradient()
1040
0
  {
1041
0
    MOZ_ASSERT(IsCanvasGradient(), "Wrong type!");
1042
0
    return mValue.mCanvasGradient.Value();
1043
0
  }
1044
1045
  inline OwningNonNull<mozilla::dom::CanvasGradient> const &
1046
  GetAsCanvasGradient() const
1047
0
  {
1048
0
    MOZ_ASSERT(IsCanvasGradient(), "Wrong type!");
1049
0
    return mValue.mCanvasGradient.Value();
1050
0
  }
1051
1052
  OwningNonNull<mozilla::dom::CanvasPattern>&
1053
  RawSetAsCanvasPattern();
1054
1055
  OwningNonNull<mozilla::dom::CanvasPattern>&
1056
  SetAsCanvasPattern();
1057
1058
  bool
1059
  TrySetToCanvasPattern(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);
1060
1061
  inline bool
1062
  IsCanvasPattern() const
1063
0
  {
1064
0
    return mType == eCanvasPattern;
1065
0
  }
1066
1067
  inline OwningNonNull<mozilla::dom::CanvasPattern>&
1068
  GetAsCanvasPattern()
1069
0
  {
1070
0
    MOZ_ASSERT(IsCanvasPattern(), "Wrong type!");
1071
0
    return mValue.mCanvasPattern.Value();
1072
0
  }
1073
1074
  inline OwningNonNull<mozilla::dom::CanvasPattern> const &
1075
  GetAsCanvasPattern() const
1076
0
  {
1077
0
    MOZ_ASSERT(IsCanvasPattern(), "Wrong type!");
1078
0
    return mValue.mCanvasPattern.Value();
1079
0
  }
1080
1081
  void
1082
  Uninit();
1083
1084
  bool
1085
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;
1086
1087
  void
1088
  TraceUnion(JSTracer* trc);
1089
1090
  OwningStringOrCanvasGradientOrCanvasPattern&
1091
  operator=(const OwningStringOrCanvasGradientOrCanvasPattern& aOther);
1092
1093
private:
1094
  void
1095
  DestroyString();
1096
1097
  void
1098
  DestroyCanvasGradient();
1099
1100
  void
1101
  DestroyCanvasPattern();
1102
};
1103
1104
1105
namespace CanvasGradient_Binding {
1106
1107
  typedef mozilla::dom::CanvasGradient NativeType;
1108
1109
  const JSClass*
1110
  GetJSClass();
1111
1112
  bool
1113
  Wrap(JSContext* aCx, mozilla::dom::CanvasGradient* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
1114
1115
  template <class T>
1116
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
1117
0
  {
1118
0
    JS::Rooted<JSObject*> reflector(aCx);
1119
0
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
1120
0
  }
1121
1122
  // We declare this as an array so that retrieving a pointer to this
1123
  // binding's property hooks only requires compile/link-time resolvable
1124
  // address arithmetic.  Declaring it as a pointer instead would require
1125
  // doing a run-time load to fetch a pointer to this binding's property
1126
  // hooks.  And then structures which embedded a pointer to this structure
1127
  // would require a run-time load for proper initialization, which would
1128
  // then induce static constructors.  Lots of static constructors.
1129
  extern const NativePropertyHooks sNativePropertyHooks[];
1130
1131
  void
1132
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);
1133
1134
  inline JS::Handle<JSObject*> GetProtoObjectHandle(JSContext* aCx)
1135
0
  {
1136
0
    /* Get the interface prototype object for this class.  This will create the
1137
0
       object as needed. */
1138
0
    return GetPerInterfaceObjectHandle(aCx, prototypes::id::CanvasGradient,
1139
0
                                       &CreateInterfaceObjects,
1140
0
                                       /* aDefineOnGlobal = */ true);
1141
0
1142
0
  }
1143
1144
  inline JS::Handle<JSObject*> GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true)
1145
0
  {
1146
0
    /* Get the interface object for this class.  This will create the object as
1147
0
       needed. */
1148
0
1149
0
    return GetPerInterfaceObjectHandle(aCx, constructors::id::CanvasGradient,
1150
0
                                       &CreateInterfaceObjects,
1151
0
                                       aDefineOnGlobal);
1152
0
  }
1153
1154
  JSObject*
1155
  GetConstructorObject(JSContext* aCx);
1156
1157
} // namespace CanvasGradient_Binding
1158
1159
1160
1161
namespace CanvasPattern_Binding {
1162
1163
  typedef mozilla::dom::CanvasPattern NativeType;
1164
1165
  const JSClass*
1166
  GetJSClass();
1167
1168
  bool
1169
  Wrap(JSContext* aCx, mozilla::dom::CanvasPattern* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
1170
1171
  template <class T>
1172
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
1173
0
  {
1174
0
    JS::Rooted<JSObject*> reflector(aCx);
1175
0
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
1176
0
  }
1177
1178
  // We declare this as an array so that retrieving a pointer to this
1179
  // binding's property hooks only requires compile/link-time resolvable
1180
  // address arithmetic.  Declaring it as a pointer instead would require
1181
  // doing a run-time load to fetch a pointer to this binding's property
1182
  // hooks.  And then structures which embedded a pointer to this structure
1183
  // would require a run-time load for proper initialization, which would
1184
  // then induce static constructors.  Lots of static constructors.
1185
  extern const NativePropertyHooks sNativePropertyHooks[];
1186
1187
  void
1188
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);
1189
1190
  inline JS::Handle<JSObject*> GetProtoObjectHandle(JSContext* aCx)
1191
0
  {
1192
0
    /* Get the interface prototype object for this class.  This will create the
1193
0
       object as needed. */
1194
0
    return GetPerInterfaceObjectHandle(aCx, prototypes::id::CanvasPattern,
1195
0
                                       &CreateInterfaceObjects,
1196
0
                                       /* aDefineOnGlobal = */ true);
1197
0
1198
0
  }
1199
1200
  inline JS::Handle<JSObject*> GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true)
1201
0
  {
1202
0
    /* Get the interface object for this class.  This will create the object as
1203
0
       needed. */
1204
0
1205
0
    return GetPerInterfaceObjectHandle(aCx, constructors::id::CanvasPattern,
1206
0
                                       &CreateInterfaceObjects,
1207
0
                                       aDefineOnGlobal);
1208
0
  }
1209
1210
  JSObject*
1211
  GetConstructorObject(JSContext* aCx);
1212
1213
} // namespace CanvasPattern_Binding
1214
1215
1216
1217
namespace CanvasRenderingContext2D_Binding {
1218
1219
  typedef mozilla::dom::CanvasRenderingContext2D NativeType;
1220
1221
  static const uint32_t DRAWWINDOW_DRAW_CARET = 1;
1222
  static const uint32_t DRAWWINDOW_DO_NOT_FLUSH = 2;
1223
  static const uint32_t DRAWWINDOW_DRAW_VIEW = 4;
1224
  static const uint32_t DRAWWINDOW_USE_WIDGET_LAYERS = 8;
1225
  static const uint32_t DRAWWINDOW_ASYNC_DECODE_IMAGES = 16;
1226
  const JSClass*
1227
  GetJSClass();
1228
1229
  bool
1230
  Wrap(JSContext* aCx, mozilla::dom::CanvasRenderingContext2D* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
1231
1232
  template <class T>
1233
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
1234
0
  {
1235
0
    JS::Rooted<JSObject*> reflector(aCx);
1236
0
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
1237
0
  }
1238
1239
  // We declare this as an array so that retrieving a pointer to this
1240
  // binding's property hooks only requires compile/link-time resolvable
1241
  // address arithmetic.  Declaring it as a pointer instead would require
1242
  // doing a run-time load to fetch a pointer to this binding's property
1243
  // hooks.  And then structures which embedded a pointer to this structure
1244
  // would require a run-time load for proper initialization, which would
1245
  // then induce static constructors.  Lots of static constructors.
1246
  extern const NativePropertyHooks sNativePropertyHooks[];
1247
1248
  void
1249
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);
1250
1251
  inline JS::Handle<JSObject*> GetProtoObjectHandle(JSContext* aCx)
1252
0
  {
1253
0
    /* Get the interface prototype object for this class.  This will create the
1254
0
       object as needed. */
1255
0
    return GetPerInterfaceObjectHandle(aCx, prototypes::id::CanvasRenderingContext2D,
1256
0
                                       &CreateInterfaceObjects,
1257
0
                                       /* aDefineOnGlobal = */ true);
1258
0
1259
0
  }
1260
1261
  inline JS::Handle<JSObject*> GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true)
1262
0
  {
1263
0
    /* Get the interface object for this class.  This will create the object as
1264
0
       needed. */
1265
0
1266
0
    return GetPerInterfaceObjectHandle(aCx, constructors::id::CanvasRenderingContext2D,
1267
0
                                       &CreateInterfaceObjects,
1268
0
                                       aDefineOnGlobal);
1269
0
  }
1270
1271
  JSObject*
1272
  GetConstructorObject(JSContext* aCx);
1273
1274
} // namespace CanvasRenderingContext2D_Binding
1275
1276
1277
1278
namespace Path2D_Binding {
1279
1280
  typedef mozilla::dom::CanvasPath NativeType;
1281
1282
  bool
1283
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);
1284
1285
  const JSClass*
1286
  GetJSClass();
1287
1288
  bool
1289
  Wrap(JSContext* aCx, mozilla::dom::CanvasPath* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
1290
1291
  template <class T>
1292
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
1293
0
  {
1294
0
    JS::Rooted<JSObject*> reflector(aCx);
1295
0
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
1296
0
  }
1297
1298
  // We declare this as an array so that retrieving a pointer to this
1299
  // binding's property hooks only requires compile/link-time resolvable
1300
  // address arithmetic.  Declaring it as a pointer instead would require
1301
  // doing a run-time load to fetch a pointer to this binding's property
1302
  // hooks.  And then structures which embedded a pointer to this structure
1303
  // would require a run-time load for proper initialization, which would
1304
  // then induce static constructors.  Lots of static constructors.
1305
  extern const NativePropertyHooks sNativePropertyHooks[];
1306
1307
  void
1308
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);
1309
1310
  inline JS::Handle<JSObject*> GetProtoObjectHandle(JSContext* aCx)
1311
0
  {
1312
0
    /* Get the interface prototype object for this class.  This will create the
1313
0
       object as needed. */
1314
0
    return GetPerInterfaceObjectHandle(aCx, prototypes::id::Path2D,
1315
0
                                       &CreateInterfaceObjects,
1316
0
                                       /* aDefineOnGlobal = */ true);
1317
0
1318
0
  }
1319
1320
  inline JS::Handle<JSObject*> GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true)
1321
0
  {
1322
0
    /* Get the interface object for this class.  This will create the object as
1323
0
       needed. */
1324
0
1325
0
    return GetPerInterfaceObjectHandle(aCx, constructors::id::Path2D,
1326
0
                                       &CreateInterfaceObjects,
1327
0
                                       aDefineOnGlobal);
1328
0
  }
1329
1330
  JSObject*
1331
  GetConstructorObject(JSContext* aCx);
1332
1333
} // namespace Path2D_Binding
1334
1335
1336
1337
namespace TextMetrics_Binding {
1338
1339
  typedef mozilla::dom::TextMetrics NativeType;
1340
1341
  const JSClass*
1342
  GetJSClass();
1343
1344
  bool
1345
  Wrap(JSContext* aCx, mozilla::dom::TextMetrics* aObject, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
1346
1347
  // We declare this as an array so that retrieving a pointer to this
1348
  // binding's property hooks only requires compile/link-time resolvable
1349
  // address arithmetic.  Declaring it as a pointer instead would require
1350
  // doing a run-time load to fetch a pointer to this binding's property
1351
  // hooks.  And then structures which embedded a pointer to this structure
1352
  // would require a run-time load for proper initialization, which would
1353
  // then induce static constructors.  Lots of static constructors.
1354
  extern const NativePropertyHooks sNativePropertyHooks[];
1355
1356
  void
1357
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);
1358
1359
  inline JS::Handle<JSObject*> GetProtoObjectHandle(JSContext* aCx)
1360
0
  {
1361
0
    /* Get the interface prototype object for this class.  This will create the
1362
0
       object as needed. */
1363
0
    return GetPerInterfaceObjectHandle(aCx, prototypes::id::TextMetrics,
1364
0
                                       &CreateInterfaceObjects,
1365
0
                                       /* aDefineOnGlobal = */ true);
1366
0
1367
0
  }
1368
1369
  inline JS::Handle<JSObject*> GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true)
1370
0
  {
1371
0
    /* Get the interface object for this class.  This will create the object as
1372
0
       needed. */
1373
0
1374
0
    return GetPerInterfaceObjectHandle(aCx, constructors::id::TextMetrics,
1375
0
                                       &CreateInterfaceObjects,
1376
0
                                       aDefineOnGlobal);
1377
0
  }
1378
1379
  JSObject*
1380
  GetConstructorObject(JSContext* aCx);
1381
1382
} // namespace TextMetrics_Binding
1383
1384
1385
1386
} // namespace dom
1387
} // namespace mozilla
1388
1389
#endif // mozilla_dom_CanvasRenderingContext2DBinding_h