diff options
160 files changed, 0 insertions, 18321 deletions
diff --git a/dom/base/test/chrome/chrome.ini b/dom/base/test/chrome/chrome.ini index c6ee42391..64b1c8454 100644 --- a/dom/base/test/chrome/chrome.ini +++ b/dom/base/test/chrome/chrome.ini @@ -62,8 +62,6 @@ support-files = ../file_bug357450.js [test_bug1139964.xul] [test_bug1209621.xul] [test_cpows.xul] -[test_custom_element_content.xul] -[test_custom_element_ep.xul] [test_domparsing.xul] [test_fileconstructor.xul] [test_fileconstructor_tempfile.xul] diff --git a/dom/base/test/mochitest.ini b/dom/base/test/mochitest.ini index 928727f81..8183dab8b 100644 --- a/dom/base/test/mochitest.ini +++ b/dom/base/test/mochitest.ini @@ -630,7 +630,6 @@ skip-if = toolkit == 'android' #bug 904183 [test_document.all_unqualified.html] [test_document_constructor.html] [test_document_importNode_document.html] -[test_custom_element.html] [test_domcursor.html] [test_domparser_null_char.html] [test_domparsing.html] @@ -698,7 +697,6 @@ skip-if = (os != 'android') # meta-viewport tag support is mobile-only skip-if = toolkit == 'android' #TIMED_OUT [test_mozMatchesSelector.html] [test_mutationobserver_anonymous.html] -[test_mutationobservers.html] [test_named_frames.html] [test_navigator_hardwareConcurrency.html] [test_navigator_language.html] diff --git a/dom/bindings/moz.build b/dom/bindings/moz.build index 649689c41..fae0fd15a 100644 --- a/dom/bindings/moz.build +++ b/dom/bindings/moz.build @@ -4,8 +4,6 @@ # 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/. -TEST_DIRS += ['test'] - XPIDL_SOURCES += [ 'nsIScriptError.idl' ] @@ -107,33 +105,6 @@ SOURCES += [ 'StructuredClone.cpp', ] -# Tests for maplike and setlike require bindings to be built, which means they -# must be included in libxul. This breaks the "no test classes are exported" -# rule stated in the test/ directory, but it's the only way this will work. -# Test classes are only built in debug mode, and all tests requiring use of -# them are only run in debug mode. -if CONFIG['MOZ_DEBUG']: - EXPORTS.mozilla.dom += [ - "test/TestFunctions.h", - "test/TestInterfaceIterableDouble.h", - "test/TestInterfaceIterableDoubleUnion.h", - "test/TestInterfaceIterableSingle.h", - "test/TestInterfaceMaplike.h", - "test/TestInterfaceMaplikeObject.h", - "test/TestInterfaceSetlike.h", - "test/TestInterfaceSetlikeNode.h" - ] - UNIFIED_SOURCES += [ - "test/TestFunctions.cpp", - "test/TestInterfaceIterableDouble.cpp", - "test/TestInterfaceIterableDoubleUnion.cpp", - "test/TestInterfaceIterableSingle.cpp", - "test/TestInterfaceMaplike.cpp", - "test/TestInterfaceMaplikeObject.cpp", - "test/TestInterfaceSetlike.cpp", - "test/TestInterfaceSetlikeNode.cpp", - ] - include('/ipc/chromium/chromium-config.mozbuild') if CONFIG['MOZ_AUDIO_CHANNEL_MANAGER']: diff --git a/dom/bindings/test/Makefile.in b/dom/bindings/test/Makefile.in deleted file mode 100644 index 844a51c27..000000000 --- a/dom/bindings/test/Makefile.in +++ /dev/null @@ -1,21 +0,0 @@ -# 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 deleted file mode 100644 index 4e2e10e43..000000000 --- a/dom/bindings/test/TestBindingHeader.h +++ /dev/null @@ -1,1464 +0,0 @@ -/* -*- 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 DocGroup; -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 and GetDocGroup to make binding codegen happy - virtual nsISupports* GetParentObject(); - DocGroup* GetDocGroup() const; -}; - -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 and GetDocGroup to make binding codegen happy - virtual nsISupports* GetParentObject(); - DocGroup* GetDocGroup() const; - - 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); - void CeReactionsMethod(); - void CeReactionsMethodOverload(); - void CeReactionsMethodOverload(const nsAString&); - bool CeReactionsAttr() const; - void SetCeReactionsAttr(bool); - 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); -}; - -class TestHTMLConstructorInterface : public nsGenericHTMLElement -{ -public: - virtual nsISupports* GetParentObject(); -}; - -class TestCEReactionsInterface : public nsISupports, - public nsWrapperCache -{ -public: - NS_DECL_ISUPPORTS - - // We need a GetParentObject to make binding codegen happy - virtual nsISupports* GetParentObject(); - - int32_t Item(uint32_t); - uint32_t Length() const; - int32_t IndexedGetter(uint32_t, bool &); - void IndexedSetter(uint32_t, int32_t); - void NamedDeleter(const nsAString&, bool &); - void NamedGetter(const nsAString&, bool &, nsString&); - void NamedSetter(const nsAString&, const nsAString&); - void GetSupportedNames(nsTArray<nsString>&); -}; - -} // namespace dom -} // namespace mozilla - -#endif /* TestBindingHeader_h */ diff --git a/dom/bindings/test/TestCImplementedInterface.h b/dom/bindings/test/TestCImplementedInterface.h deleted file mode 100644 index 64b5c9954..000000000 --- a/dom/bindings/test/TestCImplementedInterface.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 3fce5e21b..000000000 --- a/dom/bindings/test/TestCodeGen.webidl +++ /dev/null @@ -1,1281 +0,0 @@ -/* -*- 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; - [CEReactions] void ceReactionsMethod(); - [CEReactions] void ceReactionsMethodOverload(); - [CEReactions] void ceReactionsMethodOverload(DOMString bar); - [CEReactions] attribute boolean ceReactionsAttr; - 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; -}; - -[HTMLConstructor] -interface TestHTMLConstructorInterface { -}; - -interface TestCEReactionsInterface { - [CEReactions] setter creator void (unsigned long index, long item); - [CEReactions] setter creator void (DOMString name, DOMString item); - [CEReactions] deleter void (DOMString name); - getter long item(unsigned long index); - getter DOMString (DOMString name); - readonly attribute unsigned long length; -}; diff --git a/dom/bindings/test/TestDictionary.webidl b/dom/bindings/test/TestDictionary.webidl deleted file mode 100644 index 3dd91bd65..000000000 --- a/dom/bindings/test/TestDictionary.webidl +++ /dev/null @@ -1,9 +0,0 @@ -/* -*- 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 deleted file mode 100644 index a2183c002..000000000 --- a/dom/bindings/test/TestExampleGen.webidl +++ /dev/null @@ -1,815 +0,0 @@ -/* -*- 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; - [CEReactions] void ceReactionsMethod(); - [CEReactions] void ceReactionsMethodOverload(); - [CEReactions] void ceReactionsMethodOverload(DOMString bar); - [CEReactions] attribute boolean ceReactionsAttr; - 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 deleted file mode 100644 index f05c92b48..000000000 --- a/dom/bindings/test/TestFunctions.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- 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 deleted file mode 100644 index b35464824..000000000 --- a/dom/bindings/test/TestFunctions.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 33a4c97d1..000000000 --- a/dom/bindings/test/TestInterfaceIterableDouble.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* 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 deleted file mode 100644 index 1e9ff7acd..000000000 --- a/dom/bindings/test/TestInterfaceIterableDouble.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 29151a4c5..000000000 --- a/dom/bindings/test/TestInterfaceIterableDoubleUnion.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* 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 deleted file mode 100644 index ff6ea2175..000000000 --- a/dom/bindings/test/TestInterfaceIterableDoubleUnion.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 5f8d6c640..000000000 --- a/dom/bindings/test/TestInterfaceIterableSingle.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* 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 deleted file mode 100644 index a071ada8b..000000000 --- a/dom/bindings/test/TestInterfaceIterableSingle.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 1a5bf8e61..000000000 --- a/dom/bindings/test/TestInterfaceJS.js +++ /dev/null @@ -1,166 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 161a42156..000000000 --- a/dom/bindings/test/TestInterfaceJS.manifest +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index b108ef5b6..000000000 --- a/dom/bindings/test/TestInterfaceJSMaplike.js +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 4abace83c..000000000 --- a/dom/bindings/test/TestInterfaceMaplike.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* 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 deleted file mode 100644 index c012a7a21..000000000 --- a/dom/bindings/test/TestInterfaceMaplike.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 3dc1ffdc4..000000000 --- a/dom/bindings/test/TestInterfaceMaplikeObject.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* 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 deleted file mode 100644 index af4660c0d..000000000 --- a/dom/bindings/test/TestInterfaceMaplikeObject.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- 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 deleted file mode 100644 index c9f556076..000000000 --- a/dom/bindings/test/TestInterfaceSetlike.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* 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 deleted file mode 100644 index c9f464960..000000000 --- a/dom/bindings/test/TestInterfaceSetlike.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 5499553fa..000000000 --- a/dom/bindings/test/TestInterfaceSetlikeNode.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* 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 deleted file mode 100644 index 05b14190e..000000000 --- a/dom/bindings/test/TestInterfaceSetlikeNode.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- 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 deleted file mode 100644 index a133b9981..000000000 --- a/dom/bindings/test/TestJSImplGen.webidl +++ /dev/null @@ -1,840 +0,0 @@ -/* -*- 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; - [CEReactions] void ceReactionsMethod(); - [CEReactions] void ceReactionsMethodOverload(); - [CEReactions] void ceReactionsMethodOverload(DOMString bar); - [CEReactions] attribute boolean ceReactionsAttr; - // 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 deleted file mode 100644 index e62dbd10b..000000000 --- a/dom/bindings/test/TestJSImplInheritanceGen.webidl +++ /dev/null @@ -1,29 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 7f758c79e..000000000 --- a/dom/bindings/test/TestTypedef.webidl +++ /dev/null @@ -1,7 +0,0 @@ -/* -*- 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 deleted file mode 100644 index 9fdbd7fd3..000000000 --- a/dom/bindings/test/chrome.ini +++ /dev/null @@ -1,22 +0,0 @@ -[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 deleted file mode 100644 index 487010fa4..000000000 --- a/dom/bindings/test/file_InstanceOf.html +++ /dev/null @@ -1,12 +0,0 @@ -<!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 deleted file mode 100644 index ee8c14c4d..000000000 --- a/dom/bindings/test/file_bug775543.html +++ /dev/null @@ -1,5 +0,0 @@ -<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 deleted file mode 100644 index 323acba66..000000000 --- a/dom/bindings/test/file_document_location_set_via_xray.html +++ /dev/null @@ -1,5 +0,0 @@ -<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 deleted file mode 100644 index 36b3f8a30..000000000 --- a/dom/bindings/test/file_dom_xrays.html +++ /dev/null @@ -1,24 +0,0 @@ -<!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 deleted file mode 100644 index 0d5240f95..000000000 --- a/dom/bindings/test/file_focuser.html +++ /dev/null @@ -1,24 +0,0 @@ -<!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 deleted file mode 100644 index 92a37e0ba..000000000 --- a/dom/bindings/test/file_fullScreenPropertyAccessor.html +++ /dev/null @@ -1,24 +0,0 @@ -<!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 deleted file mode 100644 index 2e9a31830..000000000 --- a/dom/bindings/test/file_proxies_via_xray.html +++ /dev/null @@ -1,8 +0,0 @@ -<!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 deleted file mode 100644 index 91417aba0..000000000 --- a/dom/bindings/test/forOf_iframe.html +++ /dev/null @@ -1,13 +0,0 @@ -<!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 deleted file mode 100644 index 2cd322e74..000000000 --- a/dom/bindings/test/mochitest.ini +++ /dev/null @@ -1,79 +0,0 @@ -[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 deleted file mode 100644 index 7d0cb6c21..000000000 --- a/dom/bindings/test/moz.build +++ /dev/null @@ -1,58 +0,0 @@ -# -*- 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 deleted file mode 100644 index c7e632117..000000000 --- a/dom/bindings/test/test_ByteString.html +++ /dev/null @@ -1,32 +0,0 @@ -<!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 deleted file mode 100644 index 514ec1b2a..000000000 --- a/dom/bindings/test/test_InstanceOf.html +++ /dev/null @@ -1,54 +0,0 @@ -<!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 deleted file mode 100644 index 3ab27c5e4..000000000 --- a/dom/bindings/test/test_Object.prototype_props.html +++ /dev/null @@ -1,20 +0,0 @@ -<!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", - "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 deleted file mode 100644 index 8b655a14d..000000000 --- a/dom/bindings/test/test_async_stacks.html +++ /dev/null @@ -1,108 +0,0 @@ -<!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 deleted file mode 100644 index e098eea53..000000000 --- a/dom/bindings/test/test_barewordGetsWindow.html +++ /dev/null @@ -1,60 +0,0 @@ -<!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 deleted file mode 100644 index 02a76d88d..000000000 --- a/dom/bindings/test/test_blacklisted_prerendering_function.xul +++ /dev/null @@ -1,124 +0,0 @@ -<?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 deleted file mode 100644 index dd98eb482..000000000 --- a/dom/bindings/test/test_bug1036214.html +++ /dev/null @@ -1,123 +0,0 @@ -<!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 deleted file mode 100644 index 22baed454..000000000 --- a/dom/bindings/test/test_bug1041646.html +++ /dev/null @@ -1,49 +0,0 @@ -<!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 deleted file mode 100644 index 18ede38ac..000000000 --- a/dom/bindings/test/test_bug1123516_maplikesetlike.html +++ /dev/null @@ -1,271 +0,0 @@ -<!-- 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 deleted file mode 100644 index 4bc45cddd..000000000 --- a/dom/bindings/test/test_bug1123516_maplikesetlikechrome.xul +++ /dev/null @@ -1,68 +0,0 @@ -<?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 deleted file mode 100644 index 5658091c4..000000000 --- a/dom/bindings/test/test_bug1123875.html +++ /dev/null @@ -1,14 +0,0 @@ -<!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 deleted file mode 100644 index ae72b2316..000000000 --- a/dom/bindings/test/test_bug1287912.html +++ /dev/null @@ -1,37 +0,0 @@ -<!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 deleted file mode 100644 index 0eebff116..000000000 --- a/dom/bindings/test/test_bug560072.html +++ /dev/null @@ -1,34 +0,0 @@ -<!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(Document.prototype, "body").get.call(document), - "Should get body out of property descriptor"); - -is(document.body, - Object.getOwnPropertyDescriptor( - Object.getPrototypeOf(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 deleted file mode 100644 index b4b3151d7..000000000 --- a/dom/bindings/test/test_bug742191.html +++ /dev/null @@ -1,36 +0,0 @@ -<!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 deleted file mode 100644 index 602a0cd7c..000000000 --- a/dom/bindings/test/test_bug759621.html +++ /dev/null @@ -1,29 +0,0 @@ -<!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 deleted file mode 100644 index 2e3b1ea30..000000000 --- a/dom/bindings/test/test_bug773326.html +++ /dev/null @@ -1,11 +0,0 @@ -<!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 deleted file mode 100644 index d8df05f63..000000000 --- a/dom/bindings/test/test_bug775543.html +++ /dev/null @@ -1,37 +0,0 @@ -<!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 deleted file mode 100644 index 787bd28fe..000000000 --- a/dom/bindings/test/test_bug788369.html +++ /dev/null @@ -1,30 +0,0 @@ -<!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 deleted file mode 100644 index 0ca2c7dad..000000000 --- a/dom/bindings/test/test_bug852846.html +++ /dev/null @@ -1,34 +0,0 @@ -<!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 deleted file mode 100644 index 4b0633328..000000000 --- a/dom/bindings/test/test_bug862092.html +++ /dev/null @@ -1,37 +0,0 @@ -<!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 deleted file mode 100644 index f48d2e8b0..000000000 --- a/dom/bindings/test/test_bug963382.html +++ /dev/null @@ -1,43 +0,0 @@ -<!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 deleted file mode 100644 index 2a505cefa..000000000 --- a/dom/bindings/test/test_callback_across_document_open.html +++ /dev/null @@ -1,21 +0,0 @@ -<!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 deleted file mode 100644 index d98ed87b2..000000000 --- a/dom/bindings/test/test_callback_default_thisval.html +++ /dev/null @@ -1,36 +0,0 @@ -<!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 deleted file mode 100644 index a40b0b94f..000000000 --- a/dom/bindings/test/test_callback_exceptions.html +++ /dev/null @@ -1,17 +0,0 @@ -<!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 deleted file mode 100644 index fc53c8747..000000000 --- a/dom/bindings/test/test_cloneAndImportNode.html +++ /dev/null @@ -1,48 +0,0 @@ -<!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 deleted file mode 100644 index 7808631b6..000000000 --- a/dom/bindings/test/test_crossOriginWindowSymbolAccess.html +++ /dev/null @@ -1,23 +0,0 @@ -<!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 deleted file mode 100644 index f8f5f6283..000000000 --- a/dom/bindings/test/test_defineProperty.html +++ /dev/null @@ -1,157 +0,0 @@ -<!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 deleted file mode 100644 index cdadc5063..000000000 --- a/dom/bindings/test/test_document_location_set_via_xray.html +++ /dev/null @@ -1,49 +0,0 @@ -<!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 deleted file mode 100644 index 20eef10fb..000000000 --- a/dom/bindings/test/test_document_location_via_xray_cached.html +++ /dev/null @@ -1,36 +0,0 @@ -<!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 deleted file mode 100644 index a62adff2e..000000000 --- a/dom/bindings/test/test_domProxyArrayLengthGetter.html +++ /dev/null @@ -1,28 +0,0 @@ -<!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 deleted file mode 100644 index 15d7013ad..000000000 --- a/dom/bindings/test/test_dom_xrays.html +++ /dev/null @@ -1,231 +0,0 @@ -<!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(); - 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 deleted file mode 100644 index e5dc519a0..000000000 --- a/dom/bindings/test/test_enums.html +++ /dev/null @@ -1,15 +0,0 @@ -<!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 deleted file mode 100644 index 9a6ab6088..000000000 --- a/dom/bindings/test/test_exceptionSanitization.html +++ /dev/null @@ -1,45 +0,0 @@ -<!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 deleted file mode 100644 index 376c2bc57..000000000 --- a/dom/bindings/test/test_exceptionThrowing.html +++ /dev/null @@ -1,56 +0,0 @@ -<!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 deleted file mode 100644 index a0f0cabe6..000000000 --- a/dom/bindings/test/test_exception_messages.html +++ /dev/null @@ -1,82 +0,0 @@ -<!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 deleted file mode 100644 index 8a98a8fb6..000000000 --- a/dom/bindings/test/test_exception_options_from_jsimplemented.html +++ /dev/null @@ -1,166 +0,0 @@ -<!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 deleted file mode 100644 index d0f599353..000000000 --- a/dom/bindings/test/test_exceptions_from_jsimplemented.html +++ /dev/null @@ -1,56 +0,0 @@ -<!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 deleted file mode 100644 index 53969a23e..000000000 --- a/dom/bindings/test/test_forOf.html +++ /dev/null @@ -1,86 +0,0 @@ -<!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 deleted file mode 100644 index c74b68216..000000000 --- a/dom/bindings/test/test_integers.html +++ /dev/null @@ -1,50 +0,0 @@ -<!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 deleted file mode 100644 index 59828a2cf..000000000 --- a/dom/bindings/test/test_interfaceName.html +++ /dev/null @@ -1,28 +0,0 @@ -<!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 deleted file mode 100644 index c97b2f63b..000000000 --- a/dom/bindings/test/test_interfaceToString.html +++ /dev/null @@ -1,47 +0,0 @@ -<!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 deleted file mode 100644 index 8ce818e76..000000000 --- a/dom/bindings/test/test_iterable.html +++ /dev/null @@ -1,241 +0,0 @@ -<!-- 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 deleted file mode 100644 index 2854a3112..000000000 --- a/dom/bindings/test/test_jsimplemented_eventhandler.html +++ /dev/null @@ -1,47 +0,0 @@ -<!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 deleted file mode 100644 index d86b15ad9..000000000 --- a/dom/bindings/test/test_kill_longrunning_prerendered_content.xul +++ /dev/null @@ -1,85 +0,0 @@ -<?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 deleted file mode 100644 index cfbdcebcd..000000000 --- a/dom/bindings/test/test_lenientThis.html +++ /dev/null @@ -1,27 +0,0 @@ -<!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 deleted file mode 100644 index 306ee4f64..000000000 --- a/dom/bindings/test/test_lookupGetter.html +++ /dev/null @@ -1,49 +0,0 @@ -<!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 deleted file mode 100644 index 205ec89f9..000000000 --- a/dom/bindings/test/test_namedNoIndexed.html +++ /dev/null @@ -1,36 +0,0 @@ -<!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 deleted file mode 100644 index 641f78ab2..000000000 --- a/dom/bindings/test/test_named_getter_enumerability.html +++ /dev/null @@ -1,40 +0,0 @@ -<!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 deleted file mode 100644 index 7323736e5..000000000 --- a/dom/bindings/test/test_oom_reporting.html +++ /dev/null @@ -1,42 +0,0 @@ -<!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 deleted file mode 100644 index d2b733dff..000000000 --- a/dom/bindings/test/test_primitive_this.html +++ /dev/null @@ -1,45 +0,0 @@ -<!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 deleted file mode 100644 index 68de079ed..000000000 --- a/dom/bindings/test/test_promise_rejections_from_jsimplemented.html +++ /dev/null @@ -1,143 +0,0 @@ -<!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, - `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 deleted file mode 100644 index 59affe6c0..000000000 --- a/dom/bindings/test/test_proxies_via_xray.html +++ /dev/null @@ -1,99 +0,0 @@ -<!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 deleted file mode 100644 index 076bf9e7d..000000000 --- a/dom/bindings/test/test_queryInterface.html +++ /dev/null @@ -1,41 +0,0 @@ -<!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 deleted file mode 100644 index 5be10ba3c..000000000 --- a/dom/bindings/test/test_returnUnion.html +++ /dev/null @@ -1,59 +0,0 @@ -<!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 deleted file mode 100644 index 80dfac4db..000000000 --- a/dom/bindings/test/test_sequence_detection.html +++ /dev/null @@ -1,53 +0,0 @@ -<!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 deleted file mode 100644 index 7132e5601..000000000 --- a/dom/bindings/test/test_sequence_wrapping.html +++ /dev/null @@ -1,59 +0,0 @@ -<!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 deleted file mode 100644 index 52f56151d..000000000 --- a/dom/bindings/test/test_setWithNamedGetterNoNamedSetter.html +++ /dev/null @@ -1,40 +0,0 @@ -<!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 deleted file mode 100644 index 1895b0342..000000000 --- a/dom/bindings/test/test_stringBindings.html +++ /dev/null @@ -1,59 +0,0 @@ -<!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 deleted file mode 100644 index e952819a8..000000000 --- a/dom/bindings/test/test_throwing_method_noDCE.html +++ /dev/null @@ -1,27 +0,0 @@ -<!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 deleted file mode 100644 index 17a5cb96d..000000000 --- a/dom/bindings/test/test_traceProtos.html +++ /dev/null @@ -1,37 +0,0 @@ -<!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 deleted file mode 100644 index fbb6ceb66..000000000 --- a/dom/bindings/test/test_treat_non_object_as_null.html +++ /dev/null @@ -1,39 +0,0 @@ -<!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 deleted file mode 100644 index 419e6ac7d..000000000 --- a/dom/bindings/test/test_unforgeablesonexpando.html +++ /dev/null @@ -1,18 +0,0 @@ -<!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 deleted file mode 100644 index cbb1e7971..000000000 --- a/dom/bindings/test/test_usvstring.html +++ /dev/null @@ -1,41 +0,0 @@ -<!-- 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 deleted file mode 100644 index 1331a83f4..000000000 --- a/dom/bindings/test/test_worker_UnwrapArg.html +++ /dev/null @@ -1,58 +0,0 @@ -<!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> diff --git a/dom/media/gtest/moz.build b/dom/media/gtest/moz.build index ae059962c..a7ea73807 100644 --- a/dom/media/gtest/moz.build +++ b/dom/media/gtest/moz.build @@ -28,11 +28,6 @@ UNIFIED_SOURCES += [ 'TestWebMBuffered.cpp', ] -if CONFIG['MOZ_EME']: - UNIFIED_SOURCES += [ - 'TestEME.cpp', - ] - if CONFIG['MOZ_WEBM_ENCODER']: UNIFIED_SOURCES += [ 'TestVideoTrackEncoder.cpp', diff --git a/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp b/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp index cc731d3e2..661b6cbd2 100644 --- a/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp +++ b/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp @@ -9,17 +9,6 @@ #include <limits> #include "gtest/gtest.h" -// Mock the MediaStream class -namespace mozilla { -class MediaStream -{ - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStream) -private: - ~MediaStream() { - }; -}; -} - using namespace mozilla; using namespace mozilla::dom; using std::numeric_limits; diff --git a/dom/plugins/test/mochitest/mochitest.ini b/dom/plugins/test/mochitest/mochitest.ini index 0e8587f34..64aefcd12 100644 --- a/dom/plugins/test/mochitest/mochitest.ini +++ b/dom/plugins/test/mochitest/mochitest.ini @@ -23,7 +23,6 @@ support-files = pluginstream.js post.sjs plugin-utils.js - !/toolkit/components/passwordmgr/test/authenticate.sjs [test_bug406541.html] [test_bug532208.html] diff --git a/dom/tests/mochitest/webcomponents/mochitest.ini b/dom/tests/mochitest/webcomponents/mochitest.ini index 84322d21d..428cc0e73 100644 --- a/dom/tests/mochitest/webcomponents/mochitest.ini +++ b/dom/tests/mochitest/webcomponents/mochitest.ini @@ -22,19 +22,14 @@ skip-if = true || stylo # disabled - See bug 1390396 and 1293844 [test_custom_element_when_defined.html] [test_custom_element_uncatchable_exception.html] skip-if = !debug # TestFunctions only applied in debug builds -[test_custom_element_define.html] -[test_custom_element_define_parser.html] -[test_custom_element_template.html] [test_detached_style.html] [test_document_adoptnode.html] [test_document_importnode.html] [test_document_register.html] [test_document_register_lifecycle.html] skip-if = true # disabled - See bug 1390396 -[test_document_register_parser.html] [test_document_register_stack.html] skip-if = true # disabled - See bug 1390396 -[test_document_shared_registry.html] [test_event_retarget.html] [test_event_stopping.html] [test_template.html] diff --git a/image/moz.build b/image/moz.build index 7e7e0fe70..9eed46d31 100644 --- a/image/moz.build +++ b/image/moz.build @@ -5,8 +5,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += ['build', 'decoders', 'encoders'] -if CONFIG['ENABLE_TESTS']: - DIRS += ['test/gtest'] with Files('**'): BUG_COMPONENT = ('Core', 'ImageLib') diff --git a/image/test/gtest/Common.cpp b/image/test/gtest/Common.cpp deleted file mode 100644 index 5a24bbb14..000000000 --- a/image/test/gtest/Common.cpp +++ /dev/null @@ -1,673 +0,0 @@ -/* -*- Mode: C++; 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/. */ - -#include "Common.h" - -#include <cstdlib> - -#include "nsDirectoryServiceDefs.h" -#include "nsIDirectoryService.h" -#include "nsIFile.h" -#include "nsIInputStream.h" -#include "nsIProperties.h" -#include "nsNetUtil.h" -#include "mozilla/RefPtr.h" -#include "nsStreamUtils.h" -#include "nsString.h" - -namespace mozilla { -namespace image { - -using namespace gfx; - -using std::abs; -using std::vector; - -/////////////////////////////////////////////////////////////////////////////// -// General Helpers -/////////////////////////////////////////////////////////////////////////////// - -// These macros work like gtest's ASSERT_* macros, except that they can be used -// in functions that return values. -#define ASSERT_TRUE_OR_RETURN(e, rv) \ - EXPECT_TRUE(e); \ - if (!(e)) { \ - return rv; \ - } - -#define ASSERT_EQ_OR_RETURN(a, b, rv) \ - EXPECT_EQ(a, b); \ - if ((a) != (b)) { \ - return rv; \ - } - -#define ASSERT_GE_OR_RETURN(a, b, rv) \ - EXPECT_GE(a, b); \ - if (!((a) >= (b))) { \ - return rv; \ - } - -#define ASSERT_LE_OR_RETURN(a, b, rv) \ - EXPECT_LE(a, b); \ - if (!((a) <= (b))) { \ - return rv; \ - } - -#define ASSERT_LT_OR_RETURN(a, b, rv) \ - EXPECT_LT(a, b); \ - if (!((a) < (b))) { \ - return rv; \ - } - -already_AddRefed<nsIInputStream> -LoadFile(const char* aRelativePath) -{ - nsresult rv; - - nsCOMPtr<nsIProperties> dirService = - do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID); - ASSERT_TRUE_OR_RETURN(dirService != nullptr, nullptr); - - // Retrieve the current working directory. - nsCOMPtr<nsIFile> file; - rv = dirService->Get(NS_OS_CURRENT_WORKING_DIR, - NS_GET_IID(nsIFile), getter_AddRefs(file)); - ASSERT_TRUE_OR_RETURN(NS_SUCCEEDED(rv), nullptr); - - // Construct the final path by appending the working path to the current - // working directory. - file->AppendNative(nsDependentCString(aRelativePath)); - - // Construct an input stream for the requested file. - nsCOMPtr<nsIInputStream> inputStream; - rv = NS_NewLocalFileInputStream(getter_AddRefs(inputStream), file); - ASSERT_TRUE_OR_RETURN(NS_SUCCEEDED(rv), nullptr); - - // Ensure the resulting input stream is buffered. - if (!NS_InputStreamIsBuffered(inputStream)) { - nsCOMPtr<nsIInputStream> bufStream; - rv = NS_NewBufferedInputStream(getter_AddRefs(bufStream), - inputStream, 1024); - ASSERT_TRUE_OR_RETURN(NS_SUCCEEDED(rv), nullptr); - inputStream = bufStream; - } - - return inputStream.forget(); -} - -bool -IsSolidColor(SourceSurface* aSurface, - BGRAColor aColor, - uint8_t aFuzz /* = 0 */) -{ - IntSize size = aSurface->GetSize(); - return RectIsSolidColor(aSurface, IntRect(0, 0, size.width, size.height), - aColor, aFuzz); -} - -bool -IsSolidPalettedColor(Decoder* aDecoder, uint8_t aColor) -{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - return PalettedRectIsSolidColor(aDecoder, currentFrame->GetRect(), aColor); -} - -bool -RowsAreSolidColor(SourceSurface* aSurface, - int32_t aStartRow, - int32_t aRowCount, - BGRAColor aColor, - uint8_t aFuzz /* = 0 */) -{ - IntSize size = aSurface->GetSize(); - return RectIsSolidColor(aSurface, IntRect(0, aStartRow, size.width, aRowCount), - aColor, aFuzz); -} - -bool -PalettedRowsAreSolidColor(Decoder* aDecoder, - int32_t aStartRow, - int32_t aRowCount, - uint8_t aColor) -{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - IntRect frameRect = currentFrame->GetRect(); - IntRect solidColorRect(frameRect.x, aStartRow, frameRect.width, aRowCount); - return PalettedRectIsSolidColor(aDecoder, solidColorRect, aColor); -} - -bool -RectIsSolidColor(SourceSurface* aSurface, - const IntRect& aRect, - BGRAColor aColor, - uint8_t aFuzz /* = 0 */) -{ - IntSize surfaceSize = aSurface->GetSize(); - IntRect rect = - aRect.Intersect(IntRect(0, 0, surfaceSize.width, surfaceSize.height)); - - RefPtr<DataSourceSurface> dataSurface = aSurface->GetDataSurface(); - ASSERT_TRUE_OR_RETURN(dataSurface != nullptr, false); - - ASSERT_EQ_OR_RETURN(dataSurface->Stride(), surfaceSize.width * 4, false); - - DataSourceSurface::ScopedMap mapping(dataSurface, - DataSourceSurface::MapType::READ); - ASSERT_TRUE_OR_RETURN(mapping.IsMapped(), false); - - uint8_t* data = dataSurface->GetData(); - ASSERT_TRUE_OR_RETURN(data != nullptr, false); - - int32_t rowLength = dataSurface->Stride(); - for (int32_t row = rect.y; row < rect.YMost(); ++row) { - for (int32_t col = rect.x; col < rect.XMost(); ++col) { - int32_t i = row * rowLength + col * 4; - if (aFuzz != 0) { - ASSERT_LE_OR_RETURN(abs(aColor.mBlue - data[i + 0]), aFuzz, false); - ASSERT_LE_OR_RETURN(abs(aColor.mGreen - data[i + 1]), aFuzz, false); - ASSERT_LE_OR_RETURN(abs(aColor.mRed - data[i + 2]), aFuzz, false); - ASSERT_LE_OR_RETURN(abs(aColor.mAlpha - data[i + 3]), aFuzz, false); - } else { - ASSERT_EQ_OR_RETURN(aColor.mBlue, data[i + 0], false); - ASSERT_EQ_OR_RETURN(aColor.mGreen, data[i + 1], false); - ASSERT_EQ_OR_RETURN(aColor.mRed, data[i + 2], false); - ASSERT_EQ_OR_RETURN(aColor.mAlpha, data[i + 3], false); - } - } - } - - return true; -} - -bool -PalettedRectIsSolidColor(Decoder* aDecoder, const IntRect& aRect, uint8_t aColor) -{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - uint8_t* imageData; - uint32_t imageLength; - currentFrame->GetImageData(&imageData, &imageLength); - ASSERT_TRUE_OR_RETURN(imageData, false); - - // Clamp to the frame rect. If any pixels outside the frame rect are included, - // we immediately fail, because such pixels don't have any "color" in the - // sense this function measures - they're transparent, and that doesn't - // necessarily correspond to any color palette index at all. - IntRect frameRect = currentFrame->GetRect(); - ASSERT_EQ_OR_RETURN(imageLength, uint32_t(frameRect.Area()), false); - IntRect rect = aRect.Intersect(frameRect); - ASSERT_EQ_OR_RETURN(rect.Area(), aRect.Area(), false); - - // Translate |rect| by |frameRect.TopLeft()| to reflect the fact that the - // frame rect's offset doesn't actually mean anything in terms of the - // in-memory representation of the surface. The image data starts at the upper - // left corner of the frame rect, in other words. - rect -= frameRect.TopLeft(); - - // Walk through the image data and make sure that the entire rect has the - // palette index |aColor|. - int32_t rowLength = frameRect.width; - for (int32_t row = rect.y; row < rect.YMost(); ++row) { - for (int32_t col = rect.x; col < rect.XMost(); ++col) { - int32_t i = row * rowLength + col; - ASSERT_EQ_OR_RETURN(aColor, imageData[i], false); - } - } - - return true; -} - -bool -RowHasPixels(SourceSurface* aSurface, - int32_t aRow, - const vector<BGRAColor>& aPixels) -{ - ASSERT_GE_OR_RETURN(aRow, 0, false); - - IntSize surfaceSize = aSurface->GetSize(); - ASSERT_EQ_OR_RETURN(aPixels.size(), size_t(surfaceSize.width), false); - ASSERT_LT_OR_RETURN(aRow, surfaceSize.height, false); - - RefPtr<DataSourceSurface> dataSurface = aSurface->GetDataSurface(); - ASSERT_TRUE_OR_RETURN(dataSurface, false); - - ASSERT_EQ_OR_RETURN(dataSurface->Stride(), surfaceSize.width * 4, false); - - DataSourceSurface::ScopedMap mapping(dataSurface, - DataSourceSurface::MapType::READ); - ASSERT_TRUE_OR_RETURN(mapping.IsMapped(), false); - - uint8_t* data = dataSurface->GetData(); - ASSERT_TRUE_OR_RETURN(data != nullptr, false); - - int32_t rowLength = dataSurface->Stride(); - for (int32_t col = 0; col < surfaceSize.width; ++col) { - int32_t i = aRow * rowLength + col * 4; - ASSERT_EQ_OR_RETURN(aPixels[col].mBlue, data[i + 0], false); - ASSERT_EQ_OR_RETURN(aPixels[col].mGreen, data[i + 1], false); - ASSERT_EQ_OR_RETURN(aPixels[col].mRed, data[i + 2], false); - ASSERT_EQ_OR_RETURN(aPixels[col].mAlpha, data[i + 3], false); - } - - return true; -} - - -/////////////////////////////////////////////////////////////////////////////// -// SurfacePipe Helpers -/////////////////////////////////////////////////////////////////////////////// - -already_AddRefed<Decoder> -CreateTrivialDecoder() -{ - gfxPrefs::GetSingleton(); - DecoderType decoderType = DecoderFactory::GetDecoderType("image/gif"); - NotNull<RefPtr<SourceBuffer>> sourceBuffer = WrapNotNull(new SourceBuffer()); - RefPtr<Decoder> decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, Nothing(), - DefaultSurfaceFlags()); - return decoder.forget(); -} - -void -AssertCorrectPipelineFinalState(SurfaceFilter* aFilter, - const gfx::IntRect& aInputSpaceRect, - const gfx::IntRect& aOutputSpaceRect) -{ - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(aInputSpaceRect, invalidRect->mInputSpaceRect); - EXPECT_EQ(aOutputSpaceRect, invalidRect->mOutputSpaceRect); -} - -void -CheckGeneratedImage(Decoder* aDecoder, - const IntRect& aRect, - uint8_t aFuzz /* = 0 */) -{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - const IntSize surfaceSize = surface->GetSize(); - - // This diagram shows how the surface is divided into regions that the code - // below tests for the correct content. The output rect is the bounds of the - // region labeled 'C'. - // - // +---------------------------+ - // | A | - // +---------+--------+--------+ - // | B | C | D | - // +---------+--------+--------+ - // | E | - // +---------------------------+ - - // Check that the output rect itself is green. (Region 'C'.) - EXPECT_TRUE(RectIsSolidColor(surface, aRect, BGRAColor::Green(), aFuzz)); - - // Check that the area above the output rect is transparent. (Region 'A'.) - EXPECT_TRUE(RectIsSolidColor(surface, - IntRect(0, 0, surfaceSize.width, aRect.y), - BGRAColor::Transparent(), aFuzz)); - - // Check that the area to the left of the output rect is transparent. (Region 'B'.) - EXPECT_TRUE(RectIsSolidColor(surface, - IntRect(0, aRect.y, aRect.x, aRect.YMost()), - BGRAColor::Transparent(), aFuzz)); - - // Check that the area to the right of the output rect is transparent. (Region 'D'.) - const int32_t widthOnRight = surfaceSize.width - aRect.XMost(); - EXPECT_TRUE(RectIsSolidColor(surface, - IntRect(aRect.XMost(), aRect.y, widthOnRight, aRect.YMost()), - BGRAColor::Transparent(), aFuzz)); - - // Check that the area below the output rect is transparent. (Region 'E'.) - const int32_t heightBelow = surfaceSize.height - aRect.YMost(); - EXPECT_TRUE(RectIsSolidColor(surface, - IntRect(0, aRect.YMost(), surfaceSize.width, heightBelow), - BGRAColor::Transparent(), aFuzz)); -} - -void -CheckGeneratedPalettedImage(Decoder* aDecoder, const IntRect& aRect) -{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - IntSize imageSize = currentFrame->GetImageSize(); - - // This diagram shows how the surface is divided into regions that the code - // below tests for the correct content. The output rect is the bounds of the - // region labeled 'C'. - // - // +---------------------------+ - // | A | - // +---------+--------+--------+ - // | B | C | D | - // +---------+--------+--------+ - // | E | - // +---------------------------+ - - // Check that the output rect itself is all 255's. (Region 'C'.) - EXPECT_TRUE(PalettedRectIsSolidColor(aDecoder, aRect, 255)); - - // Check that the area above the output rect is all 0's. (Region 'A'.) - EXPECT_TRUE(PalettedRectIsSolidColor(aDecoder, - IntRect(0, 0, imageSize.width, aRect.y), - 0)); - - // Check that the area to the left of the output rect is all 0's. (Region 'B'.) - EXPECT_TRUE(PalettedRectIsSolidColor(aDecoder, - IntRect(0, aRect.y, aRect.x, aRect.YMost()), - 0)); - - // Check that the area to the right of the output rect is all 0's. (Region 'D'.) - const int32_t widthOnRight = imageSize.width - aRect.XMost(); - EXPECT_TRUE(PalettedRectIsSolidColor(aDecoder, - IntRect(aRect.XMost(), aRect.y, widthOnRight, aRect.YMost()), - 0)); - - // Check that the area below the output rect is transparent. (Region 'E'.) - const int32_t heightBelow = imageSize.height - aRect.YMost(); - EXPECT_TRUE(PalettedRectIsSolidColor(aDecoder, - IntRect(0, aRect.YMost(), imageSize.width, heightBelow), - 0)); -} - -void -CheckWritePixels(Decoder* aDecoder, - SurfaceFilter* aFilter, - Maybe<IntRect> aOutputRect /* = Nothing() */, - Maybe<IntRect> aInputRect /* = Nothing() */, - Maybe<IntRect> aInputWriteRect /* = Nothing() */, - Maybe<IntRect> aOutputWriteRect /* = Nothing() */, - uint8_t aFuzz /* = 0 */) -{ - IntRect outputRect = aOutputRect.valueOr(IntRect(0, 0, 100, 100)); - IntRect inputRect = aInputRect.valueOr(IntRect(0, 0, 100, 100)); - IntRect inputWriteRect = aInputWriteRect.valueOr(inputRect); - IntRect outputWriteRect = aOutputWriteRect.valueOr(outputRect); - - // Fill the image. - int32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&] { - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(inputWriteRect.width * inputWriteRect.height, count); - - AssertCorrectPipelineFinalState(aFilter, inputRect, outputRect); - - // Attempt to write more data and make sure nothing changes. - const int32_t oldCount = count; - result = aFilter->WritePixels<uint32_t>([&] { - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(oldCount, count); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Attempt to advance to the next row and make sure nothing changes. - aFilter->AdvanceRow(); - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that the generated image is correct. - CheckGeneratedImage(aDecoder, outputWriteRect, aFuzz); -} - -void -CheckPalettedWritePixels(Decoder* aDecoder, - SurfaceFilter* aFilter, - Maybe<IntRect> aOutputRect /* = Nothing() */, - Maybe<IntRect> aInputRect /* = Nothing() */, - Maybe<IntRect> aInputWriteRect /* = Nothing() */, - Maybe<IntRect> aOutputWriteRect /* = Nothing() */, - uint8_t aFuzz /* = 0 */) -{ - IntRect outputRect = aOutputRect.valueOr(IntRect(0, 0, 100, 100)); - IntRect inputRect = aInputRect.valueOr(IntRect(0, 0, 100, 100)); - IntRect inputWriteRect = aInputWriteRect.valueOr(inputRect); - IntRect outputWriteRect = aOutputWriteRect.valueOr(outputRect); - - // Fill the image. - int32_t count = 0; - auto result = aFilter->WritePixels<uint8_t>([&] { - ++count; - return AsVariant(uint8_t(255)); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(inputWriteRect.width * inputWriteRect.height, count); - - AssertCorrectPipelineFinalState(aFilter, inputRect, outputRect); - - // Attempt to write more data and make sure nothing changes. - const int32_t oldCount = count; - result = aFilter->WritePixels<uint8_t>([&] { - ++count; - return AsVariant(uint8_t(255)); - }); - EXPECT_EQ(oldCount, count); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Attempt to advance to the next row and make sure nothing changes. - aFilter->AdvanceRow(); - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - uint8_t* imageData; - uint32_t imageLength; - currentFrame->GetImageData(&imageData, &imageLength); - ASSERT_TRUE(imageData != nullptr); - ASSERT_EQ(outputWriteRect.width * outputWriteRect.height, int32_t(imageLength)); - for (uint32_t i = 0; i < imageLength; ++i) { - ASSERT_EQ(uint8_t(255), imageData[i]); - } -} - - -/////////////////////////////////////////////////////////////////////////////// -// Test Data -/////////////////////////////////////////////////////////////////////////////// - -ImageTestCase GreenPNGTestCase() -{ - return ImageTestCase("green.png", "image/png", IntSize(100, 100)); -} - -ImageTestCase GreenGIFTestCase() -{ - return ImageTestCase("green.gif", "image/gif", IntSize(100, 100)); -} - -ImageTestCase GreenJPGTestCase() -{ - return ImageTestCase("green.jpg", "image/jpeg", IntSize(100, 100), - TEST_CASE_IS_FUZZY); -} - -ImageTestCase GreenBMPTestCase() -{ - return ImageTestCase("green.bmp", "image/bmp", IntSize(100, 100)); -} - -ImageTestCase GreenICOTestCase() -{ - // This ICO contains a 32-bit BMP, and we use a BMP's alpha data by default - // when the BMP is embedded in an ICO, so it's transparent. - return ImageTestCase("green.ico", "image/x-icon", IntSize(100, 100), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase GreenIconTestCase() -{ - return ImageTestCase("green.icon", "image/icon", IntSize(100, 100), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase GreenFirstFrameAnimatedGIFTestCase() -{ - return ImageTestCase("first-frame-green.gif", "image/gif", IntSize(100, 100), - TEST_CASE_IS_ANIMATED); -} - -ImageTestCase GreenFirstFrameAnimatedPNGTestCase() -{ - return ImageTestCase("first-frame-green.png", "image/png", IntSize(100, 100), - TEST_CASE_IS_TRANSPARENT | TEST_CASE_IS_ANIMATED); -} - -ImageTestCase CorruptTestCase() -{ - return ImageTestCase("corrupt.jpg", "image/jpeg", IntSize(100, 100), - TEST_CASE_HAS_ERROR); -} - -ImageTestCase CorruptBMPWithTruncatedHeader() -{ - // This BMP has a header which is truncated right between the BIH and the - // bitfields, which is a particularly error-prone place w.r.t. the BMP decoder - // state machine. - return ImageTestCase("invalid-truncated-metadata.bmp", "image/bmp", - IntSize(100, 100), TEST_CASE_HAS_ERROR); -} - -ImageTestCase CorruptICOWithBadBMPWidthTestCase() -{ - // This ICO contains a BMP icon which has a width that doesn't match the size - // listed in the corresponding ICO directory entry. - return ImageTestCase("corrupt-with-bad-bmp-width.ico", "image/x-icon", - IntSize(100, 100), TEST_CASE_HAS_ERROR); -} - -ImageTestCase CorruptICOWithBadBMPHeightTestCase() -{ - // This ICO contains a BMP icon which has a height that doesn't match the size - // listed in the corresponding ICO directory entry. - return ImageTestCase("corrupt-with-bad-bmp-height.ico", "image/x-icon", - IntSize(100, 100), TEST_CASE_HAS_ERROR); -} - -ImageTestCase TransparentPNGTestCase() -{ - return ImageTestCase("transparent.png", "image/png", IntSize(32, 32), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase TransparentGIFTestCase() -{ - return ImageTestCase("transparent.gif", "image/gif", IntSize(16, 16), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase FirstFramePaddingGIFTestCase() -{ - return ImageTestCase("transparent.gif", "image/gif", IntSize(16, 16), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase TransparentIfWithinICOBMPTestCase(TestCaseFlags aFlags) -{ - // This is a BMP that is only transparent when decoded as if it is within an - // ICO file. (Note: aFlags needs to be set to TEST_CASE_DEFAULT_FLAGS or - // TEST_CASE_IS_TRANSPARENT accordingly.) - return ImageTestCase("transparent-if-within-ico.bmp", "image/bmp", - IntSize(32, 32), aFlags); -} - -ImageTestCase RLE4BMPTestCase() -{ - return ImageTestCase("rle4.bmp", "image/bmp", IntSize(320, 240), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase RLE8BMPTestCase() -{ - return ImageTestCase("rle8.bmp", "image/bmp", IntSize(32, 32), - TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase NoFrameDelayGIFTestCase() -{ - // This is an invalid (or at least, questionably valid) GIF that's animated - // even though it specifies a frame delay of zero. It's animated, but it's not - // marked TEST_CASE_IS_ANIMATED because the metadata decoder can't detect that - // it's animated. - return ImageTestCase("no-frame-delay.gif", "image/gif", IntSize(100, 100)); -} - -ImageTestCase ExtraImageSubBlocksAnimatedGIFTestCase() -{ - // This is a corrupt GIF that has extra image sub blocks between the first and - // second frame. - return ImageTestCase("animated-with-extra-image-sub-blocks.gif", "image/gif", - IntSize(100, 100)); -} - -ImageTestCase DownscaledPNGTestCase() -{ - // This testcase (and all the other "downscaled") testcases) consists of 25 - // lines of green, followed by 25 lines of red, followed by 25 lines of green, - // followed by 25 more lines of red. It's intended that tests downscale it - // from 100x100 to 20x20, so we specify a 20x20 output size. - return ImageTestCase("downscaled.png", "image/png", IntSize(100, 100), - IntSize(20, 20)); -} - -ImageTestCase DownscaledGIFTestCase() -{ - return ImageTestCase("downscaled.gif", "image/gif", IntSize(100, 100), - IntSize(20, 20)); -} - -ImageTestCase DownscaledJPGTestCase() -{ - return ImageTestCase("downscaled.jpg", "image/jpeg", IntSize(100, 100), - IntSize(20, 20)); -} - -ImageTestCase DownscaledBMPTestCase() -{ - return ImageTestCase("downscaled.bmp", "image/bmp", IntSize(100, 100), - IntSize(20, 20)); -} - -ImageTestCase DownscaledICOTestCase() -{ - return ImageTestCase("downscaled.ico", "image/x-icon", IntSize(100, 100), - IntSize(20, 20), TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase DownscaledIconTestCase() -{ - return ImageTestCase("downscaled.icon", "image/icon", IntSize(100, 100), - IntSize(20, 20), TEST_CASE_IS_TRANSPARENT); -} - -ImageTestCase DownscaledTransparentICOWithANDMaskTestCase() -{ - // This test case is an ICO with AND mask transparency. We want to ensure that - // we can downscale it without crashing or triggering ASAN failures, but its - // content isn't simple to verify, so for now we don't check the output. - return ImageTestCase("transparent-ico-with-and-mask.ico", "image/x-icon", - IntSize(32, 32), IntSize(20, 20), - TEST_CASE_IS_TRANSPARENT | TEST_CASE_IGNORE_OUTPUT); -} - -ImageTestCase TruncatedSmallGIFTestCase() -{ - return ImageTestCase("green-1x1-truncated.gif", "image/gif", IntSize(1, 1)); -} - -} // namespace image -} // namespace mozilla diff --git a/image/test/gtest/Common.h b/image/test/gtest/Common.h deleted file mode 100644 index 0c288cddc..000000000 --- a/image/test/gtest/Common.h +++ /dev/null @@ -1,419 +0,0 @@ -/* -*- Mode: C++; 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/. */ - -#ifndef mozilla_image_test_gtest_Common_h -#define mozilla_image_test_gtest_Common_h - -#include <vector> - -#include "gtest/gtest.h" - -#include "mozilla/Maybe.h" -#include "mozilla/UniquePtr.h" -#include "mozilla/gfx/2D.h" -#include "Decoder.h" -#include "gfxColor.h" -#include "imgITools.h" -#include "nsCOMPtr.h" -#include "SurfacePipe.h" -#include "SurfacePipeFactory.h" - -class nsIInputStream; - -namespace mozilla { -namespace image { - -/////////////////////////////////////////////////////////////////////////////// -// Types -/////////////////////////////////////////////////////////////////////////////// - -enum TestCaseFlags -{ - TEST_CASE_DEFAULT_FLAGS = 0, - TEST_CASE_IS_FUZZY = 1 << 0, - TEST_CASE_HAS_ERROR = 1 << 1, - TEST_CASE_IS_TRANSPARENT = 1 << 2, - TEST_CASE_IS_ANIMATED = 1 << 3, - TEST_CASE_IGNORE_OUTPUT = 1 << 4, -}; - -struct ImageTestCase -{ - ImageTestCase(const char* aPath, - const char* aMimeType, - gfx::IntSize aSize, - uint32_t aFlags = TEST_CASE_DEFAULT_FLAGS) - : mPath(aPath) - , mMimeType(aMimeType) - , mSize(aSize) - , mOutputSize(aSize) - , mFlags(aFlags) - { } - - ImageTestCase(const char* aPath, - const char* aMimeType, - gfx::IntSize aSize, - gfx::IntSize aOutputSize, - uint32_t aFlags = TEST_CASE_DEFAULT_FLAGS) - : mPath(aPath) - , mMimeType(aMimeType) - , mSize(aSize) - , mOutputSize(aOutputSize) - , mFlags(aFlags) - { } - - const char* mPath; - const char* mMimeType; - gfx::IntSize mSize; - gfx::IntSize mOutputSize; - uint32_t mFlags; -}; - -struct BGRAColor -{ - BGRAColor() : BGRAColor(0, 0, 0, 0) { } - - BGRAColor(uint8_t aBlue, uint8_t aGreen, uint8_t aRed, uint8_t aAlpha) - : mBlue(aBlue) - , mGreen(aGreen) - , mRed(aRed) - , mAlpha(aAlpha) - { } - - static BGRAColor Green() { return BGRAColor(0x00, 0xFF, 0x00, 0xFF); } - static BGRAColor Red() { return BGRAColor(0x00, 0x00, 0xFF, 0xFF); } - static BGRAColor Blue() { return BGRAColor(0xFF, 0x00, 0x00, 0xFF); } - static BGRAColor Transparent() { return BGRAColor(0x00, 0x00, 0x00, 0x00); } - - uint32_t AsPixel() const { return gfxPackedPixel(mAlpha, mRed, mGreen, mBlue); } - - uint8_t mBlue; - uint8_t mGreen; - uint8_t mRed; - uint8_t mAlpha; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// General Helpers -/////////////////////////////////////////////////////////////////////////////// - -/** - * A RAII class that ensure that ImageLib services are available. Any tests that - * require ImageLib to be initialized (for example, any test that uses the - * SurfaceCache; see image::EnsureModuleInitialized() for the full list) can - * use this class to ensure that ImageLib services are available. Failure to do - * so can result in strange, non-deterministic failures. - */ -struct AutoInitializeImageLib -{ - AutoInitializeImageLib() - { - // Ensure that ImageLib services are initialized. - nsCOMPtr<imgITools> imgTools = do_CreateInstance("@mozilla.org/image/tools;1"); - EXPECT_TRUE(imgTools != nullptr); - } -}; - -/// Loads a file from the current directory. @return an nsIInputStream for it. -already_AddRefed<nsIInputStream> LoadFile(const char* aRelativePath); - -/** - * @returns true if every pixel of @aSurface is @aColor. - * - * If @aFuzz is nonzero, a tolerance of @aFuzz is allowed in each color - * component. This may be necessary for tests that involve JPEG images or - * downscaling. - */ -bool IsSolidColor(gfx::SourceSurface* aSurface, - BGRAColor aColor, - uint8_t aFuzz = 0); - -/** - * @returns true if every pixel of @aDecoder's surface has the palette index - * specified by @aColor. - */ -bool IsSolidPalettedColor(Decoder* aDecoder, uint8_t aColor); - -/** - * @returns true if every pixel in the range of rows specified by @aStartRow and - * @aRowCount of @aSurface is @aColor. - * - * If @aFuzz is nonzero, a tolerance of @aFuzz is allowed in each color - * component. This may be necessary for tests that involve JPEG images or - * downscaling. - */ -bool RowsAreSolidColor(gfx::SourceSurface* aSurface, - int32_t aStartRow, - int32_t aRowCount, - BGRAColor aColor, - uint8_t aFuzz = 0); - -/** - * @returns true if every pixel in the range of rows specified by @aStartRow and - * @aRowCount of @aDecoder's surface has the palette index specified by @aColor. - */ -bool PalettedRowsAreSolidColor(Decoder* aDecoder, - int32_t aStartRow, - int32_t aRowCount, - uint8_t aColor); - -/** - * @returns true if every pixel in the rect specified by @aRect is @aColor. - * - * If @aFuzz is nonzero, a tolerance of @aFuzz is allowed in each color - * component. This may be necessary for tests that involve JPEG images or - * downscaling. - */ -bool RectIsSolidColor(gfx::SourceSurface* aSurface, - const gfx::IntRect& aRect, - BGRAColor aColor, - uint8_t aFuzz = 0); - -/** - * @returns true if every pixel in the rect specified by @aRect has the palette - * index specified by @aColor. - */ -bool PalettedRectIsSolidColor(Decoder* aDecoder, - const gfx::IntRect& aRect, - uint8_t aColor); - -/** - * @returns true if the pixels in @aRow of @aSurface match the pixels given in - * @aPixels. - */ -bool RowHasPixels(gfx::SourceSurface* aSurface, - int32_t aRow, - const std::vector<BGRAColor>& aPixels); - -// ExpectNoResume is an IResumable implementation for use by tests that expect -// Resume() to never get called. -class ExpectNoResume final : public IResumable -{ -public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ExpectNoResume, override) - - void Resume() override { FAIL() << "Resume() should not get called"; } - -private: - ~ExpectNoResume() override { } -}; - -// CountResumes is an IResumable implementation for use by tests that expect -// Resume() to get called a certain number of times. -class CountResumes : public IResumable -{ -public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CountResumes, override) - - CountResumes() : mCount(0) { } - - void Resume() override { mCount++; } - uint32_t Count() const { return mCount; } - -private: - ~CountResumes() override { } - - uint32_t mCount; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// SurfacePipe Helpers -/////////////////////////////////////////////////////////////////////////////// - -/** - * Creates a decoder with no data associated with, suitable for testing code - * that requires a decoder to initialize or to allocate surfaces but doesn't - * actually need the decoder to do any decoding. - * - * XXX(seth): We only need this because SurfaceSink and PalettedSurfaceSink - * defer to the decoder for surface allocation. Once all decoders use - * SurfacePipe we won't need to do that anymore and we can remove this function. - */ -already_AddRefed<Decoder> CreateTrivialDecoder(); - -/** - * Creates a pipeline of SurfaceFilters from a list of Config structs and passes - * it to the provided lambda @aFunc. Assertions that the pipeline is constructly - * correctly and cleanup of any allocated surfaces is handled automatically. - * - * @param aDecoder The decoder to use for allocating surfaces. - * @param aFunc The lambda function to pass the filter pipeline to. - * @param aConfigs The configuration for the pipeline. - */ -template <typename Func, typename... Configs> -void WithFilterPipeline(Decoder* aDecoder, Func aFunc, const Configs&... aConfigs) -{ - auto pipe = MakeUnique<typename detail::FilterPipeline<Configs...>::Type>(); - nsresult rv = pipe->Configure(aConfigs...); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - aFunc(aDecoder, pipe.get()); - - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - if (currentFrame) { - currentFrame->Finish(); - } -} - -/** - * Creates a pipeline of SurfaceFilters from a list of Config structs and - * asserts that configuring it fails. Cleanup of any allocated surfaces is - * handled automatically. - * - * @param aDecoder The decoder to use for allocating surfaces. - * @param aConfigs The configuration for the pipeline. - */ -template <typename... Configs> -void AssertConfiguringPipelineFails(Decoder* aDecoder, const Configs&... aConfigs) -{ - auto pipe = MakeUnique<typename detail::FilterPipeline<Configs...>::Type>(); - nsresult rv = pipe->Configure(aConfigs...); - - // Callers expect configuring the pipeline to fail. - ASSERT_TRUE(NS_FAILED(rv)); - - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - if (currentFrame) { - currentFrame->Finish(); - } -} - -/** - * Asserts that the provided filter pipeline is in the correct final state, - * which is to say, the entire surface has been written to (IsSurfaceFinished() - * returns true) and the invalid rects are as expected. - * - * @param aFilter The filter pipeline to check. - * @param aInputSpaceRect The expect invalid rect, in input space. - * @param aoutputSpaceRect The expect invalid rect, in output space. - */ -void AssertCorrectPipelineFinalState(SurfaceFilter* aFilter, - const gfx::IntRect& aInputSpaceRect, - const gfx::IntRect& aOutputSpaceRect); - -/** - * Checks a generated image for correctness. Reports any unexpected deviation - * from the expected image as GTest failures. - * - * @param aDecoder The decoder which contains the image. The decoder's current - * frame will be checked. - * @param aRect The region in the space of the output surface that the filter - * pipeline will actually write to. It's expected that pixels in - * this region are green, while pixels outside this region are - * transparent. - * @param aFuzz The amount of fuzz to use in pixel comparisons. - */ -void CheckGeneratedImage(Decoder* aDecoder, - const gfx::IntRect& aRect, - uint8_t aFuzz = 0); - -/** - * Checks a generated paletted image for correctness. Reports any unexpected - * deviation from the expected image as GTest failures. - * - * @param aDecoder The decoder which contains the image. The decoder's current - * frame will be checked. - * @param aRect The region in the space of the output surface that the filter - * pipeline will actually write to. It's expected that pixels in - * this region have a palette index of 255, while pixels outside - * this region have a palette index of 0. - */ -void CheckGeneratedPalettedImage(Decoder* aDecoder, const gfx::IntRect& aRect); - -/** - * Tests the result of calling WritePixels() using the provided SurfaceFilter - * pipeline. The pipeline must be a normal (i.e., non-paletted) pipeline. - * - * The arguments are specified in the an order intended to minimize the number - * of arguments that most test cases need to pass. - * - * @param aDecoder The decoder whose current frame will be written to. - * @param aFilter The SurfaceFilter pipeline to use. - * @param aOutputRect The region in the space of the output surface that will be - * invalidated by the filter pipeline. Defaults to - * (0, 0, 100, 100). - * @param aInputRect The region in the space of the input image that will be - * invalidated by the filter pipeline. Defaults to - * (0, 0, 100, 100). - * @param aInputWriteRect The region in the space of the input image that the - * filter pipeline will allow writes to. Note the - * difference from @aInputRect: @aInputRect is the actual - * region invalidated, while @aInputWriteRect is the - * region that is written to. These can differ in cases - * where the input is not clipped to the size of the image. - * Defaults to the entire input rect. - * @param aOutputWriteRect The region in the space of the output surface that - * the filter pipeline will actually write to. It's - * expected that pixels in this region are green, while - * pixels outside this region are transparent. Defaults - * to the entire output rect. - */ -void CheckWritePixels(Decoder* aDecoder, - SurfaceFilter* aFilter, - Maybe<gfx::IntRect> aOutputRect = Nothing(), - Maybe<gfx::IntRect> aInputRect = Nothing(), - Maybe<gfx::IntRect> aInputWriteRect = Nothing(), - Maybe<gfx::IntRect> aOutputWriteRect = Nothing(), - uint8_t aFuzz = 0); - -/** - * Tests the result of calling WritePixels() using the provided SurfaceFilter - * pipeline. The pipeline must be a paletted pipeline. - * @see CheckWritePixels() for documentation of the arguments. - */ -void CheckPalettedWritePixels(Decoder* aDecoder, - SurfaceFilter* aFilter, - Maybe<gfx::IntRect> aOutputRect = Nothing(), - Maybe<gfx::IntRect> aInputRect = Nothing(), - Maybe<gfx::IntRect> aInputWriteRect = Nothing(), - Maybe<gfx::IntRect> aOutputWriteRect = Nothing(), - uint8_t aFuzz = 0); - - -/////////////////////////////////////////////////////////////////////////////// -// Test Data -/////////////////////////////////////////////////////////////////////////////// - -ImageTestCase GreenPNGTestCase(); -ImageTestCase GreenGIFTestCase(); -ImageTestCase GreenJPGTestCase(); -ImageTestCase GreenBMPTestCase(); -ImageTestCase GreenICOTestCase(); -ImageTestCase GreenIconTestCase(); - -ImageTestCase GreenFirstFrameAnimatedGIFTestCase(); -ImageTestCase GreenFirstFrameAnimatedPNGTestCase(); - -ImageTestCase CorruptTestCase(); -ImageTestCase CorruptBMPWithTruncatedHeader(); -ImageTestCase CorruptICOWithBadBMPWidthTestCase(); -ImageTestCase CorruptICOWithBadBMPHeightTestCase(); - -ImageTestCase TransparentPNGTestCase(); -ImageTestCase TransparentGIFTestCase(); -ImageTestCase FirstFramePaddingGIFTestCase(); -ImageTestCase NoFrameDelayGIFTestCase(); -ImageTestCase ExtraImageSubBlocksAnimatedGIFTestCase(); - -ImageTestCase TransparentBMPWhenBMPAlphaEnabledTestCase(); -ImageTestCase RLE4BMPTestCase(); -ImageTestCase RLE8BMPTestCase(); - -ImageTestCase DownscaledPNGTestCase(); -ImageTestCase DownscaledGIFTestCase(); -ImageTestCase DownscaledJPGTestCase(); -ImageTestCase DownscaledBMPTestCase(); -ImageTestCase DownscaledICOTestCase(); -ImageTestCase DownscaledIconTestCase(); -ImageTestCase DownscaledTransparentICOWithANDMaskTestCase(); - -ImageTestCase TruncatedSmallGIFTestCase(); - -} // namespace image -} // namespace mozilla - -#endif // mozilla_image_test_gtest_Common_h diff --git a/image/test/gtest/TestADAM7InterpolatingFilter.cpp b/image/test/gtest/TestADAM7InterpolatingFilter.cpp deleted file mode 100644 index d11224251..000000000 --- a/image/test/gtest/TestADAM7InterpolatingFilter.cpp +++ /dev/null @@ -1,671 +0,0 @@ -/* -*- 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 <algorithm> -#include <vector> - -#include "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "mozilla/Maybe.h" -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfaceFilters.h" -#include "SurfacePipe.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -using std::generate; -using std::vector; - -template <typename Func> void -WithADAM7InterpolatingFilter(const IntSize& aSize, Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(bool(decoder)); - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - ADAM7InterpolatingConfig { }, - SurfaceConfig { decoder, aSize, - SurfaceFormat::B8G8R8A8, false }); -} - -void -AssertConfiguringADAM7InterpolatingFilterFails(const IntSize& aSize) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(bool(decoder)); - - AssertConfiguringPipelineFails(decoder, - ADAM7InterpolatingConfig { }, - SurfaceConfig { decoder, aSize, - SurfaceFormat::B8G8R8A8, false }); -} - -uint8_t -InterpolateByte(uint8_t aByteA, uint8_t aByteB, float aWeight) -{ - return uint8_t(aByteA * aWeight + aByteB * (1.0f - aWeight)); -} - -BGRAColor -InterpolateColors(BGRAColor aColor1, BGRAColor aColor2, float aWeight) -{ - return BGRAColor(InterpolateByte(aColor1.mBlue, aColor2.mBlue, aWeight), - InterpolateByte(aColor1.mGreen, aColor2.mGreen, aWeight), - InterpolateByte(aColor1.mRed, aColor2.mRed, aWeight), - InterpolateByte(aColor1.mAlpha, aColor2.mAlpha, aWeight)); -} - -enum class ShouldInterpolate -{ - eYes, - eNo -}; - -BGRAColor -HorizontallyInterpolatedPixel(uint32_t aCol, - uint32_t aWidth, - const vector<float>& aWeights, - ShouldInterpolate aShouldInterpolate, - const vector<BGRAColor>& aColors) -{ - // We cycle through the vector of weights forever. - float weight = aWeights[aCol % aWeights.size()]; - - // Find the columns of the two final pixels for this set of weights. - uint32_t finalPixel1 = aCol - aCol % aWeights.size(); - uint32_t finalPixel2 = finalPixel1 + aWeights.size(); - - // If |finalPixel2| is past the end of the row, that means that there is no - // final pixel after the pixel at |finalPixel1|. In that case, we just want to - // duplicate |finalPixel1|'s color until the end of the row. We can do that by - // setting |finalPixel2| equal to |finalPixel1| so that the interpolation has - // no effect. - if (finalPixel2 >= aWidth) { - finalPixel2 = finalPixel1; - } - - // We cycle through the vector of colors forever (subject to the above - // constraint about the end of the row). - BGRAColor color1 = aColors[finalPixel1 % aColors.size()]; - BGRAColor color2 = aColors[finalPixel2 % aColors.size()]; - - // If we're not interpolating, we treat all pixels which aren't final as - // transparent. Since the number of weights we have is equal to the stride - // between final pixels, we can check if |aCol| is a final pixel by checking - // whether |aCol| is a multiple of |aWeights.size()|. - if (aShouldInterpolate == ShouldInterpolate::eNo) { - return aCol % aWeights.size() == 0 ? color1 - : BGRAColor::Transparent(); - } - - // Interpolate. - return InterpolateColors(color1, color2, weight); -} - -vector<float>& -InterpolationWeights(int32_t aStride) -{ - // Precalculated interpolation weights. These are used to interpolate - // between final pixels or between important rows. Although no interpolation - // is actually applied to the previous final pixel or important row value, - // the arrays still start with 1.0f, which is always skipped, primarily - // because otherwise |stride1Weights| would have zero elements. - static vector<float> stride8Weights = - { 1.0f, 7 / 8.0f, 6 / 8.0f, 5 / 8.0f, 4 / 8.0f, 3 / 8.0f, 2 / 8.0f, 1 / 8.0f }; - static vector<float> stride4Weights = { 1.0f, 3 / 4.0f, 2 / 4.0f, 1 / 4.0f }; - static vector<float> stride2Weights = { 1.0f, 1 / 2.0f }; - static vector<float> stride1Weights = { 1.0f }; - - switch (aStride) { - case 8: return stride8Weights; - case 4: return stride4Weights; - case 2: return stride2Weights; - case 1: return stride1Weights; - default: - MOZ_CRASH(); - } -} - -int32_t -ImportantRowStride(uint8_t aPass) -{ - // The stride between important rows for each pass, with a dummy value for - // the nonexistent pass 0 and for pass 8, since the tests run an extra pass to - // make sure nothing breaks. - static int32_t strides[] = { 1, 8, 8, 4, 4, 2, 2, 1, 1 }; - - return strides[aPass]; -} - -size_t -FinalPixelStride(uint8_t aPass) -{ - // The stride between the final pixels in important rows for each pass, with - // a dummy value for the nonexistent pass 0 and for pass 8, since the tests - // run an extra pass to make sure nothing breaks. - static size_t strides[] = { 1, 8, 4, 4, 2, 2, 1, 1, 1 }; - - return strides[aPass]; -} - -bool -IsImportantRow(int32_t aRow, uint8_t aPass) -{ - return aRow % ImportantRowStride(aPass) == 0; -} - -/** - * ADAM7 breaks up the image into 8x8 blocks. On each of the 7 passes, a new - * set of pixels in each block receives their final values, according to the - * following pattern: - * - * 1 6 4 6 2 6 4 6 - * 7 7 7 7 7 7 7 7 - * 5 6 5 6 5 6 5 6 - * 7 7 7 7 7 7 7 7 - * 3 6 4 6 3 6 4 6 - * 7 7 7 7 7 7 7 7 - * 5 6 5 6 5 6 5 6 - * 7 7 7 7 7 7 7 7 - * - * This function produces a row of pixels @aWidth wide, suitable for testing - * horizontal interpolation on pass @aPass. The pattern of pixels used is - * determined by @aPass and @aRow, which determine which pixels are final - * according to the table above, and @aColors, from which the pixel values - * are selected. - * - * There are two different behaviors: if |eNo| is passed for - * @aShouldInterpolate, non-final pixels are treated as transparent. If |eNo| - * is passed, non-final pixels get interpolated in from the surrounding final - * pixels. The intention is that |eNo| is passed to generate input which will - * be run through ADAM7InterpolatingFilter, and |eYes| is passed to generate - * reference data to check that the filter is performing horizontal - * interpolation correctly. - * - * This function does not perform vertical interpolation. Rows which aren't on - * the current pass are filled with transparent pixels. - * - * @return a vector<BGRAColor> representing a row of pixels. - */ -vector<BGRAColor> -ADAM7HorizontallyInterpolatedRow(uint8_t aPass, - uint32_t aRow, - uint32_t aWidth, - ShouldInterpolate aShouldInterpolate, - const vector<BGRAColor>& aColors) -{ - EXPECT_GT(aPass, 0); - EXPECT_LE(aPass, 8); - EXPECT_GT(aColors.size(), 0u); - - vector<BGRAColor> result(aWidth); - - if (IsImportantRow(aRow, aPass)) { - vector<float>& weights = InterpolationWeights(FinalPixelStride(aPass)); - - // Compute the horizontally interpolated row. - uint32_t col = 0; - generate(result.begin(), result.end(), [&]{ - return HorizontallyInterpolatedPixel(col++, aWidth, weights, - aShouldInterpolate, aColors); - }); - } else { - // This is an unimportant row; just make the entire thing transparent. - generate(result.begin(), result.end(), []{ - return BGRAColor::Transparent(); - }); - } - - EXPECT_EQ(result.size(), size_t(aWidth)); - - return result; -} - -WriteState -WriteUninterpolatedPixels(SurfaceFilter* aFilter, - const IntSize& aSize, - uint8_t aPass, - const vector<BGRAColor>& aColors) -{ - WriteState result = WriteState::NEED_MORE_DATA; - - for (int32_t row = 0; row < aSize.height; ++row) { - // Compute uninterpolated pixels for this row. - vector<BGRAColor> pixels = - Move(ADAM7HorizontallyInterpolatedRow(aPass, row, aSize.width, - ShouldInterpolate::eNo, aColors)); - - // Write them to the surface. - auto pixelIterator = pixels.cbegin(); - result = aFilter->WritePixelsToRow<uint32_t>([&]{ - return AsVariant((*pixelIterator++).AsPixel()); - }); - - if (result != WriteState::NEED_MORE_DATA) { - break; - } - } - - return result; -} - -bool -CheckHorizontallyInterpolatedImage(Decoder* aDecoder, - const IntSize& aSize, - uint8_t aPass, - const vector<BGRAColor>& aColors) -{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (int32_t row = 0; row < aSize.height; ++row) { - if (!IsImportantRow(row, aPass)) { - continue; // Don't check rows which aren't important on this pass. - } - - // Compute the expected pixels, *with* interpolation to match what the - // filter should have done. - vector<BGRAColor> expectedPixels = - Move(ADAM7HorizontallyInterpolatedRow(aPass, row, aSize.width, - ShouldInterpolate::eYes, aColors)); - - if (!RowHasPixels(surface, row, expectedPixels)) { - return false; - } - } - - return true; -} - -void -CheckHorizontalInterpolation(const IntSize& aSize, - const vector<BGRAColor>& aColors) -{ - const IntRect surfaceRect(IntPoint(0, 0), aSize); - - WithADAM7InterpolatingFilter(aSize, - [&](Decoder* aDecoder, SurfaceFilter* aFilter) { - // We check horizontal interpolation behavior for each pass individually. In - // addition to the normal 7 passes that ADAM7 includes, we also check an - // eighth pass to verify that nothing breaks if extra data is written. - for (uint8_t pass = 1; pass <= 8; ++pass) { - // Write our color pattern to the surface. We don't perform any - // interpolation when writing to the filter so that we can check that the - // filter itself *does*. - WriteState result = - WriteUninterpolatedPixels(aFilter, aSize, pass, aColors); - - EXPECT_EQ(WriteState::FINISHED, result); - AssertCorrectPipelineFinalState(aFilter, surfaceRect, surfaceRect); - - // Check that the generated image matches the expected pattern, with - // interpolation applied. - EXPECT_TRUE(CheckHorizontallyInterpolatedImage(aDecoder, aSize, - pass, aColors)); - - // Prepare for the next pass. - aFilter->ResetToFirstRow(); - } - }); -} - -BGRAColor -ADAM7RowColor(int32_t aRow, - uint8_t aPass, - const vector<BGRAColor>& aColors) -{ - EXPECT_LT(0, aPass); - EXPECT_GE(8, aPass); - EXPECT_LT(0u, aColors.size()); - - // If this is an important row, select the color from the provided vector of - // colors, which we cycle through infinitely. If not, just fill the row with - // transparent pixels. - return IsImportantRow(aRow, aPass) ? aColors[aRow % aColors.size()] - : BGRAColor::Transparent(); -} - -WriteState -WriteRowColorPixels(SurfaceFilter* aFilter, - const IntSize& aSize, - uint8_t aPass, - const vector<BGRAColor>& aColors) -{ - WriteState result = WriteState::NEED_MORE_DATA; - - for (int32_t row = 0; row < aSize.height; ++row) { - const uint32_t color = ADAM7RowColor(row, aPass, aColors).AsPixel(); - - // Fill the surface with |color| pixels. - result = aFilter->WritePixelsToRow<uint32_t>([&]{ return AsVariant(color); }); - - if (result != WriteState::NEED_MORE_DATA) { - break; - } - } - - return result; -} - -bool -CheckVerticallyInterpolatedImage(Decoder* aDecoder, - const IntSize& aSize, - uint8_t aPass, - const vector<BGRAColor>& aColors) -{ - vector<float>& weights = InterpolationWeights(ImportantRowStride(aPass)); - - for (int32_t row = 0; row < aSize.height; ++row) { - // Vertically interpolation takes place between two important rows. The - // separation between the important rows is determined by the stride of this - // pass. When there is no "next" important row because we'd run off the - // bottom of the image, we use the same row for both. This matches - // ADAM7InterpolatingFilter's behavior of duplicating the last important row - // since there isn't another important row to vertically interpolate it - // with. - const int32_t stride = ImportantRowStride(aPass); - const int32_t prevImportantRow = row - row % stride; - const int32_t maybeNextImportantRow = prevImportantRow + stride; - const int32_t nextImportantRow = maybeNextImportantRow < aSize.height - ? maybeNextImportantRow - : prevImportantRow; - - // Retrieve the colors for the important rows we're going to interpolate. - const BGRAColor prevImportantRowColor = - ADAM7RowColor(prevImportantRow, aPass, aColors); - const BGRAColor nextImportantRowColor = - ADAM7RowColor(nextImportantRow, aPass, aColors); - - // The weight we'll use for interpolation is also determined by the stride. - // A row halfway between two important rows should have pixels that have a - // 50% contribution from each of the important rows, for example. - const float weight = weights[row % stride]; - const BGRAColor interpolatedColor = - InterpolateColors(prevImportantRowColor, nextImportantRowColor, weight); - - // Generate a row of expected pixels. Every pixel in the row is always the - // same color since we're only testing vertical interpolation between - // solid-colored rows. - vector<BGRAColor> expectedPixels(aSize.width); - generate(expectedPixels.begin(), expectedPixels.end(), [&]{ - return interpolatedColor; - }); - - // Check that the pixels match. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - if (!RowHasPixels(surface, row, expectedPixels)) { - return false; - } - } - - return true; -} - -void -CheckVerticalInterpolation(const IntSize& aSize, - const vector<BGRAColor>& aColors) -{ - const IntRect surfaceRect(IntPoint(0, 0), aSize); - - WithADAM7InterpolatingFilter(aSize, - [&](Decoder* aDecoder, SurfaceFilter* aFilter) { - for (uint8_t pass = 1; pass <= 8; ++pass) { - // Write a pattern of rows to the surface. Important rows will receive a - // color selected from |aColors|; unimportant rows will be transparent. - WriteState result = WriteRowColorPixels(aFilter, aSize, pass, aColors); - - EXPECT_EQ(WriteState::FINISHED, result); - AssertCorrectPipelineFinalState(aFilter, surfaceRect, surfaceRect); - - // Check that the generated image matches the expected pattern, with - // interpolation applied. - EXPECT_TRUE(CheckVerticallyInterpolatedImage(aDecoder, aSize, - pass, aColors)); - - // Prepare for the next pass. - aFilter->ResetToFirstRow(); - } - }); -} - -void -CheckInterpolation(const IntSize& aSize, const vector<BGRAColor>& aColors) -{ - CheckHorizontalInterpolation(aSize, aColors); - CheckVerticalInterpolation(aSize, aColors); -} - -void -CheckADAM7InterpolatingWritePixels(const IntSize& aSize) -{ - // This test writes 8 passes of green pixels (the seven ADAM7 passes, plus one - // extra to make sure nothing goes wrong if we write too much input) and verifies - // that the output is a solid green surface each time. Because all the pixels - // are the same color, interpolation doesn't matter; we test the correctness - // of the interpolation algorithm itself separately. - WithADAM7InterpolatingFilter(aSize, - [&](Decoder* aDecoder, SurfaceFilter* aFilter) { - IntRect rect(IntPoint(0, 0), aSize); - - for (int32_t pass = 1; pass <= 8; ++pass) { - // We only actually write up to the last important row for each pass, - // because that row unambiguously determines the remaining rows. - const int32_t lastRow = aSize.height - 1; - const int32_t lastImportantRow = - lastRow - (lastRow % ImportantRowStride(pass)); - const IntRect inputWriteRect(0, 0, aSize.width, lastImportantRow + 1); - - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(rect), - /* aInputRect = */ Some(rect), - /* aInputWriteRect = */ Some(inputWriteRect)); - - aFilter->ResetToFirstRow(); - EXPECT_FALSE(aFilter->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - } - }); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels100_100) -{ - CheckADAM7InterpolatingWritePixels(IntSize(100, 100)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels99_99) -{ - CheckADAM7InterpolatingWritePixels(IntSize(99, 99)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels66_33) -{ - CheckADAM7InterpolatingWritePixels(IntSize(66, 33)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels33_66) -{ - CheckADAM7InterpolatingWritePixels(IntSize(33, 66)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels15_15) -{ - CheckADAM7InterpolatingWritePixels(IntSize(15, 15)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels9_9) -{ - CheckADAM7InterpolatingWritePixels(IntSize(9, 9)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels8_8) -{ - CheckADAM7InterpolatingWritePixels(IntSize(8, 8)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels7_7) -{ - CheckADAM7InterpolatingWritePixels(IntSize(7, 7)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels3_3) -{ - CheckADAM7InterpolatingWritePixels(IntSize(3, 3)); -} - -TEST(ImageADAM7InterpolatingFilter, WritePixels1_1) -{ - CheckADAM7InterpolatingWritePixels(IntSize(1, 1)); -} - -TEST(ImageADAM7InterpolatingFilter, TrivialInterpolation48_48) -{ - CheckInterpolation(IntSize(48, 48), { BGRAColor::Green() }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput33_17) -{ - // We check interpolation using irregular patterns to make sure that the - // interpolation will look different for different passes. - CheckInterpolation(IntSize(33, 17), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue(), BGRAColor::Blue(), - BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Blue(), - BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput32_16) -{ - CheckInterpolation(IntSize(32, 16), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue(), BGRAColor::Blue(), - BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Blue(), - BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput31_15) -{ - CheckInterpolation(IntSize(31, 15), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue(), BGRAColor::Blue(), - BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Blue(), - BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput17_33) -{ - CheckInterpolation(IntSize(17, 33), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), - BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput16_32) -{ - CheckInterpolation(IntSize(16, 32), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), - BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput15_31) -{ - CheckInterpolation(IntSize(15, 31), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), - BGRAColor::Red(), BGRAColor::Green(), BGRAColor::Blue(), BGRAColor::Red(), - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput9_9) -{ - CheckInterpolation(IntSize(9, 9), { - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput8_8) -{ - CheckInterpolation(IntSize(8, 8), { - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput7_7) -{ - CheckInterpolation(IntSize(7, 7), { - BGRAColor::Blue(), BGRAColor::Blue(), BGRAColor::Red(), BGRAColor::Green(), - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Red(), BGRAColor::Blue() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput3_3) -{ - CheckInterpolation(IntSize(3, 3), { - BGRAColor::Green(), BGRAColor::Red(), BGRAColor::Blue(), BGRAColor::Red() - }); -} - -TEST(ImageADAM7InterpolatingFilter, InterpolationOutput1_1) -{ - CheckInterpolation(IntSize(1, 1), { BGRAColor::Blue() }); -} - -TEST(ImageADAM7InterpolatingFilter, ADAM7InterpolationFailsFor0_0) -{ - // A 0x0 input size is invalid, so configuration should fail. - AssertConfiguringADAM7InterpolatingFilterFails(IntSize(0, 0)); -} - -TEST(ImageADAM7InterpolatingFilter, ADAM7InterpolationFailsForMinus1_Minus1) -{ - // A negative input size is invalid, so configuration should fail. - AssertConfiguringADAM7InterpolatingFilterFails(IntSize(-1, -1)); -} - -TEST(ImageADAM7InterpolatingFilter, ConfiguringPalettedADAM7InterpolatingFilterFails) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // ADAM7InterpolatingFilter does not support paletted images, so configuration - // should fail. - AssertConfiguringPipelineFails(decoder, - ADAM7InterpolatingConfig { }, - PalettedSurfaceConfig { decoder, IntSize(100, 100), - IntRect(0, 0, 50, 50), - SurfaceFormat::B8G8R8A8, 8, - false }); -} diff --git a/image/test/gtest/TestCopyOnWrite.cpp b/image/test/gtest/TestCopyOnWrite.cpp deleted file mode 100644 index 0d420b672..000000000 --- a/image/test/gtest/TestCopyOnWrite.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/* 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 "gtest/gtest.h" - -#include "CopyOnWrite.h" - -using namespace mozilla; -using namespace mozilla::image; - -struct ValueStats -{ - int32_t mCopies = 0; - int32_t mFrees = 0; - int32_t mCalls = 0; - int32_t mConstCalls = 0; - int32_t mSerial = 0; -}; - -struct Value -{ - NS_INLINE_DECL_REFCOUNTING(Value) - - explicit Value(ValueStats& aStats) - : mStats(aStats) - , mSerial(mStats.mSerial++) - { } - - Value(const Value& aOther) - : mStats(aOther.mStats) - , mSerial(mStats.mSerial++) - { - mStats.mCopies++; - } - - void Go() { mStats.mCalls++; } - void Go() const { mStats.mConstCalls++; } - - int32_t Serial() const { return mSerial; } - -protected: - ~Value() { mStats.mFrees++; } - -private: - ValueStats& mStats; - int32_t mSerial; -}; - -TEST(ImageCopyOnWrite, Read) -{ - ValueStats stats; - - { - CopyOnWrite<Value> cow(new Value(stats)); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_TRUE(cow.CanRead()); - - cow.Read([&](const Value* aValue) { - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, aValue->Serial()); - EXPECT_TRUE(cow.CanRead()); - EXPECT_TRUE(cow.CanWrite()); - - aValue->Go(); - - EXPECT_EQ(0, stats.mCalls); - EXPECT_EQ(1, stats.mConstCalls); - }); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, stats.mCalls); - EXPECT_EQ(1, stats.mConstCalls); - } - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(1, stats.mFrees); -} - -TEST(ImageCopyOnWrite, RecursiveRead) -{ - ValueStats stats; - - { - CopyOnWrite<Value> cow(new Value(stats)); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_TRUE(cow.CanRead()); - - cow.Read([&](const Value* aValue) { - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, aValue->Serial()); - EXPECT_TRUE(cow.CanRead()); - EXPECT_TRUE(cow.CanWrite()); - - // Make sure that Read() inside a Read() succeeds. - cow.Read([&](const Value* aValue) { - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, aValue->Serial()); - EXPECT_TRUE(cow.CanRead()); - EXPECT_TRUE(cow.CanWrite()); - - aValue->Go(); - - EXPECT_EQ(0, stats.mCalls); - EXPECT_EQ(1, stats.mConstCalls); - }, []() { - // This gets called if we can't read. We shouldn't get here. - EXPECT_TRUE(false); - }); - }); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, stats.mCalls); - EXPECT_EQ(1, stats.mConstCalls); - } - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(1, stats.mFrees); -} - -TEST(ImageCopyOnWrite, Write) -{ - ValueStats stats; - - { - CopyOnWrite<Value> cow(new Value(stats)); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_TRUE(cow.CanRead()); - EXPECT_TRUE(cow.CanWrite()); - - cow.Write([&](Value* aValue) { - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, aValue->Serial()); - EXPECT_TRUE(!cow.CanRead()); - EXPECT_TRUE(!cow.CanWrite()); - - aValue->Go(); - - EXPECT_EQ(1, stats.mCalls); - EXPECT_EQ(0, stats.mConstCalls); - }); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(1, stats.mCalls); - EXPECT_EQ(0, stats.mConstCalls); - } - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(1, stats.mFrees); -} - -TEST(ImageCopyOnWrite, WriteRecursive) -{ - ValueStats stats; - - { - CopyOnWrite<Value> cow(new Value(stats)); - - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_TRUE(cow.CanRead()); - EXPECT_TRUE(cow.CanWrite()); - - cow.Read([&](const Value* aValue) { - EXPECT_EQ(0, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(0, aValue->Serial()); - EXPECT_TRUE(cow.CanRead()); - EXPECT_TRUE(cow.CanWrite()); - - // Make sure Write() inside a Read() succeeds. - cow.Write([&](Value* aValue) { - EXPECT_EQ(1, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(1, aValue->Serial()); - EXPECT_TRUE(!cow.CanRead()); - EXPECT_TRUE(!cow.CanWrite()); - - aValue->Go(); - - EXPECT_EQ(1, stats.mCalls); - EXPECT_EQ(0, stats.mConstCalls); - - // Make sure Read() inside a Write() fails. - cow.Read([](const Value* aValue) { - // This gets called if we can read. We shouldn't get here. - EXPECT_TRUE(false); - }, []() { - // This gets called if we can't read. We *should* get here. - EXPECT_TRUE(true); - }); - - // Make sure Write() inside a Write() fails. - cow.Write([](Value* aValue) { - // This gets called if we can write. We shouldn't get here. - EXPECT_TRUE(false); - }, []() { - // This gets called if we can't write. We *should* get here. - EXPECT_TRUE(true); - }); - }, []() { - // This gets called if we can't write. We shouldn't get here. - EXPECT_TRUE(false); - }); - - aValue->Go(); - - EXPECT_EQ(1, stats.mCopies); - EXPECT_EQ(0, stats.mFrees); - EXPECT_EQ(1, stats.mCalls); - EXPECT_EQ(1, stats.mConstCalls); - }); - - EXPECT_EQ(1, stats.mCopies); - EXPECT_EQ(1, stats.mFrees); - EXPECT_EQ(1, stats.mCalls); - EXPECT_EQ(1, stats.mConstCalls); - } - - EXPECT_EQ(1, stats.mCopies); - EXPECT_EQ(2, stats.mFrees); -} diff --git a/image/test/gtest/TestDecodeToSurface.cpp b/image/test/gtest/TestDecodeToSurface.cpp deleted file mode 100644 index bd52e7590..000000000 --- a/image/test/gtest/TestDecodeToSurface.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* 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 "gtest/gtest.h" - -#include "Common.h" -#include "imgIContainer.h" -#include "imgITools.h" -#include "ImageOps.h" -#include "mozilla/gfx/2D.h" -#include "nsComponentManagerUtils.h" -#include "nsCOMPtr.h" -#include "nsIInputStream.h" -#include "nsIRunnable.h" -#include "nsIThread.h" -#include "mozilla/RefPtr.h" -#include "nsString.h" -#include "nsThreadUtils.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -class DecodeToSurfaceRunnable : public Runnable -{ -public: - DecodeToSurfaceRunnable(RefPtr<SourceSurface>& aSurface, - nsIInputStream* aInputStream, - const ImageTestCase& aTestCase) - : mSurface(aSurface) - , mInputStream(aInputStream) - , mTestCase(aTestCase) - { } - - NS_IMETHOD Run() override - { - Go(); - return NS_OK; - } - - void Go() - { - mSurface = - ImageOps::DecodeToSurface(mInputStream, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT); - ASSERT_TRUE(mSurface != nullptr); - - EXPECT_EQ(SurfaceType::DATA, mSurface->GetType()); - EXPECT_TRUE(mSurface->GetFormat() == SurfaceFormat::B8G8R8X8 || - mSurface->GetFormat() == SurfaceFormat::B8G8R8A8); - EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); - - EXPECT_TRUE(IsSolidColor(mSurface, BGRAColor::Green(), - mTestCase.mFlags & TEST_CASE_IS_FUZZY ? 1 : 0)); - } - -private: - RefPtr<SourceSurface>& mSurface; - nsCOMPtr<nsIInputStream> mInputStream; - ImageTestCase mTestCase; -}; - -static void -RunDecodeToSurface(const ImageTestCase& aTestCase) -{ - nsCOMPtr<nsIInputStream> inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - nsCOMPtr<nsIThread> thread; - nsresult rv = NS_NewThread(getter_AddRefs(thread), nullptr); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // We run the DecodeToSurface tests off-main-thread to ensure that - // DecodeToSurface doesn't require any main-thread-only code. - RefPtr<SourceSurface> surface; - nsCOMPtr<nsIRunnable> runnable = - new DecodeToSurfaceRunnable(surface, inputStream, aTestCase); - thread->Dispatch(runnable, nsIThread::DISPATCH_SYNC); - - thread->Shutdown(); - - // Explicitly release the SourceSurface on the main thread. - surface = nullptr; -} - -class ImageDecodeToSurface : public ::testing::Test -{ -protected: - AutoInitializeImageLib mInit; -}; - -TEST_F(ImageDecodeToSurface, PNG) { RunDecodeToSurface(GreenPNGTestCase()); } -TEST_F(ImageDecodeToSurface, GIF) { RunDecodeToSurface(GreenGIFTestCase()); } -TEST_F(ImageDecodeToSurface, JPG) { RunDecodeToSurface(GreenJPGTestCase()); } -TEST_F(ImageDecodeToSurface, BMP) { RunDecodeToSurface(GreenBMPTestCase()); } -TEST_F(ImageDecodeToSurface, ICO) { RunDecodeToSurface(GreenICOTestCase()); } -TEST_F(ImageDecodeToSurface, Icon) { RunDecodeToSurface(GreenIconTestCase()); } - -TEST_F(ImageDecodeToSurface, AnimatedGIF) -{ - RunDecodeToSurface(GreenFirstFrameAnimatedGIFTestCase()); -} - -TEST_F(ImageDecodeToSurface, AnimatedPNG) -{ - RunDecodeToSurface(GreenFirstFrameAnimatedPNGTestCase()); -} - -TEST_F(ImageDecodeToSurface, Corrupt) -{ - ImageTestCase testCase = CorruptTestCase(); - - nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - RefPtr<SourceSurface> surface = - ImageOps::DecodeToSurface(inputStream, - nsDependentCString(testCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT); - EXPECT_TRUE(surface == nullptr); -} diff --git a/image/test/gtest/TestDecoders.cpp b/image/test/gtest/TestDecoders.cpp deleted file mode 100644 index 58caa77a2..000000000 --- a/image/test/gtest/TestDecoders.cpp +++ /dev/null @@ -1,669 +0,0 @@ -/* 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 "gtest/gtest.h" - -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "decoders/nsBMPDecoder.h" -#include "IDecodingTask.h" -#include "imgIContainer.h" -#include "imgITools.h" -#include "ImageFactory.h" -#include "mozilla/gfx/2D.h" -#include "nsComponentManagerUtils.h" -#include "nsCOMPtr.h" -#include "nsIInputStream.h" -#include "nsIRunnable.h" -#include "nsIThread.h" -#include "mozilla/RefPtr.h" -#include "nsStreamUtils.h" -#include "nsString.h" -#include "nsThreadUtils.h" -#include "ProgressTracker.h" -#include "SourceBuffer.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -static already_AddRefed<SourceSurface> -CheckDecoderState(const ImageTestCase& aTestCase, Decoder* aDecoder) -{ - EXPECT_TRUE(aDecoder->GetDecodeDone()); - EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_HAS_ERROR), - aDecoder->HasError()); - - // Verify that the decoder made the expected progress. - Progress progress = aDecoder->TakeProgress(); - EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_HAS_ERROR), - bool(progress & FLAG_HAS_ERROR)); - - if (aTestCase.mFlags & TEST_CASE_HAS_ERROR) { - return nullptr; // That's all we can check for bad images. - } - - EXPECT_TRUE(bool(progress & FLAG_SIZE_AVAILABLE)); - EXPECT_TRUE(bool(progress & FLAG_DECODE_COMPLETE)); - EXPECT_TRUE(bool(progress & FLAG_FRAME_COMPLETE)); - EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_IS_TRANSPARENT), - bool(progress & FLAG_HAS_TRANSPARENCY)); - EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_IS_ANIMATED), - bool(progress & FLAG_IS_ANIMATED)); - - // The decoder should get the correct size. - IntSize size = aDecoder->Size(); - EXPECT_EQ(aTestCase.mSize.width, size.width); - EXPECT_EQ(aTestCase.mSize.height, size.height); - - // Get the current frame, which is always the first frame of the image - // because CreateAnonymousDecoder() forces a first-frame-only decode. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - // Verify that the resulting surfaces matches our expectations. - EXPECT_EQ(SurfaceType::DATA, surface->GetType()); - EXPECT_TRUE(surface->GetFormat() == SurfaceFormat::B8G8R8X8 || - surface->GetFormat() == SurfaceFormat::B8G8R8A8); - EXPECT_EQ(aTestCase.mOutputSize, surface->GetSize()); - - return surface.forget(); -} - -static void -CheckDecoderResults(const ImageTestCase& aTestCase, Decoder* aDecoder) -{ - RefPtr<SourceSurface> surface = CheckDecoderState(aTestCase, aDecoder); - if (!surface) { - return; - } - - if (aTestCase.mFlags & TEST_CASE_IGNORE_OUTPUT) { - return; - } - - // Check the output. - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Green(), - aTestCase.mFlags & TEST_CASE_IS_FUZZY ? 1 : 0)); -} - -template <typename Func> -void WithSingleChunkDecode(const ImageTestCase& aTestCase, - const Maybe<IntSize>& aOutputSize, - Func aResultChecker) -{ - nsCOMPtr<nsIInputStream> inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into a SourceBuffer. - NotNull<RefPtr<SourceBuffer>> sourceBuffer = WrapNotNull(new SourceBuffer()); - sourceBuffer->ExpectLength(length); - rv = sourceBuffer->AppendFromInputStream(inputStream, length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - sourceBuffer->Complete(NS_OK); - - // Create a decoder. - DecoderType decoderType = - DecoderFactory::GetDecoderType(aTestCase.mMimeType); - RefPtr<Decoder> decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, aOutputSize, - DefaultSurfaceFlags()); - ASSERT_TRUE(decoder != nullptr); - RefPtr<IDecodingTask> task = new AnonymousDecodingTask(WrapNotNull(decoder)); - - // Run the full decoder synchronously. - task->Run(); - - // Call the lambda to verify the expected results. - aResultChecker(decoder); -} - -static void -CheckDecoderSingleChunk(const ImageTestCase& aTestCase) -{ - WithSingleChunkDecode(aTestCase, Nothing(), [&](Decoder* aDecoder) { - CheckDecoderResults(aTestCase, aDecoder); - }); -} - -static void -CheckDecoderMultiChunk(const ImageTestCase& aTestCase) -{ - nsCOMPtr<nsIInputStream> inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Create a SourceBuffer and a decoder. - NotNull<RefPtr<SourceBuffer>> sourceBuffer = WrapNotNull(new SourceBuffer()); - sourceBuffer->ExpectLength(length); - DecoderType decoderType = - DecoderFactory::GetDecoderType(aTestCase.mMimeType); - RefPtr<Decoder> decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, Nothing(), - DefaultSurfaceFlags()); - ASSERT_TRUE(decoder != nullptr); - RefPtr<IDecodingTask> task = new AnonymousDecodingTask(WrapNotNull(decoder)); - - for (uint64_t read = 0; read < length ; ++read) { - uint64_t available = 0; - rv = inputStream->Available(&available); - ASSERT_TRUE(available > 0); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - rv = sourceBuffer->AppendFromInputStream(inputStream, 1); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - task->Run(); - } - - sourceBuffer->Complete(NS_OK); - task->Run(); - - CheckDecoderResults(aTestCase, decoder); -} - -static void -CheckDownscaleDuringDecode(const ImageTestCase& aTestCase) -{ - // This function expects that |aTestCase| consists of 25 lines of green, - // followed by 25 lines of red, followed by 25 lines of green, followed by 25 - // more lines of red. We'll downscale it from 100x100 to 20x20. - IntSize outputSize(20, 20); - - WithSingleChunkDecode(aTestCase, Some(outputSize), [&](Decoder* aDecoder) { - RefPtr<SourceSurface> surface = CheckDecoderState(aTestCase, aDecoder); - - // There are no downscale-during-decode tests that have TEST_CASE_HAS_ERROR - // set, so we expect to always get a surface here. - EXPECT_TRUE(surface != nullptr); - - if (aTestCase.mFlags & TEST_CASE_IGNORE_OUTPUT) { - return; - } - - // Check that the downscaled image is correct. Note that we skip rows near - // the transitions between colors, since the downscaler does not produce a - // sharp boundary at these points. Even some of the rows we test need a - // small amount of fuzz; this is just the nature of Lanczos downscaling. - EXPECT_TRUE(RowsAreSolidColor(surface, 0, 4, BGRAColor::Green(), /* aFuzz = */ 47)); - EXPECT_TRUE(RowsAreSolidColor(surface, 6, 3, BGRAColor::Red(), /* aFuzz = */ 27)); - EXPECT_TRUE(RowsAreSolidColor(surface, 11, 3, BGRAColor::Green(), /* aFuzz = */ 47)); - EXPECT_TRUE(RowsAreSolidColor(surface, 16, 4, BGRAColor::Red(), /* aFuzz = */ 27)); - }); -} - -class ImageDecoders : public ::testing::Test -{ -protected: - AutoInitializeImageLib mInit; -}; - -TEST_F(ImageDecoders, PNGSingleChunk) -{ - CheckDecoderSingleChunk(GreenPNGTestCase()); -} - -TEST_F(ImageDecoders, PNGMultiChunk) -{ - CheckDecoderMultiChunk(GreenPNGTestCase()); -} - -TEST_F(ImageDecoders, PNGDownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledPNGTestCase()); -} - -TEST_F(ImageDecoders, GIFSingleChunk) -{ - CheckDecoderSingleChunk(GreenGIFTestCase()); -} - -TEST_F(ImageDecoders, GIFMultiChunk) -{ - CheckDecoderMultiChunk(GreenGIFTestCase()); -} - -TEST_F(ImageDecoders, GIFDownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledGIFTestCase()); -} - -TEST_F(ImageDecoders, JPGSingleChunk) -{ - CheckDecoderSingleChunk(GreenJPGTestCase()); -} - -TEST_F(ImageDecoders, JPGMultiChunk) -{ - CheckDecoderMultiChunk(GreenJPGTestCase()); -} - -TEST_F(ImageDecoders, JPGDownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledJPGTestCase()); -} - -TEST_F(ImageDecoders, BMPSingleChunk) -{ - CheckDecoderSingleChunk(GreenBMPTestCase()); -} - -TEST_F(ImageDecoders, BMPMultiChunk) -{ - CheckDecoderMultiChunk(GreenBMPTestCase()); -} - -TEST_F(ImageDecoders, BMPDownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledBMPTestCase()); -} - -TEST_F(ImageDecoders, ICOSingleChunk) -{ - CheckDecoderSingleChunk(GreenICOTestCase()); -} - -TEST_F(ImageDecoders, ICOMultiChunk) -{ - CheckDecoderMultiChunk(GreenICOTestCase()); -} - -TEST_F(ImageDecoders, ICODownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledICOTestCase()); -} - -TEST_F(ImageDecoders, ICOWithANDMaskDownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledTransparentICOWithANDMaskTestCase()); -} - -TEST_F(ImageDecoders, IconSingleChunk) -{ - CheckDecoderSingleChunk(GreenIconTestCase()); -} - -TEST_F(ImageDecoders, IconMultiChunk) -{ - CheckDecoderMultiChunk(GreenIconTestCase()); -} - -TEST_F(ImageDecoders, IconDownscaleDuringDecode) -{ - CheckDownscaleDuringDecode(DownscaledIconTestCase()); -} - -TEST_F(ImageDecoders, AnimatedGIFSingleChunk) -{ - CheckDecoderSingleChunk(GreenFirstFrameAnimatedGIFTestCase()); -} - -TEST_F(ImageDecoders, AnimatedGIFMultiChunk) -{ - CheckDecoderMultiChunk(GreenFirstFrameAnimatedGIFTestCase()); -} - -TEST_F(ImageDecoders, AnimatedPNGSingleChunk) -{ - CheckDecoderSingleChunk(GreenFirstFrameAnimatedPNGTestCase()); -} - -TEST_F(ImageDecoders, AnimatedPNGMultiChunk) -{ - CheckDecoderMultiChunk(GreenFirstFrameAnimatedPNGTestCase()); -} - -TEST_F(ImageDecoders, CorruptSingleChunk) -{ - CheckDecoderSingleChunk(CorruptTestCase()); -} - -TEST_F(ImageDecoders, CorruptMultiChunk) -{ - CheckDecoderMultiChunk(CorruptTestCase()); -} - -TEST_F(ImageDecoders, CorruptBMPWithTruncatedHeaderSingleChunk) -{ - CheckDecoderSingleChunk(CorruptBMPWithTruncatedHeader()); -} - -TEST_F(ImageDecoders, CorruptBMPWithTruncatedHeaderMultiChunk) -{ - CheckDecoderMultiChunk(CorruptBMPWithTruncatedHeader()); -} - -TEST_F(ImageDecoders, CorruptICOWithBadBMPWidthSingleChunk) -{ - CheckDecoderSingleChunk(CorruptICOWithBadBMPWidthTestCase()); -} - -TEST_F(ImageDecoders, CorruptICOWithBadBMPWidthMultiChunk) -{ - CheckDecoderMultiChunk(CorruptICOWithBadBMPWidthTestCase()); -} - -TEST_F(ImageDecoders, CorruptICOWithBadBMPHeightSingleChunk) -{ - CheckDecoderSingleChunk(CorruptICOWithBadBMPHeightTestCase()); -} - -TEST_F(ImageDecoders, CorruptICOWithBadBMPHeightMultiChunk) -{ - CheckDecoderMultiChunk(CorruptICOWithBadBMPHeightTestCase()); -} - -TEST_F(ImageDecoders, AnimatedGIFWithFRAME_FIRST) -{ - ImageTestCase testCase = GreenFirstFrameAnimatedGIFTestCase(); - - // Verify that we can decode this test case and retrieve the first frame using - // imgIContainer::FRAME_FIRST. This ensures that we correctly trigger a - // single-frame decode rather than an animated decode when - // imgIContainer::FRAME_FIRST is requested. - - // Create an image. - RefPtr<Image> image = - ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); - ASSERT_TRUE(!image->HasError()); - - nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into the image. - rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, - static_cast<uint32_t>(length)); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Let the image know we've sent all the data. - rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - RefPtr<ProgressTracker> tracker = image->GetProgressTracker(); - tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); - - // Lock the image so its surfaces don't disappear during the test. - image->LockImage(); - - // Use GetFrame() to force a sync decode of the image, specifying FRAME_FIRST - // to ensure that we don't get an animated decode. - RefPtr<SourceSurface> surface = - image->GetFrame(imgIContainer::FRAME_FIRST, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that the image's metadata meets our expectations. - IntSize imageSize(0, 0); - rv = image->GetWidth(&imageSize.width); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - rv = image->GetHeight(&imageSize.height); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - EXPECT_EQ(testCase.mSize.width, imageSize.width); - EXPECT_EQ(testCase.mSize.height, imageSize.height); - - Progress imageProgress = tracker->GetProgress(); - - EXPECT_TRUE(bool(imageProgress & FLAG_HAS_TRANSPARENCY) == false); - EXPECT_TRUE(bool(imageProgress & FLAG_IS_ANIMATED) == true); - - // Ensure that we decoded the static version of the image. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eStatic)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - EXPECT_TRUE(bool(result.Surface())); - } - - // Ensure that we didn't decode the animated version of the image. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eAnimated)); - ASSERT_EQ(MatchType::NOT_FOUND, result.Type()); - } - - // Use GetFrame() to force a sync decode of the image, this time specifying - // FRAME_CURRENT to ensure that we get an animated decode. - RefPtr<SourceSurface> animatedSurface = - image->GetFrame(imgIContainer::FRAME_CURRENT, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that we decoded both frames of the animated version of the image. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eAnimated)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(0))); - EXPECT_TRUE(bool(result.Surface())); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(1))); - EXPECT_TRUE(bool(result.Surface())); - } - - // Ensure that the static version is still around. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eStatic)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - EXPECT_TRUE(bool(result.Surface())); - } -} - -TEST_F(ImageDecoders, AnimatedGIFWithFRAME_CURRENT) -{ - ImageTestCase testCase = GreenFirstFrameAnimatedGIFTestCase(); - - // Verify that we can decode this test case and retrieve the entire sequence - // of frames using imgIContainer::FRAME_CURRENT. This ensures that we - // correctly trigger an animated decode rather than a single-frame decode when - // imgIContainer::FRAME_CURRENT is requested. - - // Create an image. - RefPtr<Image> image = - ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); - ASSERT_TRUE(!image->HasError()); - - nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into the image. - rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, - static_cast<uint32_t>(length)); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Let the image know we've sent all the data. - rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - RefPtr<ProgressTracker> tracker = image->GetProgressTracker(); - tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); - - // Lock the image so its surfaces don't disappear during the test. - image->LockImage(); - - // Use GetFrame() to force a sync decode of the image, specifying - // FRAME_CURRENT to ensure we get an animated decode. - RefPtr<SourceSurface> surface = - image->GetFrame(imgIContainer::FRAME_CURRENT, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that the image's metadata meets our expectations. - IntSize imageSize(0, 0); - rv = image->GetWidth(&imageSize.width); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - rv = image->GetHeight(&imageSize.height); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - EXPECT_EQ(testCase.mSize.width, imageSize.width); - EXPECT_EQ(testCase.mSize.height, imageSize.height); - - Progress imageProgress = tracker->GetProgress(); - - EXPECT_TRUE(bool(imageProgress & FLAG_HAS_TRANSPARENCY) == false); - EXPECT_TRUE(bool(imageProgress & FLAG_IS_ANIMATED) == true); - - // Ensure that we decoded both frames of the animated version of the image. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eAnimated)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(0))); - EXPECT_TRUE(bool(result.Surface())); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(1))); - EXPECT_TRUE(bool(result.Surface())); - } - - // Ensure that we didn't decode the static version of the image. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eStatic)); - ASSERT_EQ(MatchType::NOT_FOUND, result.Type()); - } - - // Use GetFrame() to force a sync decode of the image, this time specifying - // FRAME_FIRST to ensure that we get a single-frame decode. - RefPtr<SourceSurface> animatedSurface = - image->GetFrame(imgIContainer::FRAME_FIRST, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that we decoded the static version of the image. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eStatic)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - EXPECT_TRUE(bool(result.Surface())); - } - - // Ensure that both frames of the animated version are still around. - { - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eAnimated)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(0))); - EXPECT_TRUE(bool(result.Surface())); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(1))); - EXPECT_TRUE(bool(result.Surface())); - } -} - -TEST_F(ImageDecoders, AnimatedGIFWithExtraImageSubBlocks) -{ - ImageTestCase testCase = ExtraImageSubBlocksAnimatedGIFTestCase(); - - // Verify that we can decode this test case and get two frames, even though - // there are extra image sub blocks between the first and second frame. The - // extra data shouldn't confuse the decoder or cause the decode to fail. - - // Create an image. - RefPtr<Image> image = - ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); - ASSERT_TRUE(!image->HasError()); - - nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into the image. - rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, - static_cast<uint32_t>(length)); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Let the image know we've sent all the data. - rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - RefPtr<ProgressTracker> tracker = image->GetProgressTracker(); - tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); - - // Use GetFrame() to force a sync decode of the image. - RefPtr<SourceSurface> surface = - image->GetFrame(imgIContainer::FRAME_CURRENT, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that the image's metadata meets our expectations. - IntSize imageSize(0, 0); - rv = image->GetWidth(&imageSize.width); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - rv = image->GetHeight(&imageSize.height); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - EXPECT_EQ(testCase.mSize.width, imageSize.width); - EXPECT_EQ(testCase.mSize.height, imageSize.height); - - Progress imageProgress = tracker->GetProgress(); - - EXPECT_TRUE(bool(imageProgress & FLAG_HAS_TRANSPARENCY) == false); - EXPECT_TRUE(bool(imageProgress & FLAG_IS_ANIMATED) == true); - - // Ensure that we decoded both frames of the image. - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eAnimated)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(0))); - EXPECT_TRUE(bool(result.Surface())); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(1))); - EXPECT_TRUE(bool(result.Surface())); -} - -TEST_F(ImageDecoders, TruncatedSmallGIFSingleChunk) -{ - CheckDecoderSingleChunk(TruncatedSmallGIFTestCase()); -} diff --git a/image/test/gtest/TestDeinterlacingFilter.cpp b/image/test/gtest/TestDeinterlacingFilter.cpp deleted file mode 100644 index 82637bbf7..000000000 --- a/image/test/gtest/TestDeinterlacingFilter.cpp +++ /dev/null @@ -1,672 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfaceFilters.h" -#include "SurfacePipe.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -template <typename Func> void -WithDeinterlacingFilter(const IntSize& aSize, - bool aProgressiveDisplay, - Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(bool(decoder)); - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - DeinterlacingConfig<uint32_t> { aProgressiveDisplay }, - SurfaceConfig { decoder, aSize, - SurfaceFormat::B8G8R8A8, false }); -} - -template <typename Func> void -WithPalettedDeinterlacingFilter(const IntSize& aSize, - Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - DeinterlacingConfig<uint8_t> { /* mProgressiveDisplay = */ true }, - PalettedSurfaceConfig { decoder, aSize, - IntRect(0, 0, 100, 100), - SurfaceFormat::B8G8R8A8, 8, - false }); -} - -void -AssertConfiguringDeinterlacingFilterFails(const IntSize& aSize) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - AssertConfiguringPipelineFails(decoder, - DeinterlacingConfig<uint32_t> { /* mProgressiveDisplay = */ true}, - SurfaceConfig { decoder, aSize, - SurfaceFormat::B8G8R8A8, false }); -} - -class ImageDeinterlacingFilter : public ::testing::Test -{ -protected: - AutoInitializeImageLib mInit; -}; - -TEST_F(ImageDeinterlacingFilter, WritePixels100_100) -{ - WithDeinterlacingFilter(IntSize(100, 100), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100))); - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixels99_99) -{ - WithDeinterlacingFilter(IntSize(99, 99), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 99, 99)), - /* aInputRect = */ Some(IntRect(0, 0, 99, 99))); - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixels8_8) -{ - WithDeinterlacingFilter(IntSize(8, 8), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 8, 8)), - /* aInputRect = */ Some(IntRect(0, 0, 8, 8))); - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixels7_7) -{ - WithDeinterlacingFilter(IntSize(7, 7), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 7, 7)), - /* aInputRect = */ Some(IntRect(0, 0, 7, 7))); - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixels3_3) -{ - WithDeinterlacingFilter(IntSize(3, 3), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 3, 3)), - /* aInputRect = */ Some(IntRect(0, 0, 3, 3))); - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixels1_1) -{ - WithDeinterlacingFilter(IntSize(1, 1), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 1, 1)), - /* aInputRect = */ Some(IntRect(0, 0, 1, 1))); - }); -} - -TEST_F(ImageDeinterlacingFilter, PalettedWritePixels) -{ - WithPalettedDeinterlacingFilter(IntSize(100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckPalettedWritePixels(aDecoder, aFilter); - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsNonProgressiveOutput51_52) -{ - WithDeinterlacingFilter(IntSize(51, 52), /* aProgressiveDisplay = */ false, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be green for even rows and red for odd - // rows but we need to write the rows in the order that the deinterlacer - // expects them. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() { - uint32_t row = count / 51; // Integer division. - ++count; - - // Note that we use a switch statement here, even though it's quite - // verbose, because it's useful to have the mappings between input and - // output rows available when debugging these tests. - - switch (row) { - // First pass. Output rows are positioned at 8n + 0. - case 0: // Output row 0. - case 1: // Output row 8. - case 2: // Output row 16. - case 3: // Output row 24. - case 4: // Output row 32. - case 5: // Output row 40. - case 6: // Output row 48. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Second pass. Rows are positioned at 8n + 4. - case 7: // Output row 4. - case 8: // Output row 12. - case 9: // Output row 20. - case 10: // Output row 28. - case 11: // Output row 36. - case 12: // Output row 44. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Third pass. Rows are positioned at 4n + 2. - case 13: // Output row 2. - case 14: // Output row 6. - case 15: // Output row 10. - case 16: // Output row 14. - case 17: // Output row 18. - case 18: // Output row 22. - case 19: // Output row 26. - case 20: // Output row 30. - case 21: // Output row 34. - case 22: // Output row 38. - case 23: // Output row 42. - case 24: // Output row 46. - case 25: // Output row 50. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Fourth pass. Rows are positioned at 2n + 1. - case 26: // Output row 1. - case 27: // Output row 3. - case 28: // Output row 5. - case 29: // Output row 7. - case 30: // Output row 9. - case 31: // Output row 11. - case 32: // Output row 13. - case 33: // Output row 15. - case 34: // Output row 17. - case 35: // Output row 19. - case 36: // Output row 21. - case 37: // Output row 23. - case 38: // Output row 25. - case 39: // Output row 27. - case 40: // Output row 29. - case 41: // Output row 31. - case 42: // Output row 33. - case 43: // Output row 35. - case 44: // Output row 37. - case 45: // Output row 39. - case 46: // Output row 41. - case 47: // Output row 43. - case 48: // Output row 45. - case 49: // Output row 47. - case 50: // Output row 49. - case 51: // Output row 51. - return AsVariant(BGRAColor::Red().AsPixel()); - - default: - MOZ_ASSERT_UNREACHABLE("Unexpected row"); - return AsVariant(BGRAColor::Transparent().AsPixel()); - } - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(51u * 52u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 51, 52), - IntRect(0, 0, 51, 52)); - - // Check that the generated image is correct. As mentioned above, we expect - // even rows to be green and odd rows to be red. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = 0; row < 52; ++row) { - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, - row % 2 == 0 ? BGRAColor::Green() - : BGRAColor::Red())); - } - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsOutput20_20) -{ - WithDeinterlacingFilter(IntSize(20, 20), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be green for even rows and red for odd - // rows but we need to write the rows in the order that the deinterlacer - // expects them. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() { - uint32_t row = count / 20; // Integer division. - ++count; - - // Note that we use a switch statement here, even though it's quite - // verbose, because it's useful to have the mappings between input and - // output rows available when debugging these tests. - - switch (row) { - // First pass. Output rows are positioned at 8n + 0. - case 0: // Output row 0. - case 1: // Output row 8. - case 2: // Output row 16. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Second pass. Rows are positioned at 8n + 4. - case 3: // Output row 4. - case 4: // Output row 12. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Third pass. Rows are positioned at 4n + 2. - case 5: // Output row 2. - case 6: // Output row 6. - case 7: // Output row 10. - case 8: // Output row 14. - case 9: // Output row 18. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Fourth pass. Rows are positioned at 2n + 1. - case 10: // Output row 1. - case 11: // Output row 3. - case 12: // Output row 5. - case 13: // Output row 7. - case 14: // Output row 9. - case 15: // Output row 11. - case 16: // Output row 13. - case 17: // Output row 15. - case 18: // Output row 17. - case 19: // Output row 19. - return AsVariant(BGRAColor::Red().AsPixel()); - - default: - MOZ_ASSERT_UNREACHABLE("Unexpected row"); - return AsVariant(BGRAColor::Transparent().AsPixel()); - } - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(20u * 20u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 20, 20), - IntRect(0, 0, 20, 20)); - - // Check that the generated image is correct. As mentioned above, we expect - // even rows to be green and odd rows to be red. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = 0; row < 20; ++row) { - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, - row % 2 == 0 ? BGRAColor::Green() - : BGRAColor::Red())); - } - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsOutput7_7) -{ - WithDeinterlacingFilter(IntSize(7, 7), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be a repeating pattern of two green - // rows followed by two red rows but we need to write the rows in the order - // that the deinterlacer expects them. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() { - uint32_t row = count / 7; // Integer division. - ++count; - - switch (row) { - // First pass. Output rows are positioned at 8n + 0. - case 0: // Output row 0. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Second pass. Rows are positioned at 8n + 4. - case 1: // Output row 4. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Third pass. Rows are positioned at 4n + 2. - case 2: // Output row 2. - case 3: // Output row 6. - return AsVariant(BGRAColor::Red().AsPixel()); - - // Fourth pass. Rows are positioned at 2n + 1. - case 4: // Output row 1. - return AsVariant(BGRAColor::Green().AsPixel()); - - case 5: // Output row 3. - return AsVariant(BGRAColor::Red().AsPixel()); - - case 6: // Output row 5. - return AsVariant(BGRAColor::Green().AsPixel()); - - default: - MOZ_ASSERT_UNREACHABLE("Unexpected row"); - return AsVariant(BGRAColor::Transparent().AsPixel()); - } - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(7u * 7u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 7, 7), - IntRect(0, 0, 7, 7)); - - // Check that the generated image is correct. As mentioned above, we expect - // two green rows, followed by two red rows, then two green rows, etc. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = 0; row < 7; ++row) { - BGRAColor color = row == 0 || row == 1 || row == 4 || row == 5 - ? BGRAColor::Green() - : BGRAColor::Red(); - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, color)); - } - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsOutput3_3) -{ - WithDeinterlacingFilter(IntSize(3, 3), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be green, red, green in that order, but - // we need to write the rows in the order that the deinterlacer expects - // them. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() { - uint32_t row = count / 3; // Integer division. - ++count; - - switch (row) { - // First pass. Output rows are positioned at 8n + 0. - case 0: // Output row 0. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Second pass. Rows are positioned at 8n + 4. - // No rows for this pass. - - // Third pass. Rows are positioned at 4n + 2. - case 1: // Output row 2. - return AsVariant(BGRAColor::Green().AsPixel()); - - // Fourth pass. Rows are positioned at 2n + 1. - case 2: // Output row 1. - return AsVariant(BGRAColor::Red().AsPixel()); - - default: - MOZ_ASSERT_UNREACHABLE("Unexpected row"); - return AsVariant(BGRAColor::Transparent().AsPixel()); - } - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(3u * 3u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 3, 3), - IntRect(0, 0, 3, 3)); - - // Check that the generated image is correct. As mentioned above, we expect - // green, red, green in that order. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = 0; row < 3; ++row) { - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, - row == 0 || row == 2 ? BGRAColor::Green() - : BGRAColor::Red())); - } - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsOutput1_1) -{ - WithDeinterlacingFilter(IntSize(1, 1), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be a single red row. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(1u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 1, 1), - IntRect(0, 0, 1, 1)); - - // Check that the generated image is correct. As mentioned above, we expect - // a single red row. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - EXPECT_TRUE(RowsAreSolidColor(surface, 0, 1, BGRAColor::Red())); - }); -} - -void -WriteRowAndCheckInterlacerOutput(Decoder* aDecoder, - SurfaceFilter* aFilter, - BGRAColor aColor, - WriteState aNextState, - IntRect aInvalidRect, - uint32_t aFirstHaeberliRow, - uint32_t aLastHaeberliRow) -{ - uint32_t count = 0; - - auto result = aFilter->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count < 7) { - ++count; - return AsVariant(aColor.AsPixel()); - } - return AsVariant(WriteState::NEED_MORE_DATA); - }); - - EXPECT_EQ(aNextState, result); - EXPECT_EQ(7u, count); - - // Assert that we got the expected invalidation region. - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(aInvalidRect, invalidRect->mInputSpaceRect); - EXPECT_EQ(aInvalidRect, invalidRect->mOutputSpaceRect); - - // Check that the portion of the image generated so far is correct. The rows - // from aFirstHaeberliRow to aLastHaeberliRow should be filled with aColor. - // Note that this is not the same as the set of rows in aInvalidRect, because - // after writing a row the deinterlacer seeks to the next row to write, which - // may involve copying previously-written rows in the buffer to the output - // even though they don't change in this pass. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = aFirstHaeberliRow; row <= aLastHaeberliRow; ++row) { - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, aColor)); - } -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsIntermediateOutput7_7) -{ - WithDeinterlacingFilter(IntSize(7, 7), /* aProgressiveDisplay = */ true, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be a repeating pattern of two green - // rows followed by two red rows but we need to write the rows in the order - // that the deinterlacer expects them. - - // First pass. Output rows are positioned at 8n + 0. - - // Output row 0. The invalid rect is the entire image because this is the - // end of the first pass. - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::NEED_MORE_DATA, - IntRect(0, 0, 7, 7), 0, 4); - - // Second pass. Rows are positioned at 8n + 4. - - // Output row 4. The invalid rect is the entire image because this is the - // end of the second pass. - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::NEED_MORE_DATA, - IntRect(0, 0, 7, 7), 1, 4); - - // Third pass. Rows are positioned at 4n + 2. - - // Output row 2. The invalid rect contains the Haeberli rows for this output - // row (rows 2 and 3) as well as the rows that we copy from previous passes - // when seeking to the next output row (rows 4 and 5). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Red(), - WriteState::NEED_MORE_DATA, - IntRect(0, 2, 7, 4), 2, 3); - - // Output row 6. The invalid rect is the entire image because this is the - // end of the third pass. - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Red(), - WriteState::NEED_MORE_DATA, - IntRect(0, 0, 7, 7), 6, 6); - - // Fourth pass. Rows are positioned at 2n + 1. - - // Output row 1. The invalid rect contains the Haeberli rows for this output - // row (just row 1) as well as the rows that we copy from previous passes - // when seeking to the next output row (row 2). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::NEED_MORE_DATA, - IntRect(0, 1, 7, 2), 1, 1); - - // Output row 3. The invalid rect contains the Haeberli rows for this output - // row (just row 3) as well as the rows that we copy from previous passes - // when seeking to the next output row (row 4). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Red(), - WriteState::NEED_MORE_DATA, - IntRect(0, 3, 7, 2), 3, 3); - - // Output row 5. The invalid rect contains the Haeberli rows for this output - // row (just row 5) as well as the rows that we copy from previous passes - // when seeking to the next output row (row 6). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::FINISHED, - IntRect(0, 5, 7, 2), 5, 5); - - // Assert that we're in the expected final state. - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that the generated image is correct. As mentioned above, we expect - // two green rows, followed by two red rows, then two green rows, etc. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = 0; row < 7; ++row) { - BGRAColor color = row == 0 || row == 1 || row == 4 || row == 5 - ? BGRAColor::Green() - : BGRAColor::Red(); - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, color)); - } - }); -} - -TEST_F(ImageDeinterlacingFilter, WritePixelsNonProgressiveIntermediateOutput7_7) -{ - WithDeinterlacingFilter(IntSize(7, 7), /* aProgressiveDisplay = */ false, - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. The output should be a repeating pattern of two green - // rows followed by two red rows but we need to write the rows in the order - // that the deinterlacer expects them. - - // First pass. Output rows are positioned at 8n + 0. - - // Output row 0. The invalid rect is the entire image because this is the - // end of the first pass. - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::NEED_MORE_DATA, - IntRect(0, 0, 7, 7), 0, 0); - - // Second pass. Rows are positioned at 8n + 4. - - // Output row 4. The invalid rect is the entire image because this is the - // end of the second pass. - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::NEED_MORE_DATA, - IntRect(0, 0, 7, 7), 4, 4); - - // Third pass. Rows are positioned at 4n + 2. - - // Output row 2. The invalid rect contains the Haeberli rows for this output - // row (rows 2 and 3) as well as the rows that we copy from previous passes - // when seeking to the next output row (rows 4 and 5). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Red(), - WriteState::NEED_MORE_DATA, - IntRect(0, 2, 7, 4), 2, 2); - - // Output row 6. The invalid rect is the entire image because this is the - // end of the third pass. - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Red(), - WriteState::NEED_MORE_DATA, - IntRect(0, 0, 7, 7), 6, 6); - - // Fourth pass. Rows are positioned at 2n + 1. - - // Output row 1. The invalid rect contains the Haeberli rows for this output - // row (just row 1) as well as the rows that we copy from previous passes - // when seeking to the next output row (row 2). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::NEED_MORE_DATA, - IntRect(0, 1, 7, 2), 1, 1); - - // Output row 3. The invalid rect contains the Haeberli rows for this output - // row (just row 3) as well as the rows that we copy from previous passes - // when seeking to the next output row (row 4). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Red(), - WriteState::NEED_MORE_DATA, - IntRect(0, 3, 7, 2), 3, 3); - - // Output row 5. The invalid rect contains the Haeberli rows for this output - // row (just row 5) as well as the rows that we copy from previous passes - // when seeking to the next output row (row 6). - WriteRowAndCheckInterlacerOutput(aDecoder, aFilter, BGRAColor::Green(), - WriteState::FINISHED, - IntRect(0, 5, 7, 2), 5, 5); - - // Assert that we're in the expected final state. - EXPECT_TRUE(aFilter->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aFilter->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that the generated image is correct. As mentioned above, we expect - // two green rows, followed by two red rows, then two green rows, etc. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - for (uint32_t row = 0; row < 7; ++row) { - BGRAColor color = row == 0 || row == 1 || row == 4 || row == 5 - ? BGRAColor::Green() - : BGRAColor::Red(); - EXPECT_TRUE(RowsAreSolidColor(surface, row, 1, color)); - } - }); -} - - -TEST_F(ImageDeinterlacingFilter, DeinterlacingFailsFor0_0) -{ - // A 0x0 input size is invalid, so configuration should fail. - AssertConfiguringDeinterlacingFilterFails(IntSize(0, 0)); -} - -TEST_F(ImageDeinterlacingFilter, DeinterlacingFailsForMinus1_Minus1) -{ - // A negative input size is invalid, so configuration should fail. - AssertConfiguringDeinterlacingFilterFails(IntSize(-1, -1)); -} diff --git a/image/test/gtest/TestDownscalingFilter.cpp b/image/test/gtest/TestDownscalingFilter.cpp deleted file mode 100644 index d7aa0ead2..000000000 --- a/image/test/gtest/TestDownscalingFilter.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfaceFilters.h" -#include "SurfacePipe.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -template <typename Func> void -WithDownscalingFilter(const IntSize& aInputSize, - const IntSize& aOutputSize, - Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - DownscalingConfig { aInputSize, - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, aOutputSize, - SurfaceFormat::B8G8R8A8, false }); -} - -void -AssertConfiguringDownscalingFilterFails(const IntSize& aInputSize, - const IntSize& aOutputSize) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - AssertConfiguringPipelineFails(decoder, - DownscalingConfig { aInputSize, - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, aOutputSize, - SurfaceFormat::B8G8R8A8, false }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to99_99) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(99, 99), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 99, 99))); - }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to33_33) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(33, 33), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 33, 33))); - }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to1_1) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(1, 1), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 1, 1))); - }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to33_99) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(33, 99), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 33, 99))); - }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to99_33) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(99, 33), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 99, 33))); - }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to99_1) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(99, 1), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 99, 1))); - }); -} - -TEST(ImageDownscalingFilter, WritePixels100_100to1_99) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(1, 99), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 1, 99))); - }); -} - -TEST(ImageDownscalingFilter, DownscalingFailsFor100_100to101_101) -{ - // Upscaling is disallowed. - AssertConfiguringDownscalingFilterFails(IntSize(100, 100), IntSize(101, 101)); -} - -TEST(ImageDownscalingFilter, DownscalingFailsFor100_100to100_100) -{ - // "Scaling" to the same size is disallowed. - AssertConfiguringDownscalingFilterFails(IntSize(100, 100), IntSize(100, 100)); -} - -TEST(ImageDownscalingFilter, DownscalingFailsFor0_0toMinus1_Minus1) -{ - // A 0x0 input size is disallowed. - AssertConfiguringDownscalingFilterFails(IntSize(0, 0), IntSize(-1, -1)); -} - -TEST(ImageDownscalingFilter, DownscalingFailsForMinus1_Minus1toMinus2_Minus2) -{ - // A negative input size is disallowed. - AssertConfiguringDownscalingFilterFails(IntSize(-1, -1), IntSize(-2, -2)); -} - -TEST(ImageDownscalingFilter, DownscalingFailsFor100_100to0_0) -{ - // A 0x0 output size is disallowed. - AssertConfiguringDownscalingFilterFails(IntSize(100, 100), IntSize(0, 0)); -} - -TEST(ImageDownscalingFilter, DownscalingFailsFor100_100toMinus1_Minus1) -{ - // A negative output size is disallowed. - AssertConfiguringDownscalingFilterFails(IntSize(100, 100), IntSize(-1, -1)); -} - -TEST(ImageDownscalingFilter, WritePixelsOutput100_100to20_20) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(20, 20), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. It consists of 25 lines of green, followed by 25 lines of - // red, followed by 25 lines of green, followed by 25 more lines of red. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - uint32_t color = (count <= 25 * 100) || (count > 50 * 100 && count <= 75 * 100) - ? BGRAColor::Green().AsPixel() - : BGRAColor::Red().AsPixel(); - ++count; - return AsVariant(color); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 20, 20)); - - // Check that the generated image is correct. Note that we skip rows near - // the transitions between colors, since the downscaler does not produce a - // sharp boundary at these points. Even some of the rows we test need a - // small amount of fuzz; this is just the nature of Lanczos downscaling. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(RowsAreSolidColor(surface, 0, 4, BGRAColor::Green(), /* aFuzz = */ 2)); - EXPECT_TRUE(RowsAreSolidColor(surface, 6, 3, BGRAColor::Red(), /* aFuzz = */ 3)); - EXPECT_TRUE(RowsAreSolidColor(surface, 11, 3, BGRAColor::Green(), /* aFuzz = */ 3)); - EXPECT_TRUE(RowsAreSolidColor(surface, 16, 4, BGRAColor::Red(), /* aFuzz = */ 3)); - }); -} - -TEST(ImageDownscalingFilter, WritePixelsOutput100_100to10_20) -{ - WithDownscalingFilter(IntSize(100, 100), IntSize(10, 20), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Fill the image. It consists of 25 lines of green, followed by 25 lines of - // red, followed by 25 lines of green, followed by 25 more lines of red. - uint32_t count = 0; - auto result = aFilter->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - uint32_t color = (count <= 25 * 100) || (count > 50 * 100 && count <= 75 * 100) - ? BGRAColor::Green().AsPixel() - : BGRAColor::Red().AsPixel(); - ++count; - return AsVariant(color); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - AssertCorrectPipelineFinalState(aFilter, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 10, 20)); - - // Check that the generated image is correct. Note that we skip rows near - // the transitions between colors, since the downscaler does not produce a - // sharp boundary at these points. Even some of the rows we test need a - // small amount of fuzz; this is just the nature of Lanczos downscaling. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(RowsAreSolidColor(surface, 0, 4, BGRAColor::Green(), /* aFuzz = */ 2)); - EXPECT_TRUE(RowsAreSolidColor(surface, 6, 3, BGRAColor::Red(), /* aFuzz = */ 3)); - EXPECT_TRUE(RowsAreSolidColor(surface, 11, 3, BGRAColor::Green(), /* aFuzz = */ 3)); - EXPECT_TRUE(RowsAreSolidColor(surface, 16, 4, BGRAColor::Red(), /* aFuzz = */ 3)); - }); -} - -TEST(ImageDownscalingFilter, ConfiguringPalettedDownscaleFails) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // DownscalingFilter does not support paletted images, so configuration should - // fail. - AssertConfiguringPipelineFails(decoder, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - PalettedSurfaceConfig { decoder, IntSize(20, 20), - IntRect(0, 0, 20, 20), - SurfaceFormat::B8G8R8A8, 8, - false }); -} diff --git a/image/test/gtest/TestDownscalingFilterNoSkia.cpp b/image/test/gtest/TestDownscalingFilterNoSkia.cpp deleted file mode 100644 index 80928a880..000000000 --- a/image/test/gtest/TestDownscalingFilterNoSkia.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfacePipe.h" - -// We want to ensure that we're testing the non-Skia fallback version of -// DownscalingFilter, but there are two issues: -// (1) We don't know whether Skia is currently enabled. -// (2) If we force disable it, the disabled version will get linked into the -// binary and will cause the tests in TestDownscalingFilter to fail. -// To avoid these problems, we ensure that MOZ_ENABLE_SKIA is defined when -// including DownscalingFilter.h, and we use the preprocessor to redefine the -// DownscalingFilter class to DownscalingFilterNoSkia. - -#define DownscalingFilter DownscalingFilterNoSkia - -#ifdef MOZ_ENABLE_SKIA - -#undef MOZ_ENABLE_SKIA -#include "Common.h" -#include "DownscalingFilter.h" -#define MOZ_ENABLE_SKIA - -#else - -#include "Common.h" -#include "DownscalingFilter.h" - -#endif - -#undef DownscalingFilter - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -TEST(ImageDownscalingFilter, NoSkia) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(bool(decoder)); - - // Configuring a DownscalingFilter should fail without Skia. - AssertConfiguringPipelineFails(decoder, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, IntSize(50, 50), - SurfaceFormat::B8G8R8A8, false }); -} diff --git a/image/test/gtest/TestLoader.cpp b/image/test/gtest/TestLoader.cpp deleted file mode 100644 index 5551f3f05..000000000 --- a/image/test/gtest/TestLoader.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "Common.h" -#include "imgLoader.h" -#include "nsMimeTypes.h" -#include "nsString.h" - -using namespace mozilla; -using namespace mozilla::image; - -static void -CheckMimeType(const char* aContents, size_t aLength, const char* aExpected) -{ - nsAutoCString detected; - nsresult rv = imgLoader::GetMimeTypeFromContent(aContents, aLength, detected); - if (aExpected) { - ASSERT_TRUE(NS_SUCCEEDED(rv)); - EXPECT_TRUE(detected.EqualsASCII(aExpected)); - } else { - ASSERT_TRUE(NS_FAILED(rv)); - EXPECT_TRUE(detected.IsEmpty()); - } -} - -class ImageLoader : public ::testing::Test -{ -protected: - AutoInitializeImageLib mInit; -}; - -TEST_F(ImageLoader, DetectGIF) -{ - const char buffer[] = "GIF87a"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_GIF); -} - -TEST_F(ImageLoader, DetectPNG) -{ - const char buffer[] = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_PNG); -} - -TEST_F(ImageLoader, DetectJPEG) -{ - const char buffer[] = "\xFF\xD8\xFF"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_JPEG); -} - -TEST_F(ImageLoader, DetectART) -{ - const char buffer[] = "\x4A\x47\xFF\xFF\x00"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_ART); -} - -TEST_F(ImageLoader, DetectBMP) -{ - const char buffer[] = "BM"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_BMP); -} - -TEST_F(ImageLoader, DetectICO) -{ - const char buffer[] = "\x00\x00\x01\x00"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_ICO); -} - -TEST_F(ImageLoader, DetectWebP) -{ - const char buffer[] = "RIFF\xFF\xFF\xFF\xFFWEBPVP8L"; - CheckMimeType(buffer, sizeof(buffer), IMAGE_WEBP); -} - -TEST_F(ImageLoader, DetectNone) -{ - const char buffer[] = "abcdefghijklmnop"; - CheckMimeType(buffer, sizeof(buffer), nullptr); -} - diff --git a/image/test/gtest/TestMetadata.cpp b/image/test/gtest/TestMetadata.cpp deleted file mode 100644 index 9f3a64898..000000000 --- a/image/test/gtest/TestMetadata.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/* 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 "gtest/gtest.h" - -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "decoders/nsBMPDecoder.h" -#include "IDecodingTask.h" -#include "imgIContainer.h" -#include "imgITools.h" -#include "ImageFactory.h" -#include "mozilla/gfx/2D.h" -#include "nsComponentManagerUtils.h" -#include "nsCOMPtr.h" -#include "nsIInputStream.h" -#include "nsIRunnable.h" -#include "nsIThread.h" -#include "mozilla/RefPtr.h" -#include "nsStreamUtils.h" -#include "nsString.h" -#include "nsThreadUtils.h" -#include "ProgressTracker.h" -#include "SourceBuffer.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -enum class BMPWithinICO -{ - NO, - YES -}; - -static void -CheckMetadata(const ImageTestCase& aTestCase, - BMPWithinICO aBMPWithinICO = BMPWithinICO::NO) -{ - nsCOMPtr<nsIInputStream> inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into a SourceBuffer. - NotNull<RefPtr<SourceBuffer>> sourceBuffer = WrapNotNull(new SourceBuffer()); - sourceBuffer->ExpectLength(length); - rv = sourceBuffer->AppendFromInputStream(inputStream, length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - sourceBuffer->Complete(NS_OK); - - // Create a metadata decoder. - DecoderType decoderType = - DecoderFactory::GetDecoderType(aTestCase.mMimeType); - RefPtr<Decoder> decoder = - DecoderFactory::CreateAnonymousMetadataDecoder(decoderType, sourceBuffer); - ASSERT_TRUE(decoder != nullptr); - RefPtr<IDecodingTask> task = new AnonymousDecodingTask(WrapNotNull(decoder)); - - if (aBMPWithinICO == BMPWithinICO::YES) { - static_cast<nsBMPDecoder*>(decoder.get())->SetIsWithinICO(); - } - - // Run the metadata decoder synchronously. - task->Run(); - - // Ensure that the metadata decoder didn't make progress it shouldn't have - // (which would indicate that it decoded past the header of the image). - Progress metadataProgress = decoder->TakeProgress(); - EXPECT_TRUE(0 == (metadataProgress & ~(FLAG_SIZE_AVAILABLE | - FLAG_HAS_TRANSPARENCY | - FLAG_IS_ANIMATED))); - - // If the test case is corrupt, assert what we can and return early. - if (aTestCase.mFlags & TEST_CASE_HAS_ERROR) { - EXPECT_TRUE(decoder->GetDecodeDone()); - EXPECT_TRUE(decoder->HasError()); - return; - } - - EXPECT_TRUE(decoder->GetDecodeDone() && !decoder->HasError()); - - // Check that we got the expected metadata. - EXPECT_TRUE(metadataProgress & FLAG_SIZE_AVAILABLE); - - IntSize metadataSize = decoder->Size(); - EXPECT_EQ(aTestCase.mSize.width, metadataSize.width); - EXPECT_EQ(aTestCase.mSize.height, metadataSize.height); - - bool expectTransparency = aBMPWithinICO == BMPWithinICO::YES - ? true - : bool(aTestCase.mFlags & TEST_CASE_IS_TRANSPARENT); - EXPECT_EQ(expectTransparency, bool(metadataProgress & FLAG_HAS_TRANSPARENCY)); - - EXPECT_EQ(bool(aTestCase.mFlags & TEST_CASE_IS_ANIMATED), - bool(metadataProgress & FLAG_IS_ANIMATED)); - - // Create a full decoder, so we can compare the result. - decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, Nothing(), - DefaultSurfaceFlags()); - ASSERT_TRUE(decoder != nullptr); - task = new AnonymousDecodingTask(WrapNotNull(decoder)); - - if (aBMPWithinICO == BMPWithinICO::YES) { - static_cast<nsBMPDecoder*>(decoder.get())->SetIsWithinICO(); - } - - // Run the full decoder synchronously. - task->Run(); - - EXPECT_TRUE(decoder->GetDecodeDone() && !decoder->HasError()); - Progress fullProgress = decoder->TakeProgress(); - - // If the metadata decoder set a progress bit, the full decoder should also - // have set the same bit. - EXPECT_EQ(fullProgress, metadataProgress | fullProgress); - - // The full decoder and the metadata decoder should agree on the image's size. - IntSize fullSize = decoder->Size(); - EXPECT_EQ(metadataSize.width, fullSize.width); - EXPECT_EQ(metadataSize.height, fullSize.height); - - // We should not discover transparency during the full decode that we didn't - // discover during the metadata decode, unless the image is animated. - EXPECT_TRUE(!(fullProgress & FLAG_HAS_TRANSPARENCY) || - (metadataProgress & FLAG_HAS_TRANSPARENCY) || - (fullProgress & FLAG_IS_ANIMATED)); -} - -class ImageDecoderMetadata : public ::testing::Test -{ -protected: - AutoInitializeImageLib mInit; -}; - -TEST_F(ImageDecoderMetadata, PNG) { CheckMetadata(GreenPNGTestCase()); } -TEST_F(ImageDecoderMetadata, TransparentPNG) { CheckMetadata(TransparentPNGTestCase()); } -TEST_F(ImageDecoderMetadata, GIF) { CheckMetadata(GreenGIFTestCase()); } -TEST_F(ImageDecoderMetadata, TransparentGIF) { CheckMetadata(TransparentGIFTestCase()); } -TEST_F(ImageDecoderMetadata, JPG) { CheckMetadata(GreenJPGTestCase()); } -TEST_F(ImageDecoderMetadata, BMP) { CheckMetadata(GreenBMPTestCase()); } -TEST_F(ImageDecoderMetadata, ICO) { CheckMetadata(GreenICOTestCase()); } -TEST_F(ImageDecoderMetadata, Icon) { CheckMetadata(GreenIconTestCase()); } - -TEST_F(ImageDecoderMetadata, AnimatedGIF) -{ - CheckMetadata(GreenFirstFrameAnimatedGIFTestCase()); -} - -TEST_F(ImageDecoderMetadata, AnimatedPNG) -{ - CheckMetadata(GreenFirstFrameAnimatedPNGTestCase()); -} - -TEST_F(ImageDecoderMetadata, FirstFramePaddingGIF) -{ - CheckMetadata(FirstFramePaddingGIFTestCase()); -} - -TEST_F(ImageDecoderMetadata, TransparentIfWithinICOBMPNotWithinICO) -{ - CheckMetadata(TransparentIfWithinICOBMPTestCase(TEST_CASE_DEFAULT_FLAGS), - BMPWithinICO::NO); -} - -TEST_F(ImageDecoderMetadata, TransparentIfWithinICOBMPWithinICO) -{ - CheckMetadata(TransparentIfWithinICOBMPTestCase(TEST_CASE_IS_TRANSPARENT), - BMPWithinICO::YES); -} - -TEST_F(ImageDecoderMetadata, RLE4BMP) { CheckMetadata(RLE4BMPTestCase()); } -TEST_F(ImageDecoderMetadata, RLE8BMP) { CheckMetadata(RLE8BMPTestCase()); } - -TEST_F(ImageDecoderMetadata, Corrupt) { CheckMetadata(CorruptTestCase()); } - -TEST_F(ImageDecoderMetadata, NoFrameDelayGIF) -{ - CheckMetadata(NoFrameDelayGIFTestCase()); -} - -TEST_F(ImageDecoderMetadata, NoFrameDelayGIFFullDecode) -{ - ImageTestCase testCase = NoFrameDelayGIFTestCase(); - - // The previous test (NoFrameDelayGIF) verifies that we *don't* detect that - // this test case is animated, because it has a zero frame delay for the first - // frame. This test verifies that when we do a full decode, we detect the - // animation at that point and successfully decode all the frames. - - // Create an image. - RefPtr<Image> image = - ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); - ASSERT_TRUE(!image->HasError()); - - nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into the image. - rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, - static_cast<uint32_t>(length)); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Let the image know we've sent all the data. - rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - RefPtr<ProgressTracker> tracker = image->GetProgressTracker(); - tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); - - // Use GetFrame() to force a sync decode of the image. - RefPtr<SourceSurface> surface = - image->GetFrame(imgIContainer::FRAME_CURRENT, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that the image's metadata meets our expectations. - IntSize imageSize(0, 0); - rv = image->GetWidth(&imageSize.width); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - rv = image->GetHeight(&imageSize.height); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - EXPECT_EQ(testCase.mSize.width, imageSize.width); - EXPECT_EQ(testCase.mSize.height, imageSize.height); - - Progress imageProgress = tracker->GetProgress(); - - EXPECT_TRUE(bool(imageProgress & FLAG_HAS_TRANSPARENCY) == false); - EXPECT_TRUE(bool(imageProgress & FLAG_IS_ANIMATED) == true); - - // Ensure that we decoded both frames of the image. - LookupResult result = - SurfaceCache::Lookup(ImageKey(image.get()), - RasterSurfaceKey(imageSize, - DefaultSurfaceFlags(), - PlaybackType::eAnimated)); - ASSERT_EQ(MatchType::EXACT, result.Type()); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(0))); - EXPECT_TRUE(bool(result.Surface())); - - EXPECT_TRUE(NS_SUCCEEDED(result.Surface().Seek(1))); - EXPECT_TRUE(bool(result.Surface())); -} diff --git a/image/test/gtest/TestRemoveFrameRectFilter.cpp b/image/test/gtest/TestRemoveFrameRectFilter.cpp deleted file mode 100644 index ad1f944fc..000000000 --- a/image/test/gtest/TestRemoveFrameRectFilter.cpp +++ /dev/null @@ -1,327 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfaceFilters.h" -#include "SurfacePipe.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -template <typename Func> void -WithRemoveFrameRectFilter(const IntSize& aSize, - const IntRect& aFrameRect, - Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - RemoveFrameRectConfig { aFrameRect }, - SurfaceConfig { decoder, aSize, - SurfaceFormat::B8G8R8A8, false }); -} - -void -AssertConfiguringRemoveFrameRectFilterFails(const IntSize& aSize, - const IntRect& aFrameRect) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - AssertConfiguringPipelineFails(decoder, - RemoveFrameRectConfig { aFrameRect }, - SurfaceConfig { decoder, aSize, - SurfaceFormat::B8G8R8A8, false }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_0_0_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 100))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_0_0_0_0) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(0, 0, 0, 0), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus50_50_0_0) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(-50, 50, 0, 0), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_50_Minus50_0_0) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(50, -50, 0, 0), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_150_50_0_0) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(150, 50, 0, 0), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_50_150_0_0) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(50, 150, 0, 0), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_200_200_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(200, 200, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Note that aInputRect is zero-size because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows - // unfortunately can't be ignored.) - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus200_25_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(-200, 25, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Note that aInputRect is zero-size because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows - // unfortunately can't be ignored.) - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_Minus200_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(25, -200, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Note that aInputRect is zero-size because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows - // unfortunately can't be ignored.) - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_200_25_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(200, 25, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Note that aInputRect is zero-size because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows - // unfortunately can't be ignored.) - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_200_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(25, 200, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Note that aInputRect is zero-size because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows - // unfortunately can't be ignored.) - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus200_Minus200_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(-200, -200, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus50_Minus50_100_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(-50, -50, 100, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 100)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 50, 50))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus50_25_100_50) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(-50, 25, 100, 50), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 50)), - /* aOutputWriteRect = */ Some(IntRect(0, 25, 50, 50))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_Minus50_50_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(25, -50, 50, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 50, 100)), - /* aOutputWriteRect = */ Some(IntRect(25, 0, 50, 50))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_50_25_100_50) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(50, 25, 100, 50), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 50)), - /* aOutputWriteRect = */ Some(IntRect(50, 25, 50, 50))); - }); -} - -TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_50_50_100) -{ - WithRemoveFrameRectFilter(IntSize(100, 100), - IntRect(25, 50, 50, 100), - [](Decoder* aDecoder, SurfaceFilter* aFilter) { - // Note that aInputRect is 50x50 because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows - // unfortunately can't be ignored.) - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 50, 50)), - /* aOutputWriteRect = */ Some(IntRect(25, 50, 50, 100))); - }); -} - -TEST(ImageRemoveFrameRectFilter, RemoveFrameRectFailsFor0_0_to_0_0_100_100) -{ - // A zero-size image is disallowed. - AssertConfiguringRemoveFrameRectFilterFails(IntSize(0, 0), - IntRect(0, 0, 100, 100)); -} - -TEST(ImageRemoveFrameRectFilter, RemoveFrameRectFailsForMinus1_Minus1_to_0_0_100_100) -{ - // A negative-size image is disallowed. - AssertConfiguringRemoveFrameRectFilterFails(IntSize(-1, -1), - IntRect(0, 0, 100, 100)); -} - -TEST(ImageRemoveFrameRectFilter, RemoveFrameRectFailsFor100_100_to_0_0_0_0) -{ - // A zero size frame rect is disallowed. - AssertConfiguringRemoveFrameRectFilterFails(IntSize(100, 100), - IntRect(0, 0, -1, -1)); -} - -TEST(ImageRemoveFrameRectFilter, RemoveFrameRectFailsFor100_100_to_0_0_Minus1_Minus1) -{ - // A negative size frame rect is disallowed. - AssertConfiguringRemoveFrameRectFilterFails(IntSize(100, 100), - IntRect(0, 0, -1, -1)); -} - -TEST(ImageRemoveFrameRectFilter, ConfiguringPalettedRemoveFrameRectFails) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // RemoveFrameRectFilter does not support paletted images, so configuration - // should fail. - AssertConfiguringPipelineFails(decoder, - RemoveFrameRectConfig { IntRect(0, 0, 50, 50) }, - PalettedSurfaceConfig { decoder, IntSize(100, 100), - IntRect(0, 0, 50, 50), - SurfaceFormat::B8G8R8A8, 8, - false }); -} diff --git a/image/test/gtest/TestSourceBuffer.cpp b/image/test/gtest/TestSourceBuffer.cpp deleted file mode 100644 index 05a88093f..000000000 --- a/image/test/gtest/TestSourceBuffer.cpp +++ /dev/null @@ -1,810 +0,0 @@ -/* 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 "gtest/gtest.h" - -#include <algorithm> -#include <cstdint> - -#include "mozilla/Move.h" -#include "SourceBuffer.h" -#include "SurfaceCache.h" - -using namespace mozilla; -using namespace mozilla::image; - -using std::min; - -void -ExpectChunkAndByteCount(const SourceBufferIterator& aIterator, - uint32_t aChunks, - size_t aBytes) -{ - EXPECT_EQ(aChunks, aIterator.ChunkCount()); - EXPECT_EQ(aBytes, aIterator.ByteCount()); -} - -void -ExpectRemainingBytes(const SourceBufferIterator& aIterator, size_t aBytes) -{ - EXPECT_TRUE(aIterator.RemainingBytesIsNoMoreThan(aBytes)); - EXPECT_TRUE(aIterator.RemainingBytesIsNoMoreThan(aBytes + 1)); - - if (aBytes > 0) { - EXPECT_FALSE(aIterator.RemainingBytesIsNoMoreThan(0)); - EXPECT_FALSE(aIterator.RemainingBytesIsNoMoreThan(aBytes - 1)); - } -} - -char -GenerateByte(size_t aIndex) -{ - uint8_t byte = aIndex % 256; - return *reinterpret_cast<char*>(&byte); -} - -void -GenerateData(char* aOutput, size_t aOffset, size_t aLength) -{ - for (size_t i = 0; i < aLength; ++i) { - aOutput[i] = GenerateByte(aOffset + i); - } -} - -void -GenerateData(char* aOutput, size_t aLength) -{ - GenerateData(aOutput, 0, aLength); -} - -void -CheckData(const char* aData, size_t aOffset, size_t aLength) -{ - for (size_t i = 0; i < aLength; ++i) { - ASSERT_EQ(GenerateByte(aOffset + i), aData[i]); - } -} - -enum class AdvanceMode -{ - eAdvanceAsMuchAsPossible, - eAdvanceByLengthExactly -}; - -class ImageSourceBuffer : public ::testing::Test -{ -public: - ImageSourceBuffer() - : mSourceBuffer(new SourceBuffer) - , mExpectNoResume(new ExpectNoResume) - , mCountResumes(new CountResumes) - { - GenerateData(mData, sizeof(mData)); - EXPECT_FALSE(mSourceBuffer->IsComplete()); - } - -protected: - void CheckedAppendToBuffer(const char* aData, size_t aLength) - { - EXPECT_TRUE(NS_SUCCEEDED(mSourceBuffer->Append(aData, aLength))); - } - - void CheckedAppendToBufferLastByteForLength(size_t aLength) - { - const char lastByte = GenerateByte(aLength); - CheckedAppendToBuffer(&lastByte, 1); - } - - void CheckedAppendToBufferInChunks(size_t aChunkLength, size_t aTotalLength) - { - char* data = new char[aChunkLength]; - - size_t bytesWritten = 0; - while (bytesWritten < aTotalLength) { - GenerateData(data, bytesWritten, aChunkLength); - size_t toWrite = min(aChunkLength, aTotalLength - bytesWritten); - CheckedAppendToBuffer(data, toWrite); - bytesWritten += toWrite; - } - - delete[] data; - } - - void CheckedCompleteBuffer(nsresult aCompletionStatus = NS_OK) - { - mSourceBuffer->Complete(aCompletionStatus); - EXPECT_TRUE(mSourceBuffer->IsComplete()); - } - - void CheckedCompleteBuffer(SourceBufferIterator& aIterator, - size_t aLength, - nsresult aCompletionStatus = NS_OK) - { - CheckedCompleteBuffer(aCompletionStatus); - ExpectRemainingBytes(aIterator, aLength); - } - - void CheckedAdvanceIteratorStateOnly(SourceBufferIterator& aIterator, - size_t aLength, - uint32_t aChunks, - size_t aTotalLength, - AdvanceMode aAdvanceMode - = AdvanceMode::eAdvanceAsMuchAsPossible) - { - const size_t advanceBy = aAdvanceMode == AdvanceMode::eAdvanceAsMuchAsPossible - ? SIZE_MAX - : aLength; - - auto state = aIterator.AdvanceOrScheduleResume(advanceBy, mExpectNoResume); - ASSERT_EQ(SourceBufferIterator::READY, state); - EXPECT_TRUE(aIterator.Data()); - EXPECT_EQ(aLength, aIterator.Length()); - - ExpectChunkAndByteCount(aIterator, aChunks, aTotalLength); - } - - void CheckedAdvanceIteratorStateOnly(SourceBufferIterator& aIterator, - size_t aLength) - { - CheckedAdvanceIteratorStateOnly(aIterator, aLength, 1, aLength); - } - - void CheckedAdvanceIterator(SourceBufferIterator& aIterator, - size_t aLength, - uint32_t aChunks, - size_t aTotalLength, - AdvanceMode aAdvanceMode - = AdvanceMode::eAdvanceAsMuchAsPossible) - { - // Check that the iterator is in the expected state. - CheckedAdvanceIteratorStateOnly(aIterator, aLength, aChunks, - aTotalLength, aAdvanceMode); - - // Check that we read the expected data. To do this, we need to compute our - // offset in the SourceBuffer, but fortunately that's pretty easy: it's the - // total number of bytes the iterator has advanced through, minus the length - // of the current chunk. - const size_t offset = aIterator.ByteCount() - aIterator.Length(); - CheckData(aIterator.Data(), offset, aIterator.Length()); - } - - void CheckedAdvanceIterator(SourceBufferIterator& aIterator, size_t aLength) - { - CheckedAdvanceIterator(aIterator, aLength, 1, aLength); - } - - void CheckIteratorMustWait(SourceBufferIterator& aIterator, - IResumable* aOnResume) - { - auto state = aIterator.AdvanceOrScheduleResume(1, aOnResume); - EXPECT_EQ(SourceBufferIterator::WAITING, state); - } - - void CheckIteratorIsComplete(SourceBufferIterator& aIterator, - uint32_t aChunks, - size_t aTotalLength, - nsresult aCompletionStatus = NS_OK) - { - ASSERT_TRUE(mSourceBuffer->IsComplete()); - auto state = aIterator.AdvanceOrScheduleResume(1, mExpectNoResume); - ASSERT_EQ(SourceBufferIterator::COMPLETE, state); - EXPECT_EQ(aCompletionStatus, aIterator.CompletionStatus()); - ExpectRemainingBytes(aIterator, 0); - ExpectChunkAndByteCount(aIterator, aChunks, aTotalLength); - } - - void CheckIteratorIsComplete(SourceBufferIterator& aIterator, - size_t aTotalLength) - { - CheckIteratorIsComplete(aIterator, 1, aTotalLength); - } - - AutoInitializeImageLib mInit; - char mData[9]; - RefPtr<SourceBuffer> mSourceBuffer; - RefPtr<ExpectNoResume> mExpectNoResume; - RefPtr<CountResumes> mCountResumes; -}; - -TEST_F(ImageSourceBuffer, InitialState) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // RemainingBytesIsNoMoreThan() should always return false in the initial - // state, since we can't know the answer until Complete() has been called. - EXPECT_FALSE(iterator.RemainingBytesIsNoMoreThan(0)); - EXPECT_FALSE(iterator.RemainingBytesIsNoMoreThan(SIZE_MAX)); - - // We haven't advanced our iterator at all, so its counters should be zero. - ExpectChunkAndByteCount(iterator, 0, 0); - - // Attempt to advance; we should fail, and end up in the WAITING state. We - // expect no resumes because we don't actually append anything to the - // SourceBuffer in this test. - CheckIteratorMustWait(iterator, mExpectNoResume); -} - -TEST_F(ImageSourceBuffer, ZeroLengthBufferAlwaysFails) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Complete the buffer without writing to it, providing a successful - // completion status. - CheckedCompleteBuffer(iterator, 0); - - // Completing a buffer without writing to it results in an automatic failure; - // make sure that the actual completion status we get from the iterator - // reflects this. - CheckIteratorIsComplete(iterator, 0, 0, NS_ERROR_FAILURE); -} - -TEST_F(ImageSourceBuffer, CompleteSuccess) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write a single byte to the buffer and complete the buffer. (We have to - // write at least one byte because completing a zero length buffer always - // fails; see the ZeroLengthBufferAlwaysFails test.) - CheckedAppendToBuffer(mData, 1); - CheckedCompleteBuffer(iterator, 1); - - // We should be able to advance once (to read the single byte) and then should - // reach the COMPLETE state with a successful status. - CheckedAdvanceIterator(iterator, 1); - CheckIteratorIsComplete(iterator, 1); -} - -TEST_F(ImageSourceBuffer, CompleteFailure) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write a single byte to the buffer and complete the buffer. (We have to - // write at least one byte because completing a zero length buffer always - // fails; see the ZeroLengthBufferAlwaysFails test.) - CheckedAppendToBuffer(mData, 1); - CheckedCompleteBuffer(iterator, 1, NS_ERROR_FAILURE); - - // Advance the iterator. Because a failing status is propagated to the - // iterator as soon as it advances, we won't be able to read the single byte - // that we wrote above; we go directly into the COMPLETE state. - CheckIteratorIsComplete(iterator, 0, 0, NS_ERROR_FAILURE); -} - -TEST_F(ImageSourceBuffer, Append) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write test data to the buffer. - EXPECT_TRUE(NS_SUCCEEDED(mSourceBuffer->ExpectLength(sizeof(mData)))); - CheckedAppendToBuffer(mData, sizeof(mData)); - CheckedCompleteBuffer(iterator, sizeof(mData)); - - // Verify that we can read it back via the iterator, and that the final state - // is what we expect. - CheckedAdvanceIterator(iterator, sizeof(mData)); - CheckIteratorIsComplete(iterator, sizeof(mData)); -} - -TEST_F(ImageSourceBuffer, HugeAppendFails) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // We should fail to append anything bigger than what the SurfaceCache can - // hold, so use the SurfaceCache's maximum capacity to calculate what a - // "massive amount of data" (see below) consists of on this platform. - ASSERT_LT(SurfaceCache::MaximumCapacity(), SIZE_MAX); - const size_t hugeSize = SurfaceCache::MaximumCapacity() + 1; - - // Attempt to write a massive amount of data and verify that it fails. (We'd - // get a buffer overrun during the test if it succeeds, but if it succeeds - // that's the least of our problems.) - EXPECT_TRUE(NS_FAILED(mSourceBuffer->Append(mData, hugeSize))); - EXPECT_TRUE(mSourceBuffer->IsComplete()); - CheckIteratorIsComplete(iterator, 0, 0, NS_ERROR_OUT_OF_MEMORY); -} - -TEST_F(ImageSourceBuffer, AppendFromInputStream) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Construct an input stream with some arbitrary data. (We use test data from - // one of the decoder tests.) - nsCOMPtr<nsIInputStream> inputStream = LoadFile(GreenPNGTestCase().mPath); - ASSERT_TRUE(inputStream != nullptr); - - // Figure out how much data we have. - uint64_t length; - ASSERT_TRUE(NS_SUCCEEDED(inputStream->Available(&length))); - - // Write test data to the buffer. - EXPECT_TRUE(NS_SUCCEEDED(mSourceBuffer->AppendFromInputStream(inputStream, - length))); - CheckedCompleteBuffer(iterator, length); - - // Verify that the iterator sees the appropriate amount of data. - CheckedAdvanceIteratorStateOnly(iterator, length); - CheckIteratorIsComplete(iterator, length); -} - -TEST_F(ImageSourceBuffer, AppendAfterComplete) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write test data to the buffer. - EXPECT_TRUE(NS_SUCCEEDED(mSourceBuffer->ExpectLength(sizeof(mData)))); - CheckedAppendToBuffer(mData, sizeof(mData)); - CheckedCompleteBuffer(iterator, sizeof(mData)); - - // Verify that we can read it back via the iterator, and that the final state - // is what we expect. - CheckedAdvanceIterator(iterator, sizeof(mData)); - CheckIteratorIsComplete(iterator, sizeof(mData)); - - // Write more data to the completed buffer. - EXPECT_TRUE(NS_FAILED(mSourceBuffer->Append(mData, sizeof(mData)))); - - // Try to read with a new iterator and verify that the new data got ignored. - SourceBufferIterator iterator2 = mSourceBuffer->Iterator(); - CheckedAdvanceIterator(iterator2, sizeof(mData)); - CheckIteratorIsComplete(iterator2, sizeof(mData)); -} - -TEST_F(ImageSourceBuffer, MinChunkCapacity) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write test data to the buffer using many small appends. Since - // ExpectLength() isn't being called, we should be able to write up to - // SourceBuffer::MIN_CHUNK_CAPACITY bytes without a second chunk being - // allocated. - CheckedAppendToBufferInChunks(10, SourceBuffer::MIN_CHUNK_CAPACITY); - - // Verify that the iterator sees the appropriate amount of data. - CheckedAdvanceIterator(iterator, SourceBuffer::MIN_CHUNK_CAPACITY); - - // Write one more byte; we expect to see that it triggers an allocation. - CheckedAppendToBufferLastByteForLength(SourceBuffer::MIN_CHUNK_CAPACITY); - CheckedCompleteBuffer(iterator, 1); - - // Verify that the iterator sees the new byte and a new chunk has been - // allocated. - CheckedAdvanceIterator(iterator, 1, 2, SourceBuffer::MIN_CHUNK_CAPACITY + 1); - CheckIteratorIsComplete(iterator, 2, SourceBuffer::MIN_CHUNK_CAPACITY + 1); -} - -TEST_F(ImageSourceBuffer, ExpectLengthDoesNotShrinkBelowMinCapacity) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the buffer, - // but call ExpectLength() first to make SourceBuffer expect only a single - // byte. We expect this to still result in only one chunk, because - // regardless of ExpectLength() we won't allocate a chunk smaller than - // MIN_CHUNK_CAPACITY bytes. - EXPECT_TRUE(NS_SUCCEEDED(mSourceBuffer->ExpectLength(1))); - CheckedAppendToBufferInChunks(10, SourceBuffer::MIN_CHUNK_CAPACITY); - CheckedCompleteBuffer(iterator, SourceBuffer::MIN_CHUNK_CAPACITY); - - // Verify that the iterator sees a single chunk. - CheckedAdvanceIterator(iterator, SourceBuffer::MIN_CHUNK_CAPACITY); - CheckIteratorIsComplete(iterator, 1, SourceBuffer::MIN_CHUNK_CAPACITY); -} - -TEST_F(ImageSourceBuffer, ExpectLengthGrowsAboveMinCapacity) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write two times SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the - // buffer, calling ExpectLength() with the correct length first. We expect - // this to result in only one chunk, because ExpectLength() allows us to - // allocate a larger first chunk than MIN_CHUNK_CAPACITY bytes. - const size_t length = 2 * SourceBuffer::MIN_CHUNK_CAPACITY; - EXPECT_TRUE(NS_SUCCEEDED(mSourceBuffer->ExpectLength(length))); - CheckedAppendToBufferInChunks(10, length); - - // Verify that the iterator sees a single chunk. - CheckedAdvanceIterator(iterator, length); - - // Write one more byte; we expect to see that it triggers an allocation. - CheckedAppendToBufferLastByteForLength(length); - CheckedCompleteBuffer(iterator, 1); - - // Verify that the iterator sees the new byte and a new chunk has been - // allocated. - CheckedAdvanceIterator(iterator, 1, 2, length + 1); - CheckIteratorIsComplete(iterator, 2, length + 1); -} - -TEST_F(ImageSourceBuffer, HugeExpectLengthFails) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // ExpectLength() should fail if the length is bigger than what the - // SurfaceCache can hold, so use the SurfaceCache's maximum capacity to - // calculate what a "massive amount of data" (see below) consists of on this - // platform. - ASSERT_LT(SurfaceCache::MaximumCapacity(), SIZE_MAX); - const size_t hugeSize = SurfaceCache::MaximumCapacity() + 1; - - // Attempt to write a massive amount of data and verify that it fails. (We'd - // get a buffer overrun during the test if it succeeds, but if it succeeds - // that's the least of our problems.) - EXPECT_TRUE(NS_FAILED(mSourceBuffer->ExpectLength(hugeSize))); - EXPECT_TRUE(mSourceBuffer->IsComplete()); - CheckIteratorIsComplete(iterator, 0, 0, NS_ERROR_OUT_OF_MEMORY); -} - -TEST_F(ImageSourceBuffer, LargeAppendsAllocateOnlyOneChunk) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write two times SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the - // buffer in a single Append() call. We expect this to result in only one - // chunk even though ExpectLength() wasn't called, because we should always - // allocate a new chunk large enough to store the data we have at hand. - constexpr size_t length = 2 * SourceBuffer::MIN_CHUNK_CAPACITY; - char data[length]; - GenerateData(data, sizeof(data)); - CheckedAppendToBuffer(data, length); - - // Verify that the iterator sees a single chunk. - CheckedAdvanceIterator(iterator, length); - - // Write one more byte; we expect to see that it triggers an allocation. - CheckedAppendToBufferLastByteForLength(length); - CheckedCompleteBuffer(iterator, 1); - - // Verify that the iterator sees the new byte and a new chunk has been - // allocated. - CheckedAdvanceIterator(iterator, 1, 2, length + 1); - CheckIteratorIsComplete(iterator, 2, length + 1); -} - -TEST_F(ImageSourceBuffer, LargeAppendsAllocateAtMostOneChunk) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Allocate some data we'll use below. - constexpr size_t firstWriteLength = SourceBuffer::MIN_CHUNK_CAPACITY / 2; - constexpr size_t secondWriteLength = 3 * SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = firstWriteLength + secondWriteLength; - char data[totalLength]; - GenerateData(data, sizeof(data)); - - // Write half of SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the - // buffer in a single Append() call. This should fill half of the first chunk. - CheckedAppendToBuffer(data, firstWriteLength); - - // Write three times SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the - // buffer in a single Append() call. We expect this to result in the first of - // the first chunk being filled and a new chunk being allocated for the - // remainder. - CheckedAppendToBuffer(data + firstWriteLength, secondWriteLength); - - // Verify that the iterator sees a MIN_CHUNK_CAPACITY-length chunk. - CheckedAdvanceIterator(iterator, SourceBuffer::MIN_CHUNK_CAPACITY); - - // Verify that the iterator sees a second chunk of the length we expect. - const size_t expectedSecondChunkLength = - totalLength - SourceBuffer::MIN_CHUNK_CAPACITY; - CheckedAdvanceIterator(iterator, expectedSecondChunkLength, 2, totalLength); - - // Write one more byte; we expect to see that it triggers an allocation. - CheckedAppendToBufferLastByteForLength(totalLength); - CheckedCompleteBuffer(iterator, 1); - - // Verify that the iterator sees the new byte and a new chunk has been - // allocated. - CheckedAdvanceIterator(iterator, 1, 3, totalLength + 1); - CheckIteratorIsComplete(iterator, 3, totalLength + 1); -} - -TEST_F(ImageSourceBuffer, CompactionHappensWhenBufferIsComplete) -{ - constexpr size_t chunkLength = SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = 2 * chunkLength; - - // Write enough data to create two chunks. - CheckedAppendToBufferInChunks(chunkLength, totalLength); - - { - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Verify that the iterator sees two chunks. - CheckedAdvanceIterator(iterator, chunkLength); - CheckedAdvanceIterator(iterator, chunkLength, 2, totalLength); - } - - // Complete the buffer, which should trigger compaction implicitly. - CheckedCompleteBuffer(); - - { - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Verify that compaction happened and there's now only one chunk. - CheckedAdvanceIterator(iterator, totalLength); - CheckIteratorIsComplete(iterator, 1, totalLength); - } -} - -TEST_F(ImageSourceBuffer, CompactionIsDelayedWhileIteratorsExist) -{ - constexpr size_t chunkLength = SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = 2 * chunkLength; - - { - SourceBufferIterator outerIterator = mSourceBuffer->Iterator(); - - { - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Write enough data to create two chunks. - CheckedAppendToBufferInChunks(chunkLength, totalLength); - CheckedCompleteBuffer(iterator, totalLength); - - // Verify that the iterator sees two chunks. Since there are live - // iterators, compaction shouldn't have happened when we completed the - // buffer. - CheckedAdvanceIterator(iterator, chunkLength); - CheckedAdvanceIterator(iterator, chunkLength, 2, totalLength); - CheckIteratorIsComplete(iterator, 2, totalLength); - } - - // Now |iterator| has been destroyed, but |outerIterator| still exists, so - // we expect no compaction to have occurred at this point. - CheckedAdvanceIterator(outerIterator, chunkLength); - CheckedAdvanceIterator(outerIterator, chunkLength, 2, totalLength); - CheckIteratorIsComplete(outerIterator, 2, totalLength); - } - - // Now all iterators have been destroyed. Since the buffer was already - // complete, we expect compaction to happen implicitly here. - - { - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Verify that compaction happened and there's now only one chunk. - CheckedAdvanceIterator(iterator, totalLength); - CheckIteratorIsComplete(iterator, 1, totalLength); - } -} - -TEST_F(ImageSourceBuffer, SourceBufferIteratorsCanBeMoved) -{ - constexpr size_t chunkLength = SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = 2 * chunkLength; - - // Write enough data to create two chunks. We create an iterator here to make - // sure that compaction doesn't happen during the test. - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - CheckedAppendToBufferInChunks(chunkLength, totalLength); - CheckedCompleteBuffer(iterator, totalLength); - - auto GetIterator = [&]{ - SourceBufferIterator lambdaIterator = mSourceBuffer->Iterator(); - CheckedAdvanceIterator(lambdaIterator, chunkLength); - return lambdaIterator; - }; - - // Move-construct |movedIterator| from the iterator returned from - // GetIterator() and check that its state is as we expect. - SourceBufferIterator movedIterator = Move(GetIterator()); - EXPECT_TRUE(movedIterator.Data()); - EXPECT_EQ(chunkLength, movedIterator.Length()); - ExpectChunkAndByteCount(movedIterator, 1, chunkLength); - - // Make sure that we can advance the iterator. - CheckedAdvanceIterator(movedIterator, chunkLength, 2, totalLength); - - // Make sure that the iterator handles completion properly. - CheckIteratorIsComplete(movedIterator, 2, totalLength); - - // Move-assign |movedIterator| from the iterator returned from - // GetIterator() and check that its state is as we expect. - movedIterator = Move(GetIterator()); - EXPECT_TRUE(movedIterator.Data()); - EXPECT_EQ(chunkLength, movedIterator.Length()); - ExpectChunkAndByteCount(movedIterator, 1, chunkLength); - - // Make sure that we can advance the iterator. - CheckedAdvanceIterator(movedIterator, chunkLength, 2, totalLength); - - // Make sure that the iterator handles completion properly. - CheckIteratorIsComplete(movedIterator, 2, totalLength); -} - -TEST_F(ImageSourceBuffer, SubchunkAdvance) -{ - constexpr size_t chunkLength = SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = 2 * chunkLength; - - // Write enough data to create two chunks. We create our iterator here to make - // sure that compaction doesn't happen during the test. - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - CheckedAppendToBufferInChunks(chunkLength, totalLength); - CheckedCompleteBuffer(iterator, totalLength); - - // Advance through the first chunk. The chunk count should not increase. - // We check that by always passing 1 for the |aChunks| parameter of - // CheckedAdvanceIteratorStateOnly(). We have to call CheckData() manually - // because the offset calculation in CheckedAdvanceIterator() assumes that - // we're advancing a chunk at a time. - size_t offset = 0; - while (offset < chunkLength) { - CheckedAdvanceIteratorStateOnly(iterator, 1, 1, chunkLength, - AdvanceMode::eAdvanceByLengthExactly); - CheckData(iterator.Data(), offset++, iterator.Length()); - } - - // Read the first byte of the second chunk. This is the point at which we - // can't advance within the same chunk, so the chunk count should increase. We - // check that by passing 2 for the |aChunks| parameter of - // CheckedAdvanceIteratorStateOnly(). - CheckedAdvanceIteratorStateOnly(iterator, 1, 2, totalLength, - AdvanceMode::eAdvanceByLengthExactly); - CheckData(iterator.Data(), offset++, iterator.Length()); - - // Read the rest of the second chunk. The chunk count should not increase. - while (offset < totalLength) { - CheckedAdvanceIteratorStateOnly(iterator, 1, 2, totalLength, - AdvanceMode::eAdvanceByLengthExactly); - CheckData(iterator.Data(), offset++, iterator.Length()); - } - - // Make sure we reached the end. - CheckIteratorIsComplete(iterator, 2, totalLength); -} - -TEST_F(ImageSourceBuffer, SubchunkZeroByteAdvance) -{ - constexpr size_t chunkLength = SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = 2 * chunkLength; - - // Write enough data to create two chunks. We create our iterator here to make - // sure that compaction doesn't happen during the test. - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - CheckedAppendToBufferInChunks(chunkLength, totalLength); - CheckedCompleteBuffer(iterator, totalLength); - - // Make an initial zero-length advance. Although a zero-length advance - // normally won't cause us to read a chunk from the SourceBuffer, we'll do so - // if the iterator is in the initial state to keep the invariant that - // SourceBufferIterator in the READY state always returns a non-null pointer - // from Data(). - CheckedAdvanceIteratorStateOnly(iterator, 0, 1, chunkLength, - AdvanceMode::eAdvanceByLengthExactly); - - // Advance through the first chunk. As in the |SubchunkAdvance| test, the - // chunk count should not increase. We do a zero-length advance after each - // normal advance to ensure that zero-length advances do not change the - // iterator's position or cause a new chunk to be read. - size_t offset = 0; - while (offset < chunkLength) { - CheckedAdvanceIteratorStateOnly(iterator, 1, 1, chunkLength, - AdvanceMode::eAdvanceByLengthExactly); - CheckData(iterator.Data(), offset++, iterator.Length()); - CheckedAdvanceIteratorStateOnly(iterator, 0, 1, chunkLength, - AdvanceMode::eAdvanceByLengthExactly); - } - - // Read the first byte of the second chunk. This is the point at which we - // can't advance within the same chunk, so the chunk count should increase. As - // before, we do a zero-length advance afterward. - CheckedAdvanceIteratorStateOnly(iterator, 1, 2, totalLength, - AdvanceMode::eAdvanceByLengthExactly); - CheckData(iterator.Data(), offset++, iterator.Length()); - CheckedAdvanceIteratorStateOnly(iterator, 0, 2, totalLength, - AdvanceMode::eAdvanceByLengthExactly); - - // Read the rest of the second chunk. The chunk count should not increase. As - // before, we do a zero-length advance after each normal advance. - while (offset < totalLength) { - CheckedAdvanceIteratorStateOnly(iterator, 1, 2, totalLength, - AdvanceMode::eAdvanceByLengthExactly); - CheckData(iterator.Data(), offset++, iterator.Length()); - CheckedAdvanceIteratorStateOnly(iterator, 0, 2, totalLength, - AdvanceMode::eAdvanceByLengthExactly); - } - - // Make sure we reached the end. - CheckIteratorIsComplete(iterator, 2, totalLength); -} - -TEST_F(ImageSourceBuffer, SubchunkZeroByteAdvanceWithNoData) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Check that advancing by zero bytes still makes us enter the WAITING state. - // This is because if we entered the READY state before reading any data at - // all, we'd break the invariant that SourceBufferIterator::Data() always - // returns a non-null pointer in the READY state. - auto state = iterator.AdvanceOrScheduleResume(0, mCountResumes); - EXPECT_EQ(SourceBufferIterator::WAITING, state); - - // Call Complete(). This should trigger a resume. - CheckedCompleteBuffer(); - EXPECT_EQ(1u, mCountResumes->Count()); -} - -TEST_F(ImageSourceBuffer, NullIResumable) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Check that we can't advance. - CheckIteratorMustWait(iterator, nullptr); - - // Append to the buffer, which would cause a resume if we had passed a - // non-null IResumable. - CheckedAppendToBuffer(mData, sizeof(mData)); - CheckedCompleteBuffer(iterator, sizeof(mData)); -} - -TEST_F(ImageSourceBuffer, AppendTriggersResume) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Check that we can't advance. - CheckIteratorMustWait(iterator, mCountResumes); - - // Call Append(). This should trigger a resume. - mSourceBuffer->Append(mData, sizeof(mData)); - EXPECT_EQ(1u, mCountResumes->Count()); -} - -TEST_F(ImageSourceBuffer, OnlyOneResumeTriggeredPerAppend) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Check that we can't advance. - CheckIteratorMustWait(iterator, mCountResumes); - - // Allocate some data we'll use below. - constexpr size_t firstWriteLength = SourceBuffer::MIN_CHUNK_CAPACITY / 2; - constexpr size_t secondWriteLength = 3 * SourceBuffer::MIN_CHUNK_CAPACITY; - constexpr size_t totalLength = firstWriteLength + secondWriteLength; - char data[totalLength]; - GenerateData(data, sizeof(data)); - - // Write half of SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the - // buffer in a single Append() call. This should fill half of the first chunk. - // This should trigger a resume. - CheckedAppendToBuffer(data, firstWriteLength); - EXPECT_EQ(1u, mCountResumes->Count()); - - // Advance past the new data and wait again. - CheckedAdvanceIterator(iterator, firstWriteLength); - CheckIteratorMustWait(iterator, mCountResumes); - - // Write three times SourceBuffer::MIN_CHUNK_CAPACITY bytes of test data to the - // buffer in a single Append() call. We expect this to result in the first of - // the first chunk being filled and a new chunk being allocated for the - // remainder. Even though two chunks are getting written to here, only *one* - // resume should get triggered, for a total of two in this test. - CheckedAppendToBuffer(data + firstWriteLength, secondWriteLength); - EXPECT_EQ(2u, mCountResumes->Count()); -} - -TEST_F(ImageSourceBuffer, CompleteTriggersResume) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Check that we can't advance. - CheckIteratorMustWait(iterator, mCountResumes); - - // Call Complete(). This should trigger a resume. - CheckedCompleteBuffer(); - EXPECT_EQ(1u, mCountResumes->Count()); -} - -TEST_F(ImageSourceBuffer, ExpectLengthDoesNotTriggerResume) -{ - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - - // Check that we can't advance. - CheckIteratorMustWait(iterator, mExpectNoResume); - - // Call ExpectLength(). If this triggers a resume, |mExpectNoResume| will - // ensure that the test fails. - mSourceBuffer->ExpectLength(1000); -} diff --git a/image/test/gtest/TestStreamingLexer.cpp b/image/test/gtest/TestStreamingLexer.cpp deleted file mode 100644 index 590b10e81..000000000 --- a/image/test/gtest/TestStreamingLexer.cpp +++ /dev/null @@ -1,973 +0,0 @@ -/* 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 "gtest/gtest.h" - -#include "mozilla/Vector.h" -#include "StreamingLexer.h" - -using namespace mozilla; -using namespace mozilla::image; - -enum class TestState -{ - ONE, - TWO, - THREE, - UNBUFFERED, - TRUNCATED_SUCCESS, - TRUNCATED_FAILURE -}; - -void -CheckLexedData(const char* aData, - size_t aLength, - size_t aOffset, - size_t aExpectedLength) -{ - EXPECT_TRUE(aLength == aExpectedLength); - - for (size_t i = 0; i < aLength; ++i) { - EXPECT_EQ(aData[i], char(aOffset + i + 1)); - } -} - -LexerTransition<TestState> -DoLex(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 3); - return Transition::To(TestState::TWO, 3); - case TestState::TWO: - CheckLexedData(aData, aLength, 3, 3); - return Transition::To(TestState::THREE, 3); - case TestState::THREE: - CheckLexedData(aData, aLength, 6, 3); - return Transition::TerminateSuccess(); - case TestState::TRUNCATED_SUCCESS: - return Transition::TerminateSuccess(); - case TestState::TRUNCATED_FAILURE: - return Transition::TerminateFailure(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithUnbuffered(TestState aState, const char* aData, size_t aLength, - Vector<char>& aUnbufferedVector) -{ - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 3); - return Transition::ToUnbuffered(TestState::TWO, TestState::UNBUFFERED, 3); - case TestState::TWO: - CheckLexedData(aUnbufferedVector.begin(), aUnbufferedVector.length(), 3, 3); - return Transition::To(TestState::THREE, 3); - case TestState::THREE: - CheckLexedData(aData, aLength, 6, 3); - return Transition::TerminateSuccess(); - case TestState::UNBUFFERED: - EXPECT_TRUE(aLength <= 3); - EXPECT_TRUE(aUnbufferedVector.append(aData, aLength)); - return Transition::ContinueUnbuffered(TestState::UNBUFFERED); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithUnbufferedTerminate(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 3); - return Transition::ToUnbuffered(TestState::TWO, TestState::UNBUFFERED, 3); - case TestState::UNBUFFERED: - return Transition::TerminateSuccess(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithYield(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 3); - return Transition::ToAfterYield(TestState::TWO); - case TestState::TWO: - CheckLexedData(aData, aLength, 0, 3); - return Transition::To(TestState::THREE, 6); - case TestState::THREE: - CheckLexedData(aData, aLength, 3, 6); - return Transition::TerminateSuccess(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithTerminateAfterYield(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 3); - return Transition::ToAfterYield(TestState::TWO); - case TestState::TWO: - return Transition::TerminateSuccess(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithZeroLengthStates(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - EXPECT_TRUE(aLength == 0); - return Transition::To(TestState::TWO, 0); - case TestState::TWO: - EXPECT_TRUE(aLength == 0); - return Transition::To(TestState::THREE, 9); - case TestState::THREE: - CheckLexedData(aData, aLength, 0, 9); - return Transition::TerminateSuccess(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithZeroLengthStatesAtEnd(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 9); - return Transition::To(TestState::TWO, 0); - case TestState::TWO: - EXPECT_TRUE(aLength == 0); - return Transition::To(TestState::THREE, 0); - case TestState::THREE: - EXPECT_TRUE(aLength == 0); - return Transition::TerminateSuccess(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithZeroLengthYield(TestState aState, const char* aData, size_t aLength) -{ - switch (aState) { - case TestState::ONE: - EXPECT_EQ(0u, aLength); - return Transition::ToAfterYield(TestState::TWO); - case TestState::TWO: - EXPECT_EQ(0u, aLength); - return Transition::To(TestState::THREE, 9); - case TestState::THREE: - CheckLexedData(aData, aLength, 0, 9); - return Transition::TerminateSuccess(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithZeroLengthStatesUnbuffered(TestState aState, - const char* aData, - size_t aLength) -{ - switch (aState) { - case TestState::ONE: - EXPECT_TRUE(aLength == 0); - return Transition::ToUnbuffered(TestState::TWO, TestState::UNBUFFERED, 0); - case TestState::TWO: - EXPECT_TRUE(aLength == 0); - return Transition::To(TestState::THREE, 9); - case TestState::THREE: - CheckLexedData(aData, aLength, 0, 9); - return Transition::TerminateSuccess(); - case TestState::UNBUFFERED: - ADD_FAILURE() << "Should not enter zero-length unbuffered state"; - return Transition::TerminateFailure(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -LexerTransition<TestState> -DoLexWithZeroLengthStatesAfterUnbuffered(TestState aState, - const char* aData, - size_t aLength) -{ - switch (aState) { - case TestState::ONE: - EXPECT_TRUE(aLength == 0); - return Transition::ToUnbuffered(TestState::TWO, TestState::UNBUFFERED, 9); - case TestState::TWO: - EXPECT_TRUE(aLength == 0); - return Transition::To(TestState::THREE, 0); - case TestState::THREE: - EXPECT_TRUE(aLength == 0); - return Transition::TerminateSuccess(); - case TestState::UNBUFFERED: - CheckLexedData(aData, aLength, 0, 9); - return Transition::ContinueUnbuffered(TestState::UNBUFFERED); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } -} - -class ImageStreamingLexer : public ::testing::Test -{ -public: - // Note that mLexer is configured to enter TerminalState::FAILURE immediately - // if the input data is truncated. We don't expect that to happen in most - // tests, so we want to detect that issue. If a test needs a different - // behavior, we create a special StreamingLexer just for that test. - ImageStreamingLexer() - : mLexer(Transition::To(TestState::ONE, 3), Transition::TerminateFailure()) - , mSourceBuffer(new SourceBuffer) - , mIterator(mSourceBuffer->Iterator()) - , mExpectNoResume(new ExpectNoResume) - , mCountResumes(new CountResumes) - { } - -protected: - void CheckTruncatedState(StreamingLexer<TestState>& aLexer, - TerminalState aExpectedTerminalState, - nsresult aCompletionStatus = NS_OK) - { - for (unsigned i = 0; i < 9; ++i) { - if (i < 2) { - mSourceBuffer->Append(mData + i, 1); - } else if (i == 2) { - mSourceBuffer->Complete(aCompletionStatus); - } - - LexerResult result = aLexer.Lex(mIterator, mCountResumes, DoLex); - - if (i >= 2) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(aExpectedTerminalState, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - EXPECT_EQ(2u, mCountResumes->Count()); - } - - AutoInitializeImageLib mInit; - const char mData[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - StreamingLexer<TestState> mLexer; - RefPtr<SourceBuffer> mSourceBuffer; - SourceBufferIterator mIterator; - RefPtr<ExpectNoResume> mExpectNoResume; - RefPtr<CountResumes> mCountResumes; -}; - -TEST_F(ImageStreamingLexer, ZeroLengthData) -{ - // Test a zero-length input. - mSourceBuffer->Complete(NS_OK); - - LexerResult result = mLexer.Lex(mIterator, mExpectNoResume, DoLex); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::FAILURE, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, ZeroLengthDataUnbuffered) -{ - // Test a zero-length input. - mSourceBuffer->Complete(NS_OK); - - // Create a special StreamingLexer for this test because we want the first - // state to be unbuffered. - StreamingLexer<TestState> lexer(Transition::ToUnbuffered(TestState::ONE, - TestState::UNBUFFERED, - sizeof(mData)), - Transition::TerminateFailure()); - - LexerResult result = lexer.Lex(mIterator, mExpectNoResume, DoLex); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::FAILURE, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, StartWithTerminal) -{ - // Create a special StreamingLexer for this test because we want the first - // state to be a terminal state. This doesn't really make sense, but we should - // handle it. - StreamingLexer<TestState> lexer(Transition::TerminateSuccess(), - Transition::TerminateFailure()); - LexerResult result = lexer.Lex(mIterator, mExpectNoResume, DoLex); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, SingleChunk) -{ - // Test delivering all the data at once. - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - LexerResult result = mLexer.Lex(mIterator, mExpectNoResume, DoLex); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, SingleChunkWithUnbuffered) -{ - Vector<char> unbufferedVector; - - // Test delivering all the data at once. - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - LexerResult result = - mLexer.Lex(mIterator, mExpectNoResume, - [&](TestState aState, const char* aData, size_t aLength) { - return DoLexWithUnbuffered(aState, aData, aLength, unbufferedVector); - }); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, SingleChunkWithYield) -{ - // Test delivering all the data at once. - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - LexerResult result = mLexer.Lex(mIterator, mExpectNoResume, DoLexWithYield); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - - result = mLexer.Lex(mIterator, mExpectNoResume, DoLexWithYield); - ASSERT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, ChunkPerState) -{ - // Test delivering in perfectly-sized chunks, one per state. - for (unsigned i = 0; i < 3; ++i) { - mSourceBuffer->Append(mData + 3 * i, 3); - LexerResult result = mLexer.Lex(mIterator, mCountResumes, DoLex); - - if (i == 2) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - EXPECT_EQ(2u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, ChunkPerStateWithUnbuffered) -{ - Vector<char> unbufferedVector; - - // Test delivering in perfectly-sized chunks, one per state. - for (unsigned i = 0; i < 3; ++i) { - mSourceBuffer->Append(mData + 3 * i, 3); - LexerResult result = - mLexer.Lex(mIterator, mCountResumes, - [&](TestState aState, const char* aData, size_t aLength) { - return DoLexWithUnbuffered(aState, aData, aLength, unbufferedVector); - }); - - if (i == 2) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - EXPECT_EQ(2u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, ChunkPerStateWithYield) -{ - // Test delivering in perfectly-sized chunks, one per state. - mSourceBuffer->Append(mData, 3); - LexerResult result = mLexer.Lex(mIterator, mCountResumes, DoLexWithYield); - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - - result = mLexer.Lex(mIterator, mCountResumes, DoLexWithYield); - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - - mSourceBuffer->Append(mData + 3, 6); - result = mLexer.Lex(mIterator, mCountResumes, DoLexWithYield); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - - EXPECT_EQ(1u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, ChunkPerStateWithUnbufferedYield) -{ - size_t unbufferedCallCount = 0; - Vector<char> unbufferedVector; - auto lexerFunc = [&](TestState aState, const char* aData, size_t aLength) - -> LexerTransition<TestState> { - switch (aState) { - case TestState::ONE: - CheckLexedData(aData, aLength, 0, 3); - return Transition::ToUnbuffered(TestState::TWO, TestState::UNBUFFERED, 3); - case TestState::TWO: - CheckLexedData(unbufferedVector.begin(), unbufferedVector.length(), 3, 3); - return Transition::To(TestState::THREE, 3); - case TestState::THREE: - CheckLexedData(aData, aLength, 6, 3); - return Transition::TerminateSuccess(); - case TestState::UNBUFFERED: - switch (unbufferedCallCount) { - case 0: - CheckLexedData(aData, aLength, 3, 3); - EXPECT_TRUE(unbufferedVector.append(aData, 2)); - unbufferedCallCount++; - - // Continue after yield, telling StreamingLexer we consumed 2 bytes. - return Transition::ContinueUnbufferedAfterYield(TestState::UNBUFFERED, 2); - - case 1: - CheckLexedData(aData, aLength, 5, 1); - EXPECT_TRUE(unbufferedVector.append(aData, 1)); - unbufferedCallCount++; - - // Continue after yield, telling StreamingLexer we consumed 1 byte. - // We should end up in the TWO state. - return Transition::ContinueUnbuffered(TestState::UNBUFFERED); - } - ADD_FAILURE() << "Too many invocations of TestState::UNBUFFERED"; - return Transition::TerminateFailure(); - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } - }; - - // Test delivering in perfectly-sized chunks, one per state. - for (unsigned i = 0; i < 3; ++i) { - mSourceBuffer->Append(mData + 3 * i, 3); - LexerResult result = mLexer.Lex(mIterator, mCountResumes, lexerFunc); - - switch (i) { - case 0: - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - EXPECT_EQ(0u, unbufferedCallCount); - break; - - case 1: - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - EXPECT_EQ(1u, unbufferedCallCount); - - result = mLexer.Lex(mIterator, mCountResumes, lexerFunc); - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - EXPECT_EQ(2u, unbufferedCallCount); - break; - - case 2: - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - break; - } - } - - EXPECT_EQ(2u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); - - LexerResult result = mLexer.Lex(mIterator, mCountResumes, lexerFunc); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, OneByteChunks) -{ - // Test delivering in one byte chunks. - for (unsigned i = 0; i < 9; ++i) { - mSourceBuffer->Append(mData + i, 1); - LexerResult result = mLexer.Lex(mIterator, mCountResumes, DoLex); - - if (i == 8) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - EXPECT_EQ(8u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, OneByteChunksWithUnbuffered) -{ - Vector<char> unbufferedVector; - - // Test delivering in one byte chunks. - for (unsigned i = 0; i < 9; ++i) { - mSourceBuffer->Append(mData + i, 1); - LexerResult result = - mLexer.Lex(mIterator, mCountResumes, - [&](TestState aState, const char* aData, size_t aLength) { - return DoLexWithUnbuffered(aState, aData, aLength, unbufferedVector); - }); - - if (i == 8) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - EXPECT_EQ(8u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, OneByteChunksWithYield) -{ - // Test delivering in one byte chunks. - for (unsigned i = 0; i < 9; ++i) { - mSourceBuffer->Append(mData + i, 1); - LexerResult result = mLexer.Lex(mIterator, mCountResumes, DoLexWithYield); - - switch (i) { - case 2: - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - - result = mLexer.Lex(mIterator, mCountResumes, DoLexWithYield); - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - break; - - case 8: - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - break; - - default: - EXPECT_TRUE(i < 9); - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - EXPECT_EQ(8u, mCountResumes->Count()); - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, ZeroLengthState) -{ - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - // Create a special StreamingLexer for this test because we want the first - // state to be zero length. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 0), - Transition::TerminateFailure()); - - LexerResult result = - lexer.Lex(mIterator, mExpectNoResume, DoLexWithZeroLengthStates); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, ZeroLengthStatesAtEnd) -{ - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - // Create a special StreamingLexer for this test because we want the first - // state to consume the full input. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 9), - Transition::TerminateFailure()); - - LexerResult result = - lexer.Lex(mIterator, mExpectNoResume, DoLexWithZeroLengthStatesAtEnd); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, ZeroLengthStateWithYield) -{ - // Create a special StreamingLexer for this test because we want the first - // state to be zero length. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 0), - Transition::TerminateFailure()); - - mSourceBuffer->Append(mData, 3); - LexerResult result = - lexer.Lex(mIterator, mExpectNoResume, DoLexWithZeroLengthYield); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - - result = lexer.Lex(mIterator, mCountResumes, DoLexWithZeroLengthYield); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - - mSourceBuffer->Append(mData + 3, sizeof(mData) - 3); - mSourceBuffer->Complete(NS_OK); - result = lexer.Lex(mIterator, mExpectNoResume, DoLexWithZeroLengthYield); - ASSERT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - EXPECT_EQ(1u, mCountResumes->Count()); -} - -TEST_F(ImageStreamingLexer, ZeroLengthStateWithUnbuffered) -{ - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - // Create a special StreamingLexer for this test because we want the first - // state to be both zero length and unbuffered. - StreamingLexer<TestState> lexer(Transition::ToUnbuffered(TestState::ONE, - TestState::UNBUFFERED, - 0), - Transition::TerminateFailure()); - - LexerResult result = - lexer.Lex(mIterator, mExpectNoResume, DoLexWithZeroLengthStatesUnbuffered); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, ZeroLengthStateAfterUnbuffered) -{ - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - // Create a special StreamingLexer for this test because we want the first - // state to be zero length. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 0), - Transition::TerminateFailure()); - - LexerResult result = - lexer.Lex(mIterator, mExpectNoResume, DoLexWithZeroLengthStatesAfterUnbuffered); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, ZeroLengthStateWithUnbufferedYield) -{ - size_t unbufferedCallCount = 0; - auto lexerFunc = [&](TestState aState, const char* aData, size_t aLength) - -> LexerTransition<TestState> { - switch (aState) { - case TestState::ONE: - EXPECT_EQ(0u, aLength); - return Transition::TerminateSuccess(); - - case TestState::UNBUFFERED: - switch (unbufferedCallCount) { - case 0: - CheckLexedData(aData, aLength, 0, 3); - unbufferedCallCount++; - - // Continue after yield, telling StreamingLexer we consumed 0 bytes. - return Transition::ContinueUnbufferedAfterYield(TestState::UNBUFFERED, 0); - - case 1: - CheckLexedData(aData, aLength, 0, 3); - unbufferedCallCount++; - - // Continue after yield, telling StreamingLexer we consumed 2 bytes. - return Transition::ContinueUnbufferedAfterYield(TestState::UNBUFFERED, 2); - - case 2: - EXPECT_EQ(1u, aLength); - CheckLexedData(aData, aLength, 2, 1); - unbufferedCallCount++; - - // Continue after yield, telling StreamingLexer we consumed 1 bytes. - return Transition::ContinueUnbufferedAfterYield(TestState::UNBUFFERED, 1); - - case 3: - CheckLexedData(aData, aLength, 3, 6); - unbufferedCallCount++; - - // Continue after yield, telling StreamingLexer we consumed 6 bytes. - // We should transition to TestState::ONE when we return from the - // yield. - return Transition::ContinueUnbufferedAfterYield(TestState::UNBUFFERED, 6); - } - - ADD_FAILURE() << "Too many invocations of TestState::UNBUFFERED"; - return Transition::TerminateFailure(); - - default: - MOZ_CRASH("Unexpected or unhandled TestState"); - } - }; - - // Create a special StreamingLexer for this test because we want the first - // state to be unbuffered. - StreamingLexer<TestState> lexer(Transition::ToUnbuffered(TestState::ONE, - TestState::UNBUFFERED, - sizeof(mData)), - Transition::TerminateFailure()); - - mSourceBuffer->Append(mData, 3); - LexerResult result = lexer.Lex(mIterator, mExpectNoResume, lexerFunc); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - EXPECT_EQ(1u, unbufferedCallCount); - - result = lexer.Lex(mIterator, mExpectNoResume, lexerFunc); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - EXPECT_EQ(2u, unbufferedCallCount); - - result = lexer.Lex(mIterator, mExpectNoResume, lexerFunc); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - EXPECT_EQ(3u, unbufferedCallCount); - - result = lexer.Lex(mIterator, mCountResumes, lexerFunc); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - EXPECT_EQ(3u, unbufferedCallCount); - - mSourceBuffer->Append(mData + 3, 6); - mSourceBuffer->Complete(NS_OK); - EXPECT_EQ(1u, mCountResumes->Count()); - result = lexer.Lex(mIterator, mExpectNoResume, lexerFunc); - ASSERT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - EXPECT_EQ(4u, unbufferedCallCount); - - result = lexer.Lex(mIterator, mExpectNoResume, lexerFunc); - ASSERT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, TerminateSuccess) -{ - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - // Test that Terminate is "sticky". - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - LexerResult result = - mLexer.Lex(iterator, mExpectNoResume, - [&](TestState aState, const char* aData, size_t aLength) { - EXPECT_TRUE(aState == TestState::ONE); - return Transition::TerminateSuccess(); - }); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - - SourceBufferIterator iterator2 = mSourceBuffer->Iterator(); - result = - mLexer.Lex(iterator2, mExpectNoResume, - [&](TestState aState, const char* aData, size_t aLength) { - EXPECT_TRUE(false); // Shouldn't get here. - return Transition::TerminateFailure(); - }); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, TerminateFailure) -{ - mSourceBuffer->Append(mData, sizeof(mData)); - mSourceBuffer->Complete(NS_OK); - - // Test that Terminate is "sticky". - SourceBufferIterator iterator = mSourceBuffer->Iterator(); - LexerResult result = - mLexer.Lex(iterator, mExpectNoResume, - [&](TestState aState, const char* aData, size_t aLength) { - EXPECT_TRUE(aState == TestState::ONE); - return Transition::TerminateFailure(); - }); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::FAILURE, result.as<TerminalState>()); - - SourceBufferIterator iterator2 = mSourceBuffer->Iterator(); - result = - mLexer.Lex(iterator2, mExpectNoResume, - [&](TestState aState, const char* aData, size_t aLength) { - EXPECT_TRUE(false); // Shouldn't get here. - return Transition::TerminateFailure(); - }); - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::FAILURE, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, TerminateUnbuffered) -{ - // Test that Terminate works during an unbuffered read. - for (unsigned i = 0; i < 9; ++i) { - mSourceBuffer->Append(mData + i, 1); - LexerResult result = - mLexer.Lex(mIterator, mCountResumes, DoLexWithUnbufferedTerminate); - - if (i > 2) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - // We expect 3 resumes because TestState::ONE consumes 3 bytes and then - // transitions to TestState::UNBUFFERED, which calls TerminateSuccess() as - // soon as it receives a single byte. That's four bytes total, which are - // delivered one at a time, requiring 3 resumes. - EXPECT_EQ(3u, mCountResumes->Count()); - - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, TerminateAfterYield) -{ - // Test that Terminate works after yielding. - for (unsigned i = 0; i < 9; ++i) { - mSourceBuffer->Append(mData + i, 1); - LexerResult result = - mLexer.Lex(mIterator, mCountResumes, DoLexWithTerminateAfterYield); - - if (i > 2) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else if (i == 2) { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::OUTPUT_AVAILABLE, result.as<Yield>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - // We expect 2 resumes because TestState::ONE consumes 3 bytes and then - // yields. When the lexer resumes at TestState::TWO, which receives the same 3 - // bytes, TerminateSuccess() gets called immediately. That's three bytes - // total, which are delivered one at a time, requiring 2 resumes. - EXPECT_EQ(2u, mCountResumes->Count()); - - mSourceBuffer->Complete(NS_OK); -} - -TEST_F(ImageStreamingLexer, SourceBufferImmediateComplete) -{ - // Test calling SourceBuffer::Complete() without appending any data. This - // causes the SourceBuffer to automatically have a failing completion status, - // no matter what you pass, so we expect TerminalState::FAILURE below. - mSourceBuffer->Complete(NS_OK); - - LexerResult result = mLexer.Lex(mIterator, mExpectNoResume, DoLex); - - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::FAILURE, result.as<TerminalState>()); -} - -TEST_F(ImageStreamingLexer, SourceBufferTruncatedTerminalStateSuccess) -{ - // Test that using a terminal state (in this case TerminalState::SUCCESS) as a - // truncated state works. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 3), - Transition::TerminateSuccess()); - - CheckTruncatedState(lexer, TerminalState::SUCCESS); -} - -TEST_F(ImageStreamingLexer, SourceBufferTruncatedTerminalStateFailure) -{ - // Test that using a terminal state (in this case TerminalState::FAILURE) as a - // truncated state works. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 3), - Transition::TerminateFailure()); - - CheckTruncatedState(lexer, TerminalState::FAILURE); -} - -TEST_F(ImageStreamingLexer, SourceBufferTruncatedStateReturningSuccess) -{ - // Test that a truncated state that returns TerminalState::SUCCESS works. When - // |lexer| discovers that the data is truncated, it invokes the - // TRUNCATED_SUCCESS state, which returns TerminalState::SUCCESS. - // CheckTruncatedState() verifies that this happens. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 3), - Transition::To(TestState::TRUNCATED_SUCCESS, 0)); - - CheckTruncatedState(lexer, TerminalState::SUCCESS); -} - -TEST_F(ImageStreamingLexer, SourceBufferTruncatedStateReturningFailure) -{ - // Test that a truncated state that returns TerminalState::FAILURE works. When - // |lexer| discovers that the data is truncated, it invokes the - // TRUNCATED_FAILURE state, which returns TerminalState::FAILURE. - // CheckTruncatedState() verifies that this happens. - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 3), - Transition::To(TestState::TRUNCATED_FAILURE, 0)); - - CheckTruncatedState(lexer, TerminalState::FAILURE); -} - -TEST_F(ImageStreamingLexer, SourceBufferTruncatedFailingCompleteStatus) -{ - // Test that calling SourceBuffer::Complete() with a failing status results in - // an immediate TerminalState::FAILURE result. (Note that |lexer|'s truncated - // state is TerminalState::SUCCESS, so if we ignore the failing status, the - // test will fail.) - StreamingLexer<TestState> lexer(Transition::To(TestState::ONE, 3), - Transition::TerminateSuccess()); - - CheckTruncatedState(lexer, TerminalState::FAILURE, NS_ERROR_FAILURE); -} - -TEST_F(ImageStreamingLexer, NoSourceBufferResumable) -{ - // Test delivering in one byte chunks with no IResumable. - for (unsigned i = 0; i < 9; ++i) { - mSourceBuffer->Append(mData + i, 1); - LexerResult result = mLexer.Lex(mIterator, nullptr, DoLex); - - if (i == 8) { - EXPECT_TRUE(result.is<TerminalState>()); - EXPECT_EQ(TerminalState::SUCCESS, result.as<TerminalState>()); - } else { - EXPECT_TRUE(result.is<Yield>()); - EXPECT_EQ(Yield::NEED_MORE_DATA, result.as<Yield>()); - } - } - - mSourceBuffer->Complete(NS_OK); -} diff --git a/image/test/gtest/TestSurfacePipeIntegration.cpp b/image/test/gtest/TestSurfacePipeIntegration.cpp deleted file mode 100644 index 27138a3ee..000000000 --- a/image/test/gtest/TestSurfacePipeIntegration.cpp +++ /dev/null @@ -1,508 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfacePipe.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -namespace mozilla { -namespace image { - -class TestSurfacePipeFactory -{ -public: - static SurfacePipe SimpleSurfacePipe() - { - SurfacePipe pipe; - return Move(pipe); - } - - template <typename T> - static SurfacePipe SurfacePipeFromPipeline(T&& aPipeline) - { - return SurfacePipe { Move(aPipeline) }; - } - -private: - TestSurfacePipeFactory() { } -}; - -} // namespace image -} // namespace mozilla - -void -CheckSurfacePipeMethodResults(SurfacePipe* aPipe, - Decoder* aDecoder, - const IntRect& aRect = IntRect(0, 0, 100, 100)) -{ - // Check that the pipeline ended up in the state we expect. Note that we're - // explicitly testing the SurfacePipe versions of these methods, so we don't - // want to use AssertCorrectPipelineFinalState() here. - EXPECT_TRUE(aPipe->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mOutputSpaceRect); - - // Check the generated image. - CheckGeneratedImage(aDecoder, aRect); - - // Reset and clear the image before the next test. - aPipe->ResetToFirstRow(); - EXPECT_FALSE(aPipe->IsSurfaceFinished()); - invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - uint32_t count = 0; - auto result = aPipe->WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Transparent().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - EXPECT_TRUE(aPipe->IsSurfaceFinished()); - invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mOutputSpaceRect); - - aPipe->ResetToFirstRow(); - EXPECT_FALSE(aPipe->IsSurfaceFinished()); - invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); -} - -void -CheckPalettedSurfacePipeMethodResults(SurfacePipe* aPipe, - Decoder* aDecoder, - const IntRect& aRect - = IntRect(0, 0, 100, 100)) -{ - // Check that the pipeline ended up in the state we expect. Note that we're - // explicitly testing the SurfacePipe versions of these methods, so we don't - // want to use AssertCorrectPipelineFinalState() here. - EXPECT_TRUE(aPipe->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mOutputSpaceRect); - - // Check the generated image. - CheckGeneratedPalettedImage(aDecoder, aRect); - - // Reset and clear the image before the next test. - aPipe->ResetToFirstRow(); - EXPECT_FALSE(aPipe->IsSurfaceFinished()); - invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - uint32_t count = 0; - auto result = aPipe->WritePixels<uint8_t>([&]() { - ++count; - return AsVariant(uint8_t(0)); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - EXPECT_TRUE(aPipe->IsSurfaceFinished()); - invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 0, 100, 100), invalidRect->mOutputSpaceRect); - - aPipe->ResetToFirstRow(); - EXPECT_FALSE(aPipe->IsSurfaceFinished()); - invalidRect = aPipe->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); -} - -class ImageSurfacePipeIntegration : public ::testing::Test -{ -protected: - AutoInitializeImageLib mInit; -}; - -TEST_F(ImageSurfacePipeIntegration, SurfacePipe) -{ - // Test that SurfacePipe objects can be initialized and move constructed. - SurfacePipe pipe = TestSurfacePipeFactory::SimpleSurfacePipe(); - - // Test that SurfacePipe objects can be move assigned. - pipe = TestSurfacePipeFactory::SimpleSurfacePipe(); - - // Test that SurfacePipe objects can be initialized with a pipeline. - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - auto sink = MakeUnique<SurfaceSink>(); - nsresult rv = - sink->Configure(SurfaceConfig { decoder, IntSize(100, 100), - SurfaceFormat::B8G8R8A8, false }); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - pipe = TestSurfacePipeFactory::SurfacePipeFromPipeline(sink); - - // Test that WritePixels() gets passed through to the underlying pipeline. - { - uint32_t count = 0; - auto result = pipe.WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - CheckSurfacePipeMethodResults(&pipe, decoder); - } - - // Create a buffer the same size as one row of the surface, containing all - // green pixels. We'll use this for the WriteBuffer() tests. - uint32_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = BGRAColor::Green().AsPixel(); - } - - // Test that WriteBuffer() gets passed through to the underlying pipeline. - { - uint32_t count = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = pipe.WriteBuffer(buffer); - ++count; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - CheckSurfacePipeMethodResults(&pipe, decoder); - } - - // Test that the 3 argument version of WriteBuffer() gets passed through to - // the underlying pipeline. - { - uint32_t count = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = pipe.WriteBuffer(buffer, 0, 100); - ++count; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - CheckSurfacePipeMethodResults(&pipe, decoder); - } - - // Test that WriteEmptyRow() gets passed through to the underlying pipeline. - { - uint32_t count = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = pipe.WriteEmptyRow(); - ++count; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - CheckSurfacePipeMethodResults(&pipe, decoder, IntRect(0, 0, 0, 0)); - } - - // Mark the frame as finished so we don't get an assertion. - RawAccessFrameRef currentFrame = decoder->GetCurrentFrameRef(); - currentFrame->Finish(); -} - -TEST_F(ImageSurfacePipeIntegration, PalettedSurfacePipe) -{ - // Create a SurfacePipe containing a PalettedSurfaceSink. - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - auto sink = MakeUnique<PalettedSurfaceSink>(); - nsresult rv = - sink->Configure(PalettedSurfaceConfig { decoder, IntSize(100, 100), - IntRect(0, 0, 100, 100), - SurfaceFormat::B8G8R8A8, - 8, false }); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - SurfacePipe pipe = TestSurfacePipeFactory::SurfacePipeFromPipeline(sink); - - // Test that WritePixels() gets passed through to the underlying pipeline. - { - uint32_t count = 0; - auto result = pipe.WritePixels<uint8_t>([&]() { - ++count; - return AsVariant(uint8_t(255)); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - CheckPalettedSurfacePipeMethodResults(&pipe, decoder); - } - - // Create a buffer the same size as one row of the surface, containing all - // 255 pixels. We'll use this for the WriteBuffer() tests. - uint8_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 255; - } - - // Test that WriteBuffer() gets passed through to the underlying pipeline. - { - uint32_t count = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = pipe.WriteBuffer(buffer); - ++count; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - CheckPalettedSurfacePipeMethodResults(&pipe, decoder); - } - - // Test that the 3 argument version of WriteBuffer() gets passed through to - // the underlying pipeline. - { - uint32_t count = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = pipe.WriteBuffer(buffer, 0, 100); - ++count; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - CheckPalettedSurfacePipeMethodResults(&pipe, decoder); - } - - // Test that WriteEmptyRow() gets passed through to the underlying pipeline. - { - uint32_t count = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = pipe.WriteEmptyRow(); - ++count; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - CheckPalettedSurfacePipeMethodResults(&pipe, decoder, IntRect(0, 0, 0, 0)); - } - - // Mark the frame as finished so we don't get an assertion. - RawAccessFrameRef currentFrame = decoder->GetCurrentFrameRef(); - currentFrame->Finish(); -} - -TEST_F(ImageSurfacePipeIntegration, DeinterlaceDownscaleWritePixels) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - auto test = [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 25, 25))); - }; - - WithFilterPipeline(decoder, test, - DeinterlacingConfig<uint32_t> { /* mProgressiveDisplay = */ true }, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, IntSize(25, 25), - SurfaceFormat::B8G8R8A8, false }); -} - -TEST_F(ImageSurfacePipeIntegration, RemoveFrameRectBottomRightDownscaleWritePixels) -{ - // This test case uses a frame rect that extends beyond the borders of the - // image to the bottom and to the right. It looks roughly like this (with the - // box made of '#'s representing the frame rect): - // - // +------------+ - // + + - // + +------------+ - // + +############+ - // +------+############+ - // +############+ - // +------------+ - - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // Note that aInputWriteRect is 100x50 because RemoveFrameRectFilter ignores - // trailing rows that don't show up in the output. (Leading rows unfortunately - // can't be ignored.) So the action of the pipeline is as follows: - // - // (1) RemoveFrameRectFilter reads a 100x50 region of the input. - // (aInputWriteRect captures this fact.) The remaining 50 rows are ignored - // because they extend off the bottom of the image due to the frame rect's - // (50, 50) offset. The 50 columns on the right also don't end up in the - // output, so ultimately only a 50x50 region in the output contains data - // from the input. The filter's output is not 50x50, though, but 100x100, - // because what RemoveFrameRectFilter does is introduce blank rows or - // columns as necessary to transform an image that needs a frame rect into - // an image that doesn't. - // - // (2) DownscalingFilter reads the output of RemoveFrameRectFilter (100x100) - // and downscales it to 20x20. - // - // (3) The surface owned by SurfaceSink logically has only a 10x10 region - // region in it that's non-blank; this is the downscaled version of the - // 50x50 region discussed in (1). (aOutputWriteRect captures this fact.) - // Some fuzz, as usual, is necessary when dealing with Lanczos downscaling. - - auto test = [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 20, 20)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(50, 50, 100, 50)), - /* aOutputWriteRect = */ Some(IntRect(10, 10, 10, 10)), - /* aFuzz = */ 0x33); - }; - - WithFilterPipeline(decoder, test, - RemoveFrameRectConfig { IntRect(50, 50, 100, 100) }, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, IntSize(20, 20), - SurfaceFormat::B8G8R8A8, false }); -} - -TEST_F(ImageSurfacePipeIntegration, RemoveFrameRectTopLeftDownscaleWritePixels) -{ - // This test case uses a frame rect that extends beyond the borders of the - // image to the top and to the left. It looks roughly like this (with the - // box made of '#'s representing the frame rect): - // - // +------------+ - // +############+ - // +############+------+ - // +############+ + - // +------------+ + - // + + - // +------------+ - - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - auto test = [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 20, 20)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 100)), - /* aOutputWriteRect = */ Some(IntRect(0, 0, 10, 10)), - /* aFuzz = */ 0x21); - }; - - WithFilterPipeline(decoder, test, - RemoveFrameRectConfig { IntRect(-50, -50, 100, 100) }, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, IntSize(20, 20), - SurfaceFormat::B8G8R8A8, false }); -} - -TEST_F(ImageSurfacePipeIntegration, DeinterlaceRemoveFrameRectWritePixels) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // Note that aInputRect is the full 100x100 size even though - // RemoveFrameRectFilter is part of this pipeline, because deinterlacing - // requires reading every row. - - auto test = [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(50, 50, 100, 100)), - /* aOutputWriteRect = */ Some(IntRect(50, 50, 50, 50))); - }; - - WithFilterPipeline(decoder, test, - DeinterlacingConfig<uint32_t> { /* mProgressiveDisplay = */ true }, - RemoveFrameRectConfig { IntRect(50, 50, 100, 100) }, - SurfaceConfig { decoder, IntSize(100, 100), - SurfaceFormat::B8G8R8A8, false }); -} - -TEST_F(ImageSurfacePipeIntegration, DeinterlaceRemoveFrameRectDownscaleWritePixels) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - auto test = [](Decoder* aDecoder, SurfaceFilter* aFilter) { - CheckWritePixels(aDecoder, aFilter, - /* aOutputRect = */ Some(IntRect(0, 0, 20, 20)), - /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), - /* aInputWriteRect = */ Some(IntRect(50, 50, 100, 100)), - /* aOutputWriteRect = */ Some(IntRect(10, 10, 10, 10)), - /* aFuzz = */ 33); - }; - - WithFilterPipeline(decoder, test, - DeinterlacingConfig<uint32_t> { /* mProgressiveDisplay = */ true }, - RemoveFrameRectConfig { IntRect(50, 50, 100, 100) }, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, IntSize(20, 20), - SurfaceFormat::B8G8R8A8, false }); -} - -TEST_F(ImageSurfacePipeIntegration, ConfiguringPalettedRemoveFrameRectDownscaleFails) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // This is an invalid pipeline for paletted images, so configuration should - // fail. - AssertConfiguringPipelineFails(decoder, - RemoveFrameRectConfig { IntRect(0, 0, 50, 50) }, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - PalettedSurfaceConfig { decoder, IntSize(100, 100), - IntRect(0, 0, 50, 50), - SurfaceFormat::B8G8R8A8, 8, - false }); -} - -TEST_F(ImageSurfacePipeIntegration, ConfiguringPalettedDeinterlaceDownscaleFails) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // This is an invalid pipeline for paletted images, so configuration should - // fail. - AssertConfiguringPipelineFails(decoder, - DeinterlacingConfig<uint8_t> { /* mProgressiveDisplay = */ true}, - DownscalingConfig { IntSize(100, 100), - SurfaceFormat::B8G8R8A8 }, - PalettedSurfaceConfig { decoder, IntSize(100, 100), - IntRect(0, 0, 20, 20), - SurfaceFormat::B8G8R8A8, 8, - false }); -} - -TEST_F(ImageSurfacePipeIntegration, ConfiguringHugeDeinterlacingBufferFails) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - // When DownscalingFilter is used, we may succeed in allocating an output - // surface for huge images, because we only need to store the scaled-down - // version of the image. However, regardless of downscaling, - // DeinterlacingFilter needs to allocate a buffer as large as the size of the - // input. This can cause OOMs on operating systems that allow overcommit. This - // test makes sure that we reject such allocations. - AssertConfiguringPipelineFails(decoder, - DeinterlacingConfig<uint32_t> { /* mProgressiveDisplay = */ true}, - DownscalingConfig { IntSize(60000, 60000), - SurfaceFormat::B8G8R8A8 }, - SurfaceConfig { decoder, IntSize(600, 600), - SurfaceFormat::B8G8R8A8, false }); -} diff --git a/image/test/gtest/TestSurfaceSink.cpp b/image/test/gtest/TestSurfaceSink.cpp deleted file mode 100644 index 3a1c74d12..000000000 --- a/image/test/gtest/TestSurfaceSink.cpp +++ /dev/null @@ -1,1491 +0,0 @@ -/* -*- 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 "gtest/gtest.h" - -#include "mozilla/gfx/2D.h" -#include "Common.h" -#include "Decoder.h" -#include "DecoderFactory.h" -#include "SourceBuffer.h" -#include "SurfacePipe.h" - -using namespace mozilla; -using namespace mozilla::gfx; -using namespace mozilla::image; - -enum class Orient -{ - NORMAL, - FLIP_VERTICALLY -}; - -template <Orient Orientation, typename Func> void -WithSurfaceSink(Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - const bool flipVertically = Orientation == Orient::FLIP_VERTICALLY; - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - SurfaceConfig { decoder, IntSize(100, 100), - SurfaceFormat::B8G8R8A8, flipVertically }); -} - -template <typename Func> void -WithPalettedSurfaceSink(const IntRect& aFrameRect, Func aFunc) -{ - RefPtr<Decoder> decoder = CreateTrivialDecoder(); - ASSERT_TRUE(decoder != nullptr); - - WithFilterPipeline(decoder, Forward<Func>(aFunc), - PalettedSurfaceConfig { decoder, IntSize(100, 100), - aFrameRect, SurfaceFormat::B8G8R8A8, - 8, false }); -} - -void -ResetForNextPass(SurfaceFilter* aSink) -{ - aSink->ResetToFirstRow(); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); -} - -template <typename WriteFunc, typename CheckFunc> void -DoCheckIterativeWrite(SurfaceFilter* aSink, - WriteFunc aWriteFunc, - CheckFunc aCheckFunc) -{ - // Write the buffer to successive rows until every row of the surface - // has been written. - uint32_t row = 0; - WriteState result = WriteState::NEED_MORE_DATA; - while (result == WriteState::NEED_MORE_DATA) { - result = aWriteFunc(row); - ++row; - } - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, row); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Check that the generated image is correct. - aCheckFunc(); -} - -template <typename WriteFunc> void -CheckIterativeWrite(Decoder* aDecoder, - SurfaceSink* aSink, - const IntRect& aOutputRect, - WriteFunc aWriteFunc) -{ - // Ignore the row passed to WriteFunc, since no callers use it. - auto writeFunc = [&](uint32_t) { - return aWriteFunc(); - }; - - DoCheckIterativeWrite(aSink, writeFunc, [&]{ - CheckGeneratedImage(aDecoder, aOutputRect); - }); -} - -template <typename WriteFunc> void -CheckPalettedIterativeWrite(Decoder* aDecoder, - PalettedSurfaceSink* aSink, - const IntRect& aOutputRect, - WriteFunc aWriteFunc) -{ - // Ignore the row passed to WriteFunc, since no callers use it. - auto writeFunc = [&](uint32_t) { - return aWriteFunc(); - }; - - DoCheckIterativeWrite(aSink, writeFunc, [&]{ - CheckGeneratedPalettedImage(aDecoder, aOutputRect); - }); -} - -TEST(ImageSurfaceSink, NullSurfaceSink) -{ - // Create the NullSurfaceSink. - NullSurfaceSink sink; - nsresult rv = sink.Configure(NullSurfaceConfig { }); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - EXPECT_TRUE(!sink.IsValidPalettedPipe()); - - // Ensure that we can't write anything. - bool gotCalled = false; - auto result = sink.WritePixels<uint32_t>([&]() { - gotCalled = true; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_FALSE(gotCalled); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(sink.IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - uint32_t source = BGRAColor::Red().AsPixel(); - result = sink.WriteBuffer(&source); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(sink.IsSurfaceFinished()); - invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - result = sink.WriteBuffer(&source, 0, 1); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(sink.IsSurfaceFinished()); - invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - result = sink.WriteEmptyRow(); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(sink.IsSurfaceFinished()); - invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - result = sink.WriteUnsafeComputedRow<uint32_t>([&](uint32_t* aRow, - uint32_t aLength) { - gotCalled = true; - for (uint32_t col = 0; col < aLength; ++col, ++aRow) { - *aRow = BGRAColor::Red().AsPixel(); - } - }); - EXPECT_FALSE(gotCalled); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_TRUE(sink.IsSurfaceFinished()); - invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Attempt to advance to the next row and make sure nothing changes. - sink.AdvanceRow(); - EXPECT_TRUE(sink.IsSurfaceFinished()); - invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Attempt to advance to the next pass and make sure nothing changes. - sink.ResetToFirstRow(); - EXPECT_TRUE(sink.IsSurfaceFinished()); - invalidRect = sink.TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); -} - -TEST(ImageSurfaceSink, SurfaceSinkInitialization) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Check initial state. - EXPECT_FALSE(aSink->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that the surface is zero-initialized. We verify this by calling - // CheckGeneratedImage() and telling it that we didn't write to the surface - // anyway (i.e., we wrote to the empty rect); it will then expect the entire - // surface to be transparent, which is what it should be if it was - // zero-initialied. - CheckGeneratedImage(aDecoder, IntRect(0, 0, 0, 0)); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWritePixels) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - CheckWritePixels(aDecoder, aSink); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWritePixelsFinish) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Write nothing into the surface; just finish immediately. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() { - count++; - return AsVariant(WriteState::FINISHED); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(1u, count); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixels<uint32_t>([&]() { - count++; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Transparent())); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWritePixelsEarlyExit) -{ - auto checkEarlyExit = - [](Decoder* aDecoder, SurfaceSink* aSink, WriteState aState) { - // Write half a row of green pixels and then exit early with |aState|. If - // the lambda keeps getting called, we'll write red pixels, which will cause - // the test to fail. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 50) { - return AsVariant(aState); - } - return count++ < 50 ? AsVariant(BGRAColor::Green().AsPixel()) - : AsVariant(BGRAColor::Red().AsPixel()); - }); - - EXPECT_EQ(aState, result); - EXPECT_EQ(50u, count); - CheckGeneratedImage(aDecoder, IntRect(0, 0, 50, 1)); - - if (aState != WriteState::FINISHED) { - // We should still be able to write more at this point. - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Verify that we can resume writing. We'll finish up the same row. - count = 0; - result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 50) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - CheckGeneratedImage(aDecoder, IntRect(0, 0, 100, 1)); - - return; - } - - // We should've finished the surface at this point. - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixels<uint32_t>([&]{ - count++; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is still correct. - CheckGeneratedImage(aDecoder, IntRect(0, 0, 50, 1)); - }; - - WithSurfaceSink<Orient::NORMAL>([&](Decoder* aDecoder, SurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::NEED_MORE_DATA); - }); - - WithSurfaceSink<Orient::NORMAL>([&](Decoder* aDecoder, SurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FAILURE); - }); - - WithSurfaceSink<Orient::NORMAL>([&](Decoder* aDecoder, SurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FINISHED); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWritePixelsToRow) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Write the first 99 rows of our 100x100 surface and verify that even - // though our lambda will yield pixels forever, only one row is written per - // call to WritePixelsToRow(). - for (int row = 0; row < 99; ++row) { - uint32_t count = 0; - WriteState result = aSink->WritePixelsToRow<uint32_t>([&]{ - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(100u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, row, 100, 1), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, row, 100, 1), invalidRect->mOutputSpaceRect); - - CheckGeneratedImage(aDecoder, IntRect(0, 0, 100, row + 1)); - } - - // Write the final line, which should finish the surface. - uint32_t count = 0; - WriteState result = aSink->WritePixelsToRow<uint32_t>([&]{ - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - - // Note that the final invalid rect we expect here is only the last row; - // that's because we called TakeInvalidRect() repeatedly in the loop above. - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 99, 100, 1), - IntRect(0, 99, 100, 1)); - - // Check that the generated image is correct. - CheckGeneratedImage(aDecoder, IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixelsToRow<uint32_t>([&]{ - count++; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is still correct. - CheckGeneratedImage(aDecoder, IntRect(0, 0, 100, 100)); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWritePixelsToRowEarlyExit) -{ - auto checkEarlyExit = - [](Decoder* aDecoder, SurfaceSink* aSink, WriteState aState) { - // Write half a row of green pixels and then exit early with |aState|. If - // the lambda keeps getting called, we'll write red pixels, which will cause - // the test to fail. - uint32_t count = 0; - auto result = aSink->WritePixelsToRow<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 50) { - return AsVariant(aState); - } - return count++ < 50 ? AsVariant(BGRAColor::Green().AsPixel()) - : AsVariant(BGRAColor::Red().AsPixel()); - }); - - EXPECT_EQ(aState, result); - EXPECT_EQ(50u, count); - CheckGeneratedImage(aDecoder, IntRect(0, 0, 50, 1)); - - if (aState != WriteState::FINISHED) { - // We should still be able to write more at this point. - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Verify that we can resume the same row and still stop at the end. - count = 0; - WriteState result = aSink->WritePixelsToRow<uint32_t>([&]{ - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - CheckGeneratedImage(aDecoder, IntRect(0, 0, 100, 1)); - - return; - } - - // We should've finished the surface at this point. - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixelsToRow<uint32_t>([&]{ - count++; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is still correct. - CheckGeneratedImage(aDecoder, IntRect(0, 0, 50, 1)); - }; - - WithSurfaceSink<Orient::NORMAL>([&](Decoder* aDecoder, SurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::NEED_MORE_DATA); - }); - - WithSurfaceSink<Orient::NORMAL>([&](Decoder* aDecoder, SurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FAILURE); - }); - - WithSurfaceSink<Orient::NORMAL>([&](Decoder* aDecoder, SurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FINISHED); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteBuffer) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Create a green buffer the same size as one row of the surface (which is 100x100), - // containing 60 pixels of green in the middle and 20 transparent pixels on - // either side. - uint32_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 20 <= i && i < 80 ? BGRAColor::Green().AsPixel() - : BGRAColor::Transparent().AsPixel(); - } - - // Write the buffer to every row of the surface and check that the generated - // image is correct. - CheckIterativeWrite(aDecoder, aSink, IntRect(20, 0, 60, 100), [&]{ - return aSink->WriteBuffer(buffer); - }); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteBufferPartialRow) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Create a buffer the same size as one row of the surface, containing all - // green pixels. - uint32_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = BGRAColor::Green().AsPixel(); - } - - // Write the buffer to the middle 60 pixels of every row of the surface and - // check that the generated image is correct. - CheckIterativeWrite(aDecoder, aSink, IntRect(20, 0, 60, 100), [&]{ - return aSink->WriteBuffer(buffer, 20, 60); - }); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteBufferPartialRowStartColOverflow) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Create a buffer the same size as one row of the surface, containing all - // green pixels. - uint32_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = BGRAColor::Green().AsPixel(); - } - - { - // Write the buffer to successive rows until every row of the surface - // has been written. We place the start column beyond the end of the row, - // which will prevent us from writing anything, so we check that the - // generated image is entirely transparent. - CheckIterativeWrite(aDecoder, aSink, IntRect(0, 0, 0, 0), [&]{ - return aSink->WriteBuffer(buffer, 100, 100); - }); - } - - ResetForNextPass(aSink); - - { - // Write the buffer to successive rows until every row of the surface - // has been written. We use column 50 as the start column, but we still - // write the buffer, which means we overflow the right edge of the surface - // by 50 pixels. We check that the left half of the generated image is - // transparent and the right half is green. - CheckIterativeWrite(aDecoder, aSink, IntRect(50, 0, 50, 100), [&]{ - return aSink->WriteBuffer(buffer, 50, 100); - }); - } - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteBufferPartialRowBufferOverflow) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Create a buffer twice as large as a row of the surface. The first half - // (which is as large as a row of the image) will contain green pixels, - // while the second half will contain red pixels. - uint32_t buffer[200]; - for (int i = 0; i < 200; ++i) { - buffer[i] = i < 100 ? BGRAColor::Green().AsPixel() - : BGRAColor::Red().AsPixel(); - } - - { - // Write the buffer to successive rows until every row of the surface has - // been written. The buffer extends 100 pixels to the right of a row of - // the surface, but bounds checking will prevent us from overflowing the - // buffer. We check that the generated image is entirely green since the - // pixels on the right side of the buffer shouldn't have been written to - // the surface. - CheckIterativeWrite(aDecoder, aSink, IntRect(0, 0, 100, 100), [&]{ - return aSink->WriteBuffer(buffer, 0, 200); - }); - } - - ResetForNextPass(aSink); - - { - // Write from the buffer to the middle of each row of the surface. That - // means that the left side of each row should be transparent, since we - // didn't write anything there. A buffer overflow would cause us to write - // buffer contents into the left side of each row. We check that the - // generated image is transparent on the left side and green on the right. - CheckIterativeWrite(aDecoder, aSink, IntRect(50, 0, 50, 100), [&]{ - return aSink->WriteBuffer(buffer, 50, 200); - }); - } - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteBufferFromNullSource) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Calling WriteBuffer() with a null pointer should fail without making any - // changes to the surface. - uint32_t* nullBuffer = nullptr; - WriteState result = aSink->WriteBuffer(nullBuffer); - - EXPECT_EQ(WriteState::FAILURE, result); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that nothing got written to the surface. - CheckGeneratedImage(aDecoder, IntRect(0, 0, 0, 0)); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteEmptyRow) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - { - // Write an empty row to each row of the surface. We check that the - // generated image is entirely transparent. - CheckIterativeWrite(aDecoder, aSink, IntRect(0, 0, 0, 0), [&]{ - return aSink->WriteEmptyRow(); - }); - } - - ResetForNextPass(aSink); - - { - // Write a partial row before we begin calling WriteEmptyRow(). We check - // that the generated image is entirely transparent, which is to be - // expected since WriteEmptyRow() overwrites the current row even if some - // data has already been written to it. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 50) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - CheckIterativeWrite(aDecoder, aSink, IntRect(0, 0, 0, 0), [&]{ - return aSink->WriteEmptyRow(); - }); - } - - ResetForNextPass(aSink); - - { - // Create a buffer the same size as one row of the surface, containing all - // green pixels. - uint32_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = BGRAColor::Green().AsPixel(); - } - - // Write an empty row to the middle 60 rows of the surface. The first 20 - // and last 20 rows will be green. (We need to use DoCheckIterativeWrite() - // here because we need a custom function to check the output, since it - // can't be described by a simple rect.) - auto writeFunc = [&](uint32_t aRow) { - if (aRow < 20 || aRow >= 80) { - return aSink->WriteBuffer(buffer); - } else { - return aSink->WriteEmptyRow(); - } - }; - - auto checkFunc = [&]{ - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - - EXPECT_TRUE(RowsAreSolidColor(surface, 0, 20, BGRAColor::Green())); - EXPECT_TRUE(RowsAreSolidColor(surface, 20, 60, BGRAColor::Transparent())); - EXPECT_TRUE(RowsAreSolidColor(surface, 80, 20, BGRAColor::Green())); - }; - - DoCheckIterativeWrite(aSink, writeFunc, checkFunc); - } - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkWriteUnsafeComputedRow) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - // Create a green buffer the same size as one row of the surface. - uint32_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = BGRAColor::Green().AsPixel(); - } - - // Write the buffer to successive rows until every row of the surface - // has been written. We only write to the right half of each row, so we - // check that the left side of the generated image is transparent and the - // right side is green. - CheckIterativeWrite(aDecoder, aSink, IntRect(50, 0, 50, 100), [&]{ - return aSink->WriteUnsafeComputedRow<uint32_t>([&](uint32_t* aRow, - uint32_t aLength) { - EXPECT_EQ(100u, aLength ); - memcpy(aRow + 50, buffer, 50 * sizeof(uint32_t)); - }); - }); - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkProgressivePasses) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - { - // Fill the image with a first pass of red. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Red())); - } - - { - ResetForNextPass(aSink); - - // Check that the generated image is still the first pass image. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Red())); - } - - { - // Fill the image with a second pass of green. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Green())); - } - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkInvalidRect) -{ - WithSurfaceSink<Orient::NORMAL>([](Decoder* aDecoder, SurfaceSink* aSink) { - { - // Write one row. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 100) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - count++; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(100u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Assert that we have the right invalid rect. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 0, 100, 1), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 0, 100, 1), invalidRect->mOutputSpaceRect); - } - - { - // Write eight rows. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 100 * 8) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - count++; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(100u * 8u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Assert that we have the right invalid rect. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 1, 100, 8), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 1, 100, 8), invalidRect->mOutputSpaceRect); - } - - { - // Write the left half of one row. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 50) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - count++; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Assert that we don't have an invalid rect, since the invalid rect only - // gets updated when a row gets completed. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - } - - { - // Write the right half of the same row. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 50) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - count++; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Assert that we have the right invalid rect, which will include both the - // left and right halves of this row now that we've completed it. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 9, 100, 1), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 9, 100, 1), invalidRect->mOutputSpaceRect); - } - - { - // Write no rows. - auto result = aSink->WritePixels<uint32_t>([&]() { - return AsVariant(WriteState::NEED_MORE_DATA); - }); - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Assert that we don't have an invalid rect. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - } - - { - // Fill the rest of the image. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() { - count++; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 90u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Assert that we have the right invalid rect. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 10, 100, 90), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 10, 100, 90), invalidRect->mOutputSpaceRect); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Green())); - } - }); -} - -TEST(ImageSurfaceSink, SurfaceSinkFlipVertically) -{ - WithSurfaceSink<Orient::FLIP_VERTICALLY>([](Decoder* aDecoder, - SurfaceSink* aSink) { - { - // Fill the image with a first pass of red. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Red().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u * 100u, count); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Red())); - } - - { - ResetForNextPass(aSink); - - // Check that the generated image is still the first pass image. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Red())); - } - - { - // Fill 25 rows of the image with green and make sure everything is OK. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() -> NextPixel<uint32_t> { - if (count == 25 * 100) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - count++; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(25u * 100u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Assert that we have the right invalid rect, which should include the - // *bottom* (since we're flipping vertically) 25 rows of the image. - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, 75, 100, 25), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, 75, 100, 25), invalidRect->mOutputSpaceRect); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(RowsAreSolidColor(surface, 0, 75, BGRAColor::Red())); - EXPECT_TRUE(RowsAreSolidColor(surface, 75, 25, BGRAColor::Green())); - } - - { - // Fill the rest of the image with a second pass of green. - uint32_t count = 0; - auto result = aSink->WritePixels<uint32_t>([&]() { - ++count; - return AsVariant(BGRAColor::Green().AsPixel()); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(75u * 100u, count); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 75), - IntRect(0, 0, 100, 75)); - - // Check that the generated image is correct. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - RefPtr<SourceSurface> surface = currentFrame->GetSourceSurface(); - EXPECT_TRUE(IsSolidColor(surface, BGRAColor::Green())); - } - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkInitialization) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Check initial state. - EXPECT_FALSE(aSink->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that the paletted image data is zero-initialized. - RawAccessFrameRef currentFrame = aDecoder->GetCurrentFrameRef(); - uint8_t* imageData = nullptr; - uint32_t imageLength = 0; - currentFrame->GetImageData(&imageData, &imageLength); - ASSERT_TRUE(imageData != nullptr); - ASSERT_EQ(100u * 100u, imageLength); - for (uint32_t i = 0; i < imageLength; ++i) { - ASSERT_EQ(uint8_t(0), imageData[i]); - } - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsFor0_0_100_100) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - CheckPalettedWritePixels(aDecoder, aSink); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsFor25_25_50_50) -{ - WithPalettedSurfaceSink(IntRect(25, 25, 50, 50), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - CheckPalettedWritePixels(aDecoder, aSink, - /* aOutputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputWriteRect = */ Some(IntRect(25, 25, 50, 50)), - /* aOutputWriteRect = */ Some(IntRect(25, 25, 50, 50))); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsForMinus25_Minus25_50_50) -{ - WithPalettedSurfaceSink(IntRect(-25, -25, 50, 50), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - CheckPalettedWritePixels(aDecoder, aSink, - /* aOutputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputWriteRect = */ Some(IntRect(-25, -25, 50, 50)), - /* aOutputWriteRect = */ Some(IntRect(-25, -25, 50, 50))); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsFor75_Minus25_50_50) -{ - WithPalettedSurfaceSink(IntRect(75, -25, 50, 50), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - CheckPalettedWritePixels(aDecoder, aSink, - /* aOutputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputWriteRect = */ Some(IntRect(75, -25, 50, 50)), - /* aOutputWriteRect = */ Some(IntRect(75, -25, 50, 50))); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsForMinus25_75_50_50) -{ - WithPalettedSurfaceSink(IntRect(-25, 75, 50, 50), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - CheckPalettedWritePixels(aDecoder, aSink, - /* aOutputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputWriteRect = */ Some(IntRect(-25, 75, 50, 50)), - /* aOutputWriteRect = */ Some(IntRect(-25, 75, 50, 50))); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsFor75_75_50_50) -{ - WithPalettedSurfaceSink(IntRect(75, 75, 50, 50), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - CheckPalettedWritePixels(aDecoder, aSink, - /* aOutputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputRect = */ Some(IntRect(0, 0, 50, 50)), - /* aInputWriteRect = */ Some(IntRect(75, 75, 50, 50)), - /* aOutputWriteRect = */ Some(IntRect(75, 75, 50, 50))); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsFinish) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Write nothing into the surface; just finish immediately. - uint32_t count = 0; - auto result = aSink->WritePixels<uint8_t>([&]{ - count++; - return AsVariant(WriteState::FINISHED); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(1u, count); - - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixels<uint8_t>([&]() { - count++; - return AsVariant(uint8_t(128)); - }); - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is correct. - EXPECT_TRUE(IsSolidPalettedColor(aDecoder, 0)); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsEarlyExit) -{ - auto checkEarlyExit = - [](Decoder* aDecoder, PalettedSurfaceSink* aSink, WriteState aState) { - // Write half a row of green pixels and then exit early with |aState|. If - // the lambda keeps getting called, we'll write red pixels, which will cause - // the test to fail. - uint32_t count = 0; - auto result = aSink->WritePixels<uint8_t>([&]() -> NextPixel<uint8_t> { - if (count == 50) { - return AsVariant(aState); - } - return count++ < 50 ? AsVariant(uint8_t(255)) : AsVariant(uint8_t(128)); - }); - - EXPECT_EQ(aState, result); - EXPECT_EQ(50u, count); - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 50, 1)); - - if (aState != WriteState::FINISHED) { - // We should still be able to write more at this point. - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Verify that we can resume writing. We'll finish up the same row. - count = 0; - result = aSink->WritePixels<uint8_t>([&]() -> NextPixel<uint8_t> { - if (count == 50) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - ++count; - return AsVariant(uint8_t(255)); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 100, 1)); - - return; - } - - // We should've finished the surface at this point. - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixels<uint8_t>([&]{ - count++; - return AsVariant(uint8_t(128)); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is still correct. - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 50, 1)); - }; - - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [&](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::NEED_MORE_DATA); - }); - - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [&](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FAILURE); - }); - - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [&](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FINISHED); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsToRow) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Write the first 99 rows of our 100x100 surface and verify that even - // though our lambda will yield pixels forever, only one row is written per - // call to WritePixelsToRow(). - for (int row = 0; row < 99; ++row) { - uint32_t count = 0; - WriteState result = aSink->WritePixelsToRow<uint8_t>([&]{ - ++count; - return AsVariant(uint8_t(255)); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(100u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isSome()); - EXPECT_EQ(IntRect(0, row, 100, 1), invalidRect->mInputSpaceRect); - EXPECT_EQ(IntRect(0, row, 100, 1), invalidRect->mOutputSpaceRect); - - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 100, row + 1)); - } - - // Write the final line, which should finish the surface. - uint32_t count = 0; - WriteState result = aSink->WritePixelsToRow<uint8_t>([&]{ - ++count; - return AsVariant(uint8_t(255)); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(100u, count); - - // Note that the final invalid rect we expect here is only the last row; - // that's because we called TakeInvalidRect() repeatedly in the loop above. - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 99, 100, 1), - IntRect(0, 99, 100, 1)); - - // Check that the generated image is correct. - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixelsToRow<uint8_t>([&]{ - count++; - return AsVariant(uint8_t(128)); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is still correct. - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 100, 100)); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWritePixelsToRowEarlyExit) -{ - auto checkEarlyExit = - [](Decoder* aDecoder, PalettedSurfaceSink* aSink, WriteState aState) { - // Write half a row of 255s and then exit early with |aState|. If the lambda - // keeps getting called, we'll write 128s, which will cause the test to - // fail. - uint32_t count = 0; - auto result = aSink->WritePixelsToRow<uint8_t>([&]() -> NextPixel<uint8_t> { - if (count == 50) { - return AsVariant(aState); - } - return count++ < 50 ? AsVariant(uint8_t(255)) - : AsVariant(uint8_t(128)); - }); - - EXPECT_EQ(aState, result); - EXPECT_EQ(50u, count); - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 50, 1)); - - if (aState != WriteState::FINISHED) { - // We should still be able to write more at this point. - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - // Verify that we can resume the same row and still stop at the end. - count = 0; - WriteState result = aSink->WritePixelsToRow<uint8_t>([&]{ - ++count; - return AsVariant(uint8_t(255)); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 100, 1)); - - return; - } - - // We should've finished the surface at this point. - AssertCorrectPipelineFinalState(aSink, - IntRect(0, 0, 100, 100), - IntRect(0, 0, 100, 100)); - - // Attempt to write more and make sure that nothing gets written. - count = 0; - result = aSink->WritePixelsToRow<uint8_t>([&]{ - count++; - return AsVariant(uint8_t(128)); - }); - - EXPECT_EQ(WriteState::FINISHED, result); - EXPECT_EQ(0u, count); - EXPECT_TRUE(aSink->IsSurfaceFinished()); - - // Check that the generated image is still correct. - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 50, 1)); - }; - - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [&](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::NEED_MORE_DATA); - }); - - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [&](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FAILURE); - }); - - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [&](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - checkEarlyExit(aDecoder, aSink, WriteState::FINISHED); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteBuffer) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Create a buffer the same size as one row of the surface (which is 100x100), - // containing 60 pixels of 255 in the middle and 20 transparent pixels of 0 on - // either side. - uint8_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 20 <= i && i < 80 ? 255 : 0; - } - - // Write the buffer to every row of the surface and check that the generated - // image is correct. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(20, 0, 60, 100), [&]{ - return aSink->WriteBuffer(buffer); - }); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteBufferPartialRow) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Create a buffer the same size as one row of the surface, containing all - // 255 pixels. - uint8_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 255; - } - - // Write the buffer to the middle 60 pixels of every row of the surface and - // check that the generated image is correct. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(20, 0, 60, 100), [&]{ - return aSink->WriteBuffer(buffer, 20, 60); - }); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteBufferPartialRowStartColOverflow) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Create a buffer the same size as one row of the surface, containing all - // 255 pixels. - uint8_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 255; - } - - { - // Write the buffer to successive rows until every row of the surface - // has been written. We place the start column beyond the end of the row, - // which will prevent us from writing anything, so we check that the - // generated image is entirely 0. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(0, 0, 0, 0), [&]{ - return aSink->WriteBuffer(buffer, 100, 100); - }); - } - - ResetForNextPass(aSink); - - { - // Write the buffer to successive rows until every row of the surface - // has been written. We use column 50 as the start column, but we still - // write the buffer, which means we overflow the right edge of the surface - // by 50 pixels. We check that the left half of the generated image is - // 0 and the right half is 255. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(50, 0, 50, 100), [&]{ - return aSink->WriteBuffer(buffer, 50, 100); - }); - } - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteBufferPartialRowBufferOverflow) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Create a buffer twice as large as a row of the surface. The first half - // (which is as large as a row of the image) will contain 255 pixels, - // while the second half will contain 128 pixels. - uint8_t buffer[200]; - for (int i = 0; i < 200; ++i) { - buffer[i] = i < 100 ? 255 : 128; - } - - { - // Write the buffer to successive rows until every row of the surface has - // been written. The buffer extends 100 pixels to the right of a row of - // the surface, but bounds checking will prevent us from overflowing the - // buffer. We check that the generated image is entirely 255 since the - // pixels on the right side of the buffer shouldn't have been written to - // the surface. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(0, 0, 100, 100), [&]{ - return aSink->WriteBuffer(buffer, 0, 200); - }); - } - - ResetForNextPass(aSink); - - { - // Write from the buffer to the middle of each row of the surface. That - // means that the left side of each row should be 0, since we didn't write - // anything there. A buffer overflow would cause us to write buffer - // contents into the left side of each row. We check that the generated - // image is 0 on the left side and 255 on the right. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(50, 0, 50, 100), [&]{ - return aSink->WriteBuffer(buffer, 50, 200); - }); - } - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteBufferFromNullSource) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Calling WriteBuffer() with a null pointer should fail without making any - // changes to the surface. - uint8_t* nullBuffer = nullptr; - WriteState result = aSink->WriteBuffer(nullBuffer); - - EXPECT_EQ(WriteState::FAILURE, result); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - Maybe<SurfaceInvalidRect> invalidRect = aSink->TakeInvalidRect(); - EXPECT_TRUE(invalidRect.isNothing()); - - // Check that nothing got written to the surface. - CheckGeneratedPalettedImage(aDecoder, IntRect(0, 0, 0, 0)); - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteEmptyRow) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - { - // Write an empty row to each row of the surface. We check that the - // generated image is entirely 0. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(0, 0, 0, 0), [&]{ - return aSink->WriteEmptyRow(); - }); - } - - ResetForNextPass(aSink); - - { - // Write a partial row before we begin calling WriteEmptyRow(). We check - // that the generated image is entirely 0, which is to be expected since - // WriteEmptyRow() overwrites the current row even if some data has - // already been written to it. - uint32_t count = 0; - auto result = aSink->WritePixels<uint8_t>([&]() -> NextPixel<uint8_t> { - if (count == 50) { - return AsVariant(WriteState::NEED_MORE_DATA); - } - ++count; - return AsVariant(uint8_t(255)); - }); - - EXPECT_EQ(WriteState::NEED_MORE_DATA, result); - EXPECT_EQ(50u, count); - EXPECT_FALSE(aSink->IsSurfaceFinished()); - - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(0, 0, 0, 0), [&]{ - return aSink->WriteEmptyRow(); - }); - } - - ResetForNextPass(aSink); - - { - // Create a buffer the same size as one row of the surface, containing all - // 255 pixels. - uint8_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 255; - } - - // Write an empty row to the middle 60 rows of the surface. The first 20 - // and last 20 rows will be 255. (We need to use DoCheckIterativeWrite() - // here because we need a custom function to check the output, since it - // can't be described by a simple rect.) - auto writeFunc = [&](uint32_t aRow) { - if (aRow < 20 || aRow >= 80) { - return aSink->WriteBuffer(buffer); - } else { - return aSink->WriteEmptyRow(); - } - }; - - auto checkFunc = [&]{ - EXPECT_TRUE(PalettedRowsAreSolidColor(aDecoder, 0, 20, 255)); - EXPECT_TRUE(PalettedRowsAreSolidColor(aDecoder, 20, 60, 0)); - EXPECT_TRUE(PalettedRowsAreSolidColor(aDecoder, 80, 20, 255)); - }; - - DoCheckIterativeWrite(aSink, writeFunc, checkFunc); - } - }); -} - -TEST(ImageSurfaceSink, PalettedSurfaceSinkWriteUnsafeComputedRow) -{ - WithPalettedSurfaceSink(IntRect(0, 0, 100, 100), - [](Decoder* aDecoder, PalettedSurfaceSink* aSink) { - // Create an all-255 buffer the same size as one row of the surface. - uint8_t buffer[100]; - for (int i = 0; i < 100; ++i) { - buffer[i] = 255; - } - - // Write the buffer to successive rows until every row of the surface has - // been written. We only write to the right half of each row, so we check - // that the left side of the generated image is 0 and the right side is 255. - CheckPalettedIterativeWrite(aDecoder, aSink, IntRect(50, 0, 50, 100), [&]{ - return aSink->WriteUnsafeComputedRow<uint8_t>([&](uint8_t* aRow, - uint32_t aLength) { - EXPECT_EQ(100u, aLength ); - memcpy(aRow + 50, buffer, 50 * sizeof(uint8_t)); - }); - }); - }); -} diff --git a/image/test/gtest/animated-with-extra-image-sub-blocks.gif b/image/test/gtest/animated-with-extra-image-sub-blocks.gif Binary files differdeleted file mode 100644 index a145c814a..000000000 --- a/image/test/gtest/animated-with-extra-image-sub-blocks.gif +++ /dev/null diff --git a/image/test/gtest/corrupt-with-bad-bmp-height.ico b/image/test/gtest/corrupt-with-bad-bmp-height.ico Binary files differdeleted file mode 100644 index ee4a90fcd..000000000 --- a/image/test/gtest/corrupt-with-bad-bmp-height.ico +++ /dev/null diff --git a/image/test/gtest/corrupt-with-bad-bmp-width.ico b/image/test/gtest/corrupt-with-bad-bmp-width.ico Binary files differdeleted file mode 100644 index aa4051cd0..000000000 --- a/image/test/gtest/corrupt-with-bad-bmp-width.ico +++ /dev/null diff --git a/image/test/gtest/corrupt.jpg b/image/test/gtest/corrupt.jpg Binary files differdeleted file mode 100644 index 555a416d7..000000000 --- a/image/test/gtest/corrupt.jpg +++ /dev/null diff --git a/image/test/gtest/downscaled.bmp b/image/test/gtest/downscaled.bmp Binary files differdeleted file mode 100644 index 9e6a29e62..000000000 --- a/image/test/gtest/downscaled.bmp +++ /dev/null diff --git a/image/test/gtest/downscaled.gif b/image/test/gtest/downscaled.gif Binary files differdeleted file mode 100644 index ff9a20bcd..000000000 --- a/image/test/gtest/downscaled.gif +++ /dev/null diff --git a/image/test/gtest/downscaled.ico b/image/test/gtest/downscaled.ico Binary files differdeleted file mode 100644 index ee112af0a..000000000 --- a/image/test/gtest/downscaled.ico +++ /dev/null diff --git a/image/test/gtest/downscaled.icon b/image/test/gtest/downscaled.icon Binary files differdeleted file mode 100644 index 19785f5dc..000000000 --- a/image/test/gtest/downscaled.icon +++ /dev/null diff --git a/image/test/gtest/downscaled.jpg b/image/test/gtest/downscaled.jpg Binary files differdeleted file mode 100644 index 5a4b3cd03..000000000 --- a/image/test/gtest/downscaled.jpg +++ /dev/null diff --git a/image/test/gtest/downscaled.png b/image/test/gtest/downscaled.png Binary files differdeleted file mode 100644 index b71b4652d..000000000 --- a/image/test/gtest/downscaled.png +++ /dev/null diff --git a/image/test/gtest/first-frame-green.gif b/image/test/gtest/first-frame-green.gif Binary files differdeleted file mode 100644 index cd3c7d3db..000000000 --- a/image/test/gtest/first-frame-green.gif +++ /dev/null diff --git a/image/test/gtest/first-frame-green.png b/image/test/gtest/first-frame-green.png Binary files differdeleted file mode 100644 index 115f035d8..000000000 --- a/image/test/gtest/first-frame-green.png +++ /dev/null diff --git a/image/test/gtest/first-frame-padding.gif b/image/test/gtest/first-frame-padding.gif Binary files differdeleted file mode 100644 index e6d7c4932..000000000 --- a/image/test/gtest/first-frame-padding.gif +++ /dev/null diff --git a/image/test/gtest/green-1x1-truncated.gif b/image/test/gtest/green-1x1-truncated.gif Binary files differdeleted file mode 100644 index 0829f9694..000000000 --- a/image/test/gtest/green-1x1-truncated.gif +++ /dev/null diff --git a/image/test/gtest/green.bmp b/image/test/gtest/green.bmp Binary files differdeleted file mode 100644 index f79dd672a..000000000 --- a/image/test/gtest/green.bmp +++ /dev/null diff --git a/image/test/gtest/green.gif b/image/test/gtest/green.gif Binary files differdeleted file mode 100644 index ef215dfc9..000000000 --- a/image/test/gtest/green.gif +++ /dev/null diff --git a/image/test/gtest/green.ico b/image/test/gtest/green.ico Binary files differdeleted file mode 100644 index c5dfa8b53..000000000 --- a/image/test/gtest/green.ico +++ /dev/null diff --git a/image/test/gtest/green.icon b/image/test/gtest/green.icon Binary files differdeleted file mode 100644 index c74e62fee..000000000 --- a/image/test/gtest/green.icon +++ /dev/null diff --git a/image/test/gtest/green.jpg b/image/test/gtest/green.jpg Binary files differdeleted file mode 100644 index 48c454d27..000000000 --- a/image/test/gtest/green.jpg +++ /dev/null diff --git a/image/test/gtest/green.png b/image/test/gtest/green.png Binary files differdeleted file mode 100644 index 7df25f33b..000000000 --- a/image/test/gtest/green.png +++ /dev/null diff --git a/image/test/gtest/invalid-truncated-metadata.bmp b/image/test/gtest/invalid-truncated-metadata.bmp Binary files differdeleted file mode 100644 index 228c5c999..000000000 --- a/image/test/gtest/invalid-truncated-metadata.bmp +++ /dev/null diff --git a/image/test/gtest/moz.build b/image/test/gtest/moz.build deleted file mode 100644 index 3548eaecc..000000000 --- a/image/test/gtest/moz.build +++ /dev/null @@ -1,79 +0,0 @@ -# -*- 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/. - -Library('imagetest') - -UNIFIED_SOURCES = [ - 'Common.cpp', - 'TestADAM7InterpolatingFilter.cpp', - 'TestCopyOnWrite.cpp', - 'TestDecoders.cpp', - 'TestDecodeToSurface.cpp', - 'TestDeinterlacingFilter.cpp', - 'TestLoader.cpp', - 'TestMetadata.cpp', - 'TestRemoveFrameRectFilter.cpp', - 'TestSourceBuffer.cpp', - 'TestStreamingLexer.cpp', - 'TestSurfaceSink.cpp', -] - -if CONFIG['MOZ_ENABLE_SKIA']: - UNIFIED_SOURCES += [ - 'TestDownscalingFilter.cpp', - 'TestSurfacePipeIntegration.cpp', - ] - -SOURCES += [ - # Can't be unified because it manipulates the preprocessor environment. - 'TestDownscalingFilterNoSkia.cpp', -] - -TEST_HARNESS_FILES.gtest += [ - 'animated-with-extra-image-sub-blocks.gif', - 'corrupt-with-bad-bmp-height.ico', - 'corrupt-with-bad-bmp-width.ico', - 'corrupt.jpg', - 'downscaled.bmp', - 'downscaled.gif', - 'downscaled.ico', - 'downscaled.icon', - 'downscaled.jpg', - 'downscaled.png', - 'first-frame-green.gif', - 'first-frame-green.png', - 'first-frame-padding.gif', - 'green-1x1-truncated.gif', - 'green.bmp', - 'green.gif', - 'green.ico', - 'green.icon', - 'green.jpg', - 'green.png', - 'invalid-truncated-metadata.bmp', - 'no-frame-delay.gif', - 'rle4.bmp', - 'rle8.bmp', - 'transparent-ico-with-and-mask.ico', - 'transparent-if-within-ico.bmp', - 'transparent.gif', - 'transparent.png', -] - -include('/ipc/chromium/chromium-config.mozbuild') - -LOCAL_INCLUDES += [ - '/dom/base', - '/gfx/2d', - '/image', -] - -LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES'] - -FINAL_LIBRARY = 'xul-gtest' - -if CONFIG['GNU_CXX']: - CXXFLAGS += ['-Wno-error=shadow'] diff --git a/image/test/gtest/no-frame-delay.gif b/image/test/gtest/no-frame-delay.gif Binary files differdeleted file mode 100644 index 1c50b6743..000000000 --- a/image/test/gtest/no-frame-delay.gif +++ /dev/null diff --git a/image/test/gtest/rle4.bmp b/image/test/gtest/rle4.bmp Binary files differdeleted file mode 100644 index 78a092787..000000000 --- a/image/test/gtest/rle4.bmp +++ /dev/null diff --git a/image/test/gtest/rle8.bmp b/image/test/gtest/rle8.bmp Binary files differdeleted file mode 100644 index bd793b6b6..000000000 --- a/image/test/gtest/rle8.bmp +++ /dev/null diff --git a/image/test/gtest/transparent-ico-with-and-mask.ico b/image/test/gtest/transparent-ico-with-and-mask.ico Binary files differdeleted file mode 100644 index ab0dc4bce..000000000 --- a/image/test/gtest/transparent-ico-with-and-mask.ico +++ /dev/null diff --git a/image/test/gtest/transparent-if-within-ico.bmp b/image/test/gtest/transparent-if-within-ico.bmp Binary files differdeleted file mode 100644 index 4dc04c181..000000000 --- a/image/test/gtest/transparent-if-within-ico.bmp +++ /dev/null diff --git a/image/test/gtest/transparent.gif b/image/test/gtest/transparent.gif Binary files differdeleted file mode 100644 index 48f5c7caf..000000000 --- a/image/test/gtest/transparent.gif +++ /dev/null diff --git a/image/test/gtest/transparent.png b/image/test/gtest/transparent.png Binary files differdeleted file mode 100644 index fc8002053..000000000 --- a/image/test/gtest/transparent.png +++ /dev/null diff --git a/security/manager/ssl/tests/unit/moz.build b/security/manager/ssl/tests/unit/moz.build index 8a97120c2..3cca4c4fa 100644 --- a/security/manager/ssl/tests/unit/moz.build +++ b/security/manager/ssl/tests/unit/moz.build @@ -31,7 +31,6 @@ TEST_DIRS += [ 'test_ocsp_fetch_method', 'test_ocsp_url', 'test_onecrl', - 'test_pinning_dynamic', 'test_startcom_wosign', 'test_validity', ] diff --git a/toolkit/mozapps/update/updater/moz.build b/toolkit/mozapps/update/updater/moz.build index 1cca83b5b..52eaba21d 100644 --- a/toolkit/mozapps/update/updater/moz.build +++ b/toolkit/mozapps/update/updater/moz.build @@ -11,8 +11,6 @@ else: updater_rel_path = '' include('updater-common.build') -if CONFIG['ENABLE_TESTS']: - DIRS += ['updater-xpcshell'] CXXFLAGS += CONFIG['MOZ_BZ2_CFLAGS'] diff --git a/toolkit/mozapps/update/updater/updater-xpcshell/Makefile.in b/toolkit/mozapps/update/updater/updater-xpcshell/Makefile.in deleted file mode 100644 index 01822b186..000000000 --- a/toolkit/mozapps/update/updater/updater-xpcshell/Makefile.in +++ /dev/null @@ -1,41 +0,0 @@ -# vim:set ts=8 sw=8 sts=8 noet: -# 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/. - -# For changes here, also consider ../Makefile.in - -XPCSHELLTESTROOT = $(topobjdir)/_tests/xpcshell/toolkit/mozapps/update/tests -MOCHITESTROOT = $(topobjdir)/_tests/testing/mochitest/chrome/toolkit/mozapps/update/tests - -include $(topsrcdir)/config/rules.mk - -ifndef MOZ_WINCONSOLE -ifdef MOZ_DEBUG -MOZ_WINCONSOLE = 1 -else -MOZ_WINCONSOLE = 0 -endif -endif - -ifdef COMPILE_ENVIRONMENT -tools:: -ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) - # Copy for xpcshell tests - $(NSINSTALL) -D $(XPCSHELLTESTROOT)/data/updater-xpcshell.app - rsync -a -C --exclude '*.in' $(srcdir)/../macbuild/Contents $(XPCSHELLTESTROOT)/data/updater-xpcshell.app - sed -e 's/%APP_NAME%/$(MOZ_APP_DISPLAYNAME)/' $(srcdir)/../macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | \ - iconv -f UTF-8 -t UTF-16 > $(XPCSHELLTESTROOT)/data/updater-xpcshell.app/Contents/Resources/English.lproj/InfoPlist.strings - $(NSINSTALL) -D $(XPCSHELLTESTROOT)/data/updater-xpcshell.app/Contents/MacOS/updater-xpcshell - $(NSINSTALL) updater-xpcshell $(XPCSHELLTESTROOT)/data/updater-xpcshell.app/Contents/MacOS - rm -Rf $(XPCSHELLTESTROOT)/data/updater.app - mv $(XPCSHELLTESTROOT)/data/updater-xpcshell.app $(XPCSHELLTESTROOT)/data/updater.app - mv $(XPCSHELLTESTROOT)/data/updater.app/Contents/MacOS/updater-xpcshell $(XPCSHELLTESTROOT)/data/updater.app/Contents/MacOS/org.mozilla.updater - - # Copy for mochitest chrome tests - rsync -a -C $(XPCSHELLTESTROOT)/data/updater.app $(MOCHITESTROOT)/data/ -else - cp $(PROGRAM) $(XPCSHELLTESTROOT)/data/updater$(BIN_SUFFIX) - cp $(PROGRAM) $(MOCHITESTROOT)/data/updater$(BIN_SUFFIX) -endif -endif # COMPILE_ENVIRONMENT diff --git a/toolkit/mozapps/update/updater/updater-xpcshell/moz.build b/toolkit/mozapps/update/updater/updater-xpcshell/moz.build deleted file mode 100644 index 710b7e1de..000000000 --- a/toolkit/mozapps/update/updater/updater-xpcshell/moz.build +++ /dev/null @@ -1,14 +0,0 @@ -# -*- 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/. - -Program('updater-xpcshell') - -updater_rel_path = '../' -DIST_INSTALL = False -DEFINES['TEST_UPDATER'] = True -include('../updater-common.build') - -CXXFLAGS += CONFIG['MOZ_BZ2_CFLAGS'] |