1/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2/* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4 * You can obtain one at http://mozilla.org/MPL/2.0/.
5 */
6
7typedef TestJSImplInterface AnotherNameForTestJSImplInterface;
8typedef TestJSImplInterface YetAnotherNameForTestJSImplInterface;
9typedef TestJSImplInterface? NullableTestJSImplInterface;
10
11callback MyTestCallback = void();
12
13enum MyTestEnum {
14  "a",
15  "b"
16};
17
18[Exposed=Window, JSImplementation="@mozilla.org/test-js-impl-interface;1"]
19interface TestJSImplInterface {
20  // We don't support multiple constructors (bug 869268) or named constructors
21  // for JS-implemented WebIDL.
22  [Throws]
23  constructor(DOMString str, unsigned long num, boolean? boolArg,
24              TestInterface? iface, long arg1,
25              DictForConstructor dict, any any1,
26              object obj1,
27              object? obj2, sequence<Dict> seq, optional any any2,
28              optional object obj3,
29              optional object? obj4,
30              Uint8Array typedArr,
31              ArrayBuffer arrayBuf);
32
33  // Integer types
34  // XXXbz add tests for throwing versions of all the integer stuff
35  readonly attribute byte readonlyByte;
36  attribute byte writableByte;
37  void passByte(byte arg);
38  byte receiveByte();
39  void passOptionalByte(optional byte arg);
40  void passOptionalByteBeforeRequired(optional byte arg1, byte arg2);
41  void passOptionalByteWithDefault(optional byte arg = 0);
42  void passOptionalByteWithDefaultBeforeRequired(optional byte arg1 = 0, byte arg2);
43  void passNullableByte(byte? arg);
44  void passOptionalNullableByte(optional byte? arg);
45  void passVariadicByte(byte... arg);
46  // [Cached] is not supported in JS-implemented WebIDL.
47  //[Cached, Pure]
48  //readonly attribute byte cachedByte;
49  //[Cached, Constant]
50  //readonly attribute byte cachedConstantByte;
51  //[Cached, Pure]
52  //attribute byte cachedWritableByte;
53  [Affects=Nothing]
54  attribute byte sideEffectFreeByte;
55  [Affects=Nothing, DependsOn=DOMState]
56  attribute byte domDependentByte;
57  [Affects=Nothing, DependsOn=Nothing]
58  readonly attribute byte constantByte;
59  [DependsOn=DeviceState, Affects=Nothing]
60  readonly attribute byte deviceStateDependentByte;
61  [Affects=Nothing]
62  byte returnByteSideEffectFree();
63  [Affects=Nothing, DependsOn=DOMState]
64  byte returnDOMDependentByte();
65  [Affects=Nothing, DependsOn=Nothing]
66  byte returnConstantByte();
67  [DependsOn=DeviceState, Affects=Nothing]
68  byte returnDeviceStateDependentByte();
69
70  readonly attribute short readonlyShort;
71  attribute short writableShort;
72  void passShort(short arg);
73  short receiveShort();
74  void passOptionalShort(optional short arg);
75  void passOptionalShortWithDefault(optional short arg = 5);
76
77  readonly attribute long readonlyLong;
78  attribute long writableLong;
79  void passLong(long arg);
80  long receiveLong();
81  void passOptionalLong(optional long arg);
82  void passOptionalLongWithDefault(optional long arg = 7);
83
84  readonly attribute long long readonlyLongLong;
85  attribute long long writableLongLong;
86  void passLongLong(long long arg);
87  long long receiveLongLong();
88  void passOptionalLongLong(optional long long arg);
89  void passOptionalLongLongWithDefault(optional long long arg = -12);
90
91  readonly attribute octet readonlyOctet;
92  attribute octet writableOctet;
93  void passOctet(octet arg);
94  octet receiveOctet();
95  void passOptionalOctet(optional octet arg);
96  void passOptionalOctetWithDefault(optional octet arg = 19);
97
98  readonly attribute unsigned short readonlyUnsignedShort;
99  attribute unsigned short writableUnsignedShort;
100  void passUnsignedShort(unsigned short arg);
101  unsigned short receiveUnsignedShort();
102  void passOptionalUnsignedShort(optional unsigned short arg);
103  void passOptionalUnsignedShortWithDefault(optional unsigned short arg = 2);
104
105  readonly attribute unsigned long readonlyUnsignedLong;
106  attribute unsigned long writableUnsignedLong;
107  void passUnsignedLong(unsigned long arg);
108  unsigned long receiveUnsignedLong();
109  void passOptionalUnsignedLong(optional unsigned long arg);
110  void passOptionalUnsignedLongWithDefault(optional unsigned long arg = 6);
111
112  readonly attribute unsigned long long readonlyUnsignedLongLong;
113  attribute unsigned long long  writableUnsignedLongLong;
114  void passUnsignedLongLong(unsigned long long arg);
115  unsigned long long receiveUnsignedLongLong();
116  void passOptionalUnsignedLongLong(optional unsigned long long arg);
117  void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
118
119  attribute float writableFloat;
120  attribute unrestricted float writableUnrestrictedFloat;
121  attribute float? writableNullableFloat;
122  attribute unrestricted float? writableNullableUnrestrictedFloat;
123  attribute double writableDouble;
124  attribute unrestricted double writableUnrestrictedDouble;
125  attribute double? writableNullableDouble;
126  attribute unrestricted double? writableNullableUnrestrictedDouble;
127  void passFloat(float arg1, unrestricted float arg2,
128                 float? arg3, unrestricted float? arg4,
129                 double arg5, unrestricted double arg6,
130                 double? arg7, unrestricted double? arg8,
131                 sequence<float> arg9, sequence<unrestricted float> arg10,
132                 sequence<float?> arg11, sequence<unrestricted float?> arg12,
133                 sequence<double> arg13, sequence<unrestricted double> arg14,
134                 sequence<double?> arg15, sequence<unrestricted double?> arg16);
135  [LenientFloat]
136  void passLenientFloat(float arg1, unrestricted float arg2,
137                        float? arg3, unrestricted float? arg4,
138                        double arg5, unrestricted double arg6,
139                        double? arg7, unrestricted double? arg8,
140                        sequence<float> arg9,
141                        sequence<unrestricted float> arg10,
142                        sequence<float?> arg11,
143                        sequence<unrestricted float?> arg12,
144                        sequence<double> arg13,
145                        sequence<unrestricted double> arg14,
146                        sequence<double?> arg15,
147                        sequence<unrestricted double?> arg16);
148  [LenientFloat]
149  attribute float lenientFloatAttr;
150  [LenientFloat]
151  attribute double lenientDoubleAttr;
152
153  // Castable interface types
154  // XXXbz add tests for throwing versions of all the castable interface stuff
155  TestJSImplInterface receiveSelf();
156  TestJSImplInterface? receiveNullableSelf();
157
158  TestJSImplInterface receiveWeakSelf();
159  TestJSImplInterface? receiveWeakNullableSelf();
160
161  // A version to test for casting to TestJSImplInterface&
162  void passSelf(TestJSImplInterface arg);
163  void passNullableSelf(TestJSImplInterface? arg);
164  attribute TestJSImplInterface nonNullSelf;
165  attribute TestJSImplInterface? nullableSelf;
166  // [Cached] is not supported in JS-implemented WebIDL.
167  //[Cached, Pure]
168  //readonly attribute TestJSImplInterface cachedSelf;
169  // Optional arguments
170  void passOptionalSelf(optional TestJSImplInterface? arg);
171  void passOptionalNonNullSelf(optional TestJSImplInterface arg);
172  void passOptionalSelfWithDefault(optional TestJSImplInterface? arg = null);
173
174  // Non-wrapper-cache interface types
175  [NewObject]
176  TestNonWrapperCacheInterface receiveNonWrapperCacheInterface();
177  [NewObject]
178  TestNonWrapperCacheInterface? receiveNullableNonWrapperCacheInterface();
179
180  [NewObject]
181  sequence<TestNonWrapperCacheInterface> receiveNonWrapperCacheInterfaceSequence();
182  [NewObject]
183  sequence<TestNonWrapperCacheInterface?> receiveNullableNonWrapperCacheInterfaceSequence();
184  [NewObject]
185  sequence<TestNonWrapperCacheInterface>? receiveNonWrapperCacheInterfaceNullableSequence();
186  [NewObject]
187  sequence<TestNonWrapperCacheInterface?>? receiveNullableNonWrapperCacheInterfaceNullableSequence();
188
189  // External interface types
190  TestExternalInterface receiveExternal();
191  TestExternalInterface? receiveNullableExternal();
192  TestExternalInterface receiveWeakExternal();
193  TestExternalInterface? receiveWeakNullableExternal();
194  void passExternal(TestExternalInterface arg);
195  void passNullableExternal(TestExternalInterface? arg);
196  attribute TestExternalInterface nonNullExternal;
197  attribute TestExternalInterface? nullableExternal;
198  // Optional arguments
199  void passOptionalExternal(optional TestExternalInterface? arg);
200  void passOptionalNonNullExternal(optional TestExternalInterface arg);
201  void passOptionalExternalWithDefault(optional TestExternalInterface? arg = null);
202
203  // Callback interface types
204  TestCallbackInterface receiveCallbackInterface();
205  TestCallbackInterface? receiveNullableCallbackInterface();
206  TestCallbackInterface receiveWeakCallbackInterface();
207  TestCallbackInterface? receiveWeakNullableCallbackInterface();
208  void passCallbackInterface(TestCallbackInterface arg);
209  void passNullableCallbackInterface(TestCallbackInterface? arg);
210  attribute TestCallbackInterface nonNullCallbackInterface;
211  attribute TestCallbackInterface? nullableCallbackInterface;
212  // Optional arguments
213  void passOptionalCallbackInterface(optional TestCallbackInterface? arg);
214  void passOptionalNonNullCallbackInterface(optional TestCallbackInterface arg);
215  void passOptionalCallbackInterfaceWithDefault(optional TestCallbackInterface? arg = null);
216
217  // Sequence types
218  // [Cached] is not supported in JS-implemented WebIDL.
219  //[Cached, Pure]
220  //readonly attribute sequence<long> readonlySequence;
221  //[Cached, Pure]
222  //readonly attribute sequence<Dict> readonlySequenceOfDictionaries;
223  //[Cached, Pure]
224  //readonly attribute sequence<Dict>? readonlyNullableSequenceOfDictionaries;
225  //[Cached, Pure, Frozen]
226  //readonly attribute sequence<long> readonlyFrozenSequence;
227  //[Cached, Pure, Frozen]
228  //readonly attribute sequence<long>? readonlyFrozenNullableSequence;
229  sequence<long> receiveSequence();
230  sequence<long>? receiveNullableSequence();
231  sequence<long?> receiveSequenceOfNullableInts();
232  sequence<long?>? receiveNullableSequenceOfNullableInts();
233  void passSequence(sequence<long> arg);
234  void passNullableSequence(sequence<long>? arg);
235  void passSequenceOfNullableInts(sequence<long?> arg);
236  void passOptionalSequenceOfNullableInts(optional sequence<long?> arg);
237  void passOptionalNullableSequenceOfNullableInts(optional sequence<long?>? arg);
238  sequence<TestJSImplInterface> receiveCastableObjectSequence();
239  sequence<TestCallbackInterface> receiveCallbackObjectSequence();
240  sequence<TestJSImplInterface?> receiveNullableCastableObjectSequence();
241  sequence<TestCallbackInterface?> receiveNullableCallbackObjectSequence();
242  sequence<TestJSImplInterface>? receiveCastableObjectNullableSequence();
243  sequence<TestJSImplInterface?>? receiveNullableCastableObjectNullableSequence();
244  sequence<TestJSImplInterface> receiveWeakCastableObjectSequence();
245  sequence<TestJSImplInterface?> receiveWeakNullableCastableObjectSequence();
246  sequence<TestJSImplInterface>? receiveWeakCastableObjectNullableSequence();
247  sequence<TestJSImplInterface?>? receiveWeakNullableCastableObjectNullableSequence();
248  void passCastableObjectSequence(sequence<TestJSImplInterface> arg);
249  void passNullableCastableObjectSequence(sequence<TestJSImplInterface?> arg);
250  void passCastableObjectNullableSequence(sequence<TestJSImplInterface>? arg);
251  void passNullableCastableObjectNullableSequence(sequence<TestJSImplInterface?>? arg);
252  void passOptionalSequence(optional sequence<long> arg);
253  void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
254  void passOptionalNullableSequence(optional sequence<long>? arg);
255  void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
256  void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
257  void passOptionalObjectSequence(optional sequence<TestJSImplInterface> arg);
258  void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
259  void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);
260
261  sequence<DOMString> receiveStringSequence();
262  sequence<ByteString> receiveByteStringSequence();
263  sequence<UTF8String> receiveUTF8StringSequence();
264  // Callback interface problem.  See bug 843261.
265  //void passStringSequence(sequence<DOMString> arg);
266  sequence<any> receiveAnySequence();
267  sequence<any>? receiveNullableAnySequence();
268  //XXXbz No support for sequence of sequence return values yet.
269  //sequence<sequence<any>> receiveAnySequenceSequence();
270
271  sequence<object> receiveObjectSequence();
272  sequence<object?> receiveNullableObjectSequence();
273
274  void passSequenceOfSequences(sequence<sequence<long>> arg);
275  void passSequenceOfSequencesOfSequences(sequence<sequence<sequence<long>>> arg);
276  //XXXbz No support for sequence of sequence return values yet.
277  //sequence<sequence<long>> receiveSequenceOfSequences();
278
279  // record types
280  void passRecord(record<DOMString, long> arg);
281  void passNullableRecord(record<DOMString, long>? arg);
282  void passRecordOfNullableInts(record<DOMString, long?> arg);
283  void passOptionalRecordOfNullableInts(optional record<DOMString, long?> arg);
284  void passOptionalNullableRecordOfNullableInts(optional record<DOMString, long?>? arg);
285  void passCastableObjectRecord(record<DOMString, TestInterface> arg);
286  void passNullableCastableObjectRecord(record<DOMString, TestInterface?> arg);
287  void passCastableObjectNullableRecord(record<DOMString, TestInterface>? arg);
288  void passNullableCastableObjectNullableRecord(record<DOMString, TestInterface?>? arg);
289  void passOptionalRecord(optional record<DOMString, long> arg);
290  void passOptionalNullableRecord(optional record<DOMString, long>? arg);
291  void passOptionalNullableRecordWithDefaultValue(optional record<DOMString, long>? arg = null);
292  void passOptionalObjectRecord(optional record<DOMString, TestInterface> arg);
293  void passExternalInterfaceRecord(record<DOMString, TestExternalInterface> arg);
294  void passNullableExternalInterfaceRecord(record<DOMString, TestExternalInterface?> arg);
295  void passStringRecord(record<DOMString, DOMString> arg);
296  void passByteStringRecord(record<DOMString, ByteString> arg);
297  void passUTF8StringRecord(record<DOMString, UTF8String> arg);
298  void passRecordOfRecords(record<DOMString, record<DOMString, long>> arg);
299  record<DOMString, long> receiveRecord();
300  record<DOMString, long>? receiveNullableRecord();
301  record<DOMString, long?> receiveRecordOfNullableInts();
302  record<DOMString, long?>? receiveNullableRecordOfNullableInts();
303  //XXXbz No support for record of records return values yet.
304  //record<DOMString, record<DOMString, long>> receiveRecordOfRecords();
305  record<DOMString, any> receiveAnyRecord();
306
307  // Typed array types
308  void passArrayBuffer(ArrayBuffer arg);
309  void passNullableArrayBuffer(ArrayBuffer? arg);
310  void passOptionalArrayBuffer(optional ArrayBuffer arg);
311  void passOptionalNullableArrayBuffer(optional ArrayBuffer? arg);
312  void passOptionalNullableArrayBufferWithDefaultValue(optional ArrayBuffer? arg= null);
313  void passArrayBufferView(ArrayBufferView arg);
314  void passInt8Array(Int8Array arg);
315  void passInt16Array(Int16Array arg);
316  void passInt32Array(Int32Array arg);
317  void passUint8Array(Uint8Array arg);
318  void passUint16Array(Uint16Array arg);
319  void passUint32Array(Uint32Array arg);
320  void passUint8ClampedArray(Uint8ClampedArray arg);
321  void passFloat32Array(Float32Array arg);
322  void passFloat64Array(Float64Array arg);
323  void passSequenceOfArrayBuffers(sequence<ArrayBuffer> arg);
324  void passSequenceOfNullableArrayBuffers(sequence<ArrayBuffer?> arg);
325  void passRecordOfArrayBuffers(record<DOMString, ArrayBuffer> arg);
326  void passRecordOfNullableArrayBuffers(record<DOMString, ArrayBuffer?> arg);
327  void passVariadicTypedArray(Float32Array... arg);
328  void passVariadicNullableTypedArray(Float32Array?... arg);
329  Uint8Array receiveUint8Array();
330  attribute Uint8Array uint8ArrayAttr;
331
332  // DOMString types
333  void passString(DOMString arg);
334  void passNullableString(DOMString? arg);
335  void passOptionalString(optional DOMString arg);
336  void passOptionalStringWithDefaultValue(optional DOMString arg = "abc");
337  void passOptionalNullableString(optional DOMString? arg);
338  void passOptionalNullableStringWithDefaultValue(optional DOMString? arg = null);
339  void passVariadicString(DOMString... arg);
340
341  // ByteString types
342  void passByteString(ByteString arg);
343  void passNullableByteString(ByteString? arg);
344  void passOptionalByteString(optional ByteString arg);
345  void passOptionalByteStringWithDefaultValue(optional ByteString arg = "abc");
346  void passOptionalNullableByteString(optional ByteString? arg);
347  void passOptionalNullableByteStringWithDefaultValue(optional ByteString? arg = null);
348  void passVariadicByteString(ByteString... arg);
349  void passUnionByteString((ByteString or long) arg);
350  void passOptionalUnionByteString(optional (ByteString or long) arg);
351  void passOptionalUnionByteStringWithDefaultValue(optional (ByteString or long) arg = "abc");
352
353  // UTF8String types
354  void passUTF8String(UTF8String arg);
355  void passNullableUTF8String(UTF8String? arg);
356  void passOptionalUTF8String(optional UTF8String arg);
357  void passOptionalUTF8StringWithDefaultValue(optional UTF8String arg = "abc");
358  void passOptionalNullableUTF8String(optional UTF8String? arg);
359  void passOptionalNullableUTF8StringWithDefaultValue(optional UTF8String? arg = null);
360  void passVariadicUTF8String(UTF8String... arg);
361  void passUnionUTF8String((UTF8String or long) arg);
362  void passOptionalUnionUTF8String(optional (UTF8String or long) arg);
363  void passOptionalUnionUTF8StringWithDefaultValue(optional (UTF8String or long) arg = "abc");
364
365  // USVString types
366  void passSVS(USVString arg);
367  void passNullableSVS(USVString? arg);
368  void passOptionalSVS(optional USVString arg);
369  void passOptionalSVSWithDefaultValue(optional USVString arg = "abc");
370  void passOptionalNullableSVS(optional USVString? arg);
371  void passOptionalNullableSVSWithDefaultValue(optional USVString? arg = null);
372  void passVariadicSVS(USVString... arg);
373  USVString receiveSVS();
374
375  // JSString types
376  void passJSString(JSString arg);
377  // void passNullableJSString(JSString? arg); // NOT SUPPORTED YET
378  // void passOptionalJSString(optional JSString arg); // NOT SUPPORTED YET
379  void passOptionalJSStringWithDefaultValue(optional JSString arg = "abc");
380  // void passOptionalNullableJSString(optional JSString? arg); // NOT SUPPORTED YET
381  // void passOptionalNullableJSStringWithDefaultValue(optional JSString? arg = null); // NOT SUPPORTED YET
382  // void passVariadicJSString(JSString... arg); // NOT SUPPORTED YET
383  // void passRecordOfJSString(record<DOMString, JSString> arg); // NOT SUPPORTED YET
384  // void passSequenceOfJSString(sequence<JSString> arg); // NOT SUPPORTED YET
385  // void passUnionJSString((JSString or long) arg); // NOT SUPPORTED YET
386  JSString receiveJSString();
387  // sequence<JSString> receiveJSStringSequence(); // NOT SUPPORTED YET
388  // (JSString or long) receiveJSStringUnion(); // NOT SUPPORTED YET
389  // record<DOMString, JSString> receiveJSStringRecord(); // NOT SUPPORTED YET
390  readonly attribute JSString readonlyJSStringAttr;
391  attribute JSString jsStringAttr;
392
393  // Enumerated types
394  void passEnum(MyTestEnum arg);
395  void passNullableEnum(MyTestEnum? arg);
396  void passOptionalEnum(optional MyTestEnum arg);
397  void passEnumWithDefault(optional MyTestEnum arg = "a");
398  void passOptionalNullableEnum(optional MyTestEnum? arg);
399  void passOptionalNullableEnumWithDefaultValue(optional MyTestEnum? arg = null);
400  void passOptionalNullableEnumWithDefaultValue2(optional MyTestEnum? arg = "a");
401  MyTestEnum receiveEnum();
402  MyTestEnum? receiveNullableEnum();
403  attribute MyTestEnum enumAttribute;
404  readonly attribute MyTestEnum readonlyEnumAttribute;
405
406  // Callback types
407  void passCallback(MyTestCallback arg);
408  void passNullableCallback(MyTestCallback? arg);
409  void passOptionalCallback(optional MyTestCallback arg);
410  void passOptionalNullableCallback(optional MyTestCallback? arg);
411  void passOptionalNullableCallbackWithDefaultValue(optional MyTestCallback? arg = null);
412  MyTestCallback receiveCallback();
413  MyTestCallback? receiveNullableCallback();
414  // Hmm. These two don't work, I think because I need a locally modified version of TestTreatAsNullCallback.
415  //void passNullableTreatAsNullCallback(TestTreatAsNullCallback? arg);
416  //void passOptionalNullableTreatAsNullCallback(optional TestTreatAsNullCallback? arg);
417  void passOptionalNullableTreatAsNullCallbackWithDefaultValue(optional TestTreatAsNullCallback? arg = null);
418
419  // Any types
420  void passAny(any arg);
421  void passVariadicAny(any... arg);
422  void passOptionalAny(optional any arg);
423  void passAnyDefaultNull(optional any arg = null);
424  void passSequenceOfAny(sequence<any> arg);
425  void passNullableSequenceOfAny(sequence<any>? arg);
426  void passOptionalSequenceOfAny(optional sequence<any> arg);
427  void passOptionalNullableSequenceOfAny(optional sequence<any>? arg);
428  void passOptionalSequenceOfAnyWithDefaultValue(optional sequence<any>? arg = null);
429  void passSequenceOfSequenceOfAny(sequence<sequence<any>> arg);
430  void passSequenceOfNullableSequenceOfAny(sequence<sequence<any>?> arg);
431  void passNullableSequenceOfNullableSequenceOfAny(sequence<sequence<any>?>? arg);
432  void passOptionalNullableSequenceOfNullableSequenceOfAny(optional sequence<sequence<any>?>? arg);
433  void passRecordOfAny(record<DOMString, any> arg);
434  void passNullableRecordOfAny(record<DOMString, any>? arg);
435  void passOptionalRecordOfAny(optional record<DOMString, any> arg);
436  void passOptionalNullableRecordOfAny(optional record<DOMString, any>? arg);
437  void passOptionalRecordOfAnyWithDefaultValue(optional record<DOMString, any>? arg = null);
438  void passRecordOfRecordOfAny(record<DOMString, record<DOMString, any>> arg);
439  void passRecordOfNullableRecordOfAny(record<DOMString, record<DOMString, any>?> arg);
440  void passNullableRecordOfNullableRecordOfAny(record<DOMString, record<DOMString, any>?>? arg);
441  void passOptionalNullableRecordOfNullableRecordOfAny(optional record<DOMString, record<DOMString, any>?>? arg);
442  void passOptionalNullableRecordOfNullableSequenceOfAny(optional record<DOMString, sequence<any>?>? arg);
443  void passOptionalNullableSequenceOfNullableRecordOfAny(optional sequence<record<DOMString, any>?>? arg);
444  any receiveAny();
445
446  // object types
447  void passObject(object arg);
448  void passVariadicObject(object... arg);
449  void passNullableObject(object? arg);
450  void passVariadicNullableObject(object... arg);
451  void passOptionalObject(optional object arg);
452  void passOptionalNullableObject(optional object? arg);
453  void passOptionalNullableObjectWithDefaultValue(optional object? arg = null);
454  void passSequenceOfObject(sequence<object> arg);
455  void passSequenceOfNullableObject(sequence<object?> arg);
456  void passNullableSequenceOfObject(sequence<object>? arg);
457  void passOptionalNullableSequenceOfNullableSequenceOfObject(optional sequence<sequence<object>?>? arg);
458  void passOptionalNullableSequenceOfNullableSequenceOfNullableObject(optional sequence<sequence<object?>?>? arg);
459  void passRecordOfObject(record<DOMString, object> arg);
460  object receiveObject();
461  object? receiveNullableObject();
462
463  // Union types
464  void passUnion((object or long) arg);
465  // Some union tests are debug-only to avoid creating all those
466  // unused union types in opt builds.
467#ifdef DEBUG
468  void passUnion2((long or boolean) arg);
469  void passUnion3((object or long or boolean) arg);
470  void passUnion4((Node or long or boolean) arg);
471  void passUnion5((object or boolean) arg);
472  void passUnion6((object or DOMString) arg);
473  void passUnion7((object or DOMString or long) arg);
474  void passUnion8((object or DOMString or boolean) arg);
475  void passUnion9((object or DOMString or long or boolean) arg);
476  void passUnion10(optional (EventInit or long) arg = {});
477  void passUnion11(optional (CustomEventInit or long) arg = {});
478  void passUnion12(optional (EventInit or long) arg = 5);
479  void passUnion13(optional (object or long?) arg = null);
480  void passUnion14(optional (object or long?) arg = 5);
481  void passUnion15((sequence<long> or long) arg);
482  void passUnion16(optional (sequence<long> or long) arg);
483  void passUnion17(optional (sequence<long>? or long) arg = 5);
484  void passUnion18((sequence<object> or long) arg);
485  void passUnion19(optional (sequence<object> or long) arg);
486  void passUnion20(optional (sequence<object> or long) arg = []);
487  void passUnion21((record<DOMString, long> or long) arg);
488  void passUnion22((record<DOMString, object> or long) arg);
489  void passUnion23((sequence<ImageData> or long) arg);
490  void passUnion24((sequence<ImageData?> or long) arg);
491  void passUnion25((sequence<sequence<ImageData>> or long) arg);
492  void passUnion26((sequence<sequence<ImageData?>> or long) arg);
493  void passUnion27(optional (sequence<DOMString> or EventInit) arg = {});
494  void passUnion28(optional (EventInit or sequence<DOMString>) arg = {});
495  void passUnionWithCallback((EventHandler or long) arg);
496  void passUnionWithByteString((ByteString or long) arg);
497  void passUnionWithUTF8String((UTF8String or long) arg);
498  void passUnionWithRecord((record<DOMString, DOMString> or DOMString) arg);
499  void passUnionWithRecordAndSequence((record<DOMString, DOMString> or sequence<DOMString>) arg);
500  void passUnionWithSequenceAndRecord((sequence<DOMString> or record<DOMString, DOMString>) arg);
501  void passUnionWithSVS((USVString or long) arg);
502#endif
503  void passUnionWithNullable((object? or long) arg);
504  void passNullableUnion((object or long)? arg);
505  void passOptionalUnion(optional (object or long) arg);
506  void passOptionalNullableUnion(optional (object or long)? arg);
507  void passOptionalNullableUnionWithDefaultValue(optional (object or long)? arg = null);
508  //void passUnionWithInterfaces((TestJSImplInterface or TestExternalInterface) arg);
509  //void passUnionWithInterfacesAndNullable((TestJSImplInterface? or TestExternalInterface) arg);
510  //void passUnionWithSequence((sequence<object> or long) arg);
511  void passUnionWithArrayBuffer((ArrayBuffer or long) arg);
512  void passUnionWithString((DOMString or object) arg);
513  // Using an enum in a union.  Note that we use some enum not declared in our
514  // binding file, because UnionTypes.h will need to include the binding header
515  // for this enum.  Pick an enum from an interface that won't drag in too much
516  // stuff.
517  void passUnionWithEnum((SupportedType or object) arg);
518
519  // Trying to use a callback in a union won't include the test
520  // headers, unfortunately, so won't compile.
521  //  void passUnionWithCallback((MyTestCallback or long) arg);
522  void passUnionWithObject((object or long) arg);
523  //void passUnionWithDict((Dict or long) arg);
524
525  void passUnionWithDefaultValue1(optional (double or DOMString) arg = "");
526  void passUnionWithDefaultValue2(optional (double or DOMString) arg = 1);
527  void passUnionWithDefaultValue3(optional (double or DOMString) arg = 1.5);
528  void passUnionWithDefaultValue4(optional (float or DOMString) arg = "");
529  void passUnionWithDefaultValue5(optional (float or DOMString) arg = 1);
530  void passUnionWithDefaultValue6(optional (float or DOMString) arg = 1.5);
531  void passUnionWithDefaultValue7(optional (unrestricted double or DOMString) arg = "");
532  void passUnionWithDefaultValue8(optional (unrestricted double or DOMString) arg = 1);
533  void passUnionWithDefaultValue9(optional (unrestricted double or DOMString) arg = 1.5);
534  void passUnionWithDefaultValue10(optional (unrestricted double or DOMString) arg = Infinity);
535  void passUnionWithDefaultValue11(optional (unrestricted float or DOMString) arg = "");
536  void passUnionWithDefaultValue12(optional (unrestricted float or DOMString) arg = 1);
537  void passUnionWithDefaultValue13(optional (unrestricted float or DOMString) arg = Infinity);
538  void passUnionWithDefaultValue14(optional (double or ByteString) arg = "");
539  void passUnionWithDefaultValue15(optional (double or ByteString) arg = 1);
540  void passUnionWithDefaultValue16(optional (double or ByteString) arg = 1.5);
541  void passUnionWithDefaultValue17(optional (double or SupportedType) arg = "text/html");
542  void passUnionWithDefaultValue18(optional (double or SupportedType) arg = 1);
543  void passUnionWithDefaultValue19(optional (double or SupportedType) arg = 1.5);
544  void passUnionWithDefaultValue20(optional (double or USVString) arg = "abc");
545  void passUnionWithDefaultValue21(optional (double or USVString) arg = 1);
546  void passUnionWithDefaultValue22(optional (double or USVString) arg = 1.5);
547  void passUnionWithDefaultValue23(optional (double or UTF8String) arg = "");
548  void passUnionWithDefaultValue24(optional (double or UTF8String) arg = 1);
549  void passUnionWithDefaultValue25(optional (double or UTF8String) arg = 1.5);
550
551  void passNullableUnionWithDefaultValue1(optional (double or DOMString)? arg = "");
552  void passNullableUnionWithDefaultValue2(optional (double or DOMString)? arg = 1);
553  void passNullableUnionWithDefaultValue3(optional (double or DOMString)? arg = null);
554  void passNullableUnionWithDefaultValue4(optional (float or DOMString)? arg = "");
555  void passNullableUnionWithDefaultValue5(optional (float or DOMString)? arg = 1);
556  void passNullableUnionWithDefaultValue6(optional (float or DOMString)? arg = null);
557  void passNullableUnionWithDefaultValue7(optional (unrestricted double or DOMString)? arg = "");
558  void passNullableUnionWithDefaultValue8(optional (unrestricted double or DOMString)? arg = 1);
559  void passNullableUnionWithDefaultValue9(optional (unrestricted double or DOMString)? arg = null);
560  void passNullableUnionWithDefaultValue10(optional (unrestricted float or DOMString)? arg = "");
561  void passNullableUnionWithDefaultValue11(optional (unrestricted float or DOMString)? arg = 1);
562  void passNullableUnionWithDefaultValue12(optional (unrestricted float or DOMString)? arg = null);
563  void passNullableUnionWithDefaultValue13(optional (double or ByteString)? arg = "");
564  void passNullableUnionWithDefaultValue14(optional (double or ByteString)? arg = 1);
565  void passNullableUnionWithDefaultValue15(optional (double or ByteString)? arg = 1.5);
566  void passNullableUnionWithDefaultValue16(optional (double or ByteString)? arg = null);
567  void passNullableUnionWithDefaultValue17(optional (double or SupportedType)? arg = "text/html");
568  void passNullableUnionWithDefaultValue18(optional (double or SupportedType)? arg = 1);
569  void passNullableUnionWithDefaultValue19(optional (double or SupportedType)? arg = 1.5);
570  void passNullableUnionWithDefaultValue20(optional (double or SupportedType)? arg = null);
571  void passNullableUnionWithDefaultValue21(optional (double or USVString)? arg = "abc");
572  void passNullableUnionWithDefaultValue22(optional (double or USVString)? arg = 1);
573  void passNullableUnionWithDefaultValue23(optional (double or USVString)? arg = 1.5);
574  void passNullableUnionWithDefaultValue24(optional (double or USVString)? arg = null);
575  void passNullableUnionWithDefaultValue25(optional (double or UTF8String)? arg = "");
576  void passNullableUnionWithDefaultValue26(optional (double or UTF8String)? arg = 1);
577  void passNullableUnionWithDefaultValue27(optional (double or UTF8String)? arg = 1.5);
578  void passNullableUnionWithDefaultValue28(optional (double or UTF8String)? arg = null);
579
580  void passSequenceOfUnions(sequence<(CanvasPattern or CanvasGradient)> arg);
581  void passSequenceOfUnions2(sequence<(object or long)> arg);
582  void passVariadicUnion((CanvasPattern or CanvasGradient)... arg);
583
584  void passSequenceOfNullableUnions(sequence<(CanvasPattern or CanvasGradient)?> arg);
585  void passVariadicNullableUnion((CanvasPattern or CanvasGradient)?... arg);
586  void passRecordOfUnions(record<DOMString, (CanvasPattern or CanvasGradient)> arg);
587  // XXXbz no move constructor on some unions
588  // void passRecordOfUnions2(record<DOMString, (object or long)> arg);
589
590  (CanvasPattern or CanvasGradient) receiveUnion();
591  (object or long) receiveUnion2();
592  (CanvasPattern? or CanvasGradient) receiveUnionContainingNull();
593  (CanvasPattern or CanvasGradient)? receiveNullableUnion();
594  (object or long)? receiveNullableUnion2();
595
596  attribute (CanvasPattern or CanvasGradient) writableUnion;
597  attribute (CanvasPattern? or CanvasGradient) writableUnionContainingNull;
598  attribute (CanvasPattern or CanvasGradient)? writableNullableUnion;
599
600  // Promise types
601  void passPromise(Promise<any> arg);
602  void passOptionalPromise(optional Promise<any> arg);
603  void passPromiseSequence(sequence<Promise<any>> arg);
604  Promise<any> receivePromise();
605  Promise<any> receiveAddrefedPromise();
606
607  // binaryNames tests
608  [BinaryName="methodRenamedTo"]
609  void methodRenamedFrom();
610  [BinaryName="methodRenamedTo"]
611  void methodRenamedFrom(byte argument);
612  [BinaryName="attributeGetterRenamedTo"]
613  readonly attribute byte attributeGetterRenamedFrom;
614  [BinaryName="attributeRenamedTo"]
615  attribute byte attributeRenamedFrom;
616
617  void passDictionary(optional Dict x = {});
618  void passDictionary2(Dict x);
619  // [Cached] is not supported in JS-implemented WebIDL.
620  //[Cached, Pure]
621  //readonly attribute Dict readonlyDictionary;
622  //[Cached, Pure]
623  //readonly attribute Dict? readonlyNullableDictionary;
624  //[Cached, Pure]
625  //attribute Dict writableDictionary;
626  //[Cached, Pure, Frozen]
627  //readonly attribute Dict readonlyFrozenDictionary;
628  //[Cached, Pure, Frozen]
629  //readonly attribute Dict? readonlyFrozenNullableDictionary;
630  //[Cached, Pure, Frozen]
631  //attribute Dict writableFrozenDictionary;
632  Dict receiveDictionary();
633  Dict? receiveNullableDictionary();
634  void passOtherDictionary(optional GrandparentDict x = {});
635  void passSequenceOfDictionaries(sequence<Dict> x);
636  void passRecordOfDictionaries(record<DOMString, GrandparentDict> x);
637  // No support for nullable dictionaries inside a sequence (nor should there be)
638  //  void passSequenceOfNullableDictionaries(sequence<Dict?> x);
639  void passDictionaryOrLong(optional Dict x = {});
640  void passDictionaryOrLong(long x);
641
642  void passDictContainingDict(optional DictContainingDict arg = {});
643  void passDictContainingSequence(optional DictContainingSequence arg = {});
644  DictContainingSequence receiveDictContainingSequence();
645  void passVariadicDictionary(Dict... arg);
646
647  // EnforceRange/Clamp tests
648  void dontEnforceRangeOrClamp(byte arg);
649  void doEnforceRange([EnforceRange] byte arg);
650  void doEnforceRangeNullable([EnforceRange] byte? arg);
651  void doClamp([Clamp] byte arg);
652  void doClampNullable([Clamp] byte? arg);
653  attribute [EnforceRange] byte enforcedByte;
654  attribute [EnforceRange] byte? enforcedByteNullable;
655  attribute [Clamp] byte clampedByte;
656  attribute [Clamp] byte? clampedByteNullable;
657
658  // Typedefs
659  const myLong myLongConstant = 5;
660  void exerciseTypedefInterfaces1(AnotherNameForTestJSImplInterface arg);
661  AnotherNameForTestJSImplInterface exerciseTypedefInterfaces2(NullableTestJSImplInterface arg);
662  void exerciseTypedefInterfaces3(YetAnotherNameForTestJSImplInterface arg);
663
664  // Deprecated methods and attributes
665  [Deprecated="Components"]
666  attribute byte deprecatedAttribute;
667  [Deprecated="Components"]
668  byte deprecatedMethod();
669  [Deprecated="Components"]
670  void deprecatedMethodWithContext(any arg);
671
672  // Static methods and attributes
673  // FIXME: Bug 863952 Static things are not supported yet
674  /*
675  static attribute boolean staticAttribute;
676  static void staticMethod(boolean arg);
677  static void staticMethodWithContext(any arg);
678
679  // Deprecated static methods and attributes
680  [Deprecated="Components"]
681  static attribute byte staticDeprecatedAttribute;
682  [Deprecated="Components"]
683  static byte staticDeprecatedMethod();
684  [Deprecated="Components"]
685  static byte staticDeprecatedMethodWithContext();
686  */
687
688  // Overload resolution tests
689  //void overload1(DOMString... strs);
690  boolean overload1(TestJSImplInterface arg);
691  TestJSImplInterface overload1(DOMString strs, TestJSImplInterface arg);
692  void overload2(TestJSImplInterface arg);
693  void overload2(optional Dict arg = {});
694  void overload2(boolean arg);
695  void overload2(DOMString arg);
696  void overload3(TestJSImplInterface arg);
697  void overload3(MyTestCallback arg);
698  void overload3(boolean arg);
699  void overload4(TestJSImplInterface arg);
700  void overload4(TestCallbackInterface arg);
701  void overload4(DOMString arg);
702  void overload5(long arg);
703  void overload5(MyTestEnum arg);
704  void overload6(long arg);
705  void overload6(boolean arg);
706  void overload7(long arg);
707  void overload7(boolean arg);
708  void overload7(ByteString arg);
709  void overload8(long arg);
710  void overload8(TestJSImplInterface arg);
711  void overload9(long? arg);
712  void overload9(DOMString arg);
713  void overload10(long? arg);
714  void overload10(object arg);
715  void overload11(long arg);
716  void overload11(DOMString? arg);
717  void overload12(long arg);
718  void overload12(boolean? arg);
719  void overload13(long? arg);
720  void overload13(boolean arg);
721  void overload14(optional long arg);
722  void overload14(TestInterface arg);
723  void overload15(long arg);
724  void overload15(optional TestInterface arg);
725  void overload16(long arg);
726  void overload16(optional TestInterface? arg);
727  void overload17(sequence<long> arg);
728  void overload17(record<DOMString, long> arg);
729  void overload18(record<DOMString, DOMString> arg);
730  void overload18(sequence<DOMString> arg);
731  void overload19(sequence<long> arg);
732  void overload19(optional Dict arg = {});
733  void overload20(optional Dict arg = {});
734  void overload20(sequence<long> arg);
735
736  // Variadic handling
737  void passVariadicThirdArg(DOMString arg1, long arg2, TestJSImplInterface... arg3);
738
739  // Conditionally exposed methods/attributes
740  [Pref="dom.webidl.test1"]
741  readonly attribute boolean prefable1;
742  [Pref="dom.webidl.test1"]
743  readonly attribute boolean prefable2;
744  [Pref="dom.webidl.test2"]
745  readonly attribute boolean prefable3;
746  [Pref="dom.webidl.test2"]
747  readonly attribute boolean prefable4;
748  [Pref="dom.webidl.test1"]
749  readonly attribute boolean prefable5;
750  [Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
751  readonly attribute boolean prefable6;
752  [Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
753  readonly attribute boolean prefable7;
754  [Pref="dom.webidl.test2", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
755  readonly attribute boolean prefable8;
756  [Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
757  readonly attribute boolean prefable9;
758  [Pref="dom.webidl.test1"]
759  void prefable10();
760  [Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
761  void prefable11();
762  [Pref="dom.webidl.test1", Func="TestFuncControlledMember"]
763  readonly attribute boolean prefable12;
764  [Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
765  void prefable13();
766  [Pref="dom.webidl.test1", Func="TestFuncControlledMember"]
767  readonly attribute boolean prefable14;
768  [Func="TestFuncControlledMember"]
769  readonly attribute boolean prefable15;
770  [Func="TestFuncControlledMember"]
771  readonly attribute boolean prefable16;
772  [Pref="dom.webidl.test1", Func="TestFuncControlledMember"]
773  void prefable17();
774  [Func="TestFuncControlledMember"]
775  void prefable18();
776  [Func="TestFuncControlledMember"]
777  void prefable19();
778  [Pref="dom.webidl.test1", Func="TestFuncControlledMember", ChromeOnly]
779  void prefable20();
780
781  // Conditionally exposed methods/attributes involving [SecureContext]
782  [SecureContext]
783  readonly attribute boolean conditionalOnSecureContext1;
784  [SecureContext, Pref="dom.webidl.test1"]
785  readonly attribute boolean conditionalOnSecureContext2;
786  [SecureContext, Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
787  readonly attribute boolean conditionalOnSecureContext3;
788  [SecureContext, Pref="dom.webidl.test1", Func="TestFuncControlledMember"]
789  readonly attribute boolean conditionalOnSecureContext4;
790  [SecureContext]
791  void conditionalOnSecureContext5();
792  [SecureContext, Pref="dom.webidl.test1"]
793  void conditionalOnSecureContext6();
794  [SecureContext, Pref="dom.webidl.test1", Func="nsGenericHTMLElement::LegacyTouchAPIEnabled"]
795  void conditionalOnSecureContext7();
796  [SecureContext, Pref="dom.webidl.test1", Func="TestFuncControlledMember"]
797  void conditionalOnSecureContext8();
798
799  // Miscellania
800  [LegacyLenientThis] attribute long attrWithLenientThis;
801  // FIXME: Bug 863954 Unforgeable things get all confused when
802  // non-JS-implemented interfaces inherit from JS-implemented ones or vice
803  // versa.
804  //   [Unforgeable] readonly attribute long unforgeableAttr;
805  //   [Unforgeable, ChromeOnly] readonly attribute long unforgeableAttr2;
806  //   [Unforgeable] long unforgeableMethod();
807  //   [Unforgeable, ChromeOnly] long unforgeableMethod2();
808  // FIXME: Bug 863955 No stringifiers yet
809  //   stringifier;
810  void passRenamedInterface(TestRenamedInterface arg);
811  [PutForwards=writableByte] readonly attribute TestJSImplInterface putForwardsAttr;
812  [PutForwards=writableByte, LegacyLenientThis] readonly attribute TestJSImplInterface putForwardsAttr2;
813  [PutForwards=writableByte, ChromeOnly] readonly attribute TestJSImplInterface putForwardsAttr3;
814  [Throws] void throwingMethod();
815  [Throws] attribute boolean throwingAttr;
816  [GetterThrows] attribute boolean throwingGetterAttr;
817  [SetterThrows] attribute boolean throwingSetterAttr;
818  [CanOOM] void canOOMMethod();
819  [CanOOM] attribute boolean canOOMAttr;
820  [GetterCanOOM] attribute boolean canOOMGetterAttr;
821  [SetterCanOOM] attribute boolean canOOMSetterAttr;
822  [CEReactions] void ceReactionsMethod();
823  [CEReactions] void ceReactionsMethodOverload();
824  [CEReactions] void ceReactionsMethodOverload(DOMString bar);
825  [CEReactions] attribute boolean ceReactionsAttr;
826  // NeedsSubjectPrincipal not supported on JS-implemented things for
827  // now, because we always pass in the caller principal anyway.
828  //  [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod();
829  //  [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr;
830  // legacycaller short(unsigned long arg1, TestInterface arg2);
831  void passArgsWithDefaults(optional long arg1,
832                            optional TestInterface? arg2 = null,
833                            optional Dict arg3 = {}, optional double arg4 = 5.0,
834                            optional float arg5);
835  attribute any toJSONShouldSkipThis;
836  attribute TestParentInterface toJSONShouldSkipThis2;
837  attribute TestCallbackInterface toJSONShouldSkipThis3;
838  [Default] object toJSON();
839
840  attribute byte dashed-attribute;
841  void dashed-method();
842
843  // [NonEnumerable] tests
844  [NonEnumerable]
845  attribute boolean nonEnumerableAttr;
846  [NonEnumerable]
847  const boolean nonEnumerableConst = true;
848  [NonEnumerable]
849  void nonEnumerableMethod();
850
851  // [AllowShared] tests
852  attribute [AllowShared] ArrayBufferViewTypedef allowSharedArrayBufferViewTypedef;
853  attribute [AllowShared] ArrayBufferView allowSharedArrayBufferView;
854  attribute [AllowShared] ArrayBufferView? allowSharedNullableArrayBufferView;
855  attribute [AllowShared] ArrayBuffer allowSharedArrayBuffer;
856  attribute [AllowShared] ArrayBuffer? allowSharedNullableArrayBuffer;
857
858  void passAllowSharedArrayBufferViewTypedef(AllowSharedArrayBufferViewTypedef foo);
859  void passAllowSharedArrayBufferView([AllowShared] ArrayBufferView foo);
860  void passAllowSharedNullableArrayBufferView([AllowShared] ArrayBufferView? foo);
861  void passAllowSharedArrayBuffer([AllowShared] ArrayBuffer foo);
862  void passAllowSharedNullableArrayBuffer([AllowShared] ArrayBuffer? foo);
863  void passUnionArrayBuffer((DOMString or ArrayBuffer) foo);
864  void passUnionAllowSharedArrayBuffer((DOMString or [AllowShared] ArrayBuffer) foo);
865
866  // If you add things here, add them to TestCodeGen as well
867};
868
869[Exposed=Window]
870interface TestCImplementedInterface : TestJSImplInterface {
871};
872
873[Exposed=Window]
874interface TestCImplementedInterface2 {
875};
876
877[LegacyNoInterfaceObject,
878 JSImplementation="@mozilla.org/test-js-impl-interface;2",
879 Exposed=Window]
880interface TestJSImplNoInterfaceObject {
881  // [Cached] is not supported in JS-implemented WebIDL.
882  //[Cached, Pure]
883  //readonly attribute byte cachedByte;
884};
885