зеркало из https://github.com/mozilla/gecko-dev.git
Bug 834209 - Return HTMLCollection from HTMLDocument named getter; r=bkelly
The spec says HTMLCollection, and this appears to be what all other browsers do. https://html.spec.whatwg.org/#dom-window-nameditem https://html.spec.whatwg.org/#dom-document-nameditem MozReview-Commit-ID: 87aABNaQmiz --HG-- extra : rebase_source : dfc6e445fd00d718632464357727be378da41e6c
This commit is contained in:
Родитель
e401b67d1c
Коммит
b7375b6f60
|
@ -196,6 +196,7 @@
|
|||
#include "mozilla/dom/Comment.h"
|
||||
#include "nsTextNode.h"
|
||||
#include "mozilla/dom/Link.h"
|
||||
#include "mozilla/dom/HTMLCollectionBinding.h"
|
||||
#include "mozilla/dom/HTMLElementBinding.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "mozilla/dom/Touch.h"
|
||||
|
@ -512,11 +513,130 @@ nsIdentifierMapEntry::SetImageElement(Element* aElement)
|
|||
}
|
||||
}
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
class SimpleHTMLCollection final : public nsSimpleContentList
|
||||
, public nsIHTMLCollection
|
||||
{
|
||||
public:
|
||||
explicit SimpleHTMLCollection(nsINode* aRoot) : nsSimpleContentList(aRoot) {}
|
||||
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
// nsIDOMHTMLCollection
|
||||
NS_DECL_NSIDOMHTMLCOLLECTION
|
||||
|
||||
virtual nsINode* GetParentObject() override
|
||||
{
|
||||
return nsSimpleContentList::GetParentObject();
|
||||
}
|
||||
virtual Element* GetElementAt(uint32_t aIndex) override
|
||||
{
|
||||
return mElements.SafeElementAt(aIndex)->AsElement();
|
||||
}
|
||||
|
||||
virtual Element* GetFirstNamedElement(const nsAString& aName,
|
||||
bool& aFound) override
|
||||
{
|
||||
aFound = false;
|
||||
nsCOMPtr<nsIAtom> name = NS_Atomize(aName);
|
||||
for (uint32_t i = 0; i < mElements.Length(); i++) {
|
||||
MOZ_DIAGNOSTIC_ASSERT(mElements[i]);
|
||||
Element* element = mElements[i]->AsElement();
|
||||
if (element->GetID() == name ||
|
||||
(element->HasName() &&
|
||||
element->GetParsedAttr(nsGkAtoms::name)->GetAtomValue() == name)) {
|
||||
aFound = true;
|
||||
return element;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
virtual void GetSupportedNames(nsTArray<nsString>& aNames) override
|
||||
{
|
||||
AutoTArray<nsIAtom*, 8> atoms;
|
||||
for (uint32_t i = 0; i < mElements.Length(); i++) {
|
||||
MOZ_DIAGNOSTIC_ASSERT(mElements[i]);
|
||||
Element* element = mElements[i]->AsElement();
|
||||
|
||||
nsIAtom* id = element->GetID();
|
||||
MOZ_ASSERT(id != nsGkAtoms::_empty);
|
||||
if (id && !atoms.Contains(id)) {
|
||||
atoms.AppendElement(id);
|
||||
}
|
||||
|
||||
if (element->HasName()) {
|
||||
nsIAtom* name = element->GetParsedAttr(nsGkAtoms::name)->GetAtomValue();
|
||||
MOZ_ASSERT(name && name != nsGkAtoms::_empty);
|
||||
if (name && !atoms.Contains(name)) {
|
||||
atoms.AppendElement(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nsString* names = aNames.AppendElements(atoms.Length());
|
||||
for (uint32_t i = 0; i < atoms.Length(); i++) {
|
||||
atoms[i]->ToString(names[i]);
|
||||
}
|
||||
}
|
||||
|
||||
virtual JSObject* GetWrapperPreserveColorInternal() override
|
||||
{
|
||||
return nsWrapperCache::GetWrapperPreserveColor();
|
||||
}
|
||||
virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) override
|
||||
{
|
||||
nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
|
||||
}
|
||||
virtual JSObject* WrapObject(JSContext *aCx,
|
||||
JS::Handle<JSObject*> aGivenProto) override
|
||||
{
|
||||
return HTMLCollectionBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
using nsBaseContentList::Length;
|
||||
using nsBaseContentList::Item;
|
||||
using nsIHTMLCollection::NamedItem;
|
||||
|
||||
private:
|
||||
virtual ~SimpleHTMLCollection() {}
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED(SimpleHTMLCollection, nsSimpleContentList,
|
||||
nsIHTMLCollection, nsIDOMHTMLCollection)
|
||||
|
||||
NS_IMETHODIMP
|
||||
SimpleHTMLCollection::GetLength(uint32_t* aLength)
|
||||
{
|
||||
*aLength = Length();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
SimpleHTMLCollection::Item(uint32_t aIdx, nsIDOMNode** aRetVal)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> retVal = Item(aIdx)->AsDOMNode();
|
||||
retVal.forget(aRetVal);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
SimpleHTMLCollection::NamedItem(const nsAString& aName, nsIDOMNode** aRetVal)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> retVal = NamedItem(aName)->AsDOMNode();
|
||||
retVal.forget(aRetVal);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
void
|
||||
nsIdentifierMapEntry::AddNameElement(nsINode* aNode, Element* aElement)
|
||||
{
|
||||
if (!mNameContentList) {
|
||||
mNameContentList = new nsSimpleContentList(aNode);
|
||||
mNameContentList = new SimpleHTMLCollection(aNode);
|
||||
}
|
||||
|
||||
mNameContentList->AppendElement(aElement);
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[nameditem-04.html]
|
||||
type: testharness
|
||||
[If there are two forms, a collection should be returned. (name)]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[nameditem-05.html]
|
||||
type: testharness
|
||||
[If there are two embeds, a collection should be returned. (name)]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[nameditem-06.html]
|
||||
type: testharness
|
||||
[If there are two imgs, a collection should be returned. (name)]
|
||||
expected: FAIL
|
||||
|
|
@ -1,8 +1,5 @@
|
|||
[nameditem-07.html]
|
||||
type: testharness
|
||||
[If there are two objects, a collection should be returned. (name)]
|
||||
expected: FAIL
|
||||
|
||||
[If there are two objects, a collection should be returned. (id)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче