Index: third_party/WebKit/Source/core/svg/SVGParsingError.h |
diff --git a/third_party/WebKit/Source/core/svg/SVGParsingError.h b/third_party/WebKit/Source/core/svg/SVGParsingError.h |
index 5a40f9f4c101fe0bb403d1eaf80b9d6030b319c8..a5531319306ead64bc2d86f2a1cb12af6a673bd9 100644 |
--- a/third_party/WebKit/Source/core/svg/SVGParsingError.h |
+++ b/third_party/WebKit/Source/core/svg/SVGParsingError.h |
@@ -27,14 +27,71 @@ |
#ifndef SVGParsingError_h |
#define SVGParsingError_h |
+#include "wtf/MathExtras.h" |
+#include "wtf/text/WTFString.h" |
+ |
namespace blink { |
-enum SVGParsingError { |
+class QualifiedName; |
+ |
+enum class SVGParseStatus { |
NoError, |
- ParsingAttributeFailedError, |
- NegativeValueForbiddenError |
+ |
+ // Syntax errors |
+ TrailingGarbage, |
+ ExpectedBoolean, |
+ ExpectedEnumeration, |
+ |
+ // Semantic errors |
+ NegativeValue, |
+ |
+ // Generic error |
+ ParsingFailed, |
+}; |
+ |
+class SVGParsingError { |
+ STACK_ALLOCATED(); |
+public: |
+ SVGParsingError(SVGParseStatus status = SVGParseStatus::NoError, size_t locus = 0) |
+ : m_status(static_cast<unsigned>(status)) |
+ , m_locus(checkLocus(locus)) |
+ { |
+ ASSERT(this->status() == status); |
+ } |
+ |
+ SVGParseStatus status() const { return static_cast<SVGParseStatus>(m_status); } |
+ |
+ bool hasLocus() const { return m_locus != kNoLocus; } |
+ unsigned locus() const { return m_locus; } |
+ |
+ // Generates a string describing this error for |value| in the context of |
+ // an <element, attribute>-name pair. |
+ String format(const String& tagName, const QualifiedName&, const AtomicString& value) const; |
+ |
+private: |
+ static const int kLocusBits = 24; |
+ static const unsigned kNoLocus = (1u << kLocusBits) - 1; |
+ |
+ static unsigned checkLocus(size_t locus) |
+ { |
+ // Clamp to fit in the number of bits available. If the character index |
+ // encoded by the locus does not fit in the number of bits allocated |
+ // for it, the locus will be disabled (set to kNoLocus). This means |
+ // that very long values will be output in their entirety. That should |
+ // however be rather uncommon. |
+ return clampTo<unsigned>(locus, 0, kNoLocus); |
+ } |
+ |
+ unsigned m_status : 8; |
+ unsigned m_locus : kLocusBits; // The locus (character index) of the error within the parsed string. |
}; |
+inline bool operator==(const SVGParsingError& error, SVGParseStatus status) |
+{ |
+ return error.status() == status; |
+} |
+inline bool operator!=(const SVGParsingError& error, SVGParseStatus status) { return !(error == status); } |
+ |
} // namespace blink |
#endif // SVGParsingError_h |