Make getElementsByClassName handle the root element properly. Bug 395915, r+sr=peterv, a=sicking.

This commit is contained in:
bzbarsky@mit.edu 2007-09-20 15:10:27 -07:00
parent af0aadaa6d
commit b353757468
4 changed files with 54 additions and 6 deletions

View File

@ -1710,16 +1710,18 @@ NS_IMETHODIMP
nsDocument::GetElementsByClassName(const nsAString& aClasses,
nsIDOMNodeList** aReturn)
{
return GetElementsByClassNameHelper(mRootContent, aClasses, aReturn);
return GetElementsByClassNameHelper(this, aClasses, aReturn);
}
// static GetElementsByClassName helpers
nsresult
nsDocument::GetElementsByClassNameHelper(nsIContent* aContent,
nsDocument::GetElementsByClassNameHelper(nsINode* aRootNode,
const nsAString& aClasses,
nsIDOMNodeList** aReturn)
{
NS_PRECONDITION(aRootNode, "Must have root node");
nsAttrValue attrValue;
attrValue.ParseAtomArray(aClasses);
// nsAttrValue::Equals is sensitive to order, so we'll send an array
@ -1733,8 +1735,8 @@ nsDocument::GetElementsByClassNameHelper(nsIContent* aContent,
}
nsBaseContentList* elements;
if (classes->Count() > 0 && aContent) {
elements = new nsContentList(aContent, MatchClassNames,
if (classes->Count() > 0) {
elements = new nsContentList(aRootNode, MatchClassNames,
DestroyClassNameArray, classes);
} else {
elements = new nsBaseContentList();

View File

@ -649,9 +649,10 @@ public:
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsDocument, nsIDocument)
/**
* Utility method for getElementsByClassName
* Utility method for getElementsByClassName. aRootNode is the node (either
* document or element), which getElementsByClassName was called on.
*/
static nsresult GetElementsByClassNameHelper(nsIContent* aContent,
static nsresult GetElementsByClassNameHelper(nsINode* aRootNode,
const nsAString& aClasses,
nsIDOMNodeList** aReturn);
protected:

View File

@ -88,6 +88,7 @@ _TEST_FILES = test_bug5141.html \
test_bug382113.html \
test_bug390735.html \
test_bug392511.html \
test_bug395915.html \
bug382113_object.html \
test_CrossSiteXHR.html \
file_CrossSiteXHR_fail1.xml \

View File

@ -0,0 +1,44 @@
<!DOCTYPE HTML>
<html class="A b">
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=395915
-->
<head>
<title>Test for Bug 395915</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=395915">Mozilla Bug 395915</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for Bug 395915 **/
is(document.getElementsByClassName("a").length, 0,
"Class names are case-sensitive");
is(document.getElementsByClassName("A").length, 1,
"Have one node of class A");
is(document.getElementsByClassName("A")[0], document.documentElement,
"Root is class A");
is(document.getElementsByClassName("a b").length, 0,
"Class names are case-sensitive two");
is(document.getElementsByClassName("A B").length, 0,
"Class names are case-sensitive three");
is(document.getElementsByClassName("a B").length, 0,
"Class names are case-sensitive four");
is(document.getElementsByClassName("A b").length, 1,
"Have one node of class 'A b'");
is(document.getElementsByClassName("A b")[0], document.documentElement,
"Root is class 'A b'");
</script>
</pre>
</body>
</html>