author | Fabien Cazenave <kaze@kompozer.net> |
Sat, 03 Dec 2011 22:50:15 +0100 | |
changeset 81356 | b45ac1c3ab89fee9309dc41408ec6c27984e6c49 |
parent 81355 | c2102c45c8da7870239f2b313359a6da18703a4a |
child 81357 | 5cac792f745ed81f672ea6052d8d31dc36f58de8 |
push id | 21567 |
push user | Ms2ger@gmail.com |
push date | Sun, 04 Dec 2011 10:36:54 +0000 |
treeherder | mozilla-central@78de2c2bdad5 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | ehsan |
bugs | 684187 |
milestone | 11.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -1017,17 +1017,17 @@ nsEditor::SetShouldTxnSetSelection(bool return NS_OK; } NS_IMETHODIMP nsEditor::GetDocumentIsEmpty(bool *aDocumentIsEmpty) { *aDocumentIsEmpty = true; - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); bool hasChildNodes; nsresult res = rootElement->HasChildNodes(&hasChildNodes); *aDocumentIsEmpty = !hasChildNodes; return res; @@ -1058,17 +1058,17 @@ NS_IMETHODIMP nsEditor::BeginningOfDocum // get the selection nsCOMPtr<nsISelection> selection; nsresult result = GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(result, result); NS_ENSURE_TRUE(selection, NS_ERROR_NOT_INITIALIZED); // get the root element - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); // find first editable thingy nsCOMPtr<nsIDOMNode> firstNode; result = GetFirstEditableNode(rootElement, address_of(firstNode)); if (firstNode) { // if firstNode is text, set selection to beginning of the text node @@ -1104,22 +1104,19 @@ nsEditor::EndOfDocument() // get selection nsCOMPtr<nsISelection> selection; res = GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER); // get the root element - nsIDOMElement *rootElement = GetRoot(); - NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); - - nsCOMPtr<nsIDOMNode> node = do_QueryInterface(rootElement); + nsCOMPtr<nsIDOMNode> node = do_QueryInterface(GetRoot()); + NS_ENSURE_TRUE(node, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIDOMNode> child; - NS_ASSERTION(node, "Invalid root element"); do { node->GetLastChild(getter_AddRefs(child)); if (child) { if (IsContainer(child)) { node = child; } else { @@ -1973,28 +1970,24 @@ nsEditor::GetPhonetic(nsAString& aPhonet else aPhonetic.Truncate(0); return NS_OK; } static nsresult -GetEditorContentWindow(nsIDOMElement *aRoot, nsIWidget **aResult) +GetEditorContentWindow(dom::Element *aRoot, nsIWidget **aResult) { NS_ENSURE_TRUE(aRoot && aResult, NS_ERROR_NULL_POINTER); *aResult = 0; - nsCOMPtr<nsIContent> content = do_QueryInterface(aRoot); - - NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); - // Not ref counted - nsIFrame *frame = content->GetPrimaryFrame(); + nsIFrame *frame = aRoot->GetPrimaryFrame(); NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE); *aResult = frame->GetNearestWidget(); NS_ENSURE_TRUE(*aResult, NS_ERROR_FAILURE); NS_ADDREF(*aResult); return NS_OK; @@ -2098,18 +2091,18 @@ nsEditor::GetComposing(bool* aResult) /* Non-interface, public methods */ NS_IMETHODIMP nsEditor::GetRootElement(nsIDOMElement **aRootElement) { NS_ENSURE_ARG_POINTER(aRootElement); NS_ENSURE_TRUE(mRootElement, NS_ERROR_NOT_AVAILABLE); - *aRootElement = mRootElement; - NS_ADDREF(*aRootElement); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(mRootElement); + rootElement.forget(aRootElement); return NS_OK; } /** All editor operations which alter the doc should be prefaced * with a call to StartOperation, naming the action and direction */ NS_IMETHODIMP nsEditor::StartOperation(PRInt32 opID, nsIEditor::EDirection aDirection) @@ -2170,22 +2163,20 @@ nsEditor::CloneAttributes(nsIDOMNode *aD nsCOMPtr<nsIDOMNamedNodeMap> destAttributes; destElement->GetAttributes(getter_AddRefs(destAttributes)); NS_ENSURE_TRUE(sourceAttributes && destAttributes, NS_ERROR_FAILURE); nsAutoEditBatch beginBatching(this); // Use transaction system for undo only if destination // is already in the document - nsIDOMElement *rootElement = GetRoot(); - NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); - + nsCOMPtr<nsIDOMNode> p = aDestNode; + nsCOMPtr<nsIDOMNode> rootNode = do_QueryInterface(GetRoot()); + NS_ENSURE_TRUE(rootNode, NS_ERROR_NULL_POINTER); bool destInBody = true; - nsCOMPtr<nsIDOMNode> rootNode = do_QueryInterface(rootElement); - nsCOMPtr<nsIDOMNode> p = aDestNode; while (p && p != rootNode) { nsCOMPtr<nsIDOMNode> tmp; if (NS_FAILED(p->GetParentNode(getter_AddRefs(tmp))) || !tmp) { destInBody = false; break; } @@ -2287,34 +2278,35 @@ NS_IMETHODIMP nsEditor::InsertTextImpl(c // class to turn off txn selection updating. Caller also turned on rules sniffing // if desired. nsresult res; NS_ENSURE_TRUE(aInOutNode && *aInOutNode && aInOutOffset && aDoc, NS_ERROR_NULL_POINTER); if (!mInIMEMode && aStringToInsert.IsEmpty()) return NS_OK; nsCOMPtr<nsIDOMText> nodeAsText = do_QueryInterface(*aInOutNode); if (!nodeAsText && IsPlaintextEditor()) { + nsCOMPtr<nsIDOMNode> rootNode = do_QueryInterface(GetRoot()); // In some cases, aInOutNode is the anonymous DIV, and aInOutOffset is 0. // To avoid injecting unneeded text nodes, we first look to see if we have // one available. In that case, we'll just adjust aInOutNode and aInOutOffset // accordingly. - if (*aInOutNode == GetRoot() && *aInOutOffset == 0) { + if (*aInOutNode == rootNode && *aInOutOffset == 0) { nsCOMPtr<nsIDOMNode> possibleTextNode; res = (*aInOutNode)->GetFirstChild(getter_AddRefs(possibleTextNode)); if (NS_SUCCEEDED(res)) { nodeAsText = do_QueryInterface(possibleTextNode); if (nodeAsText) { *aInOutNode = possibleTextNode; } } } // In some other cases, aInOutNode is the anonymous DIV, and aInOutOffset points // to the terminating mozBR. In that case, we'll adjust aInOutNode and aInOutOffset // to the preceding text node, if any. - if (!nodeAsText && *aInOutNode == GetRoot() && *aInOutOffset > 0) { + if (!nodeAsText && *aInOutNode == rootNode && *aInOutOffset > 0) { nsCOMPtr<nsIDOMNodeList> children; res = (*aInOutNode)->GetChildNodes(getter_AddRefs(children)); if (NS_SUCCEEDED(res)) { nsCOMPtr<nsIDOMNode> possibleMozBRNode; children->Item(*aInOutOffset, getter_AddRefs(possibleMozBRNode)); if (possibleMozBRNode && nsTextEditUtils::IsMozBR(possibleMozBRNode)) { nsCOMPtr<nsIDOMNode> possibleTextNode; res = children->Item(*aInOutOffset - 1, getter_AddRefs(possibleTextNode)); @@ -2358,17 +2350,17 @@ NS_IMETHODIMP nsEditor::InsertTextImpl(c res = nodeAsText->GetLength(&length); if (NS_SUCCEEDED(res)) { *aInOutOffset = PRInt32(length); *aInOutNode = previous; } } else { nsCOMPtr<nsIDOMNode> parent; (*aInOutNode)->GetParentNode(getter_AddRefs(parent)); - if (parent == GetRoot()) { + if (parent == rootNode) { *aInOutNode = parent; } } } } PRInt32 offset = *aInOutOffset; if (mInIMEMode) { @@ -2525,17 +2517,17 @@ nsresult nsEditor::InsertTextIntoTextNod return result; } NS_IMETHODIMP nsEditor::SelectEntireDocument(nsISelection *aSelection) { if (!aSelection) { return NS_ERROR_NULL_POINTER; } - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); if (!rootElement) { return NS_ERROR_NOT_INITIALIZED; } return aSelection->SelectAllChildren(rootElement); } nsresult nsEditor::GetFirstEditableNode(nsIDOMNode *aRoot, nsCOMPtr<nsIDOMNode> *outFirstNode) { @@ -3541,43 +3533,43 @@ nsEditor::TagCanContainTag(const nsAStri return true; } bool nsEditor::IsRootNode(nsIDOMNode *inNode) { NS_ENSURE_TRUE(inNode, false); - return inNode == GetRoot(); + nsCOMPtr<nsIDOMNode> rootNode = do_QueryInterface(GetRoot()); + + return inNode == rootNode; } bool nsEditor::IsRootNode(nsINode *inNode) { NS_ENSURE_TRUE(inNode, false); - nsIDOMElement *rootElement = GetRoot(); - - nsCOMPtr<nsIDOMNode> node = do_QueryInterface(inNode); - - return node == rootElement; + nsCOMPtr<nsINode> rootNode = GetRoot(); + + return inNode == rootNode; } bool nsEditor::IsDescendantOfBody(nsIDOMNode *inNode) { nsCOMPtr<nsINode> node = do_QueryInterface(inNode); return IsDescendantOfBody(node); } bool nsEditor::IsDescendantOfBody(nsINode *inNode) { NS_ENSURE_TRUE(inNode, false); - nsCOMPtr<nsIContent> root = do_QueryInterface(GetRoot()); + nsCOMPtr<nsIContent> root = GetRoot(); NS_ENSURE_TRUE(root, false); return nsContentUtils::ContentIsDescendantOf(inNode, root); } bool nsEditor::IsContainer(nsIDOMNode *aNode) { @@ -5144,17 +5136,17 @@ nsEditor::HandleInlineSpellCheck(PRInt32 aStartOffset, aEndNode, aEndOffset) : NS_OK; } already_AddRefed<nsIContent> nsEditor::FindSelectionRoot(nsINode *aNode) { - nsCOMPtr<nsIContent> rootContent = do_QueryInterface(GetRoot()); + nsCOMPtr<nsIContent> rootContent = GetRoot(); return rootContent.forget(); } nsresult nsEditor::InitializeSelection(nsIDOMEventTarget* aFocusEventTarget) { nsCOMPtr<nsINode> targetNode = do_QueryInterface(aFocusEventTarget); NS_ENSURE_TRUE(targetNode, NS_ERROR_INVALID_ARG); @@ -5213,17 +5205,17 @@ nsEditor::InitializeSelection(nsIDOMEven if (rangeCount == 0) { BeginningOfDocument(); } } return NS_OK; } -nsIDOMElement * +dom::Element * nsEditor::GetRoot() { if (!mRootElement) { nsCOMPtr<nsIDOMElement> root; // Let GetRootElement() do the work GetRootElement(getter_AddRefs(root)); @@ -5231,28 +5223,24 @@ nsEditor::GetRoot() return mRootElement; } nsresult nsEditor::DetermineCurrentDirection() { // Get the current root direction from its frame - nsIDOMElement *rootElement = GetRoot(); - - nsresult rv; + dom::Element *rootElement = GetRoot(); // If we don't have an explicit direction, determine our direction // from the content's direction if (!(mFlags & (nsIPlaintextEditor::eEditorLeftToRight | nsIPlaintextEditor::eEditorRightToLeft))) { - nsCOMPtr<nsIContent> content = do_QueryInterface(rootElement, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - nsIFrame* frame = content->GetPrimaryFrame(); + + nsIFrame* frame = rootElement->GetPrimaryFrame(); NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE); // Set the flag here, to enable us to use the same code path below. // It will be flipped before returning from the function. if (frame->GetStyleVisibility()->mDirection == NS_STYLE_DIRECTION_RTL) { mFlags |= nsIPlaintextEditor::eEditorRightToLeft; } else { mFlags |= nsIPlaintextEditor::eEditorLeftToRight; @@ -5261,63 +5249,61 @@ nsEditor::DetermineCurrentDirection() return NS_OK; } NS_IMETHODIMP nsEditor::SwitchTextDirection() { // Get the current root direction from its frame - nsIDOMElement *rootElement = GetRoot(); - + dom::Element *rootElement = GetRoot(); nsresult rv = DetermineCurrentDirection(); NS_ENSURE_SUCCESS(rv, rv); // Apply the opposite direction if (mFlags & nsIPlaintextEditor::eEditorRightToLeft) { NS_ASSERTION(!(mFlags & nsIPlaintextEditor::eEditorLeftToRight), "Unexpected mutually exclusive flag"); mFlags &= ~nsIPlaintextEditor::eEditorRightToLeft; mFlags |= nsIPlaintextEditor::eEditorLeftToRight; - rv = rootElement->SetAttribute(NS_LITERAL_STRING("dir"), NS_LITERAL_STRING("ltr")); + rv = rootElement->SetAttr(kNameSpaceID_None, nsGkAtoms::dir, NS_LITERAL_STRING("ltr"), true); } else if (mFlags & nsIPlaintextEditor::eEditorLeftToRight) { NS_ASSERTION(!(mFlags & nsIPlaintextEditor::eEditorRightToLeft), "Unexpected mutually exclusive flag"); mFlags |= nsIPlaintextEditor::eEditorRightToLeft; mFlags &= ~nsIPlaintextEditor::eEditorLeftToRight; - rv = rootElement->SetAttribute(NS_LITERAL_STRING("dir"), NS_LITERAL_STRING("rtl")); + rv = rootElement->SetAttr(kNameSpaceID_None, nsGkAtoms::dir, NS_LITERAL_STRING("rtl"), true); } return rv; } void nsEditor::SwitchTextDirectionTo(PRUint32 aDirection) { // Get the current root direction from its frame - nsIDOMElement *rootElement = GetRoot(); - + dom::Element *rootElement = GetRoot(); nsresult rv = DetermineCurrentDirection(); NS_ENSURE_SUCCESS(rv, ); // Apply the requested direction if (aDirection == nsIPlaintextEditor::eEditorLeftToRight && (mFlags & nsIPlaintextEditor::eEditorRightToLeft)) { NS_ASSERTION(!(mFlags & nsIPlaintextEditor::eEditorLeftToRight), "Unexpected mutually exclusive flag"); mFlags &= ~nsIPlaintextEditor::eEditorRightToLeft; mFlags |= nsIPlaintextEditor::eEditorLeftToRight; - rootElement->SetAttribute(NS_LITERAL_STRING("dir"), NS_LITERAL_STRING("ltr")); + rootElement->SetAttr(kNameSpaceID_None, nsGkAtoms::dir, NS_LITERAL_STRING("ltr"), true); } else if (aDirection == nsIPlaintextEditor::eEditorRightToLeft && (mFlags & nsIPlaintextEditor::eEditorLeftToRight)) { NS_ASSERTION(!(mFlags & nsIPlaintextEditor::eEditorRightToLeft), "Unexpected mutually exclusive flag"); mFlags |= nsIPlaintextEditor::eEditorRightToLeft; mFlags &= ~nsIPlaintextEditor::eEditorLeftToRight; - rootElement->SetAttribute(NS_LITERAL_STRING("dir"), NS_LITERAL_STRING("rtl")); + rootElement->SetAttr(kNameSpaceID_None, nsGkAtoms::dir, NS_LITERAL_STRING("rtl"), true); } } #if DEBUG_JOE void nsEditor::DumpNode(nsIDOMNode *aNode, PRInt32 indent) { PRInt32 i;
--- a/editor/libeditor/base/nsEditor.h +++ b/editor/libeditor/base/nsEditor.h @@ -646,17 +646,17 @@ public: nsIDOMNode *aStartNode, PRInt32 aStartOffset, nsIDOMNode *aEndNode, PRInt32 aEndOffset); virtual already_AddRefed<nsIDOMEventTarget> GetDOMEventTarget() = 0; // Fast non-refcounting editor root element accessor - nsIDOMElement *GetRoot(); + mozilla::dom::Element *GetRoot(); // Accessor methods to flags bool IsPlaintextEditor() const { return (mFlags & nsIPlaintextEditor::eEditorPlaintextMask) != 0; } bool IsSingleLineEditor() const @@ -758,18 +758,18 @@ public: // This method has to be called by nsEditorEventListener::Focus. // All actions that have to be done when the editor is focused needs to be // added here. void OnFocus(nsIDOMEventTarget* aFocusEventTarget); protected: - PRUint32 mModCount; // number of modifications (for undo/redo stack) - PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. + PRUint32 mModCount; // number of modifications (for undo/redo stack) + PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController PRInt32 mUpdateCount; nsIViewManager::UpdateViewBatch mBatch; // Spellchecking enum Tristate { eTriUnset, @@ -780,17 +780,17 @@ protected: nsCOMPtr<nsITransactionManager> mTxnMgr; nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes nsIAtom *mPlaceHolderName; // name of placeholder transaction PRInt32 mPlaceHolderBatch; // nesting count for batching nsSelectionState *mSelState; // saved selection state for placeholder txn batching nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges - nsCOMPtr<nsIDOMElement> mRootElement; // cached root node + nsCOMPtr<mozilla::dom::Element> mRootElement; // cached root node PRInt32 mAction; // the current editor action EDirection mDirection; // the current direction of editor action // data necessary to build IME transactions nsCOMPtr<nsIPrivateTextRangeList> mIMETextRangeList; // IME special selection ranges nsCOMPtr<nsIDOMCharacterData> mIMETextNode; // current IME text node PRUint32 mIMETextOffset; // offset in text node where IME comp string begins PRUint32 mIMEBufferLength; // current length of IME comp string
--- a/editor/libeditor/html/nsHTMLEditRules.cpp +++ b/editor/libeditor/html/nsHTMLEditRules.cpp @@ -76,16 +76,17 @@ #include "nsUnicharUtils.h" #include "nsFrameSelection.h" #include "nsContentUtils.h" #include "nsTArray.h" #include "nsIHTMLDocument.h" #include "mozilla/Preferences.h" +#include "mozilla/dom/Element.h" using namespace mozilla; //const static char* kMOZEditorBogusNodeAttr="MOZ_EDITOR_BOGUS_NODE"; //const static char* kMOZEditorBogusNodeValue="TRUE"; enum { @@ -251,17 +252,17 @@ nsHTMLEditRules::Init(nsPlaintextEditor // XXX Why was this pref designed as a string and not bool? mReturnInEmptyLIKillsList = !returnInEmptyLIKillsList.EqualsLiteral("false"); // make a utility range for use by the listenter mUtilRange = do_CreateInstance("@mozilla.org/content/range;1"); NS_ENSURE_TRUE(mUtilRange, NS_ERROR_NULL_POINTER); // set up mDocChangeRange to be whole doc - nsIDOMElement *rootElem = mHTMLEditor->GetRoot(); + nsCOMPtr<nsIDOMElement> rootElem = do_QueryInterface(mHTMLEditor->GetRoot()); if (rootElem) { // temporarily turn off rules sniffing nsAutoLockRulesSniffing lockIt((nsTextEditRules*)this); if (!mDocChangeRange) { mDocChangeRange = do_CreateInstance("@mozilla.org/content/range;1"); NS_ENSURE_TRUE(mDocChangeRange, NS_ERROR_NULL_POINTER); @@ -800,17 +801,17 @@ nsHTMLEditRules::GetAlignment(bool *aMix // get selection nsCOMPtr<nsISelection>selection; nsresult res = mHTMLEditor->GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); // get selection location nsCOMPtr<nsIDOMNode> parent; - nsIDOMElement *rootElem = mHTMLEditor->GetRoot(); + nsCOMPtr<nsIDOMElement> rootElem = do_QueryInterface(mHTMLEditor->GetRoot()); NS_ENSURE_TRUE(rootElem, NS_ERROR_FAILURE); PRInt32 offset, rootOffset; res = nsEditor::GetNodeLocation(rootElem, address_of(parent), &rootOffset); NS_ENSURE_SUCCESS(res, res); res = mHTMLEditor->GetStartNodeAndOffset(selection, getter_AddRefs(parent), &offset); NS_ENSURE_SUCCESS(res, res); @@ -1007,23 +1008,20 @@ nsHTMLEditRules::GetIndentState(bool *aC if (!*aCanOutdent) { // if we haven't found something to outdent yet, also check the parents // of selection endpoints. We might have a blockquote or list item // in the parent hierarchy. // gather up info we need for test - nsCOMPtr<nsIDOMNode> parent, tmp, root; - nsIDOMElement *rootElem = mHTMLEditor->GetRoot(); - NS_ENSURE_TRUE(rootElem, NS_ERROR_NULL_POINTER); + nsCOMPtr<nsIDOMNode> parent, tmp, root = do_QueryInterface(mHTMLEditor->GetRoot()); + NS_ENSURE_TRUE(root, NS_ERROR_NULL_POINTER); nsCOMPtr<nsISelection> selection; PRInt32 selOffset; - root = do_QueryInterface(rootElem); - NS_ENSURE_TRUE(root, NS_ERROR_NO_INTERFACE); res = mHTMLEditor->GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER); // test start parent hierarchy res = mHTMLEditor->GetStartNodeAndOffset(selection, getter_AddRefs(parent), &selOffset); NS_ENSURE_SUCCESS(res, res); while (parent && (parent!=root)) @@ -1103,17 +1101,17 @@ nsHTMLEditRules::GetParagraphState(bool res = mHTMLEditor->GetStartNodeAndOffset(selection, getter_AddRefs(selNode), &selOffset); NS_ENSURE_SUCCESS(res, res); NS_ENSURE_TRUE(selNode, NS_ERROR_NULL_POINTER); arrayOfNodes.AppendObject(selNode); listCount = 1; } // remember root node - nsIDOMElement *rootElem = mHTMLEditor->GetRoot(); + nsCOMPtr<nsIDOMElement> rootElem = do_QueryInterface(mHTMLEditor->GetRoot()); NS_ENSURE_TRUE(rootElem, NS_ERROR_NULL_POINTER); // loop through the nodes in selection and examine their paragraph format for (i=listCount-1; i>=0; i--) { nsCOMPtr<nsIDOMNode> curNode = arrayOfNodes[i]; nsAutoString format; // if it is a known format node we have it easy @@ -7773,19 +7771,18 @@ nsHTMLEditRules::AdjustSelection(nsISele else theblock = mHTMLEditor->GetBlockNodeParent(selNode); if (theblock && mHTMLEditor->IsEditable(theblock)) { bool bIsEmptyNode; res = mHTMLEditor->IsEmptyNode(theblock, &bIsEmptyNode, false, false); NS_ENSURE_SUCCESS(res, res); // check if br can go into the destination node if (bIsEmptyNode && mHTMLEditor->CanContainTag(selNode, NS_LITERAL_STRING("br"))) { - nsIDOMElement *rootElement = mHTMLEditor->GetRoot(); - NS_ENSURE_TRUE(rootElement, NS_ERROR_FAILURE); - nsCOMPtr<nsIDOMNode> rootNode(do_QueryInterface(rootElement)); + nsCOMPtr<nsIDOMNode> rootNode = do_QueryInterface(mHTMLEditor->GetRoot()); + NS_ENSURE_TRUE(rootNode, NS_ERROR_FAILURE); if (selNode == rootNode) { // Our root node is completely empty. Don't add a <br> here. // AfterEditInner() will add one for us when it calls // CreateBogusNodeIfNeeded()! return NS_OK; } @@ -8354,17 +8351,17 @@ nsHTMLEditRules::RemoveListStructure(nsI nsresult nsHTMLEditRules::ConfirmSelectionInBody() { nsresult res = NS_OK; // get the body - nsIDOMElement *rootElement = mHTMLEditor->GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(mHTMLEditor->GetRoot()); NS_ENSURE_TRUE(rootElement, NS_ERROR_UNEXPECTED); // get the selection nsCOMPtr<nsISelection>selection; res = mHTMLEditor->GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); // get the selection start location
--- a/editor/libeditor/html/nsHTMLEditor.cpp +++ b/editor/libeditor/html/nsHTMLEditor.cpp @@ -376,38 +376,39 @@ nsHTMLEditor::GetRootElement(nsIDOMEleme return nsEditor::GetRootElement(aRootElement); } *aRootElement = nsnull; // Use the HTML documents body element as the editor root if we didn't // get a root element during initialization. + nsCOMPtr<nsIDOMElement> rootElement; nsCOMPtr<nsIDOMHTMLElement> bodyElement; nsresult rv = GetBodyElement(getter_AddRefs(bodyElement)); NS_ENSURE_SUCCESS(rv, rv); if (bodyElement) { - mRootElement = bodyElement; + rootElement = bodyElement; } else { // If there is no HTML body element, // we should use the document root element instead. nsCOMPtr<nsIDOMDocument> doc = do_QueryReferent(mDocWeak); NS_ENSURE_TRUE(doc, NS_ERROR_NOT_INITIALIZED); - rv = doc->GetDocumentElement(getter_AddRefs(mRootElement)); + rv = doc->GetDocumentElement(getter_AddRefs(rootElement)); NS_ENSURE_SUCCESS(rv, rv); // Document can have no elements - if (!mRootElement) { + if (!rootElement) { return NS_ERROR_NOT_AVAILABLE; } } - *aRootElement = mRootElement; - NS_ADDREF(*aRootElement); + mRootElement = do_QueryInterface(rootElement); + rootElement.forget(aRootElement); return NS_OK; } already_AddRefed<nsIContent> nsHTMLEditor::FindSelectionRoot(nsINode *aNode) { NS_PRECONDITION(aNode->IsNodeOfType(nsINode::eDOCUMENT) || @@ -539,17 +540,17 @@ nsHTMLEditor::BeginningOfDocument() // get the selection nsCOMPtr<nsISelection> selection; nsresult res = GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); NS_ENSURE_TRUE(selection, NS_ERROR_NOT_INITIALIZED); // Get the root element. - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); if (!rootElement) { NS_WARNING("GetRoot() returned a null pointer (mRootElement is null)"); return NS_OK; } // find first editable thingy bool done = false; nsCOMPtr<nsIDOMNode> curNode(rootElement), selNode; @@ -1804,18 +1805,17 @@ NS_IMETHODIMP nsHTMLEditor::RebuildDocumentFromSource(const nsAString& aSourceString) { ForceCompositionEnd(); nsCOMPtr<nsISelection>selection; nsresult res = GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); - nsIDOMElement *bodyElement = GetRoot(); - NS_ENSURE_SUCCESS(res, res); + nsCOMPtr<nsIDOMElement> bodyElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(bodyElement, NS_ERROR_NULL_POINTER); // Find where the <body> tag starts. nsReadingIterator<PRUnichar> beginbody; nsReadingIterator<PRUnichar> endbody; aSourceString.BeginReading(beginbody); aSourceString.EndReading(endbody); bool foundbody = CaseInsensitiveFindInReadable(NS_LITERAL_STRING("<body"), @@ -2447,20 +2447,20 @@ nsHTMLEditor::GetHTMLBackgroundColorStat // from nested cells/tables, so search up parent chain nsCOMPtr<nsIDOMNode> parentNode; res = element->GetParentNode(getter_AddRefs(parentNode)); NS_ENSURE_SUCCESS(res, res); element = do_QueryInterface(parentNode); } // If no table or cell found, get page body - element = GetRoot(); - NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER); - - return element->GetAttribute(styleName, aOutColor); + mozilla::dom::Element *bodyElement = GetRoot(); + NS_ENSURE_TRUE(bodyElement, NS_ERROR_NULL_POINTER); + + return bodyElement->GetAttr(kNameSpaceID_None, nsGkAtoms::bgcolor, aOutColor); } NS_IMETHODIMP nsHTMLEditor::GetListState(bool *aMixed, bool *aOL, bool *aUL, bool *aDL) { if (!mRules) { return NS_ERROR_NOT_INITIALIZED; } NS_ENSURE_TRUE(aMixed && aOL && aUL && aDL, NS_ERROR_NULL_POINTER); nsHTMLEditRules* htmlRules = static_cast<nsHTMLEditRules*>(mRules.get()); @@ -3387,17 +3387,17 @@ nsHTMLEditor::SetHTMLBackgroundColor(con GetNextSelectedCell(nsnull, getter_AddRefs(cell)); }; return res; } } // If we failed to find a cell, fall through to use originally-found element } else { // No table element -- set the background color on the body tag - element = GetRoot(); + element = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER); } // Use the editor method that goes through the transaction system if (setColor) res = SetAttribute(element, bgcolor, aColor); else res = RemoveAttribute(element, bgcolor); @@ -3406,18 +3406,17 @@ nsHTMLEditor::SetHTMLBackgroundColor(con NS_IMETHODIMP nsHTMLEditor::SetBodyAttribute(const nsAString& aAttribute, const nsAString& aValue) { // TODO: Check selection for Cell, Row, Column or table and do color on appropriate level NS_ASSERTION(mDocWeak, "Missing Editor DOM Document"); // Set the background color attribute on the body tag - nsIDOMElement *bodyElement = GetRoot(); - + nsCOMPtr<nsIDOMElement> bodyElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(bodyElement, NS_ERROR_NULL_POINTER); // Use the editor method that goes through the transaction system return SetAttribute(bodyElement, aAttribute, aValue); } NS_IMETHODIMP nsHTMLEditor::GetLinkedObjects(nsISupportsArray** aNodeList) @@ -3875,17 +3874,17 @@ nsHTMLEditor::ContentRemoved(nsIDocument /* This routine examines aNode and it's ancestors looking for any node which has the -moz-user-select: all style lit. Return the highest such ancestor. */ already_AddRefed<nsIDOMNode> nsHTMLEditor::FindUserSelectAllNode(nsIDOMNode* aNode) { nsCOMPtr<nsIDOMNode> node = aNode; - nsIDOMElement *root = GetRoot(); + nsCOMPtr<nsIDOMElement> root = do_QueryInterface(GetRoot()); if (!nsEditorUtils::IsDescendantOf(aNode, root)) return nsnull; nsCOMPtr<nsIDOMNode> resultNode; // starts out empty nsAutoString mozUserSelectValue; while (node) { // retrieve the computed style of -moz-user-select for node @@ -4140,17 +4139,17 @@ NS_IMETHODIMP nsHTMLEditor::SelectEntireDocument(nsISelection *aSelection) { if (!aSelection || !mRules) { return NS_ERROR_NULL_POINTER; } // Protect the edit rules object from dying nsCOMPtr<nsIEditRules> kungFuDeathGrip(mRules); // get editor root node - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); // is doc empty? bool bDocIsEmpty; nsresult res = mRules->DocumentIsEmpty(&bDocIsEmpty); NS_ENSURE_SUCCESS(res, res); if (bDocIsEmpty) { @@ -4185,17 +4184,19 @@ nsHTMLEditor::SelectAll() // If the anchor content has independent selection, we never need to explicitly // select its children. if (anchorContent->HasIndependentSelection()) { nsCOMPtr<nsISelectionPrivate> selPriv = do_QueryInterface(selection); NS_ENSURE_TRUE(selPriv, NS_ERROR_UNEXPECTED); rv = selPriv->SetAncestorLimiter(nsnull); NS_ENSURE_SUCCESS(rv, rv); - return selection->SelectAllChildren(mRootElement); + nsCOMPtr<nsIDOMNode> rootElement = do_QueryInterface(mRootElement, &rv); + NS_ENSURE_SUCCESS(rv, rv); + return selection->SelectAllChildren(rootElement); } nsCOMPtr<nsIPresShell> ps = GetPresShell(); nsIContent *rootContent = anchorContent->GetSelectionRootContent(ps); NS_ENSURE_TRUE(rootContent, NS_ERROR_UNEXPECTED); nsCOMPtr<nsIDOMNode> rootElement = do_QueryInterface(rootContent, &rv); NS_ENSURE_SUCCESS(rv, rv); @@ -4476,17 +4477,17 @@ nsHTMLEditor::CollapseAdjacentTextNodes( } return result; } NS_IMETHODIMP nsHTMLEditor::SetSelectionAtDocumentStart(nsISelection *aSelection) { - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); return aSelection->Collapse(rootElement,0); } /////////////////////////////////////////////////////////////////////////// // RemoveBlockContainer: remove inNode, reparenting it's children into their
--- a/editor/libeditor/html/nsHTMLInlineTableEditor.cpp +++ b/editor/libeditor/html/nsHTMLInlineTableEditor.cpp @@ -38,16 +38,17 @@ #include "nsHTMLEditor.h" #include "nsIDOMHTMLElement.h" #include "nsIDOMEventTarget.h" #include "nsIPresShell.h" #include "nsIDocumentObserver.h" #include "nsIContent.h" #include "nsHTMLEditUtils.h" #include "nsReadableUtils.h" +#include "mozilla/dom/Element.h" // Uncomment the following line if you want to disable // table deletion when the only column/row is removed // #define DISABLE_TABLE_DELETION 1 NS_IMETHODIMP nsHTMLEditor::SetInlineTableEditingEnabled(bool aIsEnabled) { @@ -72,17 +73,17 @@ nsHTMLEditor::ShowInlineTableEditingUI(n return NS_OK; if (mInlineEditedCell) { NS_ERROR("call HideInlineTableEditingUI first"); return NS_ERROR_UNEXPECTED; } // the resizers and the shadow will be anonymous children of the body - nsIDOMElement *bodyElement = GetRoot(); + nsCOMPtr<nsIDOMElement> bodyElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(bodyElement, NS_ERROR_NULL_POINTER); CreateAnonymousElement(NS_LITERAL_STRING("a"), bodyElement, NS_LITERAL_STRING("mozTableAddColumnBefore"), false, getter_AddRefs(mAddColumnBeforeButton)); CreateAnonymousElement(NS_LITERAL_STRING("a"), bodyElement, NS_LITERAL_STRING("mozTableRemoveColumn"), false, getter_AddRefs(mRemoveColumnButton)); @@ -125,20 +126,17 @@ nsHTMLEditor::HideInlineTableEditingUI() // get the presshell's document observer interface. nsCOMPtr<nsIPresShell> ps = GetPresShell(); // We allow the pres shell to be null; when it is, we presume there // are no document observers to notify, but we still want to // UnbindFromTree. // get the root content node. - - nsIDOMElement *bodyElement = GetRoot(); - - nsCOMPtr<nsIContent> bodyContent( do_QueryInterface(bodyElement) ); + nsCOMPtr<nsIContent> bodyContent = GetRoot(); NS_ENSURE_TRUE(bodyContent, NS_ERROR_FAILURE); DeleteRefToAnonymousNode(mAddColumnBeforeButton, bodyContent, ps); mAddColumnBeforeButton = nsnull; DeleteRefToAnonymousNode(mRemoveColumnButton, bodyContent, ps); mRemoveColumnButton = nsnull; DeleteRefToAnonymousNode(mAddColumnAfterButton, bodyContent, ps); mAddColumnAfterButton = nsnull;
--- a/editor/libeditor/text/nsPlaintextEditor.cpp +++ b/editor/libeditor/text/nsPlaintextEditor.cpp @@ -70,16 +70,17 @@ #include "nsEditorUtils.h" // nsAutoEditBatch, nsAutoRules #include "nsUnicharUtils.h" #include "nsContentCID.h" #include "nsInternetCiter.h" #include "nsEventDispatcher.h" #include "nsGkAtoms.h" #include "nsDebug.h" #include "mozilla/Preferences.h" +#include "mozilla/dom/Element.h" // Drag & Drop, Clipboard #include "nsIClipboard.h" #include "nsITransferable.h" #include "nsCopySupport.h" #include "mozilla/FunctionTimer.h" @@ -566,32 +567,32 @@ nsPlaintextEditor::GetTextSelectionOffse nsresult rv; nsCOMPtr<nsIDOMNode> startNode, endNode; PRInt32 startNodeOffset, endNodeOffset; aSelection->GetAnchorNode(getter_AddRefs(startNode)); aSelection->GetAnchorOffset(&startNodeOffset); aSelection->GetFocusNode(getter_AddRefs(endNode)); aSelection->GetFocusOffset(&endNodeOffset); - nsIDOMElement* rootNode = GetRoot(); + dom::Element *rootElement = GetRoot(); + nsCOMPtr<nsIDOMNode> rootNode = do_QueryInterface(rootElement); NS_ENSURE_TRUE(rootNode, NS_ERROR_NULL_POINTER); PRInt32 startOffset = -1; PRInt32 endOffset = -1; nsCOMPtr<nsIContentIterator> iter = do_CreateInstance("@mozilla.org/content/post-content-iterator;1", &rv); NS_ENSURE_SUCCESS(rv, rv); #ifdef NS_DEBUG PRInt32 nodeCount = 0; // only needed for the assertions below #endif PRUint32 totalLength = 0; - nsCOMPtr<nsIContent> rootContent = do_QueryInterface(rootNode); - iter->Init(rootContent); + iter->Init(rootElement); for (; !iter->IsDone() && (startOffset == -1 || endOffset == -1); iter->Next()) { nsCOMPtr<nsIDOMNode> currentNode = do_QueryInterface(iter->GetCurrentNode()); nsCOMPtr<nsIDOMCharacterData> textNode = do_QueryInterface(currentNode); if (textNode) { // Note that sometimes we have an empty #text-node as start/endNode, // which we regard as not editable because the frame width == 0, // see nsEditor::IsEditable(). bool editable = IsEditable(currentNode); @@ -1015,26 +1016,25 @@ nsPlaintextEditor::GetTextLength(PRInt32 // special-case for empty document, to account for the bogus node bool docEmpty; nsresult rv = GetDocumentIsEmpty(&docEmpty); NS_ENSURE_SUCCESS(rv, rv); if (docEmpty) return NS_OK; - nsIDOMElement* rootNode = GetRoot(); - NS_ENSURE_TRUE(rootNode, NS_ERROR_NULL_POINTER); + dom::Element *rootElement = GetRoot(); + NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIContentIterator> iter = do_CreateInstance("@mozilla.org/content/post-content-iterator;1", &rv); NS_ENSURE_SUCCESS(rv, rv); PRUint32 totalLength = 0; - nsCOMPtr<nsIContent> rootContent = do_QueryInterface(rootNode); - iter->Init(rootContent); + iter->Init(rootElement); for (; !iter->IsDone(); iter->Next()) { nsCOMPtr<nsIDOMNode> currentNode = do_QueryInterface(iter->GetCurrentNode()); nsCOMPtr<nsIDOMCharacterData> textNode = do_QueryInterface(currentNode); if (textNode && IsEditable(currentNode)) { PRUint32 length; textNode->GetLength(&length); totalLength += length; } @@ -1099,23 +1099,22 @@ nsPlaintextEditor::SetWrapWidth(PRInt32 // Make sure we're a plaintext editor, otherwise we shouldn't // do the rest of this. if (!IsPlaintextEditor()) return NS_OK; // Ought to set a style sheet here ... // Probably should keep around an mPlaintextStyleSheet for this purpose. - nsIDOMElement *rootElement = GetRoot(); + dom::Element *rootElement = GetRoot(); NS_ENSURE_TRUE(rootElement, NS_ERROR_NULL_POINTER); // Get the current style for this root element: - NS_NAMED_LITERAL_STRING(styleName, "style"); nsAutoString styleValue; - nsresult res = rootElement->GetAttribute(styleName, styleValue); + nsresult res = rootElement->GetAttr(kNameSpaceID_None, nsGkAtoms::style, styleValue); NS_ENSURE_SUCCESS(res, res); // We'll replace styles for these values: CutStyle("white-space", styleValue); CutStyle("width", styleValue); CutStyle("font-family", styleValue); // If we have other style left, trim off any existing semicolons @@ -1149,17 +1148,17 @@ nsPlaintextEditor::SetWrapWidth(PRInt32 styleValue.AppendInt(aWrapColumn); styleValue.AppendLiteral("ch;"); } else if (mWrapToWindow || aWrapColumn == 0) styleValue.AppendLiteral("white-space: pre-wrap;"); else styleValue.AppendLiteral("white-space: pre;"); - return rootElement->SetAttribute(styleName, styleValue); + return rootElement->SetAttr(kNameSpaceID_None, nsGkAtoms::style, styleValue, true); } NS_IMETHODIMP nsPlaintextEditor::SetWrapColumn(PRInt32 aWrapColumn) { mWrapColumn = aWrapColumn; return NS_OK; } @@ -1349,17 +1348,17 @@ nsPlaintextEditor::GetAndInitDocEncoder( if (NS_SUCCEEDED(rv) && selection) rv = docEncoder->SetSelection(selection); NS_ENSURE_SUCCESS(rv, rv); } // ... or if the root element is not a body, // in which case we set the selection to encompass the root. else { - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(rootElement, NS_ERROR_FAILURE); if (!nsTextEditUtils::IsBody(rootElement)) { rv = docEncoder->SetContainerNode(rootElement); NS_ENSURE_SUCCESS(rv, rv); } } @@ -1679,17 +1678,17 @@ nsPlaintextEditor::SelectEntireDocument( // Protect the edit rules object from dying nsCOMPtr<nsIEditRules> kungFuDeathGrip(mRules); // is doc empty? bool bDocIsEmpty; if (NS_SUCCEEDED(mRules->DocumentIsEmpty(&bDocIsEmpty)) && bDocIsEmpty) { // get root node - nsIDOMElement *rootElement = GetRoot(); + nsCOMPtr<nsIDOMElement> rootElement = do_QueryInterface(GetRoot()); NS_ENSURE_TRUE(rootElement, NS_ERROR_FAILURE); // if it's empty don't select entire doc - that would select the bogus node return aSelection->Collapse(rootElement, 0); } nsresult rv = nsEditor::SelectEntireDocument(aSelection); NS_ENSURE_SUCCESS(rv, rv);
--- a/editor/libeditor/text/nsTextEditRules.cpp +++ b/editor/libeditor/text/nsTextEditRules.cpp @@ -63,16 +63,17 @@ #include "nsNodeIterator.h" #include "nsIDOMNodeFilter.h" // for IBMBIDI #include "nsFrameSelection.h" #include "mozilla/Preferences.h" #include "mozilla/LookAndFeel.h" +#include "mozilla/dom/Element.h" using namespace mozilla; #define CANCEL_OPERATION_IF_READONLY_OR_DISABLED \ if (IsReadonly() || IsDisabled()) \ { \ *aCancel = true; \ return NS_OK; \ @@ -455,18 +456,17 @@ nsTextEditRules::CollapseSelectionToTrai return NS_OK; nsCOMPtr<nsIDOMNode> parentNode; PRInt32 parentOffset; res = nsEditor::GetNodeLocation(selNode, address_of(parentNode), &parentOffset); NS_ENSURE_SUCCESS(res, res); - nsIDOMElement *rootElem = mEditor->GetRoot(); - nsCOMPtr<nsIDOMNode> root = do_QueryInterface(rootElem); + nsCOMPtr<nsIDOMNode> root = do_QueryInterface(mEditor->GetRoot()); NS_ENSURE_TRUE(root, NS_ERROR_NULL_POINTER); if (parentNode != root) return NS_OK; nsCOMPtr<nsIDOMNode> nextNode = mEditor->GetChildAt(parentNode, parentOffset + 1); if (nextNode && nsTextEditUtils::IsMozBR(nextNode)) { res = aSelection->Collapse(parentNode, parentOffset + 1); @@ -944,17 +944,17 @@ nsTextEditRules::DidUndo(nsISelection *a if (!aSelection) { return NS_ERROR_NULL_POINTER; } if (NS_SUCCEEDED(res)) { if (mBogusNode) { mBogusNode = nsnull; } else { - nsIDOMElement *theRoot = mEditor->GetRoot(); + nsCOMPtr<nsIDOMElement> theRoot = do_QueryInterface(mEditor->GetRoot()); NS_ENSURE_TRUE(theRoot, NS_ERROR_FAILURE); nsCOMPtr<nsIDOMNode> node = mEditor->GetLeftmostChild(theRoot); if (node && mEditor->IsMozEditorBogusNode(node)) mBogusNode = node; } } return res; } @@ -977,17 +977,17 @@ nsTextEditRules::DidRedo(nsISelection *a if (!aSelection) { return NS_ERROR_NULL_POINTER; } if (NS_SUCCEEDED(res)) { if (mBogusNode) { mBogusNode = nsnull; } else { - nsIDOMElement *theRoot = mEditor->GetRoot(); + nsCOMPtr<nsIDOMElement> theRoot = do_QueryInterface(mEditor->GetRoot()); NS_ENSURE_TRUE(theRoot, NS_ERROR_FAILURE); nsCOMPtr<nsIDOMNodeList> nodeList; res = theRoot->GetElementsByTagName(NS_LITERAL_STRING("br"), getter_AddRefs(nodeList)); NS_ENSURE_SUCCESS(res, res); if (nodeList) { @@ -1051,17 +1051,17 @@ nsTextEditRules::RemoveRedundantTrailing // If the bogus node exists, we have no work to do if (mBogusNode) return NS_OK; // Likewise, nothing to be done if we could never have inserted a trailing br if (IsSingleLineEditor()) return NS_OK; - nsIDOMNode* body = mEditor->GetRoot(); + nsCOMPtr<nsIDOMNode> body = do_QueryInterface(mEditor->GetRoot()); if (!body) return NS_ERROR_NULL_POINTER; bool hasChildren; nsresult res = body->HasChildNodes(&hasChildren); NS_ENSURE_SUCCESS(res, res); if (hasChildren) { @@ -1106,17 +1106,17 @@ nsTextEditRules::RemoveRedundantTrailing } nsresult nsTextEditRules::CreateTrailingBRIfNeeded() { // but only if we aren't a single line edit field if (IsSingleLineEditor()) return NS_OK; - nsIDOMNode *body = mEditor->GetRoot(); + nsCOMPtr<nsIDOMNode> body = do_QueryInterface(mEditor->GetRoot()); NS_ENSURE_TRUE(body, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIDOMNode> lastChild; nsresult res = body->GetLastChild(getter_AddRefs(lastChild)); // assuming CreateBogusNodeIfNeeded() has been called first NS_ENSURE_SUCCESS(res, res); NS_ENSURE_TRUE(lastChild, NS_ERROR_NULL_POINTER); if (!nsTextEditUtils::IsBreak(lastChild)) @@ -1136,17 +1136,17 @@ nsTextEditRules::CreateBogusNodeIfNeeded { if (!aSelection) { return NS_ERROR_NULL_POINTER; } if (!mEditor) { return NS_ERROR_NULL_POINTER; } if (mBogusNode) return NS_OK; // let's not create more than one, ok? // tell rules system to not do any post-processing nsAutoRules beginRulesSniffing(mEditor, nsEditor::kOpIgnore, nsIEditor::eNone); - nsIDOMNode* body = mEditor->GetRoot(); + nsCOMPtr<nsIDOMNode> body = do_QueryInterface(mEditor->GetRoot()); if (!body) { // we don't even have a body yet, don't insert any bogus nodes at // this point. return NS_OK; }