Bug 933193 part 2. Implement nsINode::GetElementById and make SVGSVGElement use it. r=smaug

This commit is contained in:
Boris Zbarsky 2013-11-01 15:39:24 -04:00
Родитель 5d8ee8188b
Коммит 62654086cb
5 изменённых файлов: 30 добавлений и 14 удалений

Просмотреть файл

@ -1076,6 +1076,12 @@ public:
nsresult QuerySelector(const nsAString& aSelector, nsIDOMElement **aReturn);
nsresult QuerySelectorAll(const nsAString& aSelector, nsIDOMNodeList **aReturn);
protected:
// nsIDocument overrides this with its own (faster) version. This
// should really only be called for elements and document fragments.
mozilla::dom::Element* GetElementById(const nsAString& aId);
public:
/**
* Associate an object aData to aKey on this node. If aData is null any
* previously registered object and UserDataHandler associated to aKey on

Просмотреть файл

@ -2519,6 +2519,29 @@ nsINode::QuerySelectorAll(const nsAString& aSelector, nsIDOMNodeList **aReturn)
return rv.ErrorCode();
}
Element*
nsINode::GetElementById(const nsAString& aId)
{
MOZ_ASSERT(IsElement() || IsNodeOfType(eDOCUMENT_FRAGMENT),
"Bogus this object for GetElementById call");
if (IsInDoc()) {
ElementHolder holder;
FindMatchingElementsWithId<true>(aId, this, nullptr, holder);
return holder.mElement;
}
for (nsIContent* kid = GetFirstChild(); kid; kid = kid->GetNextNode(this)) {
if (!kid->IsElement()) {
continue;
}
nsIAtom* id = kid->AsElement()->GetID();
if (id && id->Equals(aId)) {
return kid->AsElement();
}
}
return nullptr;
}
JSObject*
nsINode::WrapObject(JSContext *aCx, JS::Handle<JSObject*> aScope)
{

Просмотреть файл

@ -435,18 +435,6 @@ SVGSVGElement::CreateSVGTransformFromMatrix(SVGMatrix& matrix)
return transform.forget();
}
Element*
SVGSVGElement::GetElementById(const nsAString& elementId, ErrorResult& rv)
{
nsAutoString selector(NS_LITERAL_STRING("#"));
nsStyleUtil::AppendEscapedCSSIdent(PromiseFlatString(elementId), selector);
nsIContent* element = QuerySelector(selector, rv);
if (!rv.Failed() && element) {
return element->AsElement();
}
return nullptr;
}
//----------------------------------------------------------------------
already_AddRefed<SVGAnimatedRect>

Просмотреть файл

@ -246,7 +246,7 @@ public:
already_AddRefed<SVGIRect> CreateSVGRect();
already_AddRefed<SVGTransform> CreateSVGTransform();
already_AddRefed<SVGTransform> CreateSVGTransformFromMatrix(SVGMatrix& matrix);
Element* GetElementById(const nsAString& elementId, ErrorResult& rv);
using nsINode::GetElementById; // This does what we want
already_AddRefed<SVGAnimatedRect> ViewBox();
already_AddRefed<DOMSVGAnimatedPreserveAspectRatio> PreserveAspectRatio();
uint16_t ZoomAndPan();

Просмотреть файл

@ -59,7 +59,6 @@ interface SVGSVGElement : SVGGraphicsElement {
SVGTransform createSVGTransform();
[NewObject]
SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
[Throws]
Element? getElementById(DOMString elementId);
};