Bug 1407924 - Avoid conversion from nsAtom to string if possible. r?masayuki
Editor sometimes extracts atom to string to compare element name.
It is unnecessary to use atom directly.
MozReview-Commit-ID: FEvyiIeaozs
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -3703,34 +3703,16 @@ EditorBase::GetTag(nsIDOMNode* aNode)
if (!content) {
NS_ASSERTION(aNode, "null node passed to EditorBase::GetTag()");
return nullptr;
}
return content->NodeInfo()->NameAtom();
}
-nsresult
-EditorBase::GetTagString(nsIDOMNode* aNode,
- nsAString& outString)
-{
- if (!aNode) {
- NS_NOTREACHED("null node passed to EditorBase::GetTagString()");
- return NS_ERROR_NULL_POINTER;
- }
-
- nsAtom *atom = GetTag(aNode);
- if (!atom) {
- return NS_ERROR_FAILURE;
- }
-
- atom->ToString(outString);
- return NS_OK;
-}
-
bool
EditorBase::NodesSameType(nsIDOMNode* aNode1,
nsIDOMNode* aNode2)
{
if (!aNode1 || !aNode2) {
NS_NOTREACHED("null node passed to EditorBase::NodesSameType()");
return false;
}
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -865,17 +865,16 @@ public:
* unexpected error, returns -1.
*/
int32_t NumberOfUndoItems() const;
int32_t NumberOfRedoItems() const;
/**
* From html rules code - migration in progress.
*/
- static nsresult GetTagString(nsIDOMNode* aNode, nsAString& outString);
static nsAtom* GetTag(nsIDOMNode* aNode);
bool NodesSameType(nsIDOMNode* aNode1, nsIDOMNode* aNode2);
virtual bool AreNodesSameType(nsIContent* aNode1, nsIContent* aNode2);
static bool IsTextNode(nsIDOMNode* aNode);
static bool IsTextNode(nsINode* aNode)
{
--- a/editor/libeditor/HTMLAnonymousNodeEditor.cpp
+++ b/editor/libeditor/HTMLAnonymousNodeEditor.cpp
@@ -347,21 +347,17 @@ HTMLEditor::CheckSelectionStateForAnonym
// If we're not in a document, don't try to add resizers
nsCOMPtr<dom::Element> focusElementNode = do_QueryInterface(focusElement);
NS_ENSURE_STATE(focusElementNode);
if (!focusElementNode->IsInUncomposedDoc()) {
return NS_OK;
}
// what's its tag?
- nsAutoString focusTagName;
- rv = focusElement->GetTagName(focusTagName);
- NS_ENSURE_SUCCESS(rv, rv);
- ToLowerCase(focusTagName);
- RefPtr<nsAtom> focusTagAtom = NS_Atomize(focusTagName);
+ nsAtom* focusTagAtom = focusElementNode->NodeInfo()->NameAtom();
nsCOMPtr<nsIDOMElement> absPosElement;
if (mIsAbsolutelyPositioningEnabled) {
// Absolute Positioning support is enabled, is the selection contained
// in an absolutely positioned element ?
rv =
GetAbsolutelyPositionedSelectionContainer(getter_AddRefs(absPosElement));
NS_ENSURE_SUCCESS(rv, rv);
--- a/editor/libeditor/HTMLEditRules.cpp
+++ b/editor/libeditor/HTMLEditRules.cpp
@@ -373,17 +373,17 @@ HTMLEditRules::BeforeEdit(EditAction act
// Remember current inline styles for deletion and normal insertion ops
if (action == EditAction::insertText ||
action == EditAction::insertIMEText ||
action == EditAction::deleteSelection ||
IsStyleCachePreservingAction(action)) {
nsCOMPtr<nsINode> selNode =
aDirection == nsIEditor::eNext ? selEndNode : selStartNode;
- nsresult rv = CacheInlineStyles(GetAsDOMNode(selNode));
+ nsresult rv = CacheInlineStyles(selNode);
NS_ENSURE_SUCCESS(rv, rv);
}
// Stabilize the document against contenteditable count changes
nsCOMPtr<nsIDOMDocument> doc = htmlEditor->GetDOMDocument();
NS_ENSURE_TRUE(doc, NS_ERROR_NOT_INITIALIZED);
nsCOMPtr<nsIHTMLDocument> htmlDoc = do_QueryInterface(doc);
NS_ENSURE_TRUE(htmlDoc, NS_ERROR_FAILURE);
@@ -7197,31 +7197,31 @@ HTMLEditRules::GetTopEnclosingMailCite(n
break;
}
}
return ret;
}
nsresult
-HTMLEditRules::CacheInlineStyles(nsIDOMNode* aNode)
+HTMLEditRules::CacheInlineStyles(nsINode* aNode)
{
NS_ENSURE_TRUE(aNode, NS_ERROR_NULL_POINTER);
NS_ENSURE_STATE(mHTMLEditor);
nsresult rv = GetInlineStyles(aNode, mCachedStyles);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}
nsresult
-HTMLEditRules::GetInlineStyles(nsIDOMNode* aNode,
+HTMLEditRules::GetInlineStyles(nsINode* aNode,
StyleCache aStyleCache[SIZE_STYLE_TABLE])
{
MOZ_ASSERT(aNode);
MOZ_ASSERT(mHTMLEditor);
bool useCSS = mHTMLEditor->IsCSSEnabled();
for (size_t j = 0; j < SIZE_STYLE_TABLE; ++j) {
@@ -7237,19 +7237,20 @@ HTMLEditRules::GetInlineStyles(nsIDOMNod
}
bool isSet = false;
nsAutoString outValue;
// Don't use CSS for <font size>, we don't support it usefully (bug 780035)
if (!useCSS || (aStyleCache[j].tag == nsGkAtoms::font &&
aStyleCache[j].attr.EqualsLiteral("size"))) {
NS_ENSURE_STATE(mHTMLEditor);
- mHTMLEditor->IsTextPropertySetByContent(aNode, aStyleCache[j].tag,
- &(aStyleCache[j].attr), nullptr,
- isSet, &outValue);
+ isSet = mHTMLEditor->IsTextPropertySetByContent(aNode, aStyleCache[j].tag,
+ &(aStyleCache[j].attr),
+ nullptr,
+ &outValue);
} else {
NS_ENSURE_STATE(mHTMLEditor);
isSet = mHTMLEditor->mCSSEditUtils->IsCSSEquivalentToHTMLInlineStyleSet(
aNode, aStyleCache[j].tag, &(aStyleCache[j].attr), outValue,
CSSEditUtils::eComputed);
}
if (isSet) {
aStyleCache[j].mPresent = true;
@@ -7287,19 +7288,17 @@ HTMLEditRules::ReapplyCachedStyles()
do_QueryInterface(selection->GetRangeAt(0)->GetStartContainer());
if (!selNode) {
// Nothing to do
return NS_OK;
}
StyleCache styleAtInsertionPoint[SIZE_STYLE_TABLE];
InitStyleCacheArray(styleAtInsertionPoint);
- nsCOMPtr<nsIDOMNode> selDOMNode = do_QueryInterface(selNode);
- MOZ_ASSERT(selDOMNode);
- nsresult rv = GetInlineStyles(selDOMNode, styleAtInsertionPoint);
+ nsresult rv = GetInlineStyles(selNode, styleAtInsertionPoint);
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_OK;
}
for (size_t i = 0; i < SIZE_STYLE_TABLE; ++i) {
if (mCachedStyles[i].mPresent) {
bool bFirst, bAny, bAll;
bFirst = bAny = bAll = false;
--- a/editor/libeditor/HTMLEditRules.h
+++ b/editor/libeditor/HTMLEditRules.h
@@ -383,17 +383,17 @@ protected:
nsresult SplitAsNeeded(nsAtom& aTag, nsCOMPtr<nsINode>& inOutParent,
int32_t& inOutOffset);
nsresult AddTerminatingBR(nsIDOMNode *aBlock);
EditorDOMPoint JoinNodesSmart(nsIContent& aNodeLeft,
nsIContent& aNodeRight);
Element* GetTopEnclosingMailCite(nsINode& aNode);
nsresult PopListItem(nsIContent& aListItem, bool* aOutOfList = nullptr);
nsresult RemoveListStructure(Element& aList);
- nsresult CacheInlineStyles(nsIDOMNode* aNode);
+ nsresult CacheInlineStyles(nsINode* aNode);
nsresult ReapplyCachedStyles();
void ClearCachedStyles();
void AdjustSpecialBreaks();
nsresult AdjustWhitespace(Selection* aSelection);
nsresult PinSelectionToNewBlock(Selection* aSelection);
void CheckInterlinePosition(Selection& aSelection);
nsresult AdjustSelection(Selection* aSelection,
nsIEditor::EDirection aAction);
@@ -450,17 +450,17 @@ protected:
* GetInlineStyles().
*/
void InitStyleCacheArray(StyleCache aStyleCache[SIZE_STYLE_TABLE]);
/**
* GetInlineStyles() retrieves the style of aNode and modifies each item of
* aStyleCache.
*/
- nsresult GetInlineStyles(nsIDOMNode* aNode,
+ nsresult GetInlineStyles(nsINode* aNode,
StyleCache aStyleCache[SIZE_STYLE_TABLE]);
protected:
HTMLEditor* mHTMLEditor;
RefPtr<nsRange> mDocChangeRange;
bool mListenerEnabled;
bool mReturnInEmptyLIKillsList;
bool mDidDeleteSelection;
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -3523,78 +3523,45 @@ HTMLEditor::SelectAll()
bool
HTMLEditor::IsTextPropertySetByContent(nsINode* aNode,
nsAtom* aProperty,
const nsAString* aAttribute,
const nsAString* aValue,
nsAString* outValue)
{
MOZ_ASSERT(aNode && aProperty);
- bool isSet;
- IsTextPropertySetByContent(aNode->AsDOMNode(), aProperty, aAttribute, aValue,
- isSet, outValue);
- return isSet;
-}
-
-void
-HTMLEditor::IsTextPropertySetByContent(nsIDOMNode* aNode,
- nsAtom* aProperty,
- const nsAString* aAttribute,
- const nsAString* aValue,
- bool& aIsSet,
- nsAString* outValue)
-{
- aIsSet = false; // must be initialized to false for code below to work
- nsAutoString propName;
- aProperty->ToString(propName);
- nsCOMPtr<nsIDOMNode>node = aNode;
-
- while (node) {
- nsCOMPtr<nsIDOMElement>element;
- element = do_QueryInterface(node);
- if (element) {
- nsAutoString tag, value;
- element->GetTagName(tag);
- if (propName.Equals(tag, nsCaseInsensitiveStringComparator())) {
- bool found = false;
- if (aAttribute && !aAttribute->IsEmpty()) {
- element->GetAttribute(*aAttribute, value);
- if (outValue) {
- *outValue = value;
+
+ while (aNode) {
+ if (aNode->IsElement()) {
+ Element* element = aNode->AsElement();
+ if (aProperty == element->NodeInfo()->NameAtom()) {
+ if (!aAttribute || aAttribute->IsEmpty()) {
+ return true;
+ }
+ nsAutoString value;
+ element->GetAttribute(*aAttribute, value);
+ if (outValue) {
+ *outValue = value;
+ }
+ if (!value.IsEmpty()) {
+ if (!aValue) {
+ return true;
}
- if (!value.IsEmpty()) {
- if (!aValue) {
- found = true;
- } else {
- nsString tString(*aValue);
- if (tString.Equals(value, nsCaseInsensitiveStringComparator())) {
- found = true;
- } else {
- // We found the prop with the attribute, but the value doesn't
- // match.
- break;
- }
- }
+ if (aValue->Equals(value, nsCaseInsensitiveStringComparator())) {
+ return true;
}
- } else {
- found = true;
- }
- if (found) {
- aIsSet = true;
+ // We found the prop with the attribute, but the value doesn't
+ // match.
break;
}
}
}
- nsCOMPtr<nsIDOMNode>temp;
- if (NS_SUCCEEDED(node->GetParentNode(getter_AddRefs(temp))) && temp) {
- node = temp;
- } else {
- node = nullptr;
- }
- }
+ aNode = aNode->GetParentNode();
+ }
+ return false;
}
bool
HTMLEditor::SetCaretInTableCell(nsIDOMElement* aElement)
{
nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
if (!element || !element->IsHTMLElement() ||
!HTMLEditUtils::IsTableElement(element) ||
--- a/editor/libeditor/HTMLEditor.h
+++ b/editor/libeditor/HTMLEditor.h
@@ -575,35 +575,28 @@ protected:
*
* @param aNode The target of the query
* @param aProperty The property that we are querying for
* @param aAttribute The attribute of aProperty, example: color in
* <FONT color="blue"> May be null.
* @param aValue The value of aAttribute, example: blue in
* <FONT color="blue"> May be null. Ignored if aAttribute
* is null.
- * @param aIsSet [OUT] true if <aProperty aAttribute=aValue> effects
- * aNode.
* @param outValue [OUT] the value of the attribute, if aIsSet is true
+ * @return true if <aProperty aAttribute=aValue> effects
+ * aNode.
*
* The nsIContent variant returns aIsSet instead of using an out parameter.
*/
bool IsTextPropertySetByContent(nsINode* aNode,
nsAtom* aProperty,
const nsAString* aAttribute,
const nsAString* aValue,
nsAString* outValue = nullptr);
- void IsTextPropertySetByContent(nsIDOMNode* aNode,
- nsAtom* aProperty,
- const nsAString* aAttribute,
- const nsAString* aValue,
- bool& aIsSet,
- nsAString* outValue = nullptr);
-
// Methods for handling plaintext quotations
NS_IMETHOD PasteAsPlaintextQuotation(int32_t aSelectionType);
/**
* Insert a string as quoted text, replacing the selected text (if any).
* @param aQuotedText The string to insert.
* @param aAddCites Whether to prepend extra ">" to each line
* (usually true, unless those characters
--- a/editor/libeditor/HTMLTableEditor.cpp
+++ b/editor/libeditor/HTMLTableEditor.cpp
@@ -1956,18 +1956,18 @@ HTMLEditor::SwitchTableCellHeaderType(ns
// Save current selection to restore when done
// This is needed so ReplaceContainer can monitor selection
// when replacing nodes
RefPtr<Selection> selection = GetSelection();
NS_ENSURE_TRUE(selection, NS_ERROR_FAILURE);
AutoSelectionRestorer selectionRestorer(selection, this);
// Set to the opposite of current type
- RefPtr<nsAtom> atom = EditorBase::GetTag(aSourceCell);
- nsAtom* newCellType = atom == nsGkAtoms::td ? nsGkAtoms::th : nsGkAtoms::td;
+ nsAtom* newCellType =
+ sourceCell->IsHTMLElement(nsGkAtoms::td) ? nsGkAtoms::th : nsGkAtoms::td;
// This creates new node, moves children, copies attributes (true)
// and manages the selection!
nsCOMPtr<Element> newNode = ReplaceContainer(sourceCell, newCellType,
nullptr, nullptr, EditorBase::eCloneAttributes);
NS_ENSURE_TRUE(newNode, NS_ERROR_FAILURE);
// Return the new cell