зеркало из https://github.com/mozilla/gecko-dev.git
Fix mutation handling in Inspector to be more robust and correct. Bug 285204,
r=timeless, sr=neil
This commit is contained in:
Родитель
16ad4561fb
Коммит
fe49891b8f
|
@ -489,10 +489,18 @@ inDOMView::GetParentIndex(PRInt32 rowIndex, PRInt32 *_retval)
|
||||||
RowToNode(rowIndex, &node);
|
RowToNode(rowIndex, &node);
|
||||||
if (!node) return NS_ERROR_FAILURE;
|
if (!node) return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
// GetParentIndex returns -1 if there is no parent
|
||||||
|
*_retval = -1;
|
||||||
|
|
||||||
inDOMViewNode* checkNode = nsnull;
|
inDOMViewNode* checkNode = nsnull;
|
||||||
PRUint32 i = rowIndex - 1;
|
PRInt32 i = rowIndex - 1;
|
||||||
do {
|
do {
|
||||||
RowToNode(i, &checkNode);
|
nsresult rv = RowToNode(i, &checkNode);
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
// No parent. Just break out.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (checkNode == node->parent) {
|
if (checkNode == node->parent) {
|
||||||
*_retval = i;
|
*_retval = i;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
@ -762,9 +770,16 @@ inDOMView::ContentAppended(nsIDocument *aDocument,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIContent *child = aContainer->GetChildAt(aNewIndexInContainer);
|
PRUint32 count = aContainer->GetChildCount();
|
||||||
|
NS_ASSERTION((PRUint32)aNewIndexInContainer < count,
|
||||||
|
"Bogus aNewIndexInContainer");
|
||||||
|
|
||||||
ContentInserted(aDocument, aContainer, child, aNewIndexInContainer);
|
while ((PRUint32)aNewIndexInContainer < count) {
|
||||||
|
nsIContent *child = aContainer->GetChildAt(aNewIndexInContainer);
|
||||||
|
|
||||||
|
ContentInserted(aDocument, aContainer, child, aNewIndexInContainer);
|
||||||
|
++aNewIndexInContainer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -801,6 +816,16 @@ inDOMView::ContentInserted(nsIDocument *aDocument, nsIContent* aContainer,
|
||||||
if (NS_FAILED(rv = RowToNode(parentRow, &parentNode)))
|
if (NS_FAILED(rv = RowToNode(parentRow, &parentNode)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!parentNode->isOpen) {
|
||||||
|
// Parent is not open, so don't bother creating tree rows for the
|
||||||
|
// kids. But do indicate that it's now a container, if needed.
|
||||||
|
if (!parentNode->isContainer) {
|
||||||
|
parentNode->isContainer = PR_TRUE;
|
||||||
|
mTree->InvalidateRow(parentRow);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// get the previous sibling of the inserted content
|
// get the previous sibling of the inserted content
|
||||||
nsCOMPtr<nsIDOMNode> previous;
|
nsCOMPtr<nsIDOMNode> previous;
|
||||||
GetRealPreviousSibling(childDOMNode, parent, getter_AddRefs(previous));
|
GetRealPreviousSibling(childDOMNode, parent, getter_AddRefs(previous));
|
||||||
|
@ -860,13 +885,28 @@ inDOMView::ContentRemoved(nsIDocument *aDocument, nsIContent* aContainer, nsICon
|
||||||
if (NS_FAILED(rv = RowToNode(row, &oldNode)))
|
if (NS_FAILED(rv = RowToNode(row, &oldNode)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// The parent may no longer be a container. Note that we don't want
|
||||||
|
// to access oldNode after calling RemoveNode, so do this now.
|
||||||
|
inDOMViewNode* parentNode = oldNode->parent;
|
||||||
|
|
||||||
|
// Keep track of how many rows we are removing. It's at least one,
|
||||||
|
// but if we're open it's more.
|
||||||
|
PRInt32 oldCount = GetRowCount();
|
||||||
|
|
||||||
if (oldNode->isOpen)
|
if (oldNode->isOpen)
|
||||||
CollapseNode(row);
|
CollapseNode(row);
|
||||||
|
|
||||||
RemoveLink(oldNode);
|
RemoveLink(oldNode);
|
||||||
RemoveNode(row);
|
RemoveNode(row);
|
||||||
|
|
||||||
mTree->RowCountChanged(row, -1);
|
if (aContainer->GetChildCount() == 0) {
|
||||||
|
// Fix up the parent
|
||||||
|
parentNode->isContainer = PR_FALSE;
|
||||||
|
parentNode->isOpen = PR_FALSE;
|
||||||
|
mTree->InvalidateRow(NodeToRow(parentNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
mTree->RowCountChanged(row, GetRowCount() - oldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
@ -886,6 +926,12 @@ inDOMView::GetRowCount()
|
||||||
return mNodes.Count();
|
return mNodes.Count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRInt32
|
||||||
|
inDOMView::NodeToRow(inDOMViewNode* aNode)
|
||||||
|
{
|
||||||
|
return mNodes.IndexOf(aNode);
|
||||||
|
}
|
||||||
|
|
||||||
inDOMViewNode*
|
inDOMViewNode*
|
||||||
inDOMView::CreateNode(nsIDOMNode* aNode, inDOMViewNode* aParent)
|
inDOMView::CreateNode(nsIDOMNode* aNode, inDOMViewNode* aParent)
|
||||||
{
|
{
|
||||||
|
@ -1010,7 +1056,10 @@ void
|
||||||
inDOMView::CollapseNode(PRInt32 aRow)
|
inDOMView::CollapseNode(PRInt32 aRow)
|
||||||
{
|
{
|
||||||
inDOMViewNode* node = nsnull;
|
inDOMViewNode* node = nsnull;
|
||||||
RowToNode(aRow, &node);
|
nsresult rv = RowToNode(aRow, &node);
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PRInt32 row = 0;
|
PRInt32 row = 0;
|
||||||
GetLastDescendantOf(node, aRow, &row);
|
GetLastDescendantOf(node, aRow, &row);
|
||||||
|
|
|
@ -102,6 +102,7 @@ protected:
|
||||||
|
|
||||||
inDOMViewNode* GetNodeAt(PRInt32 aIndex);
|
inDOMViewNode* GetNodeAt(PRInt32 aIndex);
|
||||||
PRInt32 GetRowCount();
|
PRInt32 GetRowCount();
|
||||||
|
PRInt32 NodeToRow(inDOMViewNode* aNode);
|
||||||
PRBool RowOutOfBounds(PRInt32 aRow, PRInt32 aCount);
|
PRBool RowOutOfBounds(PRInt32 aRow, PRInt32 aCount);
|
||||||
inDOMViewNode* CreateNode(nsIDOMNode* aNode, inDOMViewNode* aParent);
|
inDOMViewNode* CreateNode(nsIDOMNode* aNode, inDOMViewNode* aParent);
|
||||||
void AppendNode(inDOMViewNode* aNode);
|
void AppendNode(inDOMViewNode* aNode);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче