PRInt32& aChangeHint)
nsChangeHint& aChangeHint)
PRBool CSSParserImpl::ParseFont(PRInt32& aErrorCode, nsCSSDeclaration* aDeclaration,                                 PRInt32& aChangeHint){  static const nsCSSProperty fontIDs[] = {    eCSSProperty_font_style,    eCSSProperty_font_variant,    eCSSProperty_font_weight  };  nsCSSValue  family;  if (ParseVariant(aErrorCode, family, VARIANT_HK, nsCSSProps::kFontKTable)) {    if (ExpectEndProperty(aErrorCode, PR_TRUE)) {      if (eCSSUnit_Inherit == family.GetUnit()) {        AppendValue(aDeclaration, eCSSProperty_font_family, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_style, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_variant, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_weight, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_size, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_line_height, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_stretch, family, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_size_adjust, family, aChangeHint);      }      else {        AppendValue(aDeclaration, eCSSProperty_font_family, family, aChangeHint);  // keyword value overrides everything else        nsCSSValue empty;        AppendValue(aDeclaration, eCSSProperty_font_style, empty, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_variant, empty, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_weight, empty, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_size, empty, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_line_height, empty, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_stretch, empty, aChangeHint);        AppendValue(aDeclaration, eCSSProperty_font_size_adjust, empty, aChangeHint);      }      return PR_TRUE;    }    return PR_FALSE;  }  // Get optional font-style, font-variant and font-weight (in any order)  const PRInt32 numProps = 3;  nsCSSValue  values[numProps];  PRInt32 found = ParseChoice(aErrorCode, values, fontIDs, numProps);  if ((found < 0) || (eCSSUnit_Inherit == values[0].GetUnit()) ||       (eCSSUnit_Initial == values[0].GetUnit())) { // illegal data    return PR_FALSE;  }  if ((found & 1) == 0) {    // Provide default font-style    values[0].SetNormalValue();  }  if ((found & 2) == 0) {    // Provide default font-variant    values[1].SetNormalValue();  }  if ((found & 4) == 0) {    // Provide default font-weight    values[2].SetNormalValue();  }  // Get mandatory font-size  nsCSSValue  size;  if (! ParseVariant(aErrorCode, size, VARIANT_KEYWORD | VARIANT_LP, nsCSSProps::kFontSizeKTable)) {    return PR_FALSE;  }  // Get optional "/" line-height  nsCSSValue  lineHeight;  if (ExpectSymbol(aErrorCode, '/', PR_TRUE)) {    if (! ParseVariant(aErrorCode, lineHeight, VARIANT_NUMBER | VARIANT_LP | VARIANT_NORMAL, nsnull)) {      return PR_FALSE;    }  }  else {    lineHeight.SetNormalValue();  }  // Get final mandatory font-family  if (ParseFamily(aErrorCode, family)) {    if ((eCSSUnit_Inherit != family.GetUnit()) && (eCSSUnit_Initial != family.GetUnit()) &&        ExpectEndProperty(aErrorCode, PR_TRUE)) {      AppendValue(aDeclaration, eCSSProperty_font_family, family, aChangeHint);      AppendValue(aDeclaration, eCSSProperty_font_style, values[0], aChangeHint);      AppendValue(aDeclaration, eCSSProperty_font_variant, values[1], aChangeHint);      AppendValue(aDeclaration, eCSSProperty_font_weight, values[2], aChangeHint);      AppendValue(aDeclaration, eCSSProperty_font_size, size, aChangeHint);      AppendValue(aDeclaration, eCSSProperty_line_height, lineHeight, aChangeHint);      AppendValue(aDeclaration, eCSSProperty_font_stretch, nsCSSValue(eCSSUnit_Normal), aChangeHint);      AppendValue(aDeclaration, eCSSProperty_font_size_adjust, nsCSSValue(eCSSUnit_None), aChangeHint);      return PR_TRUE;    }  }  return PR_FALSE;}