From 1ceb1e0a5c9de9e418b5d4f8a2641abb5a77d040 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Fri, 24 Apr 2015 14:27:34 +0300 Subject: [PATCH] Bug 1149163 part 2 - Make nsDOMIterator infallible; r=froydnj --- editor/libeditor/nsEditorUtils.cpp | 82 +++++++++---------------- editor/libeditor/nsEditorUtils.h | 22 +++---- editor/libeditor/nsHTMLDataTransfer.cpp | 7 +-- editor/libeditor/nsHTMLEditRules.cpp | 46 +++++--------- 4 files changed, 59 insertions(+), 98 deletions(-) diff --git a/editor/libeditor/nsEditorUtils.cpp b/editor/libeditor/nsEditorUtils.cpp index 210a201beffe..3e7433dd2856 100644 --- a/editor/libeditor/nsEditorUtils.cpp +++ b/editor/libeditor/nsEditorUtils.cpp @@ -66,91 +66,69 @@ nsAutoSelectionReset::Abort() * some helper classes for iterating the dom tree *****************************************************************************/ -nsDOMIterator::nsDOMIterator() : -mIter(nullptr) +nsDOMIterator::nsDOMIterator(nsRange& aRange) +{ + MOZ_ASSERT(aRange.GetStartParent(), "Invalid range"); + mIter = NS_NewContentIterator(); + DebugOnly res = mIter->Init(&aRange); + MOZ_ASSERT(NS_SUCCEEDED(res)); +} + +nsDOMIterator::nsDOMIterator(nsIDOMNode& aNode) +{ + mIter = NS_NewContentIterator(); + nsCOMPtr node = do_QueryInterface(&aNode); + NS_ENSURE_TRUE(node, ); + DebugOnly res = mIter->Init(node); + MOZ_ASSERT(NS_SUCCEEDED(res)); +} + +nsDOMIterator::nsDOMIterator() { } - + nsDOMIterator::~nsDOMIterator() { } - -nsresult -nsDOMIterator::Init(nsRange* aRange) -{ - nsresult res; - mIter = do_CreateInstance("@mozilla.org/content/post-content-iterator;1", &res); - NS_ENSURE_SUCCESS(res, res); - NS_ENSURE_TRUE(mIter, NS_ERROR_FAILURE); - return mIter->Init(aRange); -} -nsresult -nsDOMIterator::Init(nsIDOMNode* aNode) -{ - nsresult res; - mIter = do_CreateInstance("@mozilla.org/content/post-content-iterator;1", &res); - NS_ENSURE_SUCCESS(res, res); - NS_ENSURE_TRUE(mIter, NS_ERROR_FAILURE); - nsCOMPtr content = do_QueryInterface(aNode); - return mIter->Init(content); -} - -nsresult +void nsDOMIterator::AppendList(nsBoolDomIterFunctor& functor, nsTArray>& arrayOfNodes) const { // Iterate through dom and build list - while (!mIter->IsDone()) { + for (; !mIter->IsDone(); mIter->Next()) { nsCOMPtr node = mIter->GetCurrentNode(); - NS_ENSURE_TRUE(node, NS_ERROR_NULL_POINTER); if (functor(node)) { arrayOfNodes.AppendElement(node); } - mIter->Next(); } - return NS_OK; } -nsresult +void nsDOMIterator::AppendList(nsBoolDomIterFunctor& functor, nsCOMArray& arrayOfNodes) const { - nsCOMPtr node; - // iterate through dom and build list - while (!mIter->IsDone()) - { - node = do_QueryInterface(mIter->GetCurrentNode()); - NS_ENSURE_TRUE(node, NS_ERROR_NULL_POINTER); + for (; !mIter->IsDone(); mIter->Next()) { + nsCOMPtr node = mIter->GetCurrentNode()->AsDOMNode(); - if (functor(node)) - { + if (functor(node)) { arrayOfNodes.AppendObject(node); } - mIter->Next(); } - return NS_OK; } -nsDOMSubtreeIterator::nsDOMSubtreeIterator() +nsDOMSubtreeIterator::nsDOMSubtreeIterator(nsRange& aRange) { + mIter = NS_NewContentSubtreeIterator(); + DebugOnly res = mIter->Init(&aRange); + MOZ_ASSERT(NS_SUCCEEDED(res)); } - + nsDOMSubtreeIterator::~nsDOMSubtreeIterator() { } - -nsresult -nsDOMSubtreeIterator::Init(nsRange* aRange) -{ - nsresult res; - mIter = do_CreateInstance("@mozilla.org/content/subtree-content-iterator;1", &res); - NS_ENSURE_SUCCESS(res, res); - NS_ENSURE_TRUE(mIter, NS_ERROR_FAILURE); - return mIter->Init(aRange); -} /****************************************************************************** * some general purpose editor utils diff --git a/editor/libeditor/nsEditorUtils.h b/editor/libeditor/nsEditorUtils.h index 868572d9232d..e76c3f064251 100644 --- a/editor/libeditor/nsEditorUtils.h +++ b/editor/libeditor/nsEditorUtils.h @@ -177,26 +177,26 @@ class nsBoolDomIterFunctor class MOZ_STACK_CLASS nsDOMIterator { public: - nsDOMIterator(); + explicit nsDOMIterator(nsRange& aRange); + explicit nsDOMIterator(nsIDOMNode& aNode); virtual ~nsDOMIterator(); - - nsresult Init(nsRange* aRange); - nsresult Init(nsIDOMNode* aNode); - nsresult AppendList(nsBoolDomIterFunctor& functor, - nsTArray>& arrayOfNodes) const; - nsresult AppendList(nsBoolDomIterFunctor& functor, - nsCOMArray& arrayOfNodes) const; + + void AppendList(nsBoolDomIterFunctor& functor, + nsTArray>& arrayOfNodes) const; + void AppendList(nsBoolDomIterFunctor& functor, + nsCOMArray& arrayOfNodes) const; protected: nsCOMPtr mIter; + + // For nsDOMSubtreeIterator + nsDOMIterator(); }; class MOZ_STACK_CLASS nsDOMSubtreeIterator : public nsDOMIterator { public: - nsDOMSubtreeIterator(); + explicit nsDOMSubtreeIterator(nsRange& aRange); virtual ~nsDOMSubtreeIterator(); - - nsresult Init(nsRange* aRange); }; class nsTrivialFunctor : public nsBoolDomIterFunctor diff --git a/editor/libeditor/nsHTMLDataTransfer.cpp b/editor/libeditor/nsHTMLDataTransfer.cpp index 284a08ef78bf..72918fa0c173 100644 --- a/editor/libeditor/nsHTMLDataTransfer.cpp +++ b/editor/libeditor/nsHTMLDataTransfer.cpp @@ -2197,11 +2197,10 @@ nsresult nsHTMLEditor::CreateListOfNodesToPaste(nsIDOMNode *aFragmentAsNode, // now use a subtree iterator over the range to create a list of nodes nsTrivialFunctor functor; - nsDOMSubtreeIterator iter; - rv = iter.Init(docFragRange); - NS_ENSURE_SUCCESS(rv, rv); + nsDOMSubtreeIterator iter(*docFragRange); + iter.AppendList(functor, outNodeList); - return iter.AppendList(functor, outNodeList); + return NS_OK; } nsresult diff --git a/editor/libeditor/nsHTMLEditRules.cpp b/editor/libeditor/nsHTMLEditRules.cpp index c571edcf67dc..a2a8d68f9387 100644 --- a/editor/libeditor/nsHTMLEditRules.cpp +++ b/editor/libeditor/nsHTMLEditRules.cpp @@ -2440,11 +2440,8 @@ nsHTMLEditRules::WillDeleteSelection(Selection* aSelection, // Build a list of nodes in the range nsTArray> arrayOfNodes; nsTrivialFunctor functor; - nsDOMSubtreeIterator iter; - res = iter.Init(range); - NS_ENSURE_SUCCESS(res, res); - res = iter.AppendList(functor, arrayOfNodes); - NS_ENSURE_SUCCESS(res, res); + nsDOMSubtreeIterator iter(*range); + iter.AppendList(functor, arrayOfNodes); // Now that we have the list, delete non-table elements int32_t listCount = arrayOfNodes.Length(); @@ -4933,11 +4930,8 @@ nsHTMLEditRules::AlignInnerBlocks(nsIDOMNode *aNode, const nsAString *alignType) // gather list of table cells or list items nsCOMArray arrayOfNodes; nsTableCellAndListItemFunctor functor; - nsDOMIterator iter; - res = iter.Init(aNode); - NS_ENSURE_SUCCESS(res, res); - res = iter.AppendList(functor, arrayOfNodes); - NS_ENSURE_SUCCESS(res, res); + nsDOMIterator iter(*aNode); + iter.AppendList(functor, arrayOfNodes); // now that we have the list, align their contents as requested int32_t listCount = arrayOfNodes.Count(); @@ -5939,13 +5933,10 @@ nsHTMLEditRules::GetNodesForOperation(nsTArray>& inArrayOfRang { opRange = inArrayOfRanges[i]; - nsDOMSubtreeIterator iter; - res = iter.Init(opRange); - NS_ENSURE_SUCCESS(res, res); + nsDOMSubtreeIterator iter(*opRange); if (outArrayOfNodes.Count() == 0) { nsTrivialFunctor functor; - res = iter.AppendList(functor, outArrayOfNodes); - NS_ENSURE_SUCCESS(res, res); + iter.AppendList(functor, outArrayOfNodes); } else { // We don't want duplicates in outArrayOfNodes, so we use an @@ -5953,8 +5944,7 @@ nsHTMLEditRules::GetNodesForOperation(nsTArray>& inArrayOfRang // outArrayOfNodes. nsCOMArray nodes; nsUniqueFunctor functor(outArrayOfNodes); - res = iter.AppendList(functor, nodes); - NS_ENSURE_SUCCESS(res, res); + iter.AppendList(functor, nodes); if (!outArrayOfNodes.AppendObjects(nodes)) return NS_ERROR_OUT_OF_MEMORY; } @@ -6344,11 +6334,8 @@ nsHTMLEditRules::BustUpInlinesAtBRs(nsIDOMNode *inNode, // the inline container. nsCOMArray arrayOfBreaks; nsBRNodeFunctor functor; - nsDOMIterator iter; - nsresult res = iter.Init(inNode); - NS_ENSURE_SUCCESS(res, res); - res = iter.AppendList(functor, arrayOfBreaks); - NS_ENSURE_SUCCESS(res, res); + nsDOMIterator iter(*inNode); + iter.AppendList(functor, arrayOfBreaks); // if there aren't any breaks, just put inNode itself in the array int32_t listCount = arrayOfBreaks.Count(); @@ -6376,7 +6363,7 @@ nsHTMLEditRules::BustUpInlinesAtBRs(nsIDOMNode *inNode, splitParentNode = GetAsDOMNode(nsEditor::GetNodeLocation(breakNode, &splitOffset)); NS_ENSURE_STATE(mHTMLEditor); - res = mHTMLEditor->SplitNodeDeep(splitDeepNode, splitParentNode, splitOffset, + nsresult res = mHTMLEditor->SplitNodeDeep(splitDeepNode, splitParentNode, splitOffset, &resultOffset, false, address_of(leftNode), address_of(rightNode)); NS_ENSURE_SUCCESS(res, res); // put left node in node list @@ -6404,7 +6391,7 @@ nsHTMLEditRules::BustUpInlinesAtBRs(nsIDOMNode *inNode, return NS_ERROR_FAILURE; } } - return res; + return NS_OK; } @@ -7622,11 +7609,8 @@ nsHTMLEditRules::AdjustSpecialBreaks(bool aSafeToAskFrames) // gather list of empty nodes NS_ENSURE_STATE(mHTMLEditor); nsEmptyEditableFunctor functor(mHTMLEditor); - nsDOMIterator iter; - nsresult res = iter.Init(mDocChangeRange); - NS_ENSURE_SUCCESS(res, res); - res = iter.AppendList(functor, arrayOfNodes); - NS_ENSURE_SUCCESS(res, res); + nsDOMIterator iter(*mDocChangeRange); + iter.AppendList(functor, arrayOfNodes); // put moz-br's into these empty li's and td's nodeCount = arrayOfNodes.Count(); @@ -7639,13 +7623,13 @@ nsHTMLEditRules::AdjustSpecialBreaks(bool aSafeToAskFrames) uint32_t len; nsCOMPtr theNode = arrayOfNodes[0]; arrayOfNodes.RemoveObjectAt(0); - res = nsEditor::GetLengthOfDOMNode(theNode, len); + nsresult res = nsEditor::GetLengthOfDOMNode(theNode, len); NS_ENSURE_SUCCESS(res, res); res = CreateMozBR(theNode, (int32_t)len); NS_ENSURE_SUCCESS(res, res); } - return res; + return NS_OK; } nsresult