Bug 721483 - Clean up RemoveElementIfNoStyleOrIdOrClass / HasStyleOrIdOrClass; r=ehsan

This commit is contained in:
Ms2ger 2012-02-01 11:54:22 +01:00
parent c839dd85b8
commit b5bb334d50
7 changed files with 43 additions and 64 deletions

View File

@ -1617,6 +1617,13 @@ nsEditor::ReplaceContainer(nsIDOMNode *inNode,
// RemoveContainer: remove inNode, reparenting its children into their
// the parent of inNode
//
nsresult
nsEditor::RemoveContainer(nsINode* aNode)
{
nsCOMPtr<nsIDOMNode> node = do_QueryInterface(aNode);
return RemoveContainer(node);
}
nsresult
nsEditor::RemoveContainer(nsIDOMNode *inNode)
{

View File

@ -191,6 +191,7 @@ public:
const nsAString *aValue = nsnull,
bool aCloneAttributes = false);
nsresult RemoveContainer(nsINode* aNode);
nsresult RemoveContainer(nsIDOMNode *inNode);
nsresult InsertContainerAbove(nsIDOMNode *inNode,
nsCOMPtr<nsIDOMNode> *outNode,

View File

@ -62,6 +62,7 @@
#include "nsIDOMRGBColor.h"
#include "mozilla/Preferences.h"
#include "mozilla/dom/Element.h"
using namespace mozilla;
@ -561,6 +562,7 @@ nsHTMLEditor::AbsolutelyPositionElement(nsIDOMElement * aElement,
}
}
else {
res = NS_OK;
mHTMLCSSUtils->RemoveCSSProperty(aElement,
nsEditProperty::cssPosition,
EmptyString(), false);
@ -583,10 +585,8 @@ nsHTMLEditor::AbsolutelyPositionElement(nsIDOMElement * aElement,
EmptyString(), false);
}
bool hasStyleOrIdOrClass;
res = HasStyleOrIdOrClass(aElement, &hasStyleOrIdOrClass);
NS_ENSURE_SUCCESS(res, res);
if (!hasStyleOrIdOrClass && nsHTMLEditUtils::IsDiv(aElement)) {
nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
if (element && element->IsHTML(nsGkAtoms::div) && !HasStyleOrIdOrClass(element)) {
nsHTMLEditRules* htmlRules = static_cast<nsHTMLEditRules*>(mRules.get());
NS_ENSURE_TRUE(htmlRules, NS_ERROR_FAILURE);
res = htmlRules->MakeSureElemStartsOrEndsOnCR(aElement);

View File

@ -1001,26 +1001,6 @@ nsHTMLCSSUtils::RemoveCSSEquivalentToHTMLStyle(nsIDOMNode * aNode,
return NS_OK;
}
// aReturn is true if the element aElement carries an ID or a class.
nsresult
nsHTMLCSSUtils::HasClassOrID(nsIDOMElement * aElement, bool & aReturn)
{
nsAutoString classVal, idVal;
bool isClassSet, isIdSet;
aReturn = false;
nsresult res = mHTMLEditor->GetAttributeValue(aElement, NS_LITERAL_STRING("class"), classVal, &isClassSet);
NS_ENSURE_SUCCESS(res, res);
res = mHTMLEditor->GetAttributeValue(aElement, NS_LITERAL_STRING("id"), idVal, &isIdSet);
NS_ENSURE_SUCCESS(res, res);
// we need to make sure that if the element has an id or a class attribute,
// the attribute is not the empty string
aReturn = ((isClassSet && !classVal.IsEmpty()) ||
(isIdSet && !idVal.IsEmpty()));
return NS_OK;
}
// returns in aValueString the list of values for the CSS equivalences to
// the HTML style aHTMLProperty/aAttribute/aValueString for the node aNode;
// the value of aStyleType controls the styles we retrieve : specified or

View File

@ -183,13 +183,6 @@ public:
*/
void GetDefaultLengthUnit(nsAString & aLengthUnit);
/** asnwers true if the element aElement carries an ID or a class
*
* @param aElement [IN] a DOM element
* @param aReturn [OUT] the boolean answer
*/
nsresult HasClassOrID(nsIDOMElement * aElement, bool & aReturn);
/** returns the list of values for the CSS equivalences to
* the passed HTML style for the passed node
*

View File

@ -722,8 +722,8 @@ protected:
bool *aAll,
nsAString *outValue,
bool aCheckDefaults = true);
nsresult HasStyleOrIdOrClass(nsIDOMElement * aElement, bool *aHasStyleOrIdOrClass);
nsresult RemoveElementIfNoStyleOrIdOrClass(nsIDOMElement * aElement, nsIAtom * aTag);
bool HasStyleOrIdOrClass(mozilla::dom::Element* aElement);
nsresult RemoveElementIfNoStyleOrIdOrClass(nsIDOMNode* aElement);
// Whether the outer window of the DOM event target has focus or not.
bool OurWindowHasFocus();

View File

@ -57,6 +57,9 @@
#include "nsIContentIterator.h"
#include "nsAttrName.h"
#include "mozilla/dom/Element.h"
using namespace mozilla;
NS_IMETHODIMP nsHTMLEditor::AddDefaultProperty(nsIAtom *aProperty,
const nsAString & aAttribute,
@ -695,8 +698,7 @@ nsresult nsHTMLEditor::RemoveStyleInside(nsIDOMNode *aNode,
&propertyValue,
false);
// remove the span if it's useless
nsCOMPtr<nsIDOMElement> element = do_QueryInterface(spanNode);
res = RemoveElementIfNoStyleOrIdOrClass(element, nsEditProperty::span);
RemoveElementIfNoStyleOrIdOrClass(spanNode);
}
}
res = RemoveContainer(aNode);
@ -741,8 +743,8 @@ nsresult nsHTMLEditor::RemoveStyleInside(nsIDOMNode *aNode,
false);
// remove the node if it is a span, if its style attribute is empty or absent,
// and if it does not have a class nor an id
nsCOMPtr<nsIDOMElement> element = do_QueryInterface(aNode);
res = RemoveElementIfNoStyleOrIdOrClass(element, nsEditProperty::span);
RemoveElementIfNoStyleOrIdOrClass(aNode);
res = NS_OK;
}
}
}
@ -1890,41 +1892,37 @@ nsHTMLEditor::GetIsCSSEnabled(bool *aIsCSSEnabled)
return NS_OK;
}
nsresult
nsHTMLEditor::HasStyleOrIdOrClass(nsIDOMElement * aElement, bool *aHasStyleOrIdOrClass)
static bool
HasNonEmptyAttribute(dom::Element* aElement, nsIAtom* aName)
{
NS_ENSURE_TRUE(aElement, NS_ERROR_NULL_POINTER);
nsCOMPtr<nsIDOMNode> node = do_QueryInterface(aElement);
MOZ_ASSERT(aElement);
nsAutoString value;
return aElement->GetAttr(kNameSpaceID_None, aName, value) && !value.IsEmpty();
}
bool
nsHTMLEditor::HasStyleOrIdOrClass(dom::Element* aElement)
{
MOZ_ASSERT(aElement);
// remove the node if its style attribute is empty or absent,
// and if it does not have a class nor an id
nsAutoString styleVal;
bool isStyleSet;
*aHasStyleOrIdOrClass = true;
nsresult res = GetAttributeValue(aElement, NS_LITERAL_STRING("style"), styleVal, &isStyleSet);
NS_ENSURE_SUCCESS(res, res);
if (!isStyleSet || styleVal.IsEmpty()) {
res = mHTMLCSSUtils->HasClassOrID(aElement, *aHasStyleOrIdOrClass);
NS_ENSURE_SUCCESS(res, res);
}
return res;
return HasNonEmptyAttribute(aElement, nsGkAtoms::style) ||
HasNonEmptyAttribute(aElement, nsGkAtoms::_class) ||
HasNonEmptyAttribute(aElement, nsGkAtoms::id);
}
nsresult
nsHTMLEditor::RemoveElementIfNoStyleOrIdOrClass(nsIDOMElement * aElement, nsIAtom * aTag)
nsHTMLEditor::RemoveElementIfNoStyleOrIdOrClass(nsIDOMNode* aElement)
{
NS_ENSURE_TRUE(aElement, NS_ERROR_NULL_POINTER);
nsCOMPtr<nsIDOMNode> node = do_QueryInterface(aElement);
nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER);
// early way out if node is not the right kind of element
if (!NodeIsType(node, aTag)) {
if (!element->IsHTML(nsGkAtoms::span) || HasStyleOrIdOrClass(element)) {
return NS_OK;
}
bool hasStyleOrIdOrClass;
nsresult res = HasStyleOrIdOrClass(aElement, &hasStyleOrIdOrClass);
if (!hasStyleOrIdOrClass) {
res = RemoveContainer(node);
}
return res;
return RemoveContainer(element);
}