WebCore/dom/ExceptionCode.cpp
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebCore/dom/ExceptionCode.cpp	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,264 @@
+/*
+ *  Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "ExceptionCode.h"
+
+#include "EventException.h"
+#include "RangeException.h"
+#include "XMLHttpRequestException.h"
+
+#if ENABLE(SVG)
+#include "SVGException.h"
+#endif
+
+#if ENABLE(XPATH)
+#include "XPathException.h"
+#endif
+
+#if ENABLE(DATABASE)
+#include "SQLException.h"
+#endif
+
+namespace WebCore {
+
+static const char* const exceptionNames[] = {
+    "INDEX_SIZE_ERR",
+    "DOMSTRING_SIZE_ERR",
+    "HIERARCHY_REQUEST_ERR",
+    "WRONG_DOCUMENT_ERR",
+    "INVALID_CHARACTER_ERR",
+    "NO_DATA_ALLOWED_ERR",
+    "NO_MODIFICATION_ALLOWED_ERR",
+    "NOT_FOUND_ERR",
+    "NOT_SUPPORTED_ERR",
+    "INUSE_ATTRIBUTE_ERR",
+    "INVALID_STATE_ERR",
+    "SYNTAX_ERR",
+    "INVALID_MODIFICATION_ERR",
+    "NAMESPACE_ERR",
+    "INVALID_ACCESS_ERR",
+    "VALIDATION_ERR",
+    "TYPE_MISMATCH_ERR",
+    "SECURITY_ERR",
+    "NETWORK_ERR",
+    "ABORT_ERR",
+    "URL_MISMATCH_ERR",
+    "QUOTA_EXCEEDED_ERR"
+};
+
+static const char* const exceptionDescriptions[] = {
+    "Index or size was negative, or greater than the allowed value.",
+    "The specified range of text did not fit into a DOMString.",
+    "A Node was inserted somewhere it doesn't belong.",
+    "A Node was used in a different document than the one that created it (that doesn't support it).",
+    "An invalid or illegal character was specified, such as in an XML name.",
+    "Data was specified for a Node which does not support data.",
+    "An attempt was made to modify an object where modifications are not allowed.",
+    "An attempt was made to reference a Node in a context where it does not exist.",
+    "The implementation did not support the requested type of object or operation.",
+    "An attempt was made to add an attribute that is already in use elsewhere.",
+    "An attempt was made to use an object that is not, or is no longer, usable.",
+    "An invalid or illegal string was specified.",
+    "An attempt was made to modify the type of the underlying object.",
+    "An attempt was made to create or change an object in a way which is incorrect with regard to namespaces.",
+    "A parameter or an operation was not supported by the underlying object.",
+    "A call to a method such as insertBefore or removeChild would make the Node invalid with respect to \"partial validity\", this exception would be raised and the operation would not be done.",
+    "The type of an object was incompatible with the expected type of the parameter associated to the object.",
+    "An attempt was made to break through the security policy of the user agent.",
+    // FIXME: Couldn't find a description in the HTML/DOM specifications for NETWORK_ERR, ABORT_ERR, URL_MISMATCH_ERR, and QUOTA_EXCEEDED_ERR
+    "A network error occured.",
+    "The user aborted a request.",
+    "A worker global scope represented an absolute URL that is not equal to the resulting absolute URL.",
+    "An attempt was made to add something to storage that exceeded the quota."
+};
+
+static const char* const rangeExceptionNames[] = {
+    "BAD_BOUNDARYPOINTS_ERR",
+    "INVALID_NODE_TYPE_ERR"
+};
+
+static const char* const rangeExceptionDescriptions[] = {
+    "The boundary-points of a Range did not meet specific requirements.",
+    "The container of an boundary-point of a Range was being set to either a node of an invalid type or a node with an ancestor of an invalid type."
+};
+
+static const char* const eventExceptionNames[] = {
+    "UNSPECIFIED_EVENT_TYPE_ERR"
+};
+
+static const char* const eventExceptionDescriptions[] = {
+    "The Event's type was not specified by initializing the event before the method was called."
+};
+
+static const char* const xmlHttpRequestExceptionNames[] = {
+    "NETWORK_ERR",
+    "ABORT_ERR"
+};
+
+static const char* const xmlHttpRequestExceptionDescriptions[] = {
+    "A network error occured in synchronous requests.",
+    "The user aborted a request in synchronous requests."
+};
+
+#if ENABLE(XPATH)
+static const char* const xpathExceptionNames[] = {
+    "INVALID_EXPRESSION_ERR",
+    "TYPE_ERR"
+};
+
+static const char* const xpathExceptionDescriptions[] = {
+    "The expression had a syntax error or otherwise is not a legal expression according to the rules of the specific XPathEvaluator.",
+    "The expression could not be converted to return the specified type."
+};
+#endif
+
+#if ENABLE(SVG)
+static const char* const svgExceptionNames[] = {
+    "SVG_WRONG_TYPE_ERR",
+    "SVG_INVALID_VALUE_ERR",
+    "SVG_MATRIX_NOT_INVERTABLE"
+};
+
+static const char* const svgExceptionDescriptions[] = {
+    "An object of the wrong type was passed to an operation.",
+    "An invalid value was passed to an operation or assigned to an attribute.",
+    "An attempt was made to invert a matrix that is not invertible."
+};
+#endif
+
+#if ENABLE(DATABASE)
+static const char* const sqlExceptionNames[] = {
+    "UNKNOWN_ERR",
+    "DATABASE_ERR",
+    "VERSION_ERR",
+    "TOO_LARGE_ERR",
+    "QUOTA_ERR",
+    "SYNTAX_ERR",
+    "CONSTRAINT_ERR",
+    "TIMEOUT_ERR"
+};
+
+static const char* const sqlExceptionDescriptions[] = {
+    "The operation failed for reasons unrelated to the database.",
+    "The operation failed for some reason related to the database.",
+    "The actual database version did not match the expected version.",
+    "Data returned from the database is too large.",
+    "Quota was exceeded.",
+    "Invalid or unauthorized statement; or the number of arguments did not match the number of ? placeholders.",
+    "A constraint was violated.",
+    "A transaction lock could not be acquired in a reasonable time."
+};
+#endif
+
+void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& description)
+{
+    ASSERT(ec);
+
+    const char* typeName;
+    int code = ec;
+    const char* const* nameTable;
+    const char* const* descriptionTable;
+    int nameTableSize;
+    int nameTableOffset;
+    ExceptionType type;
+
+    if (code >= RangeException::RangeExceptionOffset && code <= RangeException::RangeExceptionMax) {
+        type = RangeExceptionType;
+        typeName = "DOM Range";
+        code -= RangeException::RangeExceptionOffset;
+        nameTable = rangeExceptionNames;
+        descriptionTable = rangeExceptionDescriptions;
+        nameTableSize = sizeof(rangeExceptionNames) / sizeof(rangeExceptionNames[0]);
+        nameTableOffset = RangeException::BAD_BOUNDARYPOINTS_ERR;
+    } else if (code >= EventException::EventExceptionOffset && code <= EventException::EventExceptionMax) {
+        type = EventExceptionType;
+        typeName = "DOM Events";
+        code -= EventException::EventExceptionOffset;
+        nameTable = eventExceptionNames;
+        descriptionTable = eventExceptionDescriptions;
+        nameTableSize = sizeof(eventExceptionNames) / sizeof(eventExceptionNames[0]);
+        nameTableOffset = EventException::UNSPECIFIED_EVENT_TYPE_ERR;
+    } else if (code >= XMLHttpRequestException::XMLHttpRequestExceptionOffset && code <= XMLHttpRequestException::XMLHttpRequestExceptionMax) {
+        type = XMLHttpRequestExceptionType;
+        typeName = "XMLHttpRequest";
+        code -= XMLHttpRequestException::XMLHttpRequestExceptionOffset;
+        nameTable = xmlHttpRequestExceptionNames;
+        descriptionTable = xmlHttpRequestExceptionDescriptions;
+        nameTableSize = sizeof(xmlHttpRequestExceptionNames) / sizeof(xmlHttpRequestExceptionNames[0]);
+        // XMLHttpRequest exception codes start with 101 and we don't want 100 empty elements in the name array
+        nameTableOffset = XMLHttpRequestException::NETWORK_ERR;
+#if ENABLE(XPATH)
+    } else if (code >= XPathException::XPathExceptionOffset && code <= XPathException::XPathExceptionMax) {
+        type = XPathExceptionType;
+        typeName = "DOM XPath";
+        code -= XPathException::XPathExceptionOffset;
+        nameTable = xpathExceptionNames;
+        descriptionTable = xpathExceptionDescriptions;
+        nameTableSize = sizeof(xpathExceptionNames) / sizeof(xpathExceptionNames[0]);
+        // XPath exception codes start with 51 and we don't want 51 empty elements in the name array
+        nameTableOffset = XPathException::INVALID_EXPRESSION_ERR;
+#endif
+#if ENABLE(SVG)
+    } else if (code >= SVGException::SVGExceptionOffset && code <= SVGException::SVGExceptionMax) {
+        type = SVGExceptionType;
+        typeName = "DOM SVG";
+        code -= SVGException::SVGExceptionOffset;
+        nameTable = svgExceptionNames;
+        descriptionTable = svgExceptionDescriptions;
+        nameTableSize = sizeof(svgExceptionNames) / sizeof(svgExceptionNames[0]);
+        nameTableOffset = SVGException::SVG_WRONG_TYPE_ERR;
+#endif
+#if ENABLE(DATABASE)
+    } else if (code >= SQLException::SQLExceptionOffset && code <= SQLException::SQLExceptionMax) {
+        type = SQLExceptionType;
+        typeName = "DOM SQL";
+        code -= SQLException::SQLExceptionOffset;
+        nameTable = sqlExceptionNames;
+        descriptionTable = sqlExceptionDescriptions;
+        nameTableSize = sizeof(sqlExceptionNames) / sizeof(sqlExceptionNames[0]);
+        nameTableOffset = SQLException::UNKNOWN_ERR;
+#endif
+    } else {
+        type = DOMExceptionType;
+        typeName = "DOM";
+        nameTable = exceptionNames;
+        descriptionTable = exceptionDescriptions;
+        nameTableSize = sizeof(exceptionNames) / sizeof(exceptionNames[0]);
+        nameTableOffset = INDEX_SIZE_ERR;
+    }
+
+    description.typeName = typeName;
+    description.name = (ec >= nameTableOffset && ec - nameTableOffset < nameTableSize) ? nameTable[ec - nameTableOffset] : 0;
+    description.description = (ec >= nameTableOffset && ec - nameTableOffset < nameTableSize) ? descriptionTable[ec - nameTableOffset] : 0;
+    description.code = code;
+    description.type = type;
+
+    // All exceptions used in the DOM code should have names.
+    ASSERT(description.name);
+    ASSERT(description.description);
+}
+
+} // namespace WebCore