tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit e162366a256ffe0088932f635d214e980e2814c2
parent eb2cfbb2425b4289c947af9be8d51923508f2e34
Author: iulian moraru <imoraru@mozilla.com>
Date:   Wed, 24 Dec 2025 17:13:28 +0200

Revert "Bug 1981349, Bug 1981346, Bug 1981345, Bug 1984685, Bug 1981344, Bug 1983766, Bug 1989323 - Add referenceTarget support for label/for, label wrapped and output/for. r=credential-management-reviewers,webidl,dimi,Jamie,smaug" for causing android build bustages.

This reverts commit 1b5cf4cdf8e443dc9ada5c3ee53b06c2a1c4b678.

Revert "Bug 1981346 - Add referenceTarget support for the form attribute. r=credential-management-reviewers,webidl,dimi,Jamie,smaug"

This reverts commit 2394d9205a7a0b5baed751d875c023dd047487f9.

Revert "Bug 1981345 - Implement referenceTarget support for multiple element attributes. r=dom-core,Jamie,smaug"

This reverts commit 571a17ff820b6a34d72b69b9ae5752020b193d74.

Revert "Bug 1984685 - Refactor: consistently return Maybe<nsTArray<RefPtr<Element>>> when getting attr-associated elements, and key AttrRelProviders on nsAtom rather than nsString. r=dom-core,morgan,Jamie,smaug"

This reverts commit 3b389fdd62e93b624a2a01b240e30556c059f389.

Revert "Bug 1981344 - Implement referenceTarget support for single-element attributes. r=dom-core,credential-management-reviewers,webidl,layout-reviewers,emilio,keithamus,smaug,mtigley"

This reverts commit 5cc2a12756a9de2d4352f28ce12744dad66b15f0.

Revert "Bug 1983766 - Split single element attribute getters into bindings/internals versions. r=dom-core,credential-management-reviewers,webidl,layout-reviewers,smaug,keithamus,jwatt,mtigley"

This reverts commit 68e2d26aa9e4afc71daba79520994c3076c67788.

Revert "Bug 1989323 - Make `referenceTarget` IDL attributes on ShadowRoot, HTMLTemplateElement and ShadowRootInit nullable. r=dom-core,webidl,saschanaz,smaug"

This reverts commit 1234b31599e69cab1784471925fa8c1802e3514f.

Diffstat:
Maccessible/base/AccIterator.cpp | 200++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Maccessible/base/AccIterator.h | 30++++++++++++++++++------------
Maccessible/base/nsAccUtils.cpp | 11++++++-----
Maccessible/base/nsAccUtils.h | 4++--
Maccessible/base/nsAccessibilityService.cpp | 3++-
Maccessible/base/nsCoreUtils.cpp | 2+-
Maccessible/generic/DocAccessible-inl.h | 7+++----
Maccessible/generic/DocAccessible.cpp | 156++++++++++++++++++++++++++++++++++----------------------------------------------
Maccessible/generic/DocAccessible.h | 11++++++-----
Maccessible/generic/LocalAccessible.cpp | 8++++----
Maccessible/html/HTMLElementAccessibles.cpp | 2+-
Maccessible/html/HTMLFormControlAccessible.cpp | 5++---
Mdom/base/Element.cpp | 570+++++++++----------------------------------------------------------------------
Mdom/base/Element.h | 150++++++++++++++------------------------------------------------------------------
Mdom/base/FormData.cpp | 2+-
Mdom/base/FragmentOrElement.h | 64----------------------------------------------------------------
Mdom/base/RadioGroupContainer.cpp | 2+-
Mdom/base/ShadowRoot.cpp | 69++++-----------------------------------------------------------------
Mdom/base/ShadowRoot.h | 17++---------------
Mdom/base/TreeOrderedArray.h | 3+--
Mdom/base/TreeOrderedArrayInlines.h | 9++++-----
Mdom/base/nsContentList.cpp | 252+++++++++----------------------------------------------------------------------
Mdom/base/nsContentList.h | 49+++++++++----------------------------------------
Mdom/base/nsContentUtils.cpp | 4++--
Mdom/base/nsINode.cpp | 4++--
Mdom/events/EventStateManager.cpp | 2+-
Mdom/events/IMEStateManager.cpp | 2+-
Mdom/html/ElementInternals.cpp | 29++++++++++++-----------------
Mdom/html/ElementInternals.h | 9+++------
Mdom/html/HTMLButtonElement.cpp | 15++++-----------
Mdom/html/HTMLButtonElement.h | 5++---
Mdom/html/HTMLElement.cpp | 2+-
Mdom/html/HTMLFormControlsCollection.h | 6++----
Mdom/html/HTMLFormElement.cpp | 26+++++++++++---------------
Mdom/html/HTMLImageElement.cpp | 2+-
Mdom/html/HTMLImageElement.h | 2+-
Mdom/html/HTMLInputElement.cpp | 23+++++++----------------
Mdom/html/HTMLInputElement.h | 8+++-----
Mdom/html/HTMLLabelElement.cpp | 50++++++++++++++++++++------------------------------
Mdom/html/HTMLLabelElement.h | 7+++----
Mdom/html/HTMLLegendElement.cpp | 11++---------
Mdom/html/HTMLLegendElement.h | 6+++---
Mdom/html/HTMLOptionElement.cpp | 9++-------
Mdom/html/HTMLOptionElement.h | 3+--
Mdom/html/HTMLTextAreaElement.h | 5++---
Mdom/html/nsGenericHTMLElement.cpp | 129+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mdom/html/nsGenericHTMLElement.h | 29+++++++++++++----------------
Mdom/html/nsIConstraintValidation.cpp | 4++--
Mdom/html/nsIFormControl.h | 10++--------
Mdom/webidl/Element.webidl | 2+-
Mdom/webidl/ElementInternals.webidl | 4++--
Mdom/webidl/HTMLButtonElement.webidl | 7+++----
Mdom/webidl/HTMLFieldSetElement.webidl | 3+--
Mdom/webidl/HTMLInputElement.webidl | 8+++-----
Mdom/webidl/HTMLLabelElement.webidl | 4++--
Mdom/webidl/HTMLLegendElement.webidl | 2+-
Mdom/webidl/HTMLMeterElement.webidl | 1-
Mdom/webidl/HTMLObjectElement.webidl | 4++--
Mdom/webidl/HTMLOptionElement.webidl | 3+--
Mdom/webidl/HTMLOutputElement.webidl | 4+---
Mdom/webidl/HTMLProgressElement.webidl | 1-
Mdom/webidl/HTMLSelectElement.webidl | 5++---
Mdom/webidl/HTMLTemplateElement.webidl | 2+-
Mdom/webidl/HTMLTextAreaElement.webidl | 5++---
Mdom/webidl/PopoverInvokerElement.webidl | 2+-
Mdom/webidl/ShadowRoot.webidl | 2+-
Mdom/xul/nsXULElement.cpp | 12------------
Mlayout/forms/nsRangeFrame.cpp | 2+-
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/aria-labelledby.html.ini | 12++++++++++++
Mtesting/web-platform/meta/shadow-dom/reference-target/tentative/commandfor.html.ini | 9++++++++-
Mtesting/web-platform/meta/shadow-dom/reference-target/tentative/dom-mutation.html.ini | 19+++++++++++++++++--
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/form.html.ini | 15+++++++++++++++
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/label-descendant.html.ini | 2++
Mtesting/web-platform/meta/shadow-dom/reference-target/tentative/label-for.html.ini | 1+
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/popovertarget.html.ini | 9+++++++++
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection-idl-setters.html.ini | 4860+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection-imperative-setup.html.ini | 45+++++++++++++++++++++++++++++++++++++++++++++
Mtesting/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection.html.ini | 47+++++++++++++++++++++++++++++++++++++++++++++++
Atesting/web-platform/meta/shadow-dom/reference-target/tentative/reference-target-basics.html.ini | 6++++++
Mtesting/web-platform/tests/shadow-dom/reference-target/tentative/dom-mutation.html | 87-------------------------------------------------------------------------------
Mtesting/web-platform/tests/shadow-dom/reference-target/tentative/form.html | 204-------------------------------------------------------------------------------
Mtesting/web-platform/tests/shadow-dom/reference-target/tentative/label-descendant.html | 207-------------------------------------------------------------------------------
Mtesting/web-platform/tests/shadow-dom/reference-target/tentative/label-for.html | 286++++++++++++++++---------------------------------------------------------------
Mtesting/web-platform/tests/tools/wptrunner/wptrunner/executors/actions.py | 26+++++++++++++-------------
Mtesting/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py | 20--------------------
Mtesting/web-platform/tests/tools/wptrunner/wptrunner/executors/executorselenium.py | 6------
Mtesting/web-platform/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py | 6------
Mtesting/web-platform/tests/tools/wptrunner/wptrunner/executors/protocol.py | 18------------------
Mtesting/web-platform/tests/tools/wptrunner/wptrunner/testdriver-extra.js | 48++++++++++++++++--------------------------------
Mtoolkit/components/formautofill/FormAutofillNative.cpp | 4++--
Mtoolkit/components/satchel/nsFormFillController.cpp | 2+-
91 files changed, 5661 insertions(+), 2379 deletions(-)

diff --git a/accessible/base/AccIterator.cpp b/accessible/base/AccIterator.cpp @@ -14,9 +14,7 @@ #include "mozilla/a11y/DocAccessibleParent.h" #include "mozilla/dom/DocumentOrShadowRoot.h" #include "mozilla/dom/Element.h" -#include "mozilla/dom/ElementInternals.h" #include "mozilla/dom/HTMLLabelElement.h" -#include "mozilla/dom/TreeOrderedArrayInlines.h" using namespace mozilla; using namespace mozilla::a11y; @@ -78,76 +76,69 @@ RelatedAccIterator::RelatedAccIterator(DocAccessible* aDocument, nsAtom* aRelAttr) : mDocument(aDocument), mDependentContent(aDependentContent), - mRelAttr(aRelAttr) {} - -void RelatedAccIterator::Initialize() { - nsIContent* content = mDependentContent; - dom::DocumentOrShadowRoot* root = - content->GetUncomposedDocOrConnectedShadowRoot(); - - while (root) { - if (nsAtom* id = content->GetID()) { - DocAccessible::AttrRelProviders* idProviders = - mDocument->GetRelProviders(content->AsElement(), id); - - if (idProviders) { - for (auto& provider : *idProviders) { - if (mRelAttr && provider->mRelAttr != mRelAttr) { - continue; - } - - mRelatedNodes.Insert(*provider->mContent); - } - } - } - if (auto result = mDocument->mDependentElementsMap.Lookup(content)) { - DocAccessible::AttrRelProviders* elementProviders = &result.Data(); - if (elementProviders) { - for (auto& provider : *elementProviders) { - if (mRelAttr && provider->mRelAttr != mRelAttr) { - continue; - } - - if (nsCoreUtils::IsDescendantOfAnyShadowIncludingAncestor( - content, provider->mContent)) { - mRelatedNodes.Insert(*provider->mContent); - } - } - } - } - dom::ShadowRoot* shadow = content->GetContainingShadow(); - dom::Element* element = - content->IsElement() ? content->AsElement() : nullptr; - if (shadow && element && element == shadow->GetReferenceTargetElement()) { - content = shadow->Host(); - root = content->GetUncomposedDocOrConnectedShadowRoot(); - } else { - root = nullptr; - } + mRelAttr(aRelAttr), + mProviders(nullptr), + mIndex(0), + mIsWalkingDependentElements(false) { + nsAutoString id; + if (aDependentContent->IsElement() && + aDependentContent->AsElement()->GetAttr(nsGkAtoms::id, id)) { + mProviders = mDocument->GetRelProviders(aDependentContent->AsElement(), id); } - - mInitialized = true; } LocalAccessible* RelatedAccIterator::Next() { - if (!mInitialized) { - Initialize(); + if (!mProviders || mIndex == mProviders->Length()) { + if (mIsWalkingDependentElements) { + // We've walked both dependent ids and dependent elements, so there are + // no more targets. + return nullptr; + } + // We've returned all dependent ids, but there might be dependent elements + // too. Walk those next. + mIsWalkingDependentElements = true; + mIndex = 0; + if (auto providers = + mDocument->mDependentElementsMap.Lookup(mDependentContent)) { + mProviders = &providers.Data(); + } else { + mProviders = nullptr; + return nullptr; + } } - while (mNextIndex < mRelatedNodes.Length()) { - nsIContent* nextContent = mRelatedNodes[mNextIndex]; - mNextIndex++; + while (mIndex < mProviders->Length()) { + const auto& provider = (*mProviders)[mIndex++]; - LocalAccessible* next = mDocument->GetAccessible(nextContent); - if (next) { - return next; + // Return related accessible for the given attribute. + if (mRelAttr && provider->mRelAttr != mRelAttr) { + continue; + } + // If we're walking elements (not ids), the explicitly set attr-element + // `mDependentContent` must be a descendant of any of the refering element + // `mProvider->mContent`'s shadow-including ancestors. + if (mIsWalkingDependentElements && + !nsCoreUtils::IsDescendantOfAnyShadowIncludingAncestor( + mDependentContent, provider->mContent)) { + continue; + } + LocalAccessible* related = mDocument->GetAccessible(provider->mContent); + if (related) { + return related; } - if (nextContent == mDocument->GetContent()) { + // If the document content is pointed by relation then return the + // document itself. + if (provider->mContent == mDocument->GetContent()) { return mDocument; } } + // We exhausted mProviders without returning anything. + if (!mIsWalkingDependentElements) { + // Call this function again to start walking the dependent elements. + return Next(); + } return nullptr; } @@ -165,7 +156,7 @@ HTMLLabelIterator::HTMLLabelIterator(DocAccessible* aDocument, bool HTMLLabelIterator::IsLabel(LocalAccessible* aLabel) { dom::HTMLLabelElement* labelEl = dom::HTMLLabelElement::FromNode(aLabel->GetContent()); - return labelEl && labelEl->GetLabeledElementInternal() == mAcc->GetContent(); + return labelEl && labelEl->GetControl() == mAcc->GetContent(); } LocalAccessible* HTMLLabelIterator::Next() { @@ -179,21 +170,7 @@ LocalAccessible* HTMLLabelIterator::Next() { } // Ignore ancestor label on not widget accessible. - if (mLabelFilter == eSkipAncestorLabel) { - return nullptr; - } - - if (!mAcc->IsWidget()) { - nsIContent* content = mAcc->GetContent(); - if (!content->IsElement()) { - return nullptr; - } - dom::Element* element = content->AsElement(); - // <output> is not a widget but is labelable. - if (!element->IsLabelable()) { - return nullptr; - } - } + if (mLabelFilter == eSkipAncestorLabel || !mAcc->IsWidget()) return nullptr; // Go up tree to get a name of ancestor label if there is one (an ancestor // <label> implicitly points to us). Don't go up farther than form or @@ -272,26 +249,71 @@ LocalAccessible* XULDescriptionIterator::Next() { AssociatedElementsIterator::AssociatedElementsIterator(DocAccessible* aDoc, nsIContent* aContent, nsAtom* aIDRefsAttr) - : mContent(aContent), mDoc(aDoc), mElemIdx(0) { - if (!mContent->IsElement()) { - return; + : mContent(aContent), mDoc(aDoc), mCurrIdx(0), mElemIdx(0) { + if (mContent->IsElement()) { + mContent->AsElement()->GetAttr(aIDRefsAttr, mIDs); + if (mIDs.IsEmpty() && + (aria::AttrCharacteristicsFor(aIDRefsAttr) & ATTR_REFLECT_ELEMENTS)) { + nsAccUtils::GetARIAElementsAttr(mContent->AsElement(), aIDRefsAttr, + mElements); + } + } +} + +const nsDependentSubstring AssociatedElementsIterator::NextID() { + for (; mCurrIdx < mIDs.Length(); mCurrIdx++) { + if (!NS_IsAsciiWhitespace(mIDs[mCurrIdx])) break; + } + + if (mCurrIdx >= mIDs.Length()) return nsDependentSubstring(); + + nsAString::index_type idStartIdx = mCurrIdx; + while (++mCurrIdx < mIDs.Length()) { + if (NS_IsAsciiWhitespace(mIDs[mCurrIdx])) break; } - auto elements = - mContent->AsElement()->GetAttrAssociatedElementsInternal(aIDRefsAttr); - if (elements) { - mElements.SwapElements(*elements); - } else if (auto* element = nsGenericHTMLElement::FromNode(aContent)) { - if (auto* internals = element->GetInternals()) { - elements = internals->GetAttrElements(aIDRefsAttr); - if (elements) { - mElements.SwapElements(*elements); + + return Substring(mIDs, idStartIdx, mCurrIdx++ - idStartIdx); +} + +dom::Element* AssociatedElementsIterator::NextElem() { + while (true) { + const nsDependentSubstring id = NextID(); + if (id.IsEmpty()) break; + + dom::Element* refContent = GetElem(id); + if (refContent) return refContent; + } + + while (dom::Element* element = mElements.SafeElementAt(mElemIdx++)) { + if (nsCoreUtils::IsDescendantOfAnyShadowIncludingAncestor(element, + mContent)) { + return element; + } + } + + return nullptr; +} + +dom::Element* AssociatedElementsIterator::GetElem(nsIContent* aContent, + const nsAString& aID) { + // Get elements in DOM tree by ID attribute if this is an explicit content. + // In case of bound element check its anonymous subtree. + if (!aContent->IsInNativeAnonymousSubtree()) { + dom::DocumentOrShadowRoot* docOrShadowRoot = + aContent->GetUncomposedDocOrConnectedShadowRoot(); + if (docOrShadowRoot) { + dom::Element* refElm = docOrShadowRoot->GetElementById(aID); + if (refElm) { + return refElm; } } } + return nullptr; } -dom::Element* AssociatedElementsIterator::NextElem() { - return mElements.SafeElementAt(mElemIdx++); +dom::Element* AssociatedElementsIterator::GetElem( + const nsDependentSubstring& aID) { + return GetElem(mContent, aID); } LocalAccessible* AssociatedElementsIterator::Next() { diff --git a/accessible/base/AccIterator.h b/accessible/base/AccIterator.h @@ -10,8 +10,6 @@ #include "Filters.h" #include "mozilla/a11y/DocAccessible.h" #include "nsTArray.h" -#include "nsContentUtils.h" -#include "mozilla/dom/TreeOrderedArray.h" #include <memory> @@ -20,8 +18,7 @@ class nsITreeView; namespace mozilla { namespace dom { class Element; -class HTMLLabelElement; -} // namespace dom +} namespace a11y { class DocAccessibleParent; @@ -105,16 +102,12 @@ class RelatedAccIterator : public AccIterable { RelatedAccIterator(const RelatedAccIterator&); RelatedAccIterator& operator=(const RelatedAccIterator&); - void Initialize(); - DocAccessible* mDocument; nsIContent* mDependentContent; nsAtom* mRelAttr; - - dom::TreeOrderedArray<nsIContent*, TreeKind::ShadowIncludingDOM> - mRelatedNodes; - size_t mNextIndex = 0; - bool mInitialized = false; + DocAccessible::AttrRelProviders* mProviders; + uint32_t mIndex; + bool mIsWalkingDependentElements; }; /** @@ -225,10 +218,21 @@ class AssociatedElementsIterator : public AccIterable { virtual ~AssociatedElementsIterator() {} /** + * Return next ID. + */ + const nsDependentSubstring NextID(); + + /** * Return next element. */ dom::Element* NextElem(); + /** + * Return the element with the given ID. + */ + static dom::Element* GetElem(nsIContent* aContent, const nsAString& aID); + dom::Element* GetElem(const nsDependentSubstring& aID); + // AccIterable virtual LocalAccessible* Next() override; @@ -237,9 +241,11 @@ class AssociatedElementsIterator : public AccIterable { AssociatedElementsIterator(const AssociatedElementsIterator&); AssociatedElementsIterator operator=(const AssociatedElementsIterator&); + nsString mIDs; nsIContent* mContent; DocAccessible* mDoc; - nsTArray<RefPtr<dom::Element>> mElements; + nsAString::index_type mCurrIdx; + nsTArray<dom::Element*> mElements; uint32_t mElemIdx; }; diff --git a/accessible/base/nsAccUtils.cpp b/accessible/base/nsAccUtils.cpp @@ -579,19 +579,20 @@ const nsAttrValue* nsAccUtils::GetARIAAttr(dom::Element* aElement, return defaults->GetAttr(aName, kNameSpaceID_None); } -Maybe<nsTArray<RefPtr<dom::Element>>> nsAccUtils::GetARIAElementsAttr( - dom::Element* aElement, nsAtom* aName) { +bool nsAccUtils::GetARIAElementsAttr(dom::Element* aElement, nsAtom* aName, + nsTArray<dom::Element*>& aElements) { if (aElement->HasAttr(aName)) { - return aElement->GetExplicitlySetAttrElements(aName); + aElement->GetExplicitlySetAttrElements(aName, aElements); + return true; } if (auto* element = nsGenericHTMLElement::FromNode(aElement)) { if (auto* internals = element->GetInternals()) { - return internals->GetAttrElements(aName); + return internals->GetAttrElements(aName, aElements); } } - return Nothing(); + return false; } bool nsAccUtils::ARIAAttrValueIs(dom::Element* aElement, const nsAtom* aName, diff --git a/accessible/base/nsAccUtils.h b/accessible/base/nsAccUtils.h @@ -289,8 +289,8 @@ class nsAccUtils { nsAString& aResult); static const nsAttrValue* GetARIAAttr(dom::Element* aElement, const nsAtom* aName); - static Maybe<nsTArray<RefPtr<dom::Element>>> GetARIAElementsAttr( - dom::Element* aElement, nsAtom* aName); + static bool GetARIAElementsAttr(dom::Element* aElement, nsAtom* aName, + nsTArray<dom::Element*>& aElements); static bool ARIAAttrValueIs(dom::Element* aElement, const nsAtom* aName, const nsAString& aValue, nsCaseTreatment aCaseSensitive); diff --git a/accessible/base/nsAccessibilityService.cpp b/accessible/base/nsAccessibilityService.cpp @@ -242,7 +242,8 @@ static bool MustBeAccessible(nsIContent* aContent, DocAccessible* aDocument) { // If the given ID is referred by relation attribute then create an // Accessible for it. - if (nsAtom* id = aContent->GetID()) { + nsAutoString id; + if (nsCoreUtils::GetID(aContent, id) && !id.IsEmpty()) { return aDocument->IsDependentID(aContent->AsElement(), id); } } diff --git a/accessible/base/nsCoreUtils.cpp b/accessible/base/nsCoreUtils.cpp @@ -56,7 +56,7 @@ using mozilla::a11y::nsAccUtils; bool nsCoreUtils::IsLabelWithControl(nsIContent* aContent) { dom::HTMLLabelElement* label = dom::HTMLLabelElement::FromNode(aContent); - if (label && label->GetLabeledElementInternal()) return true; + if (label && label->GetControl()) return true; return false; } diff --git a/accessible/generic/DocAccessible-inl.h b/accessible/generic/DocAccessible-inl.h @@ -131,7 +131,7 @@ inline void DocAccessible::CreateSubtree(LocalAccessible* aChild) { } inline DocAccessible::AttrRelProviders* DocAccessible::GetRelProviders( - dom::Element* aElement, nsAtom* aID) const { + dom::Element* aElement, const nsAString& aID) const { DependentIDsHashtable* hash = mDependentIDsHashes.Get( aElement->GetUncomposedDocOrConnectedShadowRoot()); if (hash) { @@ -141,8 +141,7 @@ inline DocAccessible::AttrRelProviders* DocAccessible::GetRelProviders( } inline DocAccessible::AttrRelProviders* DocAccessible::GetOrCreateRelProviders( - dom::Element* aElement, nsAtom* aID) { - // TODO (bug 1983819): need to update when reference targets change + dom::Element* aElement, const nsAString& aID) { dom::DocumentOrShadowRoot* docOrShadowRoot = aElement->GetUncomposedDocOrConnectedShadowRoot(); DependentIDsHashtable* hash = @@ -152,7 +151,7 @@ inline DocAccessible::AttrRelProviders* DocAccessible::GetOrCreateRelProviders( } inline void DocAccessible::RemoveRelProvidersIfEmpty(dom::Element* aElement, - nsAtom* aID) { + const nsAString& aID) { dom::DocumentOrShadowRoot* docOrShadowRoot = aElement->GetUncomposedDocOrConnectedShadowRoot(); DependentIDsHashtable* hash = mDependentIDsHashes.Get(docOrShadowRoot); diff --git a/accessible/generic/DocAccessible.cpp b/accessible/generic/DocAccessible.cpp @@ -468,17 +468,19 @@ void DocAccessible::QueueCacheUpdateForDependentRelations( QueueCacheUpdate(relatedAcc, CacheDomain::Relations); } - if (aOldId && !aOldId->IsEmptyString()) { + if (aOldId) { // If we have an old ID, we need to update any accessibles that depended on // that ID as well. - MOZ_ASSERT(aOldId->Type() == nsAttrValue::eAtom); - RefPtr<nsAtom> id = aOldId->GetAtomValue(); - auto* providers = GetRelProviders(el, id); - if (providers) { - for (auto& provider : *providers) { - if (LocalAccessible* oldRelatedAcc = - GetAccessible(provider->mContent)) { - QueueCacheUpdate(oldRelatedAcc, CacheDomain::Relations); + nsAutoString id; + aOldId->ToString(id); + if (!id.IsEmpty()) { + auto* providers = GetRelProviders(el, id); + if (providers) { + for (auto& provider : *providers) { + if (LocalAccessible* oldRelatedAcc = + GetAccessible(provider->mContent)) { + QueueCacheUpdate(oldRelatedAcc, CacheDomain::Relations); + } } } } @@ -961,8 +963,6 @@ void DocAccessible::AttributeChanged(dom::Element* aElement, "DOM attribute change on an accessible detached from the tree"); if (aAttribute == nsGkAtoms::id) { - // TODO(1983819): updates to referenceTarget should trigger these same - // actions dom::Element* elm = accessible->Elm(); RelocateARIAOwnedIfNeeded(elm); ARIAActiveDescendantIDMaybeMoved(accessible); @@ -1670,8 +1670,8 @@ void DocAccessible::ProcessInvalidationList() { if (container) { // Check if the node is a target of aria-owns, and if so, don't process // it here and let DoARIAOwnsRelocation process it. - AttrRelProviders* list = - GetRelProviders(content->AsElement(), content->GetID()); + AttrRelProviders* list = GetRelProviders( + content->AsElement(), nsDependentAtomString(content->GetID())); bool shouldProcess = !!list; if (shouldProcess) { for (uint32_t idx = 0; idx < list->Length(); idx++) { @@ -1926,46 +1926,31 @@ void DocAccessible::AddDependentIDsFor(LocalAccessible* aRelProvider, } } - if (const nsAttrValue* parsedAttrValue = - relProviderEl->GetParsedAttr(relAttr)) { - if (parsedAttrValue->GetAtomCount() == 0) { - continue; - } - MOZ_ASSERT( - parsedAttrValue->Type() == nsAttrValue::eAtomArray || - parsedAttrValue->Type() == nsAttrValue::eAtom, - "Attribute used for adding accessible relations must be parsed."); - for (uint32_t i = 0; i < parsedAttrValue->GetAtomCount(); i++) { - auto id = parsedAttrValue->AtomAt(static_cast<int32_t>(i)); - AttrRelProviders* providers = - GetOrCreateRelProviders(relProviderEl, id); - if (!providers) { - continue; - } + AssociatedElementsIterator iter(this, relProviderEl, relAttr); + while (true) { + const nsDependentSubstring id = iter.NextID(); + if (id.IsEmpty()) break; + AttrRelProviders* providers = GetOrCreateRelProviders(relProviderEl, id); + if (providers) { AttrRelProvider* provider = new AttrRelProvider(relAttr, relProviderEl); - if (!provider) { - continue; - } - - providers->AppendElement(provider); - - // We've got here during the children caching. If the referenced - // content is not accessible then store it to pend its container - // children invalidation (this happens immediately after the caching - // is finished). - dom::DocumentOrShadowRoot* docOrShadowRoot = - relProviderEl->GetUncomposedDocOrConnectedShadowRoot(); - if (!docOrShadowRoot) { - continue; - } - - nsIContent* dependentContent = docOrShadowRoot->GetElementById(id); - if (dependentContent && !HasAccessible(dependentContent)) { - mInvalidationList.AppendElement(dependentContent); + if (provider) { + providers->AppendElement(provider); + + // We've got here during the children caching. If the referenced + // content is not accessible then store it to pend its container + // children invalidation (this happens immediately after the caching + // is finished). + nsIContent* dependentContent = iter.GetElem(id); + if (dependentContent) { + if (!HasAccessible(dependentContent)) { + mInvalidationList.AppendElement(dependentContent); + } + } } } } + // If the relation attribute is given then we don't have anything else to // check. if (aRelAttr) break; @@ -1984,29 +1969,20 @@ void DocAccessible::RemoveDependentIDsFor(LocalAccessible* aRelProvider, nsStaticAtom* relAttr = kRelationAttrs[idx]; if (aRelAttr && aRelAttr != kRelationAttrs[idx]) continue; - if (const nsAttrValue* parsedAttrValue = - relProviderElm->GetParsedAttr(relAttr)) { - if (parsedAttrValue->GetAtomCount() == 0) { - continue; - } - MOZ_ASSERT( - parsedAttrValue->Type() == nsAttrValue::eAtomArray || - parsedAttrValue->Type() == nsAttrValue::eAtom, - "Attribute used for removing accessible relations must be parsed."); - - for (uint32_t i = 0; i < parsedAttrValue->GetAtomCount(); i++) { - nsAtom* id = parsedAttrValue->AtomAt(static_cast<int32_t>(i)); - - AttrRelProviders* providers = GetRelProviders(relProviderElm, id); - if (providers) { - providers->RemoveElementsBy( - [relAttr, relProviderElm](const auto& provider) { - return provider->mRelAttr == relAttr && - provider->mContent == relProviderElm; - }); - - RemoveRelProvidersIfEmpty(relProviderElm, id); - } + AssociatedElementsIterator iter(this, relProviderElm, relAttr); + while (true) { + const nsDependentSubstring id = iter.NextID(); + if (id.IsEmpty()) break; + + AttrRelProviders* providers = GetRelProviders(relProviderElm, id); + if (providers) { + providers->RemoveElementsBy( + [relAttr, relProviderElm](const auto& provider) { + return provider->mRelAttr == relAttr && + provider->mContent == relProviderElm; + }); + + RemoveRelProvidersIfEmpty(relProviderElm, id); } } @@ -2047,13 +2023,13 @@ void DocAccessible::AddDependentElementsFor(LocalAccessible* aRelProvider, if (aRelAttr && aRelAttr != attr) { continue; } - if (auto elements = nsAccUtils::GetARIAElementsAttr(providerEl, attr)) { - for (auto targetEl : *elements) { - AttrRelProviders& providers = - mDependentElementsMap.LookupOrInsert(targetEl); - AttrRelProvider* provider = new AttrRelProvider(attr, providerEl); - providers.AppendElement(provider); - } + nsTArray<dom::Element*> elements; + nsAccUtils::GetARIAElementsAttr(providerEl, attr, elements); + for (dom::Element* targetEl : elements) { + AttrRelProviders& providers = + mDependentElementsMap.LookupOrInsert(targetEl); + AttrRelProvider* provider = new AttrRelProvider(attr, providerEl); + providers.AppendElement(provider); } // If the relation attribute was given, we've already handled it. We don't // have anything else to check. @@ -2099,17 +2075,16 @@ void DocAccessible::RemoveDependentElementsFor(LocalAccessible* aRelProvider, if (aRelAttr && aRelAttr != attr) { continue; } - if (auto elements = nsAccUtils::GetARIAElementsAttr(providerEl, attr)) { - for (auto targetEl : *elements) { - if (auto providers = mDependentElementsMap.Lookup(targetEl)) { - providers.Data().RemoveElementsBy( - [attr, providerEl](const auto& provider) { - return provider->mRelAttr == attr && - provider->mContent == providerEl; - }); - if (providers.Data().IsEmpty()) { - providers.Remove(); - } + nsTArray<dom::Element*> elements; + nsAccUtils::GetARIAElementsAttr(providerEl, attr, elements); + for (dom::Element* targetEl : elements) { + if (auto providers = mDependentElementsMap.Lookup(targetEl)) { + providers.Data().RemoveElementsBy([attr, + providerEl](const auto& provider) { + return provider->mRelAttr == attr && provider->mContent == providerEl; + }); + if (providers.Data().IsEmpty()) { + providers.Remove(); } } } @@ -3202,7 +3177,8 @@ void DocAccessible::MaybeHandleChangeToHiddenNameOrDescription( if (!id) { continue; } - auto* providers = GetRelProviders(content->AsElement(), id); + auto* providers = + GetRelProviders(content->AsElement(), nsDependentAtomString(id)); if (!providers) { continue; } diff --git a/accessible/generic/DocAccessible.h b/accessible/generic/DocAccessible.h @@ -329,7 +329,7 @@ class DocAccessible : public HyperTextAccessible, /** * Return true if the given ID is referred by relation attribute. */ - bool IsDependentID(dom::Element* aElement, nsAtom* aID) const { + bool IsDependentID(dom::Element* aElement, const nsAString& aID) const { return GetRelProviders(aElement, aID); } @@ -756,7 +756,7 @@ class DocAccessible : public HyperTextAccessible, }; typedef nsTArray<mozilla::UniquePtr<AttrRelProvider>> AttrRelProviders; - typedef nsClassHashtable<nsAtomHashKey, AttrRelProviders> + typedef nsClassHashtable<nsStringHashKey, AttrRelProviders> DependentIDsHashtable; /** @@ -764,10 +764,11 @@ class DocAccessible : public HyperTextAccessible, * a DOM document if the element is in uncomposed document or associated * with shadow DOM the element is in. */ - AttrRelProviders* GetRelProviders(dom::Element* aElement, nsAtom* aID) const; + AttrRelProviders* GetRelProviders(dom::Element* aElement, + const nsAString& aID) const; AttrRelProviders* GetOrCreateRelProviders(dom::Element* aElement, - nsAtom* aID); - void RemoveRelProvidersIfEmpty(dom::Element* aElement, nsAtom* aID); + const nsAString& aID); + void RemoveRelProvidersIfEmpty(dom::Element* aElement, const nsAString& aID); /** * A map used to look up the target node for an implicit reverse relation diff --git a/accessible/generic/LocalAccessible.cpp b/accessible/generic/LocalAccessible.cpp @@ -2302,7 +2302,7 @@ Relation LocalAccessible::RelationByType(RelationType aType) const { if (mContent->IsHTMLElement()) { // HTML form controls implements nsIFormControl interface. if (auto* control = nsIFormControl::FromNode(mContent)) { - if (dom::HTMLFormElement* form = control->GetFormInternal()) { + if (dom::HTMLFormElement* form = control->GetForm()) { return Relation(mDoc, form->GetDefaultSubmitElement()); } } @@ -4128,11 +4128,11 @@ already_AddRefed<AccAttributes> LocalAccessible::BundleFieldsForCache( if (data.mType == RelationType::LABEL_FOR) { // Labels are a special case -- we need to validate that the target of // their `for` attribute is in fact labelable. DOM checks this when we - // call GetLabeledElementInternal(). If a label contains an element we - // will return it here. + // call GetControl(). If a label contains an element we will return it + // here. if (dom::HTMLLabelElement* labelEl = dom::HTMLLabelElement::FromNode(mContent)) { - rel.AppendTarget(mDoc, labelEl->GetLabeledElementInternal()); + rel.AppendTarget(mDoc, labelEl->GetControl()); } } else if (data.mType == RelationType::DETAILS) { if (relAtom == nsGkAtoms::aria_details) { diff --git a/accessible/html/HTMLElementAccessibles.cpp b/accessible/html/HTMLElementAccessibles.cpp @@ -49,7 +49,7 @@ Relation HTMLLabelAccessible::RelationByType(RelationType aType) const { Relation rel = AccessibleWrap::RelationByType(aType); if (aType == RelationType::LABEL_FOR) { dom::HTMLLabelElement* label = dom::HTMLLabelElement::FromNode(mContent); - rel.AppendTarget(mDoc, label->GetLabeledElementInternal()); + rel.AppendTarget(mDoc, label->GetControl()); } return rel; diff --git a/accessible/html/HTMLFormControlAccessible.cpp b/accessible/html/HTMLFormControlAccessible.cpp @@ -117,8 +117,7 @@ Relation HTMLRadioButtonAccessible::ComputeGroupAttributes( RefPtr<nsContentList> inputElms; - if (dom::Element* formElm = - nsIFormControl::FromNode(mContent)->GetFormInternal()) { + if (dom::Element* formElm = nsIFormControl::FromNode(mContent)->GetForm()) { inputElms = NS_GetContentList(formElm, namespaceId, tagName); } else { inputElms = NS_GetContentList(mContent->OwnerDoc(), namespaceId, tagName); @@ -428,7 +427,7 @@ uint64_t HTMLTextFieldAccessible::NativeState() const { mContent->AsElement()->GetAttr(nsGkAtoms::autocomplete, autocomplete); if (!autocomplete.LowerCaseEqualsLiteral("off")) { - Element* formElement = input->GetFormInternal(); + Element* formElement = input->GetForm(); if (formElement) { formElement->GetAttr(nsGkAtoms::autocomplete, autocomplete); } diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp @@ -1579,29 +1579,6 @@ void Element::UnattachShadow() { SetShadowRoot(nullptr); } -Element* Element::ResolveReferenceTarget() const { - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { - return const_cast<Element*>(this); - } - - const Element* element = this; - ShadowRoot* shadow = GetShadowRoot(); - - while (shadow && shadow->HasReferenceTarget()) { - element = shadow->GetReferenceTargetElement(); - shadow = element ? element->GetShadowRoot() : nullptr; - } - return const_cast<Element*>(element); -} - -Element* Element::RetargetReferenceTargetForBindings(Element* aElement) const { - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { - return aElement; - } - - return Element::FromNodeOrNull(nsContentUtils::Retarget(aElement, this)); -} - void Element::GetAttribute(const nsAString& aName, DOMString& aReturn) { const nsAttrValue* val = mAttrs.GetAttr( aName, @@ -1958,138 +1935,92 @@ Element* Element::GetElementByIdInDocOrSubtree(nsAtom* aID) const { return nsContentUtils::MatchElementId(SubtreeRoot()->AsContent(), aID); } -Element* Element::GetAttrAssociatedElementInternal(nsAtom* aAttr, - bool aForBindings) const { - Element* attrEl = nullptr; - bool hasExplicitEl = false; - +Element* Element::GetAttrAssociatedElement(nsAtom* aAttr) const { if (const nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots()) { - nsWeakPtr weakExplicitEl = slots->mExplicitlySetAttrElementMap.Get(aAttr); - if (nsCOMPtr<Element> explicitEl = do_QueryReferent(weakExplicitEl)) { - hasExplicitEl = true; - - // If reflectedTarget's explicitly set attr-element |explicitEl| is + nsWeakPtr weakAttrEl = slots->mExplicitlySetAttrElementMap.Get(aAttr); + if (nsCOMPtr<Element> attrEl = do_QueryReferent(weakAttrEl)) { + // If reflectedTarget's explicitly set attr-element |attrEl| is // a descendant of any of element's shadow-including ancestors, then - // return |explicitEl|. - if (HasSharedRoot(explicitEl)) { - attrEl = explicitEl; + // return |atrEl|. + if (HasSharedRoot(attrEl)) { + return attrEl; } - } - } - - if (!hasExplicitEl) { - const nsAttrValue* value = GetParsedAttr(aAttr); - if (!value) { return nullptr; } - - MOZ_ASSERT(value->Type() == nsAttrValue::eAtom, - "Attribute used for attr associated element must be parsed"); - - attrEl = GetElementByIdInDocOrSubtree(value->GetAtomValue()); } - if (!attrEl) { + const nsAttrValue* value = GetParsedAttr(aAttr); + if (!value) { return nullptr; } - Element* resolved = attrEl->ResolveReferenceTarget(); - if (resolved && aForBindings) { - return attrEl; - } + MOZ_ASSERT(value->Type() == nsAttrValue::eAtom, + "Attribute used for attr associated element must be parsed"); - return resolved; + return GetElementByIdInDocOrSubtree(value->GetAtomValue()); } -Element* Element::GetAttrAssociatedElementForBindings(nsAtom* aAttr) const { - return GetAttrAssociatedElementInternal(aAttr, true); -} +void Element::GetAttrAssociatedElements( + nsAtom* aAttr, bool* aUseCachedValue, + Nullable<nsTArray<RefPtr<Element>>>& aElements) { + MOZ_ASSERT(aElements.IsNull()); -Maybe<nsTArray<RefPtr<Element>>> Element::GetAttrAssociatedElementsInternal( - nsAtom* aAttr, bool aForBindings) { - // https://whatpr.org/html/10995/common-microsyntaxes.html#attr-associated-elements - nsTArray<RefPtr<Element>> elements; - auto& [explicitlySetAttrElements, _] = + auto& [explicitlySetAttrElements, cachedAttrElements] = ExtendedDOMSlots()->mAttrElementsMap.LookupOrInsert(aAttr); - if (explicitlySetAttrElements) { - // 3. If element has an explicitly set attr-elements which - for (const nsWeakPtr& weakEl : *explicitlySetAttrElements) { - // For each attrElement in reflectedTarget's explicitly set - // attr-elements: - if (RefPtr<Element> attrEl = do_QueryReferent(weakEl)) { - // If attrElement is not a descendant of any of element's - // shadow-including ancestors, then continue. - if (!HasSharedRoot(attrEl)) { - continue; + // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#attr-associated-elements + auto getAttrAssociatedElements = + [&, &explicitlySetAttrElements = + explicitlySetAttrElements]() -> Maybe<nsTArray<RefPtr<Element>>> { + nsTArray<RefPtr<Element>> elements; + + if (explicitlySetAttrElements) { + // 3. If reflectedTarget's explicitly set attr-elements is not null + for (const nsWeakPtr& weakEl : *explicitlySetAttrElements) { + // For each attrElement in reflectedTarget's explicitly set + // attr-elements: + if (nsCOMPtr<Element> attrEl = do_QueryReferent(weakEl)) { + // If attrElement is not a descendant of any of element's + // shadow-including ancestors, then continue. + if (!HasSharedRoot(attrEl)) { + continue; + } + // Append attrElement to elements. + elements.AppendElement(attrEl); } - // Append attrElement to elements. - elements.AppendElement(std::move(attrEl)); } - } - } else { - // 4. Otherwise - // 4.1. Let value be the attribute value. - const nsAttrValue* value = GetParsedAttr(aAttr); - // 1. If the attribute is not specified on element, return null. - if (!value || value->GetAtomCount() == 0) { - return Nothing(); - } - - MOZ_ASSERT(value->Type() == nsAttrValue::eAtomArray || - value->Type() == nsAttrValue::eAtom, - "Attribute used for accessible relations must be parsed."); - // 4.2. Let tokens be value, split on ASCII whitespace. - // 4.3. For each id of tokens: - for (uint32_t i = 0; i < value->GetAtomCount(); i++) { - // 4.3.1 Let candidate be the first element, in tree order, that meets the - // following criteria: - // - candidate's root is the same as element's root; and - // - candidate's ID is id. - if (auto* candidate = GetElementByIdInDocOrSubtree( - value->AtomAt(static_cast<int32_t>(i)))) { - // Append candidate to elements. - elements.AppendElement(candidate); + } else { + // 4. Otherwise + // 1. Let contentAttributeValue be the result of running + // reflectedTarget's get the content attribute. + const nsAttrValue* value = GetParsedAttr(aAttr); + // 2. If contentAttributeValue is null, then return null. + if (!value) { + return Nothing(); } - } - } - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { - return Some(std::move(elements)); - } - // 5. Let resolvedCandidates be an empty list. - nsTArray<RefPtr<Element>> resolvedElements; - // 6. For each candidate in candidates: - for (const RefPtr<Element> element : elements) { - // 6.1 Let resolvedCandidate be the result of resolving the reference target - // on candidate. - if (Element* resolvedCandidate = element->ResolveReferenceTarget()) { - // 6.2 If resolvedCandidate is not null: - if (aForBindings) { - // 6.2.1 If retarget is true, append candidate to resolvedCandidates - resolvedElements.AppendElement(element); - } else { - // 6.2.2 Otherwise, append resolvedCandidate to resolvedCandidates - resolvedElements.AppendElement(resolvedCandidate); + // 3. Let tokens be contentAttributeValue, split on ASCII whitespace. + MOZ_ASSERT(value->Type() == nsAttrValue::eAtomArray || + value->Type() == nsAttrValue::eAtom, + "Attribute used for attr associated elements must be parsed"); + for (uint32_t i = 0; i < value->GetAtomCount(); i++) { + // For each id of tokens: + if (auto* candidate = GetElementByIdInDocOrSubtree( + value->AtomAt(static_cast<int32_t>(i)))) { + // Append candidate to elements. + elements.AppendElement(candidate); + } } } - } - return Some(std::move(resolvedElements)); -} -void Element::GetAttrAssociatedElementsForBindings( - nsAtom* aAttr, bool* aUseCachedValue, - Nullable<nsTArray<RefPtr<Element>>>& aElements) { - MOZ_ASSERT(aElements.IsNull()); + return Some(std::move(elements)); + }; // getter steps: // 1. Let elements be the result of running this's get the attr-associated // elements. - Maybe<nsTArray<RefPtr<Element>>> elements = - GetAttrAssociatedElementsInternal(aAttr, true); + auto elements = getAttrAssociatedElements(); - auto& [_, cachedAttrElements] = - ExtendedDOMSlots()->mAttrElementsMap.LookupOrInsert(aAttr); if (elements && elements == cachedAttrElements) { // 2. If the contents of elements is equal to the contents of this's cached // attr-associated elements, then return this's cached attr-associated @@ -2217,377 +2148,20 @@ Element* Element::GetExplicitlySetAttrElement(nsAtom* aAttr) const { return nullptr; } -Maybe<nsTArray<RefPtr<dom::Element>>> Element::GetExplicitlySetAttrElements( - nsAtom* aAttr) const { +void Element::GetExplicitlySetAttrElements( + nsAtom* aAttr, nsTArray<Element*>& aElements) const { if (const nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots()) { if (auto attrElementsMaybeEntry = slots->mAttrElementsMap.Lookup(aAttr)) { auto& [attrElements, cachedAttrElements] = attrElementsMaybeEntry.Data(); if (attrElements) { - nsTArray<RefPtr<dom::Element>> elements; for (const nsWeakPtr& weakEl : *attrElements) { if (nsCOMPtr<Element> attrEl = do_QueryReferent(weakEl)) { - elements.AppendElement(attrEl); + aElements.AppendElement(attrEl); } } - return Some(std::move(elements)); } } } - return Nothing(); -} - -bool ReferenceTargetChangedAttrAssociatedElementCallback(void* aData) { - using AttrElementObserverCallbackData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverCallbackData; - - AttrElementObserverCallbackData* data = - static_cast<AttrElementObserverCallbackData*>(aData); - nsWeakPtr weakElement = data->mElement; - - if (nsCOMPtr<Element> element = do_QueryReferent(weakElement)) { - return element->AttrAssociatedElementUpdated(data->mAttr); - } - - return false; -} - -bool IDTargetChangedAttrAssociatedElementCallback(Element* aOldElement, - Element* aNewElement, - void* aData) { - using AttrElementObserverCallbackData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverCallbackData; - - AttrElementObserverCallbackData* data = - static_cast<AttrElementObserverCallbackData*>(aData); - - nsWeakPtr weakElement = data->mElement; - if (nsCOMPtr<Element> element = do_QueryReferent(weakElement)) { - if (aOldElement) { - aOldElement->RemoveReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, aData); - } - if (aNewElement) { - aNewElement->AddReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, aData); - } - - return element->AttrAssociatedElementUpdated(data->mAttr); - } - - return false; -} - -Element* Element::AddAttrAssociatedElementObserver( - nsAtom* aAttr, AttrTargetObserver aObserver) { - using AttrElementObserverData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData; - using AttrElementObserverCallbackData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverCallbackData; - - AttrElementObserverData& observerData = - ExtendedDOMSlots()->mAttrElementObserverMap.LookupOrInsert(aAttr); - - // TODO (bug 1997286): Observe explicitly set attr-element binding/unbinding. - - if (!observerData.mCallbackData) { - observerData.mCallbackData.reset(new AttrElementObserverCallbackData()); - observerData.mCallbackData->mAttr = aAttr; - observerData.mCallbackData->mElement = do_GetWeakReference(this); - - const nsAttrValue* value = GetParsedAttr(aAttr); - MOZ_ASSERT(value); - if (!value->IsEmptyString()) { - RefPtr<nsAtom> idValue = value->GetAsAtom(); - observerData.mLastKnownAttrValue = idValue; - } - - DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot(); - if (docOrShadow) { - AddDocOrShadowObserversForAttrAssociatedElement(*docOrShadow, aAttr); - } - } - - Element* lastAttrElement; - if (nsCOMPtr<Element> element = - do_QueryReferent(observerData.mLastKnownAttrElement)) { - lastAttrElement = element.get(); - } else { - lastAttrElement = GetAttrAssociatedElementInternal(aAttr); - observerData.mLastKnownAttrElement = do_GetWeakReference(lastAttrElement); - } - - observerData.mObservers.Insert(aObserver); - - return lastAttrElement; -} - -void Element::RemoveAttrAssociatedElementObserver( - nsAtom* aAttr, AttrTargetObserver aObserver) { - using AttrElementObserverData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData; - - AttrElementObserverData* observerData = GetAttrElementObserverData(aAttr); - if (!observerData) { - return; - } - - DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot(); - if (docOrShadow) { - RemoveDocOrShadowObserversForAttrAssociatedElement(*docOrShadow, aAttr); - } - observerData->mObservers.Remove(aObserver); - - if (observerData->mObservers.IsEmpty()) { - DeleteAttrAssociatedElementObserverData(aAttr); - } -} - -bool Element::AttrAssociatedElementUpdated(nsAtom* aAttr) { - using AttrElementObserverData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData; - - AttrElementObserverData* observerData = GetAttrElementObserverData(aAttr); - if (!observerData) { - return false; - } - - Element* newAttrElement = GetAttrAssociatedElementInternal(aAttr); - - nsCOMPtr<Element> oldAttrElement = - do_QueryReferent(observerData->mLastKnownAttrElement); - - for (auto iter = observerData->mObservers.begin(); - iter != observerData->mObservers.end(); ++iter) { - AttrTargetObserver observer = *iter; - bool keep = observer(oldAttrElement.get(), newAttrElement, this); - if (!keep) { - observerData->mObservers.Remove(iter); - } - } - - if (observerData->mObservers.IsEmpty()) { - DeleteAttrAssociatedElementObserverData(aAttr); - return false; - } - - return true; -} - -void Element::IDREFAttributeValueChanged(nsAtom* aAttr, - const nsAttrValue* aValue) { - using AttrElementObserverData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData; - using AttrElementObserverCallbackData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverCallbackData; - - if (!AttrAssociatedElementUpdated(aAttr)) { - return; - } - - DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot(); - if (!docOrShadow) { - return; - } - - AttrElementObserverData* observerData = GetAttrElementObserverData(aAttr); - if (!observerData) { - return; - } - - AttrElementObserverCallbackData* callbackData = - observerData->mCallbackData.get(); - if (observerData->mLastKnownAttrValue) { - docOrShadow->RemoveIDTargetObserver( - observerData->mLastKnownAttrValue, - IDTargetChangedAttrAssociatedElementCallback, callbackData, false); - Element* oldIdTarget = - docOrShadow->GetElementById(observerData->mLastKnownAttrValue); - if (oldIdTarget) { - oldIdTarget->RemoveReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, callbackData); - } - } - - if (!aValue || aValue->GetAtomValue()->IsEmpty()) { - observerData->mLastKnownAttrValue = nullptr; - return; - } - - RefPtr<nsAtom> idValue = aValue->GetAsAtom(); - observerData->mLastKnownAttrValue = idValue; - docOrShadow->AddIDTargetObserver(idValue, - IDTargetChangedAttrAssociatedElementCallback, - callbackData, false); - - Element* newIdTarget = docOrShadow->GetElementById(idValue); - if (newIdTarget) { - newIdTarget->AddReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, callbackData); - } -} - -FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData* -Element::GetAttrElementObserverData(nsAtom* aAttr) { - if (const nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots()) { - if (auto entry = slots->mAttrElementObserverMap.Lookup(aAttr)) { - return &entry.Data(); - } - } - return nullptr; -} - -void Element::DeleteAttrAssociatedElementObserverData(nsAtom* aAttr) { - DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot(); - if (docOrShadow) { - RemoveDocOrShadowObserversForAttrAssociatedElement(*docOrShadow, aAttr); - } - - ExtendedDOMSlots()->mAttrElementObserverMap.Remove(aAttr); -} - -void Element::AddDocOrShadowObserversForAttrAssociatedElement( - DocumentOrShadowRoot& aContainingDocOrShadow, nsAtom* aAttr) { - using AttrElementObserverData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData; - using AttrElementObserverCallbackData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverCallbackData; - - AttrElementObserverData* observerData = GetAttrElementObserverData(aAttr); - if (!observerData) { - return; - } - - Element* explicitlySetAttrElement = GetExplicitlySetAttrElement(aAttr); - AttrElementObserverCallbackData* callbackData = - observerData->mCallbackData.get(); - - if (explicitlySetAttrElement) { - explicitlySetAttrElement->AddReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, callbackData); - } else { - MOZ_ASSERT(observerData->mLastKnownAttrValue); - aContainingDocOrShadow.AddIDTargetObserver( - observerData->mLastKnownAttrValue, - IDTargetChangedAttrAssociatedElementCallback, callbackData, false); - - Element* idTarget = aContainingDocOrShadow.GetElementById( - observerData->mLastKnownAttrValue); - if (idTarget) { - idTarget->AddReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, callbackData); - } - } -} - -void Element::RemoveDocOrShadowObserversForAttrAssociatedElement( - DocumentOrShadowRoot& aContainingDocOrShadow, nsAtom* aAttr) { - using AttrElementObserverData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData; - using AttrElementObserverCallbackData = - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverCallbackData; - - AttrElementObserverData* observerData = GetAttrElementObserverData(aAttr); - if (!observerData) { - return; - } - - Element* explicitlySetAttrElement = GetExplicitlySetAttrElement(aAttr); - AttrElementObserverCallbackData* callbackData = - observerData->mCallbackData.get(); - - if (explicitlySetAttrElement) { - explicitlySetAttrElement->RemoveReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, callbackData); - } else if (observerData->mLastKnownAttrValue) { - aContainingDocOrShadow.RemoveIDTargetObserver( - observerData->mLastKnownAttrValue, - IDTargetChangedAttrAssociatedElementCallback, - observerData->mCallbackData.get(), false); - - Element* idTarget = aContainingDocOrShadow.GetElementById( - observerData->mLastKnownAttrValue); - if (idTarget) { - idTarget->RemoveReferenceTargetChangeObserver( - ReferenceTargetChangedAttrAssociatedElementCallback, callbackData); - } - } -} - -void Element::BindAttrAssociatedElementObservers( - DocumentOrShadowRoot& aContainingDocOrShadow) { - if (const nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots()) { - for (const RefPtr<nsAtom>& attr : slots->mAttrElementObserverMap.Keys()) { - AddDocOrShadowObserversForAttrAssociatedElement(aContainingDocOrShadow, - attr); - } - } -} - -void Element::UnbindAttrAssociatedElementObservers( - DocumentOrShadowRoot& aContainingDocOrShadow) { - if (const nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots()) { - for (const RefPtr<nsAtom>& attr : slots->mAttrElementObserverMap.Keys()) { - RemoveDocOrShadowObserversForAttrAssociatedElement(aContainingDocOrShadow, - attr); - } - } -} - -void Element::AddReferenceTargetChangeObserver( - ReferenceTargetChangeObserver aObserver, void* aData) { - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { - return; - } - ExtendedDOMSlots()->mReferenceTargetObservers.Insert({aObserver, aData}); -} - -void Element::RemoveReferenceTargetChangeObserver( - ReferenceTargetChangeObserver aObserver, void* aData) { - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { - return; - } - nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots(); - if (!slots) { - return; - } - slots->mReferenceTargetObservers.Remove({aObserver, aData}); -} - -void Element::NotifyReferenceTargetChanged() { - using ReferenceTargetChangeCallback = - FragmentOrElement::nsExtendedDOMSlots::ReferenceTargetChangeCallback; - - nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots(); - if (!slots) { - return; - } - - // TODO (bug 1983819): Adjust initial N for the increased number of callbacks - // once accessibility code is listening for reference target changes. - // At time of writing, 2 accounts for: - // - (Rarely) observer in ShadowRoot for nested shadow roots, and EITHER - // - Observer in nsLabelsNodeList to update the .labels property, OR - // - Observer added via AddAttrAssociatedElementObserver() call in - // nsGenericHTMLFormElement for form-associated elements using the form - // content attribute, to ensure the form's .elements list is updated. - AutoTArray<ReferenceTargetChangeCallback, 2> callbacks; - callbacks.SetCapacity(slots->mReferenceTargetObservers.Count()); - for (auto iter = slots->mReferenceTargetObservers.begin(); - iter != slots->mReferenceTargetObservers.end(); ++iter) { - const ReferenceTargetChangeCallback& from = *iter; - ReferenceTargetChangeCallback callback({from.mObserver, from.mData}); - callbacks.AppendElement(callback); - } - - for (const ReferenceTargetChangeCallback& callback : callbacks) { - if (!slots->mReferenceTargetObservers.Contains(callback)) { - continue; - } - bool keep = callback.mObserver(callback.mData); - if (!keep) { - slots->mReferenceTargetObservers.Remove(callback); - } - } } void Element::GetElementsWithGrid(nsTArray<RefPtr<Element>>& aElements) { @@ -2893,12 +2467,6 @@ nsresult Element::BindToTree(BindContext& aContext, nsINode& aParent) { /* aForceInDataDoc = */ false); } - DocumentOrShadowRoot* containingDocOrShadow = - GetUncomposedDocOrConnectedShadowRoot(); - if (containingDocOrShadow) { - BindAttrAssociatedElementObservers(*containingDocOrShadow); - } - // XXXbz script execution during binding can trigger some of these // postcondition asserts.... But we do want that, since things will // generally be quite broken when that happens. @@ -2932,12 +2500,6 @@ static bool WillDetachFromShadowOnUnbind(const Element& aElement, void Element::UnbindFromTree(UnbindContext& aContext) { const bool nullParent = aContext.IsUnbindRoot(this); - DocumentOrShadowRoot* containingDocOrShadow = - GetUncomposedDocOrConnectedShadowRoot(); - if (containingDocOrShadow) { - UnbindAttrAssociatedElementObservers(*containingDocOrShadow); - } - HandleShadowDOMRelatedRemovalSteps(nullParent); if (HasFlag(ELEMENT_IN_CONTENT_IDENTIFIER_FOR_LCP)) { @@ -3735,22 +3297,15 @@ bool Element::ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute, return true; } - if (aAttribute == nsGkAtoms::form || aAttribute == nsGkAtoms::_for) { - aResult.ParseAtom(aValue); - return true; - } - if (aNamespaceID == kNameSpaceID_None) { if (aAttribute == nsGkAtoms::_class || aAttribute == nsGkAtoms::part || - aAttribute == nsGkAtoms::aria_actions || aAttribute == nsGkAtoms::aria_controls || aAttribute == nsGkAtoms::aria_describedby || aAttribute == nsGkAtoms::aria_details || aAttribute == nsGkAtoms::aria_errormessage || aAttribute == nsGkAtoms::aria_flowto || aAttribute == nsGkAtoms::aria_labelledby || - aAttribute == nsGkAtoms::aria_owns || aAttribute == nsGkAtoms::_for || - aAttribute == nsGkAtoms::headers) { + aAttribute == nsGkAtoms::aria_owns) { aResult.ParseAtomArray(aValue); return true; } @@ -3822,7 +3377,6 @@ void Element::AfterSetAttr(int32_t aNamespaceID, nsAtom* aName, } } else if (aName == nsGkAtoms::aria_activedescendant) { ClearExplicitlySetAttrElement(aName); - IDREFAttributeValueChanged(aName, aValue); } else if (aName == nsGkAtoms::aria_controls || aName == nsGkAtoms::aria_describedby || aName == nsGkAtoms::aria_details || diff --git a/dom/base/Element.h b/dom/base/Element.h @@ -260,25 +260,24 @@ class TrustedHTMLOrTrustedScriptOrTrustedScriptURLOrString; SetOrRemoveNullableStringAttr(nsGkAtoms::attr, aValue, aRv); \ } -#define REFLECT_NULLABLE_ELEMENT_ATTR(method, attr) \ - Element* Get##method() const { \ - return GetAttrAssociatedElementForBindings(nsGkAtoms::attr); \ - } \ - \ - void Set##method(Element* aElement) { \ - ExplicitlySetAttrElement(nsGkAtoms::attr, aElement); \ - } - -#define REFLECT_NULLABLE_ELEMENTS_ATTR(method, attr) \ - void Get##method(bool* aUseCachedValue, \ - Nullable<nsTArray<RefPtr<Element>>>& aElements) { \ - GetAttrAssociatedElementsForBindings(nsGkAtoms::attr, aUseCachedValue, \ - aElements); \ - } \ - \ - void Set##method( \ - const Nullable<Sequence<OwningNonNull<Element>>>& aElements) { \ - ExplicitlySetAttrElements(nsGkAtoms::attr, aElements); \ +#define REFLECT_NULLABLE_ELEMENT_ATTR(method, attr) \ + Element* Get##method() const { \ + return GetAttrAssociatedElement(nsGkAtoms::attr); \ + } \ + \ + void Set##method(Element* aElement) { \ + ExplicitlySetAttrElement(nsGkAtoms::attr, aElement); \ + } + +#define REFLECT_NULLABLE_ELEMENTS_ATTR(method, attr) \ + void Get##method(bool* aUseCachedValue, \ + Nullable<nsTArray<RefPtr<Element>>>& aElements) { \ + GetAttrAssociatedElements(nsGkAtoms::attr, aUseCachedValue, aElements); \ + } \ + \ + void Set##method( \ + const Nullable<Sequence<OwningNonNull<Element>>>& aElements) { \ + ExplicitlySetAttrElements(nsGkAtoms::attr, aElements); \ } class Element : public FragmentOrElement { @@ -1363,71 +1362,14 @@ class Element : public FragmentOrElement { const nsAString& aClassNames); /** - * Returns attribute-associated element for the given attribute name. See - * https://whatpr.org/html/10995/common-microsyntaxes.html#get-the-attr-associated-element + * Returns attribute associated element for the given attribute name, see + * https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#attr-associated-element */ - Element* GetAttrAssociatedElementInternal(nsAtom* aAttr, - bool aForBindings = false) const; - /** - * The getter for the IDL attribute which reflects the given attribute. See - * https://whatpr.org/html/10995/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:reflected-idl-attribute-31 - */ - Element* GetAttrAssociatedElementForBindings(nsAtom* aAttr) const; - - /** - * Returns attribute associated elements for the given attribute name. See - * https://whatpr.org/html/10995/common-microsyntaxes.html#attr-associated-elements - */ - Maybe<nsTArray<RefPtr<Element>>> GetAttrAssociatedElementsInternal( - nsAtom* aAttr, bool aForBindings = false); - /** - * The getter for the IDL attribute which reflects the given attribute. See - * https://whatpr.org/html/10995/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:reflected-idl-attribute-33 - */ - void GetAttrAssociatedElementsForBindings( + Element* GetAttrAssociatedElement(nsAtom* aAttr) const; + void GetAttrAssociatedElements( nsAtom* aAttr, bool* aUseCachedValue, Nullable<nsTArray<RefPtr<Element>>>& aElements); - typedef bool (*AttrTargetObserver)(Element* aOldElement, Element* aNewElement, - Element* thisElement); - /** - * Add an attr-associated element observer for a given attribute. The observer - * will fire whenever the element associated with |aAttr| for this element - * changes. This can occur in multiple scenarios: - * - The attribute value or explicitly set attr-element changes; - * - An element with an ID matching the attribute value is added or removed - * from the document or shadow root containing the element with the - * attribute; - * - The explicitly set attr-element is added or removed from the document or - * shadow root containing the element with the attribute; - * - The reference target of the element directly referred to by the attribute - * changes. - * @return the current attr-associated element for |aAttr| for this element, - * if any. - */ - Element* AddAttrAssociatedElementObserver(nsAtom* aAttr, - AttrTargetObserver aObserver); - void RemoveAttrAssociatedElementObserver(nsAtom* aAttr, - AttrTargetObserver aObserver); - bool AttrAssociatedElementUpdated(nsAtom* aAttr); - - protected: - void IDREFAttributeValueChanged(nsAtom* aAttr, const nsAttrValue* aValue); - - private: - FragmentOrElement::nsExtendedDOMSlots::AttrElementObserverData* - GetAttrElementObserverData(nsAtom* aAttr); - void DeleteAttrAssociatedElementObserverData(nsAtom* aAttr); - void AddDocOrShadowObserversForAttrAssociatedElement( - DocumentOrShadowRoot& aContainingDocOrShadow, nsAtom* aAttr); - void RemoveDocOrShadowObserversForAttrAssociatedElement( - DocumentOrShadowRoot& aContainingDocOrShadow, nsAtom* aAttr); - void BindAttrAssociatedElementObservers( - DocumentOrShadowRoot& aContainingDocOrShadow); - void UnbindAttrAssociatedElementObservers( - DocumentOrShadowRoot& aContainingDocOrShadow); - - public: /** * Sets an attribute element for the given attribute. * https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#explicitly-set-attr-element @@ -1457,47 +1399,8 @@ class Element : public FragmentOrElement { * shadow-including ancestors. It also does not attempt to retrieve elements * using the ids set in the content attribute. */ - Maybe<nsTArray<RefPtr<dom::Element>>> GetExplicitlySetAttrElements( - nsAtom* aAttr) const; - - /** - * Callback called when an element's resolved reference target changes. - * @param aData The callback data which was stored using - * AddReferenceTargetChangeObserver. - * @return true to keep the callback in the callback set, false to remove - * it. - */ - typedef bool (*ReferenceTargetChangeObserver)(void* aData); - - /** - * Listen for changes to the given element's resolved reference target. This - * could happen in a number of ways: - * - The given element's shadow root's referenceTarget property changes, or is - * added or removed; - * - The element referred to by the referenceTarget property changes (e.g. - * because an element with that ID is added to the shadow root); - * - Recursively: that is, when the resolved reference target of the element - * referred to by the referenceTarget property changes for one of the above - * two reasons (i.e. the referenceTarget property refers to an element foo, - * which also has a shadow root, and foo's resolved reference target - * changes). - * @param aElement an element on which to listen for resolved - * reference target changes. The element must have this document or shadow - * root as its root (i.e. aElement.GetUncomposedDocOrConnectedShadowRoot() == - * this). - * @param aObserver The callback to fire when the resolved reference target - * changes. - * @param aData Data to pass to the callback. - */ - void AddReferenceTargetChangeObserver(ReferenceTargetChangeObserver aObserver, - void* aData); - void RemoveReferenceTargetChangeObserver( - ReferenceTargetChangeObserver aObserver, void* aData); - /** - * Called when aElement's resolved reference target changes. - * @param aElement the element whose reference target has changed - */ - void NotifyReferenceTargetChanged(); + void GetExplicitlySetAttrElements(nsAtom* aAttr, + nsTArray<Element*>& aElements) const; PseudoStyleType GetPseudoElementType() const { nsresult rv = NS_OK; @@ -1608,7 +1511,7 @@ class Element : public FragmentOrElement { SlotAssignmentMode aSlotAssignmentMode = SlotAssignmentMode::Named, ShadowRootClonable aClonable = ShadowRootClonable::No, ShadowRootSerializable aSerializable = ShadowRootSerializable::No, - const nsAString& aReferenceTarget = VoidString()); + const nsAString& aReferenceTarget = EmptyString()); // Attach UA Shadow Root if it is not attached. enum class NotifyUAWidgetSetup : bool { No, Yes }; @@ -1639,9 +1542,6 @@ class Element : public FragmentOrElement { return slots ? slots->mShadowRoot.get() : nullptr; } - Element* ResolveReferenceTarget() const; - Element* RetargetReferenceTargetForBindings(Element* aElement) const; - const Maybe<float> GetLastRememberedBSize() const { const nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots(); return slots ? slots->mLastRememberedBSize : Nothing(); diff --git a/dom/base/FormData.cpp b/dom/base/FormData.cpp @@ -331,7 +331,7 @@ already_AddRefed<FormData> FormData::Constructor( // 1.1.2. If submitter's form owner is not this form element, then throw a // "NotFoundError" DOMException. - if (fc->GetFormInternal() != aFormElement) { + if (fc->GetForm() != aFormElement) { aRv.ThrowNotFoundError("The submitter is not owned by this form."); return nullptr; } diff --git a/dom/base/FragmentOrElement.h b/dom/base/FragmentOrElement.h @@ -23,7 +23,6 @@ #include "nsIContent.h" // base class #include "nsIHTMLCollection.h" #include "nsIWeakReferenceUtils.h" -#include "nsTHashSet.h" class ContentUnbinder; class nsContentList; @@ -286,69 +285,6 @@ class FragmentOrElement : public nsIContent { nsTHashMap<RefPtr<nsAtom>, std::pair<Maybe<nsTArray<nsWeakPtr>>, Maybe<nsTArray<RefPtr<Element>>>>> mAttrElementsMap; - - typedef bool (*AttrTargetObserver)(Element* aOldElement, - Element* aNewelement, - Element* aThisElement); - struct AttrElementObserverCallbackData { - nsWeakPtr mElement; - RefPtr<nsAtom> mAttr; - }; - struct AttrElementObserverData { - // Used as the value for |aOldElement| when calling an AttrTargetObserver - // callback. - nsWeakPtr mLastKnownAttrElement; // TODO: should be an array - - // Used to add/remove ID target observers when the attribute value changes - // or the attribute host is added to or removed from a document or shadow - // root. - RefPtr<nsAtom> mLastKnownAttrValue; // TODO: should be a ParsedAttr - nsTHashSet<AttrTargetObserver> mObservers; - - // Used for removing the IDTargetObserver(s) - UniquePtr<AttrElementObserverCallbackData> mCallbackData; - }; - nsTHashMap<RefPtr<nsAtom>, AttrElementObserverData> mAttrElementObserverMap; - - /** - * Callback called when an element's resolved reference target changes. - * @param aData The callback data which was stored using - * AddReferenceTargetChangeObserver. - * @return true to keep the callback in the callback set, false to remove - * it. - */ - typedef bool (*ReferenceTargetChangeObserver)(void* aData); - - struct ReferenceTargetChangeCallback { - ReferenceTargetChangeObserver mObserver; - void* mData; - }; - - struct ReferenceTargetChangeCallbackEntry : public PLDHashEntryHdr { - typedef const ReferenceTargetChangeCallback KeyType; - typedef const ReferenceTargetChangeCallback* KeyTypePointer; - - explicit ReferenceTargetChangeCallbackEntry( - const ReferenceTargetChangeCallback* aKey) - : mKey(*aKey) {} - ReferenceTargetChangeCallbackEntry( - ReferenceTargetChangeCallbackEntry&& aOther) - : PLDHashEntryHdr(std::move(aOther)), mKey(std::move(aOther.mKey)) {} - - KeyType GetKey() const { return mKey; } - bool KeyEquals(KeyTypePointer aKey) const { - return aKey->mObserver == mKey.mObserver && aKey->mData == mKey.mData; - } - - static KeyTypePointer KeyToPointer(KeyType& aKey) { return &aKey; } - static PLDHashNumber HashKey(KeyTypePointer aKey) { - return HashGeneric(aKey->mObserver, aKey->mData); - } - enum { ALLOW_MEMMOVE = true }; - - ReferenceTargetChangeCallback mKey; - }; - nsTHashSet<ReferenceTargetChangeCallbackEntry> mReferenceTargetObservers; }; class nsDOMSlots : public nsIContent::nsContentSlots { diff --git a/dom/base/RadioGroupContainer.cpp b/dom/base/RadioGroupContainer.cpp @@ -24,7 +24,7 @@ struct nsRadioGroupStruct { * A strong pointer to the currently selected radio button. */ RefPtr<HTMLInputElement> mSelectedRadioButton; - TreeOrderedArray<RefPtr<HTMLInputElement>, TreeKind::DOM> mRadioButtons; + TreeOrderedArray<RefPtr<HTMLInputElement>> mRadioButtons; uint32_t mRequiredRadioCount; bool mGroupSuffersFromValueMissing; }; diff --git a/dom/base/ShadowRoot.cpp b/dom/base/ShadowRoot.cpp @@ -71,7 +71,8 @@ ShadowRoot::ShadowRoot(Element* aElement, ShadowRootMode aMode, mIsAvailableToElementInternals(false), mIsDeclarative(aDeclarative), mIsClonable(aIsClonable), - mIsSerializable(aIsSerializable) { + mIsSerializable(aIsSerializable), + mReferenceTarget(nsGkAtoms::_empty) { // nsINode.h relies on this. MOZ_ASSERT(static_cast<nsINode*>(this) == reinterpret_cast<nsINode*>(this)); MOZ_ASSERT(static_cast<nsIContent*>(this) == @@ -939,69 +940,7 @@ void ShadowRoot::GetHTML(const GetHTMLOptions& aOptions, nsAString& aResult) { this, true, aResult, aOptions.mSerializableShadowRoots, aOptions.mShadowRoots); } - -// static -bool ShadowRoot::ReferenceTargetIDTargetChanged(Element* aOldElement, - Element* aNewElement, - void* aData) { - ShadowRoot* shadowRoot = static_cast<ShadowRoot*>(aData); - if (aOldElement) { - aOldElement->RemoveReferenceTargetChangeObserver( - RecursiveReferenceTargetChanged, shadowRoot); - } - if (aNewElement) { - aNewElement->AddReferenceTargetChangeObserver( - RecursiveReferenceTargetChanged, shadowRoot); - } - shadowRoot->NotifyReferenceTargetChangedObservers(); - return true; -} - -// static -bool ShadowRoot::RecursiveReferenceTargetChanged(void* aData) { - ShadowRoot* shadowRoot = static_cast<ShadowRoot*>(aData); - shadowRoot->NotifyReferenceTargetChangedObservers(); - return true; -} - void ShadowRoot::SetReferenceTarget(RefPtr<nsAtom> aTarget) { - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { - return; - } - - if (aTarget == mReferenceTarget) { - return; - } - - if (mReferenceTarget) { - RemoveIDTargetObserver(mReferenceTarget, ReferenceTargetIDTargetChanged, - this, false); - if (Element* oldElement = GetReferenceTargetElement()) { - oldElement->RemoveReferenceTargetChangeObserver( - RecursiveReferenceTargetChanged, this); - } - } - - if (!aTarget) { - mReferenceTarget = nullptr; - } else { - mReferenceTarget = std::move(aTarget); - - Element* referenceTargetElement = AddIDTargetObserver( - mReferenceTarget, ReferenceTargetIDTargetChanged, this, false); - if (referenceTargetElement) { - referenceTargetElement->AddReferenceTargetChangeObserver( - RecursiveReferenceTargetChanged, this); - } - } - - NotifyReferenceTargetChangedObservers(); -} - -void ShadowRoot::NotifyReferenceTargetChangedObservers() { - Element* host = GetHost(); - if (!host) { - return; - } - host->NotifyReferenceTargetChanged(); + MOZ_ASSERT(aTarget); + mReferenceTarget = std::move(aTarget); } diff --git a/dom/base/ShadowRoot.h b/dom/base/ShadowRoot.h @@ -275,24 +275,17 @@ class ShadowRoot final : public DocumentFragment, public DocumentOrShadowRoot { void GetHTML(const GetHTMLOptions& aOptions, nsAString& aResult); - bool HasReferenceTarget() const { return mReferenceTarget; } void GetReferenceTarget(nsAString& aResult) const { - if (!mReferenceTarget) { - aResult.SetIsVoid(true); - return; - } mReferenceTarget->ToString(aResult); } nsAtom* ReferenceTarget() const { return mReferenceTarget; } void SetReferenceTarget(const nsAString& aValue) { - if (aValue.IsVoid()) { - return SetReferenceTarget(nullptr); - } SetReferenceTarget(NS_Atomize(aValue)); } void SetReferenceTarget(RefPtr<nsAtom> aTarget); Element* GetReferenceTargetElement() const { - return mReferenceTarget ? GetElementById(mReferenceTarget) : nullptr; + return mReferenceTarget->IsEmpty() ? nullptr + : GetElementById(mReferenceTarget); } protected: @@ -343,12 +336,6 @@ class ShadowRoot final : public DocumentFragment, public DocumentOrShadowRoot { RefPtr<nsAtom> mReferenceTarget; - static bool ReferenceTargetIDTargetChanged(Element* aOldElement, - Element* aNewElement, void* aData); - static bool RecursiveReferenceTargetChanged(void* aData); - - void NotifyReferenceTargetChangedObservers(); - nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override; }; diff --git a/dom/base/TreeOrderedArray.h b/dom/base/TreeOrderedArray.h @@ -8,7 +8,6 @@ #define mozilla_dom_TreeOrderedArray_h #include "FastFrontRemovableArray.h" -#include "nsContentUtils.h" class nsINode; template <typename T> @@ -17,7 +16,7 @@ class RefPtr; namespace mozilla::dom { // A sorted tree-ordered list of pointers (either raw or RefPtr) to nodes. -template <typename NodePointer, TreeKind K = TreeKind::DOM> +template <typename NodePointer> class TreeOrderedArray : public FastFrontRemovableArray<NodePointer, 1> { using Base = FastFrontRemovableArray<NodePointer, 1>; diff --git a/dom/base/TreeOrderedArrayInlines.h b/dom/base/TreeOrderedArrayInlines.h @@ -15,9 +15,8 @@ namespace mozilla::dom { -template <typename Node, TreeKind K> -size_t TreeOrderedArray<Node, K>::Insert(Node& aNode, - nsINode* aCommonAncestor) { +template <typename Node> +size_t TreeOrderedArray<Node>::Insert(Node& aNode, nsINode* aCommonAncestor) { static_assert(std::is_base_of_v<nsINode, Node>, "Should be a node"); auto span = Base::AsSpan(); @@ -36,8 +35,8 @@ size_t TreeOrderedArray<Node, K>::Insert(Node& aNode, auto* curNode = static_cast<Node*>(aNode); MOZ_DIAGNOSTIC_ASSERT(curNode != &mNode, "Tried to insert a node already in the list"); - return nsContentUtils::CompareTreePosition<K>(&mNode, curNode, - mCommonAncestor, &mCache); + return nsContentUtils::CompareTreePosition<TreeKind::DOM>( + &mNode, curNode, mCommonAncestor, &mCache); } }; diff --git a/dom/base/nsContentList.cpp b/dom/base/nsContentList.cpp @@ -22,7 +22,6 @@ #include "mozilla/dom/Document.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/HTMLCollectionBinding.h" -#include "mozilla/dom/HTMLLabelElement.h" #include "mozilla/dom/NodeInfoInlines.h" #include "mozilla/dom/NodeListBinding.h" #include "nsCCUncollectableMarker.h" @@ -884,10 +883,6 @@ bool nsContentList::MatchSelf(nsIContent* aContent) { return false; } -nsINode* nsContentList::GetNextNode(nsINode* aCurrent) { - return aCurrent->GetNextNode(mRootNode); -} - void nsContentList::PopulateSelf(uint32_t aNeededLength, uint32_t aExpectedElementsIfDirty) { if (!mRootNode) { @@ -913,7 +908,7 @@ void nsContentList::PopulateSelf(uint32_t aNeededLength, // start searching at the root. nsINode* cur = count ? mElements[count - 1].get() : mRootNode; do { - cur = GetNextNode(cur); + cur = cur->GetNextNode(mRootNode); if (!cur) { break; } @@ -1098,50 +1093,17 @@ JSObject* nsCacheableFuncStringHTMLCollection::WrapObject( //----------------------------------------------------- // nsLabelsNodeList -nsLabelsNodeList::nsLabelsNodeList(nsGenericHTMLElement* aLabeledElement, - nsINode* aSubtreeRoot, - nsContentListMatchFunc aMatchFunc, - nsContentListDestroyFunc aDestroyFunc) - : nsContentList(aSubtreeRoot, aMatchFunc, aDestroyFunc, aLabeledElement) { - WatchLabeledDescendantsOfNearestAncestorLabel(aLabeledElement); - if (ShadowRoot* shadow = ShadowRoot::FromNodeOrNull(aSubtreeRoot)) { - shadow->Host()->AddReferenceTargetChangeObserver(ResetRootsCallback, this); - } - mRoots.AppendElement(aSubtreeRoot); - ResetRoots(); -} - -nsLabelsNodeList::~nsLabelsNodeList() { - for (nsINode* root : mRoots) { - root->RemoveMutationObserver(this); - if (ShadowRoot* shadow = ShadowRoot::FromNodeOrNull(root)) { - Element* host = shadow->GetHost(); - if (host) { - host->RemoveReferenceTargetChangeObserver(ResetRootsCallback, this); - } - } - } -} - JSObject* nsLabelsNodeList::WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) { return NodeList_Binding::Wrap(cx, this, aGivenProto); } -bool nsLabelsNodeList::NodeIsInScope(nsINode* aNode) { - for (nsINode* root : mRoots) { - if (nsContentUtils::IsInSameAnonymousTree(root, aNode)) { - return true; - } - } - return false; -} - void nsLabelsNodeList::AttributeChanged(Element* aElement, int32_t aNameSpaceID, nsAtom* aAttribute, AttrModType, const nsAttrValue* aOldValue) { MOZ_ASSERT(aElement, "Must have a content node to work with"); - if (mState == State::Dirty || !NodeIsInScope(aElement)) { + if (mState == State::Dirty || + !nsContentUtils::IsInSameAnonymousTree(mRootNode, aElement)) { return; } @@ -1158,9 +1120,11 @@ void nsLabelsNodeList::AttributeChanged(Element* aElement, int32_t aNameSpaceID, void nsLabelsNodeList::ContentAppended(nsIContent* aFirstNewContent, const ContentAppendInfo&) { nsIContent* container = aFirstNewContent->GetParent(); - // If a labelable element is moved to outside or inside of nested associated - // labels, we're gonna have to modify the content list. - if (mState != State::Dirty && NodeIsInScope(container)) { + // If a labelable element is moved to outside or inside of + // nested associated labels, we're gonna have to modify + // the content list. + if (mState != State::Dirty && + nsContentUtils::IsInSameAnonymousTree(mRootNode, container)) { SetDirty(); return; } @@ -1168,9 +1132,11 @@ void nsLabelsNodeList::ContentAppended(nsIContent* aFirstNewContent, void nsLabelsNodeList::ContentInserted(nsIContent* aChild, const ContentInsertInfo&) { - // If a labelable element is moved to outside or inside of nested associated - // labels, we're gonna have to modify the content list. - if (mState != State::Dirty && NodeIsInScope(aChild)) { + // If a labelable element is moved to outside or inside of + // nested associated labels, we're gonna have to modify + // the content list. + if (mState != State::Dirty && + nsContentUtils::IsInSameAnonymousTree(mRootNode, aChild)) { SetDirty(); return; } @@ -1178,184 +1144,36 @@ void nsLabelsNodeList::ContentInserted(nsIContent* aChild, void nsLabelsNodeList::ContentWillBeRemoved(nsIContent* aChild, const ContentRemoveInfo&) { - // If a labelable element is removed, we're gonna have to clean the content - // list. - if (mState != State::Dirty && NodeIsInScope(aChild)) { + // If a labelable element is removed, we're gonna have to clean + // the content list. + if (mState != State::Dirty && + nsContentUtils::IsInSameAnonymousTree(mRootNode, aChild)) { SetDirty(); return; } } -void nsLabelsNodeList::NodeWillBeDestroyed(nsINode* aNode) { - if (ShadowRoot* shadow = ShadowRoot::FromNodeOrNull(aNode)) { - if (Element* host = shadow->GetHost()) { - host->RemoveReferenceTargetChangeObserver(ResetRootsCallback, this); - } - } - mRoots.RemoveElement(aNode); -} - -// static -bool nsLabelsNodeList::ResetRootsCallback(void* aData) { - nsLabelsNodeList* list = (nsLabelsNodeList*)aData; - list->ResetRoots(); - return true; -} - -// static -bool nsLabelsNodeList::SetDirtyCallback(void* aData) { - nsLabelsNodeList* list = (nsLabelsNodeList*)aData; - list->SetDirty(); - return true; -} - -void nsLabelsNodeList::WatchLabeledDescendantsOfNearestAncestorLabel( - Element* labeledHost) { - if (!StaticPrefs::dom_shadowdom_referenceTarget_enabled()) { +void nsLabelsNodeList::MaybeResetRoot(nsINode* aRootNode) { + MOZ_ASSERT(aRootNode, "Must have root"); + if (mRootNode == aRootNode) { return; } - MOZ_ASSERT(labeledHost); - Element* parentElement = labeledHost->GetParentElement(); - while (parentElement) { - if (HTMLLabelElement* label = HTMLLabelElement::FromNode(parentElement)) { - // Use GetControlForBindings() to get the element in the same scope as the - // label, instead of the deep labeled element. - if (Element* labeledElement = label->GetControlForBindings()) { - if (labeledElement != labeledHost) { - // If the labeled element's reference target changes such that it's no - // longer labelable, our labeled element might become the target for - // the ancestor label. - labeledElement->AddReferenceTargetChangeObserver(SetDirtyCallback, - this); - } - } - return; - } - parentElement = parentElement->GetParentElement(); - } -} -void nsLabelsNodeList::ResetRoots() { MOZ_ASSERT(mIsLiveList, "nsLabelsNodeList is always a live list"); - - nsGenericHTMLElement* labeledElement = - static_cast<nsGenericHTMLElement*>(mData); - MOZ_ASSERT(labeledElement, "Must have labeled element"); - - nsTArray<nsINode*> newRoots; - - Element* labeledElementOrHost = labeledElement; - bool labeledElementOrHostIsInShadowTree = false; - ShadowRoot* shadowRoot = labeledElement->GetContainingShadow(); - while (shadowRoot) { - newRoots.AppendElement(shadowRoot); - // If reference target is not enabled, GetReferenceTargetElement() will - // always return nullptr. - if (shadowRoot->GetReferenceTargetElement() != labeledElementOrHost) { - labeledElementOrHostIsInShadowTree = true; - break; - } - labeledElementOrHost = shadowRoot->Host(); - WatchLabeledDescendantsOfNearestAncestorLabel(labeledElementOrHost); - shadowRoot = labeledElementOrHost->GetContainingShadow(); - } - - // If the outermost labeled element or host is in a shadow tree, its - // containing shadow root is already in newRoots. - if (!labeledElementOrHostIsInShadowTree) { - // `labeledHost` is either `labeledElement`, or the shadow host which has - // `labeledElement` as its resolved reference target. - DocumentOrShadowRoot* doc = labeledElementOrHost->GetUncomposedDoc(); - if (doc) { - newRoots.AppendElement(&doc->AsNode()); - } else if (newRoots.IsEmpty()) { - newRoots.AppendElement(labeledElementOrHost->SubtreeRoot()); - } - } - - if (newRoots == mRoots) { - return; - } - MOZ_ASSERT(!newRoots.IsEmpty(), "Must have at least one root"); - - for (nsINode* root : mRoots) { - if (!newRoots.Contains(root)) { - root->RemoveMutationObserver(this); - } - - // Only the outermost shadow root should have this as a - // ReferenceTargetChangedObserver, to avoid duplicated notifications. - if (ShadowRoot* shadow = ShadowRoot::FromNodeOrNull(root)) { - Element* host = shadow->GetHost(); - if (host) { - host->RemoveReferenceTargetChangeObserver(ResetRootsCallback, this); - } - } - } - for (nsINode* root : newRoots) { - if (!mRoots.Contains(root)) { - root->AddMutationObserver(this); - } - } - - mRoots = std::move(newRoots); - mRootNode = mRoots.LastElement(); - - if (labeledElementOrHostIsInShadowTree) { - ShadowRoot* shadow = ShadowRoot::FromNodeOrNull(mRootNode); - MOZ_ASSERT(shadow); - shadow->Host()->AddReferenceTargetChangeObserver(ResetRootsCallback, this); + if (mRootNode) { + mRootNode->RemoveMutationObserver(this); } - labeledElementOrHost->AddReferenceTargetChangeObserver(ResetRootsCallback, - this); - + mRootNode = aRootNode; + mRootNode->AddMutationObserver(this); SetDirty(); } -nsINode* nsLabelsNodeList::GetNextNode(nsINode* aCurrent) { - nsGenericHTMLElement* labeledElement = (nsGenericHTMLElement*)mData; - MOZ_ASSERT(labeledElement, "Must have labeled element"); - MOZ_ASSERT(mRootNode, "Must have root node"); - - nsINode* next = nullptr; - - // If aCurrent's resolved reference target is the labeled element, descend - // into aCurrent's shadow root, if it has one. (Otherwise, ignore shadow - // roots.) - if (aCurrent->IsElement()) { - Element* curElement = aCurrent->AsElement(); - ShadowRoot* curShadow = curElement->GetShadowRoot(); - if (curShadow && curElement->ResolveReferenceTarget() == labeledElement) { - next = curShadow->GetFirstChild(); - } - } - if (next) { - return next; - } - - // Default case: just get the next node in the current tree. - next = aCurrent->GetNextNode(); - if (next) { - return next; - } - - // If we descended into a shadow tree, back out of it until we find an - // adjacent node, or hit a shadow root which doesn't have the current element - // as its reference target. - nsINode* cur = aCurrent; - while (!next) { - ShadowRoot* shadow = cur->GetContainingShadow(); - if (!shadow || shadow->GetReferenceTargetElement() == cur) { - break; - } - cur = shadow->Host(); - next = cur->GetNextNode(); - } - return next; -} - void nsLabelsNodeList::PopulateSelf(uint32_t aNeededLength, uint32_t aExpectedElementsIfDirty) { + if (!mRootNode) { + return; + } + // Start searching at the root. nsINode* cur = mRootNode; if (mElements.IsEmpty() && cur->IsElement() && Match(cur->AsElement())) { @@ -1365,17 +1183,3 @@ void nsLabelsNodeList::PopulateSelf(uint32_t aNeededLength, nsContentList::PopulateSelf(aNeededLength, aExpectedElementsIfDirty); } - -void nsLabelsNodeList::LastRelease() { - for (nsINode* root : mRoots) { - root->RemoveMutationObserver(this); - if (ShadowRoot* shadow = ShadowRoot::FromNodeOrNull(root)) { - if (Element* host = shadow->GetHost()) { - host->RemoveReferenceTargetChangeObserver(ResetRootsCallback, this); - } - } - } - mRoots.Clear(); - - nsContentList::LastRelease(); -} diff --git a/dom/base/nsContentList.h b/dom/base/nsContentList.h @@ -200,7 +200,7 @@ struct nsContentListKey { */ class nsContentList : public nsBaseContentList, public nsIHTMLCollection, - public nsStubMultiMutationObserver { + public nsStubMutationObserver { protected: enum class State : uint8_t { // The list is up to date and need not do any walking to be able to answer @@ -388,8 +388,6 @@ class nsContentList : public nsBaseContentList, */ bool MatchSelf(nsIContent* aContent); - virtual nsINode* GetNextNode(nsINode* aCurrent); - /** * Populate our list. Stop once we have at least aNeededLength * elements. At the end of PopulateSelf running, either the last @@ -621,31 +619,25 @@ class nsCacheableFuncStringHTMLCollection class nsLabelsNodeList final : public nsContentList { public: - nsLabelsNodeList(nsGenericHTMLElement* aLabeledElement, nsINode* aSubtreeRoot, - nsContentListMatchFunc aMatchFunc, - nsContentListDestroyFunc aDestroyFunc); + nsLabelsNodeList(nsINode* aRootNode, nsContentListMatchFunc aFunc, + nsContentListDestroyFunc aDestroyFunc, void* aData) + : nsContentList(aRootNode, aFunc, aDestroyFunc, aData) {} NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED - NS_DECL_NSIMUTATIONOBSERVER_NODEWILLBEDESTROYED JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) override; /** - * Reset roots, mutation observers and reference target observers, and clear - * content list if the roots have changed. + * Reset root, mutation observer, and clear content list + * if the root has been changed. + * + * @param aRootNode The node under which to limit our search. */ - void ResetRoots(); - - void LastRelease() override; - - protected: - virtual ~nsLabelsNodeList(); - - nsINode* GetNextNode(nsINode* aCurrent) override; + void MaybeResetRoot(nsINode* aRootNode); private: /** @@ -659,28 +651,5 @@ class nsLabelsNodeList final : public nsContentList { */ void PopulateSelf(uint32_t aNeededLength, uint32_t aExpectedElementsIfDirty = 0) override; - - bool NodeIsInScope(nsINode* aNode); - - static bool ResetRootsCallback(void* aData); - static bool SetDirtyCallback(void* aData); - - void WatchLabeledDescendantsOfNearestAncestorLabel(Element* labeledHost); - - /** - * An array of all relevant subtree roots for the labeled element. - * - * A labeled element's labels may include nodes from multiple roots, since - * each shadow root may have a reference target allowing labels to refer to an - * element within the shadow root, potentially recusively. - * - * This structure is populated by walking up from the labeled element, - * adding each subtree root in turn and walking out to the next one if the - * labeled element or the host of the previous root is the reference target of - * its subtree root. - * - * The last element in this array must always be the same as mRootNode. - */ - nsTArray<nsINode*> mRoots; }; #endif // nsContentList_h___ diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp @@ -1420,7 +1420,7 @@ bool nsContentUtils::IsAutocompleteEnabled(mozilla::dom::Element* aElement) { if (autocomplete.IsEmpty()) { auto* control = nsGenericHTMLFormControlElement::FromNode(aElement); - auto* form = control->GetFormInternal(); + auto* form = control->GetForm(); if (!form) { return true; } @@ -4122,7 +4122,7 @@ void nsContentUtils::GenerateStateKey(nsIContent* aContent, Document* aDocument, KeyAppendInt(int32_t(control->ControlType()), aKey); // If in a form, add form name / index of form / index in form - HTMLFormElement* formElement = control->GetFormInternal(); + HTMLFormElement* formElement = control->GetForm(); if (formElement) { if (IsAutocompleteOff(formElement)) { aKey.Truncate(); diff --git a/dom/base/nsINode.cpp b/dom/base/nsINode.cpp @@ -3586,7 +3586,7 @@ nsGenericHTMLElement* nsINode::GetEffectiveCommandForElement() const { if (const auto* buttonControl = HTMLButtonElement::FromNodeOrNull(this)) { if (auto* popover = nsGenericHTMLElement::FromNodeOrNull( - buttonControl->GetCommandForElementInternal())) { + buttonControl->GetCommandForElement())) { if (popover->GetPopoverAttributeState() != PopoverAttributeState::None) { return popover; } @@ -3603,7 +3603,7 @@ nsGenericHTMLElement* nsINode::GetEffectivePopoverTargetElement() const { return nullptr; } if (auto* popover = nsGenericHTMLElement::FromNodeOrNull( - formControl->GetPopoverTargetElementInternal())) { + formControl->GetPopoverTargetElement())) { if (popover->GetPopoverAttributeState() != PopoverAttributeState::None) { return popover; } diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp @@ -6534,7 +6534,7 @@ static Element* GetLabelTarget(nsIContent* aPossibleLabel) { mozilla::dom::HTMLLabelElement::FromNode(aPossibleLabel); if (!label) return nullptr; - return label->GetLabeledElementInternal(); + return label->GetLabeledElement(); } /* static */ diff --git a/dom/events/IMEStateManager.cpp b/dom/events/IMEStateManager.cpp @@ -1937,7 +1937,7 @@ MOZ_CAN_RUN_SCRIPT static void GetActionHint(const IMEState& aState, // return won't submit the form, use "maybenext". bool willSubmit = false; bool isLastElement = false; - HTMLFormElement* formElement = inputElement->GetFormInternal(); + HTMLFormElement* formElement = inputElement->GetForm(); // is this a form and does it have a default submit element? if (formElement) { if (formElement->IsLastActiveElement(inputElement)) { diff --git a/dom/html/ElementInternals.cpp b/dom/html/ElementInternals.cpp @@ -149,7 +149,7 @@ void ElementInternals::SetFormValue( } // https://html.spec.whatwg.org/#dom-elementinternals-form -Element* ElementInternals::GetFormForBindings(ErrorResult& aRv) const { +HTMLFormElement* ElementInternals::GetForm(ErrorResult& aRv) const { MOZ_ASSERT(mTarget); if (!mTarget->IsFormAssociatedElement()) { @@ -157,8 +157,7 @@ Element* ElementInternals::GetFormForBindings(ErrorResult& aRv) const { "Target element is not a form-associated custom element"); return nullptr; } - - return GetFormForBindings(); + return GetForm(); } // https://html.spec.whatwg.org/commit-snapshots/3ad5159be8f27e110a70cefadcb50fc45ec21b05/#dom-elementinternals-setvalidity @@ -341,7 +340,7 @@ already_AddRefed<nsINodeList> ElementInternals::GetLabels( "Target element is not a form-associated custom element"); return nullptr; } - return mTarget->LabelsInternal(); + return mTarget->Labels(); } nsGenericHTMLElement* ElementInternals::GetValidationAnchor( @@ -363,10 +362,6 @@ CustomStateSet* ElementInternals::States() { return mCustomStateSet; } -Element* ElementInternals::GetFormForBindings() const { - return GetFormInternal(); -}; - void ElementInternals::SetForm(HTMLFormElement* aForm) { mForm = aForm; } void ElementInternals::ClearForm(bool aRemoveFromForm, bool aUnbindOrDelete) { @@ -623,9 +618,9 @@ void ElementInternals::GetAttrElements( for (const nsWeakPtr& weakEl : attrElements) { // For each attrElement in reflectedTarget's explicitly set attr-elements: - if (RefPtr<Element> attrEl = do_QueryReferent(weakEl)) { + if (nsCOMPtr<Element> attrEl = do_QueryReferent(weakEl)) { // Append attrElement to elements. - elements.AppendElement(std::move(attrEl)); + elements.AppendElement(attrEl); } } @@ -659,22 +654,22 @@ void ElementInternals::GetAttrElements( cachedAttrElements = std::move(elements); } -Maybe<nsTArray<RefPtr<Element>>> ElementInternals::GetAttrElements( - nsAtom* aAttr) { +bool ElementInternals::GetAttrElements(nsAtom* aAttr, + nsTArray<Element*>& aElements) { + aElements.Clear(); auto attrElementsMaybeEntry = mAttrElementsMap.Lookup(aAttr); if (!attrElementsMaybeEntry) { - return Nothing(); + return false; } - nsTArray<RefPtr<Element>> elements; auto& [attrElements, cachedAttrElements] = attrElementsMaybeEntry.Data(); for (const nsWeakPtr& weakEl : attrElements) { - if (RefPtr<Element> attrEl = do_QueryReferent(weakEl)) { - elements.AppendElement(std::move(attrEl)); + if (nsCOMPtr<Element> attrEl = do_QueryReferent(weakEl)) { + aElements.AppendElement(attrEl); } } - return Some(std::move(elements)); + return true; } } // namespace mozilla::dom diff --git a/dom/html/ElementInternals.h b/dom/html/ElementInternals.h @@ -77,7 +77,7 @@ class ElementInternals final : public nsIFormControl, void SetFormValue(const Nullable<FileOrUSVStringOrFormData>& aValue, const Optional<Nullable<FileOrUSVStringOrFormData>>& aState, ErrorResult& aRv); - mozilla::dom::Element* GetFormForBindings(ErrorResult& aRv) const; + mozilla::dom::HTMLFormElement* GetForm(ErrorResult& aRv) const; void SetValidity(const ValidityStateFlags& aFlags, const Optional<nsAString>& aMessage, const Optional<NonNull<nsGenericHTMLElement>>& aAnchor, @@ -96,10 +96,7 @@ class ElementInternals final : public nsIFormControl, mozilla::dom::HTMLFieldSetElement* GetFieldSet() override { return mFieldSet; } - mozilla::dom::Element* GetFormForBindings() const override; - mozilla::dom::HTMLFormElement* GetFormInternal() const override { - return mForm; - } + mozilla::dom::HTMLFormElement* GetForm() const override { return mForm; } void SetForm(mozilla::dom::HTMLFormElement* aForm) override; void ClearForm(bool aRemoveFromForm, bool aUnbindOrDelete) override; NS_IMETHOD Reset() override; @@ -196,7 +193,7 @@ class ElementInternals final : public nsIFormControl, nsresult SetAttr(nsAtom* aName, const nsAString& aValue); - Maybe<nsTArray<RefPtr<Element>>> GetAttrElements(nsAtom* aAttr); + bool GetAttrElements(nsAtom* aAttr, nsTArray<Element*>& aElements); const AttrArray& GetAttrs() const { return mAttrs; } diff --git a/dom/html/HTMLButtonElement.cpp b/dom/html/HTMLButtonElement.cpp @@ -354,7 +354,7 @@ void HTMLButtonElement::ActivationBehavior(EventChainPostVisitor& aVisitor) { // 4. Let target be the result of running element's get the // commandfor-associated element. - RefPtr<Element> target = GetCommandForElementInternal(); + RefPtr<Element> target = GetCommandForElement(); // 5. If target is not null: if (target) { @@ -611,21 +611,14 @@ Element::Command HTMLButtonElement::GetCommand() const { return Command::Invalid; } -Element* HTMLButtonElement::GetCommandForElementForBindings() const { +Element* HTMLButtonElement::GetCommandForElement() const { if (StaticPrefs::dom_element_commandfor_enabled()) { - return GetAttrAssociatedElementForBindings(nsGkAtoms::commandfor); + return GetAttrAssociatedElement(nsGkAtoms::commandfor); } return nullptr; } -Element* HTMLButtonElement::GetCommandForElementInternal() const { - if (StaticPrefs::dom_element_commandfor_enabled()) { - return GetAttrAssociatedElementInternal(nsGkAtoms::commandfor); - } - return nullptr; -} - -void HTMLButtonElement::SetCommandForElementForBindings(Element* aElement) { +void HTMLButtonElement::SetCommandForElement(Element* aElement) { ExplicitlySetAttrElement(nsGkAtoms::commandfor, aElement); } diff --git a/dom/html/HTMLButtonElement.h b/dom/html/HTMLButtonElement.h @@ -136,9 +136,8 @@ class HTMLButtonElement final : public nsGenericHTMLFormControlElementWithState, void SetCustomValidity(const nsAString& aError); // Command & CommandFor - Element* GetCommandForElementForBindings() const; - Element* GetCommandForElementInternal() const; - void SetCommandForElementForBindings(Element*); + Element* GetCommandForElement() const; + void SetCommandForElement(Element*); void GetCommand(nsAString& aCommand) const; Element::Command GetCommand() const; void SetCommand(const nsAString& aValue) { diff --git a/dom/html/HTMLElement.cpp b/dom/html/HTMLElement.cpp @@ -363,7 +363,7 @@ void HTMLElement::SetFormInternal(HTMLFormElement* aForm, bool aBindToTree) { HTMLFormElement* HTMLElement::GetFormInternal() const { ElementInternals* internals = GetElementInternals(); MOZ_ASSERT(internals); - return internals->GetFormInternal(); + return internals->GetForm(); } void HTMLElement::SetFieldSetInternal(HTMLFieldSetElement* aFieldset) { diff --git a/dom/html/HTMLFormControlsCollection.h b/dom/html/HTMLFormControlsCollection.h @@ -99,15 +99,13 @@ class HTMLFormControlsCollection final : public nsIHTMLCollection, // Holds WEAK references - bug 36639 // NOTE(emilio): These are not guaranteed to be descendants of mForm, because // of the form attribute, though that's likely. - TreeOrderedArray<nsGenericHTMLFormElement*, TreeKind::ShadowIncludingDOM> - mElements; + TreeOrderedArray<nsGenericHTMLFormElement*> mElements; // This array holds on to all form controls that are not contained // in mElements (form.elements in JS, see ShouldBeInFormControl()). // This is needed to properly clean up the bi-directional references // (both weak and strong) between the form and its form controls. - TreeOrderedArray<nsGenericHTMLFormElement*, TreeKind::ShadowIncludingDOM> - mNotInElements; + TreeOrderedArray<nsGenericHTMLFormElement*> mNotInElements; NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(HTMLFormControlsCollection) diff --git a/dom/html/HTMLFormElement.cpp b/dom/html/HTMLFormElement.cpp @@ -349,7 +349,7 @@ void HTMLFormElement::RequestSubmit(nsGenericHTMLElement* aSubmitter, // 1.2. If submitter's form owner is not this form element, then throw a // "NotFoundError" DOMException. - if (fc->GetFormInternal() != this) { + if (fc->GetForm() != this) { aRv.ThrowNotFoundError("The submitter is not owned by this form."); return; } @@ -403,13 +403,11 @@ static void MarkOrphans(Span<T*> aArray) { } } -static void CollectOrphans( - nsINode* aRemovalRoot, - TreeOrderedArray<nsGenericHTMLFormElement*, TreeKind::ShadowIncludingDOM>& - aArray +static void CollectOrphans(nsINode* aRemovalRoot, + TreeOrderedArray<nsGenericHTMLFormElement*>& aArray #ifdef DEBUG - , - HTMLFormElement* aThisForm + , + HTMLFormElement* aThisForm #endif ) { // Put a script blocker around all the notifications we're about to do. @@ -443,7 +441,7 @@ static void CollectOrphans( if (!removed) { const auto* fc = nsIFormControl::FromNode(node); MOZ_ASSERT(fc); - HTMLFormElement* form = fc->GetFormInternal(); + HTMLFormElement* form = fc->GetForm(); NS_ASSERTION(form == aThisForm, "How did that happen?"); } #endif /* DEBUG */ @@ -482,7 +480,7 @@ static void CollectOrphans(nsINode* aRemovalRoot, #ifdef DEBUG if (!removed) { - HTMLFormElement* form = node->GetFormInternal(); + HTMLFormElement* form = node->GetForm(); NS_ASSERTION(form == aThisForm, "How did that happen?"); } #endif /* DEBUG */ @@ -1134,9 +1132,8 @@ nsresult HTMLFormElement::AddElement(nsGenericHTMLFormElement* aChild, // Determine whether to add the new element to the elements or // the not-in-elements list. bool childInElements = HTMLFormControlsCollection::ShouldBeInElements(fc); - TreeOrderedArray<nsGenericHTMLFormElement*, TreeKind::ShadowIncludingDOM>& - controlList = - childInElements ? mControls->mElements : mControls->mNotInElements; + TreeOrderedArray<nsGenericHTMLFormElement*>& controlList = + childInElements ? mControls->mElements : mControls->mNotInElements; const size_t insertedIndex = controlList.Insert(*aChild, this); const bool lastElement = controlList.Length() == insertedIndex + 1; @@ -1238,9 +1235,8 @@ nsresult HTMLFormElement::RemoveElement(nsGenericHTMLFormElement* aChild, // Determine whether to remove the child from the elements list // or the not in elements list. bool childInElements = HTMLFormControlsCollection::ShouldBeInElements(fc); - TreeOrderedArray<nsGenericHTMLFormElement*, TreeKind::ShadowIncludingDOM>& - controls = - childInElements ? mControls->mElements : mControls->mNotInElements; + TreeOrderedArray<nsGenericHTMLFormElement*>& controls = + childInElements ? mControls->mElements : mControls->mNotInElements; // Find the index of the child. This will be used later if necessary // to find the default submit. diff --git a/dom/html/HTMLImageElement.cpp b/dom/html/HTMLImageElement.cpp @@ -586,7 +586,7 @@ JSObject* HTMLImageElement::WrapNode(JSContext* aCx, } #ifdef DEBUG -HTMLFormElement* HTMLImageElement::GetFormInternal() const { return mForm; } +HTMLFormElement* HTMLImageElement::GetForm() const { return mForm; } #endif void HTMLImageElement::SetForm(HTMLFormElement* aForm) { diff --git a/dom/html/HTMLImageElement.h b/dom/html/HTMLImageElement.h @@ -201,7 +201,7 @@ class HTMLImageElement final : public nsGenericHTMLElement, } #ifdef DEBUG - HTMLFormElement* GetFormInternal() const; + HTMLFormElement* GetForm() const; #endif void SetForm(HTMLFormElement* aForm); void ClearForm(bool aRemoveFromForm); diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp @@ -754,7 +754,7 @@ static void SerializeColorForHTMLCompatibility(const StyleAbsoluteColor& aColor, } nsTArray<nsString> HTMLInputElement::GetColorsFromList() { - RefPtr<HTMLDataListElement> dataList = GetListInternal(); + RefPtr<HTMLDataListElement> dataList = GetList(); if (!dataList) { return {}; } @@ -1796,11 +1796,7 @@ void HTMLInputElement::SetValue(const nsAString& aValue, CallerType aCallerType, } } -Element* HTMLInputElement::GetListForBindings() const { - return RetargetReferenceTargetForBindings(GetListInternal()); -} - -HTMLDataListElement* HTMLInputElement::GetListInternal() const { +HTMLDataListElement* HTMLInputElement::GetList() const { nsAutoString dataListId; GetAttr(nsGkAtoms::list, dataListId); if (dataListId.IsEmpty()) { @@ -1812,9 +1808,8 @@ HTMLDataListElement* HTMLInputElement::GetListInternal() const { return nullptr; } - Element* target = docOrShadow->GetElementById(dataListId); - Element* list = target ? target->ResolveReferenceTarget() : nullptr; - return HTMLDataListElement::FromNodeOrNull(list); + return HTMLDataListElement::FromNodeOrNull( + docOrShadow->GetElementById(dataListId)); } void HTMLInputElement::SetValue(Decimal aValue, CallerType aCallerType) { @@ -6013,7 +6008,7 @@ void HTMLInputElement::ShowPicker(ErrorResult& aRv) { // I.e. show the autocomplete dropdown based on the list attribute. // XXX Form-fill support on android is bug 1535985. if (StaticPrefs::dom_input_showPicker_datalist_enabled() && - IsSingleLineTextControl(true) && GetListInternal()) { + IsSingleLineTextControl(true) && GetList()) { if (nsCOMPtr<nsIFormFillController> controller = do_GetService("@mozilla.org/satchel/form-fill-controller;1")) { controller->SetControlledElement(this); @@ -7571,16 +7566,12 @@ void HTMLInputElement::GetWebkitEntries( aSequence.AppendElements(mFileData->mEntries); } -already_AddRefed<nsINodeList> HTMLInputElement::GetLabelsForBindings() { - return GetLabelsInternal(); -} - -already_AddRefed<nsINodeList> HTMLInputElement::GetLabelsInternal() { +already_AddRefed<nsINodeList> HTMLInputElement::GetLabels() { if (!IsLabelable()) { return nullptr; } - return nsGenericHTMLElement::LabelsInternal(); + return nsGenericHTMLElement::Labels(); } void HTMLInputElement::MaybeFireInputPasswordRemoved() { diff --git a/dom/html/HTMLInputElement.h b/dom/html/HTMLInputElement.h @@ -116,8 +116,8 @@ class HTMLInputElement final : public TextControlElement, public: using ConstraintValidation::GetValidationMessage; + using nsGenericHTMLFormControlElementWithState::GetForm; using nsGenericHTMLFormControlElementWithState::GetFormAction; - using nsGenericHTMLFormControlElementWithState::GetFormForBindings; using ValueSetterOption = TextControlState::ValueSetterOption; using ValueSetterOptions = TextControlState::ValueSetterOptions; @@ -531,8 +531,7 @@ class HTMLInputElement final : public TextControlElement, bool IsDraggingRange() const { return mIsDraggingRange; } void SetIndeterminate(bool aValue); - Element* GetListForBindings() const; - HTMLDataListElement* GetListInternal() const; + HTMLDataListElement* GetList() const; void GetMax(nsAString& aValue) { GetHTMLAttr(nsGkAtoms::max, aValue); } void SetMax(const nsAString& aValue, ErrorResult& aRv) { @@ -693,8 +692,7 @@ class HTMLInputElement final : public TextControlElement, // <input> element. bool StepsInputValue(const WidgetKeyboardEvent&) const; - already_AddRefed<nsINodeList> GetLabelsForBindings(); - already_AddRefed<nsINodeList> GetLabelsInternal(); + already_AddRefed<nsINodeList> GetLabels(); MOZ_CAN_RUN_SCRIPT void Select(); diff --git a/dom/html/HTMLLabelElement.cpp b/dom/html/HTMLLabelElement.cpp @@ -11,7 +11,6 @@ #include "mozilla/EventDispatcher.h" #include "mozilla/MouseEvents.h" -#include "mozilla/dom/HTMLFormElement.h" #include "mozilla/dom/HTMLLabelElementBinding.h" #include "mozilla/dom/MouseEventBinding.h" #include "mozilla/dom/ShadowRoot.h" @@ -37,30 +36,14 @@ JSObject* HTMLLabelElement::WrapNode(JSContext* aCx, NS_IMPL_ELEMENT_CLONE(HTMLLabelElement) -Element* HTMLLabelElement::GetFormForBindings() const { - return RetargetReferenceTargetForBindings(GetFormInternal()); -} - -HTMLFormElement* HTMLLabelElement::GetFormInternal() const { +HTMLFormElement* HTMLLabelElement::GetForm() const { // Not all labeled things have a form association. Stick to the ones that do. - const auto* formControl = - nsIFormControl::FromNodeOrNull(GetLabeledElementInternal()); + const auto* formControl = nsIFormControl::FromNodeOrNull(GetControl()); if (!formControl) { return nullptr; } - return formControl->GetFormInternal(); -} - -nsGenericHTMLElement* HTMLLabelElement::GetControlForBindings() const { - nsINode* retargeted = - nsContentUtils::Retarget(GetLabeledElementInternal(), this); - if (!retargeted) { - return nullptr; - } - Element* element = retargeted->AsElement(); - MOZ_ASSERT(element); - return static_cast<nsGenericHTMLElement*>(element); + return formControl->GetForm(); } void HTMLLabelElement::Focus(const FocusOptions& aOptions, @@ -73,7 +56,7 @@ void HTMLLabelElement::Focus(const FocusOptions& aOptions, } } - if (RefPtr<Element> elem = GetLabeledElementInternal()) { + if (RefPtr<Element> elem = GetLabeledElement()) { return elem->Focus(aOptions, aCallerType, aError); } } @@ -97,7 +80,7 @@ nsresult HTMLLabelElement::PostHandleEvent(EventChainPostVisitor& aVisitor) { } // Strong ref because event dispatch is going to happen. - RefPtr<Element> content = GetLabeledElementInternal(); + RefPtr<Element> content = GetLabeledElement(); if (!content || content->IsDisabled()) { return NS_OK; @@ -193,7 +176,7 @@ nsresult HTMLLabelElement::PostHandleEvent(EventChainPostVisitor& aVisitor) { Result<bool, nsresult> HTMLLabelElement::PerformAccesskey( bool aKeyCausesActivation, bool aIsTrustedEvent) { if (!aKeyCausesActivation) { - RefPtr<Element> element = GetLabeledElementInternal(); + RefPtr<Element> element = GetLabeledElement(); if (element) { return element->PerformAccesskey(aKeyCausesActivation, aIsTrustedEvent); } @@ -215,7 +198,7 @@ Result<bool, nsresult> HTMLLabelElement::PerformAccesskey( return true; } -nsGenericHTMLElement* HTMLLabelElement::GetLabeledElementInternal() const { +nsGenericHTMLElement* HTMLLabelElement::GetLabeledElement() const { nsAutoString elementId; if (!GetAttr(nsGkAtoms::_for, elementId)) { @@ -226,7 +209,17 @@ nsGenericHTMLElement* HTMLLabelElement::GetLabeledElementInternal() const { // We have a @for. The id has to be linked to an element in the same tree // and this element should be a labelable form control. - Element* element = GetAttrAssociatedElementInternal(nsGkAtoms::_for); + Element* element = nullptr; + + if (ShadowRoot* shadowRoot = GetContainingShadow()) { + element = shadowRoot->GetElementById(elementId); + } else if (Document* doc = GetUncomposedDoc()) { + element = doc->GetElementById(elementId); + } else { + element = + nsContentUtils::MatchElementId(SubtreeRoot()->AsContent(), elementId); + } + if (element && element->IsLabelable()) { return static_cast<nsGenericHTMLElement*>(element); } @@ -238,11 +231,8 @@ nsGenericHTMLElement* HTMLLabelElement::GetFirstLabelableDescendant() const { for (nsIContent* cur = nsINode::GetFirstChild(); cur; cur = cur->GetNextNode(this)) { Element* element = Element::FromNode(cur); - if (element) { - Element* referenceTarget = element->ResolveReferenceTarget(); - if (referenceTarget && referenceTarget->IsLabelable()) { - return static_cast<nsGenericHTMLElement*>(referenceTarget); - } + if (element && element->IsLabelable()) { + return static_cast<nsGenericHTMLElement*>(element); } } diff --git a/dom/html/HTMLLabelElement.h b/dom/html/HTMLLabelElement.h @@ -31,15 +31,14 @@ class HTMLLabelElement final : public nsGenericHTMLElement { // Element virtual bool IsInteractiveHTMLContent() const override { return true; } - Element* GetFormForBindings() const; - HTMLFormElement* GetFormInternal() const; + HTMLFormElement* GetForm() const; void GetHtmlFor(nsString& aHtmlFor) { GetHTMLAttr(nsGkAtoms::_for, aHtmlFor); } void SetHtmlFor(const nsAString& aHtmlFor) { SetHTMLAttr(nsGkAtoms::_for, aHtmlFor); } - nsGenericHTMLElement* GetControlForBindings() const; + nsGenericHTMLElement* GetControl() const { return GetLabeledElement(); } using nsGenericHTMLElement::Focus; virtual void Focus(const FocusOptions& aOptions, @@ -54,7 +53,7 @@ class HTMLLabelElement final : public nsGenericHTMLElement { bool aKeyCausesActivation, bool aIsTrustedEvent) override; virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override; - nsGenericHTMLElement* GetLabeledElementInternal() const; + nsGenericHTMLElement* GetLabeledElement() const; protected: virtual ~HTMLLabelElement(); diff --git a/dom/html/HTMLLegendElement.cpp b/dom/html/HTMLLegendElement.cpp @@ -128,16 +128,9 @@ HTMLLegendElement::LegendAlignValue HTMLLegendElement::LogicalAlign( } } -Element* HTMLLegendElement::GetFormForBindings() const { - HTMLFormElement* form = GetFormInternal(); - if (!form) { - return nullptr; - } - return RetargetReferenceTargetForBindings(form); -} -HTMLFormElement* HTMLLegendElement::GetFormInternal() const { +HTMLFormElement* HTMLLegendElement::GetForm() const { const auto* fieldsetControl = nsIFormControl::FromNodeOrNull(GetFieldSet()); - return fieldsetControl ? fieldsetControl->GetFormInternal() : nullptr; + return fieldsetControl ? fieldsetControl->GetForm() : nullptr; } JSObject* HTMLLegendElement::WrapNode(JSContext* aCx, diff --git a/dom/html/HTMLLegendElement.h b/dom/html/HTMLLegendElement.h @@ -62,8 +62,8 @@ class HTMLLegendElement final : public nsGenericHTMLElement { /** * WebIDL Interface */ - Element* GetFormForBindings() const; - HTMLFormElement* GetFormInternal() const; + + HTMLFormElement* GetForm() const; void GetAlign(DOMString& aAlign) { GetHTMLAttr(nsGkAtoms::align, aAlign); } @@ -72,7 +72,7 @@ class HTMLLegendElement final : public nsGenericHTMLElement { } nsINode* GetScopeChainParent() const override { - Element* form = GetFormInternal(); + Element* form = GetForm(); return form ? form : nsGenericHTMLElement::GetScopeChainParent(); } diff --git a/dom/html/HTMLOptionElement.cpp b/dom/html/HTMLOptionElement.cpp @@ -41,14 +41,9 @@ HTMLOptionElement::~HTMLOptionElement() = default; NS_IMPL_ELEMENT_CLONE(HTMLOptionElement) -mozilla::dom::Element* HTMLOptionElement::GetFormForBindings() { - HTMLFormElement* form = GetFormInternal(); - return RetargetReferenceTargetForBindings(form); -} - -mozilla::dom::HTMLFormElement* HTMLOptionElement::GetFormInternal() { +mozilla::dom::HTMLFormElement* HTMLOptionElement::GetForm() { HTMLSelectElement* selectControl = GetSelect(); - return selectControl ? selectControl->GetFormInternal() : nullptr; + return selectControl ? selectControl->GetForm() : nullptr; } void HTMLOptionElement::SetSelectedInternal(bool aValue, bool aNotify) { diff --git a/dom/html/HTMLOptionElement.h b/dom/html/HTMLOptionElement.h @@ -73,8 +73,7 @@ class HTMLOptionElement final : public nsGenericHTMLElement { SetHTMLBoolAttr(nsGkAtoms::disabled, aValue, aRv); } - Element* GetFormForBindings(); - HTMLFormElement* GetFormInternal(); + HTMLFormElement* GetForm(); void GetRenderedLabel(nsAString& aLabel) { if (!GetAttr(nsGkAtoms::label, aLabel) || aLabel.IsEmpty()) { diff --git a/dom/html/HTMLTextAreaElement.h b/dom/html/HTMLTextAreaElement.h @@ -188,9 +188,8 @@ class HTMLTextAreaElement final : public TextControlElement, void SetDisabled(bool aDisabled, ErrorResult& aError) { SetHTMLBoolAttr(nsGkAtoms::disabled, aDisabled, aError); } - // nsGenericHTMLFormControlElementWithState::GetForm* is fine - using nsGenericHTMLFormControlElementWithState::GetFormForBindings; - using nsGenericHTMLFormControlElementWithState::GetFormInternal; + // nsGenericHTMLFormControlElementWithState::GetForm is fine + using nsGenericHTMLFormControlElementWithState::GetForm; int32_t MaxLength() const { return GetIntAttr(nsGkAtoms::maxlength, -1); } int32_t UsedMaxLength() const final { return MaxLength(); } void SetMaxLength(int32_t aMaxLength, ErrorResult& aError) { diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp @@ -427,7 +427,7 @@ nsresult nsGenericHTMLElement::BindToTree(BindContext& aContext, // as well. nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots(); if (slots && slots->mLabelsList) { - slots->mLabelsList->ResetRoots(); + slots->mLabelsList->MaybeResetRoot(SubtreeRoot()); } return rv; @@ -475,7 +475,7 @@ void nsGenericHTMLElement::UnbindFromTree(UnbindContext& aContext) { // Invalidate .labels list. It will be repopulated when used the next time. nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots(); if (slots && slots->mLabelsList) { - slots->mLabelsList->ResetRoots(); + slots->mLabelsList->MaybeResetRoot(SubtreeRoot()); } } @@ -1742,21 +1742,17 @@ bool nsGenericHTMLElement::MatchLabelsElement(Element* aElement, int32_t aNamespaceID, nsAtom* aAtom, void* aData) { HTMLLabelElement* element = HTMLLabelElement::FromNode(aElement); - return element && element->GetLabeledElementInternal() == aData; + return element && element->GetControl() == aData; } -already_AddRefed<nsINodeList> nsGenericHTMLElement::LabelsForBindings() { - return LabelsInternal(); -} - -already_AddRefed<nsINodeList> nsGenericHTMLElement::LabelsInternal() { +already_AddRefed<nsINodeList> nsGenericHTMLElement::Labels() { MOZ_ASSERT(IsLabelable(), "Labels() only allow labelable elements to use it."); nsExtendedDOMSlots* slots = ExtendedDOMSlots(); if (!slots->mLabelsList) { slots->mLabelsList = - new nsLabelsNodeList(this, SubtreeRoot(), MatchLabelsElement, nullptr); + new nsLabelsNodeList(SubtreeRoot(), MatchLabelsElement, nullptr, this); } RefPtr<nsLabelsNodeList> labels = slots->mLabelsList; @@ -1868,11 +1864,11 @@ void nsGenericHTMLFormElement::UnbindFromTree(UnbindContext& aContext) { } } - // We have to remove the form attribute observer if there was one. + // We have to remove the form id observer if there was one. // We will re-add one later if needed (during bind to tree). if (nsContentUtils::HasNonEmptyAttr(this, kNameSpaceID_None, nsGkAtoms::form)) { - RemoveFormAttributeObserver(); + RemoveFormIdObserver(); } } @@ -1915,6 +1911,17 @@ void nsGenericHTMLFormElement::BeforeSetAttr(int32_t aNameSpaceID, form->RemoveElement(this, false); } + + if (aName == nsGkAtoms::form) { + // If @form isn't set or set to the empty string, there were no observer + // so we don't have to remove it. + if (nsContentUtils::HasNonEmptyAttr(this, kNameSpaceID_None, + nsGkAtoms::form)) { + // The current form id observer is no longer needed. + // A new one may be added in AfterSetAttr. + RemoveFormIdObserver(); + } + } } return nsGenericHTMLElement::BeforeSetAttr(aNameSpaceID, aName, aValue, @@ -1956,22 +1963,18 @@ void nsGenericHTMLFormElement::AfterSetAttr( } if (aName == nsGkAtoms::form) { - bool hadOldValue = aOldValue && !aOldValue->GetAtomValue()->IsEmpty(); - bool hasNewValue = aValue && !aValue->GetAtomValue()->IsEmpty(); - if (hadOldValue || hasNewValue) { - if (!hadOldValue && hasNewValue) { - AddFormAttributeObserver(); + // We need a new form id observer. + DocumentOrShadowRoot* docOrShadow = + GetUncomposedDocOrConnectedShadowRoot(); + if (docOrShadow) { + Element* formIdElement = nullptr; + if (aValue && !aValue->IsEmptyString()) { + formIdElement = AddFormIdObserver(); } - // Fire the observer, which will update the form owner if necessary. - IDREFAttributeValueChanged(aName, aValue); - - if (hadOldValue && !hasNewValue) { - RemoveFormAttributeObserver(); - } - } else if (aValue && aValue->GetAtomValue()->IsEmpty()) { - // Ensure that empty @form value clears the form owner. - ClearForm(true, false); + // Because we have a new @form value (or no more @form), we have to + // update our form owner. + UpdateFormOwner(false, formIdElement); } } } @@ -1987,33 +1990,45 @@ void nsGenericHTMLFormElement::ForgetFieldSet(nsIContent* aFieldset) { } } -Element* nsGenericHTMLFormElement::AddFormAttributeObserver() { +Element* nsGenericHTMLFormElement::AddFormIdObserver() { MOZ_ASSERT(IsFormAssociatedElement()); nsAutoString formId; + DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot(); GetAttr(nsGkAtoms::form, formId); NS_ASSERTION(!formId.IsEmpty(), "@form value should not be the empty string!"); + RefPtr<nsAtom> atom = NS_Atomize(formId); - return AddAttrAssociatedElementObserver(nsGkAtoms::form, - FormAttributeUpdated); + return docOrShadow->AddIDTargetObserver(atom, FormIdUpdated, this, false); } -void nsGenericHTMLFormElement::RemoveFormAttributeObserver() { +void nsGenericHTMLFormElement::RemoveFormIdObserver() { MOZ_ASSERT(IsFormAssociatedElement()); - RemoveAttrAssociatedElementObserver(nsGkAtoms::form, FormAttributeUpdated); + DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot(); + if (!docOrShadow) { + return; + } + + nsAutoString formId; + GetAttr(nsGkAtoms::form, formId); + NS_ASSERTION(!formId.IsEmpty(), + "@form value should not be the empty string!"); + RefPtr<nsAtom> atom = NS_Atomize(formId); + + docOrShadow->RemoveIDTargetObserver(atom, FormIdUpdated, this, false); } /* static */ -bool nsGenericHTMLFormElement::FormAttributeUpdated(Element* aOldElement, - Element* aNewElement, - Element* thisElement) { - NS_ASSERTION(thisElement->IsHTMLElement(), - "thisElement should be an HTML element"); - +bool nsGenericHTMLFormElement::FormIdUpdated(Element* aOldElement, + Element* aNewElement, + void* aData) { nsGenericHTMLFormElement* element = - static_cast<nsGenericHTMLFormElement*>(thisElement); + static_cast<nsGenericHTMLFormElement*>(aData); + + NS_ASSERTION(element->IsHTMLElement(), "aData should be an HTML element"); + element->UpdateFormOwner(false, aNewElement); return true; @@ -2104,22 +2119,19 @@ void nsGenericHTMLFormElement::UpdateFormOwner(bool aBindToTree, Element* element = nullptr; if (aBindToTree) { - element = AddFormAttributeObserver(); + element = AddFormIdObserver(); } else { element = aFormIdElement; } - NS_ASSERTION( - !IsInComposedDoc() || - element == GetAttrAssociatedElementInternal(nsGkAtoms::form), - "element should be equals to the current element " - "associated via @form!"); + NS_ASSERTION(!IsInComposedDoc() || + element == GetUncomposedDocOrConnectedShadowRoot() + ->GetElementById(formId), + "element should be equals to the current element " + "associated with the id in @form!"); if (element && element->IsHTMLElement(nsGkAtoms::form) && - element->GetClosestNativeAnonymousSubtreeRoot() == - GetClosestNativeAnonymousSubtreeRoot() && - (StaticPrefs::dom_shadowdom_referenceTarget_enabled() || - element->GetContainingShadow() == GetContainingShadow())) { + nsContentUtils::IsInSameAnonymousTree(this, element)) { form = static_cast<HTMLFormElement*>(element); SetFormInternal(form, aBindToTree); } @@ -2627,14 +2639,6 @@ HTMLFieldSetElement* nsGenericHTMLFormControlElement::GetFieldSet() { return GetFieldSetInternal(); } -mozilla::dom::Element* nsGenericHTMLFormControlElement::GetFormForBindings() - const { - if (!mForm) { - return nullptr; - } - return RetargetReferenceTargetForBindings(mForm); -} - void nsGenericHTMLFormControlElement::SetForm(HTMLFormElement* aForm) { MOZ_ASSERT(aForm, "Don't pass null here"); NS_ASSERTION(!mForm, @@ -2849,19 +2853,12 @@ bool nsGenericHTMLFormControlElementWithState::ParseAttribute( } mozilla::dom::Element* -nsGenericHTMLFormControlElementWithState::GetPopoverTargetElementForBindings() - const { - return GetAttrAssociatedElementForBindings(nsGkAtoms::popovertarget); -} - -mozilla::dom::Element* -nsGenericHTMLFormControlElementWithState::GetPopoverTargetElementInternal() - const { - return GetAttrAssociatedElementInternal(nsGkAtoms::popovertarget); +nsGenericHTMLFormControlElementWithState::GetPopoverTargetElement() const { + return GetAttrAssociatedElement(nsGkAtoms::popovertarget); } -void nsGenericHTMLFormControlElementWithState:: - SetPopoverTargetElementForBindings(mozilla::dom::Element* aElement) { +void nsGenericHTMLFormControlElementWithState::SetPopoverTargetElement( + mozilla::dom::Element* aElement) { ExplicitlySetAttrElement(nsGkAtoms::popovertarget, aElement); } diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h @@ -681,8 +681,7 @@ class nsGenericHTMLElement : public nsGenericHTMLElementBase { static bool MatchLabelsElement(Element* aElement, int32_t aNamespaceID, nsAtom* aAtom, void* aData); - already_AddRefed<nsINodeList> LabelsForBindings(); - already_AddRefed<nsINodeList> LabelsInternal(); + already_AddRefed<nsINodeList> Labels(); static bool LegacyTouchAPIEnabled(JSContext* aCx, JSObject* aObj); @@ -1121,26 +1120,25 @@ class nsGenericHTMLFormElement : public nsGenericHTMLElement { void UpdateFieldSet(bool aNotify); /** - * Add a form attribute observer which will observe when the element - * associated with + * Add a form id observer which will observe when the element with the id in * @form will change. * * @return The element associated with the current id in @form (may be null). */ - Element* AddFormAttributeObserver(); + Element* AddFormIdObserver(); /** - * Remove the form attribute attribute observer. + * Remove the form id observer. */ - void RemoveFormAttributeObserver(); + void RemoveFormIdObserver(); /** - * This method is a a callback for AttrAssociatedElementUpdated (from - * Element). It will be called each time the element associated with @form + * This method is a a callback for IDTargetObserver (from Document). + * It will be called each time the element associated with the id in @form * changes. */ - static bool FormAttributeUpdated(Element* aOldElement, Element* aNewElement, - Element* thisElement); + static bool FormIdUpdated(Element* aOldElement, Element* aNewElement, + void* aData); // Returns true if the event should not be handled from GetEventTargetParent bool IsElementDisabledForEvents(mozilla::WidgetEvent* aEvent, @@ -1204,8 +1202,7 @@ class nsGenericHTMLFormControlElement : public nsGenericHTMLFormElement, // nsIFormControl mozilla::dom::HTMLFieldSetElement* GetFieldSet() override; - mozilla::dom::Element* GetFormForBindings() const override; - mozilla::dom::HTMLFormElement* GetFormInternal() const override; + mozilla::dom::HTMLFormElement* GetForm() const override { return mForm; } void SetForm(mozilla::dom::HTMLFormElement* aForm) override; void ClearForm(bool aRemoveFromForm, bool aUnbindOrDelete) override; @@ -1220,6 +1217,7 @@ class nsGenericHTMLFormControlElement : public nsGenericHTMLFormElement, bool DoesReadWriteApply() const override; void SetFormInternal(mozilla::dom::HTMLFormElement* aForm, bool aBindToTree) override; + mozilla::dom::HTMLFormElement* GetFormInternal() const override; mozilla::dom::HTMLFieldSetElement* GetFieldSetInternal() const override; void SetFieldSetInternal( mozilla::dom::HTMLFieldSetElement* aFieldset) override; @@ -1268,9 +1266,8 @@ class nsGenericHTMLFormControlElementWithState nsAttrValue& aResult) override; // PopoverInvokerElement - mozilla::dom::Element* GetPopoverTargetElementForBindings() const; - mozilla::dom::Element* GetPopoverTargetElementInternal() const; - void SetPopoverTargetElementForBindings(mozilla::dom::Element*); + mozilla::dom::Element* GetPopoverTargetElement() const; + void SetPopoverTargetElement(mozilla::dom::Element*); void GetPopoverTargetAction(nsAString& aValue) const { GetHTMLEnumAttr(nsGkAtoms::popovertargetaction, aValue); } diff --git a/dom/html/nsIConstraintValidation.cpp b/dom/html/nsIConstraintValidation.cpp @@ -101,7 +101,7 @@ void nsIConstraintValidation::SetValidityState(ValidityStateType aState, nsCOMPtr<nsIFormControl> formCtrl = do_QueryInterface(this); NS_ASSERTION(formCtrl, "This interface should be used by form elements!"); - if (HTMLFormElement* form = formCtrl->GetFormInternal()) { + if (HTMLFormElement* form = formCtrl->GetForm()) { form->UpdateValidity(IsValid()); } if (HTMLFieldSetElement* fieldSet = formCtrl->GetFieldSet()) { @@ -124,7 +124,7 @@ void nsIConstraintValidation::SetBarredFromConstraintValidation(bool aBarred) { // If the element is going to be barred from constraint validation, we can // inform the form and fieldset that we are now valid. Otherwise, we are now // invalid. - if (HTMLFormElement* form = formCtrl->GetFormInternal()) { + if (HTMLFormElement* form = formCtrl->GetForm()) { form->UpdateValidity(aBarred); } HTMLFieldSetElement* fieldSet = formCtrl->GetFieldSet(); diff --git a/dom/html/nsIFormControl.h b/dom/html/nsIFormControl.h @@ -111,16 +111,10 @@ class nsIFormControl : public nsISupports { virtual mozilla::dom::HTMLFieldSetElement* GetFieldSet() = 0; /** - * Get the form for this form control, retargeted to the appropriate scope. - * @return the form - */ - virtual mozilla::dom::Element* GetFormForBindings() const = 0; - - /** * Get the form for this form control. * @return the form */ - virtual mozilla::dom::HTMLFormElement* GetFormInternal() const = 0; + virtual mozilla::dom::HTMLFormElement* GetForm() const = 0; /** * Set the form for this form control. @@ -291,7 +285,7 @@ bool nsIFormControl::IsConceptButton() const { } bool nsIFormControl::IsButtonControl() const { - return IsConceptButton() && (!GetFormInternal() || !IsSubmitControl()); + return IsConceptButton() && (!GetForm() || !IsSubmitControl()); } bool nsIFormControl::AllowDraggableChildren() const { diff --git a/dom/webidl/Element.webidl b/dom/webidl/Element.webidl @@ -282,7 +282,7 @@ dictionary ShadowRootInit { // https://github.com/whatwg/dom/pull/1353 [Pref="dom.shadowdom.referenceTarget.enabled"] - DOMString? referenceTarget; + DOMString referenceTarget; }; // https://dom.spec.whatwg.org/#element diff --git a/dom/webidl/ElementInternals.webidl b/dom/webidl/ElementInternals.webidl @@ -17,8 +17,8 @@ interface ElementInternals { undefined setFormValue((File or USVString or FormData)? value, optional (File or USVString or FormData)? state); - [Throws, BinaryName=formForBindings] - readonly attribute Element? form; + [Throws] + readonly attribute HTMLFormElement? form; [Throws] undefined setValidity(optional ValidityStateFlags flags = {}, diff --git a/dom/webidl/HTMLButtonElement.webidl b/dom/webidl/HTMLButtonElement.webidl @@ -17,8 +17,8 @@ interface HTMLButtonElement : HTMLElement { [CEReactions, SetterThrows, Pure] attribute boolean disabled; - [Pure, BinaryName=formForBindings] - readonly attribute Element? form; + [Pure] + readonly attribute HTMLFormElement? form; [CEReactions, SetterThrows, Pure] attribute DOMString formAction; [CEReactions, SetterThrows, Pure] @@ -44,10 +44,9 @@ interface HTMLButtonElement : HTMLElement { boolean reportValidity(); undefined setCustomValidity(DOMString error); - [BinaryName=labelsForBindings] readonly attribute NodeList labels; - [Pref="dom.element.commandfor.enabled", BinaryName="commandForElementForBindings", CEReactions] attribute Element? commandForElement; + [Pref="dom.element.commandfor.enabled", CEReactions] attribute Element? commandForElement; [Pref="dom.element.commandfor.enabled", CEReactions] attribute DOMString command; }; diff --git a/dom/webidl/HTMLFieldSetElement.webidl b/dom/webidl/HTMLFieldSetElement.webidl @@ -17,8 +17,7 @@ interface HTMLFieldSetElement : HTMLElement { [CEReactions, SetterThrows] attribute boolean disabled; - [BinaryName=formForBindings] - readonly attribute Element? form; + readonly attribute HTMLFormElement? form; [CEReactions, SetterThrows] attribute DOMString name; diff --git a/dom/webidl/HTMLInputElement.webidl b/dom/webidl/HTMLInputElement.webidl @@ -42,8 +42,7 @@ interface HTMLInputElement : HTMLElement { attribute DOMString dirName; [CEReactions, Pure, SetterThrows] attribute boolean disabled; - [BinaryName=formForBindings] - readonly attribute Element? form; + readonly attribute HTMLFormElement? form; [Pure] attribute FileList? files; [CEReactions, Pure, SetterThrows] @@ -60,8 +59,8 @@ interface HTMLInputElement : HTMLElement { attribute unsigned long height; [Pure] attribute boolean indeterminate; - [Pure, BinaryName=listForBindings] - readonly attribute Element? list; + [Pure] + readonly attribute HTMLDataListElement? list; [CEReactions, Pure, SetterThrows] attribute DOMString max; [CEReactions, Pure, SetterThrows] @@ -116,7 +115,6 @@ interface HTMLInputElement : HTMLElement { boolean reportValidity(); undefined setCustomValidity(DOMString error); - [BinaryName=labelsForBindings] readonly attribute NodeList? labels; undefined select(); diff --git a/dom/webidl/HTMLLabelElement.webidl b/dom/webidl/HTMLLabelElement.webidl @@ -15,8 +15,8 @@ interface HTMLLabelElement : HTMLElement { [HTMLConstructor] constructor(); - [BinaryName=formForBindings] readonly attribute Element? form; + readonly attribute HTMLFormElement? form; [CEReactions] attribute DOMString htmlFor; - [BinaryName="controlForBindings"] readonly attribute HTMLElement? control; + readonly attribute HTMLElement? control; }; diff --git a/dom/webidl/HTMLLegendElement.webidl b/dom/webidl/HTMLLegendElement.webidl @@ -17,7 +17,7 @@ interface HTMLLegendElement : HTMLElement { [HTMLConstructor] constructor(); - [BinaryName=formForBindings] readonly attribute Element? form; + readonly attribute HTMLFormElement? form; }; // http://www.whatwg.org/specs/web-apps/current-work/#other-elements,-attributes-and-apis diff --git a/dom/webidl/HTMLMeterElement.webidl b/dom/webidl/HTMLMeterElement.webidl @@ -28,6 +28,5 @@ interface HTMLMeterElement : HTMLElement { attribute double high; [CEReactions, SetterThrows] attribute double optimum; - [BinaryName=labelsForBindings] readonly attribute NodeList labels; }; diff --git a/dom/webidl/HTMLObjectElement.webidl b/dom/webidl/HTMLObjectElement.webidl @@ -25,8 +25,8 @@ interface HTMLObjectElement : HTMLElement { attribute DOMString name; [CEReactions, Pure, SetterThrows] attribute DOMString useMap; - [Pure, BinaryName=formForBindings] - readonly attribute Element? form; + [Pure] + readonly attribute HTMLFormElement? form; [CEReactions, Pure, SetterThrows] attribute DOMString width; [CEReactions, Pure, SetterThrows] diff --git a/dom/webidl/HTMLOptionElement.webidl b/dom/webidl/HTMLOptionElement.webidl @@ -18,8 +18,7 @@ interface HTMLOptionElement : HTMLElement { [CEReactions, SetterThrows] attribute boolean disabled; - [BinaryName=formForBindings] - readonly attribute Element? form; + readonly attribute HTMLFormElement? form; [CEReactions, SetterThrows] attribute DOMString label; [CEReactions, SetterThrows] diff --git a/dom/webidl/HTMLOutputElement.webidl b/dom/webidl/HTMLOutputElement.webidl @@ -18,8 +18,7 @@ interface HTMLOutputElement : HTMLElement { [PutForwards=value, Constant] readonly attribute DOMTokenList htmlFor; - [BinaryName=formForBindings] - readonly attribute Element? form; + readonly attribute HTMLFormElement? form; [CEReactions, SetterThrows, Pure] attribute DOMString name; @@ -38,6 +37,5 @@ interface HTMLOutputElement : HTMLElement { boolean reportValidity(); undefined setCustomValidity(DOMString error); - [BinaryName=labelsForBindings] readonly attribute NodeList labels; }; diff --git a/dom/webidl/HTMLProgressElement.webidl b/dom/webidl/HTMLProgressElement.webidl @@ -20,6 +20,5 @@ interface HTMLProgressElement : HTMLElement { [CEReactions, SetterThrows] attribute double max; readonly attribute double position; - [BinaryName=labelsForBindings] readonly attribute NodeList labels; }; diff --git a/dom/webidl/HTMLSelectElement.webidl b/dom/webidl/HTMLSelectElement.webidl @@ -15,8 +15,8 @@ interface HTMLSelectElement : HTMLElement { attribute DOMString autocomplete; [CEReactions, SetterThrows, Pure] attribute boolean disabled; - [Pure, BinaryName=formForBindings] - readonly attribute Element? form; + [Pure] + readonly attribute HTMLFormElement? form; [CEReactions, SetterThrows, Pure] attribute boolean multiple; [CEReactions, SetterThrows, Pure] @@ -59,7 +59,6 @@ interface HTMLSelectElement : HTMLElement { [Throws, Pref="dom.select.showPicker.enabled"] undefined showPicker(); - [BinaryName=labelsForBindings] readonly attribute NodeList labels; // https://www.w3.org/Bugs/Public/show_bug.cgi?id=20720 diff --git a/dom/webidl/HTMLTemplateElement.webidl b/dom/webidl/HTMLTemplateElement.webidl @@ -23,5 +23,5 @@ interface HTMLTemplateElement : HTMLElement { [CEReactions, SetterThrows] attribute boolean shadowRootSerializable; [CEReactions, SetterThrows, Pref="dom.shadowdom.referenceTarget.enabled"] - attribute DOMString? shadowRootReferenceTarget; + attribute DOMString shadowRootReferenceTarget; }; diff --git a/dom/webidl/HTMLTextAreaElement.webidl b/dom/webidl/HTMLTextAreaElement.webidl @@ -26,8 +26,8 @@ interface HTMLTextAreaElement : HTMLElement { attribute DOMString dirName; [CEReactions, SetterThrows, Pure] attribute boolean disabled; - [Pure, BinaryName=formForBindings] - readonly attribute Element? form; + [Pure] + readonly attribute HTMLFormElement? form; // attribute DOMString inputMode; [CEReactions, SetterThrows, Pure] attribute long maxLength; @@ -62,7 +62,6 @@ interface HTMLTextAreaElement : HTMLElement { boolean reportValidity(); undefined setCustomValidity(DOMString error); - [BinaryName=labelsForBindings] readonly attribute NodeList labels; undefined select(); diff --git a/dom/webidl/PopoverInvokerElement.webidl b/dom/webidl/PopoverInvokerElement.webidl @@ -8,6 +8,6 @@ */ interface mixin PopoverInvokerElement { - [CEReactions, BinaryName="popoverTargetElementForBindings"] attribute Element? popoverTargetElement; + [CEReactions] attribute Element? popoverTargetElement; [CEReactions] attribute DOMString popoverTargetAction; }; diff --git a/dom/webidl/ShadowRoot.webidl b/dom/webidl/ShadowRoot.webidl @@ -32,7 +32,7 @@ interface ShadowRoot : DocumentFragment attribute EventHandler onslotchange; [Pref="dom.shadowdom.referenceTarget.enabled"] - attribute DOMString? referenceTarget; + attribute DOMString referenceTarget; Element? getElementById(DOMString elementId); diff --git a/dom/xul/nsXULElement.cpp b/dom/xul/nsXULElement.cpp @@ -1389,18 +1389,6 @@ nsresult nsXULPrototypeElement::SetAttrAt(uint32_t aPos, mAttributes[aPos].mValue.ParseAtom(aValue); return NS_OK; - } else if (mAttributes[aPos].mName.Equals(nsGkAtoms::aria_controls) || - mAttributes[aPos].mName.Equals(nsGkAtoms::aria_describedby) || - mAttributes[aPos].mName.Equals(nsGkAtoms::aria_details) || - mAttributes[aPos].mName.Equals(nsGkAtoms::aria_errormessage) || - mAttributes[aPos].mName.Equals(nsGkAtoms::aria_flowto) || - mAttributes[aPos].mName.Equals(nsGkAtoms::aria_labelledby) || - mAttributes[aPos].mName.Equals(nsGkAtoms::aria_owns) || - mAttributes[aPos].mName.Equals(nsGkAtoms::_for) || - mAttributes[aPos].mName.Equals(nsGkAtoms::headers)) { - mAttributes[aPos].mValue.ParseAtomArray(aValue); - - return NS_OK; } else if (mAttributes[aPos].mName.Equals(nsGkAtoms::is)) { // Store is as atom. mAttributes[aPos].mValue.ParseAtom(aValue); diff --git a/layout/forms/nsRangeFrame.cpp b/layout/forms/nsRangeFrame.cpp @@ -409,7 +409,7 @@ void nsRangeFrame::UpdateForValueChange() { nsTArray<Decimal> nsRangeFrame::TickMarks() { nsTArray<Decimal> tickMarks; auto& input = InputElement(); - auto* list = input.GetListInternal(); + auto* list = input.GetList(); if (!list) { return tickMarks; } diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/aria-labelledby.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/aria-labelledby.html.ini @@ -0,0 +1,12 @@ +[aria-labelledby.html] + [Label 1] + expected: FAIL + + [Label 2] + expected: FAIL + + [Label 3] + expected: FAIL + + [aria-labelledby] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/commandfor.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/commandfor.html.ini @@ -1,2 +1,9 @@ [commandfor.html] - prefs: [dom.element.commandfor.enabled:true] + [Shadow root reference target works with commandfor attribute.] + expected: FAIL + + [Shadow root reference target works with commandfor attribute via options.] + expected: FAIL + + [Shadow root reference target works with .commandForElement property.] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/dom-mutation.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/dom-mutation.html.ini @@ -1,6 +1,21 @@ [dom-mutation.html] - [.labels property is updated when for attribute changes on label outside of shadow root] + [New referenced element prepended to the shadow supercedes the existing label] expected: FAIL - [.labels property is updated when ID changes on input] + [Changing the reference target ID updates the computed label] + expected: FAIL + + [Changing the ID of the referenced element results in an empty computed label] + expected: FAIL + + [Removing the referenced element results in an empty computed label] + expected: FAIL + + [The existing label supercedes new element (with same id as the existing label) appended to the shadow] + expected: FAIL + + [Changing the nested referenceTarget to reference a different element updates the computed label] + expected: FAIL + + [Changing the ID of the nested referenced element results in an empty computed label] expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/form.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/form.html.ini @@ -0,0 +1,15 @@ +[form.html] + [Reference target works with form attribute.] + expected: FAIL + + [Reference target works with form attribute via options.] + expected: FAIL + + [Reference target works with setAttribute('form')] + expected: FAIL + + [Reference target works with form-associated custom element.] + expected: FAIL + + [Reference target works with nested shadow trees.] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/label-descendant.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/label-descendant.html.ini @@ -0,0 +1,2 @@ +[label-descendant.html] + expected: ERROR diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/label-for.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/label-for.html.ini @@ -1 +1,2 @@ [label-for.html] + expected: ERROR diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/popovertarget.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/popovertarget.html.ini @@ -0,0 +1,9 @@ +[popovertarget.html] + [Shadow root reference target works with popovertarget attribute.] + expected: FAIL + + [Shadow root reference target works with popovertarget attribute via options.] + expected: FAIL + + [Shadow root reference target works with .popoverTargetElement property.] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection-idl-setters.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection-idl-setters.html.ini @@ -0,0 +1,4860 @@ +[property-reflection-idl-setters.html] + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [button.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [button.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [input.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [input.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [input.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [input.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [input.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [input.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [input.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [input.popoverTargetElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [meter.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [meter.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [meter.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [meter.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [meter.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [meter.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [meter.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [output.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [output.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [output.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [output.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [output.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [output.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [output.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [progress.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [progress.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [progress.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [progress.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [progress.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [progress.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [progress.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [select.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [select.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [select.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [select.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [select.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [select.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [select.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [textarea.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [textarea.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [textarea.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [textarea.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [textarea.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [textarea.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [textarea.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [div.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [div.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [div.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [div.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [div.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [div.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [div.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [object.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [object.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [object.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [object.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [object.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [object.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [object.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [label.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [label.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [label.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [label.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [label.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [label.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [label.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [fieldset.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [fieldset.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [legend.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [legend.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [legend.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [legend.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [legend.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [legend.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [legend.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [option.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [option.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [option.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [option.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [option.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [option.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [option.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [datalist.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [datalist.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [datalist.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [datalist.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [datalist.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [datalist.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [datalist.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to button with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to input with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to meter with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to output with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to progress with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to select with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to textarea with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to div with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to object with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to label with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to fieldset with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to legend with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to option with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to datalist with reference target] + expected: FAIL + + [form.ariaControlsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [form.ariaActiveDescendantElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL + + [form.ariaDescribedByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [form.ariaDetailsElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [form.ariaErrorMessageElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [form.ariaFlowToElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [form.ariaLabelledByElements has IDL setter behavior ReflectsHostInArray when pointing to form with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to button with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to input with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to meter with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to output with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to progress with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to select with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to textarea with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to div with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to object with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to label with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to fieldset with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to legend with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to option with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to datalist with reference target] + expected: FAIL + + [button.commandForElement has IDL setter behavior ReflectsHost when pointing to form with reference target] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection-imperative-setup.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection-imperative-setup.html.ini @@ -0,0 +1,45 @@ +[property-reflection-imperative-setup.html] + [button.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL + + [input.list has reflection behavior ReflectsHostReadOnly when pointing to datalist with reference target with imperative setup] + expected: FAIL + + [input.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL + + [output.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL + + [select.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL + + [textarea.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL + + [object.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to button with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to input with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to meter with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to output with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to progress with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to select with reference target with imperative setup] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to textarea with reference target with imperative setup] + expected: FAIL + + [fieldset.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target with imperative setup] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/property-reflection.html.ini @@ -1,2 +1,49 @@ [property-reflection.html] prefs: [accessibility.ARIAElementReflection.enabled:true] + [The .labels property of the referenced input element should point to the referencing label element] + expected: FAIL + + [button.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL + + [input.list has reflection behavior ReflectsHostReadOnly when pointing to datalist with reference target] + expected: FAIL + + [input.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL + + [output.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL + + [select.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL + + [textarea.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL + + [object.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to button with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to input with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to meter with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to output with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to progress with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to select with reference target] + expected: FAIL + + [label.control has reflection behavior ReflectsHostReadOnly when pointing to textarea with reference target] + expected: FAIL + + [fieldset.form has reflection behavior ReflectsHostReadOnly when pointing to form with reference target] + expected: FAIL diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/reference-target-basics.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/reference-target-basics.html.ini @@ -0,0 +1,6 @@ +[reference-target-basics.html] + [ShadowRoot.referenceTarget defaults to null when shadow is created declaratively] + expected: FAIL + + [ShadowRoot.referenceTarget defaults to null when shadow is created imperatively] + expected: FAIL diff --git a/testing/web-platform/tests/shadow-dom/reference-target/tentative/dom-mutation.html b/testing/web-platform/tests/shadow-dom/reference-target/tentative/dom-mutation.html @@ -33,7 +33,6 @@ promise_test(async t => { const test_container = await setup_test(); const host1 = test_container.querySelector("#host1"); const label1 = host1.shadowRoot.querySelector("#label1"); - label1.id = "new_id"; assert_equals(await test_driver.get_computed_label(input1), ""); }, "Changing the ID of the referenced element results in an empty computed label"); @@ -110,93 +109,7 @@ promise_test(async t => { real_label1.id = "new_id"; assert_equals(await test_driver.get_computed_label(input1), ""); }, "Changing the ID of the nested referenced element results in an empty computed label"); -</script> - -<label id="label2" for="x-input2">Input 2</label> -<x-input2 id="x-input2"> - <template shadowrootmode="open" shadowrootreferencetarget="input2"> - <input id="input2"> - </template> -</x-input2> - -<script> -promise_test(async t => { - const x_input = document.getElementById('x-input2'); - const input = x_input.shadowRoot.getElementById('input2'); - const label = document.getElementById('label2'); - label.htmlFor = ''; - assert_array_equals(Array.from(input['labels']), []); - - label.htmlFor = x_input.id; - assert_array_equals(Array.from(input['labels']), [label]); -}, ".labels property is updated when for attribute changes on label outside of shadow root"); </script> - -<label id="label3" for="x-input3">Input 3</label> -<x-input3 id="x-input3"> - <template shadowrootmode="open" shadowrootreferencetarget="input3"> - <input id="input3"> - </template> -</x-input3> - -<script> -promise_test(async t => { - const x_input = document.getElementById('x-input3'); - const input = x_input.shadowRoot.getElementById('input3'); - const label = document.getElementById('label3'); - - x_input.removeAttribute('id'); - assert_array_equals(Array.from(input['labels']), []); - - x_input.id = label.htmlFor; - assert_array_equals(Array.from(input['labels']), [label]); -}, ".labels property is updated when ID changes on input"); -</script> - -<label id="label4" for="x-input4">Input 4</label> -<x-input4 id="x-input4"> - <template shadowrootmode="open" shadowrootreferencetarget="input4"> - <input id="input4"> - </template> -</x-input4> - -<script> -promise_test(async t => { - const x_input = document.getElementById('x-input4'); - const input = x_input.shadowRoot.getElementById('input4'); - const label = document.getElementById('label4'); - - x_input.shadowRoot.referenceTarget = null; - assert_array_equals(Array.from(input['labels']), []); - - x_input.shadowRoot.referenceTarget = input.id; - assert_array_equals(Array.from(input['labels']), [label]); -}, ".labels property is updated when reference target changes on shadow root"); -</script> - -<label id="label5-A">A - <x-input5 id="x-input5"> - <template shadowrootmode="open" shadowrootreferencetarget="input5"> - <input id="input5"> - </template> - </x-input5> -</label> -<label id="label5-B"></label> - -<script> -promise_test(async t => { - const x_input = document.getElementById('x-input5'); - const input = x_input.shadowRoot.getElementById('input5'); - const A = document.getElementById('label5-A'); - - assert_array_equals(Array.from(input['labels']), [A]); - - const B = document.getElementById('label5-B'); - B.appendChild(x_input); - assert_array_equals(Array.from(input['labels']), [B]); -}, ".labels property is updated when wrapped label changes"); -</script> - </body> </html> diff --git a/testing/web-platform/tests/shadow-dom/reference-target/tentative/form.html b/testing/web-platform/tests/shadow-dom/reference-target/tentative/form.html @@ -168,209 +168,5 @@ assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form."); }, "Reference target works with nested shadow trees."); </script> - - - <button id="reset-button-6" type="reset" form="fancy-form-6"></button> - - - <script> - test(function() { - const resetButton = document.getElementById("reset-button-6"); - assert_equals(resetButton.form, null, "The reset button doesn't have a form association before the form is created."); - - // Construct disconnected custom element with shadow root - const fancyForm = document.createElement("fancy-form-6"); - fancyForm.id = "fancy-form-6"; - fancyForm.attachShadow({ mode: "open", referenceTarget: "real-form" }); - const input = document.createElement("input"); - input.id = "input-in-shadow"; - input.setAttribute("value", "default value"); - input.setAttribute("form", "real-form"); - fancyForm.shadowRoot.appendChild(input); - assert_equals(input.form, null, "The inner input doesn't have a form association before the form is created."); - - const realForm = document.createElement("form"); - realForm.id = "real-form"; - fancyForm.shadowRoot.appendChild(realForm); - - assert_equals(realForm.elements.length, 0, "When the form is in disconnected DOM, it has no associated form elements."); - assert_equals(resetButton.form, null, "The reset button should not have a form before the form is connected to the document."); - assert_equals(input.form, null, "The inner input element should not have a form before the form is connected to the document."); - - // Connect the custom element to the document - resetButton.after(fancyForm); - - assert_equals(realForm.elements.length, 2, "Once the form is connected, it has two associated form elements."); - assert_equals(realForm.elements[0], resetButton, "The first element should be the reset button outside the shadow root."); - assert_equals(realForm.elements[1], input, "The second element should be the input element inside the shadow root."); - assert_equals(resetButton.form, fancyForm, "The reset button should show the shadow host as its form property."); - assert_equals(input.form, realForm, "The inner input element should show the actual form element as its form property."); - input.value = "new value"; - assert_equals(input.value, "new value", "Before the reset button is clicked, the input element's value should be 'new value'."); - resetButton.click(); - assert_equals(input.value, "default value", "After the reset button is clicked, the input element's value should be 'default value'.") - - // Setting referenceTarget to null causes the reset button to no longer be - // associated with the form, but the inner input remains associated. - fancyForm.shadowRoot.referenceTarget = null; - assert_equals(realForm.elements.length, 1, "Once the reference target is set to null, the form should only have one form element."); - assert_equals(realForm.elements[0], input, "The sole element associated with the form should be the input element."); - assert_equals(resetButton.form, null, "The reset button should have null as its form property."); - assert_equals(input.form, realForm, "The inner input element should still have the form as its form property."); - - input.value = "second new value"; - assert_equals("second new value", input.value, "After the reference target is re-set, before the reset button is clicked, the input element's value should be 'new value'."); - resetButton.click(); - assert_equals("second new value", input.value, "After the reference target is re-set, after the reset button is clicked, the input element's value should still be 'new new value'.") - - realForm.remove(); - assert_equals(realForm.elements.length, 0, "Before the inner-fancy-form containing the real form is inserted, it should have no associated form elements."); - assert_equals(input.form, null, "After the real form is removed from the first shadow root, the input should have no associated form"); - assert_equals(resetButton.form, null, "After the real form is removed from the first shadow root, the reset button should have no associated form."); - - // Adding a form nested inside another fancy-form with the appropriate - // referenceTarget values still causes the form association to be set up - const innerFancyForm = document.createElement('fancy-form-6'); - innerFancyForm.id = "inner-fancy-form"; - innerFancyForm.attachShadow({mode: "open", referenceTarget: "real-form"}); - innerFancyForm.shadowRoot.appendChild(realForm); - fancyForm.shadowRoot.referenceTarget = "inner-fancy-form"; - fancyForm.shadowRoot.appendChild(innerFancyForm); - assert_equals(realForm.elements.length, 1, "After the inner-fancy-form is connected, the real form should have 1 associated form elements"); - assert_equals(realForm.elements[0], resetButton, "The associated element should be the reset button outside the shadow root."); - assert_equals(resetButton.form, fancyForm, "The reset button should have the outer fancy-form-6 as its form property."); - assert_equals(input.form, null, "The inner input element should have null as its form property."); - - input.setAttribute("form", "inner-fancy-form"); - assert_equals(realForm.elements.length, 2, "After the input's form attribute is updated, the real form should have 2 associated form elements"); - assert_equals(realForm.elements[0], resetButton, "The first associated element should be the reset button outside the shadow root."); - assert_equals(realForm.elements[1], input, "The second associated element should be the input inside the first shadow root."); - assert_equals(resetButton.form, fancyForm, "The reset button should have the outer fancy-form-6 as its form property."); - assert_equals(input.form, innerFancyForm, "The inner input element should have the inner fancy-form-6 as its form property."); - - input.value = "third new value"; - assert_equals("third new value", input.value, "After the form is added to the nested shadow root, before the reset button is clicked, the input element's value should be 'new value'."); - resetButton.click(); - assert_equals("default value", input.value, "After the form is added to the nested shadow root, after the reset button is clicked, the input element's value should still be 'new new value'.") - - // Prepending an element with the same ID as the inner form causes all form associations to be reset to null - const fakeForm = document.createElement("div"); - fakeForm.id = "real-form"; - realForm.before(fakeForm); - assert_equals(realForm.elements.length, 0, "After an element with the same ID is inserted, the form should have no associated form elements."); - assert_equals(input.form, null, "After an element with the same ID as the form is inserted, the input should have no associated form"); - assert_equals(resetButton.form, null, "After an element with the same ID as the form is inserted, the reset button should have no associated form."); - - // Changing the ID of the inner form, and the reference target of the inner-fancy-form, causes the form associations to be recreated. - realForm.id = "real-form-redux"; - innerFancyForm.shadowRoot.referenceTarget = "real-form-redux"; - assert_equals(realForm.elements.length, 2, "After the ID of the inner form and reference target of inner-fancy-form are changed, the real form should have 2 associated form elements"); - assert_equals(realForm.elements[0], resetButton, "After the ID of the inner form and reference target of inner-fancy-form are changed, the first associated element should be the reset button outside the shadow root."); - assert_equals(realForm.elements[1], input, "After the ID of the inner form and reference target of inner-fancy-form are changed, the second associated element should be the input inside the first shadow root."); - assert_equals(resetButton.form, fancyForm, "After the ID of the inner form and reference target of inner-fancy-form are changed, the reset button should have the outer fancy-form-6 as its form property."); - assert_equals(input.form, innerFancyForm, "After the ID of the inner form and reference target of inner-fancy-form are changed, the inner input element should have the inner fancy-form-6 as its form property."); - - // Prepending an element with the same ID as the inner-fancy-form causes all form associations to be reset to null again - const fakeInnerFancyForm = document.createElement("div"); - fakeInnerFancyForm.id = "inner-fancy-form" - innerFancyForm.before(fakeInnerFancyForm); - - assert_equals(realForm.elements.length, 0, "After an element with the same ID as its shadow host is inserted, the form should have no associated form elements."); - assert_equals(input.form, null, "After an element with the same ID as the form's shadow host is inserted, the input should have no associated form"); - assert_equals(resetButton.form, null, "After an element with the same ID as the form's shadow host is inserted, the reset button should have no associated form."); - - // Removing that element should cause the form associations to be re-created - fakeInnerFancyForm.remove(); - assert_equals(realForm.elements.length, 2, "After the fake inner-fancy-form is removed, the real form should have 2 associated form elements"); - assert_equals(realForm.elements[0], resetButton, "After the fake inner-fancy-form is removed, the first associated element should be the reset button outside the shadow root."); - assert_equals(realForm.elements[1], input, "After the fake inner-fancy-form is removed, the second associated element should be the input inside the first shadow root."); - assert_equals(resetButton.form, fancyForm, "After the fake inner-fancy-form is removed, the reset button should have the outer fancy-form-6 as its form property."); - assert_equals(input.form, innerFancyForm, "After the fake inner-fancy-form is removed, the inner input element should have the inner fancy-form-6 as its form property."); - - // Removing the ID of the real form causes all form associations to be reset to null - realForm.removeAttribute("id") - assert_equals(realForm.elements.length, 0, "After removing the ID of the real form, the form should have no associated form elements."); - assert_equals(input.form, null, "After removing the ID of the real form, the input should have no associated form"); - assert_equals(resetButton.form, null, "After removing the ID of the real form, the reset button should have no associated form."); - - // Reinstating the ID causes all associations to be re-created again - realForm.id = "real-form-redux"; - assert_equals(realForm.elements.length, 2, "After the ID of the inner form is reinstated, the real form should have 2 associated form elements"); - assert_equals(realForm.elements[0], resetButton, "After the ID of the inner form is reinstated, the first associated element should be the reset button outside the shadow root."); - assert_equals(realForm.elements[1], input, "After the ID of the inner form is reinstated, the second associated element should be the input inside the first shadow root."); - assert_equals(resetButton.form, fancyForm, "After the ID of the inner form is reinstated, the reset button should have the outer fancy-form-6 as its form property."); - assert_equals(input.form, innerFancyForm, "After the ID of the inner form is reinstated, the inner input element should have the inner fancy-form-6 as its form property."); - - // Removing the inner form should cause the form-associated elements to have their forms set to null. - realForm.remove(); - assert_equals(resetButton.form, null, "After removing the real form, the reset button should have the null form property."); - assert_equals(input.form, null, "After removing the real form, the inner input element should have null as its form property."); - }, "Form association is updated when form is inserted in or removed from shadow DOM, including in nested shadow DOM"); - </script> - - <input type="image" id="image-input-7" form="fancy-form-7"> - <fancy-form-7 id="fancy-form-7"> - <template shadowrootmode="open" shadowrootreferencetarget="real-form"> - <form id="real-form"> - </form> - </template> - </fancy-form-7> - - <script> - test(function() { - let imageInput = document.getElementById("image-input-7"); - let fancyForm = document.getElementById("fancy-form-7"); - let realForm = fancyForm.shadowRoot.getElementById("real-form"); - - assert_equals(imageInput.form, fancyForm); - assert_equals(realForm.elements.length, 0); - }, "Form association works for image inputs, which aren't in the elements collection"); - </script> - - - <input id="input-8" form="fancy-form-8" value="default value"> - <fancy-form-8 id="fancy-form-8"> - <template shadowRootMode="open"> - <fancy-form-8 id="inner-fancy-form"> - <template shadowRootMode="open"> - <form id="real-form"> - <button type="reset" id="reset">Reset</button> - </form> - </template> - </fancy-form-8> - </template> - </fancy-form-8> - - <script> - test(function() { - let input = document.getElementById("input-8"); - let outerFancyForm = document.getElementById("fancy-form-8"); - let innerFancyForm = outerFancyForm.shadowRoot.getElementById("inner-fancy-form"); - let realForm = innerFancyForm.shadowRoot.getElementById("real-form"); - let resetButton = innerFancyForm.shadowRoot.getElementById("reset"); - - assert_equals(input.form, null, "Form is null before reference target change"); - assert_equals(input.value, "default value", "Value is default"); - - input.value = "new value"; - assert_equals(input.value, "new value", "Value is updated"); - - resetButton.click(); - assert_equals(input.value, "new value", "Before reference target change, reset button doesn't reset outer input"); - - outerFancyForm.shadowRoot.referenceTarget = "inner-fancy-form"; - assert_equals(input.form, null, "Form is still null after outer reference target change"); - assert_equals(input.value, "new value", "Value is updated"); - - resetButton.click(); - assert_equals(input.value, "new value", "After outer reference target change, reset button doesn't reset outer input"); - - innerFancyForm.shadowRoot.referenceTarget = "real-form"; - assert_equals(input.form, outerFancyForm, "Form is outer-fancy-form after reference target change"); - - resetButton.click(); - assert_equals(input.value, "default value", "After inner reference target change, reset resets outer input"); - }, "Changing the reference target of a nested shadow root sets form association"); - </script> </body> </html> diff --git a/testing/web-platform/tests/shadow-dom/reference-target/tentative/label-descendant.html b/testing/web-platform/tests/shadow-dom/reference-target/tentative/label-descendant.html @@ -2,7 +2,6 @@ <html> <head> -<script src="/html/resources/common.js"></script> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> @@ -98,212 +97,6 @@ testDeepImplicitLabelAssociation('x-outer2-a', 'Input 2 via Options'); </script> - -<div id="test-container4"></div> -<script> -// The HTML5_LABELABLE_ELEMENTS are defined in https://html.spec.whatwg.org/#category-label -for(let referenced_element_type of HTML5_LABELABLE_ELEMENTS) { - promise_test(async t => { - const test_container = document.querySelector("#test-container4"); - test_container.setHTMLUnsafe(` - <label> - <fancy-element id="fancy"> - <template shadowrootmode="open" shadowrootreferencetarget="target"> - <${referenced_element_type} id="target"></${referenced_element_type}> - </template> - </fancy-element> - fancy custom element inside label - </label>`); - - const fancy_element = document.getElementById('fancy'); - const target_element = fancy_element.shadowRoot.getElementById('target'); - - assert_equals(await test_driver.get_computed_label(fancy_element), ""); - assert_equals(await test_driver.get_computed_label(target_element), "fancy custom element inside label"); - }, "Implicit <label> association should work with a custom element targeting '" + referenced_element_type + "' for computed name"); - - promise_test(async t => { - const test_container = document.querySelector("#test-container4"); - test_container.setHTMLUnsafe(` - <label> - <fancy-element id="fancy"> - <template shadowrootmode="open" shadowrootreferencetarget="target"> - <${referenced_element_type} id="target"></${referenced_element_type}> - </template> - </fancy-element> - fancy custom element inside label - </label>`); - - const fancy_element = document.getElementById('fancy'); - const target_element = fancy_element.shadowRoot.getElementById('target'); - const label = test_container.querySelector('label'); - - assert_array_equals(Array.from(target_element['labels']), [label]); - }, "Implicit <label> association should work with a custom element targeting '" + referenced_element_type + "' for .labels"); -} -</script> - - -<label id="label5"> - <fancy-input id="fancy-input5-1"> - <template shadowrootmode="open" shadowrootreferencetarget="real-input5-1"> - <input id="real-input5-1"> - </template> - </fancy-input> - <fancy-input id="fancy-input5-2"> - <template shadowrootmode="open" shadowrootreferencetarget="real-input5-2"> - <input id="real-input5-2"> - </template> - </fancy-input> - fancy input inside label -</label> -<script> - promise_test(async t => { - const fancy_input1 = document.getElementById('fancy-input5-1'); - const fancy_input2 = document.getElementById('fancy-input5-2'); - const real_input1 = fancy_input1.shadowRoot.getElementById('real-input5-1'); - const real_input2 = fancy_input2.shadowRoot.getElementById('real-input5-2'); - - assert_equals(await test_driver.get_computed_label(fancy_input1), ""); - assert_equals(await test_driver.get_computed_label(fancy_input2), ""); - assert_equals(await test_driver.get_computed_label(real_input1), "fancy input inside label"); - assert_equals(await test_driver.get_computed_label(real_input2), ""); - - fancy_input2.after(fancy_input1); - assert_equals(await test_driver.get_computed_label(fancy_input1), ""); - assert_equals(await test_driver.get_computed_label(fancy_input2), ""); - assert_equals(await test_driver.get_computed_label(real_input1), ""); - assert_equals(await test_driver.get_computed_label(real_input2), "fancy input inside label"); - }, "Implicit <label> association should apply to only the first labelable custom element for computed name"); -</script> - - -<label id="label6"> - <fancy-input id="fancy-input6-1-outer"> - <template shadowrootmode="open" > - <fancy-input id="fancy-input6-1-inner"> - <template shadowrootmode="open"> - <input id="real-input6-1"> - </template> - </fancy-input> - </template> - </fancy-input> - <fancy-input id="fancy-input6-2"> - <template shadowrootmode="open"> - <input id="real-input6-2"> - </template> - </fancy-input> - fancy input inside label -</label> - -<script> - promise_test(async t => { - const fancy_input1_outer = document.getElementById('fancy-input6-1-outer'); - fancy_input1_outer.shadowRoot.referenceTarget = 'fancy-input6-1-inner'; - const fancy_input1_inner = fancy_input1_outer.shadowRoot.getElementById('fancy-input6-1-inner'); - fancy_input1_inner.shadowRoot.referenceTarget = 'real-input6-1'; - const fancy_input2 = document.getElementById('fancy-input6-2'); - fancy_input2.shadowRoot.referenceTarget = 'real-input6-2'; - const real_input1 = fancy_input1_inner.shadowRoot.getElementById('real-input6-1'); - const real_input2 = fancy_input2.shadowRoot.getElementById('real-input6-2'); - const label = document.getElementById('label6'); - - assert_array_equals(Array.from(real_input1['labels']), [label], "real_input1 initial"); - assert_array_equals(Array.from(real_input2['labels']), [], "real_input2 initial"); - - fancy_input2.after(fancy_input1_outer); - assert_array_equals(Array.from(real_input1['labels']), [], "real_input1 after swap"); - assert_array_equals(Array.from(real_input2['labels']), [label], "real_input2 after swap"); - - fancy_input2.shadowRoot.referenceTarget = null; - assert_array_equals(Array.from(real_input1['labels']), [label], "real_input1 after fancy_input2 referenceTarget change"); - assert_array_equals(Array.from(real_input2['labels']), [], "real_input2 after fancy_input2 referenceTarget change"); - - fancy_input1_inner.shadowRoot.referenceTarget = null; - assert_array_equals(Array.from(real_input1['labels']), [], "real_input1 after fancy_input1_inner referenceTarget change"); - assert_array_equals(Array.from(real_input2['labels']), [], "real_input2 after fancy_input1_inner referenceTarget change"); - - fancy_input1_inner.shadowRoot.referenceTarget = "real-input6-1"; - assert_array_equals(Array.from(real_input1['labels']), [label], "real_input1 after second fancy_input1_inner referenceTarget change"); - assert_array_equals(Array.from(real_input2['labels']), [], "real_input2 after second fancy_input1_inner referenceTarget change"); - }, "Implicit <label> association should apply to only the first labelable custom element for .labels"); -</script> - - -<label id="label-input7" for="fancy-input7-outer">Input 7 - <fancy-input id="fancy-input7-outer"> - <template shadowRootMode="open" shadowRootReferenceTarget="fancy-input7-inner"> - <fancy-input id="fancy-input7-inner"> - <template shadowrootmode="open" shadowrootreferencetarget="input7-1"> - <input id="input7-1"> - <input id="input7-2"> - </template> - </fancy-input> - </template> - </fancy-input> -</label> -<script> - promise_test(async t => { - const outer_x_input = document.getElementById('fancy-input7-outer'); - const outer_shadow = outer_x_input.shadowRoot; - const inner_x_input = outer_shadow.getElementById('fancy-input7-inner'); - const inner_shadow = inner_x_input.shadowRoot; - const input1 = inner_shadow.getElementById('input7-1'); - const input2 = inner_shadow.getElementById('input7-2'); - - assert_equals(await test_driver.get_computed_label(input1), "Input 7"); - assert_equals(await test_driver.get_computed_label(input2), ""); - - inner_shadow.referenceTarget = "input7-2"; - - assert_equals(await test_driver.get_computed_label(input1), ""); - assert_equals(await test_driver.get_computed_label(input2), "Input 7"); - - outer_shadow.referenceTarget = null; - - assert_equals(await test_driver.get_computed_label(input1), ""); - assert_equals(await test_driver.get_computed_label(input2), ""); - }, "Changing the reference target causes label association to change for computed name"); -</script> - -<label id="label-input8" for="fancy-input8-outer">Input 8 - <fancy-input id="fancy-input8-outer"> - <template shadowRootMode="open" shadowRootReferenceTarget="fancy-input8-inner"> - <fancy-input id="fancy-input8-inner"> - <template shadowrootmode="open" shadowrootreferencetarget="input8-1"> - <input id="input8-1"> - <input id="input8-2"> - </template> - </fancy-input> - </template> - </fancy-input> -</label> -<script> - promise_test(async t => { - const label = document.getElementById('label-input8'); - const outer_x_input = document.getElementById('fancy-input8-outer'); - const outer_shadow = outer_x_input.shadowRoot; - const inner_x_input = outer_shadow.getElementById('fancy-input8-inner'); - const inner_shadow = inner_x_input.shadowRoot; - const input1 = inner_shadow.getElementById('input8-1'); - const input2 = inner_shadow.getElementById('input8-2'); - - assert_array_equals(Array.from(input1['labels']), [label], 'input1 before change'); - assert_array_equals(Array.from(input2['labels']), [], 'input2 before change'); - - inner_shadow.referenceTarget = "input8-2"; - - assert_array_equals(Array.from(input1['labels']), [], 'input1 after change'); - assert_array_equals(Array.from(input2['labels']), [label], 'input2 after change'); - - outer_shadow.referenceTarget = null; - - assert_array_equals(Array.from(input1['labels']), [], 'input1 after null'); - assert_array_equals(Array.from(input2['labels']), [], 'input2 after null'); - }, "Changing the reference target causes label association to change for .labels"); - -</script> - </body> </html> diff --git a/testing/web-platform/tests/shadow-dom/reference-target/tentative/label-for.html b/testing/web-platform/tests/shadow-dom/reference-target/tentative/label-for.html @@ -13,7 +13,7 @@ <body> -<label id="label1" for="x-input1">Input 1</label> +<label for="x-input1">Input 1</label> <x-input1 id="x-input1"> <template shadowrootmode="open" shadowrootreferencetarget="input1"> <input id="input1"> @@ -27,18 +27,10 @@ // The label should apply to the input element and not the host. assert_equals(await test_driver.get_computed_label(x_input), ""); assert_equals(await test_driver.get_computed_label(input), "Input 1"); - }, "Label for attribute targeting a custom element using shadowrootreferencetarget works for computed name"); - - promise_test(async t => { - const x_input = document.getElementById('x-input1'); - const input = x_input.shadowRoot.getElementById('input1'); - const label = document.getElementById('label1'); - - assert_array_equals(Array.from(input['labels']), [label]); -}, "Label for attribute targeting a custom element using shadowrootreferencetarget works for .labels property"); + }, "Label for attribute targets a custom element using shadowrootreferencetarget"); </script> -<label id="label2" for="x-outer2">Input 2</label> +<label for="x-outer2">Input 2</label> <x-outer2 id="x-outer2"> <template shadowrootmode="open" shadowrootreferencetarget="x-inner2"> <x-inner2 id="x-inner2"> @@ -58,65 +50,40 @@ assert_equals(await test_driver.get_computed_label(outer), ""); assert_equals(await test_driver.get_computed_label(inner), ""); assert_equals(await test_driver.get_computed_label(input), "Input 2"); - }, "Label for attribute targeting a custom element using shadowrootreferencetarget inside multiple layers of shadow roots works for computed name"); - - promise_test(async t => { - const outer = document.getElementById('x-outer2'); - const inner = outer.shadowRoot.getElementById('x-inner2'); - const input = inner.shadowRoot.getElementById('input2'); - const label = document.getElementById('label2'); - - assert_array_equals(Array.from(input['labels']), [label]); - }, "Label for attribute targeting a custom element using shadowrootreferencetarget inside multiple layers of shadow roots works for .labels property"); - + }, "Label for attribute targets a custom element using shadowrootreferencetarget inside multiple layers of shadow roots"); </script> -<label id="label3-A" for="x-outer3">A</label> +<label for="x-outer3">A</label> <x-outer3 id="x-outer3"> <template shadowrootmode="open" shadowrootreferencetarget="x-inner3"> - <label id="label3-B" for="x-inner3">B</label> + <label for="x-inner3">B</label> <x-inner3 id="x-inner3"> <template shadowrootmode="open" shadowrootreferencetarget="input3"> - <label id="label3-C" for="input3">C</label> + <label for="input3">C</label> <input id="input3"> - <label id="label3-D" for="input3">D</label> + <label for="input3">D</label> </template> </x-inner3> - <label id="label3-E" for="x-inner3">E</label> + <label for="x-inner3">E</label> </template> </x-outer3> -<label id="label3-F" for="x-outer3">F</label> +<label for="x-outer3">F</label> <script> promise_test(async t => { const outer = document.getElementById('x-outer3'); const inner = outer.shadowRoot.getElementById('x-inner3'); const input = inner.shadowRoot.getElementById('input3'); const computed_label = await test_driver.get_computed_label(input); - assert_equals(computed_label, "A B C D E F"); - }, "Multiple labels targeting a custom element using shadowrootreferencetarget inside multiple layers of shadow roots works for computed name"); - - promise_test(async t => { - const outer = document.getElementById('x-outer3'); - const inner = outer.shadowRoot.getElementById('x-inner3'); - const input = inner.shadowRoot.getElementById('input3'); - const A = document.getElementById('label3-A'); - const B = outer.shadowRoot.getElementById('label3-B'); - const C = inner.shadowRoot.getElementById('label3-C'); - const D = inner.shadowRoot.getElementById('label3-D'); - const E = outer.shadowRoot.getElementById('label3-E'); - const F = document.getElementById('label3-F'); - - assert_array_equals(Array.from(input['labels']), [A, B, C, D, E, F]); - }, "Multiple labels targeting a custom element using shadowrootreferencetarget inside multiple layers of shadow roots works for .labels property"); + }, "Multiple labels targeting a custom element using shadowrootreferencetarget inside multiple layers of shadow roots"); </script> <label id="label-input4">Input 4</label> -<x-input4 id="x-input4"> +<x-input1 id="x-input4"> <template shadowrootmode="open" shadowrootreferencetarget="input4"> <input id="input4"> </template> -</x-input4> +</x-input1> <script> promise_test(async t => { const label = document.getElementById('label-input4'); @@ -127,200 +94,61 @@ // The label should apply to the input element and not the host. assert_equals(await test_driver.get_computed_label(x_input), ""); assert_equals(await test_driver.get_computed_label(input), "Input 4"); - }, "Setting .htmlFor property to target a custom element using shadowrootreferencetarget works for computed name"); - - promise_test(async t => { - const label = document.getElementById('label-input4'); - label.htmlFor = "x-input4"; - const x_input = document.getElementById('x-input4'); - const input = x_input.shadowRoot.getElementById('input4'); - - assert_array_equals(Array.from(input['labels']), [label]); - }, "Setting .htmlFor property to target a custom element using shadowrootreferencetarget works for .labels"); - -</script> - - -<label id="label-input5" for="x-input5-outer">Input 5</label> -<x-input5 id="x-input5-outer"> - <template shadowRootMode="open" shadowRootReferenceTarget="x-input5-inner"> - <x-input5 id="x-input5-inner"> - <template shadowrootmode="open" shadowrootreferencetarget="input5-1"> - <input id="input5-1"> - <input id="input5-2"> - </template> - </x-input5> - </template> -</x-input5> -<script> - promise_test(async t => { - const outer_x_input = document.getElementById('x-input5-outer'); - const outer_shadow_root = outer_x_input.shadowRoot; - const inner_x_input = outer_shadow_root.getElementById('x-input5-inner') - const inner_shadow_root = inner_x_input.shadowRoot; - const input1 = inner_shadow_root.getElementById('input5-1'); - const input2 = inner_shadow_root.getElementById('input5-2'); - - assert_equals(await test_driver.get_computed_label(input1), "Input 5"); - assert_equals(await test_driver.get_computed_label(input2), ""); - - inner_shadow_root.referenceTarget = 'input5-2'; - - assert_equals(await test_driver.get_computed_label(input1), ""); - assert_equals(await test_driver.get_computed_label(input2), "Input 5"); - - outer_shadow_root.referenceTarget = null; - - assert_equals(await test_driver.get_computed_label(input1), ""); - assert_equals(await test_driver.get_computed_label(input2), ""); - }, "Modifying the reference target changes the computed label when using label/for"); + }, "Setting .htmlFor property to target a custom element using shadowrootreferencetarget"); </script> -<label id="label-input6" for="x-input6-outer">Input 6</label> -<x-input6 id="x-input6-outer"> - <template shadowRootMode="open" shadowRootReferenceTarget="x-input6-inner"> - <x-input6 id="x-input6-inner"> - <template shadowrootmode="open" shadowrootreferencetarget="input6-1"> - <input id="input6-1"> - <input id="input6-2"> - </template> - </x-input6> - </template> -</x-input6> +<div id="test-container"></div> <script> +// The HTML5_LABELABLE_ELEMENTS are defined in https://html.spec.whatwg.org/#category-label +for(let referenced_element_type of HTML5_LABELABLE_ELEMENTS) { promise_test(async t => { - const label = document.getElementById('label-input6') - const outer_x_input = document.getElementById('x-input6-outer'); - const outer_shadow_root = outer_x_input.shadowRoot; - const inner_x_input = outer_shadow_root.getElementById('x-input6-inner') - const inner_shadow_root = inner_x_input.shadowRoot; - const input1 = inner_shadow_root.getElementById('input6-1'); - const input2 = inner_shadow_root.getElementById('input6-2'); - - assert_array_equals(Array.from(input1['labels']), [label], 'input1 before changing reference target'); - assert_array_equals(Array.from(input2['labels']), [], 'input2 before changing reference target'); - - inner_shadow_root.referenceTarget = 'input6-2'; - - assert_array_equals(Array.from(input1['labels']), [], 'input1 after changing reference target'); - assert_array_equals(Array.from(input2['labels']), [label], 'input2 after changing reference target'); - - outer_shadow_root.referenceTarget = null; - - assert_array_equals(Array.from(input1['labels']), []); - assert_array_equals(Array.from(input2['labels']), []); - }, "Modifying the reference target changes .labels when using label/for"); - + const test_container = document.querySelector("#test-container"); + test_container.setHTMLUnsafe(` + <label> + <fancy-element id="fancy"> + <template shadowrootmode="open" shadowrootreferencetarget="target"> + <${referenced_element_type} id="target"></${referenced_element_type}> + </template> + </fancy-element> + fancy custom element inside label + </label>`); + + const fancy_element = document.getElementById('fancy'); + const target_element = fancy_element.shadowRoot.getElementById('target'); + + assert_equals(await test_driver.get_computed_label(fancy_element), ""); + assert_equals(await test_driver.get_computed_label(target_element), "fancy custom element inside label"); + }, "Implicit <label> association should work with a custom element targeting '" + referenced_element_type + "'"); +} </script> -<label id="label-input7-1" for="x-input7-1">Input 7 - 1</label> -<x-input7 id="x-input7-1"> - <template shadowRootMode="open" shadowRootReferenceTarget="input7"> - <input id="input7"> +<label> +<fancy-input id="fancy-input1"> + <template shadowrootmode="open" shadowrootreferencetarget="real-input"> + <input id="real-input"> </template> -</x-input7> - -<label id="label-input7-2" for="x-input7-2">Input 7 - 2</label> -<x-input7 id="x-input7-2"> - <template shadowRootMode="open" shadowRootReferenceTarget="input7"> +</fancy-input> +<fancy-input id="fancy-input2"> + <template shadowrootmode="open" shadowrootreferencetarget="real-input"> + <input id="real-input"> </template> -</x-input7> +</fancy-input> +fancy input inside label +</label> <script> promise_test(async t => { - const label_1 = document.getElementById('label-input7-1') - const x_input_1 = document.getElementById('x-input7-1'); - const shadow_root_1 = x_input_1.shadowRoot; - const input = shadow_root_1.getElementById('input7'); - - assert_array_equals(Array.from(input['labels']), [label_1], 'input before changing shadow root'); - - const label_2 = document.getElementById('label-input7-2') - const x_input_2 = document.getElementById('x-input7-2'); - const shadow_root_2 = x_input_2.shadowRoot; - shadow_root_2.append(input); - - assert_array_equals(Array.from(input['labels']), [label_2], 'input after changing shadow root'); - }, "Moving an input from one shadow root to another causes its .labels to be updated"); - + const fancy_input1 = document.getElementById('fancy-input1'); + const fancy_input2 = document.getElementById('fancy-input2'); + const real_input1 = fancy_input1.shadowRoot.getElementById('real-input'); + const real_input2 = fancy_input2.shadowRoot.getElementById('real-input'); + + assert_equals(await test_driver.get_computed_label(fancy_input1), ""); + assert_equals(await test_driver.get_computed_label(fancy_input2), ""); + assert_equals(await test_driver.get_computed_label(real_input1), "fancy input inside label"); + assert_equals(await test_driver.get_computed_label(real_input2), ""); + }, "Implicit <label> association should apply to only the first labelable custom element"); </script> - -<script> - promise_test(async t => { - const container = document.createElement('div'); - container.id = 'container8'; - const outer_label = document.createElement('label'); - outer_label.id = 'outer-label8'; - outer_label.htmlFor = 'outer-input8'; - const light_input = document.createElement('input'); - light_input.id = 'outer-input8' - assert_array_equals(Array.from(light_input.labels), [], 'before inserting light input'); - - container.append(outer_label, light_input); - assert_array_equals(Array.from(light_input.labels), [outer_label], 'after inserting light input in container'); - - document.body.append(container); - assert_array_equals(Array.from(light_input.labels), [outer_label], 'after inserting container in document'); - - light_input.remove(); - assert_array_equals(Array.from(light_input.labels), [], 'after removing light input from document'); - - const inner_x_input = document.createElement('x-input8'); - inner_x_input.id = 'inner-x-input8'; - const inner_shadow_root = inner_x_input.attachShadow({mode: 'open'}); - const inner_label = document.createElement('label'); - inner_label.id = 'inner-label8'; - inner_label.htmlFor = 'inner-input8'; - inner_shadow_root.appendChild(inner_label); - - const inner_input = document.createElement('input'); - inner_input.id = 'inner-input8'; - inner_shadow_root.appendChild(inner_input); - - const outer_x_input = document.createElement('x-input8'); - outer_x_input.id = 'outer-x-input8'; - const outer_shadow_root = outer_x_input.attachShadow({mode: 'open'}); - outer_shadow_root.referenceTarget = 'inner-x-input8'; - const intermediate_label = document.createElement('label'); - intermediate_label.id = 'intermediate-label8'; - intermediate_label.htmlFor = 'inner-x-input8'; - outer_shadow_root.appendChild(intermediate_label); - outer_shadow_root.appendChild(inner_x_input); - - assert_array_equals(Array.from(inner_input['labels']), [inner_label], 'After inner shadow host is attached, before reference target is set'); - - inner_shadow_root.referenceTarget = 'inner-input8'; - assert_array_equals(Array.from(inner_input['labels']), [intermediate_label, inner_label], 'After inner shadow reference target is set'); - - outer_label.htmlFor = 'outer-x-input8'; - outer_label.after(outer_x_input); - assert_array_equals(Array.from(inner_input['labels']), [outer_label, intermediate_label, inner_label], 'After outer shadow host is inserted in the document'); - - outer_x_input.remove(); - assert_array_equals(Array.from(inner_input['labels']), [intermediate_label, inner_label], 'After outer shadow host is removed from the document'); - - outer_label.after(outer_x_input); - assert_array_equals(Array.from(inner_input['labels']), [outer_label, intermediate_label, inner_label], 'After outer shadow host is re-inserted'); - - inner_x_input.remove(); - assert_array_equals(Array.from(inner_input['labels']), [inner_label], 'After inner shadow host is removed from the document'); - - intermediate_label.after(inner_x_input); - assert_array_equals(Array.from(inner_input['labels']), [outer_label, intermediate_label, inner_label], 'After inner shadow host is re-inserted'); - - outer_shadow_root.referenceTarget = null; - assert_array_equals(Array.from(inner_input['labels']), [intermediate_label, inner_label], 'After outer shadow root reference target is set to null'); - - inner_shadow_root.referenceTarget = null; - assert_array_equals(Array.from(inner_input['labels']), [inner_label], 'After inner shadow root reference target is set to null'); - - inner_shadow_root.referenceTarget = 'inner-input8'; - assert_array_equals(Array.from(inner_input['labels']), [intermediate_label, inner_label], 'After inner shadow root reference target is re-set'); - - outer_shadow_root.referenceTarget = 'inner-x-input8'; - assert_array_equals(Array.from(inner_input['labels']), [outer_label, intermediate_label, inner_label], 'After outer shadow root reference target is re-set'); - }, 'Attaching a shadow root, inserting and removing a shadow host, and changing reference targets all cause label association to be updated'); - -</script> </body> + </html> diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/actions.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/actions.py @@ -8,9 +8,9 @@ class ClickAction: self.protocol = protocol def __call__(self, payload): - selectors = payload["selectors"] - element = self.protocol.select.element_by_selector_array(selectors) - self.logger.debug("Clicking element: %s" % selectors) + selector = payload["selector"] + element = self.protocol.select.element_by_selector(selector) + self.logger.debug("Clicking element: %s" % selector) self.protocol.click.element(element) @@ -46,8 +46,8 @@ class GetComputedLabelAction: self.protocol = protocol def __call__(self, payload): - selectors = payload["selectors"] - element = self.protocol.select.element_by_selector_array(selectors) + selector = payload["selector"] + element = self.protocol.select.element_by_selector(selector) self.logger.debug("Getting computed label for element: %s" % element) return self.protocol.accessibility.get_computed_label(element) @@ -60,8 +60,8 @@ class GetComputedRoleAction: self.protocol = protocol def __call__(self, payload): - selectors = payload["selectors"] - element = self.protocol.select.element_by_selector_array(selectors) + selector = payload["selector"] + element = self.protocol.select.element_by_selector(selector) self.logger.debug("Getting computed role for element: %s" % element) return self.protocol.accessibility.get_computed_role(element) @@ -87,10 +87,10 @@ class SendKeysAction: self.protocol = protocol def __call__(self, payload): - selectors = payload["selectors"] + selector = payload["selector"] keys = payload["keys"] - element = self.protocol.select.element_by_selector_array(selectors) - self.logger.debug("Sending keys to element: %s" % selectors) + element = self.protocol.select.element_by_selector(selector) + self.logger.debug("Sending keys to element: %s" % selector) self.protocol.send_keys.send_keys(element, keys) @@ -145,11 +145,11 @@ class ActionSequenceAction: for action in actionSequence["actions"]: if (action["type"] == "pointerMove" and isinstance(action["origin"], dict)): - action["origin"] = self.get_element(action["origin"]["selectors"]) + action["origin"] = self.get_element(action["origin"]["selector"]) self.protocol.action_sequence.send_actions({"actions": actions}) - def get_element(self, element_selectors): - return self.protocol.select.element_by_selector_array(element_selectors) + def get_element(self, element_selector): + return self.protocol.select.element_by_selector(element_selector) def reset(self): self.protocol.action_sequence.release() diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -403,26 +403,6 @@ class MarionetteSelectorProtocolPart(SelectorProtocolPart): def setup(self): self.marionette = self.parent.marionette - def elements_by_selector_array(self, selectors): - shadow_roots = [] - selectors = selectors.copy() - selectors.reverse() - - while selectors: - selector = selectors.pop() - intermediate = [] - if not shadow_roots: - intermediate = self.marionette.find_elements("css selector", selector) - else: - for root in shadow_roots: - intermediate.extend(root.find_elements("css selector", selector)) - - if (selectors): - shadow_roots = [element.shadow_root for element in intermediate] - shadow_roots = [root for root in shadow_roots if root is not None] - else: - return intermediate - def elements_by_selector(self, selector): return self.marionette.find_elements("css selector", selector) diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executorselenium.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executorselenium.py @@ -171,12 +171,6 @@ class SeleniumSelectorProtocolPart(SelectorProtocolPart): def setup(self): self.webdriver = self.parent.webdriver - def elements_by_selector_array(self, selectors): - if len(selectors) == 1: - return elements_by_selector(self, selectors[0]) - - raise NotImplementedError() - def elements_by_selector(self, selector): return self.webdriver.find_elements_by_css_selector(selector) diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -531,12 +531,6 @@ class WebDriverSelectorProtocolPart(SelectorProtocolPart): def setup(self): self.webdriver = self.parent.webdriver - def elements_by_selector_array(self, selectors): - if len(selectors) == 1: - return elements_by_selector(self, selectors[0]) - - raise NotImplementedError() - def elements_by_selector(self, selector): return self.webdriver.find.css(selector) diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/protocol.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/protocol.py @@ -285,24 +285,6 @@ class SelectorProtocolPart(ProtocolPart): name = "select" - def element_by_selector_array(self, element_selectors): - elements = self.elements_by_selector_array(element_selectors) - if len(elements) == 0: - raise ValueError(f"Selector array '{element_selectors}' matches no elements") - elif len(elements) > 1: - raise ValueError(f"Selector array '{element_selectors}' matches multiple elements") - return elements[0] - - @abstractmethod - def elements_by_selector_array(self, selectors): - """Select elements matching an array of selectors, such that the first - selector matches an element in the document root, and each successive - selector matches an element inside the shadow root of the previous. - - :param List[str] selectors: The CSS selectors - :returns: A list of protocol-specific handles to elements""" - pass - def element_by_selector(self, element_selector): elements = self.elements_by_selector(element_selector) if len(elements) == 0: diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/testing/web-platform/tests/tools/wptrunner/wptrunner/testdriver-extra.js @@ -78,7 +78,7 @@ } else { if (bits >= 1 && bits <= 30) { return 0 | ((1 << bits) * Math.random()); - } else { + } else { var high = (0 | ((1 << (bits - 30)) * Math.random())) * (1 << 30); var low = 0 | ((1 << 30) * Math.random()); return high + low; @@ -134,18 +134,14 @@ } else { // push and then reverse to avoid O(n) unshift in the loop let segments = []; - let el = element; - while (el && el.parentElement) { - let segment = "*|" + el.localName; - let nth = Array.prototype.indexOf.call(el.parentNode.children, el) + 1; + for (let node = element; + node.parentElement; + node = node.parentElement) { + let segment = "*|" + node.localName; + let nth = Array.prototype.indexOf.call(node.parentElement.children, node) + 1; segments.push(segment + ":nth-child(" + nth + ")"); - el = el.parentElement; - } - if (element.getRootNode() == element.ownerDocument) { - segments.push(":root"); - } else { - segments.push(":scope"); } + segments.push(":root"); segments.reverse(); selector = segments.join(" > "); @@ -154,18 +150,6 @@ return selector; }; - const get_selector_array = function(element) { - let selectors = []; - let current = element; - - do { - selectors.push(get_selector(current)); - current = current.getRootNode().host; - } while (current); - - return selectors.reverse(); - }; - /** * Create an action and return a promise that resolves when the action is complete. * @param name: The name of the action to create. @@ -476,9 +460,9 @@ }; window.test_driver_internal.click = function(element) { - const selectors = get_selector_array(element); + const selector = get_selector(element); const context = get_context(element); - return create_context_action("click", context, {selectors}); + return create_context_action("click", context, {selector}); }; window.test_driver_internal.delete_all_cookies = function(context=null) { @@ -498,15 +482,15 @@ } window.test_driver_internal.get_computed_label = function(element) { - const selectors = get_selector_array(element); + const selector = get_selector(element); const context = get_context(element); - return create_context_action("get_computed_label", context, {selectors}); + return create_context_action("get_computed_label", context, {selector}); }; window.test_driver_internal.get_computed_role = function(element) { - const selectors = get_selector_array(element); + const selector = get_selector(element); const context = get_context(element); - return create_context_action("get_computed_role", context, {selectors}); + return create_context_action("get_computed_role", context, {selector}); }; window.test_driver_internal.get_named_cookie = function(name, context=null) { @@ -526,9 +510,9 @@ }; window.test_driver_internal.send_keys = function(element, keys) { - const selectors = get_selector_array(element); + const selector = get_selector(element); const context = get_context(element); - return create_context_action("send_keys", context, {selectors, keys}); + return create_context_action("send_keys", context, {selector, keys}); }; window.test_driver_internal.action_sequence = function(actions, context=null) { @@ -538,7 +522,7 @@ // The origin of each action can only be an element or a string of a value "viewport" or "pointer". if (action.type == "pointerMove" && typeof(action.origin) != 'string') { let action_context = get_context(action.origin); - action.origin = {selectors: get_selector_array(action.origin)}; + action.origin = {selector: get_selector(action.origin)}; if (context !== null && action_context !== context) { throw new Error("Actions must be in a single context"); } diff --git a/toolkit/components/formautofill/FormAutofillNative.cpp b/toolkit/components/formautofill/FormAutofillNative.cpp @@ -1025,7 +1025,7 @@ bool FormAutofillImpl::IsExpirationMonthLikely(Element& aElement) { Element* FormAutofillImpl::FindRootForField(Element* aElement) { if (const auto* control = nsGenericHTMLFormControlElement::FromNode(aElement)) { - if (Element* form = control->GetFormInternal()) { + if (Element* form = control->GetForm()) { return form; } } @@ -1149,7 +1149,7 @@ void FormAutofillImpl::GetFormAutofillConfidences( if (NS_WARN_IF(!label)) { continue; } - auto* control = label->GetLabeledElementInternal(); + auto* control = label->GetControl(); if (!control) { continue; } diff --git a/toolkit/components/satchel/nsFormFillController.cpp b/toolkit/components/satchel/nsFormFillController.cpp @@ -1265,7 +1265,7 @@ void nsFormFillController::GetValue(mozilla::dom::Element* aElement, Element* nsFormFillController::GetList(mozilla::dom::Element* aElement) { if (auto* input = HTMLInputElement::FromNodeOrNull(aElement)) { - return input->GetListInternal(); + return input->GetList(); } return nullptr; }