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

Unified Diff: third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp

Issue 1636333003: Implement specced parsing algorithm for <area coords> (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
Index: third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp
index ffa82eb611da7ae718e7cb6ce245947bfd65bede..640803f4736174d7f6638635be4cb33bf3faf834 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp
@@ -25,13 +25,15 @@
#include "core/html/parser/HTMLParserIdioms.h"
#include "core/HTMLNames.h"
-#include <limits>
+#include "platform/ParsingUtilities.h"
#include "wtf/MathExtras.h"
#include "wtf/text/AtomicString.h"
#include "wtf/text/StringBuilder.h"
#include "wtf/text/StringHash.h"
#include "wtf/text/TextEncoding.h"
+#include <limits>
+
namespace blink {
using namespace HTMLNames;
@@ -113,18 +115,8 @@ Decimal parseToDecimalForNumberType(const String& string, const Decimal& fallbac
return value.isZero() ? Decimal(0) : value;
}
-double parseToDoubleForNumberType(const String& string, double fallbackValue)
+static double checkDoubleValue(double value, bool valid, double fallbackValue)
{
- // http://www.whatwg.org/specs/web-apps/current-work/#floating-point-numbers
- // String::toDouble() accepts leading + and whitespace characters, which are not valid here.
- UChar firstCharacter = string[0];
- if (firstCharacter != '-' && firstCharacter != '.' && !isASCIIDigit(firstCharacter))
- return fallbackValue;
- if (string.endsWith('.'))
- return fallbackValue;
-
- bool valid = false;
- double value = string.toDouble(&valid);
if (!valid)
return fallbackValue;
@@ -140,6 +132,21 @@ double parseToDoubleForNumberType(const String& string, double fallbackValue)
return value ? value : 0;
}
+double parseToDoubleForNumberType(const String& string, double fallbackValue)
+{
+ // http://www.whatwg.org/specs/web-apps/current-work/#floating-point-numbers
+ // String::toDouble() accepts leading + and whitespace characters, which are not valid here.
+ UChar firstCharacter = string[0];
+ if (firstCharacter != '-' && firstCharacter != '.' && !isASCIIDigit(firstCharacter))
+ return fallbackValue;
+ if (string.endsWith('.'))
+ return fallbackValue;
+
+ bool valid = false;
+ double value = string.toDouble(&valid);
+ return checkDoubleValue(value, valid, fallbackValue);
+}
+
template <typename CharacterType>
static bool parseHTMLIntegerInternal(const CharacterType* position, const CharacterType* end, int& value)
{
@@ -265,6 +272,48 @@ bool parseHTMLNonNegativeInteger(const String& input, unsigned& value)
return parseHTMLNonNegativeIntegerInternal(start, start + length, value);
}
+template<typename CharacterType>
+static bool isSpaceOrDelimiter(CharacterType c)
+{
+ return isHTMLSpace(c) || c == ',' || c == ';';
+}
+
+template<typename CharacterType>
+static bool isNotSpaceDelimiterOrNumberStart(CharacterType c)
+{
+ return !(isSpaceOrDelimiter(c) || isASCIIDigit(c) || c == '.' || c == '-');
+}
+
+template<typename CharacterType>
+static Vector<double> parseHTMLListOfFloatingPointNumbersInternal(
+ const CharacterType* position, const CharacterType* end)
+{
+ Vector<double> numbers;
+ skipWhile<CharacterType, isSpaceOrDelimiter>(position, end);
+
+ while (position < end) {
+ skipWhile<CharacterType, isNotSpaceDelimiterOrNumberStart>(position, end);
+
+ const CharacterType* unparsedNumberStart = position;
+ skipUntil<CharacterType, isSpaceOrDelimiter>(position, end);
+
+ size_t parsedLength = 0;
+ double number = charactersToDouble(unparsedNumberStart, position - unparsedNumberStart, parsedLength);
+ numbers.append(checkDoubleValue(number, parsedLength != 0, 0));
+
+ skipWhile<CharacterType, isSpaceOrDelimiter>(position, end);
+ }
+ return numbers;
+}
+
+// https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-list-of-floating-point-numbers
+Vector<double> parseHTMLListOfFloatingPointNumbers(const String& input)
+{
+ if (input.is8Bit())
+ return parseHTMLListOfFloatingPointNumbersInternal(input.characters8(), input.characters8() + input.length());
+ return parseHTMLListOfFloatingPointNumbersInternal(input.characters16(), input.characters16() + input.length());
+}
+
static const char charsetString[] = "charset";
static const size_t charsetLength = sizeof("charset") - 1;
« no previous file with comments | « third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.h ('k') | third_party/WebKit/Source/platform/Length.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698