Bug 820902. nsAttrValue::Equals should do ASCII-case-insensitive compares when it's doing case-insensitive compares. r=sicking

This commit is contained in:
Boris Zbarsky 2012-12-13 17:08:44 -05:00
parent 5b648d8c35
commit 7cbdd79ac6
9 changed files with 71 additions and 9 deletions

View File

@ -463,6 +463,7 @@ public:
virtual bool GetAttr(int32_t aNameSpaceID, nsIAtom* aName,
nsAString& aResult) const;
virtual bool HasAttr(int32_t aNameSpaceID, nsIAtom* aName) const;
// aCaseSensitive == eIgnoreCaase means ASCII case-insensitive matching.
virtual bool AttrValueIs(int32_t aNameSpaceID, nsIAtom* aName,
const nsAString& aValue,
nsCaseTreatment aCaseSensitive) const;

View File

@ -1066,7 +1066,7 @@ nsAttrValue::Equals(const nsAString& aValue,
nsDependentString dep(static_cast<PRUnichar*>(str->Data()),
str->StorageSize()/sizeof(PRUnichar) - 1);
return aCaseSensitive == eCaseMatters ? aValue.Equals(dep) :
aValue.Equals(dep, nsCaseInsensitiveStringComparator());
nsContentUtils::EqualsIgnoreASCIICase(aValue, dep);
}
return aValue.IsEmpty();
}
@ -1074,8 +1074,9 @@ nsAttrValue::Equals(const nsAString& aValue,
if (aCaseSensitive == eCaseMatters) {
return static_cast<nsIAtom*>(GetPtr())->Equals(aValue);
}
return nsDependentAtomString(static_cast<nsIAtom*>(GetPtr())).
Equals(aValue, nsCaseInsensitiveStringComparator());
return nsContentUtils::EqualsIgnoreASCIICase(
nsDependentAtomString(static_cast<nsIAtom*>(GetPtr())),
aValue);
default:
break;
}
@ -1083,7 +1084,7 @@ nsAttrValue::Equals(const nsAString& aValue,
nsAutoString val;
ToString(val);
return aCaseSensitive == eCaseMatters ? val.Equals(aValue) :
val.Equals(aValue, nsCaseInsensitiveStringComparator());
nsContentUtils::EqualsIgnoreASCIICase(val, aValue);
}
bool

View File

@ -200,6 +200,7 @@ public:
uint32_t HashValue() const;
bool Equals(const nsAttrValue& aOther) const;
// aCaseSensitive == eIgnoreCase means ASCII case-insenstive matching
bool Equals(const nsAString& aValue, nsCaseTreatment aCaseSensitive) const;
bool Equals(nsIAtom* aValue, nsCaseTreatment aCaseSensitive) const;

View File

@ -7945,12 +7945,13 @@ nsDocument::FindImageMap(const nsAString& aUseMapValue)
}
uint32_t i, n = mImageMaps->Length(true);
nsString name;
for (i = 0; i < n; ++i) {
nsIContent* map = mImageMaps->Item(i);
if (map->AttrValueIs(kNameSpaceID_None, nsGkAtoms::id, mapName,
eCaseMatters) ||
map->AttrValueIs(kNameSpaceID_None, nsGkAtoms::name, mapName,
eIgnoreCase)) {
(map->GetAttr(kNameSpaceID_None, nsGkAtoms::name, name) &&
mapName.Equals(name, nsCaseInsensitiveStringComparator()))) {
return map->AsElement();
}
}

View File

@ -1298,8 +1298,11 @@ GetAccessModifierMask(nsISupports* aDocShell)
static bool
IsAccessKeyTarget(nsIContent* aContent, nsIFrame* aFrame, nsAString& aKey)
{
if (!aContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::accesskey, aKey,
eIgnoreCase))
// Use GetAttr because we want Unicode case=insensitive matching
// XXXbz shouldn't this be case-sensitive, per spec?
nsString contentKey;
if (!aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::accesskey, contentKey) ||
!contentKey.Equals(aKey, nsCaseInsensitiveStringComparator()))
return false;
nsCOMPtr<nsIDOMXULDocument> xulDoc =

View File

@ -298,8 +298,10 @@ nsHTMLEditor::IsSimpleModifiableNode(nsIContent* aContent,
nsCOMPtr<nsIAtom> atom = do_GetAtom(*aAttribute);
MOZ_ASSERT(atom);
nsString attrValue;
if (element->IsHTML(aProperty) && IsOnlyAttribute(element, *aAttribute) &&
element->AttrValueIs(kNameSpaceID_None, atom, *aValue, eIgnoreCase)) {
element->GetAttr(kNameSpaceID_None, atom, attrValue) &&
attrValue.Equals(*aValue, nsCaseInsensitiveStringComparator())) {
// This is not quite correct, because it excludes cases like
// <font face=000> being the same as <font face=#000000>.
// Property-specific handling is needed (bug 760211).

View File

@ -0,0 +1,26 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
.ascii > span {
background-color: yellow;
}
</style>
</head>
<body>
<div class="ascii"><span lang="paSSfield-killroyß">case-sensitive</span></div>
<div class="ascii"><span lang="passfield-killroyß">lowercase</span></div>
<div class="ascii"><span lang="PASSFIELD-KILLROYß">uppercase</span></div>
<div class="nonascii"><span lang="paſſfield-killroyß">small long s (C)</span></div>
<div class="nonascii"><span lang="passfield-&#x212a;illroyß">kelvin sign (C)</span></div>
<div class="nonascii"><span lang="paßfield-killroyß">small sharp s (F)</span></div>
<div class="nonascii"><span lang="paẞfield-killroyß">capital sharp s (F)</span></div>
<div class="nonascii"><span lang="passfield-killroyẞ">capital sharp s (S)</span></div>
<div class="nonascii"><span lang="passfield-killroyß">fi ligature (U+fb01) (F)</span></div>
<div class="nonascii"><span lang="passfıeld-killroyß"> dotless i (T)</span></div>
<div class="nonascii"><span lang="passfİeld-killroyß">dotted I (T)</span></div>
</body>
</html>

View File

@ -0,0 +1,26 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
span[lang="paSSfield-killroyß"] {
background-color: yellow;
}
</style>
</head>
<body>
<div class="ascii"><span lang="paSSfield-killroyß">case-sensitive</span></div>
<div class="ascii"><span lang="passfield-killroyß">lowercase</span></div>
<div class="ascii"><span lang="PASSFIELD-KILLROYß">uppercase</span></div>
<div class="nonascii"><span lang="paſſfield-killroyß">small long s (C)</span></div>
<div class="nonascii"><span lang="passfield-&#x212a;illroyß">kelvin sign (C)</span></div>
<div class="nonascii"><span lang="paßfield-killroyß">small sharp s (F)</span></div>
<div class="nonascii"><span lang="paẞfield-killroyß">capital sharp s (F)</span></div>
<div class="nonascii"><span lang="passfield-killroyẞ">capital sharp s (S)</span></div>
<div class="nonascii"><span lang="passfield-killroyß">fi ligature (U+fb01) (F)</span></div>
<div class="nonascii"><span lang="passfıeld-killroyß"> dotless i (T)</span></div>
<div class="nonascii"><span lang="passfİeld-killroyß">dotted I (T)</span></div>
</body>
</html>

View File

@ -1 +1,2 @@
== state-dependent-in-any.html state-dependent-in-any-ref.html
== attr-case-insensitive-1.html attr-case-insensitive-1-ref.html