void nsStyledElementNotElementCSSInlineStyle::ParseStyleAttribute(const nsAString& aValue, nsAttrValue& aResult, bool aForceInDataDoc) { nsIDocument* doc = OwnerDoc(); if (aForceInDataDoc || !doc->IsLoadedAsData() || doc->IsStaticDocument()) { bool isCSS = true; // assume CSS until proven otherwise if (!IsInNativeAnonymousSubtree()) { // native anonymous content // always assumes CSS nsAutoString styleType; doc->GetHeaderData(nsGkAtoms::headerContentStyleType, styleType); if (!styleType.IsEmpty()) { static const char textCssStr[] = "text/css"; isCSS = (styleType.EqualsIgnoreCase(textCssStr, sizeof(textCssStr) - 1)); } } if (isCSS) { css::Loader* cssLoader = doc->CSSLoader(); nsCSSParser cssParser(cssLoader); nsCOMPtr<nsIURI> baseURI = GetBaseURI(); nsRefPtr<css::StyleRule> rule; cssParser.ParseStyleAttribute(aValue, doc->GetDocumentURI(), baseURI, NodePrincipal(), getter_AddRefs(rule)); if (rule) { aResult.SetTo(rule, &aValue); return; } } } aResult.SetTo(aValue); }
nsresult nsDOMCSSDeclaration::ParsePropertyValue(const nsCSSProperty aPropID, const nsAString& aPropValue, bool aIsImportant) { css::Declaration* olddecl = GetCSSDeclaration(PR_TRUE); if (!olddecl) { return NS_ERROR_FAILURE; } CSSParsingEnvironment env; GetCSSParsingEnvironment(env); if (!env.mPrincipal) { return NS_ERROR_NOT_AVAILABLE; } // For nsDOMCSSAttributeDeclaration, SetCSSDeclaration will lead to // Attribute setting code, which leads in turn to BeginUpdate. We // need to start the update now so that the old rule doesn't get used // between when we mutate the declaration and when we set the new // rule (see stack in bug 209575). mozAutoDocConditionalContentUpdateBatch autoUpdate(DocToUpdate(), PR_TRUE); css::Declaration* decl = olddecl->EnsureMutable(); nsCSSParser cssParser(env.mCSSLoader); bool changed; nsresult result = cssParser.ParseProperty(aPropID, aPropValue, env.mSheetURI, env.mBaseURI, env.mPrincipal, decl, &changed, aIsImportant); if (NS_FAILED(result) || !changed) { if (decl != olddecl) { delete decl; } return result; } return SetCSSDeclaration(decl); }
NS_IMETHODIMP nsDOMCSSDeclaration::SetCssText(const nsAString& aCssText) { // We don't need to *do* anything with the old declaration, but we need // to ensure that it exists, or else SetCSSDeclaration may crash. css::Declaration* olddecl = GetCSSDeclaration(PR_TRUE); if (!olddecl) { return NS_ERROR_FAILURE; } CSSParsingEnvironment env; GetCSSParsingEnvironment(env); if (!env.mPrincipal) { return NS_ERROR_NOT_AVAILABLE; } // For nsDOMCSSAttributeDeclaration, SetCSSDeclaration will lead to // Attribute setting code, which leads in turn to BeginUpdate. We // need to start the update now so that the old rule doesn't get used // between when we mutate the declaration and when we set the new // rule (see stack in bug 209575). mozAutoDocConditionalContentUpdateBatch autoUpdate(DocToUpdate(), PR_TRUE); nsAutoPtr<css::Declaration> decl(new css::Declaration()); decl->InitializeEmpty(); nsCSSParser cssParser(env.mCSSLoader); bool changed; nsresult result = cssParser.ParseDeclarations(aCssText, env.mSheetURI, env.mBaseURI, env.mPrincipal, decl, &changed); if (NS_FAILED(result) || !changed) { return result; } return SetCSSDeclaration(decl.forget()); }