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

Unified Diff: Source/core/platform/Length.cpp

Issue 18565005: Revert "Rewrite parseFrameSetListOfDimension to match HTML5" (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 5 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 | « Source/core/platform/Length.h ('k') | Source/core/tests/HTMLDimension.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/platform/Length.cpp
diff --git a/Source/core/platform/Length.cpp b/Source/core/platform/Length.cpp
index d93d6afffa9cbb10713e6213ccce3a0b23ab50cb..89a1ee2730d199160ac0d5708c551fedcfa2fdc2 100644
--- a/Source/core/platform/Length.cpp
+++ b/Source/core/platform/Length.cpp
@@ -73,6 +73,36 @@ static Length parseHTMLAreaCoordinate(const CharType* data, unsigned length)
return Length(0, Fixed);
}
+template<typename CharType>
+static Length parseFrameSetDimension(const CharType* data, unsigned length)
+{
+ if (!length)
+ return Length(1, Relative);
+
+ unsigned intLength;
+ unsigned doubleLength;
+ unsigned i = splitLength(data, length, intLength, doubleLength);
+
+ bool ok;
+ CharType next = (i < length) ? data[i] : ' ';
+ if (next == '%') {
+ // IE quirk: accept decimal fractions for percentages.
+ double r = charactersToDouble(data, doubleLength, &ok);
+ if (ok)
+ return Length(r, Percent);
+ return Length(1, Relative);
+ }
+ int r = charactersToIntStrict(data, intLength, &ok);
+ if (next == '*') {
+ if (ok)
+ return Length(r, Relative);
+ return Length(1, Relative);
+ }
+ if (ok)
+ return Length(r, Fixed);
+ return Length(0, Relative);
+}
+
// FIXME: Per HTML5, this should follow the "rules for parsing a list of integers".
Vector<Length> parseHTMLAreaElementCoords(const String& string)
{
@@ -110,6 +140,43 @@ Vector<Length> parseHTMLAreaElementCoords(const String& string)
return r;
}
+template<typename CharType>
+static Vector<Length> parseFrameSetListOfDimensionsInternal(StringImpl* str)
+{
+ unsigned len = str->count(',') + 1;
+ Vector<Length> r(len);
+
+ int i = 0;
+ unsigned pos = 0;
+ size_t pos2;
+
+ while ((pos2 = str->find(',', pos)) != notFound) {
+ r[i++] = parseFrameSetDimension(str->getCharacters<CharType>() + pos, pos2 - pos);
+ pos = pos2 + 1;
+ }
+
+ ASSERT(i == len - 1);
+
+ // IE Quirk: If the last comma is the last char skip it and reduce len by one.
+ if (str->length() - pos > 0)
+ r[i] = parseFrameSetDimension(str->getCharacters<CharType>() + pos, str->length() - pos);
+ else
+ r.shrink(r.size() - 1);
+
+ return r;
+}
+
+// FIXME: Per HTML5, this should "use the rules for parsing a list of dimensions".
+Vector<Length> parseFrameSetListOfDimensions(const String& string)
+{
+ RefPtr<StringImpl> str = string.impl()->simplifyWhiteSpace();
+ if (!str->length())
+ return Vector<Length>();
+ if (str->is8Bit())
+ return parseFrameSetListOfDimensionsInternal<LChar>(str.get());
+ return parseFrameSetListOfDimensionsInternal<UChar>(str.get());
+}
+
class CalculationValueHandleMap {
WTF_MAKE_FAST_ALLOCATED;
public:
« no previous file with comments | « Source/core/platform/Length.h ('k') | Source/core/tests/HTMLDimension.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698