diff options
Diffstat (limited to 'Source/WebCore/dom/ExceptionCode.cpp')
-rw-r--r-- | Source/WebCore/dom/ExceptionCode.cpp | 353 |
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 |