NS_IMETHODIMP ChangeCSSInlineStyleTxn::DoTransaction(void) { NS_ASSERTION(mEditor && mElement, "bad state"); if (!mEditor || !mElement) { return NS_ERROR_NOT_INITIALIZED; } nsCOMPtr<nsIDOMElementCSSInlineStyle> inlineStyles = do_QueryInterface(mElement); NS_ENSURE_TRUE(inlineStyles, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIDOMCSSStyleDeclaration> cssDecl; nsresult result = inlineStyles->GetStyle(getter_AddRefs(cssDecl)); NS_ENSURE_SUCCESS(result, result); NS_ENSURE_TRUE(cssDecl, NS_ERROR_NULL_POINTER); nsAutoString propertyNameString; mProperty->ToString(propertyNameString); NS_NAMED_LITERAL_STRING(styleAttr, "style"); result = mElement->HasAttribute(styleAttr, &mUndoAttributeWasSet); NS_ENSURE_SUCCESS(result, result); nsAutoString values; result = cssDecl->GetPropertyValue(propertyNameString, values); NS_ENSURE_SUCCESS(result, result); mUndoValue.Assign(values); // does this property accept more than 1 value ? // we need to know that because of bug 62682 bool multiple = AcceptsMoreThanOneValue(mProperty); if (mRemoveProperty) { nsAutoString returnString; if (multiple) { // the property can have more than one value, let's remove only // the value we have to remove and not the others // the 2 lines below are a workaround because nsDOMCSSDeclaration::GetPropertyCSSValue // is not yet implemented (bug 62682) RemoveValueFromListOfValues(values, NS_LITERAL_STRING("none")); RemoveValueFromListOfValues(values, mValue); if (values.IsEmpty()) { result = cssDecl->RemoveProperty(propertyNameString, returnString); NS_ENSURE_SUCCESS(result, result); } else { nsAutoString priority; result = cssDecl->GetPropertyPriority(propertyNameString, priority); NS_ENSURE_SUCCESS(result, result); result = cssDecl->SetProperty(propertyNameString, values, priority); NS_ENSURE_SUCCESS(result, result); } } else { result = cssDecl->RemoveProperty(propertyNameString, returnString); NS_ENSURE_SUCCESS(result, result); } } else { nsAutoString priority; result = cssDecl->GetPropertyPriority(propertyNameString, priority); NS_ENSURE_SUCCESS(result, result); if (multiple) { // the property can have more than one value, let's add // the value we have to add to the others // the line below is a workaround because nsDOMCSSDeclaration::GetPropertyCSSValue // is not yet implemented (bug 62682) AddValueToMultivalueProperty(values, mValue); } else values.Assign(mValue); result = cssDecl->SetProperty(propertyNameString, values, priority); NS_ENSURE_SUCCESS(result, result); } // let's be sure we don't keep an empty style attribute PRUint32 length; result = cssDecl->GetLength(&length); NS_ENSURE_SUCCESS(result, result); if (!length) { result = mElement->RemoveAttribute(styleAttr); NS_ENSURE_SUCCESS(result, result); } else mRedoAttributeWasSet = true; return cssDecl->GetPropertyValue(propertyNameString, mRedoValue); }
NS_IMETHODIMP ChangeStyleTransaction::DoTransaction() { nsCOMPtr<nsStyledElement> inlineStyles = do_QueryInterface(mElement); NS_ENSURE_TRUE(inlineStyles, NS_ERROR_NULL_POINTER); nsCOMPtr<nsICSSDeclaration> cssDecl = inlineStyles->Style(); nsAutoString propertyNameString; mProperty->ToString(propertyNameString); mUndoAttributeWasSet = mElement->HasAttr(kNameSpaceID_None, nsGkAtoms::style); nsAutoString values; nsresult rv = cssDecl->GetPropertyValue(propertyNameString, values); NS_ENSURE_SUCCESS(rv, rv); mUndoValue.Assign(values); // Does this property accept more than one value? (bug 62682) bool multiple = AcceptsMoreThanOneValue(*mProperty); if (mRemoveProperty) { nsAutoString returnString; if (multiple) { // Let's remove only the value we have to remove and not the others // The two lines below are a workaround because // nsDOMCSSDeclaration::GetPropertyCSSValue is not yet implemented (bug // 62682) RemoveValueFromListOfValues(values, NS_LITERAL_STRING("none")); RemoveValueFromListOfValues(values, mValue); if (values.IsEmpty()) { rv = cssDecl->RemoveProperty(propertyNameString, returnString); NS_ENSURE_SUCCESS(rv, rv); } else { nsAutoString priority; cssDecl->GetPropertyPriority(propertyNameString, priority); rv = cssDecl->SetProperty(propertyNameString, values, priority); NS_ENSURE_SUCCESS(rv, rv); } } else { rv = cssDecl->RemoveProperty(propertyNameString, returnString); NS_ENSURE_SUCCESS(rv, rv); } } else { nsAutoString priority; cssDecl->GetPropertyPriority(propertyNameString, priority); if (multiple) { // Let's add the value we have to add to the others // The line below is a workaround because // nsDOMCSSDeclaration::GetPropertyCSSValue is not yet implemented (bug // 62682) AddValueToMultivalueProperty(values, mValue); } else { values.Assign(mValue); } rv = cssDecl->SetProperty(propertyNameString, values, priority); NS_ENSURE_SUCCESS(rv, rv); } // Let's be sure we don't keep an empty style attribute uint32_t length = cssDecl->Length(); if (!length) { rv = mElement->UnsetAttr(kNameSpaceID_None, nsGkAtoms::style, true); NS_ENSURE_SUCCESS(rv, rv); } else { mRedoAttributeWasSet = true; } return cssDecl->GetPropertyValue(propertyNameString, mRedoValue); }