Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Unified Diff: third_party/WebKit/Source/core/dom/Element.cpp

Issue 1388903002: className should be allowed to be a whitespace-only string (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/dom/Element/classlist-empty-string-expected.txt ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/dom/Element.cpp
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 9034a842ff08eed765667e4d3dfa4a467b18e33b..d0439217f457a1e59aab37db2b125f00e88c0413 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1229,10 +1229,11 @@ inline void Element::attributeChangedFromParserOrByCloning(const QualifiedName&
}
template <typename CharacterType>
-static inline bool classStringHasClassName(const CharacterType* characters, unsigned length)
+static inline bool classStringHasClassName(const CharacterType* characters, unsigned length, bool& isWhiteSpaceOnly)
tkent 2015/10/08 23:20:12 We should introduce an enum, and this function sho
{
ASSERT(length > 0);
+ isWhiteSpaceOnly = false;
unsigned i = 0;
do {
if (isNotHTMLSpace<CharacterType>(characters[i]))
@@ -1240,10 +1241,13 @@ static inline bool classStringHasClassName(const CharacterType* characters, unsi
++i;
} while (i < length);
+ if (i == length)
+ isWhiteSpaceOnly = true;
+
return i < length;
}
-static inline bool classStringHasClassName(const AtomicString& newClassString)
+static inline bool classStringHasClassName(const AtomicString& newClassString, bool& isWhiteSpaceOnly)
{
unsigned length = newClassString.length();
@@ -1251,8 +1255,8 @@ static inline bool classStringHasClassName(const AtomicString& newClassString)
return false;
if (newClassString.is8Bit())
- return classStringHasClassName(newClassString.characters8(), length);
- return classStringHasClassName(newClassString.characters16(), length);
+ return classStringHasClassName(newClassString.characters8(), length, isWhiteSpaceOnly);
+ return classStringHasClassName(newClassString.characters16(), length, isWhiteSpaceOnly);
}
void Element::classAttributeChanged(const AtomicString& newClassString)
@@ -1261,8 +1265,10 @@ void Element::classAttributeChanged(const AtomicString& newClassString)
bool testShouldInvalidateStyle = inActiveDocument() && styleResolver && styleChangeType() < SubtreeStyleChange;
ASSERT(elementData());
- if (classStringHasClassName(newClassString)) {
- const bool shouldFoldCase = document().inQuirksMode();
+
+ bool isWhiteSpaceOnlyClassname;
tkent 2015/10/08 23:20:12 This variable needs to be initialized, or classStr
+ const bool shouldFoldCase = document().inQuirksMode();
+ if (classStringHasClassName(newClassString, isWhiteSpaceOnlyClassname)) {
const SpaceSplitString oldClasses = elementData()->classNames();
elementData()->setClass(newClassString, shouldFoldCase);
const SpaceSplitString& newClasses = elementData()->classNames();
@@ -1272,7 +1278,10 @@ void Element::classAttributeChanged(const AtomicString& newClassString)
const SpaceSplitString& oldClasses = elementData()->classNames();
if (testShouldInvalidateStyle)
document().styleEngine().classChangedForElement(oldClasses, *this);
- elementData()->clearClass();
+ if (isWhiteSpaceOnlyClassname)
+ elementData()->setClass(newClassString, shouldFoldCase);
+ else
+ elementData()->clearClass();
}
if (hasRareData())
@@ -1297,7 +1306,8 @@ bool Element::shouldInvalidateDistributionWhenAttributeChanged(ElementShadow* el
if (name == HTMLNames::classAttr) {
const AtomicString& newClassString = newValue;
- if (classStringHasClassName(newClassString)) {
+ bool isWhiteSpaceOnlyClassname;
+ if (classStringHasClassName(newClassString, isWhiteSpaceOnlyClassname)) {
const SpaceSplitString& oldClasses = elementData()->classNames();
const SpaceSplitString newClasses(newClassString, document().inQuirksMode() ? SpaceSplitString::ShouldFoldCase : SpaceSplitString::ShouldNotFoldCase);
if (featureSet.checkSelectorsForClassChange(oldClasses, newClasses))
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/dom/Element/classlist-empty-string-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698