Fix silent failure from JS on firstChild. Clean up other baby-eating methods.

This commit is contained in:
waterson%netscape.com 1999-08-04 02:26:26 +00:00
Родитель 018b98b1b3
Коммит 0035d5bbb3
3 изменённых файлов: 138 добавлений и 135 удалений

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

@ -653,26 +653,28 @@ RDFElementImpl::GetChildNodes(nsIDOMNodeList** aChildNodes)
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
PRInt32 count; PRInt32 count;
if (NS_SUCCEEDED(rv = ChildCount(count))) { rv = ChildCount(count);
for (PRInt32 i = 0; i < count; ++i) { NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child count");
nsCOMPtr<nsIContent> child; if (NS_FAILED(rv)) return rv;
rv = ChildAt(i, *getter_AddRefs(child));
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child");
if (NS_FAILED(rv))
break;
nsCOMPtr<nsIDOMNode> domNode; for (PRInt32 i = 0; i < count; ++i) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) getter_AddRefs(domNode)); nsCOMPtr<nsIContent> child;
if (NS_FAILED(rv)) { rv = ChildAt(i, *getter_AddRefs(child));
NS_WARNING("child content doesn't support nsIDOMNode"); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child");
continue; if (NS_FAILED(rv))
} break;
rv = children->AppendNode(domNode); nsCOMPtr<nsIDOMNode> domNode;
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to append node to list"); rv = child->QueryInterface(kIDOMNodeIID, (void**) getter_AddRefs(domNode));
if (NS_FAILED(rv)) if (NS_FAILED(rv)) {
break; NS_WARNING("child content doesn't support nsIDOMNode");
continue;
} }
rv = children->AppendNode(domNode);
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to append node to list");
if (NS_FAILED(rv))
break;
} }
// Create() addref'd for us // Create() addref'd for us
@ -685,18 +687,17 @@ NS_IMETHODIMP
RDFElementImpl::GetFirstChild(nsIDOMNode** aFirstChild) RDFElementImpl::GetFirstChild(nsIDOMNode** aFirstChild)
{ {
nsresult rv; nsresult rv;
nsIContent* child; nsCOMPtr<nsIContent> child;
if (NS_SUCCEEDED(rv = ChildAt(0, child))) { rv = ChildAt(0, *getter_AddRefs(child));
if (nsnull == child) return(NS_ERROR_FAILURE);
if (NS_SUCCEEDED(rv) && (child != nsnull)) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) aFirstChild); rv = child->QueryInterface(kIDOMNodeIID, (void**) aFirstChild);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(child); // balance the AddRef in ChildAt()
return rv; return rv;
} }
else {
*aFirstChild = nsnull; *aFirstChild = nsnull;
return NS_OK; return NS_OK;
}
} }
@ -705,23 +706,24 @@ RDFElementImpl::GetLastChild(nsIDOMNode** aLastChild)
{ {
nsresult rv; nsresult rv;
PRInt32 count; PRInt32 count;
if (NS_FAILED(rv = ChildCount(count))) { rv = ChildCount(count);
NS_ERROR("unable to get child count"); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child count");
return rv;
} if (NS_SUCCEEDED(rv) && (count != 0)) {
if (count) { nsCOMPtr<nsIContent> child;
nsIContent* child; rv = ChildAt(count - 1, *getter_AddRefs(child));
if (NS_SUCCEEDED(rv = ChildAt(count - 1, child))) {
NS_ASSERTION(child != nsnull, "no child");
if (child) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) aLastChild); rv = child->QueryInterface(kIDOMNodeIID, (void**) aLastChild);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(child); // balance the AddRef in ChildAt() return rv;
} }
return rv;
}
else {
*aLastChild = nsnull;
return NS_OK;
} }
*aLastChild = nsnull;
return NS_OK;
} }
@ -732,12 +734,11 @@ RDFElementImpl::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
PRInt32 pos; PRInt32 pos;
mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos); mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos);
if (pos > -1) { if (pos > -1) {
nsIContent* prev; nsCOMPtr<nsIContent> prev;
mParent->ChildAt(--pos, prev); mParent->ChildAt(--pos, *getter_AddRefs(prev));
if (prev) { if (prev) {
nsresult rv = prev->QueryInterface(kIDOMNodeIID, (void**) aPreviousSibling); nsresult rv = prev->QueryInterface(kIDOMNodeIID, (void**) aPreviousSibling);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(prev); // balance the AddRef in ChildAt()
return rv; return rv;
} }
} }
@ -757,16 +758,16 @@ RDFElementImpl::GetNextSibling(nsIDOMNode** aNextSibling)
PRInt32 pos; PRInt32 pos;
mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos); mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos);
if (pos > -1) { if (pos > -1) {
nsIContent* next; nsCOMPtr<nsIContent> next;
mParent->ChildAt(++pos, next); mParent->ChildAt(++pos, *getter_AddRefs(next));
if (nsnull != next) { if (next) {
nsresult res = next->QueryInterface(kIDOMNodeIID, (void**) aNextSibling); nsresult res = next->QueryInterface(kIDOMNodeIID, (void**) aNextSibling);
NS_ASSERTION(NS_OK == res, "not a DOM Node"); NS_ASSERTION(NS_OK == res, "not a DOM Node");
NS_RELEASE(next); // balance the AddRef in ChildAt()
return res; return res;
} }
} }
} }
// XXX Nodes that are just below the document (their parent is the // XXX Nodes that are just below the document (their parent is the
// document) need to go to the document to find their next sibling. // document) need to go to the document to find their next sibling.
*aNextSibling = nsnull; *aNextSibling = nsnull;

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

@ -653,26 +653,28 @@ RDFElementImpl::GetChildNodes(nsIDOMNodeList** aChildNodes)
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
PRInt32 count; PRInt32 count;
if (NS_SUCCEEDED(rv = ChildCount(count))) { rv = ChildCount(count);
for (PRInt32 i = 0; i < count; ++i) { NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child count");
nsCOMPtr<nsIContent> child; if (NS_FAILED(rv)) return rv;
rv = ChildAt(i, *getter_AddRefs(child));
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child");
if (NS_FAILED(rv))
break;
nsCOMPtr<nsIDOMNode> domNode; for (PRInt32 i = 0; i < count; ++i) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) getter_AddRefs(domNode)); nsCOMPtr<nsIContent> child;
if (NS_FAILED(rv)) { rv = ChildAt(i, *getter_AddRefs(child));
NS_WARNING("child content doesn't support nsIDOMNode"); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child");
continue; if (NS_FAILED(rv))
} break;
rv = children->AppendNode(domNode); nsCOMPtr<nsIDOMNode> domNode;
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to append node to list"); rv = child->QueryInterface(kIDOMNodeIID, (void**) getter_AddRefs(domNode));
if (NS_FAILED(rv)) if (NS_FAILED(rv)) {
break; NS_WARNING("child content doesn't support nsIDOMNode");
continue;
} }
rv = children->AppendNode(domNode);
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to append node to list");
if (NS_FAILED(rv))
break;
} }
// Create() addref'd for us // Create() addref'd for us
@ -685,18 +687,17 @@ NS_IMETHODIMP
RDFElementImpl::GetFirstChild(nsIDOMNode** aFirstChild) RDFElementImpl::GetFirstChild(nsIDOMNode** aFirstChild)
{ {
nsresult rv; nsresult rv;
nsIContent* child; nsCOMPtr<nsIContent> child;
if (NS_SUCCEEDED(rv = ChildAt(0, child))) { rv = ChildAt(0, *getter_AddRefs(child));
if (nsnull == child) return(NS_ERROR_FAILURE);
if (NS_SUCCEEDED(rv) && (child != nsnull)) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) aFirstChild); rv = child->QueryInterface(kIDOMNodeIID, (void**) aFirstChild);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(child); // balance the AddRef in ChildAt()
return rv; return rv;
} }
else {
*aFirstChild = nsnull; *aFirstChild = nsnull;
return NS_OK; return NS_OK;
}
} }
@ -705,23 +706,24 @@ RDFElementImpl::GetLastChild(nsIDOMNode** aLastChild)
{ {
nsresult rv; nsresult rv;
PRInt32 count; PRInt32 count;
if (NS_FAILED(rv = ChildCount(count))) { rv = ChildCount(count);
NS_ERROR("unable to get child count"); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child count");
return rv;
} if (NS_SUCCEEDED(rv) && (count != 0)) {
if (count) { nsCOMPtr<nsIContent> child;
nsIContent* child; rv = ChildAt(count - 1, *getter_AddRefs(child));
if (NS_SUCCEEDED(rv = ChildAt(count - 1, child))) {
NS_ASSERTION(child != nsnull, "no child");
if (child) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) aLastChild); rv = child->QueryInterface(kIDOMNodeIID, (void**) aLastChild);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(child); // balance the AddRef in ChildAt() return rv;
} }
return rv;
}
else {
*aLastChild = nsnull;
return NS_OK;
} }
*aLastChild = nsnull;
return NS_OK;
} }
@ -732,12 +734,11 @@ RDFElementImpl::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
PRInt32 pos; PRInt32 pos;
mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos); mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos);
if (pos > -1) { if (pos > -1) {
nsIContent* prev; nsCOMPtr<nsIContent> prev;
mParent->ChildAt(--pos, prev); mParent->ChildAt(--pos, *getter_AddRefs(prev));
if (prev) { if (prev) {
nsresult rv = prev->QueryInterface(kIDOMNodeIID, (void**) aPreviousSibling); nsresult rv = prev->QueryInterface(kIDOMNodeIID, (void**) aPreviousSibling);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(prev); // balance the AddRef in ChildAt()
return rv; return rv;
} }
} }
@ -757,16 +758,16 @@ RDFElementImpl::GetNextSibling(nsIDOMNode** aNextSibling)
PRInt32 pos; PRInt32 pos;
mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos); mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos);
if (pos > -1) { if (pos > -1) {
nsIContent* next; nsCOMPtr<nsIContent> next;
mParent->ChildAt(++pos, next); mParent->ChildAt(++pos, *getter_AddRefs(next));
if (nsnull != next) { if (next) {
nsresult res = next->QueryInterface(kIDOMNodeIID, (void**) aNextSibling); nsresult res = next->QueryInterface(kIDOMNodeIID, (void**) aNextSibling);
NS_ASSERTION(NS_OK == res, "not a DOM Node"); NS_ASSERTION(NS_OK == res, "not a DOM Node");
NS_RELEASE(next); // balance the AddRef in ChildAt()
return res; return res;
} }
} }
} }
// XXX Nodes that are just below the document (their parent is the // XXX Nodes that are just below the document (their parent is the
// document) need to go to the document to find their next sibling. // document) need to go to the document to find their next sibling.
*aNextSibling = nsnull; *aNextSibling = nsnull;

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

@ -653,26 +653,28 @@ RDFElementImpl::GetChildNodes(nsIDOMNodeList** aChildNodes)
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
PRInt32 count; PRInt32 count;
if (NS_SUCCEEDED(rv = ChildCount(count))) { rv = ChildCount(count);
for (PRInt32 i = 0; i < count; ++i) { NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child count");
nsCOMPtr<nsIContent> child; if (NS_FAILED(rv)) return rv;
rv = ChildAt(i, *getter_AddRefs(child));
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child");
if (NS_FAILED(rv))
break;
nsCOMPtr<nsIDOMNode> domNode; for (PRInt32 i = 0; i < count; ++i) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) getter_AddRefs(domNode)); nsCOMPtr<nsIContent> child;
if (NS_FAILED(rv)) { rv = ChildAt(i, *getter_AddRefs(child));
NS_WARNING("child content doesn't support nsIDOMNode"); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child");
continue; if (NS_FAILED(rv))
} break;
rv = children->AppendNode(domNode); nsCOMPtr<nsIDOMNode> domNode;
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to append node to list"); rv = child->QueryInterface(kIDOMNodeIID, (void**) getter_AddRefs(domNode));
if (NS_FAILED(rv)) if (NS_FAILED(rv)) {
break; NS_WARNING("child content doesn't support nsIDOMNode");
continue;
} }
rv = children->AppendNode(domNode);
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to append node to list");
if (NS_FAILED(rv))
break;
} }
// Create() addref'd for us // Create() addref'd for us
@ -685,18 +687,17 @@ NS_IMETHODIMP
RDFElementImpl::GetFirstChild(nsIDOMNode** aFirstChild) RDFElementImpl::GetFirstChild(nsIDOMNode** aFirstChild)
{ {
nsresult rv; nsresult rv;
nsIContent* child; nsCOMPtr<nsIContent> child;
if (NS_SUCCEEDED(rv = ChildAt(0, child))) { rv = ChildAt(0, *getter_AddRefs(child));
if (nsnull == child) return(NS_ERROR_FAILURE);
if (NS_SUCCEEDED(rv) && (child != nsnull)) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) aFirstChild); rv = child->QueryInterface(kIDOMNodeIID, (void**) aFirstChild);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(child); // balance the AddRef in ChildAt()
return rv; return rv;
} }
else {
*aFirstChild = nsnull; *aFirstChild = nsnull;
return NS_OK; return NS_OK;
}
} }
@ -705,23 +706,24 @@ RDFElementImpl::GetLastChild(nsIDOMNode** aLastChild)
{ {
nsresult rv; nsresult rv;
PRInt32 count; PRInt32 count;
if (NS_FAILED(rv = ChildCount(count))) { rv = ChildCount(count);
NS_ERROR("unable to get child count"); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get child count");
return rv;
} if (NS_SUCCEEDED(rv) && (count != 0)) {
if (count) { nsCOMPtr<nsIContent> child;
nsIContent* child; rv = ChildAt(count - 1, *getter_AddRefs(child));
if (NS_SUCCEEDED(rv = ChildAt(count - 1, child))) {
NS_ASSERTION(child != nsnull, "no child");
if (child) {
rv = child->QueryInterface(kIDOMNodeIID, (void**) aLastChild); rv = child->QueryInterface(kIDOMNodeIID, (void**) aLastChild);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(child); // balance the AddRef in ChildAt() return rv;
} }
return rv;
}
else {
*aLastChild = nsnull;
return NS_OK;
} }
*aLastChild = nsnull;
return NS_OK;
} }
@ -732,12 +734,11 @@ RDFElementImpl::GetPreviousSibling(nsIDOMNode** aPreviousSibling)
PRInt32 pos; PRInt32 pos;
mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos); mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos);
if (pos > -1) { if (pos > -1) {
nsIContent* prev; nsCOMPtr<nsIContent> prev;
mParent->ChildAt(--pos, prev); mParent->ChildAt(--pos, *getter_AddRefs(prev));
if (prev) { if (prev) {
nsresult rv = prev->QueryInterface(kIDOMNodeIID, (void**) aPreviousSibling); nsresult rv = prev->QueryInterface(kIDOMNodeIID, (void**) aPreviousSibling);
NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node"); NS_ASSERTION(NS_SUCCEEDED(rv), "not a DOM node");
NS_RELEASE(prev); // balance the AddRef in ChildAt()
return rv; return rv;
} }
} }
@ -757,16 +758,16 @@ RDFElementImpl::GetNextSibling(nsIDOMNode** aNextSibling)
PRInt32 pos; PRInt32 pos;
mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos); mParent->IndexOf(NS_STATIC_CAST(nsIStyledContent*, this), pos);
if (pos > -1) { if (pos > -1) {
nsIContent* next; nsCOMPtr<nsIContent> next;
mParent->ChildAt(++pos, next); mParent->ChildAt(++pos, *getter_AddRefs(next));
if (nsnull != next) { if (next) {
nsresult res = next->QueryInterface(kIDOMNodeIID, (void**) aNextSibling); nsresult res = next->QueryInterface(kIDOMNodeIID, (void**) aNextSibling);
NS_ASSERTION(NS_OK == res, "not a DOM Node"); NS_ASSERTION(NS_OK == res, "not a DOM Node");
NS_RELEASE(next); // balance the AddRef in ChildAt()
return res; return res;
} }
} }
} }
// XXX Nodes that are just below the document (their parent is the // XXX Nodes that are just below the document (their parent is the
// document) need to go to the document to find their next sibling. // document) need to go to the document to find their next sibling.
*aNextSibling = nsnull; *aNextSibling = nsnull;