Reviewed by Sam Weinig.
[WebKit-https.git] / WebCore / dom / ExceptionCode.cpp
1 /*
2  *  Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "ExceptionCode.h"
28
29 #include "Event.h"
30 #include "RangeException.h"
31 #include "XMLHttpRequest.h"
32
33 #if ENABLE(SVG)
34 #include "SVGException.h"
35 #endif
36
37 #if ENABLE(XPATH)
38 #include "XPathEvaluator.h"
39 #endif
40
41 namespace WebCore {
42
43 static const char* const exceptionNames[] = {
44     "INDEX_SIZE_ERR",
45     "DOMSTRING_SIZE_ERR",
46     "HIERARCHY_REQUEST_ERR",
47     "WRONG_DOCUMENT_ERR",
48     "INVALID_CHARACTER_ERR",
49     "NO_DATA_ALLOWED_ERR",
50     "NO_MODIFICATION_ALLOWED_ERR",
51     "NOT_FOUND_ERR",
52     "NOT_SUPPORTED_ERR",
53     "INUSE_ATTRIBUTE_ERR",
54     "INVALID_STATE_ERR",
55     "SYNTAX_ERR",
56     "INVALID_MODIFICATION_ERR",
57     "NAMESPACE_ERR",
58     "INVALID_ACCESS_ERR",
59     "VALIDATION_ERR",
60     "TYPE_MISMATCH_ERR"
61 };
62
63 static const char* const rangeExceptionNames[] = {
64     "BAD_BOUNDARYPOINTS_ERR",
65     "INVALID_NODE_TYPE_ERR"
66 };
67
68 static const char* const eventExceptionNames[] = {
69     "UNSPECIFIED_EVENT_TYPE_ERR"
70 };
71
72 static const char* const xmlHttpRequestExceptionNames[] = {
73     "NETWORK_ERR"
74 };
75
76 #if ENABLE(XPATH)
77 static const char* const xpathExceptionNames[] = {
78     "INVALID_EXPRESSION_ERR",
79     "TYPE_ERR"
80 };
81 #endif
82
83 #if ENABLE(SVG)
84 static const char* const svgExceptionNames[] = {
85     "SVG_WRONG_TYPE_ERR",
86     "SVG_INVALID_VALUE_ERR",
87     "SVG_MATRIX_NOT_INVERTABLE"
88 };
89 #endif
90
91 void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& description)
92 {
93     ASSERT(ec);
94
95     const char* typeName = "DOM";
96     int code = ec;
97     const char* const* nameTable;
98     int nameTableSize;
99     int nameTableOffset;
100     if (code >= RangeExceptionOffset && code <= RangeExceptionMax) {
101         typeName = "DOM Range";
102         code -= RangeExceptionOffset;
103         nameTable = rangeExceptionNames;
104         nameTableSize = sizeof(rangeExceptionNames) / sizeof(rangeExceptionNames[0]);
105         nameTableOffset = BAD_BOUNDARYPOINTS_ERR;
106     } else if (code >= EventExceptionOffset && code <= EventExceptionMax) {
107         typeName = "DOM Events";
108         code -= EventExceptionOffset;
109         nameTable = eventExceptionNames;
110         nameTableSize = sizeof(eventExceptionNames) / sizeof(eventExceptionNames[0]);
111         nameTableOffset = UNSPECIFIED_EVENT_TYPE_ERR;
112     } else if (code >= XMLHttpRequestExceptionOffset && code <= XMLHttpRequestExceptionMax) {
113         typeName = "XMLHttpRequest";
114         code -= XMLHttpRequestExceptionOffset;
115         nameTable = xmlHttpRequestExceptionNames;
116         nameTableSize = sizeof(xmlHttpRequestExceptionNames) / sizeof(xmlHttpRequestExceptionNames[0]);
117         // XMLHttpRequest exception codes start with 101 and we don't want 100 empty elements in the name array
118         nameTableOffset = NETWORK_ERR;
119 #if ENABLE(XPATH)
120     } else if (code >= XPathExceptionOffset && code <= XPathExceptionMax) {
121         typeName = "DOM XPath";
122         code -= XPathExceptionOffset;
123         nameTable = xpathExceptionNames;
124         nameTableSize = sizeof(xpathExceptionNames) / sizeof(xpathExceptionNames[0]);
125         // XPath exception codes start with 51 and we don't want 51 empty elements in the name array
126         nameTableOffset = INVALID_EXPRESSION_ERR;
127 #endif
128 #if ENABLE(SVG)
129     } else if (code >= SVGExceptionOffset && code <= SVGExceptionMax) {
130         typeName = "DOM SVG";
131         code -= SVGExceptionOffset;
132         nameTable = svgExceptionNames;
133         nameTableSize = sizeof(svgExceptionNames) / sizeof(svgExceptionNames[0]);
134         nameTableOffset = SVG_WRONG_TYPE_ERR;
135 #endif
136     } else {
137         typeName = "DOM";
138         nameTable = exceptionNames;
139         nameTableSize = sizeof(exceptionNames) / sizeof(exceptionNames[0]);
140         nameTableOffset = INDEX_SIZE_ERR;
141     }
142
143     description.typeName = typeName;
144     description.name = (ec >= nameTableOffset && ec - nameTableOffset < nameTableSize) ? nameTable[ec - nameTableOffset] : 0;
145     description.code = code;
146
147     // All exceptions used in the DOM code should have names.
148     ASSERT(description.name);
149 }
150
151 }