summaryrefslogtreecommitdiffstats
path: root/dom/bindings/test
diff options
context:
space:
mode:
Diffstat (limited to 'dom/bindings/test')
-rw-r--r--dom/bindings/test/Makefile.in21
-rw-r--r--dom/bindings/test/TestBindingHeader.h1431
-rw-r--r--dom/bindings/test/TestCImplementedInterface.h43
-rw-r--r--dom/bindings/test/TestCodeGen.webidl1264
-rw-r--r--dom/bindings/test/TestDictionary.webidl9
-rw-r--r--dom/bindings/test/TestExampleGen.webidl811
-rw-r--r--dom/bindings/test/TestFunctions.cpp94
-rw-r--r--dom/bindings/test/TestFunctions.h52
-rw-r--r--dom/bindings/test/TestInterfaceIterableDouble.cpp82
-rw-r--r--dom/bindings/test/TestInterfaceIterableDouble.h51
-rw-r--r--dom/bindings/test/TestInterfaceIterableDoubleUnion.cpp83
-rw-r--r--dom/bindings/test/TestInterfaceIterableDoubleUnion.h51
-rw-r--r--dom/bindings/test/TestInterfaceIterableSingle.cpp77
-rw-r--r--dom/bindings/test/TestInterfaceIterableSingle.h51
-rw-r--r--dom/bindings/test/TestInterfaceJS.js166
-rw-r--r--dom/bindings/test/TestInterfaceJS.manifest4
-rw-r--r--dom/bindings/test/TestInterfaceJSMaplike.js38
-rw-r--r--dom/bindings/test/TestInterfaceMaplike.cpp84
-rw-r--r--dom/bindings/test/TestInterfaceMaplike.h52
-rw-r--r--dom/bindings/test/TestInterfaceMaplikeObject.cpp88
-rw-r--r--dom/bindings/test/TestInterfaceMaplikeObject.h52
-rw-r--r--dom/bindings/test/TestInterfaceSetlike.cpp58
-rw-r--r--dom/bindings/test/TestInterfaceSetlike.h46
-rw-r--r--dom/bindings/test/TestInterfaceSetlikeNode.cpp58
-rw-r--r--dom/bindings/test/TestInterfaceSetlikeNode.h46
-rw-r--r--dom/bindings/test/TestJSImplGen.webidl836
-rw-r--r--dom/bindings/test/TestJSImplInheritanceGen.webidl29
-rw-r--r--dom/bindings/test/TestTypedef.webidl7
-rw-r--r--dom/bindings/test/chrome.ini22
-rw-r--r--dom/bindings/test/file_InstanceOf.html12
-rw-r--r--dom/bindings/test/file_bug775543.html5
-rw-r--r--dom/bindings/test/file_document_location_set_via_xray.html5
-rw-r--r--dom/bindings/test/file_dom_xrays.html24
-rw-r--r--dom/bindings/test/file_focuser.html24
-rw-r--r--dom/bindings/test/file_fullScreenPropertyAccessor.html24
-rw-r--r--dom/bindings/test/file_proxies_via_xray.html8
-rw-r--r--dom/bindings/test/forOf_iframe.html13
-rw-r--r--dom/bindings/test/mochitest.ini79
-rw-r--r--dom/bindings/test/moz.build58
-rw-r--r--dom/bindings/test/test_ByteString.html32
-rw-r--r--dom/bindings/test/test_InstanceOf.html54
-rw-r--r--dom/bindings/test/test_Object.prototype_props.html20
-rw-r--r--dom/bindings/test/test_async_stacks.html108
-rw-r--r--dom/bindings/test/test_barewordGetsWindow.html60
-rw-r--r--dom/bindings/test/test_blacklisted_prerendering_function.xul124
-rw-r--r--dom/bindings/test/test_bug1036214.html123
-rw-r--r--dom/bindings/test/test_bug1041646.html49
-rw-r--r--dom/bindings/test/test_bug1123516_maplikesetlike.html271
-rw-r--r--dom/bindings/test/test_bug1123516_maplikesetlikechrome.xul68
-rw-r--r--dom/bindings/test/test_bug1123875.html14
-rw-r--r--dom/bindings/test/test_bug1287912.html37
-rw-r--r--dom/bindings/test/test_bug560072.html33
-rw-r--r--dom/bindings/test/test_bug742191.html36
-rw-r--r--dom/bindings/test/test_bug759621.html29
-rw-r--r--dom/bindings/test/test_bug773326.html11
-rw-r--r--dom/bindings/test/test_bug775543.html37
-rw-r--r--dom/bindings/test/test_bug788369.html30
-rw-r--r--dom/bindings/test/test_bug852846.html34
-rw-r--r--dom/bindings/test/test_bug862092.html37
-rw-r--r--dom/bindings/test/test_bug963382.html43
-rw-r--r--dom/bindings/test/test_callback_across_document_open.html21
-rw-r--r--dom/bindings/test/test_callback_default_thisval.html36
-rw-r--r--dom/bindings/test/test_callback_exceptions.html17
-rw-r--r--dom/bindings/test/test_cloneAndImportNode.html48
-rw-r--r--dom/bindings/test/test_crossOriginWindowSymbolAccess.html23
-rw-r--r--dom/bindings/test/test_defineProperty.html157
-rw-r--r--dom/bindings/test/test_document_location_set_via_xray.html49
-rw-r--r--dom/bindings/test/test_document_location_via_xray_cached.html36
-rw-r--r--dom/bindings/test/test_domProxyArrayLengthGetter.html28
-rw-r--r--dom/bindings/test/test_dom_xrays.html231
-rw-r--r--dom/bindings/test/test_enums.html15
-rw-r--r--dom/bindings/test/test_exceptionSanitization.html45
-rw-r--r--dom/bindings/test/test_exceptionThrowing.html56
-rw-r--r--dom/bindings/test/test_exception_messages.html82
-rw-r--r--dom/bindings/test/test_exception_options_from_jsimplemented.html166
-rw-r--r--dom/bindings/test/test_exceptions_from_jsimplemented.html56
-rw-r--r--dom/bindings/test/test_forOf.html86
-rw-r--r--dom/bindings/test/test_integers.html50
-rw-r--r--dom/bindings/test/test_interfaceName.html28
-rw-r--r--dom/bindings/test/test_interfaceToString.html47
-rw-r--r--dom/bindings/test/test_iterable.html241
-rw-r--r--dom/bindings/test/test_jsimplemented_eventhandler.html47
-rw-r--r--dom/bindings/test/test_kill_longrunning_prerendered_content.xul85
-rw-r--r--dom/bindings/test/test_lenientThis.html27
-rw-r--r--dom/bindings/test/test_lookupGetter.html49
-rw-r--r--dom/bindings/test/test_namedNoIndexed.html36
-rw-r--r--dom/bindings/test/test_named_getter_enumerability.html40
-rw-r--r--dom/bindings/test/test_oom_reporting.html42
-rw-r--r--dom/bindings/test/test_primitive_this.html45
-rw-r--r--dom/bindings/test/test_promise_rejections_from_jsimplemented.html143
-rw-r--r--dom/bindings/test/test_proxies_via_xray.html99
-rw-r--r--dom/bindings/test/test_queryInterface.html41
-rw-r--r--dom/bindings/test/test_returnUnion.html59
-rw-r--r--dom/bindings/test/test_sequence_detection.html53
-rw-r--r--dom/bindings/test/test_sequence_wrapping.html59
-rw-r--r--dom/bindings/test/test_setWithNamedGetterNoNamedSetter.html40
-rw-r--r--dom/bindings/test/test_stringBindings.html59
-rw-r--r--dom/bindings/test/test_throwing_method_noDCE.html27
-rw-r--r--dom/bindings/test/test_traceProtos.html37
-rw-r--r--dom/bindings/test/test_treat_non_object_as_null.html39
-rw-r--r--dom/bindings/test/test_unforgeablesonexpando.html18
-rw-r--r--dom/bindings/test/test_usvstring.html41
-rw-r--r--dom/bindings/test/test_worker_UnwrapArg.html58
103 files changed, 9870 insertions, 0 deletions
diff --git a/dom/bindings/test/Makefile.in b/dom/bindings/test/Makefile.in
new file mode 100644
index 000000000..844a51c27
--- /dev/null
+++ b/dom/bindings/test/Makefile.in
@@ -0,0 +1,21 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ifdef COMPILE_ENVIRONMENT
+
+include ../webidlsrcs.mk
+
+# $(test_sources) comes from webidlsrcs.mk.
+# TODO Update this variable in backend.mk.
+CPPSRCS += $(addprefix ../,$(test_sources))
+
+# Include rules.mk before any of our targets so our first target is coming from
+# rules.mk and running make with no target in this dir does the right thing.
+include $(topsrcdir)/config/rules.mk
+
+endif
+
+check::
+ PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \
+ $(PLY_INCLUDE) $(srcdir)/../parser/runtests.py
diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h
new file mode 100644
index 000000000..ca5aafdc5
--- /dev/null
+++ b/dom/bindings/test/TestBindingHeader.h
@@ -0,0 +1,1431 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef TestBindingHeader_h
+#define TestBindingHeader_h
+
+#include "mozilla/dom/BindingUtils.h"
+#include "mozilla/dom/Date.h"
+#include "mozilla/dom/MozMap.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/ErrorResult.h"
+#include "nsCOMPtr.h"
+#include "nsGenericHTMLElement.h"
+#include "nsWrapperCache.h"
+
+// Forward declare this before we include TestCodeGenBinding.h, because that header relies on including
+// this one for it, for ParentDict. Hopefully it won't begin to rely on it in more fundamental ways.
+namespace mozilla {
+namespace dom {
+class TestExternalInterface;
+class Promise;
+} // namespace dom
+} // namespace mozilla
+
+// We don't export TestCodeGenBinding.h, but it's right in our parent dir.
+#include "../TestCodeGenBinding.h"
+
+extern bool TestFuncControlledMember(JSContext*, JSObject*);
+
+namespace mozilla {
+namespace dom {
+
+// IID for nsRenamedInterface
+#define NS_RENAMED_INTERFACE_IID \
+{ 0xd4b19ef3, 0xe68b, 0x4e3f, \
+ { 0x94, 0xbc, 0xc9, 0xde, 0x3a, 0x69, 0xb0, 0xe8 } }
+
+class nsRenamedInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_RENAMED_INTERFACE_IID)
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsRenamedInterface, NS_RENAMED_INTERFACE_IID)
+
+// IID for the IndirectlyImplementedInterface
+#define NS_INDIRECTLY_IMPLEMENTED_INTERFACE_IID \
+{ 0xfed55b69, 0x7012, 0x4849, \
+ { 0xaf, 0x56, 0x4b, 0xa9, 0xee, 0x41, 0x30, 0x89 } }
+
+class IndirectlyImplementedInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_INDIRECTLY_IMPLEMENTED_INTERFACE_IID)
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ bool IndirectlyImplementedProperty();
+ void IndirectlyImplementedProperty(bool);
+ void IndirectlyImplementedMethod();
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(IndirectlyImplementedInterface, NS_INDIRECTLY_IMPLEMENTED_INTERFACE_IID)
+
+// IID for the TestExternalInterface
+#define NS_TEST_EXTERNAL_INTERFACE_IID \
+{ 0xd5ba0c99, 0x9b1d, 0x4e71, \
+ { 0x8a, 0x94, 0x56, 0x38, 0x6c, 0xa3, 0xda, 0x3d } }
+class TestExternalInterface : public nsISupports
+{
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_TEST_EXTERNAL_INTERFACE_IID)
+ NS_DECL_ISUPPORTS
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(TestExternalInterface, NS_TEST_EXTERNAL_INTERFACE_IID)
+
+class TestNonWrapperCacheInterface : public nsISupports
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ bool WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);
+};
+
+class OnlyForUseInConstructor : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+};
+
+class TestInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ // And now our actual WebIDL API
+ // Constructors
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, ErrorResult&);
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, const nsAString&, ErrorResult&);
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, uint32_t, const Nullable<bool>&,
+ ErrorResult&);
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, TestInterface*, ErrorResult&);
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, uint32_t, IndirectlyImplementedInterface&, ErrorResult&);
+
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, Date&, ErrorResult&);
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, const ArrayBuffer&, ErrorResult&);
+ static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, const Uint8Array&, ErrorResult&);
+ /* static
+ already_AddRefed<TestInterface>
+ Constructor(const GlobalObject&, uint32_t, uint32_t,
+ const TestInterfaceOrOnlyForUseInConstructor&, ErrorResult&);
+ */
+
+ static
+ already_AddRefed<TestInterface> Test(const GlobalObject&, ErrorResult&);
+ static
+ already_AddRefed<TestInterface> Test(const GlobalObject&, const nsAString&,
+ ErrorResult&);
+ static
+ already_AddRefed<TestInterface> Test(const GlobalObject&, const nsACString&,
+ ErrorResult&);
+
+ static
+ already_AddRefed<TestInterface> Test2(const GlobalObject&,
+ const DictForConstructor&,
+ JS::Handle<JS::Value>,
+ JS::Handle<JSObject*>,
+ JS::Handle<JSObject*>,
+ const Sequence<Dict>&,
+ JS::Handle<JS::Value>,
+ const Optional<JS::Handle<JSObject*> >&,
+ const Optional<JS::Handle<JSObject*> >&,
+ ErrorResult&);
+
+ static
+ already_AddRefed<TestInterface> Test3(const GlobalObject&,
+ const LongOrAnyMozMap&,
+ ErrorResult&);
+
+ // Integer types
+ int8_t ReadonlyByte();
+ int8_t WritableByte();
+ void SetWritableByte(int8_t);
+ void PassByte(int8_t);
+ int8_t ReceiveByte();
+ void PassOptionalByte(const Optional<int8_t>&);
+ void PassOptionalByteBeforeRequired(const Optional<int8_t>&, int8_t);
+ void PassOptionalByteWithDefault(int8_t);
+ void PassOptionalByteWithDefaultBeforeRequired(int8_t, int8_t);
+ void PassNullableByte(const Nullable<int8_t>&);
+ void PassOptionalNullableByte(const Optional< Nullable<int8_t> >&);
+ void PassVariadicByte(const Sequence<int8_t>&);
+ int8_t CachedByte();
+ int8_t CachedConstantByte();
+ int8_t CachedWritableByte();
+ void SetCachedWritableByte(int8_t);
+ int8_t SideEffectFreeByte();
+ int8_t SetSideEffectFreeByte(int8_t);
+ int8_t DomDependentByte();
+ int8_t SetDomDependentByte(int8_t);
+ int8_t ConstantByte();
+ int8_t DeviceStateDependentByte();
+ int8_t ReturnByteSideEffectFree();
+ int8_t ReturnDOMDependentByte();
+ int8_t ReturnConstantByte();
+ int8_t ReturnDeviceStateDependentByte();
+
+ void UnsafePrerenderMethod();
+ int32_t UnsafePrerenderWritable();
+ void SetUnsafePrerenderWritable(int32_t);
+ int32_t UnsafePrerenderReadonly();
+ int16_t ReadonlyShort();
+ int16_t WritableShort();
+ void SetWritableShort(int16_t);
+ void PassShort(int16_t);
+ int16_t ReceiveShort();
+ void PassOptionalShort(const Optional<int16_t>&);
+ void PassOptionalShortWithDefault(int16_t);
+
+ int32_t ReadonlyLong();
+ int32_t WritableLong();
+ void SetWritableLong(int32_t);
+ void PassLong(int32_t);
+ int16_t ReceiveLong();
+ void PassOptionalLong(const Optional<int32_t>&);
+ void PassOptionalLongWithDefault(int32_t);
+
+ int64_t ReadonlyLongLong();
+ int64_t WritableLongLong();
+ void SetWritableLongLong(int64_t);
+ void PassLongLong(int64_t);
+ int64_t ReceiveLongLong();
+ void PassOptionalLongLong(const Optional<int64_t>&);
+ void PassOptionalLongLongWithDefault(int64_t);
+
+ uint8_t ReadonlyOctet();
+ uint8_t WritableOctet();
+ void SetWritableOctet(uint8_t);
+ void PassOctet(uint8_t);
+ uint8_t ReceiveOctet();
+ void PassOptionalOctet(const Optional<uint8_t>&);
+ void PassOptionalOctetWithDefault(uint8_t);
+
+ uint16_t ReadonlyUnsignedShort();
+ uint16_t WritableUnsignedShort();
+ void SetWritableUnsignedShort(uint16_t);
+ void PassUnsignedShort(uint16_t);
+ uint16_t ReceiveUnsignedShort();
+ void PassOptionalUnsignedShort(const Optional<uint16_t>&);
+ void PassOptionalUnsignedShortWithDefault(uint16_t);
+
+ uint32_t ReadonlyUnsignedLong();
+ uint32_t WritableUnsignedLong();
+ void SetWritableUnsignedLong(uint32_t);
+ void PassUnsignedLong(uint32_t);
+ uint32_t ReceiveUnsignedLong();
+ void PassOptionalUnsignedLong(const Optional<uint32_t>&);
+ void PassOptionalUnsignedLongWithDefault(uint32_t);
+
+ uint64_t ReadonlyUnsignedLongLong();
+ uint64_t WritableUnsignedLongLong();
+ void SetWritableUnsignedLongLong(uint64_t);
+ void PassUnsignedLongLong(uint64_t);
+ uint64_t ReceiveUnsignedLongLong();
+ void PassOptionalUnsignedLongLong(const Optional<uint64_t>&);
+ void PassOptionalUnsignedLongLongWithDefault(uint64_t);
+
+ float WritableFloat() const;
+ void SetWritableFloat(float);
+ float WritableUnrestrictedFloat() const;
+ void SetWritableUnrestrictedFloat(float);
+ Nullable<float> GetWritableNullableFloat() const;
+ void SetWritableNullableFloat(Nullable<float>);
+ Nullable<float> GetWritableNullableUnrestrictedFloat() const;
+ void SetWritableNullableUnrestrictedFloat(Nullable<float>);
+ double WritableDouble() const;
+ void SetWritableDouble(double);
+ double WritableUnrestrictedDouble() const;
+ void SetWritableUnrestrictedDouble(double);
+ Nullable<double> GetWritableNullableDouble() const;
+ void SetWritableNullableDouble(Nullable<double>);
+ Nullable<double> GetWritableNullableUnrestrictedDouble() const;
+ void SetWritableNullableUnrestrictedDouble(Nullable<double>);
+ void PassFloat(float, float, Nullable<float>, Nullable<float>,
+ double, double, Nullable<double>, Nullable<double>,
+ const Sequence<float>&, const Sequence<float>&,
+ const Sequence<Nullable<float> >&,
+ const Sequence<Nullable<float> >&,
+ const Sequence<double>&, const Sequence<double>&,
+ const Sequence<Nullable<double> >&,
+ const Sequence<Nullable<double> >&);
+ void PassLenientFloat(float, float, Nullable<float>, Nullable<float>,
+ double, double, Nullable<double>, Nullable<double>,
+ const Sequence<float>&, const Sequence<float>&,
+ const Sequence<Nullable<float> >&,
+ const Sequence<Nullable<float> >&,
+ const Sequence<double>&, const Sequence<double>&,
+ const Sequence<Nullable<double> >&,
+ const Sequence<Nullable<double> >&);
+ float LenientFloatAttr() const;
+ void SetLenientFloatAttr(float);
+ double LenientDoubleAttr() const;
+ void SetLenientDoubleAttr(double);
+
+ void PassUnrestricted(float arg1,
+ float arg2,
+ float arg3,
+ float arg4,
+ double arg5,
+ double arg6,
+ double arg7,
+ double arg8);
+
+ // Interface types
+ already_AddRefed<TestInterface> ReceiveSelf();
+ already_AddRefed<TestInterface> ReceiveNullableSelf();
+ TestInterface* ReceiveWeakSelf();
+ TestInterface* ReceiveWeakNullableSelf();
+ void PassSelf(TestInterface&);
+ void PassNullableSelf(TestInterface*);
+ already_AddRefed<TestInterface> NonNullSelf();
+ void SetNonNullSelf(TestInterface&);
+ already_AddRefed<TestInterface> GetNullableSelf();
+ already_AddRefed<TestInterface> CachedSelf();
+ void SetNullableSelf(TestInterface*);
+ void PassOptionalSelf(const Optional<TestInterface*> &);
+ void PassOptionalNonNullSelf(const Optional<NonNull<TestInterface> >&);
+ void PassOptionalSelfWithDefault(TestInterface*);
+
+ already_AddRefed<TestNonWrapperCacheInterface> ReceiveNonWrapperCacheInterface();
+ already_AddRefed<TestNonWrapperCacheInterface> ReceiveNullableNonWrapperCacheInterface();
+ void ReceiveNonWrapperCacheInterfaceSequence(nsTArray<RefPtr<TestNonWrapperCacheInterface> >&);
+ void ReceiveNullableNonWrapperCacheInterfaceSequence(nsTArray<RefPtr<TestNonWrapperCacheInterface> >&);
+ void ReceiveNonWrapperCacheInterfaceNullableSequence(Nullable<nsTArray<RefPtr<TestNonWrapperCacheInterface> > >&);
+ void ReceiveNullableNonWrapperCacheInterfaceNullableSequence(Nullable<nsTArray<RefPtr<TestNonWrapperCacheInterface> > >&);
+
+ already_AddRefed<IndirectlyImplementedInterface> ReceiveOther();
+ already_AddRefed<IndirectlyImplementedInterface> ReceiveNullableOther();
+ IndirectlyImplementedInterface* ReceiveWeakOther();
+ IndirectlyImplementedInterface* ReceiveWeakNullableOther();
+ void PassOther(IndirectlyImplementedInterface&);
+ void PassNullableOther(IndirectlyImplementedInterface*);
+ already_AddRefed<IndirectlyImplementedInterface> NonNullOther();
+ void SetNonNullOther(IndirectlyImplementedInterface&);
+ already_AddRefed<IndirectlyImplementedInterface> GetNullableOther();
+ void SetNullableOther(IndirectlyImplementedInterface*);
+ void PassOptionalOther(const Optional<IndirectlyImplementedInterface*>&);
+ void PassOptionalNonNullOther(const Optional<NonNull<IndirectlyImplementedInterface> >&);
+ void PassOptionalOtherWithDefault(IndirectlyImplementedInterface*);
+
+ already_AddRefed<TestExternalInterface> ReceiveExternal();
+ already_AddRefed<TestExternalInterface> ReceiveNullableExternal();
+ TestExternalInterface* ReceiveWeakExternal();
+ TestExternalInterface* ReceiveWeakNullableExternal();
+ void PassExternal(TestExternalInterface*);
+ void PassNullableExternal(TestExternalInterface*);
+ already_AddRefed<TestExternalInterface> NonNullExternal();
+ void SetNonNullExternal(TestExternalInterface*);
+ already_AddRefed<TestExternalInterface> GetNullableExternal();
+ void SetNullableExternal(TestExternalInterface*);
+ void PassOptionalExternal(const Optional<TestExternalInterface*>&);
+ void PassOptionalNonNullExternal(const Optional<TestExternalInterface*>&);
+ void PassOptionalExternalWithDefault(TestExternalInterface*);
+
+ already_AddRefed<TestCallbackInterface> ReceiveCallbackInterface();
+ already_AddRefed<TestCallbackInterface> ReceiveNullableCallbackInterface();
+ TestCallbackInterface* ReceiveWeakCallbackInterface();
+ TestCallbackInterface* ReceiveWeakNullableCallbackInterface();
+ void PassCallbackInterface(TestCallbackInterface&);
+ void PassNullableCallbackInterface(TestCallbackInterface*);
+ already_AddRefed<TestCallbackInterface> NonNullCallbackInterface();
+ void SetNonNullCallbackInterface(TestCallbackInterface&);
+ already_AddRefed<TestCallbackInterface> GetNullableCallbackInterface();
+ void SetNullableCallbackInterface(TestCallbackInterface*);
+ void PassOptionalCallbackInterface(const Optional<RefPtr<TestCallbackInterface> >&);
+ void PassOptionalNonNullCallbackInterface(const Optional<OwningNonNull<TestCallbackInterface> >&);
+ void PassOptionalCallbackInterfaceWithDefault(TestCallbackInterface*);
+
+ already_AddRefed<IndirectlyImplementedInterface> ReceiveConsequentialInterface();
+ void PassConsequentialInterface(IndirectlyImplementedInterface&);
+
+ // Sequence types
+ void GetReadonlySequence(nsTArray<int32_t>&);
+ void GetReadonlySequenceOfDictionaries(JSContext*, nsTArray<Dict>&);
+ void GetReadonlyNullableSequenceOfDictionaries(JSContext*, Nullable<nsTArray<Dict> >&);
+ void GetReadonlyFrozenSequence(JSContext*, nsTArray<Dict>&);
+ void GetReadonlyFrozenNullableSequence(JSContext*, Nullable<nsTArray<Dict>>&);
+ void ReceiveSequence(nsTArray<int32_t>&);
+ void ReceiveNullableSequence(Nullable< nsTArray<int32_t> >&);
+ void ReceiveSequenceOfNullableInts(nsTArray< Nullable<int32_t> >&);
+ void ReceiveNullableSequenceOfNullableInts(Nullable< nsTArray< Nullable<int32_t> > >&);
+ void PassSequence(const Sequence<int32_t> &);
+ void PassNullableSequence(const Nullable< Sequence<int32_t> >&);
+ void PassSequenceOfNullableInts(const Sequence<Nullable<int32_t> >&);
+ void PassOptionalSequenceOfNullableInts(const Optional<Sequence<Nullable<int32_t> > > &);
+ void PassOptionalNullableSequenceOfNullableInts(const Optional<Nullable<Sequence<Nullable<int32_t> > > > &);
+ void ReceiveCastableObjectSequence(nsTArray< RefPtr<TestInterface> > &);
+ void ReceiveCallbackObjectSequence(nsTArray< RefPtr<TestCallbackInterface> > &);
+ void ReceiveNullableCastableObjectSequence(nsTArray< RefPtr<TestInterface> > &);
+ void ReceiveNullableCallbackObjectSequence(nsTArray< RefPtr<TestCallbackInterface> > &);
+ void ReceiveCastableObjectNullableSequence(Nullable< nsTArray< RefPtr<TestInterface> > >&);
+ void ReceiveNullableCastableObjectNullableSequence(Nullable< nsTArray< RefPtr<TestInterface> > >&);
+ void ReceiveWeakCastableObjectSequence(nsTArray<RefPtr<TestInterface>> &);
+ void ReceiveWeakNullableCastableObjectSequence(nsTArray<RefPtr<TestInterface>> &);
+ void ReceiveWeakCastableObjectNullableSequence(Nullable< nsTArray<RefPtr<TestInterface>> >&);
+ void ReceiveWeakNullableCastableObjectNullableSequence(Nullable< nsTArray<RefPtr<TestInterface>> >&);
+ void PassCastableObjectSequence(const Sequence< OwningNonNull<TestInterface> >&);
+ void PassNullableCastableObjectSequence(const Sequence< RefPtr<TestInterface> > &);
+ void PassCastableObjectNullableSequence(const Nullable< Sequence< OwningNonNull<TestInterface> > >&);
+ void PassNullableCastableObjectNullableSequence(const Nullable< Sequence< RefPtr<TestInterface> > >&);
+ void PassOptionalSequence(const Optional<Sequence<int32_t> >&);
+ void PassOptionalSequenceWithDefaultValue(const Sequence<int32_t> &);
+ void PassOptionalNullableSequence(const Optional<Nullable<Sequence<int32_t> > >&);
+ void PassOptionalNullableSequenceWithDefaultValue(const Nullable< Sequence<int32_t> >&);
+ void PassOptionalNullableSequenceWithDefaultValue2(const Nullable< Sequence<int32_t> >&);
+ void PassOptionalObjectSequence(const Optional<Sequence<OwningNonNull<TestInterface> > >&);
+ void PassExternalInterfaceSequence(const Sequence<RefPtr<TestExternalInterface> >&);
+ void PassNullableExternalInterfaceSequence(const Sequence<RefPtr<TestExternalInterface> >&);
+
+ void ReceiveStringSequence(nsTArray<nsString>&);
+ void PassStringSequence(const Sequence<nsString>&);
+
+ void ReceiveByteStringSequence(nsTArray<nsCString>&);
+ void PassByteStringSequence(const Sequence<nsCString>&);
+
+ void ReceiveAnySequence(JSContext*, nsTArray<JS::Value>&);
+ void ReceiveNullableAnySequence(JSContext*, Nullable<nsTArray<JS::Value> >&);
+ void ReceiveAnySequenceSequence(JSContext*, nsTArray<nsTArray<JS::Value> >&);
+
+ void ReceiveObjectSequence(JSContext*, nsTArray<JSObject*>&);
+ void ReceiveNullableObjectSequence(JSContext*, nsTArray<JSObject*>&);
+
+ void PassSequenceOfSequences(const Sequence< Sequence<int32_t> >&);
+ void PassSequenceOfSequencesOfSequences(const Sequence<Sequence<Sequence<int32_t>>>&);
+ void ReceiveSequenceOfSequences(nsTArray< nsTArray<int32_t> >&);
+ void ReceiveSequenceOfSequencesOfSequences(nsTArray<nsTArray<nsTArray<int32_t>>>&);
+
+ // MozMap types
+ void PassMozMap(const MozMap<int32_t> &);
+ void PassNullableMozMap(const Nullable< MozMap<int32_t> >&);
+ void PassMozMapOfNullableInts(const MozMap<Nullable<int32_t> >&);
+ void PassOptionalMozMapOfNullableInts(const Optional<MozMap<Nullable<int32_t> > > &);
+ void PassOptionalNullableMozMapOfNullableInts(const Optional<Nullable<MozMap<Nullable<int32_t> > > > &);
+ void PassCastableObjectMozMap(const MozMap< OwningNonNull<TestInterface> >&);
+ void PassNullableCastableObjectMozMap(const MozMap< RefPtr<TestInterface> > &);
+ void PassCastableObjectNullableMozMap(const Nullable< MozMap< OwningNonNull<TestInterface> > >&);
+ void PassNullableCastableObjectNullableMozMap(const Nullable< MozMap< RefPtr<TestInterface> > >&);
+ void PassOptionalMozMap(const Optional<MozMap<int32_t> >&);
+ void PassOptionalNullableMozMap(const Optional<Nullable<MozMap<int32_t> > >&);
+ void PassOptionalNullableMozMapWithDefaultValue(const Nullable< MozMap<int32_t> >&);
+ void PassOptionalObjectMozMap(const Optional<MozMap<OwningNonNull<TestInterface> > >&);
+ void PassExternalInterfaceMozMap(const MozMap<RefPtr<TestExternalInterface> >&);
+ void PassNullableExternalInterfaceMozMap(const MozMap<RefPtr<TestExternalInterface> >&);
+ void PassStringMozMap(const MozMap<nsString>&);
+ void PassByteStringMozMap(const MozMap<nsCString>&);
+ void PassMozMapOfMozMaps(const MozMap< MozMap<int32_t> >&);
+ void ReceiveMozMap(MozMap<int32_t>&);
+ void ReceiveNullableMozMap(Nullable<MozMap<int32_t>>&);
+ void ReceiveMozMapOfNullableInts(MozMap<Nullable<int32_t>>&);
+ void ReceiveNullableMozMapOfNullableInts(Nullable<MozMap<Nullable<int32_t>>>&);
+ void ReceiveMozMapOfMozMaps(MozMap<MozMap<int32_t>>&);
+ void ReceiveAnyMozMap(JSContext*, MozMap<JS::Value>&);
+
+ // Typed array types
+ void PassArrayBuffer(const ArrayBuffer&);
+ void PassNullableArrayBuffer(const Nullable<ArrayBuffer>&);
+ void PassOptionalArrayBuffer(const Optional<ArrayBuffer>&);
+ void PassOptionalNullableArrayBuffer(const Optional<Nullable<ArrayBuffer> >&);
+ void PassOptionalNullableArrayBufferWithDefaultValue(const Nullable<ArrayBuffer>&);
+ void PassArrayBufferView(const ArrayBufferView&);
+ void PassInt8Array(const Int8Array&);
+ void PassInt16Array(const Int16Array&);
+ void PassInt32Array(const Int32Array&);
+ void PassUint8Array(const Uint8Array&);
+ void PassUint16Array(const Uint16Array&);
+ void PassUint32Array(const Uint32Array&);
+ void PassUint8ClampedArray(const Uint8ClampedArray&);
+ void PassFloat32Array(const Float32Array&);
+ void PassFloat64Array(const Float64Array&);
+ void PassSequenceOfArrayBuffers(const Sequence<ArrayBuffer>&);
+ void PassSequenceOfNullableArrayBuffers(const Sequence<Nullable<ArrayBuffer> >&);
+ void PassMozMapOfArrayBuffers(const MozMap<ArrayBuffer>&);
+ void PassMozMapOfNullableArrayBuffers(const MozMap<Nullable<ArrayBuffer> >&);
+ void PassVariadicTypedArray(const Sequence<Float32Array>&);
+ void PassVariadicNullableTypedArray(const Sequence<Nullable<Float32Array> >&);
+ void ReceiveUint8Array(JSContext*, JS::MutableHandle<JSObject*>);
+ void SetUint8ArrayAttr(const Uint8Array&);
+ void GetUint8ArrayAttr(JSContext*, JS::MutableHandle<JSObject*>);
+
+ // DOMString types
+ void PassString(const nsAString&);
+ void PassNullableString(const nsAString&);
+ void PassOptionalString(const Optional<nsAString>&);
+ void PassOptionalStringWithDefaultValue(const nsAString&);
+ void PassOptionalNullableString(const Optional<nsAString>&);
+ void PassOptionalNullableStringWithDefaultValue(const nsAString&);
+ void PassVariadicString(const Sequence<nsString>&);
+ void ReceiveString(DOMString&);
+
+ // ByteString types
+ void PassByteString(const nsCString&);
+ void PassNullableByteString(const nsCString&);
+ void PassOptionalByteString(const Optional<nsCString>&);
+ void PassOptionalByteStringWithDefaultValue(const nsCString&);
+ void PassOptionalNullableByteString(const Optional<nsCString>&);
+ void PassOptionalNullableByteStringWithDefaultValue(const nsCString&);
+ void PassVariadicByteString(const Sequence<nsCString>&);
+ void PassOptionalUnionByteString(const Optional<ByteStringOrLong>&);
+ void PassOptionalUnionByteStringWithDefaultValue(const ByteStringOrLong&);
+
+ // USVString types
+ void PassUSVS(const nsAString&);
+ void PassNullableUSVS(const nsAString&);
+ void PassOptionalUSVS(const Optional<nsAString>&);
+ void PassOptionalUSVSWithDefaultValue(const nsAString&);
+ void PassOptionalNullableUSVS(const Optional<nsAString>&);
+ void PassOptionalNullableUSVSWithDefaultValue(const nsAString&);
+ void PassVariadicUSVS(const Sequence<nsString>&);
+ void ReceiveUSVS(DOMString&);
+
+ // Enumerated types
+ void PassEnum(TestEnum);
+ void PassNullableEnum(const Nullable<TestEnum>&);
+ void PassOptionalEnum(const Optional<TestEnum>&);
+ void PassEnumWithDefault(TestEnum);
+ void PassOptionalNullableEnum(const Optional<Nullable<TestEnum> >&);
+ void PassOptionalNullableEnumWithDefaultValue(const Nullable<TestEnum>&);
+ void PassOptionalNullableEnumWithDefaultValue2(const Nullable<TestEnum>&);
+ TestEnum ReceiveEnum();
+ Nullable<TestEnum> ReceiveNullableEnum();
+ TestEnum EnumAttribute();
+ TestEnum ReadonlyEnumAttribute();
+ void SetEnumAttribute(TestEnum);
+
+ // Callback types
+ void PassCallback(TestCallback&);
+ void PassNullableCallback(TestCallback*);
+ void PassOptionalCallback(const Optional<OwningNonNull<TestCallback> >&);
+ void PassOptionalNullableCallback(const Optional<RefPtr<TestCallback> >&);
+ void PassOptionalNullableCallbackWithDefaultValue(TestCallback*);
+ already_AddRefed<TestCallback> ReceiveCallback();
+ already_AddRefed<TestCallback> ReceiveNullableCallback();
+ void PassNullableTreatAsNullCallback(TestTreatAsNullCallback*);
+ void PassOptionalNullableTreatAsNullCallback(const Optional<RefPtr<TestTreatAsNullCallback> >&);
+ void PassOptionalNullableTreatAsNullCallbackWithDefaultValue(TestTreatAsNullCallback*);
+ void SetTreatAsNullCallback(TestTreatAsNullCallback&);
+ already_AddRefed<TestTreatAsNullCallback> TreatAsNullCallback();
+ void SetNullableTreatAsNullCallback(TestTreatAsNullCallback*);
+ already_AddRefed<TestTreatAsNullCallback> GetNullableTreatAsNullCallback();
+
+ void ForceCallbackGeneration(TestIntegerReturn&,
+ TestNullableIntegerReturn&,
+ TestBooleanReturn&,
+ TestFloatReturn&,
+ TestStringReturn&,
+ TestEnumReturn&,
+ TestInterfaceReturn&,
+ TestNullableInterfaceReturn&,
+ TestExternalInterfaceReturn&,
+ TestNullableExternalInterfaceReturn&,
+ TestCallbackInterfaceReturn&,
+ TestNullableCallbackInterfaceReturn&,
+ TestCallbackReturn&,
+ TestNullableCallbackReturn&,
+ TestObjectReturn&,
+ TestNullableObjectReturn&,
+ TestTypedArrayReturn&,
+ TestNullableTypedArrayReturn&,
+ TestSequenceReturn&,
+ TestNullableSequenceReturn&,
+ TestIntegerArguments&,
+ TestInterfaceArguments&,
+ TestStringEnumArguments&,
+ TestObjectArguments&,
+ TestOptionalArguments&);
+
+ // Any types
+ void PassAny(JSContext*, JS::Handle<JS::Value>);
+ void PassVariadicAny(JSContext*, const Sequence<JS::Value>&);
+ void PassOptionalAny(JSContext*, JS::Handle<JS::Value>);
+ void PassAnyDefaultNull(JSContext*, JS::Handle<JS::Value>);
+ void PassSequenceOfAny(JSContext*, const Sequence<JS::Value>&);
+ void PassNullableSequenceOfAny(JSContext*, const Nullable<Sequence<JS::Value> >&);
+ void PassOptionalSequenceOfAny(JSContext*, const Optional<Sequence<JS::Value> >&);
+ void PassOptionalNullableSequenceOfAny(JSContext*, const Optional<Nullable<Sequence<JS::Value> > >&);
+ void PassOptionalSequenceOfAnyWithDefaultValue(JSContext*, const Nullable<Sequence<JS::Value> >&);
+ void PassSequenceOfSequenceOfAny(JSContext*, const Sequence<Sequence<JS::Value> >&);
+ void PassSequenceOfNullableSequenceOfAny(JSContext*, const Sequence<Nullable<Sequence<JS::Value> > >&);
+ void PassNullableSequenceOfNullableSequenceOfAny(JSContext*, const Nullable<Sequence<Nullable<Sequence<JS::Value> > > >&);
+ void PassOptionalNullableSequenceOfNullableSequenceOfAny(JSContext*, const Optional<Nullable<Sequence<Nullable<Sequence<JS::Value> > > > >&);
+ void PassMozMapOfAny(JSContext*, const MozMap<JS::Value>&);
+ void PassNullableMozMapOfAny(JSContext*, const Nullable<MozMap<JS::Value> >&);
+ void PassOptionalMozMapOfAny(JSContext*, const Optional<MozMap<JS::Value> >&);
+ void PassOptionalNullableMozMapOfAny(JSContext*, const Optional<Nullable<MozMap<JS::Value> > >&);
+ void PassOptionalMozMapOfAnyWithDefaultValue(JSContext*, const Nullable<MozMap<JS::Value> >&);
+ void PassMozMapOfMozMapOfAny(JSContext*, const MozMap<MozMap<JS::Value> >&);
+ void PassMozMapOfNullableMozMapOfAny(JSContext*, const MozMap<Nullable<MozMap<JS::Value> > >&);
+ void PassNullableMozMapOfNullableMozMapOfAny(JSContext*, const Nullable<MozMap<Nullable<MozMap<JS::Value> > > >&);
+ void PassOptionalNullableMozMapOfNullableMozMapOfAny(JSContext*, const Optional<Nullable<MozMap<Nullable<MozMap<JS::Value>>>>>&);
+ void PassOptionalNullableMozMapOfNullableSequenceOfAny(JSContext*, const Optional<Nullable<MozMap<Nullable<Sequence<JS::Value>>>>>&);
+ void PassOptionalNullableSequenceOfNullableMozMapOfAny(JSContext*, const Optional<Nullable<Sequence<Nullable<MozMap<JS::Value>>>>>&);
+ void ReceiveAny(JSContext*, JS::MutableHandle<JS::Value>);
+
+ // object types
+ void PassObject(JSContext*, JS::Handle<JSObject*>);
+ void PassVariadicObject(JSContext*, const Sequence<JSObject*>&);
+ void PassNullableObject(JSContext*, JS::Handle<JSObject*>);
+ void PassVariadicNullableObject(JSContext*, const Sequence<JSObject*>&);
+ void PassOptionalObject(JSContext*, const Optional<JS::Handle<JSObject*> >&);
+ void PassOptionalNullableObject(JSContext*, const Optional<JS::Handle<JSObject*> >&);
+ void PassOptionalNullableObjectWithDefaultValue(JSContext*, JS::Handle<JSObject*>);
+ void PassSequenceOfObject(JSContext*, const Sequence<JSObject*>&);
+ void PassSequenceOfNullableObject(JSContext*, const Sequence<JSObject*>&);
+ void PassNullableSequenceOfObject(JSContext*, const Nullable<Sequence<JSObject*> >&);
+ void PassOptionalNullableSequenceOfNullableSequenceOfObject(JSContext*, const Optional<Nullable<Sequence<Nullable<Sequence<JSObject*> > > > >&);
+ void PassOptionalNullableSequenceOfNullableSequenceOfNullableObject(JSContext*, const Optional<Nullable<Sequence<Nullable<Sequence<JSObject*> > > > >&);
+ void PassMozMapOfObject(JSContext*, const MozMap<JSObject*>&);
+ void ReceiveObject(JSContext*, JS::MutableHandle<JSObject*>);
+ void ReceiveNullableObject(JSContext*, JS::MutableHandle<JSObject*>);
+
+ // Union types
+ void PassUnion(JSContext*, const ObjectOrLong& arg);
+ void PassUnionWithNullable(JSContext* cx, const ObjectOrNullOrLong& arg)
+ {
+ OwningObjectOrLong returnValue;
+ if (arg.IsNull()) {
+ } else if (arg.IsObject()) {
+ JS::Rooted<JSObject*> obj(cx, arg.GetAsObject());
+ JS_GetClass(obj);
+ returnValue.SetAsObject() = obj;
+ } else {
+ int32_t i = arg.GetAsLong();
+ i += 1;
+ returnValue.SetAsLong() = i;
+ }
+ }
+#ifdef DEBUG
+ void PassUnion2(const LongOrBoolean& arg);
+ void PassUnion3(JSContext*, const ObjectOrLongOrBoolean& arg);
+ void PassUnion4(const NodeOrLongOrBoolean& arg);
+ void PassUnion5(JSContext*, const ObjectOrBoolean& arg);
+ void PassUnion6(JSContext*, const ObjectOrString& arg);
+ void PassUnion7(JSContext*, const ObjectOrStringOrLong& arg);
+ void PassUnion8(JSContext*, const ObjectOrStringOrBoolean& arg);
+ void PassUnion9(JSContext*, const ObjectOrStringOrLongOrBoolean& arg);
+ void PassUnion10(const EventInitOrLong& arg);
+ void PassUnion11(JSContext*, const CustomEventInitOrLong& arg);
+ void PassUnion12(const EventInitOrLong& arg);
+ void PassUnion13(JSContext*, const ObjectOrLongOrNull& arg);
+ void PassUnion14(JSContext*, const ObjectOrLongOrNull& arg);
+ void PassUnion15(const LongSequenceOrLong&);
+ void PassUnion16(const Optional<LongSequenceOrLong>&);
+ void PassUnion17(const LongSequenceOrNullOrLong&);
+ void PassUnion18(JSContext*, const ObjectSequenceOrLong&);
+ void PassUnion19(JSContext*, const Optional<ObjectSequenceOrLong>&);
+ void PassUnion20(JSContext*, const ObjectSequenceOrLong&);
+ void PassUnion21(const LongMozMapOrLong&);
+ void PassUnion22(JSContext*, const ObjectMozMapOrLong&);
+ void PassUnion23(const ImageDataSequenceOrLong&);
+ void PassUnion24(const ImageDataOrNullSequenceOrLong&);
+ void PassUnion25(const ImageDataSequenceSequenceOrLong&);
+ void PassUnion26(const ImageDataOrNullSequenceSequenceOrLong&);
+ void PassUnion27(const StringSequenceOrEventInit&);
+ void PassUnion28(const EventInitOrStringSequence&);
+ void PassUnionWithCallback(const EventHandlerNonNullOrNullOrLong& arg);
+ void PassUnionWithByteString(const ByteStringOrLong&);
+ void PassUnionWithMozMap(const StringMozMapOrString&);
+ void PassUnionWithMozMapAndSequence(const StringMozMapOrStringSequence&);
+ void PassUnionWithSequenceAndMozMap(const StringSequenceOrStringMozMap&);
+ void PassUnionWithUSVS(const USVStringOrLong&);
+#endif
+ void PassNullableUnion(JSContext*, const Nullable<ObjectOrLong>&);
+ void PassOptionalUnion(JSContext*, const Optional<ObjectOrLong>&);
+ void PassOptionalNullableUnion(JSContext*, const Optional<Nullable<ObjectOrLong> >&);
+ void PassOptionalNullableUnionWithDefaultValue(JSContext*, const Nullable<ObjectOrLong>&);
+ //void PassUnionWithInterfaces(const TestInterfaceOrTestExternalInterface& arg);
+ //void PassUnionWithInterfacesAndNullable(const TestInterfaceOrNullOrTestExternalInterface& arg);
+ void PassUnionWithArrayBuffer(const ArrayBufferOrLong&);
+ void PassUnionWithString(JSContext*, const StringOrObject&);
+ void PassUnionWithEnum(JSContext*, const SupportedTypeOrObject&);
+ //void PassUnionWithCallback(JSContext*, const TestCallbackOrLong&);
+ void PassUnionWithObject(JSContext*, const ObjectOrLong&);
+
+ void PassUnionWithDefaultValue1(const DoubleOrString& arg);
+ void PassUnionWithDefaultValue2(const DoubleOrString& arg);
+ void PassUnionWithDefaultValue3(const DoubleOrString& arg);
+ void PassUnionWithDefaultValue4(const FloatOrString& arg);
+ void PassUnionWithDefaultValue5(const FloatOrString& arg);
+ void PassUnionWithDefaultValue6(const FloatOrString& arg);
+ void PassUnionWithDefaultValue7(const UnrestrictedDoubleOrString& arg);
+ void PassUnionWithDefaultValue8(const UnrestrictedDoubleOrString& arg);
+ void PassUnionWithDefaultValue9(const UnrestrictedDoubleOrString& arg);
+ void PassUnionWithDefaultValue10(const UnrestrictedDoubleOrString& arg);
+ void PassUnionWithDefaultValue11(const UnrestrictedFloatOrString& arg);
+ void PassUnionWithDefaultValue12(const UnrestrictedFloatOrString& arg);
+ void PassUnionWithDefaultValue13(const UnrestrictedFloatOrString& arg);
+ void PassUnionWithDefaultValue14(const DoubleOrByteString& arg);
+ void PassUnionWithDefaultValue15(const DoubleOrByteString& arg);
+ void PassUnionWithDefaultValue16(const DoubleOrByteString& arg);
+ void PassUnionWithDefaultValue17(const DoubleOrSupportedType& arg);
+ void PassUnionWithDefaultValue18(const DoubleOrSupportedType& arg);
+ void PassUnionWithDefaultValue19(const DoubleOrSupportedType& arg);
+
+ void PassNullableUnionWithDefaultValue1(const Nullable<DoubleOrString>& arg);
+ void PassNullableUnionWithDefaultValue2(const Nullable<DoubleOrString>& arg);
+ void PassNullableUnionWithDefaultValue3(const Nullable<DoubleOrString>& arg);
+ void PassNullableUnionWithDefaultValue4(const Nullable<FloatOrString>& arg);
+ void PassNullableUnionWithDefaultValue5(const Nullable<FloatOrString>& arg);
+ void PassNullableUnionWithDefaultValue6(const Nullable<FloatOrString>& arg);
+ void PassNullableUnionWithDefaultValue7(const Nullable<UnrestrictedDoubleOrString>& arg);
+ void PassNullableUnionWithDefaultValue8(const Nullable<UnrestrictedDoubleOrString>& arg);
+ void PassNullableUnionWithDefaultValue9(const Nullable<UnrestrictedDoubleOrString>& arg);
+ void PassNullableUnionWithDefaultValue10(const Nullable<UnrestrictedFloatOrString>& arg);
+ void PassNullableUnionWithDefaultValue11(const Nullable<UnrestrictedFloatOrString>& arg);
+ void PassNullableUnionWithDefaultValue12(const Nullable<UnrestrictedFloatOrString>& arg);
+ void PassNullableUnionWithDefaultValue13(const Nullable<DoubleOrByteString>& arg);
+ void PassNullableUnionWithDefaultValue14(const Nullable<DoubleOrByteString>& arg);
+ void PassNullableUnionWithDefaultValue15(const Nullable<DoubleOrByteString>& arg);
+ void PassNullableUnionWithDefaultValue16(const Nullable<DoubleOrByteString>& arg);
+ void PassNullableUnionWithDefaultValue17(const Nullable<DoubleOrSupportedType>& arg);
+ void PassNullableUnionWithDefaultValue18(const Nullable<DoubleOrSupportedType>& arg);
+ void PassNullableUnionWithDefaultValue19(const Nullable<DoubleOrSupportedType>& arg);
+ void PassNullableUnionWithDefaultValue20(const Nullable<DoubleOrSupportedType>& arg);
+
+ void PassSequenceOfUnions(const Sequence<OwningCanvasPatternOrCanvasGradient>&);
+ void PassSequenceOfUnions2(JSContext*, const Sequence<OwningObjectOrLong>&);
+ void PassVariadicUnion(const Sequence<OwningCanvasPatternOrCanvasGradient>&);
+
+ void PassSequenceOfNullableUnions(const Sequence<Nullable<OwningCanvasPatternOrCanvasGradient>>&);
+ void PassVariadicNullableUnion(const Sequence<Nullable<OwningCanvasPatternOrCanvasGradient>>&);
+ void PassMozMapOfUnions(const MozMap<OwningCanvasPatternOrCanvasGradient>&);
+ void PassMozMapOfUnions2(JSContext*, const MozMap<OwningObjectOrLong>&);
+
+ void ReceiveUnion(OwningCanvasPatternOrCanvasGradient&);
+ void ReceiveUnion2(JSContext*, OwningObjectOrLong&);
+ void ReceiveUnionContainingNull(OwningCanvasPatternOrNullOrCanvasGradient&);
+ void ReceiveNullableUnion(Nullable<OwningCanvasPatternOrCanvasGradient>&);
+ void ReceiveNullableUnion2(JSContext*, Nullable<OwningObjectOrLong>&);
+ void GetWritableUnion(OwningCanvasPatternOrCanvasGradient&);
+ void SetWritableUnion(const CanvasPatternOrCanvasGradient&);
+ void GetWritableUnionContainingNull(OwningCanvasPatternOrNullOrCanvasGradient&);
+ void SetWritableUnionContainingNull(const CanvasPatternOrNullOrCanvasGradient&);
+ void GetWritableNullableUnion(Nullable<OwningCanvasPatternOrCanvasGradient>&);
+ void SetWritableNullableUnion(const Nullable<CanvasPatternOrCanvasGradient>&);
+
+ // Date types
+ void PassDate(Date);
+ void PassNullableDate(const Nullable<Date>&);
+ void PassOptionalDate(const Optional<Date>&);
+ void PassOptionalNullableDate(const Optional<Nullable<Date> >&);
+ void PassOptionalNullableDateWithDefaultValue(const Nullable<Date>&);
+ void PassDateSequence(const Sequence<Date>&);
+ void PassDateMozMap(const MozMap<Date>&);
+ void PassNullableDateSequence(const Sequence<Nullable<Date> >&);
+ Date ReceiveDate();
+ Nullable<Date> ReceiveNullableDate();
+
+ // Promise types
+ void PassPromise(Promise&);
+ void PassNullablePromise(Promise*);
+ void PassOptionalPromise(const Optional<OwningNonNull<Promise>>&);
+ void PassOptionalNullablePromise(const Optional<RefPtr<Promise>>&);
+ void PassOptionalNullablePromiseWithDefaultValue(Promise*);
+ void PassPromiseSequence(const Sequence<OwningNonNull<Promise>>&);
+ void PassPromiseMozMap(const MozMap<RefPtr<Promise>>&);
+ void PassNullablePromiseSequence(const Sequence<RefPtr<Promise>> &);
+ Promise* ReceivePromise();
+ already_AddRefed<Promise> ReceiveAddrefedPromise();
+
+ // binaryNames tests
+ void MethodRenamedTo();
+ void OtherMethodRenamedTo();
+ void MethodRenamedTo(int8_t);
+ int8_t AttributeGetterRenamedTo();
+ int8_t AttributeRenamedTo();
+ void SetAttributeRenamedTo(int8_t);
+ int8_t OtherAttributeRenamedTo();
+ void SetOtherAttributeRenamedTo(int8_t);
+
+ // Dictionary tests
+ void PassDictionary(JSContext*, const Dict&);
+ void PassDictionary2(JSContext*, const Dict&);
+ void GetReadonlyDictionary(JSContext*, Dict&);
+ void GetReadonlyNullableDictionary(JSContext*, Nullable<Dict>&);
+ void GetWritableDictionary(JSContext*, Dict&);
+ void SetWritableDictionary(JSContext*, const Dict&);
+ void GetReadonlyFrozenDictionary(JSContext*, Dict&);
+ void GetReadonlyFrozenNullableDictionary(JSContext*, Nullable<Dict>&);
+ void GetWritableFrozenDictionary(JSContext*, Dict&);
+ void SetWritableFrozenDictionary(JSContext*, const Dict&);
+ void ReceiveDictionary(JSContext*, Dict&);
+ void ReceiveNullableDictionary(JSContext*, Nullable<Dict>&);
+ void PassOtherDictionary(const GrandparentDict&);
+ void PassSequenceOfDictionaries(JSContext*, const Sequence<Dict>&);
+ void PassMozMapOfDictionaries(const MozMap<GrandparentDict>&);
+ void PassDictionaryOrLong(JSContext*, const Dict&);
+ void PassDictionaryOrLong(int32_t);
+ void PassDictContainingDict(JSContext*, const DictContainingDict&);
+ void PassDictContainingSequence(JSContext*, const DictContainingSequence&);
+ void ReceiveDictContainingSequence(JSContext*, DictContainingSequence&);
+ void PassVariadicDictionary(JSContext*, const Sequence<Dict>&);
+
+ // Typedefs
+ void ExerciseTypedefInterfaces1(TestInterface&);
+ already_AddRefed<TestInterface> ExerciseTypedefInterfaces2(TestInterface*);
+ void ExerciseTypedefInterfaces3(TestInterface&);
+
+ // Deprecated methods and attributes
+ int8_t DeprecatedAttribute();
+ int8_t SetDeprecatedAttribute(int8_t);
+ int8_t DeprecatedMethod();
+ int8_t DeprecatedMethodWithContext(JSContext*, const JS::Value&);
+
+ // Static methods and attributes
+ static void StaticMethod(const GlobalObject&, bool);
+ static void StaticMethodWithContext(const GlobalObject&, const JS::Value&);
+ static bool StaticAttribute(const GlobalObject&);
+ static void SetStaticAttribute(const GlobalObject&, bool);
+ static void Assert(const GlobalObject&, bool);
+
+ // Deprecated static methods and attributes
+ static int8_t StaticDeprecatedAttribute(const GlobalObject&);
+ static int8_t SetStaticDeprecatedAttribute(const GlobalObject&, int8_t);
+ static int8_t StaticDeprecatedMethod(const GlobalObject&);
+ static int8_t StaticDeprecatedMethodWithContext(const GlobalObject&, const JS::Value&);
+
+ // Overload resolution tests
+ bool Overload1(TestInterface&);
+ TestInterface* Overload1(const nsAString&, TestInterface&);
+ void Overload2(TestInterface&);
+ void Overload2(JSContext*, const Dict&);
+ void Overload2(bool);
+ void Overload2(const nsAString&);
+ void Overload2(Date);
+ void Overload3(TestInterface&);
+ void Overload3(const TestCallback&);
+ void Overload3(bool);
+ void Overload4(TestInterface&);
+ void Overload4(TestCallbackInterface&);
+ void Overload4(const nsAString&);
+ void Overload5(int32_t);
+ void Overload5(TestEnum);
+ void Overload6(int32_t);
+ void Overload6(bool);
+ void Overload7(int32_t);
+ void Overload7(bool);
+ void Overload7(const nsCString&);
+ void Overload8(int32_t);
+ void Overload8(TestInterface&);
+ void Overload9(const Nullable<int32_t>&);
+ void Overload9(const nsAString&);
+ void Overload10(const Nullable<int32_t>&);
+ void Overload10(JSContext*, JS::Handle<JSObject*>);
+ void Overload11(int32_t);
+ void Overload11(const nsAString&);
+ void Overload12(int32_t);
+ void Overload12(const Nullable<bool>&);
+ void Overload13(const Nullable<int32_t>&);
+ void Overload13(bool);
+ void Overload14(const Optional<int32_t>&);
+ void Overload14(TestInterface&);
+ void Overload15(int32_t);
+ void Overload15(const Optional<NonNull<TestInterface> >&);
+ void Overload16(int32_t);
+ void Overload16(const Optional<TestInterface*>&);
+ void Overload17(const Sequence<int32_t>&);
+ void Overload17(const MozMap<int32_t>&);
+ void Overload18(const MozMap<nsString>&);
+ void Overload18(const Sequence<nsString>&);
+ void Overload19(const Sequence<int32_t>&);
+ void Overload19(JSContext*, const Dict&);
+ void Overload20(JSContext*, const Dict&);
+ void Overload20(const Sequence<int32_t>&);
+
+ // Variadic handling
+ void PassVariadicThirdArg(const nsAString&, int32_t,
+ const Sequence<OwningNonNull<TestInterface> >&);
+
+ // Conditionally exposed methods/attributes
+ bool Prefable1();
+ bool Prefable2();
+ bool Prefable3();
+ bool Prefable4();
+ bool Prefable5();
+ bool Prefable6();
+ bool Prefable7();
+ bool Prefable8();
+ bool Prefable9();
+ void Prefable10();
+ void Prefable11();
+ bool Prefable12();
+ void Prefable13();
+ bool Prefable14();
+ bool Prefable15();
+ bool Prefable16();
+ void Prefable17();
+ void Prefable18();
+ void Prefable19();
+ void Prefable20();
+ void Prefable21();
+ void Prefable22();
+ void Prefable23();
+ void Prefable24();
+
+ // Conditionally exposed methods/attributes involving [SecureContext]
+ bool ConditionalOnSecureContext1();
+ bool ConditionalOnSecureContext2();
+ bool ConditionalOnSecureContext3();
+ bool ConditionalOnSecureContext4();
+ void ConditionalOnSecureContext5();
+ void ConditionalOnSecureContext6();
+ void ConditionalOnSecureContext7();
+ void ConditionalOnSecureContext8();
+
+ // Miscellania
+ int32_t AttrWithLenientThis();
+ void SetAttrWithLenientThis(int32_t);
+ uint32_t UnforgeableAttr();
+ uint32_t UnforgeableAttr2();
+ uint32_t UnforgeableMethod();
+ uint32_t UnforgeableMethod2();
+ void Stringify(nsString&);
+ void PassRenamedInterface(nsRenamedInterface&);
+ TestInterface* PutForwardsAttr();
+ TestInterface* PutForwardsAttr2();
+ TestInterface* PutForwardsAttr3();
+ void GetJsonifierShouldSkipThis(JSContext*, JS::MutableHandle<JS::Value>);
+ void SetJsonifierShouldSkipThis(JSContext*, JS::Rooted<JS::Value>&);
+ TestParentInterface* JsonifierShouldSkipThis2();
+ void SetJsonifierShouldSkipThis2(TestParentInterface&);
+ TestCallbackInterface* JsonifierShouldSkipThis3();
+ void SetJsonifierShouldSkipThis3(TestCallbackInterface&);
+ void ThrowingMethod(ErrorResult& aRv);
+ bool GetThrowingAttr(ErrorResult& aRv) const;
+ void SetThrowingAttr(bool arg, ErrorResult& aRv);
+ bool GetThrowingGetterAttr(ErrorResult& aRv) const;
+ void SetThrowingGetterAttr(bool arg);
+ bool ThrowingSetterAttr() const;
+ void SetThrowingSetterAttr(bool arg, ErrorResult& aRv);
+ void NeedsSubjectPrincipalMethod(nsIPrincipal&);
+ bool NeedsSubjectPrincipalAttr(nsIPrincipal&);
+ void SetNeedsSubjectPrincipalAttr(bool, nsIPrincipal&);
+ void NeedsCallerTypeMethod(CallerType);
+ bool NeedsCallerTypeAttr(CallerType);
+ void SetNeedsCallerTypeAttr(bool, CallerType);
+ int16_t LegacyCall(const JS::Value&, uint32_t, TestInterface&);
+ void PassArgsWithDefaults(JSContext*, const Optional<int32_t>&,
+ TestInterface*, const Dict&, double,
+ const Optional<float>&);
+
+ void SetDashed_attribute(int8_t);
+ int8_t Dashed_attribute();
+ void Dashed_method();
+
+ // Methods and properties imported via "implements"
+ bool ImplementedProperty();
+ void SetImplementedProperty(bool);
+ void ImplementedMethod();
+ bool ImplementedParentProperty();
+ void SetImplementedParentProperty(bool);
+ void ImplementedParentMethod();
+ bool IndirectlyImplementedProperty();
+ void SetIndirectlyImplementedProperty(bool);
+ void IndirectlyImplementedMethod();
+ uint32_t DiamondImplementedProperty();
+
+ // Test EnforceRange/Clamp
+ void DontEnforceRangeOrClamp(int8_t);
+ void DoEnforceRange(int8_t);
+ void DoClamp(int8_t);
+ void SetEnforcedByte(int8_t);
+ int8_t EnforcedByte();
+ void SetClampedByte(int8_t);
+ int8_t ClampedByte();
+
+private:
+ // We add signatures here that _could_ start matching if the codegen
+ // got data types wrong. That way if it ever does we'll have a call
+ // to these private deleted methods and compilation will fail.
+ void SetReadonlyByte(int8_t) = delete;
+ template<typename T>
+ void SetWritableByte(T) = delete;
+ template<typename T>
+ void PassByte(T) = delete;
+ void PassNullableByte(Nullable<int8_t>&) = delete;
+ template<typename T>
+ void PassOptionalByte(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalByteWithDefault(T) = delete;
+ void PassVariadicByte(Sequence<int8_t>&) = delete;
+
+ void SetReadonlyShort(int16_t) = delete;
+ template<typename T>
+ void SetWritableShort(T) = delete;
+ template<typename T>
+ void PassShort(T) = delete;
+ template<typename T>
+ void PassOptionalShort(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalShortWithDefault(T) = delete;
+
+ void SetReadonlyLong(int32_t) = delete;
+ template<typename T>
+ void SetWritableLong(T) = delete;
+ template<typename T>
+ void PassLong(T) = delete;
+ template<typename T>
+ void PassOptionalLong(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalLongWithDefault(T) = delete;
+
+ void SetReadonlyLongLong(int64_t) = delete;
+ template<typename T>
+ void SetWritableLongLong(T) = delete;
+ template<typename T>
+ void PassLongLong(T) = delete;
+ template<typename T>
+ void PassOptionalLongLong(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalLongLongWithDefault(T) = delete;
+
+ void SetReadonlyOctet(uint8_t) = delete;
+ template<typename T>
+ void SetWritableOctet(T) = delete;
+ template<typename T>
+ void PassOctet(T) = delete;
+ template<typename T>
+ void PassOptionalOctet(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalOctetWithDefault(T) = delete;
+
+ void SetReadonlyUnsignedShort(uint16_t) = delete;
+ template<typename T>
+ void SetWritableUnsignedShort(T) = delete;
+ template<typename T>
+ void PassUnsignedShort(T) = delete;
+ template<typename T>
+ void PassOptionalUnsignedShort(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalUnsignedShortWithDefault(T) = delete;
+
+ void SetReadonlyUnsignedLong(uint32_t) = delete;
+ template<typename T>
+ void SetWritableUnsignedLong(T) = delete;
+ template<typename T>
+ void PassUnsignedLong(T) = delete;
+ template<typename T>
+ void PassOptionalUnsignedLong(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalUnsignedLongWithDefault(T) = delete;
+
+ void SetReadonlyUnsignedLongLong(uint64_t) = delete;
+ template<typename T>
+ void SetWritableUnsignedLongLong(T) = delete;
+ template<typename T>
+ void PassUnsignedLongLong(T) = delete;
+ template<typename T>
+ void PassOptionalUnsignedLongLong(const Optional<T>&) = delete;
+ template<typename T>
+ void PassOptionalUnsignedLongLongWithDefault(T) = delete;
+
+ // Enforce that only const things are passed for sequences
+ void PassSequence(Sequence<int32_t> &) = delete;
+ void PassNullableSequence(Nullable< Sequence<int32_t> >&) = delete;
+ void PassOptionalNullableSequenceWithDefaultValue(Nullable< Sequence<int32_t> >&) = delete;
+ void PassSequenceOfAny(JSContext*, Sequence<JS::Value>&) = delete;
+ void PassNullableSequenceOfAny(JSContext*, Nullable<Sequence<JS::Value> >&) = delete;
+ void PassOptionalSequenceOfAny(JSContext*, Optional<Sequence<JS::Value> >&) = delete;
+ void PassOptionalNullableSequenceOfAny(JSContext*, Optional<Nullable<Sequence<JS::Value> > >&) = delete;
+ void PassOptionalSequenceOfAnyWithDefaultValue(JSContext*, Nullable<Sequence<JS::Value> >&) = delete;
+ void PassSequenceOfSequenceOfAny(JSContext*, Sequence<Sequence<JS::Value> >&) = delete;
+ void PassSequenceOfNullableSequenceOfAny(JSContext*, Sequence<Nullable<Sequence<JS::Value> > >&) = delete;
+ void PassNullableSequenceOfNullableSequenceOfAny(JSContext*, Nullable<Sequence<Nullable<Sequence<JS::Value> > > >&) = delete;
+ void PassOptionalNullableSequenceOfNullableSequenceOfAny(JSContext*, Optional<Nullable<Sequence<Nullable<Sequence<JS::Value> > > > >&) = delete;
+ void PassSequenceOfObject(JSContext*, Sequence<JSObject*>&) = delete;
+ void PassSequenceOfNullableObject(JSContext*, Sequence<JSObject*>&) = delete;
+ void PassOptionalNullableSequenceOfNullableSequenceOfObject(JSContext*, Optional<Nullable<Sequence<Nullable<Sequence<JSObject*> > > > >&) = delete;
+ void PassOptionalNullableSequenceOfNullableSequenceOfNullableObject(JSContext*, Optional<Nullable<Sequence<Nullable<Sequence<JSObject*> > > > >&) = delete;
+
+ // Enforce that only const things are passed for optional
+ void PassOptionalByte(Optional<int8_t>&) = delete;
+ void PassOptionalNullableByte(Optional<Nullable<int8_t> >&) = delete;
+ void PassOptionalShort(Optional<int16_t>&) = delete;
+ void PassOptionalLong(Optional<int32_t>&) = delete;
+ void PassOptionalLongLong(Optional<int64_t>&) = delete;
+ void PassOptionalOctet(Optional<uint8_t>&) = delete;
+ void PassOptionalUnsignedShort(Optional<uint16_t>&) = delete;
+ void PassOptionalUnsignedLong(Optional<uint32_t>&) = delete;
+ void PassOptionalUnsignedLongLong(Optional<uint64_t>&) = delete;
+ void PassOptionalSelf(Optional<TestInterface*> &) = delete;
+ void PassOptionalNonNullSelf(Optional<NonNull<TestInterface> >&) = delete;
+ void PassOptionalOther(Optional<IndirectlyImplementedInterface*>&);
+ void PassOptionalNonNullOther(Optional<NonNull<IndirectlyImplementedInterface> >&);
+ void PassOptionalExternal(Optional<TestExternalInterface*>&) = delete;
+ void PassOptionalNonNullExternal(Optional<TestExternalInterface*>&) = delete;
+ void PassOptionalSequence(Optional<Sequence<int32_t> >&) = delete;
+ void PassOptionalNullableSequence(Optional<Nullable<Sequence<int32_t> > >&) = delete;
+ void PassOptionalObjectSequence(Optional<Sequence<OwningNonNull<TestInterface> > >&) = delete;
+ void PassOptionalArrayBuffer(Optional<ArrayBuffer>&) = delete;
+ void PassOptionalNullableArrayBuffer(Optional<ArrayBuffer*>&) = delete;
+ void PassOptionalEnum(Optional<TestEnum>&) = delete;
+ void PassOptionalCallback(JSContext*, Optional<OwningNonNull<TestCallback> >&) = delete;
+ void PassOptionalNullableCallback(JSContext*, Optional<RefPtr<TestCallback> >&) = delete;
+ void PassOptionalAny(Optional<JS::Handle<JS::Value> >&) = delete;
+
+ // And test that string stuff is always const
+ void PassString(nsAString&) = delete;
+ void PassNullableString(nsAString&) = delete;
+ void PassOptionalString(Optional<nsAString>&) = delete;
+ void PassOptionalStringWithDefaultValue(nsAString&) = delete;
+ void PassOptionalNullableString(Optional<nsAString>&) = delete;
+ void PassOptionalNullableStringWithDefaultValue(nsAString&) = delete;
+ void PassVariadicString(Sequence<nsString>&) = delete;
+
+ // cstrings should be const as well
+ void PassByteString(nsCString&) = delete;
+ void PassNullableByteString(nsCString&) = delete;
+ void PassOptionalByteString(Optional<nsCString>&) = delete;
+ void PassOptionalByteStringWithDefaultValue(nsCString&) = delete;
+ void PassOptionalNullableByteString(Optional<nsCString>&) = delete;
+ void PassOptionalNullableByteStringWithDefaultValue(nsCString&) = delete;
+ void PassVariadicByteString(Sequence<nsCString>&) = delete;
+
+ // Make sure dictionary arguments are always const
+ void PassDictionary(JSContext*, Dict&) = delete;
+ void PassOtherDictionary(GrandparentDict&) = delete;
+ void PassSequenceOfDictionaries(JSContext*, Sequence<Dict>&) = delete;
+ void PassDictionaryOrLong(JSContext*, Dict&) = delete;
+ void PassDictContainingDict(JSContext*, DictContainingDict&) = delete;
+ void PassDictContainingSequence(DictContainingSequence&) = delete;
+
+ // Make sure various nullable things are always const
+ void PassNullableEnum(Nullable<TestEnum>&) = delete;
+
+ // Make sure unions are always const
+ void PassUnion(JSContext*, ObjectOrLong& arg) = delete;
+ void PassUnionWithNullable(JSContext*, ObjectOrNullOrLong& arg) = delete;
+ void PassNullableUnion(JSContext*, Nullable<ObjectOrLong>&) = delete;
+ void PassOptionalUnion(JSContext*, Optional<ObjectOrLong>&) = delete;
+ void PassOptionalNullableUnion(JSContext*, Optional<Nullable<ObjectOrLong> >&) = delete;
+ void PassOptionalNullableUnionWithDefaultValue(JSContext*, Nullable<ObjectOrLong>&) = delete;
+
+ // Make sure various date stuff is const as needed
+ void PassNullableDate(Nullable<Date>&) = delete;
+ void PassOptionalDate(Optional<Date>&) = delete;
+ void PassOptionalNullableDate(Optional<Nullable<Date> >&) = delete;
+ void PassOptionalNullableDateWithDefaultValue(Nullable<Date>&) = delete;
+ void PassDateSequence(Sequence<Date>&) = delete;
+ void PassNullableDateSequence(Sequence<Nullable<Date> >&) = delete;
+
+ // Make sure variadics are const as needed
+ void PassVariadicAny(JSContext*, Sequence<JS::Value>&) = delete;
+ void PassVariadicObject(JSContext*, Sequence<JSObject*>&) = delete;
+ void PassVariadicNullableObject(JSContext*, Sequence<JSObject*>&) = delete;
+
+ // Ensure NonNull does not leak in
+ void PassSelf(NonNull<TestInterface>&) = delete;
+ void PassSelf(OwningNonNull<TestInterface>&) = delete;
+ void PassSelf(const NonNull<TestInterface>&) = delete;
+ void PassSelf(const OwningNonNull<TestInterface>&) = delete;
+ void PassOther(NonNull<IndirectlyImplementedInterface>&) = delete;
+ void PassOther(const NonNull<IndirectlyImplementedInterface>&) = delete;
+ void PassOther(OwningNonNull<IndirectlyImplementedInterface>&) = delete;
+ void PassOther(const OwningNonNull<IndirectlyImplementedInterface>&) = delete;
+ void PassCallbackInterface(OwningNonNull<TestCallbackInterface>&) = delete;
+ void PassCallbackInterface(const OwningNonNull<TestCallbackInterface>&) = delete;
+ void PassCallbackInterface(NonNull<TestCallbackInterface>&) = delete;
+ void PassCallbackInterface(const NonNull<TestCallbackInterface>&) = delete;
+ void PassCallback(OwningNonNull<TestCallback>&) = delete;
+ void PassCallback(const OwningNonNull<TestCallback>&) = delete;
+ void PassCallback(NonNull<TestCallback>&) = delete;
+ void PassCallback(const NonNull<TestCallback>&) = delete;
+ void PassString(const NonNull<nsAString>&) = delete;
+ void PassString(NonNull<nsAString>&) = delete;
+ void PassString(const OwningNonNull<nsAString>&) = delete;
+ void PassString(OwningNonNull<nsAString>&) = delete;
+};
+
+class TestIndexedGetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ uint32_t IndexedGetter(uint32_t, bool&);
+ uint32_t IndexedGetter(uint32_t&) = delete;
+ uint32_t Item(uint32_t&);
+ uint32_t Item(uint32_t, bool&) = delete;
+ uint32_t Length();
+ void LegacyCall(JS::Handle<JS::Value>);
+};
+
+class TestNamedGetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ void NamedGetter(const nsAString&, bool&, nsAString&);
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestIndexedGetterAndSetterAndNamedGetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ void NamedGetter(const nsAString&, bool&, nsAString&);
+ void GetSupportedNames(nsTArray<nsString>&);
+ int32_t IndexedGetter(uint32_t, bool&);
+ void IndexedSetter(uint32_t, int32_t);
+ uint32_t Length();
+};
+
+class TestIndexedAndNamedGetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ uint32_t IndexedGetter(uint32_t, bool&);
+ void NamedGetter(const nsAString&, bool&, nsAString&);
+ void NamedItem(const nsAString&, nsAString&);
+ uint32_t Length();
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestIndexedSetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ void IndexedSetter(uint32_t, const nsAString&);
+ void IndexedGetter(uint32_t, bool&, nsString&);
+ uint32_t Length();
+ void SetItem(uint32_t, const nsAString&);
+};
+
+class TestNamedSetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ void NamedSetter(const nsAString&, TestIndexedSetterInterface&);
+ TestIndexedSetterInterface* NamedGetter(const nsAString&, bool&);
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestIndexedAndNamedSetterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ void IndexedSetter(uint32_t, TestIndexedSetterInterface&);
+ TestIndexedSetterInterface* IndexedGetter(uint32_t, bool&);
+ uint32_t Length();
+ void NamedSetter(const nsAString&, TestIndexedSetterInterface&);
+ TestIndexedSetterInterface* NamedGetter(const nsAString&, bool&);
+ void SetNamedItem(const nsAString&, TestIndexedSetterInterface&);
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestIndexedAndNamedGetterAndSetterInterface : public TestIndexedSetterInterface
+{
+public:
+ uint32_t IndexedGetter(uint32_t, bool&);
+ uint32_t Item(uint32_t);
+ void NamedGetter(const nsAString&, bool&, nsAString&);
+ void NamedItem(const nsAString&, nsAString&);
+ void IndexedSetter(uint32_t, int32_t&);
+ void IndexedSetter(uint32_t, const nsAString&) = delete;
+ void NamedSetter(const nsAString&, const nsAString&);
+ void Stringify(nsAString&);
+ uint32_t Length();
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestCppKeywordNamedMethodsInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ bool Continue();
+ bool Delete();
+ int32_t Volatile();
+};
+
+class TestNamedDeleterInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ void NamedDeleter(const nsAString&, bool&);
+ long NamedGetter(const nsAString&, bool&);
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestNamedDeleterWithRetvalInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+
+ bool NamedDeleter(const nsAString&, bool&);
+ bool NamedDeleter(const nsAString&) = delete;
+ long NamedGetter(const nsAString&, bool&);
+ bool DelNamedItem(const nsAString&);
+ bool DelNamedItem(const nsAString&, bool&) = delete;
+ void GetSupportedNames(nsTArray<nsString>&);
+};
+
+class TestParentInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ virtual nsISupports* GetParentObject();
+};
+
+class TestChildInterface : public TestParentInterface
+{
+};
+
+class TestDeprecatedInterface : public nsISupports, public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ static
+ already_AddRefed<TestDeprecatedInterface>
+ Constructor(const GlobalObject&, ErrorResult&);
+
+ static void AlsoDeprecated(const GlobalObject&);
+
+ virtual nsISupports* GetParentObject();
+};
+
+class TestInterfaceWithPromiseConstructorArg : public nsISupports, public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ static
+ already_AddRefed<TestInterfaceWithPromiseConstructorArg>
+ Constructor(const GlobalObject&, Promise&, ErrorResult&);
+
+ virtual nsISupports* GetParentObject();
+};
+
+class TestSecureContextInterface : public nsISupports, public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ static
+ already_AddRefed<TestSecureContextInterface>
+ Constructor(const GlobalObject&, ErrorResult&);
+
+ static void AlsoSecureContext(const GlobalObject&);
+
+ virtual nsISupports* GetParentObject();
+};
+
+class TestNamespace {
+public:
+ static bool Foo(const GlobalObject&);
+ static int32_t Bar(const GlobalObject&);
+ static void Baz(const GlobalObject&);
+};
+
+class TestRenamedNamespace {
+};
+
+class TestProtoObjectHackedNamespace {
+};
+
+class TestWorkerExposedInterface : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // We need a GetParentObject to make binding codegen happy
+ nsISupports* GetParentObject();
+
+ void NeedsSubjectPrincipalMethod(Maybe<nsIPrincipal*>);
+ bool NeedsSubjectPrincipalAttr(Maybe<nsIPrincipal*>);
+ void SetNeedsSubjectPrincipalAttr(bool, Maybe<nsIPrincipal*>);
+ void NeedsCallerTypeMethod(CallerType);
+ bool NeedsCallerTypeAttr(CallerType);
+ void SetNeedsCallerTypeAttr(bool, CallerType);
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* TestBindingHeader_h */
diff --git a/dom/bindings/test/TestCImplementedInterface.h b/dom/bindings/test/TestCImplementedInterface.h
new file mode 100644
index 000000000..64b5c9954
--- /dev/null
+++ b/dom/bindings/test/TestCImplementedInterface.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef TestCImplementedInterface_h
+#define TestCImplementedInterface_h
+
+#include "../TestJSImplGenBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class TestCImplementedInterface : public TestJSImplInterface
+{
+public:
+ TestCImplementedInterface(JS::Handle<JSObject*> aJSImpl,
+ nsIGlobalObject* aParent)
+ : TestJSImplInterface(aJSImpl, aParent)
+ {}
+};
+
+class TestCImplementedInterface2 : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ explicit TestCImplementedInterface2(nsIGlobalObject* aParent)
+ {}
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestCImplementedInterface2)
+
+ // We need a GetParentObject to make binding codegen happy
+ nsISupports* GetParentObject();
+};
+
+
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // TestCImplementedInterface_h
diff --git a/dom/bindings/test/TestCodeGen.webidl b/dom/bindings/test/TestCodeGen.webidl
new file mode 100644
index 000000000..4fb9be270
--- /dev/null
+++ b/dom/bindings/test/TestCodeGen.webidl
@@ -0,0 +1,1264 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+typedef long myLong;
+typedef TestInterface AnotherNameForTestInterface;
+typedef TestInterface? NullableTestInterface;
+typedef CustomEventInit TestDictionaryTypedef;
+
+interface TestExternalInterface;
+
+[Pref="xyz"]
+interface TestRenamedInterface {
+};
+
+callback interface TestCallbackInterface {
+ readonly attribute long foo;
+ attribute DOMString bar;
+ void doSomething();
+ long doSomethingElse(DOMString arg, TestInterface otherArg);
+ void doSequenceLongArg(sequence<long> arg);
+ void doSequenceStringArg(sequence<DOMString> arg);
+ void doMozMapLongArg(MozMap<long> arg);
+ sequence<long> getSequenceOfLong();
+ sequence<TestInterface> getSequenceOfInterfaces();
+ sequence<TestInterface>? getNullableSequenceOfInterfaces();
+ sequence<TestInterface?> getSequenceOfNullableInterfaces();
+ sequence<TestInterface?>? getNullableSequenceOfNullableInterfaces();
+ sequence<TestCallbackInterface> getSequenceOfCallbackInterfaces();
+ sequence<TestCallbackInterface>? getNullableSequenceOfCallbackInterfaces();
+ sequence<TestCallbackInterface?> getSequenceOfNullableCallbackInterfaces();
+ sequence<TestCallbackInterface?>? getNullableSequenceOfNullableCallbackInterfaces();
+ MozMap<long> getMozMapOfLong();
+ Dict? getDictionary();
+ void passArrayBuffer(ArrayBuffer arg);
+ void passNullableArrayBuffer(ArrayBuffer? arg);
+ void passOptionalArrayBuffer(optional ArrayBuffer arg);
+ void passOptionalNullableArrayBuffer(optional ArrayBuffer? arg);
+ void passOptionalNullableArrayBufferWithDefaultValue(optional ArrayBuffer? arg= null);
+ void passArrayBufferView(ArrayBufferView arg);
+ void passInt8Array(Int8Array arg);
+ void passInt16Array(Int16Array arg);
+ void passInt32Array(Int32Array arg);
+ void passUint8Array(Uint8Array arg);
+ void passUint16Array(Uint16Array arg);
+ void passUint32Array(Uint32Array arg);
+ void passUint8ClampedArray(Uint8ClampedArray arg);
+ void passFloat32Array(Float32Array arg);
+ void passFloat64Array(Float64Array arg);
+ void passSequenceOfArrayBuffers(sequence<ArrayBuffer> arg);
+ void passSequenceOfNullableArrayBuffers(sequence<ArrayBuffer?> arg);
+ void passVariadicTypedArray(Float32Array... arg);
+ void passVariadicNullableTypedArray(Float32Array?... arg);
+ Uint8Array receiveUint8Array();
+ attribute Uint8Array uint8ArrayAttr;
+ Promise<void> receivePromise();
+};
+
+callback interface TestSingleOperationCallbackInterface {
+ TestInterface doSomething(short arg, sequence<double> anotherArg);
+};
+
+enum TestEnum {
+ "1",
+ "a",
+ "b"
+};
+
+callback TestCallback = void();
+[TreatNonCallableAsNull] callback TestTreatAsNullCallback = void();
+
+// Callback return value tests
+callback TestIntegerReturn = long();
+callback TestNullableIntegerReturn = long?();
+callback TestBooleanReturn = boolean();
+callback TestFloatReturn = float();
+callback TestStringReturn = DOMString(long arg);
+callback TestEnumReturn = TestEnum();
+callback TestInterfaceReturn = TestInterface();
+callback TestNullableInterfaceReturn = TestInterface?();
+callback TestExternalInterfaceReturn = TestExternalInterface();
+callback TestNullableExternalInterfaceReturn = TestExternalInterface?();
+callback TestCallbackInterfaceReturn = TestCallbackInterface();
+callback TestNullableCallbackInterfaceReturn = TestCallbackInterface?();
+callback TestCallbackReturn = TestCallback();
+callback TestNullableCallbackReturn = TestCallback?();
+callback TestObjectReturn = object();
+callback TestNullableObjectReturn = object?();
+callback TestTypedArrayReturn = ArrayBuffer();
+callback TestNullableTypedArrayReturn = ArrayBuffer?();
+callback TestSequenceReturn = sequence<boolean>();
+callback TestNullableSequenceReturn = sequence<boolean>?();
+// Callback argument tests
+callback TestIntegerArguments = sequence<long>(long arg1, long? arg2,
+ sequence<long> arg3,
+ sequence<long?>? arg4);
+callback TestInterfaceArguments = void(TestInterface arg1, TestInterface? arg2,
+ TestExternalInterface arg3,
+ TestExternalInterface? arg4,
+ TestCallbackInterface arg5,
+ TestCallbackInterface? arg6,
+ sequence<TestInterface> arg7,
+ sequence<TestInterface?>? arg8,
+ sequence<TestExternalInterface> arg9,
+ sequence<TestExternalInterface?>? arg10,
+ sequence<TestCallbackInterface> arg11,
+ sequence<TestCallbackInterface?>? arg12);
+callback TestStringEnumArguments = void(DOMString myString, DOMString? nullString,
+ TestEnum myEnum);
+callback TestObjectArguments = void(object anObj, object? anotherObj,
+ ArrayBuffer buf, ArrayBuffer? buf2);
+callback TestOptionalArguments = void(optional DOMString aString,
+ optional object something,
+ optional sequence<TestInterface> aSeq,
+ optional TestInterface? anInterface,
+ optional TestInterface anotherInterface,
+ optional long aLong);
+// If you add a new test callback, add it to the forceCallbackGeneration
+// method on TestInterface so it actually gets tested.
+
+TestInterface implements ImplementedInterface;
+
+// This interface is only for use in the constructor below
+interface OnlyForUseInConstructor {
+};
+
+[Constructor,
+ Constructor(DOMString str),
+ Constructor(unsigned long num, boolean? boolArg),
+ Constructor(TestInterface? iface),
+ Constructor(long arg1, IndirectlyImplementedInterface iface),
+ Constructor(Date arg1),
+ Constructor(ArrayBuffer arrayBuf),
+ Constructor(Uint8Array typedArr),
+ // Constructor(long arg1, long arg2, (TestInterface or OnlyForUseInConstructor) arg3),
+ NamedConstructor=Test,
+ NamedConstructor=Test(DOMString str),
+ NamedConstructor=Test2(DictForConstructor dict, any any1, object obj1,
+ object? obj2, sequence<Dict> seq, optional any any2,
+ optional object obj3, optional object? obj4),
+ NamedConstructor=Test3((long or MozMap<any>) arg1)
+ ]
+interface TestInterface {
+ // Integer types
+ // XXXbz add tests for throwing versions of all the integer stuff
+ readonly attribute byte readonlyByte;
+ attribute byte writableByte;
+ void passByte(byte arg);
+ byte receiveByte();
+ void passOptionalByte(optional byte arg);
+ void passOptionalByteBeforeRequired(optional byte arg1, byte arg2);
+ void passOptionalByteWithDefault(optional byte arg = 0);
+ void passOptionalByteWithDefaultBeforeRequired(optional byte arg1 = 0, byte arg2);
+ void passNullableByte(byte? arg);
+ void passOptionalNullableByte(optional byte? arg);
+ void passVariadicByte(byte... arg);
+ [StoreInSlot, Pure]
+ readonly attribute byte cachedByte;
+ [StoreInSlot, Constant]
+ readonly attribute byte cachedConstantByte;
+ [StoreInSlot, Pure]
+ attribute byte cachedWritableByte;
+ [Affects=Nothing]
+ attribute byte sideEffectFreeByte;
+ [Affects=Nothing, DependsOn=DOMState]
+ attribute byte domDependentByte;
+ [Affects=Nothing, DependsOn=Nothing]
+ readonly attribute byte constantByte;
+ [DependsOn=DeviceState, Affects=Nothing]
+ readonly attribute byte deviceStateDependentByte;
+ [Affects=Nothing]
+ byte returnByteSideEffectFree();
+ [Affects=Nothing, DependsOn=DOMState]
+ byte returnDOMDependentByte();
+ [Affects=Nothing, DependsOn=Nothing]
+ byte returnConstantByte();
+ [DependsOn=DeviceState, Affects=Nothing]
+ byte returnDeviceStateDependentByte();
+
+ [UnsafeInPrerendering]
+ void unsafePrerenderMethod();
+ [UnsafeInPrerendering]
+ attribute long unsafePrerenderWritable;
+ [UnsafeInPrerendering]
+ readonly attribute long unsafePrerenderReadonly;
+ readonly attribute short readonlyShort;
+ attribute short writableShort;
+ void passShort(short arg);
+ short receiveShort();
+ void passOptionalShort(optional short arg);
+ void passOptionalShortWithDefault(optional short arg = 5);
+
+ readonly attribute long readonlyLong;
+ attribute long writableLong;
+ void passLong(long arg);
+ long receiveLong();
+ void passOptionalLong(optional long arg);
+ void passOptionalLongWithDefault(optional long arg = 7);
+
+ readonly attribute long long readonlyLongLong;
+ attribute long long writableLongLong;
+ void passLongLong(long long arg);
+ long long receiveLongLong();
+ void passOptionalLongLong(optional long long arg);
+ void passOptionalLongLongWithDefault(optional long long arg = -12);
+
+ readonly attribute octet readonlyOctet;
+ attribute octet writableOctet;
+ void passOctet(octet arg);
+ octet receiveOctet();
+ void passOptionalOctet(optional octet arg);
+ void passOptionalOctetWithDefault(optional octet arg = 19);
+
+ readonly attribute unsigned short readonlyUnsignedShort;
+ attribute unsigned short writableUnsignedShort;
+ void passUnsignedShort(unsigned short arg);
+ unsigned short receiveUnsignedShort();
+ void passOptionalUnsignedShort(optional unsigned short arg);
+ void passOptionalUnsignedShortWithDefault(optional unsigned short arg = 2);
+
+ readonly attribute unsigned long readonlyUnsignedLong;
+ attribute unsigned long writableUnsignedLong;
+ void passUnsignedLong(unsigned long arg);
+ unsigned long receiveUnsignedLong();
+ void passOptionalUnsignedLong(optional unsigned long arg);
+ void passOptionalUnsignedLongWithDefault(optional unsigned long arg = 6);
+
+ readonly attribute unsigned long long readonlyUnsignedLongLong;
+ attribute unsigned long long writableUnsignedLongLong;
+ void passUnsignedLongLong(unsigned long long arg);
+ unsigned long long receiveUnsignedLongLong();
+ void passOptionalUnsignedLongLong(optional unsigned long long arg);
+ void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
+
+ attribute float writableFloat;
+ attribute unrestricted float writableUnrestrictedFloat;
+ attribute float? writableNullableFloat;
+ attribute unrestricted float? writableNullableUnrestrictedFloat;
+ attribute double writableDouble;
+ attribute unrestricted double writableUnrestrictedDouble;
+ attribute double? writableNullableDouble;
+ attribute unrestricted double? writableNullableUnrestrictedDouble;
+ void passFloat(float arg1, unrestricted float arg2,
+ float? arg3, unrestricted float? arg4,
+ double arg5, unrestricted double arg6,
+ double? arg7, unrestricted double? arg8,
+ sequence<float> arg9, sequence<unrestricted float> arg10,
+ sequence<float?> arg11, sequence<unrestricted float?> arg12,
+ sequence<double> arg13, sequence<unrestricted double> arg14,
+ sequence<double?> arg15, sequence<unrestricted double?> arg16);
+ [LenientFloat]
+ void passLenientFloat(float arg1, unrestricted float arg2,
+ float? arg3, unrestricted float? arg4,
+ double arg5, unrestricted double arg6,
+ double? arg7, unrestricted double? arg8,
+ sequence<float> arg9,
+ sequence<unrestricted float> arg10,
+ sequence<float?> arg11,
+ sequence<unrestricted float?> arg12,
+ sequence<double> arg13,
+ sequence<unrestricted double> arg14,
+ sequence<double?> arg15,
+ sequence<unrestricted double?> arg16);
+ [LenientFloat]
+ attribute float lenientFloatAttr;
+ [LenientFloat]
+ attribute double lenientDoubleAttr;
+
+ void passUnrestricted(optional unrestricted float arg1 = 0,
+ optional unrestricted float arg2 = Infinity,
+ optional unrestricted float arg3 = -Infinity,
+ optional unrestricted float arg4 = NaN,
+ optional unrestricted double arg5 = 0,
+ optional unrestricted double arg6 = Infinity,
+ optional unrestricted double arg7 = -Infinity,
+ optional unrestricted double arg8 = NaN);
+
+ // Castable interface types
+ // XXXbz add tests for throwing versions of all the castable interface stuff
+ TestInterface receiveSelf();
+ TestInterface? receiveNullableSelf();
+ TestInterface receiveWeakSelf();
+ TestInterface? receiveWeakNullableSelf();
+ void passSelf(TestInterface arg);
+ void passNullableSelf(TestInterface? arg);
+ attribute TestInterface nonNullSelf;
+ attribute TestInterface? nullableSelf;
+ [Cached, Pure]
+ readonly attribute TestInterface cachedSelf;
+ // Optional arguments
+ void passOptionalSelf(optional TestInterface? arg);
+ void passOptionalNonNullSelf(optional TestInterface arg);
+ void passOptionalSelfWithDefault(optional TestInterface? arg = null);
+
+ // Non-wrapper-cache interface types
+ [NewObject]
+ TestNonWrapperCacheInterface receiveNonWrapperCacheInterface();
+ [NewObject]
+ TestNonWrapperCacheInterface? receiveNullableNonWrapperCacheInterface();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface> receiveNonWrapperCacheInterfaceSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface?> receiveNullableNonWrapperCacheInterfaceSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface>? receiveNonWrapperCacheInterfaceNullableSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface?>? receiveNullableNonWrapperCacheInterfaceNullableSequence();
+
+ // Non-castable interface types
+ IndirectlyImplementedInterface receiveOther();
+ IndirectlyImplementedInterface? receiveNullableOther();
+ IndirectlyImplementedInterface receiveWeakOther();
+ IndirectlyImplementedInterface? receiveWeakNullableOther();
+ void passOther(IndirectlyImplementedInterface arg);
+ void passNullableOther(IndirectlyImplementedInterface? arg);
+ attribute IndirectlyImplementedInterface nonNullOther;
+ attribute IndirectlyImplementedInterface? nullableOther;
+ // Optional arguments
+ void passOptionalOther(optional IndirectlyImplementedInterface? arg);
+ void passOptionalNonNullOther(optional IndirectlyImplementedInterface arg);
+ void passOptionalOtherWithDefault(optional IndirectlyImplementedInterface? arg = null);
+
+ // External interface types
+ TestExternalInterface receiveExternal();
+ TestExternalInterface? receiveNullableExternal();
+ TestExternalInterface receiveWeakExternal();
+ TestExternalInterface? receiveWeakNullableExternal();
+ void passExternal(TestExternalInterface arg);
+ void passNullableExternal(TestExternalInterface? arg);
+ attribute TestExternalInterface nonNullExternal;
+ attribute TestExternalInterface? nullableExternal;
+ // Optional arguments
+ void passOptionalExternal(optional TestExternalInterface? arg);
+ void passOptionalNonNullExternal(optional TestExternalInterface arg);
+ void passOptionalExternalWithDefault(optional TestExternalInterface? arg = null);
+
+ // Callback interface types
+ TestCallbackInterface receiveCallbackInterface();
+ TestCallbackInterface? receiveNullableCallbackInterface();
+ TestCallbackInterface receiveWeakCallbackInterface();
+ TestCallbackInterface? receiveWeakNullableCallbackInterface();
+ void passCallbackInterface(TestCallbackInterface arg);
+ void passNullableCallbackInterface(TestCallbackInterface? arg);
+ attribute TestCallbackInterface nonNullCallbackInterface;
+ attribute TestCallbackInterface? nullableCallbackInterface;
+ // Optional arguments
+ void passOptionalCallbackInterface(optional TestCallbackInterface? arg);
+ void passOptionalNonNullCallbackInterface(optional TestCallbackInterface arg);
+ void passOptionalCallbackInterfaceWithDefault(optional TestCallbackInterface? arg = null);
+
+ // Miscellaneous interface tests
+ IndirectlyImplementedInterface receiveConsequentialInterface();
+ void passConsequentialInterface(IndirectlyImplementedInterface arg);
+
+ // Sequence types
+ [Cached, Pure]
+ readonly attribute sequence<long> readonlySequence;
+ [Cached, Pure]
+ readonly attribute sequence<Dict> readonlySequenceOfDictionaries;
+ [Cached, Pure]
+ readonly attribute sequence<Dict>? readonlyNullableSequenceOfDictionaries;
+ [Cached, Pure, Frozen]
+ readonly attribute sequence<Dict> readonlyFrozenSequence;
+ [Cached, Pure, Frozen]
+ readonly attribute sequence<Dict>? readonlyFrozenNullableSequence;
+ sequence<long> receiveSequence();
+ sequence<long>? receiveNullableSequence();
+ sequence<long?> receiveSequenceOfNullableInts();
+ sequence<long?>? receiveNullableSequenceOfNullableInts();
+ void passSequence(sequence<long> arg);
+ void passNullableSequence(sequence<long>? arg);
+ void passSequenceOfNullableInts(sequence<long?> arg);
+ void passOptionalSequenceOfNullableInts(optional sequence<long?> arg);
+ void passOptionalNullableSequenceOfNullableInts(optional sequence<long?>? arg);
+ sequence<TestInterface> receiveCastableObjectSequence();
+ sequence<TestCallbackInterface> receiveCallbackObjectSequence();
+ sequence<TestInterface?> receiveNullableCastableObjectSequence();
+ sequence<TestCallbackInterface?> receiveNullableCallbackObjectSequence();
+ sequence<TestInterface>? receiveCastableObjectNullableSequence();
+ sequence<TestInterface?>? receiveNullableCastableObjectNullableSequence();
+ sequence<TestInterface> receiveWeakCastableObjectSequence();
+ sequence<TestInterface?> receiveWeakNullableCastableObjectSequence();
+ sequence<TestInterface>? receiveWeakCastableObjectNullableSequence();
+ sequence<TestInterface?>? receiveWeakNullableCastableObjectNullableSequence();
+ void passCastableObjectSequence(sequence<TestInterface> arg);
+ void passNullableCastableObjectSequence(sequence<TestInterface?> arg);
+ void passCastableObjectNullableSequence(sequence<TestInterface>? arg);
+ void passNullableCastableObjectNullableSequence(sequence<TestInterface?>? arg);
+ void passOptionalSequence(optional sequence<long> arg);
+ void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
+ void passOptionalNullableSequence(optional sequence<long>? arg);
+ void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
+ void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
+ void passOptionalObjectSequence(optional sequence<TestInterface> arg);
+ void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
+ void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);
+
+ sequence<DOMString> receiveStringSequence();
+ void passStringSequence(sequence<DOMString> arg);
+
+ sequence<ByteString> receiveByteStringSequence();
+ void passByteStringSequence(sequence<ByteString> arg);
+
+ sequence<any> receiveAnySequence();
+ sequence<any>? receiveNullableAnySequence();
+ sequence<sequence<any>> receiveAnySequenceSequence();
+
+ sequence<object> receiveObjectSequence();
+ sequence<object?> receiveNullableObjectSequence();
+
+ void passSequenceOfSequences(sequence<sequence<long>> arg);
+ void passSequenceOfSequencesOfSequences(sequence<sequence<sequence<long>>> arg);
+ sequence<sequence<long>> receiveSequenceOfSequences();
+ sequence<sequence<sequence<long>>> receiveSequenceOfSequencesOfSequences();
+
+ // MozMap types
+ void passMozMap(MozMap<long> arg);
+ void passNullableMozMap(MozMap<long>? arg);
+ void passMozMapOfNullableInts(MozMap<long?> arg);
+ void passOptionalMozMapOfNullableInts(optional MozMap<long?> arg);
+ void passOptionalNullableMozMapOfNullableInts(optional MozMap<long?>? arg);
+ void passCastableObjectMozMap(MozMap<TestInterface> arg);
+ void passNullableCastableObjectMozMap(MozMap<TestInterface?> arg);
+ void passCastableObjectNullableMozMap(MozMap<TestInterface>? arg);
+ void passNullableCastableObjectNullableMozMap(MozMap<TestInterface?>? arg);
+ void passOptionalMozMap(optional MozMap<long> arg);
+ void passOptionalNullableMozMap(optional MozMap<long>? arg);
+ void passOptionalNullableMozMapWithDefaultValue(optional MozMap<long>? arg = null);
+ void passOptionalObjectMozMap(optional MozMap<TestInterface> arg);
+ void passExternalInterfaceMozMap(MozMap<TestExternalInterface> arg);
+ void passNullableExternalInterfaceMozMap(MozMap<TestExternalInterface?> arg);
+ void passStringMozMap(MozMap<DOMString> arg);
+ void passByteStringMozMap(MozMap<ByteString> arg);
+ void passMozMapOfMozMaps(MozMap<MozMap<long>> arg);
+ MozMap<long> receiveMozMap();
+ MozMap<long>? receiveNullableMozMap();
+ MozMap<long?> receiveMozMapOfNullableInts();
+ MozMap<long?>? receiveNullableMozMapOfNullableInts();
+ MozMap<MozMap<long>> receiveMozMapOfMozMaps();
+ MozMap<any> receiveAnyMozMap();
+
+ // Typed array types
+ void passArrayBuffer(ArrayBuffer arg);
+ void passNullableArrayBuffer(ArrayBuffer? arg);
+ void passOptionalArrayBuffer(optional ArrayBuffer arg);
+ void passOptionalNullableArrayBuffer(optional ArrayBuffer? arg);
+ void passOptionalNullableArrayBufferWithDefaultValue(optional ArrayBuffer? arg= null);
+ void passArrayBufferView(ArrayBufferView arg);
+ void passInt8Array(Int8Array arg);
+ void passInt16Array(Int16Array arg);
+ void passInt32Array(Int32Array arg);
+ void passUint8Array(Uint8Array arg);
+ void passUint16Array(Uint16Array arg);
+ void passUint32Array(Uint32Array arg);
+ void passUint8ClampedArray(Uint8ClampedArray arg);
+ void passFloat32Array(Float32Array arg);
+ void passFloat64Array(Float64Array arg);
+ void passSequenceOfArrayBuffers(sequence<ArrayBuffer> arg);
+ void passSequenceOfNullableArrayBuffers(sequence<ArrayBuffer?> arg);
+ void passMozMapOfArrayBuffers(MozMap<ArrayBuffer> arg);
+ void passMozMapOfNullableArrayBuffers(MozMap<ArrayBuffer?> arg);
+ void passVariadicTypedArray(Float32Array... arg);
+ void passVariadicNullableTypedArray(Float32Array?... arg);
+ Uint8Array receiveUint8Array();
+ attribute Uint8Array uint8ArrayAttr;
+
+ // DOMString types
+ void passString(DOMString arg);
+ void passNullableString(DOMString? arg);
+ void passOptionalString(optional DOMString arg);
+ void passOptionalStringWithDefaultValue(optional DOMString arg = "abc");
+ void passOptionalNullableString(optional DOMString? arg);
+ void passOptionalNullableStringWithDefaultValue(optional DOMString? arg = null);
+ void passVariadicString(DOMString... arg);
+ DOMString receiveString();
+
+ // ByteString types
+ void passByteString(ByteString arg);
+ void passNullableByteString(ByteString? arg);
+ void passOptionalByteString(optional ByteString arg);
+ void passOptionalByteStringWithDefaultValue(optional ByteString arg = "abc");
+ void passOptionalNullableByteString(optional ByteString? arg);
+ void passOptionalNullableByteStringWithDefaultValue(optional ByteString? arg = null);
+ void passVariadicByteString(ByteString... arg);
+ void passOptionalUnionByteString(optional (ByteString or long) arg);
+ void passOptionalUnionByteStringWithDefaultValue(optional (ByteString or long) arg = "abc");
+
+ // USVString types
+ void passUSVS(USVString arg);
+ void passNullableUSVS(USVString? arg);
+ void passOptionalUSVS(optional USVString arg);
+ void passOptionalUSVSWithDefaultValue(optional USVString arg = "abc");
+ void passOptionalNullableUSVS(optional USVString? arg);
+ void passOptionalNullableUSVSWithDefaultValue(optional USVString? arg = null);
+ void passVariadicUSVS(USVString... arg);
+ USVString receiveUSVS();
+
+ // Enumerated types
+ void passEnum(TestEnum arg);
+ void passNullableEnum(TestEnum? arg);
+ void passOptionalEnum(optional TestEnum arg);
+ void passEnumWithDefault(optional TestEnum arg = "a");
+ void passOptionalNullableEnum(optional TestEnum? arg);
+ void passOptionalNullableEnumWithDefaultValue(optional TestEnum? arg = null);
+ void passOptionalNullableEnumWithDefaultValue2(optional TestEnum? arg = "a");
+ TestEnum receiveEnum();
+ TestEnum? receiveNullableEnum();
+ attribute TestEnum enumAttribute;
+ readonly attribute TestEnum readonlyEnumAttribute;
+
+ // Callback types
+ void passCallback(TestCallback arg);
+ void passNullableCallback(TestCallback? arg);
+ void passOptionalCallback(optional TestCallback arg);
+ void passOptionalNullableCallback(optional TestCallback? arg);
+ void passOptionalNullableCallbackWithDefaultValue(optional TestCallback? arg = null);
+ TestCallback receiveCallback();
+ TestCallback? receiveNullableCallback();
+ void passNullableTreatAsNullCallback(TestTreatAsNullCallback? arg);
+ void passOptionalNullableTreatAsNullCallback(optional TestTreatAsNullCallback? arg);
+ void passOptionalNullableTreatAsNullCallbackWithDefaultValue(optional TestTreatAsNullCallback? arg = null);
+ attribute TestTreatAsNullCallback treatAsNullCallback;
+ attribute TestTreatAsNullCallback? nullableTreatAsNullCallback;
+
+ // Force code generation of the various test callbacks we have.
+ void forceCallbackGeneration(TestIntegerReturn arg1,
+ TestNullableIntegerReturn arg2,
+ TestBooleanReturn arg3,
+ TestFloatReturn arg4,
+ TestStringReturn arg5,
+ TestEnumReturn arg6,
+ TestInterfaceReturn arg7,
+ TestNullableInterfaceReturn arg8,
+ TestExternalInterfaceReturn arg9,
+ TestNullableExternalInterfaceReturn arg10,
+ TestCallbackInterfaceReturn arg11,
+ TestNullableCallbackInterfaceReturn arg12,
+ TestCallbackReturn arg13,
+ TestNullableCallbackReturn arg14,
+ TestObjectReturn arg15,
+ TestNullableObjectReturn arg16,
+ TestTypedArrayReturn arg17,
+ TestNullableTypedArrayReturn arg18,
+ TestSequenceReturn arg19,
+ TestNullableSequenceReturn arg20,
+ TestIntegerArguments arg21,
+ TestInterfaceArguments arg22,
+ TestStringEnumArguments arg23,
+ TestObjectArguments arg24,
+ TestOptionalArguments arg25);
+
+ // Any types
+ void passAny(any arg);
+ void passVariadicAny(any... arg);
+ void passOptionalAny(optional any arg);
+ void passAnyDefaultNull(optional any arg = null);
+ void passSequenceOfAny(sequence<any> arg);
+ void passNullableSequenceOfAny(sequence<any>? arg);
+ void passOptionalSequenceOfAny(optional sequence<any> arg);
+ void passOptionalNullableSequenceOfAny(optional sequence<any>? arg);
+ void passOptionalSequenceOfAnyWithDefaultValue(optional sequence<any>? arg = null);
+ void passSequenceOfSequenceOfAny(sequence<sequence<any>> arg);
+ void passSequenceOfNullableSequenceOfAny(sequence<sequence<any>?> arg);
+ void passNullableSequenceOfNullableSequenceOfAny(sequence<sequence<any>?>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfAny(optional sequence<sequence<any>?>? arg);
+ void passMozMapOfAny(MozMap<any> arg);
+ void passNullableMozMapOfAny(MozMap<any>? arg);
+ void passOptionalMozMapOfAny(optional MozMap<any> arg);
+ void passOptionalNullableMozMapOfAny(optional MozMap<any>? arg);
+ void passOptionalMozMapOfAnyWithDefaultValue(optional MozMap<any>? arg = null);
+ void passMozMapOfMozMapOfAny(MozMap<MozMap<any>> arg);
+ void passMozMapOfNullableMozMapOfAny(MozMap<MozMap<any>?> arg);
+ void passNullableMozMapOfNullableMozMapOfAny(MozMap<MozMap<any>?>? arg);
+ void passOptionalNullableMozMapOfNullableMozMapOfAny(optional MozMap<MozMap<any>?>? arg);
+ void passOptionalNullableMozMapOfNullableSequenceOfAny(optional MozMap<sequence<any>?>? arg);
+ void passOptionalNullableSequenceOfNullableMozMapOfAny(optional sequence<MozMap<any>?>? arg);
+ any receiveAny();
+
+ // object types
+ void passObject(object arg);
+ void passVariadicObject(object... arg);
+ void passNullableObject(object? arg);
+ void passVariadicNullableObject(object... arg);
+ void passOptionalObject(optional object arg);
+ void passOptionalNullableObject(optional object? arg);
+ void passOptionalNullableObjectWithDefaultValue(optional object? arg = null);
+ void passSequenceOfObject(sequence<object> arg);
+ void passSequenceOfNullableObject(sequence<object?> arg);
+ void passNullableSequenceOfObject(sequence<object>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfObject(optional sequence<sequence<object>?>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfNullableObject(optional sequence<sequence<object?>?>? arg);
+ void passMozMapOfObject(MozMap<object> arg);
+ object receiveObject();
+ object? receiveNullableObject();
+
+ // Union types
+ void passUnion((object or long) arg);
+ // Some union tests are debug-only to avoid creating all those
+ // unused union types in opt builds.
+#ifdef DEBUG
+ void passUnion2((long or boolean) arg);
+ void passUnion3((object or long or boolean) arg);
+ void passUnion4((Node or long or boolean) arg);
+ void passUnion5((object or boolean) arg);
+ void passUnion6((object or DOMString) arg);
+ void passUnion7((object or DOMString or long) arg);
+ void passUnion8((object or DOMString or boolean) arg);
+ void passUnion9((object or DOMString or long or boolean) arg);
+ void passUnion10(optional (EventInit or long) arg);
+ void passUnion11(optional (CustomEventInit or long) arg);
+ void passUnion12(optional (EventInit or long) arg = 5);
+ void passUnion13(optional (object or long?) arg = null);
+ void passUnion14(optional (object or long?) arg = 5);
+ void passUnion15((sequence<long> or long) arg);
+ void passUnion16(optional (sequence<long> or long) arg);
+ void passUnion17(optional (sequence<long>? or long) arg = 5);
+ void passUnion18((sequence<object> or long) arg);
+ void passUnion19(optional (sequence<object> or long) arg);
+ void passUnion20(optional (sequence<object> or long) arg = []);
+ void passUnion21((MozMap<long> or long) arg);
+ void passUnion22((MozMap<object> or long) arg);
+ void passUnion23((sequence<ImageData> or long) arg);
+ void passUnion24((sequence<ImageData?> or long) arg);
+ void passUnion25((sequence<sequence<ImageData>> or long) arg);
+ void passUnion26((sequence<sequence<ImageData?>> or long) arg);
+ void passUnion27(optional (sequence<DOMString> or EventInit) arg);
+ void passUnion28(optional (EventInit or sequence<DOMString>) arg);
+ void passUnionWithCallback((EventHandler or long) arg);
+ void passUnionWithByteString((ByteString or long) arg);
+ void passUnionWithMozMap((MozMap<DOMString> or DOMString) arg);
+ void passUnionWithMozMapAndSequence((MozMap<DOMString> or sequence<DOMString>) arg);
+ void passUnionWithSequenceAndMozMap((sequence<DOMString> or MozMap<DOMString>) arg);
+ void passUnionWithUSVS((USVString or long) arg);
+#endif
+ void passUnionWithNullable((object? or long) arg);
+ void passNullableUnion((object or long)? arg);
+ void passOptionalUnion(optional (object or long) arg);
+ void passOptionalNullableUnion(optional (object or long)? arg);
+ void passOptionalNullableUnionWithDefaultValue(optional (object or long)? arg = null);
+ //void passUnionWithInterfaces((TestInterface or TestExternalInterface) arg);
+ //void passUnionWithInterfacesAndNullable((TestInterface? or TestExternalInterface) arg);
+ //void passUnionWithSequence((sequence<object> or long) arg);
+ void passUnionWithArrayBuffer((ArrayBuffer or long) arg);
+ void passUnionWithString((DOMString or object) arg);
+ // Using an enum in a union. Note that we use some enum not declared in our
+ // binding file, because UnionTypes.h will need to include the binding header
+ // for this enum. Pick an enum from an interface that won't drag in too much
+ // stuff.
+ void passUnionWithEnum((SupportedType or object) arg);
+
+ // Trying to use a callback in a union won't include the test
+ // headers, unfortunately, so won't compile.
+ //void passUnionWithCallback((TestCallback or long) arg);
+ void passUnionWithObject((object or long) arg);
+ //void passUnionWithDict((Dict or long) arg);
+
+ void passUnionWithDefaultValue1(optional (double or DOMString) arg = "");
+ void passUnionWithDefaultValue2(optional (double or DOMString) arg = 1);
+ void passUnionWithDefaultValue3(optional (double or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue4(optional (float or DOMString) arg = "");
+ void passUnionWithDefaultValue5(optional (float or DOMString) arg = 1);
+ void passUnionWithDefaultValue6(optional (float or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue7(optional (unrestricted double or DOMString) arg = "");
+ void passUnionWithDefaultValue8(optional (unrestricted double or DOMString) arg = 1);
+ void passUnionWithDefaultValue9(optional (unrestricted double or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue10(optional (unrestricted double or DOMString) arg = Infinity);
+ void passUnionWithDefaultValue11(optional (unrestricted float or DOMString) arg = "");
+ void passUnionWithDefaultValue12(optional (unrestricted float or DOMString) arg = 1);
+ void passUnionWithDefaultValue13(optional (unrestricted float or DOMString) arg = Infinity);
+ void passUnionWithDefaultValue14(optional (double or ByteString) arg = "");
+ void passUnionWithDefaultValue15(optional (double or ByteString) arg = 1);
+ void passUnionWithDefaultValue16(optional (double or ByteString) arg = 1.5);
+ void passUnionWithDefaultValue17(optional (double or SupportedType) arg = "text/html");
+ void passUnionWithDefaultValue18(optional (double or SupportedType) arg = 1);
+ void passUnionWithDefaultValue19(optional (double or SupportedType) arg = 1.5);
+
+ void passNullableUnionWithDefaultValue1(optional (double or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue2(optional (double or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue3(optional (double or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue4(optional (float or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue5(optional (float or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue6(optional (float or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue7(optional (unrestricted double or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue8(optional (unrestricted double or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue9(optional (unrestricted double or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue10(optional (unrestricted float or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue11(optional (unrestricted float or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue12(optional (unrestricted float or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue13(optional (double or ByteString)? arg = "");
+ void passNullableUnionWithDefaultValue14(optional (double or ByteString)? arg = 1);
+ void passNullableUnionWithDefaultValue15(optional (double or ByteString)? arg = 1.5);
+ void passNullableUnionWithDefaultValue16(optional (double or ByteString)? arg = null);
+ void passNullableUnionWithDefaultValue17(optional (double or SupportedType)? arg = "text/html");
+ void passNullableUnionWithDefaultValue18(optional (double or SupportedType)? arg = 1);
+ void passNullableUnionWithDefaultValue19(optional (double or SupportedType)? arg = 1.5);
+ void passNullableUnionWithDefaultValue20(optional (double or SupportedType)? arg = null);
+
+ void passSequenceOfUnions(sequence<(CanvasPattern or CanvasGradient)> arg);
+ void passSequenceOfUnions2(sequence<(object or long)> arg);
+ void passVariadicUnion((CanvasPattern or CanvasGradient)... arg);
+
+ void passSequenceOfNullableUnions(sequence<(CanvasPattern or CanvasGradient)?> arg);
+ void passVariadicNullableUnion((CanvasPattern or CanvasGradient)?... arg);
+ void passMozMapOfUnions(MozMap<(CanvasPattern or CanvasGradient)> arg);
+ // XXXbz no move constructor on some unions
+ // void passMozMapOfUnions2(MozMap<(object or long)> arg);
+
+ (CanvasPattern or CanvasGradient) receiveUnion();
+ (object or long) receiveUnion2();
+ (CanvasPattern? or CanvasGradient) receiveUnionContainingNull();
+ (CanvasPattern or CanvasGradient)? receiveNullableUnion();
+ (object or long)? receiveNullableUnion2();
+
+ attribute (CanvasPattern or CanvasGradient) writableUnion;
+ attribute (CanvasPattern? or CanvasGradient) writableUnionContainingNull;
+ attribute (CanvasPattern or CanvasGradient)? writableNullableUnion;
+
+ // Date types
+ void passDate(Date arg);
+ void passNullableDate(Date? arg);
+ void passOptionalDate(optional Date arg);
+ void passOptionalNullableDate(optional Date? arg);
+ void passOptionalNullableDateWithDefaultValue(optional Date? arg = null);
+ void passDateSequence(sequence<Date> arg);
+ void passNullableDateSequence(sequence<Date?> arg);
+ void passDateMozMap(MozMap<Date> arg);
+ Date receiveDate();
+ Date? receiveNullableDate();
+
+ // Promise types
+ void passPromise(Promise<any> arg);
+ void passNullablePromise(Promise<any>? arg);
+ void passOptionalPromise(optional Promise<any> arg);
+ void passOptionalNullablePromise(optional Promise<any>? arg);
+ void passOptionalNullablePromiseWithDefaultValue(optional Promise<any>? arg = null);
+ void passPromiseSequence(sequence<Promise<any>> arg);
+ void passNullablePromiseSequence(sequence<Promise<any>?> arg);
+ Promise<any> receivePromise();
+ Promise<any> receiveAddrefedPromise();
+
+ // binaryNames tests
+ void methodRenamedFrom();
+ [BinaryName="otherMethodRenamedTo"]
+ void otherMethodRenamedFrom();
+ void methodRenamedFrom(byte argument);
+ readonly attribute byte attributeGetterRenamedFrom;
+ attribute byte attributeRenamedFrom;
+ [BinaryName="otherAttributeRenamedTo"]
+ attribute byte otherAttributeRenamedFrom;
+
+ void passDictionary(optional Dict x);
+ void passDictionary2(Dict x);
+ [Cached, Pure]
+ readonly attribute Dict readonlyDictionary;
+ [Cached, Pure]
+ readonly attribute Dict? readonlyNullableDictionary;
+ [Cached, Pure]
+ attribute Dict writableDictionary;
+ [Cached, Pure, Frozen]
+ readonly attribute Dict readonlyFrozenDictionary;
+ [Cached, Pure, Frozen]
+ readonly attribute Dict? readonlyFrozenNullableDictionary;
+ [Cached, Pure, Frozen]
+ attribute Dict writableFrozenDictionary;
+ Dict receiveDictionary();
+ Dict? receiveNullableDictionary();
+ void passOtherDictionary(optional GrandparentDict x);
+ void passSequenceOfDictionaries(sequence<Dict> x);
+ void passMozMapOfDictionaries(MozMap<GrandparentDict> x);
+ // No support for nullable dictionaries inside a sequence (nor should there be)
+ // void passSequenceOfNullableDictionaries(sequence<Dict?> x);
+ void passDictionaryOrLong(optional Dict x);
+ void passDictionaryOrLong(long x);
+
+ void passDictContainingDict(optional DictContainingDict arg);
+ void passDictContainingSequence(optional DictContainingSequence arg);
+ DictContainingSequence receiveDictContainingSequence();
+ void passVariadicDictionary(Dict... arg);
+
+ // EnforceRange/Clamp tests
+ void dontEnforceRangeOrClamp(byte arg);
+ void doEnforceRange([EnforceRange] byte arg);
+ void doClamp([Clamp] byte arg);
+ [EnforceRange] attribute byte enforcedByte;
+ [Clamp] attribute byte clampedByte;
+
+ // Typedefs
+ const myLong myLongConstant = 5;
+ void exerciseTypedefInterfaces1(AnotherNameForTestInterface arg);
+ AnotherNameForTestInterface exerciseTypedefInterfaces2(NullableTestInterface arg);
+ void exerciseTypedefInterfaces3(YetAnotherNameForTestInterface arg);
+
+ // Deprecated methods and attributes
+ [Deprecated="GetAttributeNode"]
+ attribute byte deprecatedAttribute;
+ [Deprecated="GetAttributeNode"]
+ byte deprecatedMethod();
+ [Deprecated="GetAttributeNode"]
+ byte deprecatedMethodWithContext(any arg);
+
+ // Static methods and attributes
+ static attribute boolean staticAttribute;
+ static void staticMethod(boolean arg);
+ static void staticMethodWithContext(any arg);
+
+ // Testing static method with a reserved C++ keyword as the name
+ static void assert(boolean arg);
+
+ // Deprecated static methods and attributes
+ [Deprecated="GetAttributeNode"]
+ static attribute byte staticDeprecatedAttribute;
+ [Deprecated="GetAttributeNode"]
+ static void staticDeprecatedMethod();
+ [Deprecated="GetAttributeNode"]
+ static void staticDeprecatedMethodWithContext(any arg);
+
+ // Overload resolution tests
+ //void overload1(DOMString... strs);
+ boolean overload1(TestInterface arg);
+ TestInterface overload1(DOMString strs, TestInterface arg);
+ void overload2(TestInterface arg);
+ void overload2(optional Dict arg);
+ void overload2(boolean arg);
+ void overload2(DOMString arg);
+ void overload2(Date arg);
+ void overload3(TestInterface arg);
+ void overload3(TestCallback arg);
+ void overload3(boolean arg);
+ void overload4(TestInterface arg);
+ void overload4(TestCallbackInterface arg);
+ void overload4(DOMString arg);
+ void overload5(long arg);
+ void overload5(TestEnum arg);
+ void overload6(long arg);
+ void overload6(boolean arg);
+ void overload7(long arg);
+ void overload7(boolean arg);
+ void overload7(ByteString arg);
+ void overload8(long arg);
+ void overload8(TestInterface arg);
+ void overload9(long? arg);
+ void overload9(DOMString arg);
+ void overload10(long? arg);
+ void overload10(object arg);
+ void overload11(long arg);
+ void overload11(DOMString? arg);
+ void overload12(long arg);
+ void overload12(boolean? arg);
+ void overload13(long? arg);
+ void overload13(boolean arg);
+ void overload14(optional long arg);
+ void overload14(TestInterface arg);
+ void overload15(long arg);
+ void overload15(optional TestInterface arg);
+ void overload16(long arg);
+ void overload16(optional TestInterface? arg);
+ void overload17(sequence<long> arg);
+ void overload17(MozMap<long> arg);
+ void overload18(MozMap<DOMString> arg);
+ void overload18(sequence<DOMString> arg);
+ void overload19(sequence<long> arg);
+ void overload19(optional Dict arg);
+ void overload20(optional Dict arg);
+ void overload20(sequence<long> arg);
+
+ // Variadic handling
+ void passVariadicThirdArg(DOMString arg1, long arg2, TestInterface... arg3);
+
+ // Conditionally exposed methods/attributes
+ [Pref="abc.def"]
+ readonly attribute boolean prefable1;
+ [Pref="abc.def"]
+ readonly attribute boolean prefable2;
+ [Pref="ghi.jkl"]
+ readonly attribute boolean prefable3;
+ [Pref="ghi.jkl"]
+ readonly attribute boolean prefable4;
+ [Pref="abc.def"]
+ readonly attribute boolean prefable5;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable6;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable7;
+ [Pref="ghi.jkl", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable8;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable9;
+ [Pref="abc.def"]
+ void prefable10();
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void prefable11();
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable12;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void prefable13();
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable14;
+ [Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable15;
+ [Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable16;
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ void prefable17();
+ [Func="TestFuncControlledMember"]
+ void prefable18();
+ [Func="TestFuncControlledMember"]
+ void prefable19();
+ [Pref="abc.def", Func="TestFuncControlledMember", ChromeOnly]
+ void prefable20();
+
+ // Conditionally exposed methods/attributes involving [SecureContext]
+ [SecureContext]
+ readonly attribute boolean conditionalOnSecureContext1;
+ [SecureContext, Pref="abc.def"]
+ readonly attribute boolean conditionalOnSecureContext2;
+ [SecureContext, Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean conditionalOnSecureContext3;
+ [SecureContext, Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean conditionalOnSecureContext4;
+ [SecureContext]
+ void conditionalOnSecureContext5();
+ [SecureContext, Pref="abc.def"]
+ void conditionalOnSecureContext6();
+ [SecureContext, Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void conditionalOnSecureContext7();
+ [SecureContext, Pref="abc.def", Func="TestFuncControlledMember"]
+ void conditionalOnSecureContext8();
+
+ // Miscellania
+ [LenientThis] attribute long attrWithLenientThis;
+ [Unforgeable] readonly attribute long unforgeableAttr;
+ [Unforgeable, ChromeOnly] readonly attribute long unforgeableAttr2;
+ [Unforgeable] long unforgeableMethod();
+ [Unforgeable, ChromeOnly] long unforgeableMethod2();
+ stringifier;
+ void passRenamedInterface(TestRenamedInterface arg);
+ [PutForwards=writableByte] readonly attribute TestInterface putForwardsAttr;
+ [PutForwards=writableByte, LenientThis] readonly attribute TestInterface putForwardsAttr2;
+ [PutForwards=writableByte, ChromeOnly] readonly attribute TestInterface putForwardsAttr3;
+ [Throws] void throwingMethod();
+ [Throws] attribute boolean throwingAttr;
+ [GetterThrows] attribute boolean throwingGetterAttr;
+ [SetterThrows] attribute boolean throwingSetterAttr;
+ [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod();
+ [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr;
+ [NeedsCallerType] void needsCallerTypeMethod();
+ [NeedsCallerType] attribute boolean needsCallerTypeAttr;
+ legacycaller short(unsigned long arg1, TestInterface arg2);
+ void passArgsWithDefaults(optional long arg1,
+ optional TestInterface? arg2 = null,
+ optional Dict arg3, optional double arg4 = 5.0,
+ optional float arg5);
+
+ attribute any jsonifierShouldSkipThis;
+ attribute TestParentInterface jsonifierShouldSkipThis2;
+ attribute TestCallbackInterface jsonifierShouldSkipThis3;
+ jsonifier;
+
+ attribute byte dashed-attribute;
+ void dashed-method();
+
+ // If you add things here, add them to TestExampleGen and TestJSImplGen as well
+};
+
+interface TestParentInterface {
+};
+
+interface TestChildInterface : TestParentInterface {
+};
+
+interface TestNonWrapperCacheInterface {
+};
+
+[NoInterfaceObject]
+interface ImplementedInterfaceParent {
+ void implementedParentMethod();
+ attribute boolean implementedParentProperty;
+
+ const long implementedParentConstant = 8;
+};
+
+ImplementedInterfaceParent implements IndirectlyImplementedInterface;
+
+[NoInterfaceObject]
+interface IndirectlyImplementedInterface {
+ void indirectlyImplementedMethod();
+ attribute boolean indirectlyImplementedProperty;
+
+ const long indirectlyImplementedConstant = 9;
+};
+
+[NoInterfaceObject]
+interface ImplementedInterface : ImplementedInterfaceParent {
+ void implementedMethod();
+ attribute boolean implementedProperty;
+
+ const long implementedConstant = 5;
+};
+
+[NoInterfaceObject]
+interface DiamondImplements {
+ readonly attribute long diamondImplementedProperty;
+};
+[NoInterfaceObject]
+interface DiamondBranch1A {
+};
+[NoInterfaceObject]
+interface DiamondBranch1B {
+};
+[NoInterfaceObject]
+interface DiamondBranch2A : DiamondImplements {
+};
+[NoInterfaceObject]
+interface DiamondBranch2B : DiamondImplements {
+};
+TestInterface implements DiamondBranch1A;
+TestInterface implements DiamondBranch1B;
+TestInterface implements DiamondBranch2A;
+TestInterface implements DiamondBranch2B;
+DiamondBranch1A implements DiamondImplements;
+DiamondBranch1B implements DiamondImplements;
+
+dictionary Dict : ParentDict {
+ TestEnum someEnum;
+ long x;
+ long a;
+ long b = 8;
+ long z = 9;
+ [EnforceRange] unsigned long enforcedUnsignedLong;
+ [Clamp] unsigned long clampedUnsignedLong;
+ DOMString str;
+ DOMString empty = "";
+ TestEnum otherEnum = "b";
+ DOMString otherStr = "def";
+ DOMString? yetAnotherStr = null;
+ DOMString template;
+ ByteString byteStr;
+ ByteString emptyByteStr = "";
+ ByteString otherByteStr = "def";
+ object someObj;
+ boolean prototype;
+ object? anotherObj = null;
+ TestCallback? someCallback = null;
+ any someAny;
+ any anotherAny = null;
+
+ unrestricted float urFloat = 0;
+ unrestricted float urFloat2 = 1.1;
+ unrestricted float urFloat3 = -1.1;
+ unrestricted float? urFloat4 = null;
+ unrestricted float infUrFloat = Infinity;
+ unrestricted float negativeInfUrFloat = -Infinity;
+ unrestricted float nanUrFloat = NaN;
+
+ unrestricted double urDouble = 0;
+ unrestricted double urDouble2 = 1.1;
+ unrestricted double urDouble3 = -1.1;
+ unrestricted double? urDouble4 = null;
+ unrestricted double infUrDouble = Infinity;
+ unrestricted double negativeInfUrDouble = -Infinity;
+ unrestricted double nanUrDouble = NaN;
+
+ (float or DOMString) floatOrString = "str";
+ (float or DOMString)? nullableFloatOrString = "str";
+ (object or long) objectOrLong;
+#ifdef DEBUG
+ (EventInit or long) eventInitOrLong;
+ (EventInit or long)? nullableEventInitOrLong;
+ (HTMLElement or long)? nullableHTMLElementOrLong;
+ // CustomEventInit is useful to test because it needs rooting.
+ (CustomEventInit or long) eventInitOrLong2;
+ (CustomEventInit or long)? nullableEventInitOrLong2;
+ (EventInit or long) eventInitOrLongWithDefaultValue = null;
+ (CustomEventInit or long) eventInitOrLongWithDefaultValue2 = null;
+ (EventInit or long) eventInitOrLongWithDefaultValue3 = 5;
+ (CustomEventInit or long) eventInitOrLongWithDefaultValue4 = 5;
+ (EventInit or long)? nullableEventInitOrLongWithDefaultValue = null;
+ (CustomEventInit or long)? nullableEventInitOrLongWithDefaultValue2 = null;
+ (EventInit or long)? nullableEventInitOrLongWithDefaultValue3 = 5;
+ (CustomEventInit or long)? nullableEventInitOrLongWithDefaultValue4 = 5;
+ (sequence<object> or long) objectSequenceOrLong;
+ (sequence<object> or long) objectSequenceOrLongWithDefaultValue1 = 1;
+ (sequence<object> or long) objectSequenceOrLongWithDefaultValue2 = [];
+ (sequence<object> or long)? nullableObjectSequenceOrLong;
+ (sequence<object> or long)? nullableObjectSequenceOrLongWithDefaultValue1 = 1;
+ (sequence<object> or long)? nullableObjectSequenceOrLongWithDefaultValue2 = [];
+#endif
+
+ ArrayBuffer arrayBuffer;
+ ArrayBuffer? nullableArrayBuffer;
+ Uint8Array uint8Array;
+ Float64Array? float64Array = null;
+
+ sequence<long> seq1;
+ sequence<long> seq2 = [];
+ sequence<long>? seq3;
+ sequence<long>? seq4 = null;
+ sequence<long>? seq5 = [];
+
+ long dashed-name;
+
+ required long requiredLong;
+ required object requiredObject;
+
+ CustomEventInit customEventInit;
+ TestDictionaryTypedef dictionaryTypedef;
+
+ Promise<void> promise;
+ sequence<Promise<void>> promiseSequence;
+};
+
+dictionary ParentDict : GrandparentDict {
+ long c = 5;
+ TestInterface someInterface;
+ TestInterface? someNullableInterface = null;
+ TestExternalInterface someExternalInterface;
+ any parentAny;
+};
+
+dictionary DictContainingDict {
+ Dict memberDict;
+};
+
+dictionary DictContainingSequence {
+ sequence<long> ourSequence;
+ sequence<TestInterface> ourSequence2;
+ sequence<any> ourSequence3;
+ sequence<object> ourSequence4;
+ sequence<object?> ourSequence5;
+ sequence<object>? ourSequence6;
+ sequence<object?>? ourSequence7;
+ sequence<object>? ourSequence8 = null;
+ sequence<object?>? ourSequence9 = null;
+ sequence<(float or DOMString)> ourSequence10;
+};
+
+dictionary DictForConstructor {
+ Dict dict;
+ DictContainingDict dict2;
+ sequence<Dict> seq1;
+ sequence<sequence<Dict>>? seq2;
+ sequence<sequence<Dict>?> seq3;
+ sequence<any> seq4;
+ sequence<any> seq5;
+ sequence<DictContainingSequence> seq6;
+ object obj1;
+ object? obj2;
+ any any1 = null;
+};
+
+dictionary DictWithConditionalMembers {
+ [ChromeOnly]
+ long chromeOnlyMember;
+ [Func="TestFuncControlledMember"]
+ long funcControlledMember;
+ [ChromeOnly, Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ long chromeOnlyFuncControlledMember;
+};
+
+interface TestIndexedGetterInterface {
+ getter long item(unsigned long idx);
+ readonly attribute unsigned long length;
+ legacycaller void();
+};
+
+interface TestNamedGetterInterface {
+ getter DOMString (DOMString name);
+};
+
+interface TestIndexedGetterAndSetterAndNamedGetterInterface {
+ getter DOMString (DOMString myName);
+ getter long (unsigned long index);
+ setter creator void (unsigned long index, long arg);
+};
+
+interface TestIndexedAndNamedGetterInterface {
+ getter long (unsigned long index);
+ getter DOMString namedItem(DOMString name);
+ readonly attribute unsigned long length;
+};
+
+interface TestIndexedSetterInterface {
+ setter creator void setItem(unsigned long idx, DOMString item);
+ getter DOMString (unsigned long idx);
+};
+
+interface TestNamedSetterInterface {
+ setter creator void (DOMString myName, TestIndexedSetterInterface item);
+ getter TestIndexedSetterInterface (DOMString name);
+};
+
+interface TestIndexedAndNamedSetterInterface {
+ setter creator void (unsigned long index, TestIndexedSetterInterface item);
+ getter TestIndexedSetterInterface (unsigned long index);
+ setter creator void setNamedItem(DOMString name, TestIndexedSetterInterface item);
+ getter TestIndexedSetterInterface (DOMString name);
+};
+
+interface TestIndexedAndNamedGetterAndSetterInterface : TestIndexedSetterInterface {
+ getter long item(unsigned long index);
+ getter DOMString namedItem(DOMString name);
+ setter creator void (unsigned long index, long item);
+ setter creator void (DOMString name, DOMString item);
+ stringifier DOMString ();
+ readonly attribute unsigned long length;
+};
+
+interface TestNamedDeleterInterface {
+ deleter void (DOMString name);
+ getter long (DOMString name);
+};
+
+interface TestNamedDeleterWithRetvalInterface {
+ deleter boolean delNamedItem(DOMString name);
+ getter long (DOMString name);
+};
+
+interface TestCppKeywordNamedMethodsInterface {
+ boolean continue();
+ boolean delete();
+ long volatile();
+};
+
+[Deprecated="GetAttributeNode", Constructor()]
+interface TestDeprecatedInterface {
+ static void alsoDeprecated();
+};
+
+
+[Constructor(Promise<void> promise)]
+interface TestInterfaceWithPromiseConstructorArg {
+};
+
+namespace TestNamespace {
+ readonly attribute boolean foo;
+ long bar();
+};
+
+partial namespace TestNamespace {
+ void baz();
+};
+
+[ClassString="RenamedNamespaceClassName"]
+namespace TestRenamedNamespace {
+};
+
+[ProtoObjectHack]
+namespace TestProtoObjectHackedNamespace {
+};
+
+[SecureContext]
+interface TestSecureContextInterface {
+ static void alsoSecureContext();
+};
+
+[Exposed=(Window,Worker)]
+interface TestWorkerExposedInterface {
+ [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod();
+ [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr;
+ [NeedsCallerType] void needsCallerTypeMethod();
+ [NeedsCallerType] attribute boolean needsCallerTypeAttr;
+};
diff --git a/dom/bindings/test/TestDictionary.webidl b/dom/bindings/test/TestDictionary.webidl
new file mode 100644
index 000000000..3dd91bd65
--- /dev/null
+++ b/dom/bindings/test/TestDictionary.webidl
@@ -0,0 +1,9 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+dictionary GrandparentDict {
+ double someNum;
+}; \ No newline at end of file
diff --git a/dom/bindings/test/TestExampleGen.webidl b/dom/bindings/test/TestExampleGen.webidl
new file mode 100644
index 000000000..ea6387a84
--- /dev/null
+++ b/dom/bindings/test/TestExampleGen.webidl
@@ -0,0 +1,811 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+[Constructor,
+ Constructor(DOMString str),
+ Constructor(unsigned long num, boolean? boolArg),
+ Constructor(TestInterface? iface),
+ Constructor(long arg1, IndirectlyImplementedInterface iface),
+ Constructor(Date arg1),
+ Constructor(ArrayBuffer arrayBuf),
+ Constructor(Uint8Array typedArr),
+ // Constructor(long arg1, long arg2, (TestInterface or OnlyForUseInConstructor) arg3),
+ NamedConstructor=Example,
+ NamedConstructor=Example(DOMString str),
+ NamedConstructor=Example2(DictForConstructor dict, any any1, object obj1,
+ object? obj2, sequence<Dict> seq, optional any any2,
+ optional object obj3, optional object? obj4),
+ NamedConstructor=Example2((long or MozMap<any>) arg1)
+ ]
+interface TestExampleInterface {
+ // Integer types
+ // XXXbz add tests for throwing versions of all the integer stuff
+ readonly attribute byte readonlyByte;
+ attribute byte writableByte;
+ void passByte(byte arg);
+ byte receiveByte();
+ void passOptionalByte(optional byte arg);
+ void passOptionalByteBeforeRequired(optional byte arg1, byte arg2);
+ void passOptionalByteWithDefault(optional byte arg = 0);
+ void passOptionalByteWithDefaultBeforeRequired(optional byte arg1 = 0, byte arg2);
+ void passNullableByte(byte? arg);
+ void passOptionalNullableByte(optional byte? arg);
+ void passVariadicByte(byte... arg);
+ [Cached, Pure]
+ readonly attribute byte cachedByte;
+ [StoreInSlot, Constant]
+ readonly attribute byte cachedConstantByte;
+ [Cached, Pure]
+ attribute byte cachedWritableByte;
+ [Affects=Nothing]
+ attribute byte sideEffectFreeByte;
+ [Affects=Nothing, DependsOn=DOMState]
+ attribute byte domDependentByte;
+ [Affects=Nothing, DependsOn=Nothing]
+ readonly attribute byte constantByte;
+ [DependsOn=DeviceState, Affects=Nothing]
+ readonly attribute byte deviceStateDependentByte;
+ [Affects=Nothing]
+ byte returnByteSideEffectFree();
+ [Affects=Nothing, DependsOn=DOMState]
+ byte returnDOMDependentByte();
+ [Affects=Nothing, DependsOn=Nothing]
+ byte returnConstantByte();
+ [DependsOn=DeviceState, Affects=Nothing]
+ byte returnDeviceStateDependentByte();
+
+ readonly attribute short readonlyShort;
+ attribute short writableShort;
+ void passShort(short arg);
+ short receiveShort();
+ void passOptionalShort(optional short arg);
+ void passOptionalShortWithDefault(optional short arg = 5);
+
+ readonly attribute long readonlyLong;
+ attribute long writableLong;
+ void passLong(long arg);
+ long receiveLong();
+ void passOptionalLong(optional long arg);
+ void passOptionalLongWithDefault(optional long arg = 7);
+
+ readonly attribute long long readonlyLongLong;
+ attribute long long writableLongLong;
+ void passLongLong(long long arg);
+ long long receiveLongLong();
+ void passOptionalLongLong(optional long long arg);
+ void passOptionalLongLongWithDefault(optional long long arg = -12);
+
+ readonly attribute octet readonlyOctet;
+ attribute octet writableOctet;
+ void passOctet(octet arg);
+ octet receiveOctet();
+ void passOptionalOctet(optional octet arg);
+ void passOptionalOctetWithDefault(optional octet arg = 19);
+
+ readonly attribute unsigned short readonlyUnsignedShort;
+ attribute unsigned short writableUnsignedShort;
+ void passUnsignedShort(unsigned short arg);
+ unsigned short receiveUnsignedShort();
+ void passOptionalUnsignedShort(optional unsigned short arg);
+ void passOptionalUnsignedShortWithDefault(optional unsigned short arg = 2);
+
+ readonly attribute unsigned long readonlyUnsignedLong;
+ attribute unsigned long writableUnsignedLong;
+ void passUnsignedLong(unsigned long arg);
+ unsigned long receiveUnsignedLong();
+ void passOptionalUnsignedLong(optional unsigned long arg);
+ void passOptionalUnsignedLongWithDefault(optional unsigned long arg = 6);
+
+ readonly attribute unsigned long long readonlyUnsignedLongLong;
+ attribute unsigned long long writableUnsignedLongLong;
+ void passUnsignedLongLong(unsigned long long arg);
+ unsigned long long receiveUnsignedLongLong();
+ void passOptionalUnsignedLongLong(optional unsigned long long arg);
+ void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
+
+ attribute float writableFloat;
+ attribute unrestricted float writableUnrestrictedFloat;
+ attribute float? writableNullableFloat;
+ attribute unrestricted float? writableNullableUnrestrictedFloat;
+ attribute double writableDouble;
+ attribute unrestricted double writableUnrestrictedDouble;
+ attribute double? writableNullableDouble;
+ attribute unrestricted double? writableNullableUnrestrictedDouble;
+ void passFloat(float arg1, unrestricted float arg2,
+ float? arg3, unrestricted float? arg4,
+ double arg5, unrestricted double arg6,
+ double? arg7, unrestricted double? arg8,
+ sequence<float> arg9, sequence<unrestricted float> arg10,
+ sequence<float?> arg11, sequence<unrestricted float?> arg12,
+ sequence<double> arg13, sequence<unrestricted double> arg14,
+ sequence<double?> arg15, sequence<unrestricted double?> arg16);
+ [LenientFloat]
+ void passLenientFloat(float arg1, unrestricted float arg2,
+ float? arg3, unrestricted float? arg4,
+ double arg5, unrestricted double arg6,
+ double? arg7, unrestricted double? arg8,
+ sequence<float> arg9,
+ sequence<unrestricted float> arg10,
+ sequence<float?> arg11,
+ sequence<unrestricted float?> arg12,
+ sequence<double> arg13,
+ sequence<unrestricted double> arg14,
+ sequence<double?> arg15,
+ sequence<unrestricted double?> arg16);
+ [LenientFloat]
+ attribute float lenientFloatAttr;
+ [LenientFloat]
+ attribute double lenientDoubleAttr;
+
+ // Castable interface types
+ // XXXbz add tests for throwing versions of all the castable interface stuff
+ TestInterface receiveSelf();
+ TestInterface? receiveNullableSelf();
+ TestInterface receiveWeakSelf();
+ TestInterface? receiveWeakNullableSelf();
+ void passSelf(TestInterface arg);
+ void passNullableSelf(TestInterface? arg);
+ attribute TestInterface nonNullSelf;
+ attribute TestInterface? nullableSelf;
+ [Cached, Pure]
+ readonly attribute TestInterface cachedSelf;
+ // Optional arguments
+ void passOptionalSelf(optional TestInterface? arg);
+ void passOptionalNonNullSelf(optional TestInterface arg);
+ void passOptionalSelfWithDefault(optional TestInterface? arg = null);
+
+ // Non-wrapper-cache interface types
+ [NewObject]
+ TestNonWrapperCacheInterface receiveNonWrapperCacheInterface();
+ [NewObject]
+ TestNonWrapperCacheInterface? receiveNullableNonWrapperCacheInterface();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface> receiveNonWrapperCacheInterfaceSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface?> receiveNullableNonWrapperCacheInterfaceSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface>? receiveNonWrapperCacheInterfaceNullableSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface?>? receiveNullableNonWrapperCacheInterfaceNullableSequence();
+
+ // Non-castable interface types
+ IndirectlyImplementedInterface receiveOther();
+ IndirectlyImplementedInterface? receiveNullableOther();
+ IndirectlyImplementedInterface receiveWeakOther();
+ IndirectlyImplementedInterface? receiveWeakNullableOther();
+ void passOther(IndirectlyImplementedInterface arg);
+ void passNullableOther(IndirectlyImplementedInterface? arg);
+ attribute IndirectlyImplementedInterface nonNullOther;
+ attribute IndirectlyImplementedInterface? nullableOther;
+ // Optional arguments
+ void passOptionalOther(optional IndirectlyImplementedInterface? arg);
+ void passOptionalNonNullOther(optional IndirectlyImplementedInterface arg);
+ void passOptionalOtherWithDefault(optional IndirectlyImplementedInterface? arg = null);
+
+ // External interface types
+ TestExternalInterface receiveExternal();
+ TestExternalInterface? receiveNullableExternal();
+ TestExternalInterface receiveWeakExternal();
+ TestExternalInterface? receiveWeakNullableExternal();
+ void passExternal(TestExternalInterface arg);
+ void passNullableExternal(TestExternalInterface? arg);
+ attribute TestExternalInterface nonNullExternal;
+ attribute TestExternalInterface? nullableExternal;
+ // Optional arguments
+ void passOptionalExternal(optional TestExternalInterface? arg);
+ void passOptionalNonNullExternal(optional TestExternalInterface arg);
+ void passOptionalExternalWithDefault(optional TestExternalInterface? arg = null);
+
+ // Callback interface types
+ TestCallbackInterface receiveCallbackInterface();
+ TestCallbackInterface? receiveNullableCallbackInterface();
+ TestCallbackInterface receiveWeakCallbackInterface();
+ TestCallbackInterface? receiveWeakNullableCallbackInterface();
+ void passCallbackInterface(TestCallbackInterface arg);
+ void passNullableCallbackInterface(TestCallbackInterface? arg);
+ attribute TestCallbackInterface nonNullCallbackInterface;
+ attribute TestCallbackInterface? nullableCallbackInterface;
+ // Optional arguments
+ void passOptionalCallbackInterface(optional TestCallbackInterface? arg);
+ void passOptionalNonNullCallbackInterface(optional TestCallbackInterface arg);
+ void passOptionalCallbackInterfaceWithDefault(optional TestCallbackInterface? arg = null);
+
+ // Miscellaneous interface tests
+ IndirectlyImplementedInterface receiveConsequentialInterface();
+ void passConsequentialInterface(IndirectlyImplementedInterface arg);
+
+ // Sequence types
+ [Cached, Pure]
+ readonly attribute sequence<long> readonlySequence;
+ [Cached, Pure]
+ readonly attribute sequence<Dict> readonlySequenceOfDictionaries;
+ [Cached, Pure]
+ readonly attribute sequence<Dict>? readonlyNullableSequenceOfDictionaries;
+ [Cached, Pure, Frozen]
+ readonly attribute sequence<long> readonlyFrozenSequence;
+ [Cached, Pure, Frozen]
+ readonly attribute sequence<long>? readonlyFrozenNullableSequence;
+ sequence<long> receiveSequence();
+ sequence<long>? receiveNullableSequence();
+ sequence<long?> receiveSequenceOfNullableInts();
+ sequence<long?>? receiveNullableSequenceOfNullableInts();
+ void passSequence(sequence<long> arg);
+ void passNullableSequence(sequence<long>? arg);
+ void passSequenceOfNullableInts(sequence<long?> arg);
+ void passOptionalSequenceOfNullableInts(optional sequence<long?> arg);
+ void passOptionalNullableSequenceOfNullableInts(optional sequence<long?>? arg);
+ sequence<TestInterface> receiveCastableObjectSequence();
+ sequence<TestCallbackInterface> receiveCallbackObjectSequence();
+ sequence<TestInterface?> receiveNullableCastableObjectSequence();
+ sequence<TestCallbackInterface?> receiveNullableCallbackObjectSequence();
+ sequence<TestInterface>? receiveCastableObjectNullableSequence();
+ sequence<TestInterface?>? receiveNullableCastableObjectNullableSequence();
+ sequence<TestInterface> receiveWeakCastableObjectSequence();
+ sequence<TestInterface?> receiveWeakNullableCastableObjectSequence();
+ sequence<TestInterface>? receiveWeakCastableObjectNullableSequence();
+ sequence<TestInterface?>? receiveWeakNullableCastableObjectNullableSequence();
+ void passCastableObjectSequence(sequence<TestInterface> arg);
+ void passNullableCastableObjectSequence(sequence<TestInterface?> arg);
+ void passCastableObjectNullableSequence(sequence<TestInterface>? arg);
+ void passNullableCastableObjectNullableSequence(sequence<TestInterface?>? arg);
+ void passOptionalSequence(optional sequence<long> arg);
+ void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
+ void passOptionalNullableSequence(optional sequence<long>? arg);
+ void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
+ void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
+ void passOptionalObjectSequence(optional sequence<TestInterface> arg);
+ void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
+ void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);
+
+ sequence<DOMString> receiveStringSequence();
+ void passStringSequence(sequence<DOMString> arg);
+
+ sequence<ByteString> receiveByteStringSequence();
+ void passByteStringSequence(sequence<ByteString> arg);
+
+ sequence<any> receiveAnySequence();
+ sequence<any>? receiveNullableAnySequence();
+ //XXXbz No support for sequence of sequence return values yet.
+ //sequence<sequence<any>> receiveAnySequenceSequence();
+
+ sequence<object> receiveObjectSequence();
+ sequence<object?> receiveNullableObjectSequence();
+
+ void passSequenceOfSequences(sequence<sequence<long>> arg);
+ void passSequenceOfSequencesOfSequences(sequence<sequence<sequence<long>>> arg);
+ //XXXbz No support for sequence of sequence return values yet.
+ //sequence<sequence<long>> receiveSequenceOfSequences();
+
+ // MozMap types
+ void passMozMap(MozMap<long> arg);
+ void passNullableMozMap(MozMap<long>? arg);
+ void passMozMapOfNullableInts(MozMap<long?> arg);
+ void passOptionalMozMapOfNullableInts(optional MozMap<long?> arg);
+ void passOptionalNullableMozMapOfNullableInts(optional MozMap<long?>? arg);
+ void passCastableObjectMozMap(MozMap<TestInterface> arg);
+ void passNullableCastableObjectMozMap(MozMap<TestInterface?> arg);
+ void passCastableObjectNullableMozMap(MozMap<TestInterface>? arg);
+ void passNullableCastableObjectNullableMozMap(MozMap<TestInterface?>? arg);
+ void passOptionalMozMap(optional MozMap<long> arg);
+ void passOptionalNullableMozMap(optional MozMap<long>? arg);
+ void passOptionalNullableMozMapWithDefaultValue(optional MozMap<long>? arg = null);
+ void passOptionalObjectMozMap(optional MozMap<TestInterface> arg);
+ void passExternalInterfaceMozMap(MozMap<TestExternalInterface> arg);
+ void passNullableExternalInterfaceMozMap(MozMap<TestExternalInterface?> arg);
+ void passStringMozMap(MozMap<DOMString> arg);
+ void passByteStringMozMap(MozMap<ByteString> arg);
+ void passMozMapOfMozMaps(MozMap<MozMap<long>> arg);
+ MozMap<long> receiveMozMap();
+ MozMap<long>? receiveNullableMozMap();
+ MozMap<long?> receiveMozMapOfNullableInts();
+ MozMap<long?>? receiveNullableMozMapOfNullableInts();
+ //XXXbz No support for MozMap of MozMaps return values yet.
+ //MozMap<MozMap<long>> receiveMozMapOfMozMaps();
+ MozMap<any> receiveAnyMozMap();
+
+ // Typed array types
+ void passArrayBuffer(ArrayBuffer arg);
+ void passNullableArrayBuffer(ArrayBuffer? arg);
+ void passOptionalArrayBuffer(optional ArrayBuffer arg);
+ void passOptionalNullableArrayBuffer(optional ArrayBuffer? arg);
+ void passOptionalNullableArrayBufferWithDefaultValue(optional ArrayBuffer? arg= null);
+ void passArrayBufferView(ArrayBufferView arg);
+ void passInt8Array(Int8Array arg);
+ void passInt16Array(Int16Array arg);
+ void passInt32Array(Int32Array arg);
+ void passUint8Array(Uint8Array arg);
+ void passUint16Array(Uint16Array arg);
+ void passUint32Array(Uint32Array arg);
+ void passUint8ClampedArray(Uint8ClampedArray arg);
+ void passFloat32Array(Float32Array arg);
+ void passFloat64Array(Float64Array arg);
+ void passSequenceOfArrayBuffers(sequence<ArrayBuffer> arg);
+ void passSequenceOfNullableArrayBuffers(sequence<ArrayBuffer?> arg);
+ void passMozMapOfArrayBuffers(MozMap<ArrayBuffer> arg);
+ void passMozMapOfNullableArrayBuffers(MozMap<ArrayBuffer?> arg);
+ void passVariadicTypedArray(Float32Array... arg);
+ void passVariadicNullableTypedArray(Float32Array?... arg);
+ Uint8Array receiveUint8Array();
+ attribute Uint8Array uint8ArrayAttr;
+
+ // DOMString types
+ void passString(DOMString arg);
+ void passNullableString(DOMString? arg);
+ void passOptionalString(optional DOMString arg);
+ void passOptionalStringWithDefaultValue(optional DOMString arg = "abc");
+ void passOptionalNullableString(optional DOMString? arg);
+ void passOptionalNullableStringWithDefaultValue(optional DOMString? arg = null);
+ void passVariadicString(DOMString... arg);
+
+ // ByteString types
+ void passByteString(ByteString arg);
+ void passNullableByteString(ByteString? arg);
+ void passOptionalByteString(optional ByteString arg);
+ void passOptionalByteStringWithDefaultValue(optional ByteString arg = "abc");
+ void passOptionalNullableByteString(optional ByteString? arg);
+ void passOptionalNullableByteStringWithDefaultValue(optional ByteString? arg = null);
+ void passVariadicByteString(ByteString... arg);
+ void passUnionByteString((ByteString or long) arg);
+ void passOptionalUnionByteString(optional (ByteString or long) arg);
+ void passOptionalUnionByteStringWithDefaultValue(optional (ByteString or long) arg = "abc");
+
+ // USVString types
+ void passSVS(USVString arg);
+ void passNullableSVS(USVString? arg);
+ void passOptionalSVS(optional USVString arg);
+ void passOptionalSVSWithDefaultValue(optional USVString arg = "abc");
+ void passOptionalNullableSVS(optional USVString? arg);
+ void passOptionalNullableSVSWithDefaultValue(optional USVString? arg = null);
+ void passVariadicSVS(USVString... arg);
+ USVString receiveSVS();
+
+ // Enumerated types
+ void passEnum(TestEnum arg);
+ void passNullableEnum(TestEnum? arg);
+ void passOptionalEnum(optional TestEnum arg);
+ void passEnumWithDefault(optional TestEnum arg = "a");
+ void passOptionalNullableEnum(optional TestEnum? arg);
+ void passOptionalNullableEnumWithDefaultValue(optional TestEnum? arg = null);
+ void passOptionalNullableEnumWithDefaultValue2(optional TestEnum? arg = "a");
+ TestEnum receiveEnum();
+ TestEnum? receiveNullableEnum();
+ attribute TestEnum enumAttribute;
+ readonly attribute TestEnum readonlyEnumAttribute;
+
+ // Callback types
+ void passCallback(TestCallback arg);
+ void passNullableCallback(TestCallback? arg);
+ void passOptionalCallback(optional TestCallback arg);
+ void passOptionalNullableCallback(optional TestCallback? arg);
+ void passOptionalNullableCallbackWithDefaultValue(optional TestCallback? arg = null);
+ TestCallback receiveCallback();
+ TestCallback? receiveNullableCallback();
+ void passNullableTreatAsNullCallback(TestTreatAsNullCallback? arg);
+ void passOptionalNullableTreatAsNullCallback(optional TestTreatAsNullCallback? arg);
+ void passOptionalNullableTreatAsNullCallbackWithDefaultValue(optional TestTreatAsNullCallback? arg = null);
+
+ // Any types
+ void passAny(any arg);
+ void passVariadicAny(any... arg);
+ void passOptionalAny(optional any arg);
+ void passAnyDefaultNull(optional any arg = null);
+ void passSequenceOfAny(sequence<any> arg);
+ void passNullableSequenceOfAny(sequence<any>? arg);
+ void passOptionalSequenceOfAny(optional sequence<any> arg);
+ void passOptionalNullableSequenceOfAny(optional sequence<any>? arg);
+ void passOptionalSequenceOfAnyWithDefaultValue(optional sequence<any>? arg = null);
+ void passSequenceOfSequenceOfAny(sequence<sequence<any>> arg);
+ void passSequenceOfNullableSequenceOfAny(sequence<sequence<any>?> arg);
+ void passNullableSequenceOfNullableSequenceOfAny(sequence<sequence<any>?>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfAny(optional sequence<sequence<any>?>? arg);
+ void passMozMapOfAny(MozMap<any> arg);
+ void passNullableMozMapOfAny(MozMap<any>? arg);
+ void passOptionalMozMapOfAny(optional MozMap<any> arg);
+ void passOptionalNullableMozMapOfAny(optional MozMap<any>? arg);
+ void passOptionalMozMapOfAnyWithDefaultValue(optional MozMap<any>? arg = null);
+ void passMozMapOfMozMapOfAny(MozMap<MozMap<any>> arg);
+ void passMozMapOfNullableMozMapOfAny(MozMap<MozMap<any>?> arg);
+ void passNullableMozMapOfNullableMozMapOfAny(MozMap<MozMap<any>?>? arg);
+ void passOptionalNullableMozMapOfNullableMozMapOfAny(optional MozMap<MozMap<any>?>? arg);
+ void passOptionalNullableMozMapOfNullableSequenceOfAny(optional MozMap<sequence<any>?>? arg);
+ void passOptionalNullableSequenceOfNullableMozMapOfAny(optional sequence<MozMap<any>?>? arg);
+ any receiveAny();
+
+ // object types
+ void passObject(object arg);
+ void passVariadicObject(object... arg);
+ void passNullableObject(object? arg);
+ void passVariadicNullableObject(object... arg);
+ void passOptionalObject(optional object arg);
+ void passOptionalNullableObject(optional object? arg);
+ void passOptionalNullableObjectWithDefaultValue(optional object? arg = null);
+ void passSequenceOfObject(sequence<object> arg);
+ void passSequenceOfNullableObject(sequence<object?> arg);
+ void passNullableSequenceOfObject(sequence<object>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfObject(optional sequence<sequence<object>?>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfNullableObject(optional sequence<sequence<object?>?>? arg);
+ void passMozMapOfObject(MozMap<object> arg);
+ object receiveObject();
+ object? receiveNullableObject();
+
+ // Union types
+ void passUnion((object or long) arg);
+ // Some union tests are debug-only to avoid creating all those
+ // unused union types in opt builds.
+#ifdef DEBUG
+ void passUnion2((long or boolean) arg);
+ void passUnion3((object or long or boolean) arg);
+ void passUnion4((Node or long or boolean) arg);
+ void passUnion5((object or boolean) arg);
+ void passUnion6((object or DOMString) arg);
+ void passUnion7((object or DOMString or long) arg);
+ void passUnion8((object or DOMString or boolean) arg);
+ void passUnion9((object or DOMString or long or boolean) arg);
+ void passUnion10(optional (EventInit or long) arg);
+ void passUnion11(optional (CustomEventInit or long) arg);
+ void passUnion12(optional (EventInit or long) arg = 5);
+ void passUnion13(optional (object or long?) arg = null);
+ void passUnion14(optional (object or long?) arg = 5);
+ void passUnion15((sequence<long> or long) arg);
+ void passUnion16(optional (sequence<long> or long) arg);
+ void passUnion17(optional (sequence<long>? or long) arg = 5);
+ void passUnion18((sequence<object> or long) arg);
+ void passUnion19(optional (sequence<object> or long) arg);
+ void passUnion20(optional (sequence<object> or long) arg = []);
+ void passUnion21((MozMap<long> or long) arg);
+ void passUnion22((MozMap<object> or long) arg);
+ void passUnion23((sequence<ImageData> or long) arg);
+ void passUnion24((sequence<ImageData?> or long) arg);
+ void passUnion25((sequence<sequence<ImageData>> or long) arg);
+ void passUnion26((sequence<sequence<ImageData?>> or long) arg);
+ void passUnion27(optional (sequence<DOMString> or EventInit) arg);
+ void passUnion28(optional (EventInit or sequence<DOMString>) arg);
+ void passUnionWithCallback((EventHandler or long) arg);
+ void passUnionWithByteString((ByteString or long) arg);
+ void passUnionWithMozMap((MozMap<DOMString> or DOMString) arg);
+ void passUnionWithMozMapAndSequence((MozMap<DOMString> or sequence<DOMString>) arg);
+ void passUnionWithSequenceAndMozMap((sequence<DOMString> or MozMap<DOMString>) arg);
+ void passUnionWithSVS((USVString or long) arg);
+#endif
+ void passUnionWithNullable((object? or long) arg);
+ void passNullableUnion((object or long)? arg);
+ void passOptionalUnion(optional (object or long) arg);
+ void passOptionalNullableUnion(optional (object or long)? arg);
+ void passOptionalNullableUnionWithDefaultValue(optional (object or long)? arg = null);
+ //void passUnionWithInterfaces((TestInterface or TestExternalInterface) arg);
+ //void passUnionWithInterfacesAndNullable((TestInterface? or TestExternalInterface) arg);
+ //void passUnionWithSequence((sequence<object> or long) arg);
+ void passUnionWithArrayBuffer((ArrayBuffer or long) arg);
+ void passUnionWithString((DOMString or object) arg);
+ // Using an enum in a union. Note that we use some enum not declared in our
+ // binding file, because UnionTypes.h will need to include the binding header
+ // for this enum. Pick an enum from an interface that won't drag in too much
+ // stuff.
+ void passUnionWithEnum((SupportedType or object) arg);
+
+ // Trying to use a callback in a union won't include the test
+ // headers, unfortunately, so won't compile.
+ // void passUnionWithCallback((TestCallback or long) arg);
+ void passUnionWithObject((object or long) arg);
+ //void passUnionWithDict((Dict or long) arg);
+
+ void passUnionWithDefaultValue1(optional (double or DOMString) arg = "");
+ void passUnionWithDefaultValue2(optional (double or DOMString) arg = 1);
+ void passUnionWithDefaultValue3(optional (double or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue4(optional (float or DOMString) arg = "");
+ void passUnionWithDefaultValue5(optional (float or DOMString) arg = 1);
+ void passUnionWithDefaultValue6(optional (float or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue7(optional (unrestricted double or DOMString) arg = "");
+ void passUnionWithDefaultValue8(optional (unrestricted double or DOMString) arg = 1);
+ void passUnionWithDefaultValue9(optional (unrestricted double or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue10(optional (unrestricted double or DOMString) arg = Infinity);
+ void passUnionWithDefaultValue11(optional (unrestricted float or DOMString) arg = "");
+ void passUnionWithDefaultValue12(optional (unrestricted float or DOMString) arg = 1);
+ void passUnionWithDefaultValue13(optional (unrestricted float or DOMString) arg = Infinity);
+ void passUnionWithDefaultValue14(optional (double or ByteString) arg = "");
+ void passUnionWithDefaultValue15(optional (double or ByteString) arg = 1);
+ void passUnionWithDefaultValue16(optional (double or ByteString) arg = 1.5);
+ void passUnionWithDefaultValue17(optional (double or SupportedType) arg = "text/html");
+ void passUnionWithDefaultValue18(optional (double or SupportedType) arg = 1);
+ void passUnionWithDefaultValue19(optional (double or SupportedType) arg = 1.5);
+
+ void passNullableUnionWithDefaultValue1(optional (double or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue2(optional (double or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue3(optional (double or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue4(optional (float or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue5(optional (float or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue6(optional (float or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue7(optional (unrestricted double or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue8(optional (unrestricted double or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue9(optional (unrestricted double or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue10(optional (unrestricted float or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue11(optional (unrestricted float or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue12(optional (unrestricted float or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue13(optional (double or ByteString)? arg = "");
+ void passNullableUnionWithDefaultValue14(optional (double or ByteString)? arg = 1);
+ void passNullableUnionWithDefaultValue15(optional (double or ByteString)? arg = 1.5);
+ void passNullableUnionWithDefaultValue16(optional (double or ByteString)? arg = null);
+ void passNullableUnionWithDefaultValue17(optional (double or SupportedType)? arg = "text/html");
+ void passNullableUnionWithDefaultValue18(optional (double or SupportedType)? arg = 1);
+ void passNullableUnionWithDefaultValue19(optional (double or SupportedType)? arg = 1.5);
+ void passNullableUnionWithDefaultValue20(optional (double or SupportedType)? arg = null);
+
+ void passSequenceOfUnions(sequence<(CanvasPattern or CanvasGradient)> arg);
+ void passSequenceOfUnions2(sequence<(object or long)> arg);
+ void passVariadicUnion((CanvasPattern or CanvasGradient)... arg);
+
+ void passSequenceOfNullableUnions(sequence<(CanvasPattern or CanvasGradient)?> arg);
+ void passVariadicNullableUnion((CanvasPattern or CanvasGradient)?... arg);
+ void passMozMapOfUnions(MozMap<(CanvasPattern or CanvasGradient)> arg);
+ // XXXbz no move constructor on some unions
+ // void passMozMapOfUnions2(MozMap<(object or long)> arg);
+
+ (CanvasPattern or CanvasGradient) receiveUnion();
+ (object or long) receiveUnion2();
+ (CanvasPattern? or CanvasGradient) receiveUnionContainingNull();
+ (CanvasPattern or CanvasGradient)? receiveNullableUnion();
+ (object or long)? receiveNullableUnion2();
+
+ attribute (CanvasPattern or CanvasGradient) writableUnion;
+ attribute (CanvasPattern? or CanvasGradient) writableUnionContainingNull;
+ attribute (CanvasPattern or CanvasGradient)? writableNullableUnion;
+
+ // Date types
+ void passDate(Date arg);
+ void passNullableDate(Date? arg);
+ void passOptionalDate(optional Date arg);
+ void passOptionalNullableDate(optional Date? arg);
+ void passOptionalNullableDateWithDefaultValue(optional Date? arg = null);
+ void passDateSequence(sequence<Date> arg);
+ void passNullableDateSequence(sequence<Date?> arg);
+ void passDateMozMap(MozMap<Date> arg);
+ Date receiveDate();
+ Date? receiveNullableDate();
+
+ // Promise types
+ void passPromise(Promise<any> arg);
+ void passNullablePromise(Promise<any>? arg);
+ void passOptionalPromise(optional Promise<any> arg);
+ void passOptionalNullablePromise(optional Promise<any>? arg);
+ void passOptionalNullablePromiseWithDefaultValue(optional Promise<any>? arg = null);
+ void passPromiseSequence(sequence<Promise<any>> arg);
+ void passNullablePromiseSequence(sequence<Promise<any>?> arg);
+ Promise<any> receivePromise();
+ Promise<any> receiveAddrefedPromise();
+
+ // binaryNames tests
+ void methodRenamedFrom();
+ [BinaryName="otherMethodRenamedTo"]
+ void otherMethodRenamedFrom();
+ void methodRenamedFrom(byte argument);
+ readonly attribute byte attributeGetterRenamedFrom;
+ attribute byte attributeRenamedFrom;
+ [BinaryName="otherAttributeRenamedTo"]
+ attribute byte otherAttributeRenamedFrom;
+
+ void passDictionary(optional Dict x);
+ void passDictionary2(Dict x);
+ [Cached, Pure]
+ readonly attribute Dict readonlyDictionary;
+ [Cached, Pure]
+ readonly attribute Dict? readonlyNullableDictionary;
+ [Cached, Pure]
+ attribute Dict writableDictionary;
+ [Cached, Pure, Frozen]
+ readonly attribute Dict readonlyFrozenDictionary;
+ [Cached, Pure, Frozen]
+ readonly attribute Dict? readonlyFrozenNullableDictionary;
+ [Cached, Pure, Frozen]
+ attribute Dict writableFrozenDictionary;
+ Dict receiveDictionary();
+ Dict? receiveNullableDictionary();
+ void passOtherDictionary(optional GrandparentDict x);
+ void passSequenceOfDictionaries(sequence<Dict> x);
+ void passMozMapOfDictionaries(MozMap<GrandparentDict> x);
+ // No support for nullable dictionaries inside a sequence (nor should there be)
+ // void passSequenceOfNullableDictionaries(sequence<Dict?> x);
+ void passDictionaryOrLong(optional Dict x);
+ void passDictionaryOrLong(long x);
+
+ void passDictContainingDict(optional DictContainingDict arg);
+ void passDictContainingSequence(optional DictContainingSequence arg);
+ DictContainingSequence receiveDictContainingSequence();
+ void passVariadicDictionary(Dict... arg);
+
+ // EnforceRange/Clamp tests
+ void dontEnforceRangeOrClamp(byte arg);
+ void doEnforceRange([EnforceRange] byte arg);
+ void doClamp([Clamp] byte arg);
+ [EnforceRange] attribute byte enforcedByte;
+ [Clamp] attribute byte clampedByte;
+
+ // Typedefs
+ const myLong myLongConstant = 5;
+ void exerciseTypedefInterfaces1(AnotherNameForTestInterface arg);
+ AnotherNameForTestInterface exerciseTypedefInterfaces2(NullableTestInterface arg);
+ void exerciseTypedefInterfaces3(YetAnotherNameForTestInterface arg);
+
+ // Deprecated methods and attributes
+ [Deprecated="GetAttributeNode"]
+ attribute boolean deprecatedAttribute;
+ [Deprecated="GetAttributeNode"]
+ void deprecatedMethod(boolean arg);
+ [Deprecated="GetAttributeNode"]
+ void deprecatedMethodWithContext(any arg);
+
+ // Static methods and attributes
+ static attribute boolean staticAttribute;
+ static void staticMethod(boolean arg);
+ static void staticMethodWithContext(any arg);
+
+ // Deprecated methods and attributes;
+ [Deprecated="GetAttributeNode"]
+ static attribute boolean staticDeprecatedAttribute;
+ [Deprecated="GetAttributeNode"]
+ static void staticDeprecatedMethod(boolean arg);
+ [Deprecated="GetAttributeNode"]
+ static void staticDeprecatedMethodWithContext(any arg);
+
+ // Overload resolution tests
+ //void overload1(DOMString... strs);
+ boolean overload1(TestInterface arg);
+ TestInterface overload1(DOMString strs, TestInterface arg);
+ void overload2(TestInterface arg);
+ void overload2(optional Dict arg);
+ void overload2(boolean arg);
+ void overload2(DOMString arg);
+ void overload2(Date arg);
+ void overload3(TestInterface arg);
+ void overload3(TestCallback arg);
+ void overload3(boolean arg);
+ void overload4(TestInterface arg);
+ void overload4(TestCallbackInterface arg);
+ void overload4(DOMString arg);
+ void overload5(long arg);
+ void overload5(TestEnum arg);
+ void overload6(long arg);
+ void overload6(boolean arg);
+ void overload7(long arg);
+ void overload7(boolean arg);
+ void overload7(ByteString arg);
+ void overload8(long arg);
+ void overload8(TestInterface arg);
+ void overload9(long? arg);
+ void overload9(DOMString arg);
+ void overload10(long? arg);
+ void overload10(object arg);
+ void overload11(long arg);
+ void overload11(DOMString? arg);
+ void overload12(long arg);
+ void overload12(boolean? arg);
+ void overload13(long? arg);
+ void overload13(boolean arg);
+ void overload14(optional long arg);
+ void overload14(TestInterface arg);
+ void overload15(long arg);
+ void overload15(optional TestInterface arg);
+ void overload16(long arg);
+ void overload16(optional TestInterface? arg);
+ void overload17(sequence<long> arg);
+ void overload17(MozMap<long> arg);
+ void overload18(MozMap<DOMString> arg);
+ void overload18(sequence<DOMString> arg);
+ void overload19(sequence<long> arg);
+ void overload19(optional Dict arg);
+ void overload20(optional Dict arg);
+ void overload20(sequence<long> arg);
+
+ // Variadic handling
+ void passVariadicThirdArg(DOMString arg1, long arg2, TestInterface... arg3);
+
+ // Conditionally exposed methods/attributes
+ [Pref="abc.def"]
+ readonly attribute boolean prefable1;
+ [Pref="abc.def"]
+ readonly attribute boolean prefable2;
+ [Pref="ghi.jkl"]
+ readonly attribute boolean prefable3;
+ [Pref="ghi.jkl"]
+ readonly attribute boolean prefable4;
+ [Pref="abc.def"]
+ readonly attribute boolean prefable5;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable6;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable7;
+ [Pref="ghi.jkl", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable8;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable9;
+ [Pref="abc.def"]
+ void prefable10();
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void prefable11();
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable12;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void prefable13();
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable14;
+ [Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable15;
+ [Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable16;
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ void prefable17();
+ [Func="TestFuncControlledMember"]
+ void prefable18();
+ [Func="TestFuncControlledMember"]
+ void prefable19();
+
+ // Conditionally exposed methods/attributes involving [SecureContext]
+ [SecureContext]
+ readonly attribute boolean conditionalOnSecureContext1;
+ [SecureContext, Pref="abc.def"]
+ readonly attribute boolean conditionalOnSecureContext2;
+ [SecureContext, Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean conditionalOnSecureContext3;
+ [SecureContext, Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean conditionalOnSecureContext4;
+ [SecureContext]
+ void conditionalOnSecureContext5();
+ [SecureContext, Pref="abc.def"]
+ void conditionalOnSecureContext6();
+ [SecureContext, Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void conditionalOnSecureContext7();
+ [SecureContext, Pref="abc.def", Func="TestFuncControlledMember"]
+ void conditionalOnSecureContext8();
+
+ // Miscellania
+ [LenientThis] attribute long attrWithLenientThis;
+ [Unforgeable] readonly attribute long unforgeableAttr;
+ [Unforgeable, ChromeOnly] readonly attribute long unforgeableAttr2;
+ [Unforgeable] long unforgeableMethod();
+ [Unforgeable, ChromeOnly] long unforgeableMethod2();
+ stringifier;
+ void passRenamedInterface(TestRenamedInterface arg);
+ [PutForwards=writableByte] readonly attribute TestExampleInterface putForwardsAttr;
+ [PutForwards=writableByte, LenientThis] readonly attribute TestExampleInterface putForwardsAttr2;
+ [PutForwards=writableByte, ChromeOnly] readonly attribute TestExampleInterface putForwardsAttr3;
+ [Throws] void throwingMethod();
+ [Throws] attribute boolean throwingAttr;
+ [GetterThrows] attribute boolean throwingGetterAttr;
+ [SetterThrows] attribute boolean throwingSetterAttr;
+ [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod();
+ [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr;
+ [NeedsCallerType] void needsCallerTypeMethod();
+ [NeedsCallerType] attribute boolean needsCallerTypeAttr;
+ legacycaller short(unsigned long arg1, TestInterface arg2);
+ void passArgsWithDefaults(optional long arg1,
+ optional TestInterface? arg2 = null,
+ optional Dict arg3, optional double arg4 = 5.0,
+ optional float arg5);
+ attribute any jsonifierShouldSkipThis;
+ attribute TestParentInterface jsonifierShouldSkipThis2;
+ attribute TestCallbackInterface jsonifierShouldSkipThis3;
+ jsonifier;
+
+ attribute byte dashed-attribute;
+ void dashed-method();
+
+ // If you add things here, add them to TestCodeGen and TestJSImplGen as well
+};
+
+interface TestExampleProxyInterface {
+ getter long longIndexedGetter(unsigned long ix);
+ setter creator void longIndexedSetter(unsigned long y, long z);
+ stringifier DOMString myStringifier();
+ getter short shortNameGetter(DOMString nom);
+ deleter void (DOMString nomnom);
+ setter creator void shortNamedSetter(DOMString me, short value);
+};
+
+[Exposed=(Window,Worker)]
+interface TestExampleWorkerInterface {
+ [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod();
+ [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr;
+ [NeedsCallerType] void needsCallerTypeMethod();
+ [NeedsCallerType] attribute boolean needsCallerTypeAttr;
+};
diff --git a/dom/bindings/test/TestFunctions.cpp b/dom/bindings/test/TestFunctions.cpp
new file mode 100644
index 000000000..f05c92b48
--- /dev/null
+++ b/dom/bindings/test/TestFunctions.cpp
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestFunctions.h"
+#include "mozilla/dom/TestFunctionsBinding.h"
+#include "nsStringBuffer.h"
+
+namespace mozilla {
+namespace dom {
+
+/* static */ TestFunctions*
+TestFunctions::Constructor(GlobalObject& aGlobal, ErrorResult& aRv)
+{
+ return new TestFunctions;
+}
+
+/* static */ void
+TestFunctions::ThrowUncatchableException(GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ aRv.ThrowUncatchableException();
+}
+
+/* static */ Promise*
+TestFunctions::PassThroughPromise(GlobalObject& aGlobal, Promise& aPromise)
+{
+ return &aPromise;
+}
+
+/* static */ already_AddRefed<Promise>
+TestFunctions::PassThroughCallbackPromise(GlobalObject& aGlobal,
+ PromiseReturner& aCallback,
+ ErrorResult& aRv)
+{
+ return aCallback.Call(aRv);
+}
+
+void
+TestFunctions::SetStringData(const nsAString& aString)
+{
+ mStringData = aString;
+}
+
+void
+TestFunctions::GetStringDataAsAString(nsAString& aString)
+{
+ aString = mStringData;
+}
+
+void
+TestFunctions::GetStringDataAsAString(uint32_t aLength, nsAString& aString)
+{
+ MOZ_RELEASE_ASSERT(aLength <= mStringData.Length(),
+ "Bogus test passing in a too-big length");
+ aString.Assign(mStringData.BeginReading(), aLength);
+}
+
+void
+TestFunctions::GetStringDataAsDOMString(const Optional<uint32_t>& aLength,
+ DOMString& aString)
+{
+ uint32_t length;
+ if (aLength.WasPassed()) {
+ length = aLength.Value();
+ MOZ_RELEASE_ASSERT(length <= mStringData.Length(),
+ "Bogus test passing in a too-big length");
+ } else {
+ length = mStringData.Length();
+ }
+
+ nsStringBuffer* buf = nsStringBuffer::FromString(mStringData);
+ if (buf) {
+ aString.SetStringBuffer(buf, length);
+ return;
+ }
+
+ // We better have an empty mStringData; otherwise why did we not have a string
+ // buffer?
+ MOZ_RELEASE_ASSERT(length == 0, "Why no stringbuffer?");
+ // No need to do anything here; aString is already empty.
+}
+
+bool
+TestFunctions::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto,
+ JS::MutableHandle<JSObject*> aWrapper)
+{
+ return TestFunctionsBinding::Wrap(aCx, this, aGivenProto, aWrapper);
+}
+
+}
+}
diff --git a/dom/bindings/test/TestFunctions.h b/dom/bindings/test/TestFunctions.h
new file mode 100644
index 000000000..b35464824
--- /dev/null
+++ b/dom/bindings/test/TestFunctions.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestFunctions_h
+#define mozilla_dom_TestFunctions_h
+
+#include "mozilla/ErrorResult.h"
+#include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/NonRefcountedDOMObject.h"
+#include "nsString.h"
+
+namespace mozilla {
+namespace dom {
+
+class Promise;
+class PromiseReturner;
+
+class TestFunctions : public NonRefcountedDOMObject {
+public:
+ static TestFunctions* Constructor(GlobalObject& aGlobal, ErrorResult& aRv);
+
+ static void
+ ThrowUncatchableException(GlobalObject& aGlobal, ErrorResult& aRv);
+
+ static Promise*
+ PassThroughPromise(GlobalObject& aGlobal, Promise& aPromise);
+
+ static already_AddRefed<Promise>
+ PassThroughCallbackPromise(GlobalObject& aGlobal,
+ PromiseReturner& aCallback,
+ ErrorResult& aRv);
+
+ void SetStringData(const nsAString& aString);
+
+ void GetStringDataAsAString(nsAString& aString);
+ void GetStringDataAsAString(uint32_t aLength, nsAString& aString);
+ void GetStringDataAsDOMString(const Optional<uint32_t>& aLength,
+ DOMString& aString);
+
+ bool WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto,
+ JS::MutableHandle<JSObject*> aWrapper);
+private:
+ nsString mStringData;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestFunctions_h
diff --git a/dom/bindings/test/TestInterfaceIterableDouble.cpp b/dom/bindings/test/TestInterfaceIterableDouble.cpp
new file mode 100644
index 000000000..33a4c97d1
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceIterableDouble.cpp
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceIterableDouble.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceIterableDouble, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceIterableDouble)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceIterableDouble)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceIterableDouble)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceIterableDouble::TestInterfaceIterableDouble(nsPIDOMWindowInner* aParent)
+ : mParent(aParent)
+{
+ mValues.AppendElement(std::pair<nsString, nsString>(NS_LITERAL_STRING("a"),
+ NS_LITERAL_STRING("b")));
+ mValues.AppendElement(std::pair<nsString, nsString>(NS_LITERAL_STRING("c"),
+ NS_LITERAL_STRING("d")));
+ mValues.AppendElement(std::pair<nsString, nsString>(NS_LITERAL_STRING("e"),
+ NS_LITERAL_STRING("f")));
+}
+
+//static
+already_AddRefed<TestInterfaceIterableDouble>
+TestInterfaceIterableDouble::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceIterableDouble> r = new TestInterfaceIterableDouble(window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceIterableDouble::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceIterableDoubleBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceIterableDouble::GetParentObject() const
+{
+ return mParent;
+}
+
+size_t
+TestInterfaceIterableDouble::GetIterableLength()
+{
+ return mValues.Length();
+}
+
+nsAString&
+TestInterfaceIterableDouble::GetKeyAtIndex(uint32_t aIndex)
+{
+ MOZ_ASSERT(aIndex < mValues.Length());
+ return mValues.ElementAt(aIndex).first;
+}
+
+nsAString&
+TestInterfaceIterableDouble::GetValueAtIndex(uint32_t aIndex)
+{
+ MOZ_ASSERT(aIndex < mValues.Length());
+ return mValues.ElementAt(aIndex).second;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceIterableDouble.h b/dom/bindings/test/TestInterfaceIterableDouble.h
new file mode 100644
index 000000000..1e9ff7acd
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceIterableDouble.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceIterableDouble_h
+#define mozilla_dom_TestInterfaceIterableDouble_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl iterable interfaces, using
+// primitives for value type
+class TestInterfaceIterableDouble final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceIterableDouble)
+
+ explicit TestInterfaceIterableDouble(nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceIterableDouble>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& rv);
+
+ size_t GetIterableLength();
+ nsAString& GetKeyAtIndex(uint32_t aIndex);
+ nsAString& GetValueAtIndex(uint32_t aIndex);
+private:
+ virtual ~TestInterfaceIterableDouble() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+ nsTArray<std::pair<nsString, nsString>> mValues;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceIterableDouble_h
diff --git a/dom/bindings/test/TestInterfaceIterableDoubleUnion.cpp b/dom/bindings/test/TestInterfaceIterableDoubleUnion.cpp
new file mode 100644
index 000000000..29151a4c5
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceIterableDoubleUnion.cpp
@@ -0,0 +1,83 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceIterableDoubleUnion.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceIterableDoubleUnion, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceIterableDoubleUnion)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceIterableDoubleUnion)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceIterableDoubleUnion)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceIterableDoubleUnion::TestInterfaceIterableDoubleUnion(nsPIDOMWindowInner* aParent)
+ : mParent(aParent)
+{
+ OwningStringOrLong a;
+ a.SetAsLong() = 1;
+ mValues.AppendElement(std::pair<nsString, OwningStringOrLong>(NS_LITERAL_STRING("long"),
+ a));
+ a.SetAsString() = NS_LITERAL_STRING("a");
+ mValues.AppendElement(std::pair<nsString, OwningStringOrLong>(NS_LITERAL_STRING("string"),
+ a));
+}
+
+//static
+already_AddRefed<TestInterfaceIterableDoubleUnion>
+TestInterfaceIterableDoubleUnion::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceIterableDoubleUnion> r = new TestInterfaceIterableDoubleUnion(window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceIterableDoubleUnion::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceIterableDoubleUnionBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceIterableDoubleUnion::GetParentObject() const
+{
+ return mParent;
+}
+
+size_t
+TestInterfaceIterableDoubleUnion::GetIterableLength()
+{
+ return mValues.Length();
+}
+
+nsAString&
+TestInterfaceIterableDoubleUnion::GetKeyAtIndex(uint32_t aIndex)
+{
+ MOZ_ASSERT(aIndex < mValues.Length());
+ return mValues.ElementAt(aIndex).first;
+}
+
+OwningStringOrLong&
+TestInterfaceIterableDoubleUnion::GetValueAtIndex(uint32_t aIndex)
+{
+ MOZ_ASSERT(aIndex < mValues.Length());
+ return mValues.ElementAt(aIndex).second;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceIterableDoubleUnion.h b/dom/bindings/test/TestInterfaceIterableDoubleUnion.h
new file mode 100644
index 000000000..ff6ea2175
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceIterableDoubleUnion.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceIterableDoubleUnion_h
+#define mozilla_dom_TestInterfaceIterableDoubleUnion_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl iterable interfaces, using
+// primitives for value type
+class TestInterfaceIterableDoubleUnion final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceIterableDoubleUnion)
+
+ explicit TestInterfaceIterableDoubleUnion(nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceIterableDoubleUnion>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& rv);
+
+ size_t GetIterableLength();
+ nsAString& GetKeyAtIndex(uint32_t aIndex);
+ OwningStringOrLong& GetValueAtIndex(uint32_t aIndex);
+private:
+ virtual ~TestInterfaceIterableDoubleUnion() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+ nsTArray<std::pair<nsString, OwningStringOrLong>> mValues;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceIterableDoubleUnion_h
diff --git a/dom/bindings/test/TestInterfaceIterableSingle.cpp b/dom/bindings/test/TestInterfaceIterableSingle.cpp
new file mode 100644
index 000000000..5f8d6c640
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceIterableSingle.cpp
@@ -0,0 +1,77 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceIterableSingle.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceIterableSingle, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceIterableSingle)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceIterableSingle)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceIterableSingle)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceIterableSingle::TestInterfaceIterableSingle(nsPIDOMWindowInner* aParent)
+ : mParent(aParent)
+{
+ for (int i = 0; i < 3; ++i) {
+ mValues.AppendElement(i);
+ }
+}
+
+//static
+already_AddRefed<TestInterfaceIterableSingle>
+TestInterfaceIterableSingle::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceIterableSingle> r = new TestInterfaceIterableSingle(window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceIterableSingle::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceIterableSingleBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceIterableSingle::GetParentObject() const
+{
+ return mParent;
+}
+
+uint32_t
+TestInterfaceIterableSingle::Length() const
+{
+ return mValues.Length();
+}
+
+int32_t
+TestInterfaceIterableSingle::IndexedGetter(uint32_t aIndex, bool& aFound) const
+{
+ if (aIndex >= mValues.Length()) {
+ aFound = false;
+ return 0;
+ }
+
+ aFound = true;
+ return mValues[aIndex];
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceIterableSingle.h b/dom/bindings/test/TestInterfaceIterableSingle.h
new file mode 100644
index 000000000..a071ada8b
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceIterableSingle.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceIterableSingle_h
+#define mozilla_dom_TestInterfaceIterableSingle_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl iterable interfaces, using
+// primitives for value type
+class TestInterfaceIterableSingle final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceIterableSingle)
+
+ explicit TestInterfaceIterableSingle(nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceIterableSingle>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& rv);
+
+ uint32_t Length() const;
+ int32_t IndexedGetter(uint32_t aIndex, bool& aFound) const;
+
+private:
+ virtual ~TestInterfaceIterableSingle() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+ nsTArray<int32_t> mValues;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceIterableSingle_h
diff --git a/dom/bindings/test/TestInterfaceJS.js b/dom/bindings/test/TestInterfaceJS.js
new file mode 100644
index 000000000..1a5bf8e61
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceJS.js
@@ -0,0 +1,166 @@
+/* -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+const Cu = Components.utils;
+const Ci = Components.interfaces;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+function TestInterfaceJS(anyArg, objectArg) {}
+
+TestInterfaceJS.prototype = {
+ classID: Components.ID("{2ac4e026-cf25-47d5-b067-78d553c3cad8}"),
+ contractID: "@mozilla.org/dom/test-interface-js;1",
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+
+ init: function(win) { this._win = win; },
+
+ __init: function (anyArg, objectArg, dictionaryArg) {
+ this._anyAttr = undefined;
+ this._objectAttr = null;
+ this._anyArg = anyArg;
+ this._objectArg = objectArg;
+ this._dictionaryArg = dictionaryArg;
+ this._cachedAttr = 15;
+ },
+
+ get anyArg() { return this._anyArg; },
+ get objectArg() { return this._objectArg; },
+ get dictionaryArg() { return this._dictionaryArg; },
+ get anyAttr() { return this._anyAttr; },
+ set anyAttr(val) { this._anyAttr = val; },
+ get objectAttr() { return this._objectAttr; },
+ set objectAttr(val) { this._objectAttr = val; },
+ get dictionaryAttr() { return this._dictionaryAttr; },
+ set dictionaryAttr(val) { this._dictionaryAttr = val; },
+ pingPongAny: function(any) { return any; },
+ pingPongObject: function(obj) { return obj; },
+ pingPongObjectOrString: function(objectOrString) { return objectOrString; },
+ pingPongDictionary: function(dict) { return dict; },
+ pingPongDictionaryOrLong: function(dictOrLong) { return dictOrLong.anyMember || dictOrLong; },
+ pingPongMap: function(map) { return JSON.stringify(map); },
+ objectSequenceLength: function(seq) { return seq.length; },
+ anySequenceLength: function(seq) { return seq.length; },
+
+
+ getCallerPrincipal: function() { return Cu.getWebIDLCallerPrincipal().origin; },
+
+ convertSVS: function(svs) { return svs; },
+
+ pingPongUnion: function(x) { return x; },
+ pingPongUnionContainingNull: function(x) { return x; },
+ pingPongNullableUnion: function(x) { return x; },
+ returnBadUnion: function(x) { return 3; },
+
+ get cachedAttr() { return this._cachedAttr; },
+ setCachedAttr: function(n) { this._cachedAttr = n; },
+ clearCachedAttrCache: function () { this.__DOM_IMPL__._clearCachedCachedAttrValue(); },
+
+ testSequenceOverload: function(arg) {},
+ testSequenceUnion: function(arg) {},
+
+ testThrowError: function() {
+ throw new this._win.Error("We are an Error");
+ },
+
+ testThrowDOMException: function() {
+ throw new this._win.DOMException("We are a DOMException",
+ "NotSupportedError");
+ },
+
+ testThrowTypeError: function() {
+ throw new this._win.TypeError("We are a TypeError");
+ },
+
+ testThrowCallbackError: function(callback) {
+ callback();
+ },
+
+ testThrowXraySelfHosted: function() {
+ this._win.Array.indexOf();
+ },
+
+ testThrowSelfHosted: function() {
+ Array.indexOf();
+ },
+
+ testPromiseWithThrowingChromePromiseInit: function() {
+ return new this._win.Promise(function() {
+ noSuchMethodExistsYo1();
+ })
+ },
+
+ testPromiseWithThrowingContentPromiseInit: function(func) {
+ return new this._win.Promise(func);
+ },
+
+ testPromiseWithDOMExceptionThrowingPromiseInit: function() {
+ return new this._win.Promise(() => {
+ throw new this._win.DOMException("We are a second DOMException",
+ "NotFoundError");
+ })
+ },
+
+ testPromiseWithThrowingChromeThenFunction: function() {
+ return this._win.Promise.resolve(5).then(function() {
+ noSuchMethodExistsYo2();
+ });
+ },
+
+ testPromiseWithThrowingContentThenFunction: function(func) {
+ return this._win.Promise.resolve(10).then(func);
+ },
+
+ testPromiseWithDOMExceptionThrowingThenFunction: function() {
+ return this._win.Promise.resolve(5).then(() => {
+ throw new this._win.DOMException("We are a third DOMException",
+ "NetworkError");
+ });
+ },
+
+ testPromiseWithThrowingChromeThenable: function() {
+ var thenable = {
+ then: function() {
+ noSuchMethodExistsYo3()
+ }
+ };
+ return new this._win.Promise(function(resolve) {
+ resolve(thenable)
+ });
+ },
+
+ testPromiseWithThrowingContentThenable: function(thenable) {
+ // Waive Xrays on the thenable, because we're calling resolve() in the
+ // chrome compartment, so that's the compartment the "then" property get
+ // will happen in, and if we leave the Xray in place the function-valued
+ // property won't return the function.
+ return this._win.Promise.resolve(Cu.waiveXrays(thenable));
+ },
+
+ testPromiseWithDOMExceptionThrowingThenable: function() {
+ var thenable = {
+ then: () => {
+ throw new this._win.DOMException("We are a fourth DOMException",
+ "TypeMismatchError");
+ }
+ };
+ return new this._win.Promise(function(resolve) {
+ resolve(thenable)
+ });
+ },
+
+ get onsomething() {
+ return this.__DOM_IMPL__.getEventHandler("onsomething");
+ },
+
+ set onsomething(val) {
+ this.__DOM_IMPL__.setEventHandler("onsomething", val);
+ }
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([TestInterfaceJS])
diff --git a/dom/bindings/test/TestInterfaceJS.manifest b/dom/bindings/test/TestInterfaceJS.manifest
new file mode 100644
index 000000000..161a42156
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceJS.manifest
@@ -0,0 +1,4 @@
+component {2ac4e026-cf25-47d5-b067-78d553c3cad8} TestInterfaceJS.js
+contract @mozilla.org/dom/test-interface-js;1 {2ac4e026-cf25-47d5-b067-78d553c3cad8}
+component {4bc6f6f3-e005-4f0a-b42d-4d1663a9013a} TestInterfaceJSMaplike.js
+contract @mozilla.org/dom/test-interface-js-maplike;1 {4bc6f6f3-e005-4f0a-b42d-4d1663a9013a}
diff --git a/dom/bindings/test/TestInterfaceJSMaplike.js b/dom/bindings/test/TestInterfaceJSMaplike.js
new file mode 100644
index 000000000..b108ef5b6
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceJSMaplike.js
@@ -0,0 +1,38 @@
+/* -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+const Cu = Components.utils;
+const Ci = Components.interfaces;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+function TestInterfaceJSMaplike() {}
+
+TestInterfaceJSMaplike.prototype = {
+ classID: Components.ID("{4bc6f6f3-e005-4f0a-b42d-4d1663a9013a}"),
+ contractID: "@mozilla.org/dom/test-interface-js-maplike;1",
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+
+ init: function(win) { this._win = win; },
+
+ __init: function () {},
+
+ setInternal: function(aKey, aValue) {
+ return this.__DOM_IMPL__.__set(aKey, aValue);
+ },
+
+ deleteInternal: function(aKey) {
+ return this.__DOM_IMPL__.__delete(aKey);
+ },
+
+ clearInternal: function() {
+ return this.__DOM_IMPL__.__clear();
+ }
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([TestInterfaceJSMaplike])
diff --git a/dom/bindings/test/TestInterfaceMaplike.cpp b/dom/bindings/test/TestInterfaceMaplike.cpp
new file mode 100644
index 000000000..4abace83c
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceMaplike.cpp
@@ -0,0 +1,84 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceMaplike.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceMaplike, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceMaplike)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceMaplike)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceMaplike)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceMaplike::TestInterfaceMaplike(nsPIDOMWindowInner* aParent)
+: mParent(aParent)
+{
+}
+
+//static
+already_AddRefed<TestInterfaceMaplike>
+TestInterfaceMaplike::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceMaplike> r = new TestInterfaceMaplike(window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceMaplike::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceMaplikeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceMaplike::GetParentObject() const
+{
+ return mParent;
+}
+
+void
+TestInterfaceMaplike::SetInternal(const nsAString& aKey, int32_t aValue)
+{
+ ErrorResult rv;
+ TestInterfaceMaplikeBinding::MaplikeHelpers::Set(this, aKey, aValue, rv);
+}
+
+void
+TestInterfaceMaplike::ClearInternal()
+{
+ ErrorResult rv;
+ TestInterfaceMaplikeBinding::MaplikeHelpers::Clear(this, rv);
+}
+
+bool
+TestInterfaceMaplike::DeleteInternal(const nsAString& aKey)
+{
+ ErrorResult rv;
+ return TestInterfaceMaplikeBinding::MaplikeHelpers::Delete(this, aKey, rv);
+}
+
+bool
+TestInterfaceMaplike::HasInternal(const nsAString& aKey)
+{
+ ErrorResult rv;
+ return TestInterfaceMaplikeBinding::MaplikeHelpers::Has(this, aKey, rv);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceMaplike.h b/dom/bindings/test/TestInterfaceMaplike.h
new file mode 100644
index 000000000..c012a7a21
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceMaplike.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceMaplike_h
+#define mozilla_dom_TestInterfaceMaplike_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl maplike interfaces, using
+// primitives for key and value types.
+class TestInterfaceMaplike final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceMaplike)
+
+ explicit TestInterfaceMaplike(nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceMaplike>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& rv);
+
+ // External access for testing internal convenience functions.
+ void SetInternal(const nsAString& aKey, int32_t aValue);
+ void ClearInternal();
+ bool DeleteInternal(const nsAString& aKey);
+ bool HasInternal(const nsAString& aKey);
+private:
+ virtual ~TestInterfaceMaplike() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceMaplike_h
diff --git a/dom/bindings/test/TestInterfaceMaplikeObject.cpp b/dom/bindings/test/TestInterfaceMaplikeObject.cpp
new file mode 100644
index 000000000..3dc1ffdc4
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceMaplikeObject.cpp
@@ -0,0 +1,88 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceMaplikeObject.h"
+#include "mozilla/dom/TestInterfaceMaplike.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceMaplikeObject, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceMaplikeObject)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceMaplikeObject)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceMaplikeObject)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceMaplikeObject::TestInterfaceMaplikeObject(nsPIDOMWindowInner* aParent)
+: mParent(aParent)
+{
+}
+
+//static
+already_AddRefed<TestInterfaceMaplikeObject>
+TestInterfaceMaplikeObject::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceMaplikeObject> r =
+ new TestInterfaceMaplikeObject(window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceMaplikeObject::WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceMaplikeObjectBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceMaplikeObject::GetParentObject() const
+{
+ return mParent;
+}
+
+void
+TestInterfaceMaplikeObject::SetInternal(const nsAString& aKey)
+{
+ RefPtr<TestInterfaceMaplike> p(new TestInterfaceMaplike(mParent));
+ ErrorResult rv;
+ TestInterfaceMaplikeObjectBinding::MaplikeHelpers::Set(this, aKey, *p, rv);
+}
+
+void
+TestInterfaceMaplikeObject::ClearInternal()
+{
+ ErrorResult rv;
+ TestInterfaceMaplikeObjectBinding::MaplikeHelpers::Clear(this, rv);
+}
+
+bool
+TestInterfaceMaplikeObject::DeleteInternal(const nsAString& aKey)
+{
+ ErrorResult rv;
+ return TestInterfaceMaplikeObjectBinding::MaplikeHelpers::Delete(this, aKey, rv);
+}
+
+bool
+TestInterfaceMaplikeObject::HasInternal(const nsAString& aKey)
+{
+ ErrorResult rv;
+ return TestInterfaceMaplikeObjectBinding::MaplikeHelpers::Has(this, aKey, rv);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceMaplikeObject.h b/dom/bindings/test/TestInterfaceMaplikeObject.h
new file mode 100644
index 000000000..af4660c0d
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceMaplikeObject.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceMaplikeObject_h
+#define mozilla_dom_TestInterfaceMaplikeObject_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl maplike interfaces, using
+// primitives for key types and objects for value types.
+class TestInterfaceMaplikeObject final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceMaplikeObject)
+
+ explicit TestInterfaceMaplikeObject(nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceMaplikeObject>
+ Constructor(const GlobalObject& aGlobal,ErrorResult& rv);
+
+ // External access for testing internal convenience functions.
+ void SetInternal(const nsAString& aKey);
+ void ClearInternal();
+ bool DeleteInternal(const nsAString& aKey);
+ bool HasInternal(const nsAString& aKey);
+private:
+ virtual ~TestInterfaceMaplikeObject() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceMaplikeObject_h
diff --git a/dom/bindings/test/TestInterfaceSetlike.cpp b/dom/bindings/test/TestInterfaceSetlike.cpp
new file mode 100644
index 000000000..c9f556076
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceSetlike.cpp
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceSetlike.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceSetlike, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceSetlike)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceSetlike)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceSetlike)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceSetlike::TestInterfaceSetlike(JSContext* aCx,
+ nsPIDOMWindowInner* aParent)
+: mParent(aParent)
+{
+}
+
+//static
+already_AddRefed<TestInterfaceSetlike>
+TestInterfaceSetlike::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceSetlike> r = new TestInterfaceSetlike(nullptr, window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceSetlike::WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceSetlikeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceSetlike::GetParentObject() const
+{
+ return mParent;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceSetlike.h b/dom/bindings/test/TestInterfaceSetlike.h
new file mode 100644
index 000000000..c9f464960
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceSetlike.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceSetlike_h
+#define mozilla_dom_TestInterfaceSetlike_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl setlike interfaces, using
+// primitives for key type.
+class TestInterfaceSetlike final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceSetlike)
+ explicit TestInterfaceSetlike(JSContext* aCx,
+ nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceSetlike>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& rv);
+private:
+ virtual ~TestInterfaceSetlike() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceSetlike_h
diff --git a/dom/bindings/test/TestInterfaceSetlikeNode.cpp b/dom/bindings/test/TestInterfaceSetlikeNode.cpp
new file mode 100644
index 000000000..5499553fa
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceSetlikeNode.cpp
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TestInterfaceSetlikeNode.h"
+#include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/BindingUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceSetlikeNode, mParent)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceSetlikeNode)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceSetlikeNode)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceSetlikeNode)
+NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TestInterfaceSetlikeNode::TestInterfaceSetlikeNode(JSContext* aCx,
+ nsPIDOMWindowInner* aParent)
+: mParent(aParent)
+{
+}
+
+//static
+already_AddRefed<TestInterfaceSetlikeNode>
+TestInterfaceSetlikeNode::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TestInterfaceSetlikeNode> r = new TestInterfaceSetlikeNode(nullptr, window);
+ return r.forget();
+}
+
+JSObject*
+TestInterfaceSetlikeNode::WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto)
+{
+ return TestInterfaceSetlikeNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+TestInterfaceSetlikeNode::GetParentObject() const
+{
+ return mParent;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/bindings/test/TestInterfaceSetlikeNode.h b/dom/bindings/test/TestInterfaceSetlikeNode.h
new file mode 100644
index 000000000..05b14190e
--- /dev/null
+++ b/dom/bindings/test/TestInterfaceSetlikeNode.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TestInterfaceSetlikeNode_h
+#define mozilla_dom_TestInterfaceSetlikeNode_h
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+// Implementation of test binding for webidl setlike interfaces, using
+// primitives for key type.
+class TestInterfaceSetlikeNode final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TestInterfaceSetlikeNode)
+ explicit TestInterfaceSetlikeNode(JSContext* aCx,
+ nsPIDOMWindowInner* aParent);
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+ static already_AddRefed<TestInterfaceSetlikeNode>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& rv);
+private:
+ virtual ~TestInterfaceSetlikeNode() {}
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TestInterfaceSetlikeNode_h
diff --git a/dom/bindings/test/TestJSImplGen.webidl b/dom/bindings/test/TestJSImplGen.webidl
new file mode 100644
index 000000000..a131dcdfe
--- /dev/null
+++ b/dom/bindings/test/TestJSImplGen.webidl
@@ -0,0 +1,836 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+typedef TestJSImplInterface AnotherNameForTestJSImplInterface;
+typedef TestJSImplInterface YetAnotherNameForTestJSImplInterface;
+typedef TestJSImplInterface? NullableTestJSImplInterface;
+
+callback MyTestCallback = void();
+
+enum MyTestEnum {
+ "a",
+ "b"
+};
+
+// We don't support multiple constructors (bug 869268) or named constructors
+// for JS-implemented WebIDL.
+[Constructor(DOMString str, unsigned long num, boolean? boolArg,
+ TestInterface? iface, long arg1,
+ DictForConstructor dict, any any1,
+ object obj1,
+ object? obj2, sequence<Dict> seq, optional any any2,
+ optional object obj3,
+ optional object? obj4,
+ Uint8Array typedArr,
+ ArrayBuffer arrayBuf),
+ JSImplementation="@mozilla.org/test-js-impl-interface;1"]
+interface TestJSImplInterface {
+ // Integer types
+ // XXXbz add tests for throwing versions of all the integer stuff
+ readonly attribute byte readonlyByte;
+ attribute byte writableByte;
+ void passByte(byte arg);
+ byte receiveByte();
+ void passOptionalByte(optional byte arg);
+ void passOptionalByteBeforeRequired(optional byte arg1, byte arg2);
+ void passOptionalByteWithDefault(optional byte arg = 0);
+ void passOptionalByteWithDefaultBeforeRequired(optional byte arg1 = 0, byte arg2);
+ void passNullableByte(byte? arg);
+ void passOptionalNullableByte(optional byte? arg);
+ void passVariadicByte(byte... arg);
+ [Cached, Pure]
+ readonly attribute byte cachedByte;
+ [Cached, Constant]
+ readonly attribute byte cachedConstantByte;
+ [Cached, Pure]
+ attribute byte cachedWritableByte;
+ [Affects=Nothing]
+ attribute byte sideEffectFreeByte;
+ [Affects=Nothing, DependsOn=DOMState]
+ attribute byte domDependentByte;
+ [Affects=Nothing, DependsOn=Nothing]
+ readonly attribute byte constantByte;
+ [DependsOn=DeviceState, Affects=Nothing]
+ readonly attribute byte deviceStateDependentByte;
+ [Affects=Nothing]
+ byte returnByteSideEffectFree();
+ [Affects=Nothing, DependsOn=DOMState]
+ byte returnDOMDependentByte();
+ [Affects=Nothing, DependsOn=Nothing]
+ byte returnConstantByte();
+ [DependsOn=DeviceState, Affects=Nothing]
+ byte returnDeviceStateDependentByte();
+
+ readonly attribute short readonlyShort;
+ attribute short writableShort;
+ void passShort(short arg);
+ short receiveShort();
+ void passOptionalShort(optional short arg);
+ void passOptionalShortWithDefault(optional short arg = 5);
+
+ readonly attribute long readonlyLong;
+ attribute long writableLong;
+ void passLong(long arg);
+ long receiveLong();
+ void passOptionalLong(optional long arg);
+ void passOptionalLongWithDefault(optional long arg = 7);
+
+ readonly attribute long long readonlyLongLong;
+ attribute long long writableLongLong;
+ void passLongLong(long long arg);
+ long long receiveLongLong();
+ void passOptionalLongLong(optional long long arg);
+ void passOptionalLongLongWithDefault(optional long long arg = -12);
+
+ readonly attribute octet readonlyOctet;
+ attribute octet writableOctet;
+ void passOctet(octet arg);
+ octet receiveOctet();
+ void passOptionalOctet(optional octet arg);
+ void passOptionalOctetWithDefault(optional octet arg = 19);
+
+ readonly attribute unsigned short readonlyUnsignedShort;
+ attribute unsigned short writableUnsignedShort;
+ void passUnsignedShort(unsigned short arg);
+ unsigned short receiveUnsignedShort();
+ void passOptionalUnsignedShort(optional unsigned short arg);
+ void passOptionalUnsignedShortWithDefault(optional unsigned short arg = 2);
+
+ readonly attribute unsigned long readonlyUnsignedLong;
+ attribute unsigned long writableUnsignedLong;
+ void passUnsignedLong(unsigned long arg);
+ unsigned long receiveUnsignedLong();
+ void passOptionalUnsignedLong(optional unsigned long arg);
+ void passOptionalUnsignedLongWithDefault(optional unsigned long arg = 6);
+
+ readonly attribute unsigned long long readonlyUnsignedLongLong;
+ attribute unsigned long long writableUnsignedLongLong;
+ void passUnsignedLongLong(unsigned long long arg);
+ unsigned long long receiveUnsignedLongLong();
+ void passOptionalUnsignedLongLong(optional unsigned long long arg);
+ void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
+
+ attribute float writableFloat;
+ attribute unrestricted float writableUnrestrictedFloat;
+ attribute float? writableNullableFloat;
+ attribute unrestricted float? writableNullableUnrestrictedFloat;
+ attribute double writableDouble;
+ attribute unrestricted double writableUnrestrictedDouble;
+ attribute double? writableNullableDouble;
+ attribute unrestricted double? writableNullableUnrestrictedDouble;
+ void passFloat(float arg1, unrestricted float arg2,
+ float? arg3, unrestricted float? arg4,
+ double arg5, unrestricted double arg6,
+ double? arg7, unrestricted double? arg8,
+ sequence<float> arg9, sequence<unrestricted float> arg10,
+ sequence<float?> arg11, sequence<unrestricted float?> arg12,
+ sequence<double> arg13, sequence<unrestricted double> arg14,
+ sequence<double?> arg15, sequence<unrestricted double?> arg16);
+ [LenientFloat]
+ void passLenientFloat(float arg1, unrestricted float arg2,
+ float? arg3, unrestricted float? arg4,
+ double arg5, unrestricted double arg6,
+ double? arg7, unrestricted double? arg8,
+ sequence<float> arg9,
+ sequence<unrestricted float> arg10,
+ sequence<float?> arg11,
+ sequence<unrestricted float?> arg12,
+ sequence<double> arg13,
+ sequence<unrestricted double> arg14,
+ sequence<double?> arg15,
+ sequence<unrestricted double?> arg16);
+ [LenientFloat]
+ attribute float lenientFloatAttr;
+ [LenientFloat]
+ attribute double lenientDoubleAttr;
+
+ // Castable interface types
+ // XXXbz add tests for throwing versions of all the castable interface stuff
+ TestJSImplInterface receiveSelf();
+ TestJSImplInterface? receiveNullableSelf();
+
+ TestJSImplInterface receiveWeakSelf();
+ TestJSImplInterface? receiveWeakNullableSelf();
+
+ // A version to test for casting to TestJSImplInterface&
+ void passSelf(TestJSImplInterface arg);
+ void passNullableSelf(TestJSImplInterface? arg);
+ attribute TestJSImplInterface nonNullSelf;
+ attribute TestJSImplInterface? nullableSelf;
+ [Cached, Pure]
+ readonly attribute TestJSImplInterface cachedSelf;
+ // Optional arguments
+ void passOptionalSelf(optional TestJSImplInterface? arg);
+ void passOptionalNonNullSelf(optional TestJSImplInterface arg);
+ void passOptionalSelfWithDefault(optional TestJSImplInterface? arg = null);
+
+ // Non-wrapper-cache interface types
+ [NewObject]
+ TestNonWrapperCacheInterface receiveNonWrapperCacheInterface();
+ [NewObject]
+ TestNonWrapperCacheInterface? receiveNullableNonWrapperCacheInterface();
+
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface> receiveNonWrapperCacheInterfaceSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface?> receiveNullableNonWrapperCacheInterfaceSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface>? receiveNonWrapperCacheInterfaceNullableSequence();
+ [NewObject]
+ sequence<TestNonWrapperCacheInterface?>? receiveNullableNonWrapperCacheInterfaceNullableSequence();
+
+ // Non-castable interface types
+ IndirectlyImplementedInterface receiveOther();
+ IndirectlyImplementedInterface? receiveNullableOther();
+ IndirectlyImplementedInterface receiveWeakOther();
+ IndirectlyImplementedInterface? receiveWeakNullableOther();
+
+ void passOther(IndirectlyImplementedInterface arg);
+ void passNullableOther(IndirectlyImplementedInterface? arg);
+ attribute IndirectlyImplementedInterface nonNullOther;
+ attribute IndirectlyImplementedInterface? nullableOther;
+ // Optional arguments
+ void passOptionalOther(optional IndirectlyImplementedInterface? arg);
+ void passOptionalNonNullOther(optional IndirectlyImplementedInterface arg);
+ void passOptionalOtherWithDefault(optional IndirectlyImplementedInterface? arg = null);
+
+ // External interface types
+ TestExternalInterface receiveExternal();
+ TestExternalInterface? receiveNullableExternal();
+ TestExternalInterface receiveWeakExternal();
+ TestExternalInterface? receiveWeakNullableExternal();
+ void passExternal(TestExternalInterface arg);
+ void passNullableExternal(TestExternalInterface? arg);
+ attribute TestExternalInterface nonNullExternal;
+ attribute TestExternalInterface? nullableExternal;
+ // Optional arguments
+ void passOptionalExternal(optional TestExternalInterface? arg);
+ void passOptionalNonNullExternal(optional TestExternalInterface arg);
+ void passOptionalExternalWithDefault(optional TestExternalInterface? arg = null);
+
+ // Callback interface types
+ TestCallbackInterface receiveCallbackInterface();
+ TestCallbackInterface? receiveNullableCallbackInterface();
+ TestCallbackInterface receiveWeakCallbackInterface();
+ TestCallbackInterface? receiveWeakNullableCallbackInterface();
+ void passCallbackInterface(TestCallbackInterface arg);
+ void passNullableCallbackInterface(TestCallbackInterface? arg);
+ attribute TestCallbackInterface nonNullCallbackInterface;
+ attribute TestCallbackInterface? nullableCallbackInterface;
+ // Optional arguments
+ void passOptionalCallbackInterface(optional TestCallbackInterface? arg);
+ void passOptionalNonNullCallbackInterface(optional TestCallbackInterface arg);
+ void passOptionalCallbackInterfaceWithDefault(optional TestCallbackInterface? arg = null);
+
+ // Miscellaneous interface tests
+ IndirectlyImplementedInterface receiveConsequentialInterface();
+ void passConsequentialInterface(IndirectlyImplementedInterface arg);
+
+ // Sequence types
+ [Cached, Pure]
+ readonly attribute sequence<long> readonlySequence;
+ [Cached, Pure]
+ readonly attribute sequence<Dict> readonlySequenceOfDictionaries;
+ [Cached, Pure]
+ readonly attribute sequence<Dict>? readonlyNullableSequenceOfDictionaries;
+ [Cached, Pure, Frozen]
+ readonly attribute sequence<long> readonlyFrozenSequence;
+ [Cached, Pure, Frozen]
+ readonly attribute sequence<long>? readonlyFrozenNullableSequence;
+ sequence<long> receiveSequence();
+ sequence<long>? receiveNullableSequence();
+ sequence<long?> receiveSequenceOfNullableInts();
+ sequence<long?>? receiveNullableSequenceOfNullableInts();
+ void passSequence(sequence<long> arg);
+ void passNullableSequence(sequence<long>? arg);
+ void passSequenceOfNullableInts(sequence<long?> arg);
+ void passOptionalSequenceOfNullableInts(optional sequence<long?> arg);
+ void passOptionalNullableSequenceOfNullableInts(optional sequence<long?>? arg);
+ sequence<TestJSImplInterface> receiveCastableObjectSequence();
+ sequence<TestCallbackInterface> receiveCallbackObjectSequence();
+ sequence<TestJSImplInterface?> receiveNullableCastableObjectSequence();
+ sequence<TestCallbackInterface?> receiveNullableCallbackObjectSequence();
+ sequence<TestJSImplInterface>? receiveCastableObjectNullableSequence();
+ sequence<TestJSImplInterface?>? receiveNullableCastableObjectNullableSequence();
+ sequence<TestJSImplInterface> receiveWeakCastableObjectSequence();
+ sequence<TestJSImplInterface?> receiveWeakNullableCastableObjectSequence();
+ sequence<TestJSImplInterface>? receiveWeakCastableObjectNullableSequence();
+ sequence<TestJSImplInterface?>? receiveWeakNullableCastableObjectNullableSequence();
+ void passCastableObjectSequence(sequence<TestJSImplInterface> arg);
+ void passNullableCastableObjectSequence(sequence<TestJSImplInterface?> arg);
+ void passCastableObjectNullableSequence(sequence<TestJSImplInterface>? arg);
+ void passNullableCastableObjectNullableSequence(sequence<TestJSImplInterface?>? arg);
+ void passOptionalSequence(optional sequence<long> arg);
+ void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
+ void passOptionalNullableSequence(optional sequence<long>? arg);
+ void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
+ void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
+ void passOptionalObjectSequence(optional sequence<TestJSImplInterface> arg);
+ void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
+ void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);
+
+ sequence<DOMString> receiveStringSequence();
+ sequence<ByteString> receiveByteStringSequence();
+ // Callback interface problem. See bug 843261.
+ //void passStringSequence(sequence<DOMString> arg);
+ sequence<any> receiveAnySequence();
+ sequence<any>? receiveNullableAnySequence();
+ //XXXbz No support for sequence of sequence return values yet.
+ //sequence<sequence<any>> receiveAnySequenceSequence();
+
+ sequence<object> receiveObjectSequence();
+ sequence<object?> receiveNullableObjectSequence();
+
+ void passSequenceOfSequences(sequence<sequence<long>> arg);
+ void passSequenceOfSequencesOfSequences(sequence<sequence<sequence<long>>> arg);
+ //XXXbz No support for sequence of sequence return values yet.
+ //sequence<sequence<long>> receiveSequenceOfSequences();
+
+ // MozMap types
+ void passMozMap(MozMap<long> arg);
+ void passNullableMozMap(MozMap<long>? arg);
+ void passMozMapOfNullableInts(MozMap<long?> arg);
+ void passOptionalMozMapOfNullableInts(optional MozMap<long?> arg);
+ void passOptionalNullableMozMapOfNullableInts(optional MozMap<long?>? arg);
+ void passCastableObjectMozMap(MozMap<TestJSImplInterface> arg);
+ void passNullableCastableObjectMozMap(MozMap<TestJSImplInterface?> arg);
+ void passCastableObjectNullableMozMap(MozMap<TestJSImplInterface>? arg);
+ void passNullableCastableObjectNullableMozMap(MozMap<TestJSImplInterface?>? arg);
+ void passOptionalMozMap(optional MozMap<long> arg);
+ void passOptionalNullableMozMap(optional MozMap<long>? arg);
+ void passOptionalNullableMozMapWithDefaultValue(optional MozMap<long>? arg = null);
+ void passOptionalObjectMozMap(optional MozMap<TestJSImplInterface> arg);
+ void passExternalInterfaceMozMap(MozMap<TestExternalInterface> arg);
+ void passNullableExternalInterfaceMozMap(MozMap<TestExternalInterface?> arg);
+ void passStringMozMap(MozMap<DOMString> arg);
+ void passByteStringMozMap(MozMap<ByteString> arg);
+ void passMozMapOfMozMaps(MozMap<MozMap<long>> arg);
+ MozMap<long> receiveMozMap();
+ MozMap<long>? receiveNullableMozMap();
+ MozMap<long?> receiveMozMapOfNullableInts();
+ MozMap<long?>? receiveNullableMozMapOfNullableInts();
+ //XXXbz No support for MozMap of MozMaps return values yet.
+ //MozMap<MozMap<long>> receiveMozMapOfMozMaps();
+ MozMap<any> receiveAnyMozMap();
+
+ // Typed array types
+ void passArrayBuffer(ArrayBuffer arg);
+ void passNullableArrayBuffer(ArrayBuffer? arg);
+ void passOptionalArrayBuffer(optional ArrayBuffer arg);
+ void passOptionalNullableArrayBuffer(optional ArrayBuffer? arg);
+ void passOptionalNullableArrayBufferWithDefaultValue(optional ArrayBuffer? arg= null);
+ void passArrayBufferView(ArrayBufferView arg);
+ void passInt8Array(Int8Array arg);
+ void passInt16Array(Int16Array arg);
+ void passInt32Array(Int32Array arg);
+ void passUint8Array(Uint8Array arg);
+ void passUint16Array(Uint16Array arg);
+ void passUint32Array(Uint32Array arg);
+ void passUint8ClampedArray(Uint8ClampedArray arg);
+ void passFloat32Array(Float32Array arg);
+ void passFloat64Array(Float64Array arg);
+ void passSequenceOfArrayBuffers(sequence<ArrayBuffer> arg);
+ void passSequenceOfNullableArrayBuffers(sequence<ArrayBuffer?> arg);
+ void passMozMapOfArrayBuffers(MozMap<ArrayBuffer> arg);
+ void passMozMapOfNullableArrayBuffers(MozMap<ArrayBuffer?> arg);
+ void passVariadicTypedArray(Float32Array... arg);
+ void passVariadicNullableTypedArray(Float32Array?... arg);
+ Uint8Array receiveUint8Array();
+ attribute Uint8Array uint8ArrayAttr;
+
+ // DOMString types
+ void passString(DOMString arg);
+ void passNullableString(DOMString? arg);
+ void passOptionalString(optional DOMString arg);
+ void passOptionalStringWithDefaultValue(optional DOMString arg = "abc");
+ void passOptionalNullableString(optional DOMString? arg);
+ void passOptionalNullableStringWithDefaultValue(optional DOMString? arg = null);
+ void passVariadicString(DOMString... arg);
+
+ // ByteString types
+ void passByteString(ByteString arg);
+ void passNullableByteString(ByteString? arg);
+ void passOptionalByteString(optional ByteString arg);
+ void passOptionalByteStringWithDefaultValue(optional ByteString arg = "abc");
+ void passOptionalNullableByteString(optional ByteString? arg);
+ void passOptionalNullableByteStringWithDefaultValue(optional ByteString? arg = null);
+ void passVariadicByteString(ByteString... arg);
+ void passUnionByteString((ByteString or long) arg);
+ void passOptionalUnionByteString(optional (ByteString or long) arg);
+ void passOptionalUnionByteStringWithDefaultValue(optional (ByteString or long) arg = "abc");
+
+ // USVString types
+ void passSVS(USVString arg);
+ void passNullableSVS(USVString? arg);
+ void passOptionalSVS(optional USVString arg);
+ void passOptionalSVSWithDefaultValue(optional USVString arg = "abc");
+ void passOptionalNullableSVS(optional USVString? arg);
+ void passOptionalNullableSVSWithDefaultValue(optional USVString? arg = null);
+ void passVariadicSVS(USVString... arg);
+ USVString receiveSVS();
+
+ // Enumerated types
+ void passEnum(MyTestEnum arg);
+ void passNullableEnum(MyTestEnum? arg);
+ void passOptionalEnum(optional MyTestEnum arg);
+ void passEnumWithDefault(optional MyTestEnum arg = "a");
+ void passOptionalNullableEnum(optional MyTestEnum? arg);
+ void passOptionalNullableEnumWithDefaultValue(optional MyTestEnum? arg = null);
+ void passOptionalNullableEnumWithDefaultValue2(optional MyTestEnum? arg = "a");
+ MyTestEnum receiveEnum();
+ MyTestEnum? receiveNullableEnum();
+ attribute MyTestEnum enumAttribute;
+ readonly attribute MyTestEnum readonlyEnumAttribute;
+
+ // Callback types
+ void passCallback(MyTestCallback arg);
+ void passNullableCallback(MyTestCallback? arg);
+ void passOptionalCallback(optional MyTestCallback arg);
+ void passOptionalNullableCallback(optional MyTestCallback? arg);
+ void passOptionalNullableCallbackWithDefaultValue(optional MyTestCallback? arg = null);
+ MyTestCallback receiveCallback();
+ MyTestCallback? receiveNullableCallback();
+ // Hmm. These two don't work, I think because I need a locally modified version of TestTreatAsNullCallback.
+ //void passNullableTreatAsNullCallback(TestTreatAsNullCallback? arg);
+ //void passOptionalNullableTreatAsNullCallback(optional TestTreatAsNullCallback? arg);
+ void passOptionalNullableTreatAsNullCallbackWithDefaultValue(optional TestTreatAsNullCallback? arg = null);
+
+ // Any types
+ void passAny(any arg);
+ void passVariadicAny(any... arg);
+ void passOptionalAny(optional any arg);
+ void passAnyDefaultNull(optional any arg = null);
+ void passSequenceOfAny(sequence<any> arg);
+ void passNullableSequenceOfAny(sequence<any>? arg);
+ void passOptionalSequenceOfAny(optional sequence<any> arg);
+ void passOptionalNullableSequenceOfAny(optional sequence<any>? arg);
+ void passOptionalSequenceOfAnyWithDefaultValue(optional sequence<any>? arg = null);
+ void passSequenceOfSequenceOfAny(sequence<sequence<any>> arg);
+ void passSequenceOfNullableSequenceOfAny(sequence<sequence<any>?> arg);
+ void passNullableSequenceOfNullableSequenceOfAny(sequence<sequence<any>?>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfAny(optional sequence<sequence<any>?>? arg);
+ void passMozMapOfAny(MozMap<any> arg);
+ void passNullableMozMapOfAny(MozMap<any>? arg);
+ void passOptionalMozMapOfAny(optional MozMap<any> arg);
+ void passOptionalNullableMozMapOfAny(optional MozMap<any>? arg);
+ void passOptionalMozMapOfAnyWithDefaultValue(optional MozMap<any>? arg = null);
+ void passMozMapOfMozMapOfAny(MozMap<MozMap<any>> arg);
+ void passMozMapOfNullableMozMapOfAny(MozMap<MozMap<any>?> arg);
+ void passNullableMozMapOfNullableMozMapOfAny(MozMap<MozMap<any>?>? arg);
+ void passOptionalNullableMozMapOfNullableMozMapOfAny(optional MozMap<MozMap<any>?>? arg);
+ void passOptionalNullableMozMapOfNullableSequenceOfAny(optional MozMap<sequence<any>?>? arg);
+ void passOptionalNullableSequenceOfNullableMozMapOfAny(optional sequence<MozMap<any>?>? arg);
+ any receiveAny();
+
+ // object types
+ void passObject(object arg);
+ void passVariadicObject(object... arg);
+ void passNullableObject(object? arg);
+ void passVariadicNullableObject(object... arg);
+ void passOptionalObject(optional object arg);
+ void passOptionalNullableObject(optional object? arg);
+ void passOptionalNullableObjectWithDefaultValue(optional object? arg = null);
+ void passSequenceOfObject(sequence<object> arg);
+ void passSequenceOfNullableObject(sequence<object?> arg);
+ void passNullableSequenceOfObject(sequence<object>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfObject(optional sequence<sequence<object>?>? arg);
+ void passOptionalNullableSequenceOfNullableSequenceOfNullableObject(optional sequence<sequence<object?>?>? arg);
+ void passMozMapOfObject(MozMap<object> arg);
+ object receiveObject();
+ object? receiveNullableObject();
+
+ // Union types
+ void passUnion((object or long) arg);
+ // Some union tests are debug-only to avoid creating all those
+ // unused union types in opt builds.
+#ifdef DEBUG
+ void passUnion2((long or boolean) arg);
+ void passUnion3((object or long or boolean) arg);
+ void passUnion4((Node or long or boolean) arg);
+ void passUnion5((object or boolean) arg);
+ void passUnion6((object or DOMString) arg);
+ void passUnion7((object or DOMString or long) arg);
+ void passUnion8((object or DOMString or boolean) arg);
+ void passUnion9((object or DOMString or long or boolean) arg);
+ void passUnion10(optional (EventInit or long) arg);
+ void passUnion11(optional (CustomEventInit or long) arg);
+ void passUnion12(optional (EventInit or long) arg = 5);
+ void passUnion13(optional (object or long?) arg = null);
+ void passUnion14(optional (object or long?) arg = 5);
+ void passUnion15((sequence<long> or long) arg);
+ void passUnion16(optional (sequence<long> or long) arg);
+ void passUnion17(optional (sequence<long>? or long) arg = 5);
+ void passUnion18((sequence<object> or long) arg);
+ void passUnion19(optional (sequence<object> or long) arg);
+ void passUnion20(optional (sequence<object> or long) arg = []);
+ void passUnion21((MozMap<long> or long) arg);
+ void passUnion22((MozMap<object> or long) arg);
+ void passUnion23((sequence<ImageData> or long) arg);
+ void passUnion24((sequence<ImageData?> or long) arg);
+ void passUnion25((sequence<sequence<ImageData>> or long) arg);
+ void passUnion26((sequence<sequence<ImageData?>> or long) arg);
+ void passUnion27(optional (sequence<DOMString> or EventInit) arg);
+ void passUnion28(optional (EventInit or sequence<DOMString>) arg);
+ void passUnionWithCallback((EventHandler or long) arg);
+ void passUnionWithByteString((ByteString or long) arg);
+ void passUnionWithMozMap((MozMap<DOMString> or DOMString) arg);
+ void passUnionWithMozMapAndSequence((MozMap<DOMString> or sequence<DOMString>) arg);
+ void passUnionWithSequenceAndMozMap((sequence<DOMString> or MozMap<DOMString>) arg);
+ void passUnionWithSVS((USVString or long) arg);
+#endif
+ void passUnionWithNullable((object? or long) arg);
+ void passNullableUnion((object or long)? arg);
+ void passOptionalUnion(optional (object or long) arg);
+ void passOptionalNullableUnion(optional (object or long)? arg);
+ void passOptionalNullableUnionWithDefaultValue(optional (object or long)? arg = null);
+ //void passUnionWithInterfaces((TestJSImplInterface or TestExternalInterface) arg);
+ //void passUnionWithInterfacesAndNullable((TestJSImplInterface? or TestExternalInterface) arg);
+ //void passUnionWithSequence((sequence<object> or long) arg);
+ void passUnionWithArrayBuffer((ArrayBuffer or long) arg);
+ void passUnionWithString((DOMString or object) arg);
+ // Using an enum in a union. Note that we use some enum not declared in our
+ // binding file, because UnionTypes.h will need to include the binding header
+ // for this enum. Pick an enum from an interface that won't drag in too much
+ // stuff.
+ void passUnionWithEnum((SupportedType or object) arg);
+
+ // Trying to use a callback in a union won't include the test
+ // headers, unfortunately, so won't compile.
+ // void passUnionWithCallback((MyTestCallback or long) arg);
+ void passUnionWithObject((object or long) arg);
+ //void passUnionWithDict((Dict or long) arg);
+
+ void passUnionWithDefaultValue1(optional (double or DOMString) arg = "");
+ void passUnionWithDefaultValue2(optional (double or DOMString) arg = 1);
+ void passUnionWithDefaultValue3(optional (double or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue4(optional (float or DOMString) arg = "");
+ void passUnionWithDefaultValue5(optional (float or DOMString) arg = 1);
+ void passUnionWithDefaultValue6(optional (float or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue7(optional (unrestricted double or DOMString) arg = "");
+ void passUnionWithDefaultValue8(optional (unrestricted double or DOMString) arg = 1);
+ void passUnionWithDefaultValue9(optional (unrestricted double or DOMString) arg = 1.5);
+ void passUnionWithDefaultValue10(optional (unrestricted double or DOMString) arg = Infinity);
+ void passUnionWithDefaultValue11(optional (unrestricted float or DOMString) arg = "");
+ void passUnionWithDefaultValue12(optional (unrestricted float or DOMString) arg = 1);
+ void passUnionWithDefaultValue13(optional (unrestricted float or DOMString) arg = Infinity);
+ void passUnionWithDefaultValue14(optional (double or ByteString) arg = "");
+ void passUnionWithDefaultValue15(optional (double or ByteString) arg = 1);
+ void passUnionWithDefaultValue16(optional (double or ByteString) arg = 1.5);
+ void passUnionWithDefaultValue17(optional (double or SupportedType) arg = "text/html");
+ void passUnionWithDefaultValue18(optional (double or SupportedType) arg = 1);
+ void passUnionWithDefaultValue19(optional (double or SupportedType) arg = 1.5);
+
+ void passNullableUnionWithDefaultValue1(optional (double or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue2(optional (double or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue3(optional (double or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue4(optional (float or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue5(optional (float or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue6(optional (float or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue7(optional (unrestricted double or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue8(optional (unrestricted double or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue9(optional (unrestricted double or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue10(optional (unrestricted float or DOMString)? arg = "");
+ void passNullableUnionWithDefaultValue11(optional (unrestricted float or DOMString)? arg = 1);
+ void passNullableUnionWithDefaultValue12(optional (unrestricted float or DOMString)? arg = null);
+ void passNullableUnionWithDefaultValue13(optional (double or ByteString)? arg = "");
+ void passNullableUnionWithDefaultValue14(optional (double or ByteString)? arg = 1);
+ void passNullableUnionWithDefaultValue15(optional (double or ByteString)? arg = 1.5);
+ void passNullableUnionWithDefaultValue16(optional (double or ByteString)? arg = null);
+ void passNullableUnionWithDefaultValue17(optional (double or SupportedType)? arg = "text/html");
+ void passNullableUnionWithDefaultValue18(optional (double or SupportedType)? arg = 1);
+ void passNullableUnionWithDefaultValue19(optional (double or SupportedType)? arg = 1.5);
+ void passNullableUnionWithDefaultValue20(optional (double or SupportedType)? arg = null);
+
+ void passSequenceOfUnions(sequence<(CanvasPattern or CanvasGradient)> arg);
+ void passSequenceOfUnions2(sequence<(object or long)> arg);
+ void passVariadicUnion((CanvasPattern or CanvasGradient)... arg);
+
+ void passSequenceOfNullableUnions(sequence<(CanvasPattern or CanvasGradient)?> arg);
+ void passVariadicNullableUnion((CanvasPattern or CanvasGradient)?... arg);
+ void passMozMapOfUnions(MozMap<(CanvasPattern or CanvasGradient)> arg);
+ // XXXbz no move constructor on some unions
+ // void passMozMapOfUnions2(MozMap<(object or long)> arg);
+
+ (CanvasPattern or CanvasGradient) receiveUnion();
+ (object or long) receiveUnion2();
+ (CanvasPattern? or CanvasGradient) receiveUnionContainingNull();
+ (CanvasPattern or CanvasGradient)? receiveNullableUnion();
+ (object or long)? receiveNullableUnion2();
+
+ attribute (CanvasPattern or CanvasGradient) writableUnion;
+ attribute (CanvasPattern? or CanvasGradient) writableUnionContainingNull;
+ attribute (CanvasPattern or CanvasGradient)? writableNullableUnion;
+
+ // Date types
+ void passDate(Date arg);
+ void passNullableDate(Date? arg);
+ void passOptionalDate(optional Date arg);
+ void passOptionalNullableDate(optional Date? arg);
+ void passOptionalNullableDateWithDefaultValue(optional Date? arg = null);
+ void passDateSequence(sequence<Date> arg);
+ void passNullableDateSequence(sequence<Date?> arg);
+ void passDateMozMap(MozMap<Date> arg);
+ Date receiveDate();
+ Date? receiveNullableDate();
+
+ // Promise types
+ void passPromise(Promise<any> arg);
+ void passNullablePromise(Promise<any>? arg);
+ void passOptionalPromise(optional Promise<any> arg);
+ void passOptionalNullablePromise(optional Promise<any>? arg);
+ void passOptionalNullablePromiseWithDefaultValue(optional Promise<any>? arg = null);
+ void passPromiseSequence(sequence<Promise<any>> arg);
+ void passNullablePromiseSequence(sequence<Promise<any>?> arg);
+ Promise<any> receivePromise();
+ Promise<any> receiveAddrefedPromise();
+
+ // binaryNames tests
+ void methodRenamedFrom();
+ [BinaryName="otherMethodRenamedTo"]
+ void otherMethodRenamedFrom();
+ void methodRenamedFrom(byte argument);
+ readonly attribute byte attributeGetterRenamedFrom;
+ attribute byte attributeRenamedFrom;
+ [BinaryName="otherAttributeRenamedTo"]
+ attribute byte otherAttributeRenamedFrom;
+
+ void passDictionary(optional Dict x);
+ void passDictionary2(Dict x);
+ [Cached, Pure]
+ readonly attribute Dict readonlyDictionary;
+ [Cached, Pure]
+ readonly attribute Dict? readonlyNullableDictionary;
+ [Cached, Pure]
+ attribute Dict writableDictionary;
+ [Cached, Pure, Frozen]
+ readonly attribute Dict readonlyFrozenDictionary;
+ [Cached, Pure, Frozen]
+ readonly attribute Dict? readonlyFrozenNullableDictionary;
+ [Cached, Pure, Frozen]
+ attribute Dict writableFrozenDictionary;
+ Dict receiveDictionary();
+ Dict? receiveNullableDictionary();
+ void passOtherDictionary(optional GrandparentDict x);
+ void passSequenceOfDictionaries(sequence<Dict> x);
+ void passMozMapOfDictionaries(MozMap<GrandparentDict> x);
+ // No support for nullable dictionaries inside a sequence (nor should there be)
+ // void passSequenceOfNullableDictionaries(sequence<Dict?> x);
+ void passDictionaryOrLong(optional Dict x);
+ void passDictionaryOrLong(long x);
+
+ void passDictContainingDict(optional DictContainingDict arg);
+ void passDictContainingSequence(optional DictContainingSequence arg);
+ DictContainingSequence receiveDictContainingSequence();
+ void passVariadicDictionary(Dict... arg);
+
+ // EnforceRange/Clamp tests
+ void dontEnforceRangeOrClamp(byte arg);
+ void doEnforceRange([EnforceRange] byte arg);
+ void doClamp([Clamp] byte arg);
+ [EnforceRange] attribute byte enforcedByte;
+ [Clamp] attribute byte clampedByte;
+
+ // Typedefs
+ const myLong myLongConstant = 5;
+ void exerciseTypedefInterfaces1(AnotherNameForTestJSImplInterface arg);
+ AnotherNameForTestJSImplInterface exerciseTypedefInterfaces2(NullableTestJSImplInterface arg);
+ void exerciseTypedefInterfaces3(YetAnotherNameForTestJSImplInterface arg);
+
+ // Deprecated methods and attributes
+ [Deprecated="GetAttributeNode"]
+ attribute byte deprecatedAttribute;
+ [Deprecated="GetAttributeNode"]
+ byte deprecatedMethod();
+ [Deprecated="GetAttributeNode"]
+ void deprecatedMethodWithContext(any arg);
+
+ // Static methods and attributes
+ // FIXME: Bug 863952 Static things are not supported yet
+ /*
+ static attribute boolean staticAttribute;
+ static void staticMethod(boolean arg);
+ static void staticMethodWithContext(any arg);
+
+ // Deprecated static methods and attributes
+ [Deprecated="GetAttributeNode"]
+ static attribute byte staticDeprecatedAttribute;
+ [Deprecated="GetAttributeNode"]
+ static byte staticDeprecatedMethod();
+ [Deprecated="GetAttributeNode"]
+ static byte staticDeprecatedMethodWithContext();
+ */
+
+ // Overload resolution tests
+ //void overload1(DOMString... strs);
+ boolean overload1(TestJSImplInterface arg);
+ TestJSImplInterface overload1(DOMString strs, TestJSImplInterface arg);
+ void overload2(TestJSImplInterface arg);
+ void overload2(optional Dict arg);
+ void overload2(boolean arg);
+ void overload2(DOMString arg);
+ void overload2(Date arg);
+ void overload3(TestJSImplInterface arg);
+ void overload3(MyTestCallback arg);
+ void overload3(boolean arg);
+ void overload4(TestJSImplInterface arg);
+ void overload4(TestCallbackInterface arg);
+ void overload4(DOMString arg);
+ void overload5(long arg);
+ void overload5(MyTestEnum arg);
+ void overload6(long arg);
+ void overload6(boolean arg);
+ void overload7(long arg);
+ void overload7(boolean arg);
+ void overload7(ByteString arg);
+ void overload8(long arg);
+ void overload8(TestJSImplInterface arg);
+ void overload9(long? arg);
+ void overload9(DOMString arg);
+ void overload10(long? arg);
+ void overload10(object arg);
+ void overload11(long arg);
+ void overload11(DOMString? arg);
+ void overload12(long arg);
+ void overload12(boolean? arg);
+ void overload13(long? arg);
+ void overload13(boolean arg);
+ void overload14(optional long arg);
+ void overload14(TestInterface arg);
+ void overload15(long arg);
+ void overload15(optional TestInterface arg);
+ void overload16(long arg);
+ void overload16(optional TestInterface? arg);
+ void overload17(sequence<long> arg);
+ void overload17(MozMap<long> arg);
+ void overload18(MozMap<DOMString> arg);
+ void overload18(sequence<DOMString> arg);
+ void overload19(sequence<long> arg);
+ void overload19(optional Dict arg);
+ void overload20(optional Dict arg);
+ void overload20(sequence<long> arg);
+
+ // Variadic handling
+ void passVariadicThirdArg(DOMString arg1, long arg2, TestJSImplInterface... arg3);
+
+ // Conditionally exposed methods/attributes
+ [Pref="abc.def"]
+ readonly attribute boolean prefable1;
+ [Pref="abc.def"]
+ readonly attribute boolean prefable2;
+ [Pref="ghi.jkl"]
+ readonly attribute boolean prefable3;
+ [Pref="ghi.jkl"]
+ readonly attribute boolean prefable4;
+ [Pref="abc.def"]
+ readonly attribute boolean prefable5;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable6;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable7;
+ [Pref="ghi.jkl", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable8;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean prefable9;
+ [Pref="abc.def"]
+ void prefable10();
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void prefable11();
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable12;
+ [Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void prefable13();
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable14;
+ [Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable15;
+ [Func="TestFuncControlledMember"]
+ readonly attribute boolean prefable16;
+ [Pref="abc.def", Func="TestFuncControlledMember"]
+ void prefable17();
+ [Func="TestFuncControlledMember"]
+ void prefable18();
+ [Func="TestFuncControlledMember"]
+ void prefable19();
+ [Pref="abc.def", Func="TestFuncControlledMember", ChromeOnly]
+ void prefable20();
+
+ // Conditionally exposed methods/attributes involving [SecureContext]
+ [SecureContext]
+ readonly attribute boolean conditionalOnSecureContext1;
+ [SecureContext, Pref="abc.def"]
+ readonly attribute boolean conditionalOnSecureContext2;
+ [SecureContext, Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ readonly attribute boolean conditionalOnSecureContext3;
+ [SecureContext, Pref="abc.def", Func="TestFuncControlledMember"]
+ readonly attribute boolean conditionalOnSecureContext4;
+ [SecureContext]
+ void conditionalOnSecureContext5();
+ [SecureContext, Pref="abc.def"]
+ void conditionalOnSecureContext6();
+ [SecureContext, Pref="abc.def", Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ void conditionalOnSecureContext7();
+ [SecureContext, Pref="abc.def", Func="TestFuncControlledMember"]
+ void conditionalOnSecureContext8();
+
+ // Miscellania
+ [LenientThis] attribute long attrWithLenientThis;
+ // FIXME: Bug 863954 Unforgeable things get all confused when
+ // non-JS-implemented interfaces inherit from JS-implemented ones or vice
+ // versa.
+ // [Unforgeable] readonly attribute long unforgeableAttr;
+ // [Unforgeable, ChromeOnly] readonly attribute long unforgeableAttr2;
+ // [Unforgeable] long unforgeableMethod();
+ // [Unforgeable, ChromeOnly] long unforgeableMethod2();
+ // FIXME: Bug 863955 No stringifiers yet
+ // stringifier;
+ void passRenamedInterface(TestRenamedInterface arg);
+ [PutForwards=writableByte] readonly attribute TestJSImplInterface putForwardsAttr;
+ [PutForwards=writableByte, LenientThis] readonly attribute TestJSImplInterface putForwardsAttr2;
+ [PutForwards=writableByte, ChromeOnly] readonly attribute TestJSImplInterface putForwardsAttr3;
+ [Throws] void throwingMethod();
+ [Throws] attribute boolean throwingAttr;
+ [GetterThrows] attribute boolean throwingGetterAttr;
+ [SetterThrows] attribute boolean throwingSetterAttr;
+ // NeedsSubjectPrincipal not supported on JS-implemented things for
+ // now, because we always pass in the caller principal anyway.
+ // [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod();
+ // [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr;
+ // legacycaller short(unsigned long arg1, TestInterface arg2);
+ void passArgsWithDefaults(optional long arg1,
+ optional TestInterface? arg2 = null,
+ optional Dict arg3, optional double arg4 = 5.0,
+ optional float arg5);
+ attribute any jsonifierShouldSkipThis;
+ attribute TestParentInterface jsonifierShouldSkipThis2;
+ attribute TestCallbackInterface jsonifierShouldSkipThis3;
+ jsonifier;
+
+ attribute byte dashed-attribute;
+ void dashed-method();
+
+ // If you add things here, add them to TestCodeGen as well
+};
+
+[NavigatorProperty="TestNavigator", JSImplementation="@mozilla.org/test;1"]
+interface TestNavigator {
+};
+
+[Constructor, NavigatorProperty="TestNavigatorWithConstructor", JSImplementation="@mozilla.org/test;1"]
+interface TestNavigatorWithConstructor {
+};
+
+interface TestCImplementedInterface : TestJSImplInterface {
+};
+
+interface TestCImplementedInterface2 {
+};
+
+[NoInterfaceObject,
+ JSImplementation="@mozilla.org/test-js-impl-interface;2"]
+interface TestJSImplNoInterfaceObject {
+ [Cached, Pure]
+ readonly attribute byte cachedByte;
+};
diff --git a/dom/bindings/test/TestJSImplInheritanceGen.webidl b/dom/bindings/test/TestJSImplInheritanceGen.webidl
new file mode 100644
index 000000000..e62dbd10b
--- /dev/null
+++ b/dom/bindings/test/TestJSImplInheritanceGen.webidl
@@ -0,0 +1,29 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+[Constructor, JSImplementation="@mozilla.org/test-js-impl-interface2;1"]
+interface TestJSImplInterface2 : TestCImplementedInterface {
+};
+
+[Constructor, JSImplementation="@mozilla.org/test-js-impl-interface3;1"]
+interface TestJSImplInterface3 : TestCImplementedInterface2 {
+};
+
+// Important: TestJSImplInterface5 needs to come before TestJSImplInterface6 in
+// this file to test what it's trying to test.
+[Constructor, JSImplementation="@mozilla.org/test-js-impl-interface5;1"]
+interface TestJSImplInterface5 : TestJSImplInterface6 {
+};
+
+// Important: TestJSImplInterface6 needs to come after TestJSImplInterface3 in
+// this file to test what it's trying to test.
+[Constructor, JSImplementation="@mozilla.org/test-js-impl-interface6;1"]
+interface TestJSImplInterface6 : TestJSImplInterface3 {
+};
+
+[Constructor, JSImplementation="@mozilla.org/test-js-impl-interface4;1"]
+interface TestJSImplInterface4 : EventTarget {
+};
diff --git a/dom/bindings/test/TestTypedef.webidl b/dom/bindings/test/TestTypedef.webidl
new file mode 100644
index 000000000..7f758c79e
--- /dev/null
+++ b/dom/bindings/test/TestTypedef.webidl
@@ -0,0 +1,7 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+typedef TestInterface YetAnotherNameForTestInterface;
diff --git a/dom/bindings/test/chrome.ini b/dom/bindings/test/chrome.ini
new file mode 100644
index 000000000..9fdbd7fd3
--- /dev/null
+++ b/dom/bindings/test/chrome.ini
@@ -0,0 +1,22 @@
+[DEFAULT]
+support-files =
+ !/dom/bindings/test/file_bug775543.html
+ !/dom/bindings/test/file_document_location_set_via_xray.html
+ !/dom/bindings/test/file_dom_xrays.html
+ !/dom/bindings/test/file_proxies_via_xray.html
+
+[test_bug775543.html]
+[test_document_location_set_via_xray.html]
+[test_dom_xrays.html]
+[test_proxies_via_xray.html]
+[test_document_location_via_xray_cached.html]
+[test_blacklisted_prerendering_function.xul]
+support-files =
+ file_focuser.html
+ file_fullScreenPropertyAccessor.html
+skip-if = e10s # prerendering doesn't work in e10s yet
+[test_kill_longrunning_prerendered_content.xul]
+skip-if = e10s # prerendering doesn't work in e10s yet
+[test_bug1123516_maplikesetlikechrome.xul]
+skip-if = debug == false
+[test_bug1287912.html]
diff --git a/dom/bindings/test/file_InstanceOf.html b/dom/bindings/test/file_InstanceOf.html
new file mode 100644
index 000000000..487010fa4
--- /dev/null
+++ b/dom/bindings/test/file_InstanceOf.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<script type="application/javascript">
+function runTest()
+{
+ return [ parent.HTMLElement.prototype instanceof Element,
+ parent.HTMLElement.prototype instanceof parent.Element ];
+}
+</script>
+</body>
+</html>
diff --git a/dom/bindings/test/file_bug775543.html b/dom/bindings/test/file_bug775543.html
new file mode 100644
index 000000000..ee8c14c4d
--- /dev/null
+++ b/dom/bindings/test/file_bug775543.html
@@ -0,0 +1,5 @@
+<body>
+<script>
+worker = new Worker("a");
+</script>
+</body>
diff --git a/dom/bindings/test/file_document_location_set_via_xray.html b/dom/bindings/test/file_document_location_set_via_xray.html
new file mode 100644
index 000000000..323acba66
--- /dev/null
+++ b/dom/bindings/test/file_document_location_set_via_xray.html
@@ -0,0 +1,5 @@
+<body>
+<script>
+document.x = 5;
+</script>
+</body>
diff --git a/dom/bindings/test/file_dom_xrays.html b/dom/bindings/test/file_dom_xrays.html
new file mode 100644
index 000000000..36b3f8a30
--- /dev/null
+++ b/dom/bindings/test/file_dom_xrays.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <script>
+ window.expando = 42;
+ window.shadowedIframe = 42;
+ Object.setPrototypeOf(window, Object.create(Window.prototype,
+ {
+ shadowedIframe: { value: 42 },
+ iframe: { value: 42 },
+ document: { value: 42 },
+ addEventListener: { value: 42 },
+ toString: { value: 42 }
+ }));
+ window.documentElement.expando = 42;
+ Object.defineProperty(window.documentElement, "version", { value: 42 });
+ </script>
+ <iframe name="shadowedIframe" id="shadowedIframe"></iframe>
+ <iframe name="iframe" id="iframe"></iframe>
+ <iframe name="document" id="document"></iframe>
+ <iframe name="self" id="self"></iframe>
+ <iframe name="addEventListener" id="addEventListener"></iframe>
+ <iframe name="toString" id="toString"></iframe>
+ <iframe name="item" id="item"></iframe>
+</html>
diff --git a/dom/bindings/test/file_focuser.html b/dom/bindings/test/file_focuser.html
new file mode 100644
index 000000000..0d5240f95
--- /dev/null
+++ b/dom/bindings/test/file_focuser.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<div id="stage"></div>
+<script>
+ function stage(str) {
+ var s = document.getElementById("stage");
+ s.textContent = str;
+ }
+ stage("before");
+ setTimeout(function() {
+ stage("in timeout");
+ });
+ setInterval(function() {
+ stage("in interval");
+ });
+ addEventListener("keydown", function() {
+ stage("keydown");
+ }, false);
+ try {
+ focus();
+ stage("after");
+ } catch(e) {
+ stage("exception raised");
+ }
+</script>
diff --git a/dom/bindings/test/file_fullScreenPropertyAccessor.html b/dom/bindings/test/file_fullScreenPropertyAccessor.html
new file mode 100644
index 000000000..92a37e0ba
--- /dev/null
+++ b/dom/bindings/test/file_fullScreenPropertyAccessor.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<div id="stage"></div>
+<script>
+ function stage(str) {
+ var s = document.getElementById("stage");
+ s.textContent = str;
+ }
+ stage("before");
+ setTimeout(function() {
+ stage("in timeout");
+ });
+ setInterval(function() {
+ stage("in interval");
+ });
+ addEventListener("keydown", function() {
+ stage("keydown");
+ }, false);
+ try {
+ window.fullScreen;
+ stage("after");
+ } catch(e) {
+ stage("exception raised");
+ }
+</script>
diff --git a/dom/bindings/test/file_proxies_via_xray.html b/dom/bindings/test/file_proxies_via_xray.html
new file mode 100644
index 000000000..2e9a31830
--- /dev/null
+++ b/dom/bindings/test/file_proxies_via_xray.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+ <script>
+ document.x = 5
+ </script>
+ <img id="y" name="y"></div>
+ <img id="z" name="z"></div>
+</html>
diff --git a/dom/bindings/test/forOf_iframe.html b/dom/bindings/test/forOf_iframe.html
new file mode 100644
index 000000000..91417aba0
--- /dev/null
+++ b/dom/bindings/test/forOf_iframe.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>iframe content for test_forOf_iframe.html</title>
+</head>
+<body>
+ <div id="basket">
+ <span id="egg0"></span>
+ <span id="egg1"><span id="duckling1"></span></span>
+ <span id="egg2"></span>
+ </div>
+</body>
+</html>
diff --git a/dom/bindings/test/mochitest.ini b/dom/bindings/test/mochitest.ini
new file mode 100644
index 000000000..2cd322e74
--- /dev/null
+++ b/dom/bindings/test/mochitest.ini
@@ -0,0 +1,79 @@
+[DEFAULT]
+support-files =
+ file_InstanceOf.html
+ file_bug775543.html
+ file_document_location_set_via_xray.html
+ file_dom_xrays.html
+ file_proxies_via_xray.html
+ forOf_iframe.html
+ !/js/xpconnect/tests/mochitest/file_empty.html
+
+[test_async_stacks.html]
+[test_ByteString.html]
+[test_InstanceOf.html]
+[test_bug560072.html]
+[test_bug742191.html]
+[test_bug759621.html]
+[test_bug773326.html]
+[test_bug788369.html]
+[test_bug852846.html]
+[test_bug862092.html]
+[test_bug1036214.html]
+skip-if = debug == false
+[test_bug963382.html]
+skip-if = debug == false
+[test_bug1041646.html]
+[test_bug1123875.html]
+[test_barewordGetsWindow.html]
+[test_callback_across_document_open.html]
+[test_callback_default_thisval.html]
+[test_cloneAndImportNode.html]
+[test_defineProperty.html]
+[test_enums.html]
+[test_exceptionThrowing.html]
+[test_exception_messages.html]
+[test_forOf.html]
+[test_integers.html]
+[test_interfaceName.html]
+[test_interfaceToString.html]
+[test_exceptions_from_jsimplemented.html]
+tags = webrtc
+[test_lenientThis.html]
+[test_lookupGetter.html]
+[test_namedNoIndexed.html]
+[test_named_getter_enumerability.html]
+[test_Object.prototype_props.html]
+[test_queryInterface.html]
+[test_returnUnion.html]
+skip-if = debug == false
+[test_usvstring.html]
+skip-if = debug == false
+[test_sequence_wrapping.html]
+subsuite = gpu
+[test_setWithNamedGetterNoNamedSetter.html]
+[test_throwing_method_noDCE.html]
+[test_treat_non_object_as_null.html]
+[test_traceProtos.html]
+[test_sequence_detection.html]
+skip-if = debug == false
+[test_exception_options_from_jsimplemented.html]
+skip-if = debug == false
+[test_promise_rejections_from_jsimplemented.html]
+skip-if = debug == false
+[test_worker_UnwrapArg.html]
+[test_unforgeablesonexpando.html]
+[test_crossOriginWindowSymbolAccess.html]
+[test_primitive_this.html]
+[test_callback_exceptions.html]
+[test_bug1123516_maplikesetlike.html]
+skip-if = debug == false
+[test_jsimplemented_eventhandler.html]
+skip-if = debug == false
+[test_iterable.html]
+skip-if = debug == false
+[test_oom_reporting.html]
+[test_domProxyArrayLengthGetter.html]
+[test_exceptionSanitization.html]
+skip-if = os == "android"
+[test_stringBindings.html]
+skip-if = debug == false
diff --git a/dom/bindings/test/moz.build b/dom/bindings/test/moz.build
new file mode 100644
index 000000000..7d0cb6c21
--- /dev/null
+++ b/dom/bindings/test/moz.build
@@ -0,0 +1,58 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEFINES.update({
+ 'IMPL_LIBXUL': True,
+ 'MOZILLA_INTERNAL_API': True,
+})
+
+# Do NOT export this library. We don't actually want our test code
+# being added to libxul or anything.
+
+Library('dombindings_test_s')
+
+EXTRA_COMPONENTS += [
+ 'TestInterfaceJS.js',
+ 'TestInterfaceJS.manifest',
+ 'TestInterfaceJSMaplike.js'
+]
+
+MOCHITEST_MANIFESTS += ['mochitest.ini']
+
+MOCHITEST_CHROME_MANIFESTS += ['chrome.ini']
+
+TEST_WEBIDL_FILES += [
+ 'TestDictionary.webidl',
+ 'TestJSImplInheritanceGen.webidl',
+ 'TestTypedef.webidl',
+]
+
+PREPROCESSED_TEST_WEBIDL_FILES += [
+ 'TestCodeGen.webidl',
+ 'TestExampleGen.webidl',
+ 'TestJSImplGen.webidl',
+]
+
+WEBIDL_EXAMPLE_INTERFACES += [
+ 'TestExampleInterface',
+ 'TestExampleProxyInterface',
+ 'TestExampleWorkerInterface',
+]
+
+# Bug 932082 tracks having bindings use namespaced includes.
+LOCAL_INCLUDES += [
+ '!/dist/include/mozilla/dom',
+]
+
+LOCAL_INCLUDES += [
+ '!..',
+ '/dom/bindings',
+ '/js/xpconnect/src',
+ '/js/xpconnect/wrappers',
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/bindings/test/test_ByteString.html b/dom/bindings/test/test_ByteString.html
new file mode 100644
index 000000000..c7e632117
--- /dev/null
+++ b/dom/bindings/test/test_ByteString.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=796850
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for ByteString support</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=796850">Mozilla Bug 796850</a>
+<p id="display"></p>
+<pre id="test">
+<script type="application/javascript">
+
+ /** Test for Bug 796850 **/
+ var xhr = new XMLHttpRequest();
+ caught = false;
+ try {
+ xhr.open("\u5427", "about:mozilla", true);
+ }
+ catch (TypeError) {
+ caught = true;
+ }
+ ok(caught, "Character values > 255 not rejected for ByteString");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_InstanceOf.html b/dom/bindings/test/test_InstanceOf.html
new file mode 100644
index 000000000..514ec1b2a
--- /dev/null
+++ b/dom/bindings/test/test_InstanceOf.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=748983
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 748983</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=748983">Mozilla Bug 748983</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 748983 **/
+
+SimpleTest.waitForExplicitFinish();
+
+function runTest()
+{
+ ok(document instanceof EventTarget, "document is an event target")
+ ok(new XMLHttpRequest() instanceof XMLHttpRequest, "instanceof should work on XHR");
+ ok(HTMLElement.prototype instanceof Node, "instanceof needs to walk the prototype chain")
+
+ var otherWin = document.getElementById("testFrame").contentWindow;
+
+ ok(otherWin.HTMLElement.prototype instanceof otherWin.Node, "Same-origin instanceof of a interface prototype object should work, even if called cross-origin");
+ ok(!(otherWin.HTMLElement.prototype instanceof Node), "Cross-origin instanceof of a interface prototype object shouldn't work");
+
+ // We need to reset HTMLElement.prototype.__proto__ to the original value
+ // before using anything from the harness, otherwise the harness code breaks
+ // in weird ways.
+ HTMLElement.prototype.__proto__ = otherWin.Element.prototype;
+ var [ shouldSucceed, shouldFail ] = otherWin.runTest();
+ shouldSucceed = shouldSucceed && HTMLElement.prototype instanceof otherWin.Element;
+ shouldFail = shouldFail && HTMLElement.prototype instanceof Element;
+ HTMLElement.prototype.__proto__ = Element.prototype;
+
+ ok(shouldSucceed, "If an interface prototype object is on the protochain then instanceof with the interface object should succeed");
+ ok(!shouldFail, "If an interface prototype object is not on the protochain then instanceof with the interface object should succeed");
+
+ SimpleTest.finish();
+}
+
+</script>
+</pre>
+<iframe id="testFrame" src="file_InstanceOf.html" onload="runTest()"></iframe>
+</body>
+</html>
diff --git a/dom/bindings/test/test_Object.prototype_props.html b/dom/bindings/test/test_Object.prototype_props.html
new file mode 100644
index 000000000..03147eb03
--- /dev/null
+++ b/dom/bindings/test/test_Object.prototype_props.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test for bug 987110</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+ var props = Object.getOwnPropertyNames(Object.prototype);
+ // If you change this list, make sure it continues to match the list in
+ // Codegen.py's CGDictionary.getMemberDefinition method.
+ var expected = [
+ "constructor", "toSource", "toString", "toLocaleString", "valueOf",
+ "watch", "unwatch", "hasOwnProperty", "isPrototypeOf",
+ "propertyIsEnumerable", "__defineGetter__", "__defineSetter__",
+ "__lookupGetter__", "__lookupSetter__", "__proto__"
+ ];
+ assert_array_equals(props.sort(), expected.sort());
+}, "Own properties of Object.prototype");
+</script>
diff --git a/dom/bindings/test/test_async_stacks.html b/dom/bindings/test/test_async_stacks.html
new file mode 100644
index 000000000..8b655a14d
--- /dev/null
+++ b/dom/bindings/test/test_async_stacks.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1148593
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1148593</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1148593 **/
+
+ SimpleTest.waitForExplicitFinish();
+
+ var TESTS;
+
+ function nextTest() {
+ var t = TESTS.pop();
+ if (t) {
+ t();
+ } else {
+ SimpleTest.finish();
+ }
+ }
+
+ function checkStack(functionName) {
+ try {
+ noSuchFunction();
+ } catch (e) {
+ ok(e.stack.indexOf(functionName) >= 0, "stack includes " + functionName);
+ }
+ nextTest();
+ }
+
+ function eventListener() {
+ checkStack("registerEventListener");
+ }
+ function registerEventListener(link) {
+ link.onload = eventListener;
+ }
+ function eventTest() {
+ var link = document.createElement("link");
+ link.rel = "stylesheet";
+ link.href = "data:text/css,";
+ registerEventListener(link);
+ document.body.appendChild(link);
+ }
+
+ function xhrListener() {
+ checkStack("xhrTest");
+ }
+ function xhrTest() {
+ var ourFile = location.href;
+ var x = new XMLHttpRequest();
+ x.onload = xhrListener;
+ x.open("get", ourFile, true);
+ x.send();
+ }
+
+ function rafListener() {
+ checkStack("rafTest");
+ }
+ function rafTest() {
+ requestAnimationFrame(rafListener);
+ }
+
+ var intervalId;
+ function intervalHandler() {
+ clearInterval(intervalId);
+ checkStack("intervalTest");
+ }
+ function intervalTest() {
+ intervalId = setInterval(intervalHandler, 5);
+ }
+
+ function postMessageHandler(ev) {
+ ev.stopPropagation();
+ checkStack("postMessageTest");
+ }
+ function postMessageTest() {
+ window.addEventListener("message", postMessageHandler, true);
+ window.postMessage("whatever", "*");
+ }
+
+ function runTests() {
+ TESTS = [postMessageTest, intervalTest, rafTest, xhrTest, eventTest];
+ nextTest();
+ }
+
+ addLoadEvent(function() {
+ SpecialPowers.pushPrefEnv(
+ {"set": [['javascript.options.asyncstack', true]]},
+ runTests);
+ });
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1148593">Mozilla Bug 1148593</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_barewordGetsWindow.html b/dom/bindings/test/test_barewordGetsWindow.html
new file mode 100644
index 000000000..e098eea53
--- /dev/null
+++ b/dom/bindings/test/test_barewordGetsWindow.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=936056
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 936056</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 936056 **/
+ SimpleTest.waitForExplicitFinish();
+ window.onload = function() {
+ var desc = Object.getOwnPropertyDescriptor(frames[0], "document");
+ if (!desc || !desc.get) {
+ todo(false, "This test does nothing so far, but will once Window is on WebIDL bindings");
+ SimpleTest.finish();
+ return;
+ }
+ get = desc.get;
+ ok(get, "Couldn't find document getter");
+ Object.defineProperty(frames[0], "foo", { get: get, configurable: true });
+
+ var barewordFunc = frames[0].eval("(function (count) { var doc; for (var i = 0; i < count; ++i) doc = foo; return doc.documentElement; })");
+ var qualifiedFunc = frames[0].eval("(function (count) { var doc; for (var i = 0; i < count; ++i) doc = window.document; return doc.documentElement; })");
+ document.querySelector("iframe").onload = function () {
+ // interp
+ is(barewordFunc(1).textContent, "OLD", "Bareword should see own inner 1");
+ is(qualifiedFunc(1).textContent, "NEW",
+ "Qualified should see current inner 1");
+ // baseline
+ is(barewordFunc(100).textContent, "OLD", "Bareword should see own inner 2");
+ is(qualifiedFunc(100).textContent, "NEW",
+ "Qualified should see current inner 2");
+ // ion
+ is(barewordFunc(10000).textContent, "OLD", "Bareword should see own inner 3");
+ is(qualifiedFunc(10000).textContent, "NEW",
+ "Qualified should see current inner 2");
+ SimpleTest.finish();
+ }
+ frames[0].location = "data:text/plain,NEW";
+ }
+
+
+
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=936056">Mozilla Bug 936056</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe src="data:text/plain,OLD"></iframe>
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_blacklisted_prerendering_function.xul b/dom/bindings/test/test_blacklisted_prerendering_function.xul
new file mode 100644
index 000000000..02a76d88d
--- /dev/null
+++ b/dom/bindings/test/test_blacklisted_prerendering_function.xul
@@ -0,0 +1,124 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ onload="runTest();">
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+
+<script class="testbody" type="application/javascript">
+<![CDATA[
+
+ SimpleTest.waitForExplicitFinish();
+
+ function Listener(aBrowser, aPrerendered, aCallback) {
+ this.init(aBrowser, aPrerendered, aCallback);
+ }
+
+ Listener.prototype = {
+ init: function(aBrowser, aPrerendered, aCallback) {
+ this.mBrowser = aBrowser;
+ this.mPrerendered = aPrerendered;
+ this.mCallback = aCallback;
+ },
+ QueryInterface: function(aIID) {
+ if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
+ aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
+ aIID.equals(Components.interfaces.nsISupports))
+ return this;
+ throw Components.results.NS_NOINTERFACE;
+ },
+ onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus) {
+ if ((aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) &&
+ (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_IS_DOCUMENT)) {
+ var doc = this.mBrowser.contentDocument;
+ var stage = doc.getElementById("stage");
+ if (this.mPrerendered) {
+ is(stage.textContent, "before", "The blacklisted call should properly be intercepted in prerendering mode");
+ } else {
+ // In normal mode, we may or may not have run the timeout and/or the interval.
+ switch (stage.textContent) {
+ case "after":
+ case "in timeout":
+ case "in interval":
+ ok(true, "The blacklisted call should work fine in normal mode");
+ break;
+ default:
+ ok(false, "The blacklisted call should work fine in normal mode");
+ break;
+ }
+ }
+ progress.removeProgressListener(progressListener);
+
+ // Set three timeouts to see if the interval triggered
+ var self = this;
+ function checkInterval() {
+ var expected = self.mPrerendered ? "before" : "in interval";
+ var desc = self.mPrerendered ? "No timer should be running" : "Timers should run as normal";
+ is(stage.textContent, expected, desc);
+ // Now, dispatch a key event to the window and see if the keydown handler runs
+ synthesizeKey("a", {}, self.mBrowser.contentWindow);
+ expected = self.mPrerendered ? "before" : "keydown";
+ desc = self.mPrerendered ? "No event handler should be running" : "Event handlers should run as normal";
+ is(stage.textContent, expected, desc);
+ self.mCallback();
+ }
+ setTimeout(function() {
+ setTimeout(function() {
+ setTimeout(function() {
+ checkInterval();
+ }, 0);
+ }, 0);
+ }, 0);
+ }
+ },
+ onProgressChange : function(aWebProgress, aRequest,
+ aCurSelfProgress, aMaxSelfProgress,
+ aCurTotalProgress, aMaxTotalProgress) {},
+ onLocationChange : function(aWebProgress, aRequest, aLocation, aFlags) {},
+ onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage) {},
+ onSecurityChange : function(aWebProgress, aRequest, aState) {},
+ mBrowser: null,
+ mPrerendered: false,
+ mCallback: null
+ };
+
+ var progress, progressListener;
+
+ function runTest() {
+ testStep(false, "file_focuser.html", function() {
+ testStep(true, "file_focuser.html", function() {
+ testStep(false, "file_fullScreenPropertyAccessor.html", function() {
+ testStep(true, "file_fullScreenPropertyAccessor.html", function() {
+ SimpleTest.finish();
+ });
+ });
+ });
+ });
+ }
+
+ function testStep(aPrerendered, aFileName, aCallback) {
+ var browser = document.getElementById(aPrerendered ? "prerendered" : "normal");;
+ progressListener = new Listener(browser, aPrerendered, aCallback);
+ var docShell = browser.docShell;
+ progress = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebProgress);
+ progress.addProgressListener(progressListener,
+ Components.interfaces.nsIWebProgress.NOTIFY_ALL);
+ browser.loadURI("chrome://mochitests/content/chrome/dom/bindings/test/" + aFileName);
+ }
+
+]]>
+</script>
+
+<body id="html_body" xmlns="http://www.w3.org/1999/xhtml">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1069719">Mozilla Bug 1069719</a>
+<p id="display"></p>
+
+<pre id="test">
+</pre>
+</body>
+<browser prerendered="true" id="prerendered"/>
+<browser id="normal"/>
+</window>
diff --git a/dom/bindings/test/test_bug1036214.html b/dom/bindings/test/test_bug1036214.html
new file mode 100644
index 000000000..dd98eb482
--- /dev/null
+++ b/dom/bindings/test/test_bug1036214.html
@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1036214
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1036214</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for subsumes-checking |any| and |object| for js-implemented WebIDL. **/
+ SimpleTest.waitForExplicitFinish();
+ var xoObjects = [];
+ function setup() {
+ xoObjects.push(window[0]);
+ xoObjects.push(window[0].location);
+ xoObjects.push(SpecialPowers.unwrap(SpecialPowers.wrap(window[0]).document));
+ xoObjects.push(SpecialPowers);
+ xoObjects.push(SpecialPowers.wrap);
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, go);
+ }
+
+ function checkThrows(f, msg) {
+ try {
+ f();
+ ok(false, "Should have thrown: " + msg);
+ } catch (e) {
+ ok(true, "Threw correctly: " + msg);
+ ok(/denied|insecure/.test(e), "Threw security exception: " + e);
+ }
+ }
+
+ function go() {
+
+ //
+ // Test the basics of the test interface.
+ //
+
+ var any = { a: 11 };
+ var obj = { b: 22, c: "str" };
+ var obj2 = { foo: "baz" };
+ var myDict = { anyMember: 42, objectMember: { answer: 42 }, objectOrStringMember: { answer: "anobject" },
+ anySequenceMember: [{}, 1, "thirdinsequence"],
+ innerDictionary: { innerObject: { answer: "rabbithole" } } };
+ var t = new TestInterfaceJS(any, obj, myDict);
+ is(Object.getPrototypeOf(t), TestInterfaceJS.prototype, "Prototype setup works correctly");
+ is(t.anyArg, any, "anyArg is correct");
+ is(t.objectArg, obj, "objectArg is correct");
+ is(t.dictionaryArg.anyMember, 42, "dictionaryArg looks correct");
+ is(t.dictionaryArg.objectMember.answer, 42, "dictionaryArg looks correct");
+ t.anyAttr = 2;
+ is(t.anyAttr, 2, "ping-pong any attribute works");
+ t.objAttr = obj2;
+ is(t.objAttr, obj2, "ping-pong object attribute works");
+ t.dictionaryAttr = myDict;
+ is(t.dictionaryAttr.anyMember, 42, "ping-pong dictionary attribute works");
+ is(t.dictionaryAttr.objectMember.answer, 42, "ping-pong dictionary attribute works");
+
+ is(any, t.pingPongAny(any), "ping-pong works with any");
+ is(obj, t.pingPongObject(obj), "ping-pong works with obj");
+ is(obj, t.pingPongObjectOrString(obj), "ping-pong works with obj or string");
+ is("foo", t.pingPongObjectOrString("foo"), "ping-pong works with obj or string");
+ is(t.pingPongDictionary(myDict).anyMember, 42, "ping pong works with dict");
+ is(t.pingPongDictionary(myDict).objectMember.answer, 42, "ping pong works with dict");
+ is(t.pingPongDictionary(myDict).objectOrStringMember.answer, "anobject", "ping pong works with dict");
+ is(t.pingPongDictionary(myDict).anySequenceMember[2], "thirdinsequence", "ping pong works with dict");
+ is(t.pingPongDictionary(myDict).innerDictionary.innerObject.answer, "rabbithole", "ping pong works with layered dicts");
+ is(t.pingPongDictionaryOrLong({anyMember: 42}), 42, "ping pong (dict or long) works with dict");
+ is(t.pingPongDictionaryOrLong(42), 42, "ping pong (dict or long) works with long");
+ ok(/canary/.test(t.pingPongMap({ someVal: 42, someOtherVal: "canary" })), "ping pong works with mozmap");
+ is(t.objectSequenceLength([{}, {}, {}]), 3, "ping pong works with object sequence");
+ is(t.anySequenceLength([42, 'string', {}, undefined]), 4, "ping pong works with any sequence");
+
+ //
+ // Test that we throw in the cross-origin cases.
+ //
+
+ xoObjects.forEach(function(xoObj) {
+ var blank = new TestInterfaceJS();
+ checkThrows(() => new TestInterfaceJS(xoObj, undefined), "any param for constructor");
+ checkThrows(() => new TestInterfaceJS(undefined, xoObj), "obj param for constructor");
+ checkThrows(() => new TestInterfaceJS(undefined, undefined, { anyMember: xoObj }), "any dict param for constructor");
+ checkThrows(() => new TestInterfaceJS(undefined, undefined, { objectMember: xoObj }), "object dict param for constructor");
+ checkThrows(() => new TestInterfaceJS(undefined, undefined, { objectOrStringMember: xoObj }), "union dict param for constructor");
+ checkThrows(() => new TestInterfaceJS(undefined, undefined, { anySequenceMember: [0, xoObj, 'hi' ] }), "sequence dict param for constructor");
+ checkThrows(() => new TestInterfaceJS(undefined, undefined, { innerDictionary: { innerObject: xoObj } }), "inner dict param for constructor");
+ checkThrows(() => t.anyAttr = xoObj, "anyAttr");
+ checkThrows(() => t.objectAttr = xoObj, "objAttr");
+ checkThrows(() => t.dictionaryAttr = { anyMember: xoObj }, "dictionaryAttr any");
+ checkThrows(() => t.dictionaryAttr = { objectMember: xoObj }, "dictionaryAttr object");
+ checkThrows(() => t.pingPongAny(xoObj), "pingpong any");
+ checkThrows(() => t.pingPongObject(xoObj), "pingpong obj");
+ checkThrows(() => t.pingPongObjectOrString(xoObj), "pingpong union");
+ checkThrows(() => t.pingPongDictionary({ anyMember: xoObj }), "dictionary pingpong any");
+ checkThrows(() => t.pingPongDictionary({ objectMember: xoObj }), "dictionary pingpong object");
+ checkThrows(() => t.pingPongDictionary({ anyMember: xoObj, objectMember: xoObj }), "dictionary pingpong both");
+ checkThrows(() => t.pingPongDictionary({ objectOrStringMember: xoObj }), "dictionary pingpong objectorstring");
+ checkThrows(() => t.pingPongDictionaryOrLong({ objectMember: xoObj }), "unionable dictionary");
+ checkThrows(() => t.pingPongDictionaryOrLong({ anyMember: xoObj }), "unionable dictionary");
+ checkThrows(() => t.pingPongMap({ someMember: 42, someOtherMember: {}, crossOriginMember: xoObj }), "mozmap");
+ checkThrows(() => t.objectSequenceLength([{}, {}, xoObj, {}]), "object sequence");
+ checkThrows(() => t.anySequenceLength([42, 'someString', xoObj, {}]), "any sequence");
+ });
+
+
+ SimpleTest.finish();
+ }
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1036214">Mozilla Bug 1036214</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+<iframe id="ifr" onload="setup();" src="http://example.org/tests/js/xpconnect/tests/mochitest/file_empty.html"></iframe>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug1041646.html b/dom/bindings/test/test_bug1041646.html
new file mode 100644
index 000000000..22baed454
--- /dev/null
+++ b/dom/bindings/test/test_bug1041646.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1041646
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1041646</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1041646 **/
+ // We need to reject the promise with a DOMException, so make sure we have
+ // something that produces one.
+ function throwException() {
+ document.createTextNode("").appendChild(document);
+ }
+ try {
+ throwException();
+ } catch (e) {
+ ok(e instanceof DOMException, "This test won't test what it should be testing");
+ }
+
+ SimpleTest.waitForExplicitFinish();
+
+ // We want a new DOMException each time here.
+ for (var i = 0; i < 100; ++i) {
+ new Promise(throwException);
+ }
+
+ // Now make sure we wait for all those promises above to reject themselves
+ Promise.resolve(1).then(function() {
+ SpecialPowers.gc(); // This should not assert or crash
+ SimpleTest.finish();
+ });
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1041646">Mozilla Bug 1041646</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug1123516_maplikesetlike.html b/dom/bindings/test/test_bug1123516_maplikesetlike.html
new file mode 100644
index 000000000..18ede38ac
--- /dev/null
+++ b/dom/bindings/test/test_bug1123516_maplikesetlike.html
@@ -0,0 +1,271 @@
+<!-- Any copyright is dedicated to the Public Domain.
+- http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test Maplike Interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <script class="testbody" type="application/javascript">
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, function() {
+
+ base_properties = [["has", "function", 1],
+ ["entries", "function", 0],
+ ["keys", "function", 0],
+ ["values", "function", 0],
+ ["forEach", "function", 1],
+ ["size", "number"]];
+ maplike_properties = base_properties.concat([["set", "function", 2]]);
+ setlike_properties = base_properties;
+ rw_properties = [["clear", "function", 0],
+ ["delete", "function", 1]];
+ setlike_rw_properties = base_properties.concat(rw_properties).concat([["add", "function", 1]]);
+ maplike_rw_properties = maplike_properties.concat(rw_properties).concat([["get", "function",1]]);
+ var testExistence = function testExistence(prefix, obj, properties) {
+ for (var [name, type, args] of properties) {
+ // Properties are somewhere up the proto chain, hasOwnProperty won't work
+ isnot(obj[name], undefined,
+ `${prefix} object has property ${name}`);
+
+ is(typeof obj[name], type,
+ `${prefix} object property ${name} is a ${type}`);
+ // Check function length
+ if (type == "function") {
+ is(obj[name].length, args,
+ `${prefix} object property ${name} is length ${args}`);
+ is(obj[name].name, name,
+ `${prefix} object method name is ${name}`);
+ }
+
+ // Find where property is on proto chain, check for enumerablility there.
+ var owner = obj;
+ while (owner) {
+ var propDesc = Object.getOwnPropertyDescriptor(owner, name);
+ if (propDesc) {
+ ok(!propDesc.enumerable,
+ `${prefix} object property ${name} is not enumerable`);
+ break;
+ }
+ owner = Object.getPrototypeOf(owner);
+ }
+ }
+ }
+
+ var m;
+ var testSet;
+ var testIndex;
+ // Simple map creation and functionality test
+ info("SimpleMap: Testing simple map creation and functionality");
+ m = new TestInterfaceMaplike();
+ ok(m, "SimpleMap: got a TestInterfaceMaplike object");
+ testExistence("SimpleMap: ", m, maplike_rw_properties);
+ is(m.size, 0, "SimpleMap: size should be zero");
+ ok(!m.has("test"), "SimpleMap: maplike has should return false");
+ is(m.get("test"), undefined, "SimpleMap: maplike get should return undefined on bogus lookup");
+ m1 = m.set("test", 1);
+ is(m, m1, "SimpleMap: return from set should be map object");
+ is(m.size, 1, "SimpleMap: size should be 1");
+ ok(m.has("test"), "SimpleMap: maplike has should return true");
+ is(m.get("test"), 1, "SimpleMap: maplike get should return value entered");
+ m2 = m.set("test2", 2);
+ is(m.size, 2, "SimpleMap: size should be 2");
+ testSet = [["test", 1], ["test2", 2]];
+ testIndex = 0;
+ m.forEach(function(v, k, o) {
+ "use strict";
+ is(o, m, "SimpleMap: foreach obj is correct");
+ is(k, testSet[testIndex][0], "SimpleMap: foreach map key: " + k + " = " + testSet[testIndex][0]);
+ is(v, testSet[testIndex][1], "SimpleMap: foreach map value: " + v + " = " + testSet[testIndex][1]);
+ testIndex += 1;
+ });
+ is(testIndex, 2, "SimpleMap: foreach ran correct number of times");
+ ok(m.has("test2"), "SimpleMap: maplike has should return true");
+ is(m.get("test2"), 2, "SimpleMap: maplike get should return value entered");
+ is(m.delete("test2"), true, "SimpleMap: maplike deletion should return boolean");
+ is(m.size, 1, "SimpleMap: size should be 1");
+ iterable = false;
+ for (var e of m) {
+ iterable = true;
+ is(e[0], "test", "SimpleMap: iterable first array element should be key");
+ is(e[1], 1, "SimpleMap: iterable second array element should be value");
+ }
+ is(m[Symbol.iterator].length, 0, "SimpleMap: @@iterator symbol is correct length");
+ is(m[Symbol.iterator].name, "entries", "SimpleMap: @@iterator symbol has correct name");
+ is(m[Symbol.iterator], m.entries, 'SimpleMap: @@iterator is an alias for "entries"');
+ ok(iterable, "SimpleMap: @@iterator symbol resolved correctly");
+ for (var k of m.keys()) {
+ is(k, "test", "SimpleMap: first keys element should be 'test'");
+ }
+ for (var v of m.values()) {
+ is(v, 1, "SimpleMap: first values elements should be 1");
+ }
+ for (var e of m.entries()) {
+ is(e[0], "test", "SimpleMap: entries first array element should be 'test'");
+ is(e[1], 1, "SimpleMap: entries second array element should be 1");
+ }
+ m.clear();
+ is(m.size, 0, "SimpleMap: size should be 0 after clear");
+
+ // Simple set creation and functionality test
+ info("SimpleSet: Testing simple set creation and functionality");
+ m = new TestInterfaceSetlike();
+ ok(m, "SimpleSet: got a TestInterfaceSetlike object");
+ testExistence("SimpleSet: ", m, setlike_rw_properties);
+ is(m.size, 0, "SimpleSet: size should be zero");
+ ok(!m.has("test"), "SimpleSet: maplike has should return false");
+ m1 = m.add("test");
+ is(m, m1, "SimpleSet: return from set should be map object");
+ is(m.size, 1, "SimpleSet: size should be 1");
+ ok(m.has("test"), "SimpleSet: maplike has should return true");
+ m2 = m.add("test2");
+ is(m.size, 2, "SimpleSet: size should be 2");
+ testSet = ["test", "test2"];
+ testIndex = 0;
+ m.forEach(function(v, k, o) {
+ "use strict";
+ is(o, m, "SimpleSet: foreach obj is correct");
+ is(k, testSet[testIndex], "SimpleSet: foreach set key: " + k + " = " + testSet[testIndex]);
+ testIndex += 1;
+ });
+ is(testIndex, 2, "SimpleSet: foreach ran correct number of times");
+ ok(m.has("test2"), "SimpleSet: maplike has should return true");
+ is(m.delete("test2"), true, "SimpleSet: maplike deletion should return true");
+ is(m.size, 1, "SimpleSet: size should be 1");
+ iterable = false;
+ for (var e of m) {
+ iterable = true;
+ is(e, "test", "SimpleSet: iterable first array element should be key");
+ }
+ is(m[Symbol.iterator].length, 0, "SimpleSet: @@iterator symbol is correct length");
+ is(m[Symbol.iterator].name, "values", "SimpleSet: @@iterator symbol has correct name");
+ is(m[Symbol.iterator], m.values, 'SimpleSet: @@iterator is an alias for "values"');
+ ok(iterable, "SimpleSet: @@iterator symbol resolved correctly");
+ for (var k of m.keys()) {
+ is(k, "test", "SimpleSet: first keys element should be 'test'");
+ }
+ for (var v of m.values()) {
+ is(v, "test", "SimpleSet: first values elements should be 'test'");
+ }
+ for (var e of m.entries()) {
+ is(e[0], "test", "SimpleSet: Entries first array element should be 'test'");
+ is(e[1], "test", "SimpleSet: Entries second array element should be 'test'");
+ }
+ m.clear();
+ is(m.size, 0, "SimpleSet: size should be 0 after clear");
+
+ // Map convenience function test
+ info("Testing map convenience functions");
+ m = new TestInterfaceMaplike();
+ ok(m, "MapConvenience: got a TestInterfaceMaplike object");
+ is(m.size, 0, "MapConvenience: size should be zero");
+ ok(!m.hasInternal("test"), "MapConvenience: maplike hasInternal should return false");
+ m.setInternal("test", 1);
+ is(m.size, 1, "MapConvenience: size should be 1");
+ ok(m.hasInternal("test"), "MapConvenience: maplike hasInternal should return true");
+ is(m.get("test"), 1, "MapConvenience: maplike get should return value entered");
+ m2 = m.setInternal("test2", 2);
+ is(m.size, 2, "size should be 2");
+ ok(m.hasInternal("test2"), "MapConvenience: maplike hasInternal should return true");
+ is(m.get("test2"), 2, "MapConvenience: maplike get should return value entered");
+ is(m.deleteInternal("test2"), true, "MapConvenience: maplike deleteInternal should return true");
+ is(m.size, 1, "MapConvenience: size should be 1");
+ m.clearInternal();
+ is(m.size, 0, "MapConvenience: size should be 0 after clearInternal");
+
+ // Map convenience function test using objects and readonly
+
+ info("Testing Map convenience function test using objects and readonly");
+ m = new TestInterfaceMaplikeObject();
+ ok(m, "ReadOnlyMapConvenience: got a TestInterfaceMaplikeObject object");
+ is(m.size, 0, "ReadOnlyMapConvenience: size should be zero");
+ is(m["set"], undefined, "ReadOnlyMapConvenience: readonly map, should be no set function");
+ is(m["clear"], undefined, "ReadOnlyMapConvenience: readonly map, should be no clear function");
+ is(m["delete"], undefined, "ReadOnlyMapConvenience: readonly map, should be no delete function");
+ ok(!m.hasInternal("test"), "ReadOnlyMapConvenience: maplike hasInternal should return false");
+ m.setInternal("test");
+ is(m.size, 1, "size should be 1");
+ ok(m.hasInternal("test"), "ReadOnlyMapConvenience: maplike hasInternal should return true");
+ m2 = m.setInternal("test2");
+ is(m.size, 2, "size should be 2");
+ ok(m.hasInternal("test2"), "ReadOnlyMapConvenience: maplike hasInternal should return true");
+ is(m.deleteInternal("test2"), true, "ReadOnlyMapConvenience: maplike deleteInternal should return true");
+ is(m.size, 1, "ReadOnlyMapConvenience: size should be 1");
+ m.clearInternal();
+ is(m.size, 0, "ReadOnlyMapConvenience: size should be 0 after clearInternal");
+
+ // JS implemented map creation convenience function test
+
+ info("JSMapConvenience: Testing JS implemented map creation convenience functions");
+ m = new TestInterfaceJSMaplike();
+ ok(m, "JSMapConvenience: got a TestInterfaceJSMaplike object");
+ is(m.size, 0, "JSMapConvenience: size should be zero");
+ ok(!m.has("test"), "JSMapConvenience: maplike has should return false");
+ m.setInternal("test", 1);
+ is(m.size, 1, "JSMapConvenience: size should be 1");
+ ok(m.has("test"), "JSMapConvenience: maplike has should return true");
+ is(m.get("test"), 1, "JSMapConvenience: maplike get should return value entered");
+ m2 = m.setInternal("test2", 2);
+ is(m.size, 2, "JSMapConvenience: size should be 2");
+ ok(m.has("test2"), "JSMapConvenience: maplike has should return true");
+ is(m.get("test2"), 2, "JSMapConvenience: maplike get should return value entered");
+ is(m.deleteInternal("test2"), true, "JSMapConvenience: maplike deleteInternal should return true");
+ is(m.size, 1, "JSMapConvenience: size should be 1");
+ for (var k of m.keys()) {
+ is(k, "test", "JSMapConvenience: first keys element should be 'test'");
+ }
+ for (var v of m.values()) {
+ is(v, 1, "JSMapConvenience: first values elements should be 1");
+ }
+ for (var e of m.entries()) {
+ is(e[0], "test", "JSMapConvenience: entries first array element should be 'test'");
+ is(e[1], 1, "JSMapConvenience: entries second array element should be 1");
+ }
+ m.clearInternal();
+ is(m.size, 0, "JSMapConvenience: size should be 0 after clearInternal");
+
+ // Test this override for forEach
+ info("ForEachThisOverride: Testing this override for forEach");
+ m = new TestInterfaceMaplike();
+ m.set("test", 1);
+ m.forEach(function(v, k, o) {
+ "use strict";
+ is(o, m, "ForEachThisOverride: foreach obj is correct");
+ is(this, 5, "ForEachThisOverride: 'this' value should be correct");
+ }, 5);
+
+ // Test defaulting arguments on maplike to undefined
+ info("MapArgsDefault: Testing maplike defaulting arguments to undefined");
+ m = new TestInterfaceMaplike();
+ m.set();
+ is(m.size, 1, "MapArgsDefault: should have 1 entry");
+ m.forEach(function(v, k) {
+ "use strict";
+ is(typeof k, "string", "MapArgsDefault: key is a string");
+ is(k, "undefined", "MapArgsDefault: key is the string undefined");
+ is(v, 0, "MapArgsDefault: value is 0");
+ });
+ is(m.get(), 0, "MapArgsDefault: no argument to get() returns correct value");
+ m.delete();
+ is(m.size, 0, "MapArgsDefault: should have 0 entries");
+
+ // Test defaulting arguments on setlike to undefined
+ info("SetArgsDefault: Testing setlike defaulting arguments to undefined");
+ m = new TestInterfaceSetlike();
+ m.add();
+ is(m.size, 1, "SetArgsDefault: should have 1 entry");
+ m.forEach(function(v, k) {
+ "use strict";
+ is(typeof k, "string", "SetArgsDefault: key is a string");
+ is(k, "undefined", "SetArgsDefault: key is the string undefined");
+ });
+ m.delete();
+ is(m.size, 0, "SetArgsDefault: should have 0 entries");
+
+ SimpleTest.finish();
+ });
+ </script>
+ </body>
+</html>
diff --git a/dom/bindings/test/test_bug1123516_maplikesetlikechrome.xul b/dom/bindings/test/test_bug1123516_maplikesetlikechrome.xul
new file mode 100644
index 000000000..4bc45cddd
--- /dev/null
+++ b/dom/bindings/test/test_bug1123516_maplikesetlikechrome.xul
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
+<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1123516
+-->
+<window title="Mozilla Bug 1123516"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <iframe id="t"></iframe>
+
+ <!-- test results are displayed in the html:body -->
+ <body xmlns="http://www.w3.org/1999/xhtml">
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1123516"
+ target="_blank">Mozilla Bug 1123516</a>
+ </body>
+
+ <!-- test code goes here -->
+ <script type="application/javascript">
+ <![CDATA[
+
+ /** Test for Bug 1123516 **/
+ const Cu = Components.utils;
+ function doTest() {
+ var win = $("t").contentWindow;
+ var sandbox = Components.utils.Sandbox(win, { sandboxPrototype: win });
+ is(sandbox._content, undefined, "_content does nothing over Xray");
+ // Test cross-compartment usage of maplike/setlike WebIDL structures.
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, function() {
+ try {
+ var maplike = Components.utils.evalInSandbox("var m = new TestInterfaceMaplike(); m;", sandbox);
+ maplike.set("test2", 2);
+ is(maplike.get("test2"), 2, "Should be able to create and use maplike/setlike across compartments");
+ var test = Components.utils.evalInSandbox("m.get('test2');", sandbox);
+ is(test, 2, "Maplike/setlike should still work in original compartment");
+ is(maplike.size, 1, "Testing size retrieval across compartments");
+ } catch(e) {
+ ok(false, "Shouldn't throw when working with cross-compartment maplike/setlike interfaces " + e)
+ };
+ try {
+ var setlike = Components.utils.evalInSandbox("var m = new TestInterfaceSetlikeNode(); m.add(document.documentElement); m;", sandbox);
+ is(TestInterfaceSetlikeNode.prototype.has.call(setlike, win.document.documentElement), true,
+ "Cross-compartment unwrapping/comparison has works");
+ // TODO: Should throw until iterators are handled by Xrays, Bug 1023984
+ try {
+ var e = TestInterfaceSetlikeNode.prototype.keys.call(setlike);
+ ok(false, "Calling iterators via xrays should fail");
+ } catch(e) {
+ ok(true, "Calling iterators via xrays should fail");
+ }
+
+ setlike.forEach((v,k,t) => { is(v, win.document.documentElement, "Cross-compartment forEach works"); });
+ TestInterfaceSetlikeNode.prototype.forEach.call(setlike,
+ (v,k,t) => { is(v, win.document.documentElement, "Cross-compartment forEach works"); });
+ is(TestInterfaceSetlikeNode.prototype.delete.call(setlike, win.document.documentElement), true,
+ "Cross-compartment unwrapping/comparison delete works");
+ } catch(e) {
+ ok(false, "Shouldn't throw when working with cross-compartment maplike/setlike interfaces " + e)
+ };
+ SimpleTest.finish();
+ });
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ addLoadEvent(doTest);
+ ]]>
+ </script>
+</window>
diff --git a/dom/bindings/test/test_bug1123875.html b/dom/bindings/test/test_bug1123875.html
new file mode 100644
index 000000000..5658091c4
--- /dev/null
+++ b/dom/bindings/test/test_bug1123875.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test for Bug 1123875</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+ test(() => {
+ assert_throws(new TypeError, () => {
+ "use strict";
+ document.childNodes.length = 0;
+ });
+ }, "setting a readonly attribute on a proxy in strict mode should throw a TypeError");
+</script>
diff --git a/dom/bindings/test/test_bug1287912.html b/dom/bindings/test/test_bug1287912.html
new file mode 100644
index 000000000..ae72b2316
--- /dev/null
+++ b/dom/bindings/test/test_bug1287912.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1287912
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1287912</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1287912">Mozilla Bug 1287912</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="t" src="http://example.org/tests/dom/bindings/test/"></iframe>
+</div>
+<pre id="test">
+<script type="application/javascript">
+function test()
+{
+ var win = document.getElementById("t").contentWindow;
+ is(Object.getPrototypeOf(win.Image), win.Function.prototype, "The __proto__ of a named constructor is Function.prototype");
+ is(win.Image.prototype, win.HTMLImageElement.prototype, "The prototype property of a named constructor is the interface prototype object");
+ is(win.HTMLImageElement['foo'], undefined, "Should not have a property named foo on the HTMLImageElement interface object");
+ is(win.Image['foo'], undefined, "Should not have a property named foo on the Image named constructor");
+
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug560072.html b/dom/bindings/test/test_bug560072.html
new file mode 100644
index 000000000..82bb1c2c6
--- /dev/null
+++ b/dom/bindings/test/test_bug560072.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=560072
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 560072</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=560072">Mozilla Bug 560072</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 560072 **/
+is(document.body,
+ Object.getOwnPropertyDescriptor(HTMLDocument.prototype, "body").get.call(document),
+ "Should get body out of property descriptor");
+
+is(document.body,
+ Object.getOwnPropertyDescriptor(Object.getPrototypeOf(document), "body").get.call(document),
+ "Should get body out of property descriptor this way too");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug742191.html b/dom/bindings/test/test_bug742191.html
new file mode 100644
index 000000000..b4b3151d7
--- /dev/null
+++ b/dom/bindings/test/test_bug742191.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=742191
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for invalid argument object</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=742191">Mozilla Bug 742191</a>
+<p id="display"></p>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 742191 **/
+function doTest() {
+ var gotTypeError = false;
+ var ctx = document.createElement("canvas").getContext("2d");
+ try {
+ ctx.drawImage({}, 0, 0);
+ } catch(e) {
+ if (e instanceof TypeError) {
+ gotTypeError = true;
+ }
+ }
+
+ ok(gotTypeError, "passing an invalid argument should cause a type error!");
+}
+doTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug759621.html b/dom/bindings/test/test_bug759621.html
new file mode 100644
index 000000000..602a0cd7c
--- /dev/null
+++ b/dom/bindings/test/test_bug759621.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=759621
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 759621</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=759621">Mozilla Bug 759621</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 759621 **/
+var l = document.getElementsByTagName("*");
+l.namedItem = "pass";
+is(l.namedItem, "pass", "Should be able to set expando shadowing a proto prop");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug773326.html b/dom/bindings/test/test_bug773326.html
new file mode 100644
index 000000000..2e3b1ea30
--- /dev/null
+++ b/dom/bindings/test/test_bug773326.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test for Bug 773326</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+test(function() {
+ new Worker("data:text/javascript,new XMLHttpRequest(42)");
+}, "Should not crash")
+</script>
diff --git a/dom/bindings/test/test_bug775543.html b/dom/bindings/test/test_bug775543.html
new file mode 100644
index 000000000..d8df05f63
--- /dev/null
+++ b/dom/bindings/test/test_bug775543.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=775543
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 775543</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=775543">Mozilla Bug 775543</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="t" src="http://example.org/tests/dom/bindings/test/file_bug775543.html" onload="test();"></iframe>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 775543 **/
+
+function test()
+{
+ var a = XPCNativeWrapper(document.getElementById("t").contentWindow.wrappedJSObject.worker);
+ isnot(XPCNativeWrapper.unwrap(a), a, "XPCNativeWrapper(Worker) should be an Xray wrapper");
+ a.toString();
+ ok(true, "Shouldn't crash when calling a method on an Xray wrapper around a worker");
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug788369.html b/dom/bindings/test/test_bug788369.html
new file mode 100644
index 000000000..787bd28fe
--- /dev/null
+++ b/dom/bindings/test/test_bug788369.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=788369
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 788369</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=788369">Mozilla Bug 788369</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 788369 **/
+try {
+ var xhr = new(window.ActiveXObject || XMLHttpRequest)("Microsoft.XMLHTTP");
+ ok(xhr instanceof XMLHttpRequest, "Should have an XHR object");
+} catch (e) {
+ ok(false, "Should not throw exception when constructing: " + e);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug852846.html b/dom/bindings/test/test_bug852846.html
new file mode 100644
index 000000000..0ca2c7dad
--- /dev/null
+++ b/dom/bindings/test/test_bug852846.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=852846
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 852846</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 852846 **/
+ var elem = document.createElement("div");
+ is(elem.style.color, "", "Shouldn't have color set on HTML element")
+ elem.style = "color: green";
+ is(elem.style.color, "green", "Should have color set on HTML element")
+
+ elem = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+ is(elem.style.color, "", "Shouldn't have color set on SVG element")
+ elem.style = "color: green";
+ is(elem.style.color, "green", "Should have color set on SVG element")
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=852846">Mozilla Bug 852846</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug862092.html b/dom/bindings/test/test_bug862092.html
new file mode 100644
index 000000000..4b0633328
--- /dev/null
+++ b/dom/bindings/test/test_bug862092.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=862092
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 862092</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 862092 **/
+
+ SimpleTest.waitForExplicitFinish();
+ function runTest()
+ {
+ var frameDoc = document.getElementById("f").contentDocument;
+ var a = document.createElement("select");
+ a.expando = "test";
+ a = frameDoc.adoptNode(a)
+ is(a.expando, "test", "adoptNode needs to preserve expandos");
+ SimpleTest.finish();
+ }
+
+ </script>
+</head>
+<body onload="runTest();">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=862092">Mozilla Bug 862092</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="f"></iframe>
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_bug963382.html b/dom/bindings/test/test_bug963382.html
new file mode 100644
index 000000000..f48d2e8b0
--- /dev/null
+++ b/dom/bindings/test/test_bug963382.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=963382
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 963382</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for clearing cache attributes in JS-implemented WebIDL implementations. **/
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, go);
+
+ function go() {
+ var t = new TestInterfaceJS();
+
+ // Test [Cached] attribute clearing.
+ is(t.cachedAttr, 15, "Initial value of number");
+
+ t.setCachedAttr(3);
+ is(t.cachedAttr, 15, "Setting the number on the inner JS object should not affect cached value");
+
+ t.clearCachedAttrCache();
+ is(t.cachedAttr, 3, "Setting the number on the inner JS object should affect cached value after clearing the cache.");
+
+ SimpleTest.finish();
+ }
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=963382">Mozilla Bug 963382</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_callback_across_document_open.html b/dom/bindings/test/test_callback_across_document_open.html
new file mode 100644
index 000000000..2a505cefa
--- /dev/null
+++ b/dom/bindings/test/test_callback_across_document_open.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test for callback invocation for a callback that comes from a
+ no-longer-current window that still has an active document.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<iframe srcdoc='<script>function f() { parent.callCount++; }</script>'></iframe>
+<script>
+ var callCount = 0;
+ var t = async_test("A test of callback invocation in a no-longer-current window with a still-active document");
+ window.addEventListener("load", t.step_func_done(function() {
+ var d = document.createElement("div");
+ d.addEventListener("xyz", frames[0].f);
+ frames[0].document.open();
+ frames[0].document.write("All gone");
+ frames[0].document.close();
+ d.dispatchEvent(new Event("xyz"));
+ assert_equals(callCount, 1, "Callback should have been called");
+ }));
+</script>
diff --git a/dom/bindings/test/test_callback_default_thisval.html b/dom/bindings/test/test_callback_default_thisval.html
new file mode 100644
index 000000000..d98ed87b2
--- /dev/null
+++ b/dom/bindings/test/test_callback_default_thisval.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=957929
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 957929</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 957929 **/
+ SimpleTest.waitForExplicitFinish();
+
+ function f() {
+ "use strict";
+ is(this, undefined, "Should have undefined this value");
+ SimpleTest.finish();
+ }
+
+ addLoadEvent(function() {
+ requestAnimationFrame(f);
+ });
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=957929">Mozilla Bug 957929</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_callback_exceptions.html b/dom/bindings/test/test_callback_exceptions.html
new file mode 100644
index 000000000..a40b0b94f
--- /dev/null
+++ b/dom/bindings/test/test_callback_exceptions.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test for ...</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+promise_test(function(t) {
+ var iterator = document.createNodeIterator(document, NodeFilter.SHOW_ALL, JSON.parse);
+ return promise_rejects(t, new SyntaxError,
+ Promise.resolve().then(iterator.nextNode.bind(iterator)));
+}, "Trying to use JSON.parse as filter should throw a catchable SyntaxError exception even when the filter is invoked async");
+
+promise_test(function(t) {
+ return promise_rejects(t, new SyntaxError, Promise.resolve('{').then(JSON.parse));
+}, "Trying to use JSON.parse as a promise callback should allow the next promise to handle the resulting exception.");
+</script>
diff --git a/dom/bindings/test/test_cloneAndImportNode.html b/dom/bindings/test/test_cloneAndImportNode.html
new file mode 100644
index 000000000..fc53c8747
--- /dev/null
+++ b/dom/bindings/test/test_cloneAndImportNode.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=882541
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 882541</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 882541 **/
+ var div = document.createElement("div");
+ div.appendChild(document.createElement("span"));
+
+ var div2;
+
+ div2 = div.cloneNode();
+ is(div2.childNodes.length, 0, "cloneNode() should do a shallow clone");
+
+ div2 = div.cloneNode(undefined);
+ is(div2.childNodes.length, 0, "cloneNode(undefined) should do a shallow clone");
+
+ div2 = div.cloneNode(true);
+ is(div2.childNodes.length, 1, "cloneNode(true) should do a deep clone");
+
+ div2 = document.importNode(div);
+ is(div2.childNodes.length, 0, "importNode(node) should do a deep import");
+
+ div2 = document.importNode(div, undefined);
+ is(div2.childNodes.length, 0, "importNode(undefined) should do a shallow import");
+
+ div2 = document.importNode(div, true);
+ is(div2.childNodes.length, 1, "importNode(true) should do a deep import");
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=882541">Mozilla Bug 882541</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_crossOriginWindowSymbolAccess.html b/dom/bindings/test/test_crossOriginWindowSymbolAccess.html
new file mode 100644
index 000000000..7808631b6
--- /dev/null
+++ b/dom/bindings/test/test_crossOriginWindowSymbolAccess.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test for accessing symbols on a cross-origin window</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<iframe src="http://www1.w3c-test.org/common/blank.html"></iframe>
+<script>
+async_test(function (t) {
+ window.addEventListener("load", t.step_func(
+ function() {
+ assert_equals(document.querySelector("iframe").contentDocument, null, "Should have a crossorigin frame");
+ assert_throws(new Error(), function() {
+ frames[0][Symbol.iterator];
+ }, "Should throw exception on cross-origin Window symbol-named get");
+ assert_throws(new Error(), function() {
+ frames[0].location[Symbol.iterator];
+ }, "Should throw exception on cross-origin Location symbol-named get");
+ t.done();
+ }
+ ));
+}, "Check Symbol access on load");
+</script>
diff --git a/dom/bindings/test/test_defineProperty.html b/dom/bindings/test/test_defineProperty.html
new file mode 100644
index 000000000..f8f5f6283
--- /dev/null
+++ b/dom/bindings/test/test_defineProperty.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=910220
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 910220</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=910220">Mozilla Bug 910220</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<form name="x"></form>
+</div>
+<pre id="test">
+</pre>
+<script type="application/javascript">
+
+/** Test for Bug 910220 **/
+
+function getX() {
+ return "x";
+}
+
+function namedSetStrict(obj) {
+ "use strict";
+ var threw;
+ try {
+ obj.x = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in strict mode when setting named property on " + obj);
+
+ try {
+ obj[getX()] = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in strict mode when setting named property via SETELEM on " + obj);
+
+ try {
+ Object.defineProperty(obj, "x", { value: 17 });
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in strict mode when defining named property on " + obj);
+}
+function namedSetNonStrict(obj) {
+ var threw;
+ try {
+ obj.x = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(!threw,
+ "Should not throw in non-strict mode when setting named property on " + obj);
+
+ try {
+ obj[getX()] = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(!threw,
+ "Should not throw in non-strict mode when setting named property via SETELEM on" + obj);
+
+ try {
+ Object.defineProperty(obj, "x", { value: 17 });
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in non-strict mode when defining named property on " + obj);
+}
+for (var obj of [ document, document.forms ]) {
+ namedSetStrict(obj);
+ namedSetNonStrict(obj);
+}
+
+function indexedSetStrict(obj) {
+ "use strict";
+ var threw;
+ try {
+ obj[0] = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in strict mode when setting indexed property on " + obj);
+
+ try {
+ obj[1000] = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in strict mode when setting out of bounds indexed property on " + obj);
+
+ try {
+ Object.defineProperty(obj, "0", { value: 17 });
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in strict mode when defining indexed property on " + obj);
+}
+function indexedSetNonStrict(obj) {
+ var threw;
+ try {
+ obj[0] = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(!threw,
+ "Should not throw in non-strict mode when setting indexed property on " + obj);
+
+ try {
+ obj[1000] = 5;
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(!threw,
+ "Should not throw in non-strict mode when setting out of bounds indexed property on " + obj);
+
+ try {
+ Object.defineProperty(obj, "0", { value: 17 });
+ threw = false;
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw,
+ "Should throw in non-strict mode when defining indexed property on " + obj);
+}
+for (var obj of [ document.forms, document.childNodes ]) {
+ indexedSetStrict(obj);
+ indexedSetNonStrict(obj);
+}
+</script>
+</body>
+</html>
diff --git a/dom/bindings/test/test_document_location_set_via_xray.html b/dom/bindings/test/test_document_location_set_via_xray.html
new file mode 100644
index 000000000..cdadc5063
--- /dev/null
+++ b/dom/bindings/test/test_document_location_set_via_xray.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=905493
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 905493</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=905493">Mozilla Bug 905493</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="t" src="http://example.org/tests/dom/bindings/test/file_document_location_set_via_xray.html"></iframe>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 905493 **/
+
+function test()
+{
+ var doc = document.getElementById("t").contentWindow.document;
+ ok(!("x" in doc), "Should have an Xray here");
+ is(doc.x, undefined, "Really should have an Xray here");
+ is(doc.wrappedJSObject.x, 5, "And wrapping the right thing");
+ document.getElementById("t").onload = function() {
+ ok(true, "Load happened");
+ SimpleTest.finish();
+ };
+ try {
+ // Test the forwarding location setter
+ doc.location = "chrome://mochikit/content/tests/SimpleTest/test.css";
+ } catch (e) {
+ // Load failed
+ ok(false, "Load failed");
+ SimpleTest.finish();
+ }
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_document_location_via_xray_cached.html b/dom/bindings/test/test_document_location_via_xray_cached.html
new file mode 100644
index 000000000..20eef10fb
--- /dev/null
+++ b/dom/bindings/test/test_document_location_via_xray_cached.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1041731
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1041731</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1041731">Mozilla Bug 1041731</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="t" src="http://example.org/tests/dom/bindings/test/file_document_location_set_via_xray.html"></iframe>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1041731 **/
+
+function test()
+{
+ var loc = document.getElementById("t").contentWindow.document.location;
+ is(loc.toString, loc.toString, "Unforgeable method on the Xray should be cached");
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_domProxyArrayLengthGetter.html b/dom/bindings/test/test_domProxyArrayLengthGetter.html
new file mode 100644
index 000000000..a62adff2e
--- /dev/null
+++ b/dom/bindings/test/test_domProxyArrayLengthGetter.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1221421
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1221421</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript">
+
+ var x = document.documentElement.style;
+ x.__proto__ = [1, 2, 3];
+
+ var res = 0;
+ for (var h = 0; h < 5000; ++h) {
+ res += x.length;
+ }
+ is(res, 15000, "length getter should return array length");
+
+ </script>
+</head>
+
+<body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1221421">Mozilla Bug 1221421</a>
+</body>
+</html>
diff --git a/dom/bindings/test/test_dom_xrays.html b/dom/bindings/test/test_dom_xrays.html
new file mode 100644
index 000000000..0700db2f8
--- /dev/null
+++ b/dom/bindings/test/test_dom_xrays.html
@@ -0,0 +1,231 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=787070
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 787070</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=787070">Mozilla Bug 787070</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="t" src="http://example.org/tests/dom/bindings/test/file_dom_xrays.html"></iframe>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1021066 **/
+
+var Cu = Components.utils;
+
+// values should contain the values that the property should have on each of
+// the objects on the prototype chain of obj. A value of undefined signals
+// that the value should not be present on that prototype.
+function checkXrayProperty(obj, name, values)
+{
+ var instance = obj;
+ do {
+ var value = values.shift();
+ if (typeof value == "undefined") {
+ ok(!obj.hasOwnProperty(name), "hasOwnProperty shouldn't see \"" + name + "\" through Xrays");
+ is(Object.getOwnPropertyDescriptor(obj, name), undefined, "getOwnPropertyDescriptor shouldn't see \"" + name + "\" through Xrays");
+ ok(Object.keys(obj).indexOf(name) == -1, "Enumerating the Xray should not return \"" + name + "\"");
+ } else {
+ ok(obj.hasOwnProperty(name), "hasOwnProperty should see \"" + name + "\" through Xrays");
+ var pd = Object.getOwnPropertyDescriptor(obj, name);
+ ok(pd, "getOwnPropertyDescriptor should see \"" + name + "\" through Xrays");
+ if (pd && pd.get) {
+ is(pd.get.call(instance), value, "Should get the right value for \"" + name + "\" through Xrays");
+ } else {
+ is(obj[name], value, "Should get the right value for \"" + name + "\" through Xrays");
+ }
+ if (pd && pd.enumerable) {
+ ok(Object.keys(obj).indexOf("" + name) > -1, "Enumerating the Xray should return \"" + name + "\"");
+ }
+ }
+ } while ((obj = Object.getPrototypeOf(obj)));
+}
+
+function checkWindowXrayProperty(obj, name, windowValue, windowPrototypeValue, namedPropertiesValue, eventTargetValue)
+{
+ checkXrayProperty(obj, name, [ windowValue, windowPrototypeValue, namedPropertiesValue, eventTargetValue ]);
+}
+
+function test()
+{
+ // Window
+ var win = document.getElementById("t").contentWindow;
+ var doc = document.getElementById("t").contentDocument;
+
+ var winProto = Object.getPrototypeOf(win);
+ is(winProto, win.Window.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ var namedPropertiesObject = Object.getPrototypeOf(winProto);
+ is(Cu.getClassName(namedPropertiesObject, /* unwrap = */ true), "WindowProperties", "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ var eventTargetProto = Object.getPrototypeOf(namedPropertiesObject);
+ is(eventTargetProto, win.EventTarget.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ // Xrays need to filter expandos.
+ checkWindowXrayProperty(win, "expando", undefined);
+ ok(!("expando" in win), "Xrays should filter expandos");
+
+ checkWindowXrayProperty(win, "shadowedIframe", undefined, undefined, doc.getElementById("shadowedIframe").contentWindow);
+ ok("shadowedIframe" in win, "Named properties should be exposed through Xrays");
+
+ // Named properties live on the named properties object for global objects.
+ checkWindowXrayProperty(win, "iframe", undefined, undefined, doc.getElementById("iframe").contentWindow);
+ ok("iframe" in win, "Named properties should be exposed through Xrays");
+
+ // Window properties live on the instance, shadowing the properties of the named property object.
+ checkWindowXrayProperty(win, "document", doc, undefined, doc.getElementById("document").contentWindow);
+ ok("document" in win, "WebIDL properties should be exposed through Xrays");
+
+ // Unforgeable properties live on the instance, shadowing the properties of the named property object.
+ checkWindowXrayProperty(win, "self", win, undefined, doc.getElementById("self").contentWindow);
+ ok("self" in win, "WebIDL properties should be exposed through Xrays");
+
+ // Object.prototype is at the end of the prototype chain.
+ var obj = win;
+ while ((proto = Object.getPrototypeOf(obj))) {
+ obj = proto;
+ }
+ is(obj, win.Object.prototype, "Object.prototype should be at the end of the prototype chain");
+
+ // Named properties shouldn't shadow WebIDL- or ECMAScript-defined properties.
+ checkWindowXrayProperty(win, "addEventListener", undefined, undefined, undefined, eventTargetProto.addEventListener);
+ is(win.addEventListener, eventTargetProto.addEventListener, "Named properties shouldn't shadow WebIDL-defined properties");
+
+ is(win.toString, win.Object.prototype.toString, "Named properties shouldn't shadow ECMAScript-defined properties");
+
+ // HTMLDocument
+ // Unforgeable properties live on the instance.
+ checkXrayProperty(doc, "location", [ win.location ]);
+ is(String(win.location), document.getElementById("t").src,
+ "Should have the right stringification");
+
+ // HTMLHtmlElement
+ var elem = doc.documentElement;
+
+ var elemProto = Object.getPrototypeOf(elem);
+ is(elemProto, win.HTMLHtmlElement.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ elemProto = Object.getPrototypeOf(elemProto);
+ is(elemProto, win.HTMLElement.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ elemProto = Object.getPrototypeOf(elemProto);
+ is(elemProto, win.Element.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ elemProto = Object.getPrototypeOf(elemProto);
+ is(elemProto, win.Node.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ elemProto = Object.getPrototypeOf(elemProto);
+ is(elemProto, win.EventTarget.prototype, "The proto chain of the Xray should mirror the prototype chain of the Xrayed object");
+
+ // Xrays need to filter expandos.
+ ok(!("expando" in elem), "Xrays should filter expandos");
+
+ // WebIDL-defined properties live on the prototype.
+ checkXrayProperty(elem, "version", [ undefined, "" ]);
+ is(elem.version, "", "WebIDL properties should be exposed through Xrays");
+
+ // HTMLCollection
+ var coll = doc.getElementsByTagName("iframe");
+
+ // Named properties live on the instance for non-global objects.
+ checkXrayProperty(coll, "iframe", [ doc.getElementById("iframe") ]);
+
+ // Indexed properties live on the instance.
+ checkXrayProperty(coll, 0, [ doc.getElementById("shadowedIframe") ]);
+
+ // WebIDL-defined properties live on the prototype, overriding any named properties.
+ checkXrayProperty(coll, "item", [ undefined, win.HTMLCollection.prototype.item ]);
+
+ // ECMAScript-defined properties live on the prototype, overriding any named properties.
+ checkXrayProperty(coll, "toString", [ undefined, undefined, win.Object.prototype.toString ]);
+
+ // Frozen arrays should come from our compartment, not the target one.
+ var languages1 = win.navigator.languages;
+ isnot(languages1, undefined, "Must have .languages");
+ ok(Array.isArray(languages1), ".languages should be an array");
+ ok(Object.isFrozen(languages1), ".languages should be a frozen array");
+ ok(!Cu.isXrayWrapper(languages1), "Should have our own version of array");
+ is(Cu.getGlobalForObject(languages1), window,
+ "languages1 should come from our window");
+ // We want to get .languages in the content compartment, but without waiving
+ // Xrays altogether.
+ var languages2 = win.eval("navigator.languages");
+ isnot(languages2, undefined, "Must still have .languages");
+ ok(Array.isArray(languages2), ".languages should still be an array");
+ ok(Cu.isXrayWrapper(languages2), "Should have xray for content version of array");
+ is(Cu.getGlobalForObject(languages2), win,
+ "languages2 come from the underlying window");
+ ok(Object.isFrozen(languages2.wrappedJSObject),
+ ".languages should still be a frozen array underneath");
+ isnot(languages1, languages2, "Must have distinct arrays");
+ isnot(languages1, languages2.wrappedJSObject,
+ "Must have distinct arrays no matter how we slice it");
+
+ // Check that DataTransfer's .types has the hack to alias contains()
+ // to includes().
+ var dataTransfer = new win.DataTransfer("foo", true);
+ is(dataTransfer.types.contains, dataTransfer.types.includes,
+ "Should have contains() set up as an alias to includes()");
+ // Waive Xrays on the dataTransfer itself, since the .types we get is
+ // different over Xrays vs not.
+ is(dataTransfer.wrappedJSObject.types.contains, undefined,
+ "Underlying object should not have contains() set up as an alias to " +
+ "includes()");
+
+ // Check that deleters work correctly in the [OverrideBuiltins] case.
+ var elem = win.document.documentElement;
+ var dataset = elem.dataset;
+ is(dataset.foo, undefined, "Should not have a 'foo' property");
+ ok(!('foo' in dataset), "Really should not have a 'foo' property");
+ is(elem.getAttribute("data-foo"), null,
+ "Should not have a 'data-foo' attribute");
+ ok(!elem.hasAttribute("data-foo"),
+ "Really should not have a 'data-foo' attribute");
+ dataset.foo = "bar";
+ is(dataset.foo, "bar", "Should now have a 'foo' property");
+ ok('foo' in dataset, "Really should have a 'foo' property");
+ is(elem.getAttribute("data-foo"), "bar",
+ "Should have a 'data-foo' attribute");
+ ok(elem.hasAttribute("data-foo"),
+ "Really should have a 'data-foo' attribute");
+ delete dataset.foo;
+ is(dataset.foo, undefined, "Should not have a 'foo' property again");
+ ok(!('foo' in dataset), "Really should not have a 'foo' property again");
+ is(elem.getAttribute("data-foo"), null,
+ "Should not have a 'data-foo' attribute again");
+ ok(!elem.hasAttribute("data-foo"),
+ "Really should not have a 'data-foo' attribute again");
+
+ // Check that deleters work correctly in the non-[OverrideBuiltins] case.
+ var storage = win.sessionStorage;
+ is(storage.foo, undefined, "Should not have a 'foo' property");
+ ok(!('foo' in storage), "Really should not have a 'foo' property");
+ is(storage.getItem("foo"), null, "Should not have an item named 'foo'");
+ storage.foo = "bar";
+ is(storage.foo, "bar", "Should have a 'foo' property");
+ ok('foo' in storage, "Really should have a 'foo' property");
+ is(storage.getItem("foo"), "bar", "Should have an item named 'foo'");
+ delete storage.foo
+ is(storage.foo, undefined, "Should not have a 'foo' property again");
+ ok(!('foo' in storage), "Really should not have a 'foo' property again");
+ is(storage.getItem("foo"), null, "Should not have an item named 'foo' again");
+
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_enums.html b/dom/bindings/test/test_enums.html
new file mode 100644
index 000000000..e5dc519a0
--- /dev/null
+++ b/dom/bindings/test/test_enums.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Enums</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+test(function() {
+ var xhr = new XMLHttpRequest();
+ xhr.open("get", "foo")
+ assert_equals(xhr.responseType, "");
+ xhr.responseType = "foo";
+ assert_equals(xhr.responseType, "");
+}, "Assigning an invalid value to an enum attribute should not throw.");
+</script>
diff --git a/dom/bindings/test/test_exceptionSanitization.html b/dom/bindings/test/test_exceptionSanitization.html
new file mode 100644
index 000000000..9a6ab6088
--- /dev/null
+++ b/dom/bindings/test/test_exceptionSanitization.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1295322
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1295322</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1295322">Mozilla Bug 1295322</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+ <script type="application/javascript">
+
+ /** Test for Bug 1295322 **/
+ iframe = document.createElement('iframe');
+ iframe.name = "eWin";
+ document.body.appendChild(iframe);
+
+ try{
+ // NOTE: The idea here is to call something that will end up throwing an
+ // exception in a JS component and then propagate back to C++ code before
+ // returning to us. If opening a feed: URI stops doing that, we will need a
+ // new guinea pig here.
+ open('feed://java:script:codeshouldgohere','eWin');
+ ok(false, "Should have thrown!");
+ } catch(e){
+ try {
+ is(e.name, "NS_ERROR_UNEXPECTED", "Should have the right exception");
+ is(e.filename, location.href,
+ "Should not be seeing where the exception really came from");
+ } catch (e2) {
+ ok(false, "Should be able to work with the exception");
+ }
+ }
+ </script>
+</body>
+</html>
diff --git a/dom/bindings/test/test_exceptionThrowing.html b/dom/bindings/test/test_exceptionThrowing.html
new file mode 100644
index 000000000..376c2bc57
--- /dev/null
+++ b/dom/bindings/test/test_exceptionThrowing.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=847119
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 847119</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 847119 **/
+
+ var xhr = new XMLHttpRequest();
+ var domthrows = function() { xhr.open(); }
+
+ var count = 20000;
+
+ function f() {
+ var k = 0;
+ for (var j = 0; j < count; ++j) {
+ try { domthrows(); } catch(e) { ++k; }
+ }
+ return k;
+ }
+ function g() { return count; }
+
+ is(f(), count, "Should get count exceptions");
+ for (var h of [f, g]) {
+ try { is(h(), count, "Should get count exceptions here too"); } catch (e) {}
+ }
+ ok(true, "We should get here");
+
+ var domthrows = function() { xhr.withCredentials = false; }
+ xhr.open("GET", "");
+ xhr.send();
+
+ is(f(), count, "Should get count exceptions from getter");
+ for (var h of [f, g]) {
+ try { is(h(), count, "Should get count exceptions from getter here too"); } catch (e) {}
+ }
+ ok(true, "We should get here too");
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=847119">Mozilla Bug 847119</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_exception_messages.html b/dom/bindings/test/test_exception_messages.html
new file mode 100644
index 000000000..a0f0cabe6
--- /dev/null
+++ b/dom/bindings/test/test_exception_messages.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=882653
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 882653</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 882653 **/
+ // Each test is a string to eval, the expected exception message, and the
+ // test description.
+ var tests = [
+ [ 'document.documentElement.appendChild.call({}, new Image())',
+ "'appendChild' called on an object that does not implement interface Node.",
+ "bogus method this object" ],
+ [ 'Object.getOwnPropertyDescriptor(Document.prototype, "documentElement").get.call({})',
+ "'get documentElement' called on an object that does not implement interface Document.",
+ "bogus getter this object" ],
+ [ 'Object.getOwnPropertyDescriptor(Element.prototype, "innerHTML").set.call({})',
+ "'set innerHTML' called on an object that does not implement interface Element.",
+ "bogus setter this object" ],
+ [ 'document.documentElement.appendChild(5)',
+ "Argument 1 of Node.appendChild is not an object.",
+ "bogus interface argument" ],
+ [ 'document.documentElement.appendChild(null)',
+ "Argument 1 of Node.appendChild is not an object.",
+ "null interface argument" ],
+ [ 'document.createTreeWalker(document).currentNode = 5',
+ "Value being assigned to TreeWalker.currentNode is not an object.",
+ "interface setter call" ],
+ [ 'document.documentElement.appendChild({})',
+ "Argument 1 of Node.appendChild does not implement interface Node.",
+ "wrong interface argument" ],
+ [ 'document.createTreeWalker(document).currentNode = {}',
+ "Value being assigned to TreeWalker.currentNode does not implement interface Node.",
+ "wrong interface setter call" ],
+ [ 'document.createElement("canvas").getContext("2d").fill("bogus")',
+ "Argument 1 of CanvasRenderingContext2D.fill 'bogus' is not a valid value for enumeration CanvasWindingRule.",
+ "bogus enum value" ],
+ [ 'document.createTreeWalker(document, 0xFFFFFFFF, { acceptNode: 5 }).nextNode()',
+ "Property 'acceptNode' is not callable.",
+ "non-callable callback interface operation property" ],
+ [ '(new TextDecoder).decode(new Uint8Array(), new RegExp())',
+ "Argument 2 of TextDecoder.decode can't be converted to a dictionary.",
+ "regexp passed for a dictionary" ],
+ [ 'URL.createObjectURL(null, null)',
+ "Argument 1 is not valid for any of the 2-argument overloads of URL.createObjectURL.",
+ "overload resolution failure" ],
+ [ 'document.createElement("select").add({})',
+ "Argument 1 of HTMLSelectElement.add could not be converted to any of: HTMLOptionElement, HTMLOptGroupElement.",
+ "invalid value passed for union" ],
+ [ 'document.createElement("canvas").getContext("2d").createLinearGradient(0, 1, 0, 1).addColorStop(NaN, "")',
+ "Argument 1 of CanvasGradient.addColorStop is not a finite floating-point value.",
+ "invalid float" ]
+ ];
+
+ for (var i = 0; i < tests.length; ++i) {
+ msg = "Correct exception should be thrown for " + tests[i][2];
+ try {
+ eval(tests[i][0]);
+ ok(false, msg);
+ } catch (e) {
+ is(e.message, tests[i][1], msg);
+ }
+ }
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=882653">Mozilla Bug 882653</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_exception_options_from_jsimplemented.html b/dom/bindings/test/test_exception_options_from_jsimplemented.html
new file mode 100644
index 000000000..8a98a8fb6
--- /dev/null
+++ b/dom/bindings/test/test_exception_options_from_jsimplemented.html
@@ -0,0 +1,166 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1107592
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1107592</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1107592 **/
+
+ SimpleTest.waitForExplicitFinish();
+
+ function doTest() {
+ var file = location.href;
+ var asyncFrame;
+ /* Async parent frames from pushPrefEnv don't show up in e10s. */
+ var isE10S = !SpecialPowers.isMainProcess();
+ if (!isE10S && SpecialPowers.getBoolPref("javascript.options.asyncstack")) {
+ asyncFrame = `Async*@${file}:153:3
+`;
+ } else {
+ asyncFrame = "";
+ }
+
+ var t = new TestInterfaceJS();
+ try {
+ t.testThrowError();
+ } catch (e) {
+ ok(e instanceof Error, "Should have an Error here");
+ ok(!(e instanceof DOMException), "Should not have DOMException here");
+ ok(!("code" in e), "Should not have a 'code' property");
+ is(e.name, "Error", "Should not have an interesting name here");
+ is(e.message, "We are an Error", "Should have the right message");
+ is(e.stack,
+ `doTest@${file}:31:7
+${asyncFrame}`,
+ "Exception stack should still only show our code");
+ is(e.fileName,
+ file,
+ "Should have the right file name");
+ is(e.lineNumber, 31, "Should have the right line number");
+ is(e.columnNumber, 7, "Should have the right column number");
+ }
+
+ try {
+ t.testThrowDOMException();
+ } catch (e) {
+ ok(e instanceof Error, "Should also have an Error here");
+ ok(e instanceof DOMException, "Should have DOMException here");
+ is(e.name, "NotSupportedError", "Should have the right name here");
+ is(e.message, "We are a DOMException",
+ "Should also have the right message");
+ is(e.code, DOMException.NOT_SUPPORTED_ERR,
+ "Should have the right 'code'");
+ is(e.stack,
+ `doTest@${file}:50:7
+${asyncFrame}`,
+ "Exception stack should still only show our code");
+ is(e.filename,
+ file,
+ "Should still have the right file name");
+ is(e.lineNumber, 50, "Should still have the right line number");
+ todo_isnot(e.columnNumber, 0,
+ "No column number support for DOMException yet");
+ }
+
+ try {
+ t.testThrowTypeError();
+ } catch (e) {
+ ok(e instanceof TypeError, "Should have a TypeError here");
+ ok(!(e instanceof DOMException), "Should not have DOMException here (2)");
+ ok(!("code" in e), "Should not have a 'code' property (2)");
+ is(e.name, "TypeError", "Should be named TypeError");
+ is(e.message, "We are a TypeError",
+ "Should also have the right message (2)");
+ is(e.stack,
+ `doTest@${file}:72:7
+${asyncFrame}`,
+ "Exception stack for TypeError should only show our code");
+ is(e.fileName,
+ file,
+ "Should still have the right file name for TypeError");
+ is(e.lineNumber, 72, "Should still have the right line number for TypeError");
+ is(e.columnNumber, 7, "Should have the right column number for TypeError");
+ }
+
+ try {
+ t.testThrowCallbackError(function() { Array.indexOf() });
+ } catch (e) {
+ ok(e instanceof TypeError, "Should have a TypeError here (3)");
+ ok(!(e instanceof DOMException), "Should not have DOMException here (3)");
+ ok(!("code" in e), "Should not have a 'code' property (3)");
+ is(e.name, "TypeError", "Should be named TypeError (3)");
+ is(e.message, "missing argument 0 when calling function Array.indexOf",
+ "Should also have the right message (3)");
+ is(e.stack,
+ `doTest/<@${file}:92:45
+doTest@${file}:92:7
+${asyncFrame}`,
+ "Exception stack for TypeError should only show our code (3)");
+ is(e.fileName,
+ file,
+ "Should still have the right file name for TypeError (3)");
+ is(e.lineNumber, 92, "Should still have the right line number for TypeError (3)");
+ is(e.columnNumber, 45, "Should have the right column number for TypeError (3)");
+ }
+
+ try {
+ t.testThrowXraySelfHosted();
+ } catch (e) {
+ ok(!(e instanceof Error), "Should have an Exception here (4)");
+ ok(!(e instanceof DOMException), "Should not have DOMException here (4)");
+ ok(!("code" in e), "Should not have a 'code' property (4)");
+ is(e.name, "NS_ERROR_UNEXPECTED", "Name should be sanitized (4)");
+ is(e.message, "", "Message should be sanitized (5)");
+ is(e.stack,
+ `doTest@${file}:113:7
+${asyncFrame}`,
+ "Exception stack for sanitized exception should only show our code (4)");
+ is(e.filename,
+ file,
+ "Should still have the right file name for sanitized exception (4)");
+ is(e.lineNumber, 113, "Should still have the right line number for sanitized exception (4)");
+ todo_isnot(e.columnNumber, 0, "Should have the right column number for sanitized exception (4)");
+ }
+
+ try {
+ t.testThrowSelfHosted();
+ } catch (e) {
+ ok(!(e instanceof Error), "Should have an Exception here (5)");
+ ok(!(e instanceof DOMException), "Should not have DOMException here (5)");
+ ok(!("code" in e), "Should not have a 'code' property (5)");
+ is(e.name, "NS_ERROR_UNEXPECTED", "Name should be sanitized (5)");
+ is(e.message, "", "Message should be sanitized (5)");
+ is(e.stack,
+ `doTest@${file}:132:7
+${asyncFrame}`,
+ "Exception stack for sanitized exception should only show our code (5)");
+ is(e.filename,
+ file,
+ "Should still have the right file name for sanitized exception (5)");
+ is(e.lineNumber, 132, "Should still have the right line number for sanitized exception (5)");
+ todo_isnot(e.columnNumber, 0, "Should have the right column number for sanitized exception (5)");
+ }
+
+ SimpleTest.finish();
+ }
+
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]},
+ doTest);
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1107592">Mozilla Bug 1107592</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_exceptions_from_jsimplemented.html b/dom/bindings/test/test_exceptions_from_jsimplemented.html
new file mode 100644
index 000000000..d0f599353
--- /dev/null
+++ b/dom/bindings/test/test_exceptions_from_jsimplemented.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=923010
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 923010</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+ /** Test for Bug 923010 **/
+ try {
+ var conn = new RTCPeerConnection();
+
+ var candidate = new RTCIceCandidate({candidate: null });
+ conn.addIceCandidate(candidate)
+ .then(function() {
+ ok(false, "addIceCandidate succeeded when it should have failed");
+ }, function(reason) {
+ is(reason.lineNumber, 17, "Rejection should have been on line 17");
+ is(reason.message,
+ "Invalid candidate passed to addIceCandidate!",
+ "Should have the rejection we expect");
+ })
+ .catch(function(reason) {
+ ok(false, "unexpected error: " + reason);
+ });
+ } catch (e) {
+ // b2g has no WebRTC, apparently
+ todo(false, "No WebRTC on b2g yet");
+ }
+
+ conn.close();
+ try {
+ conn.setIdentityProvider("example.com", "foo");
+ ok(false, "That call to setIdentityProvider should have thrown");
+ } catch (e) {
+ is(e.lineNumber, 36, "Exception should have been on line 36");
+ is(e.message,
+ "Peer connection is closed",
+ "Should have the exception we expect");
+ }
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=923010">Mozilla Bug 923010</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_forOf.html b/dom/bindings/test/test_forOf.html
new file mode 100644
index 000000000..53969a23e
--- /dev/null
+++ b/dom/bindings/test/test_forOf.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=725907
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 725907</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=725907">Mozilla Bug 725907</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<div id="basket">
+ <span id="egg0"></span>
+ <span id="egg1"><span id="duckling1"></span></span>
+ <span id="egg2"></span>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 725907 **/
+
+function runTestsForDocument(document, msgSuffix) {
+ function is(a, b, msg) { SimpleTest.is(a, b, msg + msgSuffix); }
+ function isnot(a, b, msg) { SimpleTest.isnot(a, b, msg + msgSuffix); }
+
+ var basket = document.getElementById("basket");
+ var egg3 = document.createElement("span");
+ egg3.id = "egg3";
+
+ var log = '';
+ for (var x of basket.childNodes) {
+ if (x.nodeType != x.TEXT_NODE)
+ log += x.id + ";";
+ }
+ is(log, "egg0;egg1;egg2;", "'for (x of div.childNodes)' should iterate over child nodes");
+
+ log = '';
+ for (var x of basket.childNodes) {
+ if (x.nodeType != x.TEXT_NODE) {
+ log += x.id + ";";
+ if (x.id == "egg1")
+ basket.appendChild(egg3);
+ }
+ }
+ is(log, "egg0;egg1;egg2;egg3;", "'for (x of div.childNodes)' should see elements added during iteration");
+
+ log = '';
+ basket.appendChild(document.createTextNode("some text"));
+ for (var x of basket.children)
+ log += x.id + ";";
+ is(log, "egg0;egg1;egg2;egg3;", "'for (x of div.children)' should iterate over child elements");
+
+ var count = 0;
+ for (var x of document.getElementsByClassName("hazardous-materials"))
+ count++;
+ is(count, 0, "'for (x of emptyNodeList)' loop should run zero times");
+
+ var log = '';
+ for (var x of document.querySelectorAll("span"))
+ log += x.id + ";";
+ is(log, "egg0;egg1;duckling1;egg2;egg3;", "for-of loop should work with a querySelectorAll() NodeList");
+}
+
+/* All the tests run twice. First, in this document, so without any wrappers. */
+runTestsForDocument(document, "");
+
+/* And once using the document of an iframe, so working with cross-compartment wrappers. */
+SimpleTest.waitForExplicitFinish();
+function iframeLoaded(iframe) {
+ runTestsForDocument(iframe.contentWindow.document, " (in iframe)");
+ SimpleTest.finish();
+}
+
+</script>
+
+<iframe src="forOf_iframe.html" onload="iframeLoaded(this)"></iframe>
+
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_integers.html b/dom/bindings/test/test_integers.html
new file mode 100644
index 000000000..c74b68216
--- /dev/null
+++ b/dom/bindings/test/test_integers.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+ <canvas id="c" width="1" height="1"></canvas>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+ function testInt64NonFinite(arg) {
+ // We can use a WebGLRenderingContext to test conversion to 64-bit signed
+ // ints edge cases.
+ var gl = $("c").getContext("experimental-webgl");
+ if (!gl) {
+ // No WebGL support on MacOS 10.5. Just skip this test
+ todo(false, "WebGL not supported");
+ return;
+ }
+ var error = gl.getError()
+
+ // on the b2g emulator we get GL_INVALID_FRAMEBUFFER_OPERATION
+ if (error == 0x0506) // GL_INVALID_FRAMEBUFFER_OPERATION
+ return;
+
+ is(error, 0, "Should not start in an error state");
+
+ var b = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, b);
+
+ var a = new Float32Array(1);
+ gl.bufferData(gl.ARRAY_BUFFER, a, gl.STATIC_DRAW);
+
+ gl.bufferSubData(gl.ARRAY_BUFFER, arg, a);
+
+ is(gl.getError(), 0, "Should have treated non-finite double as 0");
+ }
+
+ testInt64NonFinite(NaN);
+ testInt64NonFinite(Infinity);
+ testInt64NonFinite(-Infinity);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_interfaceName.html b/dom/bindings/test/test_interfaceName.html
new file mode 100644
index 000000000..59828a2cf
--- /dev/null
+++ b/dom/bindings/test/test_interfaceName.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1084001
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1084001</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1084001 **/
+ is(Image.name, "Image", "Image name");
+ is(Promise.name, "Promise", "Promise name");
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1084001">Mozilla Bug 1084001</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_interfaceToString.html b/dom/bindings/test/test_interfaceToString.html
new file mode 100644
index 000000000..c97b2f63b
--- /dev/null
+++ b/dom/bindings/test/test_interfaceToString.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=742156
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 742156</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=742156">Mozilla Bug 742156</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 742156 **/
+
+var nativeToString = ("" + String.replace).replace("replace", "EventTarget");
+try {
+ var eventTargetToString = "" + EventTarget;
+ is(eventTargetToString, nativeToString,
+ "Stringifying a DOM interface object should return the same string" +
+ "as stringifying a native function.");
+}
+catch (e) {
+ ok(false, "Stringifying a DOM interface object shouldn't throw.");
+}
+
+try {
+ eventTargetToString = Function.prototype.toString.call(EventTarget);
+ is(eventTargetToString, nativeToString,
+ "Stringifying a DOM interface object via Function.prototype.toString " +
+ "should return the same string as stringifying a native function.");
+}
+catch (e) {
+ ok(false, "Stringifying a DOM interface object shouldn't throw.");
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_iterable.html b/dom/bindings/test/test_iterable.html
new file mode 100644
index 000000000..8ce818e76
--- /dev/null
+++ b/dom/bindings/test/test_iterable.html
@@ -0,0 +1,241 @@
+<!-- Any copyright is dedicated to the Public Domain.
+- http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test Iterable Interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <script class="testbody" type="application/javascript">
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, function() {
+
+ base_properties = [["entries", "function", 0],
+ ["keys", "function", 0],
+ ["values", "function", 0],
+ ["forEach", "function", 1]]
+ var testExistence = function testExistence(prefix, obj, properties) {
+ for (var [name, type, args] of properties) {
+ // Properties are somewhere up the proto chain, hasOwnProperty won't work
+ isnot(obj[name], undefined,
+ `${prefix} object has property ${name}`);
+
+ is(typeof obj[name], type,
+ `${prefix} object property ${name} is a ${type}`);
+ // Check function length
+ if (type == "function") {
+ is(obj[name].length, args,
+ `${prefix} object property ${name} is length ${args}`);
+ is(obj[name].name, name,
+ `${prefix} object method name is ${name}`);
+ }
+
+ // Find where property is on proto chain, check for enumerablility there.
+ var owner = obj;
+ while (owner) {
+ var propDesc = Object.getOwnPropertyDescriptor(owner, name);
+ if (propDesc) {
+ ok(propDesc.enumerable,
+ `${prefix} object property ${name} is enumerable`);
+ break;
+ }
+ owner = Object.getPrototypeOf(owner);
+ }
+ }
+ }
+
+ var itr;
+ // Simple single type iterable creation and functionality test
+ info("IterableSingle: Testing simple iterable creation and functionality");
+ itr = new TestInterfaceIterableSingle();
+ testExistence("IterableSingle: ", itr, base_properties);
+ is(itr[Symbol.iterator], Array.prototype[Symbol.iterator],
+ "IterableSingle: Should be using %ArrayIterator% for @@iterator");
+ is(itr.keys, Array.prototype.keys,
+ "IterableSingle: Should be using %ArrayIterator% for 'keys'");
+ is(itr.entries, Array.prototype.entries,
+ "IterableSingle: Should be using %ArrayIterator% for 'entries'");
+ is(itr.values, itr[Symbol.iterator],
+ "IterableSingle: Should be using @@iterator for 'values'");
+ is(itr.forEach, Array.prototype.forEach,
+ "IterableSingle: Should be using %ArrayIterator% for 'forEach'");
+ var keys = [...itr.keys()];
+ var values = [...itr.values()];
+ var entries = [...itr.entries()];
+ var key_itr = itr.keys();
+ var value_itr = itr.values();
+ var entries_itr = itr.entries();
+ for (var i = 0; i < 3; ++i) {
+ var key = key_itr.next();
+ var value = value_itr.next();
+ var entry = entries_itr.next();
+ is(key.value, i, "IterableSingle: Key iterator value should be " + i);
+ is(key.value, keys[i],
+ "IterableSingle: Key iterator value should match destructuring " + i);
+ is(value.value, key.value, "IterableSingle: Value iterator value should be " + key.value);
+ is(value.value, values[i],
+ "IterableSingle: Value iterator value should match destructuring " + i);
+ is(entry.value[0], i, "IterableSingle: Entry iterator value 0 should be " + i);
+ is(entry.value[1], i, "IterableSingle: Entry iterator value 1 should be " + i);
+ is(entry.value[0], entries[i][0],
+ "IterableSingle: Entry iterator value 0 should match destructuring " + i);
+ is(entry.value[1], entries[i][1],
+ "IterableSingle: Entry iterator value 1 should match destructuring " + i);
+ }
+
+ var callsToForEachCallback = 0;
+ var thisArg = {};
+ itr.forEach(function(value, index, obj) {
+ is(index, callsToForEachCallback,
+ `IterableSingle: Should have the right index at ${callsToForEachCallback} calls to forEach callback`);
+ is(value, values[index],
+ `IterableSingle: Should have the right value at ${callsToForEachCallback} calls to forEach callback`);
+ is(this, thisArg,
+ "IterableSingle: Should have the right this value for forEach callback");
+ is(obj, itr,
+ "IterableSingle: Should have the right third arg for forEach callback");
+ ++callsToForEachCallback;
+ }, thisArg);
+ is(callsToForEachCallback, 3,
+ "IterableSingle: Should have right total number of calls to forEach callback");
+
+ var key = key_itr.next();
+ var value = value_itr.next();
+ var entry = entries_itr.next();
+ is(key.value, undefined, "IterableSingle: Key iterator value should be undefined");
+ is(key.done, true, "IterableSingle: Key iterator done should be true");
+ is(value.value, undefined, "IterableSingle: Value iterator value should be undefined");
+ is(value.done, true, "IterableSingle: Value iterator done should be true");
+ is(entry.value, undefined, "IterableDouble: Entry iterator value should be undefined");
+ is(entry.done, true, "IterableSingle: Entry iterator done should be true");
+ is(Object.prototype.toString.call(Object.getPrototypeOf(key_itr)),
+ "[object Array Iterator]",
+ "iterator prototype should have the right brand");
+
+ // Simple dual type iterable creation and functionality test
+ info("IterableDouble: Testing simple iterable creation and functionality");
+ itr = new TestInterfaceIterableDouble();
+ testExistence("IterableDouble: ", itr, base_properties);
+ is(itr.entries, itr[Symbol.iterator],
+ "IterableDouble: Should be using @@iterator for 'entries'");
+ var elements = [["a", "b"], ["c", "d"], ["e", "f"]]
+ var keys = [...itr.keys()];
+ var values = [...itr.values()];
+ var entries = [...itr.entries()];
+ var key_itr = itr.keys();
+ var value_itr = itr.values();
+ var entries_itr = itr.entries();
+ for (var i = 0; i < 3; ++i) {
+ var key = key_itr.next();
+ var value = value_itr.next();
+ var entry = entries_itr.next();
+ is(key.value, elements[i][0], "IterableDouble: Key iterator value should be " + elements[i][0]);
+ is(key.value, keys[i],
+ "IterableDouble: Key iterator value should match destructuring " + i);
+ is(value.value, elements[i][1], "IterableDouble: Value iterator value should be " + elements[i][1]);
+ is(value.value, values[i],
+ "IterableDouble: Value iterator value should match destructuring " + i);
+ is(entry.value[0], elements[i][0], "IterableDouble: Entry iterator value 0 should be " + elements[i][0]);
+ is(entry.value[1], elements[i][1], "IterableDouble: Entry iterator value 1 should be " + elements[i][1]);
+ is(entry.value[0], entries[i][0],
+ "IterableDouble: Entry iterator value 0 should match destructuring " + i);
+ is(entry.value[1], entries[i][1],
+ "IterableDouble: Entry iterator value 1 should match destructuring " + i);
+ }
+
+ callsToForEachCallback = 0;
+ thisArg = {};
+ itr.forEach(function(value, key, obj) {
+ is(key, keys[callsToForEachCallback],
+ `IterableDouble: Should have the right key at ${callsToForEachCallback} calls to forEach callback`);
+ is(value, values[callsToForEachCallback],
+ `IterableDouble: Should have the right value at ${callsToForEachCallback} calls to forEach callback`);
+ is(this, thisArg,
+ "IterableDouble: Should have the right this value for forEach callback");
+ is(obj, itr,
+ "IterableSingle: Should have the right third arg for forEach callback");
+ ++callsToForEachCallback;
+ }, thisArg);
+ is(callsToForEachCallback, 3,
+ "IterableDouble: Should have right total number of calls to forEach callback");
+
+ var key = key_itr.next();
+ var value = value_itr.next();
+ var entry = entries_itr.next()
+ is(key.value, undefined, "IterableDouble: Key iterator value should be undefined");
+ is(key.done, true, "IterableDouble: Key iterator done should be true");
+ is(value.value, undefined, "IterableDouble: Value iterator value should be undefined");
+ is(value.done, true, "IterableDouble: Value iterator done should be true");
+ is(entry.value, undefined, "IterableDouble: Entry iterator value should be undefined");
+ is(entry.done, true, "IterableDouble: Entry iterator done should be true");
+ is(Object.prototype.toString.call(Object.getPrototypeOf(key_itr)),
+ "[object TestInterfaceIterableDoubleIteratorPrototype]",
+ "iterator prototype should have the right brand");
+
+ // Simple dual type iterable creation and functionality test
+ info("IterableDoubleUnion: Testing simple iterable creation and functionality");
+ itr = new TestInterfaceIterableDoubleUnion();
+ testExistence("IterableDoubleUnion: ", itr, base_properties);
+ is(itr.entries, itr[Symbol.iterator],
+ "IterableDoubleUnion: Should be using @@iterator for 'entries'");
+ var elements = [["long", 1], ["string", "a"]]
+ var keys = [...itr.keys()];
+ var values = [...itr.values()];
+ var entries = [...itr.entries()];
+ var key_itr = itr.keys();
+ var value_itr = itr.values();
+ var entries_itr = itr.entries();
+ for (var i = 0; i < elements.length; ++i) {
+ var key = key_itr.next();
+ var value = value_itr.next();
+ var entry = entries_itr.next();
+ is(key.value, elements[i][0], "IterableDoubleUnion: Key iterator value should be " + elements[i][0]);
+ is(key.value, keys[i],
+ "IterableDoubleUnion: Key iterator value should match destructuring " + i);
+ is(value.value, elements[i][1], "IterableDoubleUnion: Value iterator value should be " + elements[i][1]);
+ is(value.value, values[i],
+ "IterableDoubleUnion: Value iterator value should match destructuring " + i);
+ is(entry.value[0], elements[i][0], "IterableDoubleUnion: Entry iterator value 0 should be " + elements[i][0]);
+ is(entry.value[1], elements[i][1], "IterableDoubleUnion: Entry iterator value 1 should be " + elements[i][1]);
+ is(entry.value[0], entries[i][0],
+ "IterableDoubleUnion: Entry iterator value 0 should match destructuring " + i);
+ is(entry.value[1], entries[i][1],
+ "IterableDoubleUnion: Entry iterator value 1 should match destructuring " + i);
+ }
+
+ callsToForEachCallback = 0;
+ thisArg = {};
+ itr.forEach(function(value, key, obj) {
+ is(key, keys[callsToForEachCallback],
+ `IterableDoubleUnion: Should have the right key at ${callsToForEachCallback} calls to forEach callback`);
+ is(value, values[callsToForEachCallback],
+ `IterableDoubleUnion: Should have the right value at ${callsToForEachCallback} calls to forEach callback`);
+ is(this, thisArg,
+ "IterableDoubleUnion: Should have the right this value for forEach callback");
+ is(obj, itr,
+ "IterableSingle: Should have the right third arg for forEach callback");
+ ++callsToForEachCallback;
+ }, thisArg);
+ is(callsToForEachCallback, 2,
+ "IterableDoubleUnion: Should have right total number of calls to forEach callback");
+
+ var key = key_itr.next();
+ var value = value_itr.next();
+ var entry = entries_itr.next()
+ is(key.value, undefined, "IterableDoubleUnion: Key iterator value should be undefined");
+ is(key.done, true, "IterableDoubleUnion: Key iterator done should be true");
+ is(value.value, undefined, "IterableDoubleUnion: Value iterator value should be undefined");
+ is(value.done, true, "IterableDoubleUnion: Value iterator done should be true");
+ is(entry.value, undefined, "IterableDoubleUnion: Entry iterator value should be undefined");
+ is(entry.done, true, "IterableDoubleUnion: Entry iterator done should be true");
+ is(Object.prototype.toString.call(Object.getPrototypeOf(key_itr)),
+ "[object TestInterfaceIterableDoubleUnionIteratorPrototype]",
+ "iterator prototype should have the right brand");
+
+ SimpleTest.finish();
+ });
+ </script>
+ </body>
+</html>
diff --git a/dom/bindings/test/test_jsimplemented_eventhandler.html b/dom/bindings/test/test_jsimplemented_eventhandler.html
new file mode 100644
index 000000000..2854a3112
--- /dev/null
+++ b/dom/bindings/test/test_jsimplemented_eventhandler.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1186696
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1186696</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1186696 **/
+ SimpleTest.waitForExplicitFinish();
+
+ function doTest() {
+ var values = [ function() {}, 5, null, undefined, "some string", {} ];
+
+ while (values.length != 0) {
+ var value = values.pop();
+ var t = new TestInterfaceJS();
+ t.onsomething = value;
+ var gottenValue = t.onsomething;
+ if (typeof value == "object" || typeof value == "function") {
+ is(gottenValue, value, "Should get back the object-or-null we put in");
+ } else {
+ is(gottenValue, null, "Should get back null");
+ }
+ }
+
+ SimpleTest.finish();
+ }
+
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]},
+ doTest);
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1186696">Mozilla Bug 1186696</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_kill_longrunning_prerendered_content.xul b/dom/bindings/test/test_kill_longrunning_prerendered_content.xul
new file mode 100644
index 000000000..d86b15ad9
--- /dev/null
+++ b/dom/bindings/test/test_kill_longrunning_prerendered_content.xul
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ onload="runTest();">
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+
+<script class="testbody" type="application/javascript">
+<![CDATA[
+
+ SimpleTest.waitForExplicitFinish();
+
+ function Listener(aBrowser, aPrerendered, aCallback) {
+ this.init(aBrowser, aPrerendered, aCallback);
+ }
+
+ Listener.prototype = {
+ init: function(aBrowser, aCallback) {
+ this.mBrowser = aBrowser;
+ this.mCallback = aCallback;
+ },
+ QueryInterface: function(aIID) {
+ if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
+ aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
+ aIID.equals(Components.interfaces.nsISupports))
+ return this;
+ throw Components.results.NS_NOINTERFACE;
+ },
+ onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus) {
+ if ((aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) &&
+ (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_IS_DOCUMENT)) {
+ setTimeout(this.mCallback, 0);
+ }
+ },
+ onProgressChange : function(aWebProgress, aRequest,
+ aCurSelfProgress, aMaxSelfProgress,
+ aCurTotalProgress, aMaxTotalProgress) {},
+ onLocationChange : function(aWebProgress, aRequest, aLocation, aFlags) {},
+ onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage) {},
+ onSecurityChange : function(aWebProgress, aRequest, aState) {},
+ mBrowser: null,
+ mPrerendered: false,
+ mCallback: null
+ };
+
+ var progress, progressListener;
+
+ function runTest() {
+ SpecialPowers.pushPrefEnv({
+ "set": [
+ ["dom.max_script_run_time", 1]
+ ]
+ }, function() {
+ test(function() {
+ ok("The page is successfully interrupted.");
+ SimpleTest.finish();
+ });
+ });
+ }
+
+ function test(aCallback) {
+ var browser = document.getElementById("prerendered");;
+ progressListener = new Listener(browser, aCallback);
+ var docShell = browser.docShell;
+ progress = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebProgress);
+ progress.addProgressListener(progressListener,
+ Components.interfaces.nsIWebProgress.NOTIFY_ALL);
+ browser.loadURI("data:text/html,<script>;for(;;);</script" + ">");
+ }
+
+]]>
+</script>
+
+<body id="html_body" xmlns="http://www.w3.org/1999/xhtml">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1050456">Mozilla Bug 1050456</a>
+<p id="display"></p>
+
+<pre id="test">
+</pre>
+</body>
+<browser prerendered="true" id="prerendered"/>
+</window>
diff --git a/dom/bindings/test/test_lenientThis.html b/dom/bindings/test/test_lenientThis.html
new file mode 100644
index 000000000..cfbdcebcd
--- /dev/null
+++ b/dom/bindings/test/test_lenientThis.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>[LenientThis]</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+function noop1() { }
+function noop2() { }
+
+test(function() {
+ var desc = Object.getOwnPropertyDescriptor(Document.prototype, "onreadystatechange");
+
+ document.onreadystatechange = noop1;
+ assert_equals(document.onreadystatechange, noop1, "document.onreadystatechange == noop1");
+ assert_equals(desc.get.call({ }), undefined, "document.onreadystatechange getter.call({}) == undefined");
+}, "invoking Document.onreadystatechange's getter with an invalid this object returns undefined");
+
+test(function() {
+ var desc = Object.getOwnPropertyDescriptor(Document.prototype, "onreadystatechange");
+
+ document.onreadystatechange = noop1;
+ assert_equals(document.onreadystatechange, noop1, "document.onreadystatechange == noop1");
+ assert_equals(desc.set.call({ }, noop2), undefined, "document.onreadystatechange setter.call({}) == undefined");
+ assert_equals(document.onreadystatechange, noop1, "document.onreadystatechange == noop1 (still)");
+}, "invoking Document.onreadystatechange's setter with an invalid this object does nothing and returns undefined");
+</script>
diff --git a/dom/bindings/test/test_lookupGetter.html b/dom/bindings/test/test_lookupGetter.html
new file mode 100644
index 000000000..306ee4f64
--- /dev/null
+++ b/dom/bindings/test/test_lookupGetter.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=462428
+-->
+<head>
+ <title>Test for Bug 462428</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=462428">Mozilla Bug 462428</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 462428 **/
+var x = new XMLHttpRequest;
+x.open("GET", "");
+var getter = x.__lookupGetter__('readyState');
+ok(getter !== undefined, "But able to look it up the normal way");
+ok(!x.hasOwnProperty('readyState'), "property should still be on the prototype");
+
+var sawProp = false;
+for (var i in x) {
+ if (i === "readyState") {
+ sawProp = true;
+ }
+}
+
+ok(sawProp, "property should be enumerable");
+
+is(getter.call(x), 1, "the getter actually works");
+
+Object.getPrototypeOf(x).__defineSetter__('readyState', function() {});
+is(getter.call(x), 1, "the getter works after defineSetter");
+
+is(x.responseType, "", "Should have correct responseType up front");
+var setter = x.__lookupSetter__('responseType');
+setter.call(x, "document");
+is(x.responseType, "document", "the setter is bound correctly");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_namedNoIndexed.html b/dom/bindings/test/test_namedNoIndexed.html
new file mode 100644
index 000000000..205ec89f9
--- /dev/null
+++ b/dom/bindings/test/test_namedNoIndexed.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=808991
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 808991</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=808991">Mozilla Bug 808991</a>
+<p id="display"></p>
+<div id="content" style="display: none" data-1="foo" data-bar="baz">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 808991 **/
+is($("content").dataset[1], "foo",
+ "Indexed props should work like named on dataset");
+is($("content").dataset["1"], "foo",
+ "Indexed props as strings should work like named on dataset");
+is($("content").dataset.bar, "baz",
+ "Named props should work on dataset");
+is($("content").dataset['bar'], "baz",
+ "Named props as strings should work on dataset");
+
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_named_getter_enumerability.html b/dom/bindings/test/test_named_getter_enumerability.html
new file mode 100644
index 000000000..641f78ab2
--- /dev/null
+++ b/dom/bindings/test/test_named_getter_enumerability.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test for named getter enumerability</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+ var list = document.getElementsByTagName("div");
+ var desc = Object.getOwnPropertyDescriptor(list, "0");
+ assert_equals(typeof desc, "object", "Should have a '0' property");
+ assert_true(desc.enumerable, "'0' property should be enumerable");
+ desc = Object.getOwnPropertyDescriptor(list, "log");
+ assert_equals(typeof desc, "object", "Should have a 'log' property");
+ assert_false(desc.enumerable, "'log' property should not be enumerable");
+}, "Correct getOwnPropertyDescriptor behavior");
+test(function() {
+ var list = document.getElementsByTagName("div");
+ props = [];
+ for (var prop in list) {
+ props.push(prop);
+ }
+ assert_not_equals(props.indexOf("0"), -1, "Should enumerate '0'");
+ assert_equals(props.indexOf("log"), -1, "Should not enumerate 'log'");
+}, "Correct enumeration behavior");
+test(function() {
+ var list = document.getElementsByTagName("div");
+ props = Object.keys(list)
+ assert_not_equals(props.indexOf("0"), -1, "Keys should contain '0'");
+ assert_equals(props.indexOf("log"), -1, "Keys should not contain 'log'");
+}, "Correct keys() behavior");
+test(function() {
+ var list = document.getElementsByTagName("div");
+ props = Object.getOwnPropertyNames(list)
+ assert_not_equals(props.indexOf("0"), -1,
+ "own prop names should contain '0'");
+ assert_not_equals(props.indexOf("log"), -1,
+ "own prop names should contain 'log'");
+}, "Correct getOwnPropertyNames() behavior");
+</script>
diff --git a/dom/bindings/test/test_oom_reporting.html b/dom/bindings/test/test_oom_reporting.html
new file mode 100644
index 000000000..7323736e5
--- /dev/null
+++ b/dom/bindings/test/test_oom_reporting.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug </title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug **/
+ SimpleTest.waitForExplicitFinish();
+
+ SimpleTest.expectUncaughtException();
+ setTimeout(function() {
+ SpecialPowers.Cu.getJSTestingFunctions().throwOutOfMemory();
+ }, 0);
+
+ addEventListener("error", function(e) {
+ is(e.type, "error", "Should have an error event");
+ is(e.message, "uncaught exception: out of memory",
+ "Should have the right error message");
+ // Make sure we finish async, in case the expectUncaughtException assertion
+ // about having seen the exception runs after our listener
+ SimpleTest.executeSoon(SimpleTest.finish);
+ });
+
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_primitive_this.html b/dom/bindings/test/test_primitive_this.html
new file mode 100644
index 000000000..d2b733dff
--- /dev/null
+++ b/dom/bindings/test/test_primitive_this.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=603201
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 603201</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 603201 **/
+
+ SimpleTest.waitForExplicitFinish();
+ function runTest()
+ {
+ var nodes = document.body.childNodes;
+
+ Object.setPrototypeOf(Number.prototype, nodes);
+
+ Object.defineProperty(nodes, "getter", {get: function() {
+ "use strict";
+ is(this, 1);
+ return "getter";
+ }});
+ Object.defineProperty(Object.getPrototypeOf(nodes), "getter2", {get: function() {
+ "use strict";
+ is(this, 1);
+ return "getter2";
+ }});
+
+ var number = 1;
+ is(number.getter, "getter");
+ is(number.getter2, "getter2");
+
+ SimpleTest.finish();
+ }
+
+ </script>
+</head>
+<body onload="runTest();">
+<pre>Test</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_promise_rejections_from_jsimplemented.html b/dom/bindings/test/test_promise_rejections_from_jsimplemented.html
new file mode 100644
index 000000000..5428030c5
--- /dev/null
+++ b/dom/bindings/test/test_promise_rejections_from_jsimplemented.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1107592
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1107592</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1107592 **/
+
+ SimpleTest.waitForExplicitFinish();
+
+ function checkExn(lineNumber, name, message, code, filename, testNumber, stack, exn) {
+ is(exn.lineNumber, lineNumber,
+ "Should have the right line number in test " + testNumber);
+ is(exn.name, name,
+ "Should have the right exception name in test " + testNumber);
+ is("filename" in exn ? exn.filename : exn.fileName, filename,
+ "Should have the right file name in test " + testNumber);
+ is(exn.message, message,
+ "Should have the right message in test " + testNumber);
+ is(exn.code, code, "Should have the right .code in test " + testNumber);
+ if (message === "") {
+ is(exn.name, "InternalError",
+ "Should have one of our synthetic exceptions in test " + testNumber);
+ }
+ is(exn.stack, stack, "Should have the right stack in test " + testNumber);
+ }
+
+ function ensurePromiseFail(testNumber, value) {
+ ok(false, "Test " + testNumber + " should not have a fulfilled promise");
+ }
+
+ function doTest() {
+ var t = new TestInterfaceJS();
+ /* Async parent frames from pushPrefEnv don't show up in e10s. */
+ var isE10S = !SpecialPowers.isMainProcess();
+ var asyncStack = SpecialPowers.getBoolPref("javascript.options.asyncstack");
+ var ourFile = location.href;
+ var unwrapError = "Promise rejection value is a non-unwrappable cross-compartment wrapper.";
+ var parentFrame = (asyncStack && !isE10S) ? `Async*@${ourFile}:130:3
+` : "";
+
+ Promise.all([
+ t.testPromiseWithThrowingChromePromiseInit().then(
+ ensurePromiseFail.bind(null, 1),
+ checkExn.bind(null, 49, "InternalError", unwrapError,
+ undefined, ourFile, 1,
+ `doTest@${ourFile}:49:7
+` +
+ parentFrame)),
+ t.testPromiseWithThrowingContentPromiseInit(function() {
+ thereIsNoSuchContentFunction1();
+ }).then(
+ ensurePromiseFail.bind(null, 2),
+ checkExn.bind(null, 57, "ReferenceError",
+ "thereIsNoSuchContentFunction1 is not defined",
+ undefined, ourFile, 2,
+ `doTest/<@${ourFile}:57:11
+doTest@${ourFile}:56:7
+` +
+ parentFrame)),
+ t.testPromiseWithThrowingChromeThenFunction().then(
+ ensurePromiseFail.bind(null, 3),
+ checkExn.bind(null, 0, "InternalError", unwrapError, undefined, "", 3, asyncStack ? (`Async*doTest@${ourFile}:67:7
+` +
+ parentFrame) : "")),
+ t.testPromiseWithThrowingContentThenFunction(function() {
+ thereIsNoSuchContentFunction2();
+ }).then(
+ ensurePromiseFail.bind(null, 4),
+ checkExn.bind(null, 73, "ReferenceError",
+ "thereIsNoSuchContentFunction2 is not defined",
+ undefined, ourFile, 4,
+ `doTest/<@${ourFile}:73:11
+` +
+ (asyncStack ? `Async*doTest@${ourFile}:72:7
+` : "") +
+ parentFrame)),
+ t.testPromiseWithThrowingChromeThenable().then(
+ ensurePromiseFail.bind(null, 5),
+ checkExn.bind(null, 0, "InternalError", unwrapError, undefined, "", 5, asyncStack ? (`Async*doTest@${ourFile}:84:7
+` +
+ parentFrame) : "")),
+ t.testPromiseWithThrowingContentThenable({
+ then: function() { thereIsNoSuchContentFunction3(); }
+ }).then(
+ ensurePromiseFail.bind(null, 6),
+ checkExn.bind(null, 90, "ReferenceError",
+ "thereIsNoSuchContentFunction3 is not defined",
+ undefined, ourFile, 6,
+ `doTest/<.then@${ourFile}:90:32
+` + (asyncStack ? `Async*doTest@${ourFile}:89:7\n` + parentFrame : ""))),
+ t.testPromiseWithDOMExceptionThrowingPromiseInit().then(
+ ensurePromiseFail.bind(null, 7),
+ checkExn.bind(null, 98, "NotFoundError",
+ "We are a second DOMException",
+ DOMException.NOT_FOUND_ERR, ourFile, 7,
+ `doTest@${ourFile}:98:7
+` +
+ parentFrame)),
+ t.testPromiseWithDOMExceptionThrowingThenFunction().then(
+ ensurePromiseFail.bind(null, 8),
+ checkExn.bind(null, asyncStack ? 106 : 0, "NetworkError",
+ "We are a third DOMException",
+ DOMException.NETWORK_ERR, asyncStack ? ourFile : "", 8,
+ (asyncStack ? `Async*doTest@${ourFile}:106:7
+` +
+ parentFrame : ""))),
+ t.testPromiseWithDOMExceptionThrowingThenable().then(
+ ensurePromiseFail.bind(null, 9),
+ checkExn.bind(null, asyncStack ? 114 : 0, "TypeMismatchError",
+ "We are a fourth DOMException",
+ DOMException.TYPE_MISMATCH_ERR,
+ asyncStack ? ourFile : "", 9,
+ (asyncStack ? `Async*doTest@${ourFile}:114:7
+` +
+ parentFrame : ""))),
+ ]).then(SimpleTest.finish,
+ function(err) {
+ ok(false, "One of our catch statements totally failed with err" + err + ', stack: ' + (err ? err.stack : ''));
+ SimpleTest.finish();
+ });
+ }
+
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]},
+ doTest);
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1107592">Mozilla Bug 1107592</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_proxies_via_xray.html b/dom/bindings/test/test_proxies_via_xray.html
new file mode 100644
index 000000000..59affe6c0
--- /dev/null
+++ b/dom/bindings/test/test_proxies_via_xray.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1021066
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1021066</title>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1021066">Mozilla Bug 1021066</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<iframe id="t" src="http://example.org/tests/dom/bindings/test/file_proxies_via_xray.html"></iframe>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1021066 **/
+
+function test()
+{
+ "use strict"; // So we'll get exceptions on sets
+ var doc = document.getElementById("t").contentWindow.document;
+ ok(!("x" in doc), "Should have an Xray here");
+ is(doc.x, undefined, "Really should have an Xray here");
+ is(doc.wrappedJSObject.x, 5, "And wrapping the right thing");
+
+ // Test overridebuiltins binding without named setter
+ is(doc.y, doc.getElementById("y"),
+ "Named getter should work on Document");
+ try {
+ doc.z = 5;
+ ok(false, "Should have thrown on set of readonly property on Document");
+ } catch (e) {
+ ok(/read-only/.test(e.message),
+ "Threw the right exception on set of readonly property on Document");
+ }
+
+ doc.w = 5;
+ is(doc.w, 5, "Should be able to set things that are not named props");
+
+ // Test non-overridebuiltins binding without named setter
+ var l = doc.getElementsByTagName("img");
+ is(l.y, doc.getElementById("y"),
+ "Named getter should work on HTMLCollection");
+ try {
+ l.z = 5;
+ ok(false, "Should have thrown on set of readonly property on HTMLCollection");
+ } catch (e) {
+ ok(/read-only/.test(e.message),
+ "Should throw the right exception on set of readonly property on HTMLCollection");
+ }
+ try {
+ l[10] = 5;
+ ok(false, "Should have thrown on set of indexed property on HTMLCollection");
+ } catch (e) {
+ ok(/doesn't have an indexed property setter/.test(e.message),
+ "Should throw the right exception on set of indexed property on HTMLCollection");
+ }
+
+ // Test overridebuiltins binding with named setter
+ var d = doc.documentElement.dataset;
+ d.foo = "bar";
+ // Check that this actually got passed on to the underlying object.
+ is(d.wrappedJSObject.foo, "bar",
+ "Set should get forwarded to the underlying object");
+ is(doc.documentElement.getAttribute("data-foo"), "bar",
+ "Attribute setter should have been called");
+ d.foo = "baz";
+ // Check that this actually got passed on to the underlying object.
+ is(d.wrappedJSObject.foo, "baz",
+ "Set should get forwarded to the underlying object again");
+ is(doc.documentElement.getAttribute("data-foo"), "baz",
+ "Attribute setter should have been called again");
+
+ // Test non-overridebuiltins binding with named setter
+ var s = doc.defaultView.localStorage;
+ s["test_proxies_via_xray"] = "bar";
+ // Check that this actually got passed on to the underlying object.
+ is(s.wrappedJSObject["test_proxies_via_xray"], "bar",
+ "Set should get forwarded to the underlying object without overridebuiltins");
+ s["test_proxies_via_xray"] = "baz";
+ // Check that this actually got passed on to the underlying object.
+ is(s.wrappedJSObject["test_proxies_via_xray"], "baz",
+ "Set should get forwarded to the underlying object again without overridebuiltins");
+
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_queryInterface.html b/dom/bindings/test/test_queryInterface.html
new file mode 100644
index 000000000..076bf9e7d
--- /dev/null
+++ b/dom/bindings/test/test_queryInterface.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=827546
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 827546</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 827546 **/
+
+ var notEditable = document.createElement("div");
+ var thrown;
+ try {
+ thrown = false;
+ SpecialPowers.do_QueryInterface(notEditable, "nsIDOMNSEditableElement");
+ } catch (e) {
+ thrown = true;
+ }
+ ok(thrown,
+ "QI to nsIDOMNSEditableElement on a non-editable element should fail");
+
+ var editable = document.createElement("input");
+ ok(SpecialPowers.do_QueryInterface(editable, "nsIDOMNSEditableElement"),
+ "Editable element needs to support QI to nsIDOMNSEditableElement");
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=827546">Mozilla Bug 827546</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_returnUnion.html b/dom/bindings/test/test_returnUnion.html
new file mode 100644
index 000000000..5be10ba3c
--- /dev/null
+++ b/dom/bindings/test/test_returnUnion.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1048659
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1048659</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for returning unions from JS-implemented WebIDL. **/
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, go);
+
+ function go() {
+ var t = new TestInterfaceJS();
+ var t2 = new TestInterfaceJS();
+
+ is(t.pingPongUnion(t2), t2, "ping pong union for left case should be identity");
+ is(t.pingPongUnion(12), 12, "ping pong union for right case should be identity");
+
+ is(t.pingPongUnionContainingNull("this is not a string"), "this is not a string",
+ "ping pong union containing union for left case should be identity");
+ is(t.pingPongUnionContainingNull(null), null,
+ "ping pong union containing null for right case null should be identity");
+ is(t.pingPongUnionContainingNull(t2), t2,
+ "ping pong union containing null for right case should be identity");
+
+ is(t.pingPongNullableUnion(t2), t2, "ping pong nullable union for left case should be identity");
+ is(t.pingPongNullableUnion(12), 12, "ping pong nullable union for right case should be identity");
+ is(t.pingPongNullableUnion(null), null, "ping pong nullable union for null case should be identity");
+
+ var rejectedBadUnion = false;
+ var result = null;
+ try {
+ result = t.returnBadUnion();
+ } catch (e) {
+ rejectedBadUnion = true;
+ }
+ is(result, null, "bad union should not set a value for result");
+ ok(rejectedBadUnion, "bad union should throw an exception");
+
+ SimpleTest.finish();
+ }
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1048659">Mozilla Bug 1048659</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_sequence_detection.html b/dom/bindings/test/test_sequence_detection.html
new file mode 100644
index 000000000..80dfac4db
--- /dev/null
+++ b/dom/bindings/test/test_sequence_detection.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1066432
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1066432</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1066432 **/
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, function() {
+ var testInterfaceJS = new TestInterfaceJS();
+ ok(testInterfaceJS, "got a TestInterfaceJS object");
+
+ var nonIterableObject = {[Symbol.iterator]: 5};
+
+ try {
+ testInterfaceJS.testSequenceOverload(nonIterableObject);
+ ok(false, "Should have thrown in the overload case"); // see long comment above!
+ } catch (e) {
+ is(e.name, "TypeError", "Should get a TypeError for the overload case");
+ ok(e.message.includes("not iterable"),
+ "Should have a message about being non-iterable in the overload case");
+ }
+
+ try {
+ testInterfaceJS.testSequenceUnion(nonIterableObject);
+ ok(false, "Should have thrown in the union case");
+ } catch (e) {
+ is(e.name, "TypeError", "Should get a TypeError for the union case");
+ ok(e.message.includes("not iterable"),
+ "Should have a message about being non-iterable in the union case");
+ }
+
+ SimpleTest.finish();
+ });
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1066432">Mozilla Bug 1066432</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_sequence_wrapping.html b/dom/bindings/test/test_sequence_wrapping.html
new file mode 100644
index 000000000..7132e5601
--- /dev/null
+++ b/dom/bindings/test/test_sequence_wrapping.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=775852
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 775852</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=775852">Mozilla Bug 775852</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+ <canvas width="1" height="1" id="c"></canvas>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 775852 **/
+function doTest() {
+ var gl = $("c").getContext("experimental-webgl");
+ if (!gl) {
+ // No WebGL support on MacOS 10.5. Just skip this test
+ todo(false, "WebGL not supported");
+ return;
+ }
+ var setterCalled = false;
+
+ extLength = gl.getSupportedExtensions().length;
+ ok(extLength > 0,
+ "This test won't work right if we have no supported extensions");
+
+ Object.defineProperty(Array.prototype, "0",
+ {
+ set: function(val) {
+ setterCalled = true;
+ }
+ });
+
+ // Test that our property got defined correctly
+ var arr = []
+ arr[0] = 5;
+ is(setterCalled, true, "Setter should be called when setting prop on array");
+
+ setterCalled = false;
+
+ is(gl.getSupportedExtensions().length, extLength,
+ "We should still have the same number of extensions");
+
+ is(setterCalled, false,
+ "Setter should not be called when getting supported extensions");
+}
+doTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_setWithNamedGetterNoNamedSetter.html b/dom/bindings/test/test_setWithNamedGetterNoNamedSetter.html
new file mode 100644
index 000000000..52f56151d
--- /dev/null
+++ b/dom/bindings/test/test_setWithNamedGetterNoNamedSetter.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1043690
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1043690</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1043690">Mozilla Bug 1043690</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<form>
+ <input name="action">
+</form>
+</div>
+ <script type="application/javascript">
+
+ /** Test for Bug 1043690 **/
+ var f = document.querySelector("form");
+ var i = document.querySelector("input");
+ is(f.getAttribute("action"), null, "Should have no action attribute");
+ is(f.action, i, "form.action should be the input");
+ f.action = "http://example.org";
+ is(f.getAttribute("action"), "http://example.org",
+ "Should have an action attribute now");
+ is(f.action, i, "form.action should still be the input");
+ i.remove();
+ is(f.action, "http://example.org/",
+ "form.action should no longer be shadowed");
+
+
+ </script>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_stringBindings.html b/dom/bindings/test/test_stringBindings.html
new file mode 100644
index 000000000..1895b0342
--- /dev/null
+++ b/dom/bindings/test/test_stringBindings.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1334537
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1334537</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1334537 **/
+ SimpleTest.waitForExplicitFinish();
+
+ function go() {
+ // Need a new global that will pick up our pref.
+ var ifr = document.createElement("iframe");
+ document.body.appendChild(ifr);
+
+ var t = new ifr.contentWindow.TestFunctions();
+ var testString = "abcdefghijklmnopqrstuvwxyz";
+ const substringLength = 10;
+ var shortTestString = testString.substring(0, substringLength);
+
+ t.setStringData(testString);
+ // Note: we want to do all our gets before we start running code we don't
+ // control inside the test harness, if we really want to exercise the string
+ // cache in controlled ways.
+
+ var asShortDOMString = t.getStringDataAsDOMString(substringLength);
+ var asFullDOMString = t.getStringDataAsDOMString();
+ var asShortAString = t.getStringDataAsAString(substringLength);
+ var asAString = t.getStringDataAsAString();
+
+ is(asShortAString, shortTestString, "Short DOMString should be short");
+ is(asFullDOMString, testString, "Full DOMString should be test string");
+ is(asShortAString, shortTestString, "Short AString should be short");
+ is(asAString, testString, "Full AString should be test string");
+
+ SimpleTest.finish();
+ }
+
+ addLoadEvent(function() {
+ SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]},
+ go);
+ });
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1334537">Mozilla Bug 1334537</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_throwing_method_noDCE.html b/dom/bindings/test/test_throwing_method_noDCE.html
new file mode 100644
index 000000000..e952819a8
--- /dev/null
+++ b/dom/bindings/test/test_throwing_method_noDCE.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test that we don't DCE functions that can throw</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+ function test(root) {
+ var threw = false;
+ try {
+ root.querySelectorAll("");
+ } catch(e){ threw = true; };
+ // Hot loop to make sure the JIT heuristics ion-compile this function even
+ // though it's throwing exceptions (which would normally make us back off
+ // of ion compilation).
+ for (var i=0; i<1500; i++) {}
+ return threw;
+ }
+
+ var threw = false;
+ var el = document.createElement("div");
+ for (var i=0; i<200; i++)
+ threw = test(el);
+ assert_true(threw);
+}, "Shouldn't optimize away throwing functions");
+</script>
diff --git a/dom/bindings/test/test_traceProtos.html b/dom/bindings/test/test_traceProtos.html
new file mode 100644
index 000000000..17a5cb96d
--- /dev/null
+++ b/dom/bindings/test/test_traceProtos.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=744772
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 744772</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=744772">Mozilla Bug 744772</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 744772 **/
+
+SimpleTest.waitForExplicitFinish();
+
+function callback() {
+ new XMLHttpRequest().upload;
+ ok(true, "Accessing unreferenced DOM interface objects shouldn't crash");
+ SimpleTest.finish();
+}
+
+delete window.XMLHttpRequestUpload;
+SpecialPowers.exactGC(callback);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_treat_non_object_as_null.html b/dom/bindings/test/test_treat_non_object_as_null.html
new file mode 100644
index 000000000..fbb6ceb66
--- /dev/null
+++ b/dom/bindings/test/test_treat_non_object_as_null.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=952365
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 952365</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 952365 **/
+
+ var onvolumechange;
+ var x = {};
+
+ (function() {
+ onvolumechange = x;
+ is(onvolumechange, x,
+ "Should preserve an object value when assigning to event handler");
+ // Test that we don't try to actually call the non-callable object
+ window.dispatchEvent(new Event("volumechange"));
+ onvolumechange = 5;
+ is(onvolumechange, null,
+ "Non-object values should become null when assigning to event handler");
+ })();
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=952365">Mozilla Bug 952365</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/bindings/test/test_unforgeablesonexpando.html b/dom/bindings/test/test_unforgeablesonexpando.html
new file mode 100644
index 000000000..419e6ac7d
--- /dev/null
+++ b/dom/bindings/test/test_unforgeablesonexpando.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test for making sure named getters don't override the unforgeable location on HTMLDocument</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<img name="location">
+<script>
+test(function() {
+ assert_equals(document.location, window.location,
+ 'The <img name="location"> should not override the location getter');
+}, "document.location is the right thing");
+test(function() {
+ var doc = new DOMParser().parseFromString("<img name='location'>", "text/html");
+ assert_equals(doc.location, null,
+ 'The <img name="location"> should not override the location getter on a data document');
+}, "document.location is the right thing on non-rendered document");
+</script>
diff --git a/dom/bindings/test/test_usvstring.html b/dom/bindings/test/test_usvstring.html
new file mode 100644
index 000000000..cbb1e7971
--- /dev/null
+++ b/dom/bindings/test/test_usvstring.html
@@ -0,0 +1,41 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ - http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test USVString</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script class="testbody" type="application/javascript">
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({set: [['dom.expose_test_interfaces', true]]}, function() {
+ var testInterfaceJS = new TestInterfaceJS();
+ ok(testInterfaceJS, "got a TestInterfaceJS object");
+ // For expected values, see algorithm definition here:
+ // http://heycam.github.io/webidl/#dfn-obtain-unicode
+ var testList = [
+ { string: "foo",
+ expected: "foo" },
+ { string: "This is U+2070E: \ud841\udf0e",
+ expected: "This is U+2070E: \ud841\udf0e" },
+ { string: "Missing low surrogate: \ud841",
+ expected: "Missing low surrogate: \ufffd" },
+ { string: "Missing low surrogate with trailer: \ud841!!",
+ expected: "Missing low surrogate with trailer: \ufffd!!" },
+ { string: "Missing high surrogate: \udf0e",
+ expected: "Missing high surrogate: \ufffd" },
+ { string: "Missing high surrogate with trailer: \udf0e!!",
+ expected: "Missing high surrogate with trailer: \ufffd!!" },
+ { string: "U+2070E after malformed: \udf0e\ud841\udf0e",
+ expected: "U+2070E after malformed: \ufffd\ud841\udf0e" }
+ ];
+ testList.forEach(function(test) {
+ is(testInterfaceJS.convertSVS(test.string), test.expected, "Convert '" + test.string + "'");
+ });
+ SimpleTest.finish();
+});
+</script>
+</body>
+</html>
diff --git a/dom/bindings/test/test_worker_UnwrapArg.html b/dom/bindings/test/test_worker_UnwrapArg.html
new file mode 100644
index 000000000..1331a83f4
--- /dev/null
+++ b/dom/bindings/test/test_worker_UnwrapArg.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1127206
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1127206</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+
+ /** Test for Bug 1127206 **/
+ SimpleTest.waitForExplicitFinish();
+ var blob = new Blob([
+ `try { new File({}); }
+ catch (e) {
+ postMessage("throwing on random object");
+ }
+ try { new File(new Blob(["abc"])); }
+ catch (e) {
+ postMessage("throwing on Blob");
+ }
+ try { new File("abc"); }
+ catch (e) {
+ postMessage("throwing on string");
+ }
+ postMessage('finishTest')`]);
+ var url = URL.createObjectURL(blob);
+ var w = new Worker(url);
+ var expectedResults = [
+ "throwing on random object",
+ "throwing on Blob",
+ "throwing on string",
+ ];
+ var curIndex = 0;
+ w.onmessage = function(e) {
+ if (curIndex == expectedResults.length) {
+ is(e.data, "finishTest", "What message is this?");
+ SimpleTest.finish();
+ } else {
+ is(e.data, expectedResults[curIndex],
+ "Message " + (curIndex+1) + " should be correct");
+ ++curIndex;
+ }
+ }
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1127206">Mozilla Bug 1127206</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>