summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/dom/ExceptionCode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom/ExceptionCode.cpp')
-rw-r--r--Source/WebCore/dom/ExceptionCode.cpp353
1 files changed, 353 insertions, 0 deletions
diff --git a/Source/WebCore/dom/ExceptionCode.cpp b/Source/WebCore/dom/ExceptionCode.cpp
new file mode 100644
index 0000000..1118a1a
--- /dev/null
+++ b/Source/WebCore/dom/ExceptionCode.cpp
@@ -0,0 +1,353 @@
+/*
+ * 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 "IDBDatabaseException.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
+
+#if ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
+#include "FileException.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
+
+#if ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
+static const char* const fileExceptionNames[] = {
+ "NOT_FOUND_ERR",
+ "SECURITY_ERR",
+ "ABORT_ERR",
+ "NOT_READABLE_ERR",
+ "ENCODING_ERR",
+ "NO_MODIFICATION_ALLOWED_ERR",
+ "INVALID_STATE_ERR",
+ "SYNTAX_ERR",
+ "INVALID_MODIFICATION_ERR",
+ "QUOTA_EXCEEDED_ERR",
+ "TYPE_MISMATCH_ERR",
+ "PATH_EXISTS_ERR"
+};
+
+static const char* const fileExceptionDescriptions[] = {
+ "A requested file or directory could not be found at the time an operation was processed.",
+ "It was determined that certain files are unsafe for access within a Web application, or that too many calls are being made on file resources.",
+ "An ongoing operation was aborted, typically with a call to abort().",
+ "The requested file could not be read, typically due to permission problems that have occured after a reference to a file was acquired.",
+ "A URI supplied to the API was malformed, or the resulting Data URL has exceeded the URL length limitations for Data URLs.",
+ "An attempt was made to write to a file or directory which could not be modified due to the state of the underlying filesystem.",
+ "An operation that depends on state cached in an interface object was made but the state had changed since it was read from disk.",
+ "An invalid or unsupported argument was given, like an invalid line ending specifier.",
+ "The modification request was illegal.",
+ "The operation failed because it would cause the application to exceed its storage quota.",
+ "The path supplied exists, but was not an entry of requested type.",
+ "An attempt was made to create a file or directory where an element already exists."
+};
+#endif
+
+#if ENABLE(INDEXED_DATABASE)
+static const char* const idbDatabaseExceptionNames[] = {
+ "UNKNOWN_ERR",
+ "NON_TRANSIENT_ERR",
+ "NOT_FOUND_ERR",
+ "CONSTRAINT_ERR",
+ "DATA_ERR",
+ "NOT_ALLOWED_ERR",
+ "SERIAL_ERR",
+ "RECOVERABLE_ERR",
+ "TRANSIENT_ERR",
+ "TIMEOUT_ERR",
+ "DEADLOCK_ERR",
+ "READ_ONLY_ERR"
+};
+
+static const char* const idbDatabaseExceptionDescriptions[] = {
+ "An unknown error occurred within Indexed Database.",
+ "NON_TRANSIENT_ERR", // FIXME: Write a better message if it's ever possible this is thrown.
+ "The name supplied does not match any existing item.",
+ "The request cannot be completed due to a failed constraint.",
+ "The data provided does not meet the requirements of the function.",
+ "This function is not allowed to be called in such a context.",
+ "The data supplied cannot be serialized according to the structured cloning algorithm.",
+ "RECOVERABLE_ERR", // FIXME: This isn't even used.
+ "TRANSIENT_ERR", // FIXME: This isn't even used.
+ "TIMEOUT_ERR", // This can't be thrown.
+ "DEADLOCK_ERR", // This can't be thrown.
+ "Write operations cannot be preformed on a read-only transaction."
+};
+#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 = WTF_ARRAY_LENGTH(rangeExceptionNames);
+ 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 = WTF_ARRAY_LENGTH(eventExceptionNames);
+ 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 = WTF_ARRAY_LENGTH(xmlHttpRequestExceptionNames);
+ // 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 = WTF_ARRAY_LENGTH(xpathExceptionNames);
+ // 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 = WTF_ARRAY_LENGTH(svgExceptionNames);
+ 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 = WTF_ARRAY_LENGTH(sqlExceptionNames);
+ nameTableOffset = SQLException::UNKNOWN_ERR;
+#endif
+#if ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
+ } else if (code >= FileException::FileExceptionOffset && code <= FileException::FileExceptionMax) {
+ type = FileExceptionType;
+ typeName = "DOM File";
+ code -= FileException::FileExceptionOffset;
+ nameTable = fileExceptionNames;
+ descriptionTable = fileExceptionDescriptions;
+ nameTableSize = WTF_ARRAY_LENGTH(fileExceptionNames);
+ nameTableOffset = FileException::NOT_FOUND_ERR;
+#endif
+#if ENABLE(INDEXED_DATABASE)
+ } else if (code >= IDBDatabaseException::IDBDatabaseExceptionOffset && code <= IDBDatabaseException::IDBDatabaseExceptionMax) {
+ type = IDBDatabaseExceptionType;
+ typeName = "DOM IDBDatabase";
+ code -= IDBDatabaseException::IDBDatabaseExceptionOffset;
+ nameTable = idbDatabaseExceptionNames;
+ descriptionTable = idbDatabaseExceptionDescriptions;
+ nameTableSize = WTF_ARRAY_LENGTH(idbDatabaseExceptionNames);
+ nameTableOffset = IDBDatabaseException::UNKNOWN_ERR;
+#endif
+ } else {
+ type = DOMExceptionType;
+ typeName = "DOM";
+ nameTable = exceptionNames;
+ descriptionTable = exceptionDescriptions;
+ nameTableSize = WTF_ARRAY_LENGTH(exceptionNames);
+ 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