Reviewed by Sam Weinig.
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Dec 2007 03:18:21 +0000 (03:18 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Dec 2007 03:18:21 +0000 (03:18 +0000)
        - fix http://bugs.webkit.org/show_bug.cgi?id=16332
          ObjC DOM exception object descriptions should include the exception name

        * WebCore.pro: Added ExceptionCode.cpp.
        * WebCore.vcproj/WebCore.vcproj: Added ExceptionCode.cpp.
        * WebCore.xcodeproj/project.pbxproj: Added ExceptionCode.cpp.
        * WebCoreSources.bkl: Added ExceptionCode.cpp.

        * bindings/js/kjs_binding.cpp: (KJS::setDOMException): Moved the code to decompose an
        ExceptionCode into ExceptionCode.h/cpp -- getExceptionCodeDescription. Also removed
        the many unneeded includes that were here. Had to keep one special case here, for
        SECURITY_ERR.

        * bindings/objc/ExceptionHandlers.mm: (WebCore::raiseDOMException): Changed to use the
        new getExceptionCodeDescription function so that this shares the exception name
        information that was previously only available to JavaScript.

        * dom/ExceptionCode.cpp: Copied from bindings/js/kjs_binding.cpp.
        (WebCore::getExceptionCodeDescription): Added some assertions, and made the function
        handle exception names in a slightly more robust way that is not subject to integer
        overflow. (Not a real world issue since we should never receive a bad exception code.)

        * dom/ExceptionCode.h: Added the ExceptionCodeDescription struct and the
        getExceptionCodeDescription function.

        * svg/SVGException.h: Added a missing #include and got rid of some comments. Some of
        the comments were mildly helpful, but others were incorrect. This now matches the other
        exception-related headers such as RangeException.h.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28509 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/WebCore.pro
WebCore/WebCore.vcproj/WebCore.vcproj
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/WebCoreSources.bkl
WebCore/bindings/js/kjs_binding.cpp
WebCore/bindings/objc/ExceptionHandlers.mm
WebCore/dom/ExceptionCode.cpp [new file with mode: 0644]
WebCore/dom/ExceptionCode.h
WebCore/svg/SVGException.h

index 2e2a73c..215eac6 100644 (file)
@@ -1,3 +1,36 @@
+2007-12-06  Darin Adler  <darin@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=16332
+          ObjC DOM exception object descriptions should include the exception name
+
+        * WebCore.pro: Added ExceptionCode.cpp.
+        * WebCore.vcproj/WebCore.vcproj: Added ExceptionCode.cpp.
+        * WebCore.xcodeproj/project.pbxproj: Added ExceptionCode.cpp.
+        * WebCoreSources.bkl: Added ExceptionCode.cpp.
+
+        * bindings/js/kjs_binding.cpp: (KJS::setDOMException): Moved the code to decompose an
+        ExceptionCode into ExceptionCode.h/cpp -- getExceptionCodeDescription. Also removed
+        the many unneeded includes that were here. Had to keep one special case here, for
+        SECURITY_ERR.
+
+        * bindings/objc/ExceptionHandlers.mm: (WebCore::raiseDOMException): Changed to use the
+        new getExceptionCodeDescription function so that this shares the exception name
+        information that was previously only available to JavaScript.
+
+        * dom/ExceptionCode.cpp: Copied from bindings/js/kjs_binding.cpp.
+        (WebCore::getExceptionCodeDescription): Added some assertions, and made the function
+        handle exception names in a slightly more robust way that is not subject to integer
+        overflow. (Not a real world issue since we should never receive a bad exception code.)
+
+        * dom/ExceptionCode.h: Added the ExceptionCodeDescription struct and the
+        getExceptionCodeDescription function.
+
+        * svg/SVGException.h: Added a missing #include and got rid of some comments. Some of
+        the comments were mildly helpful, but others were incorrect. This now matches the other
+        exception-related headers such as RangeException.h.
+
 2007-12-06  Brady Eidson  <beidson@apple.com>
 
         Reviewed by Darin
index 8b7b25b..0a1034b 100644 (file)
@@ -483,6 +483,7 @@ SOURCES += \
     dom/EventNames.cpp \
     dom/EventTarget.cpp \
     dom/EventTargetNode.cpp \
+    dom/ExceptionCode.cpp \
     dom/KeyboardEvent.cpp \
     dom/MappedAttribute.cpp \
     dom/MouseEvent.cpp \
index fc47201..5e4d507 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\dom\ExceptionCode.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\dom\ExceptionCode.h"\r
                                >\r
                        </File>\r
index d310f9d..e39ead1 100644 (file)
                9380F47309A11AB4001FDB34 /* Widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9380F47109A11AB4001FDB34 /* Widget.cpp */; };
                9380F47409A11AB4001FDB34 /* Widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 9380F47209A11AB4001FDB34 /* Widget.h */; settings = {ATTRIBUTES = (Private, ); }; };
                9380F47809A11ACC001FDB34 /* WidgetMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9380F47709A11ACC001FDB34 /* WidgetMac.mm */; };
+               93831B570D087D6000E5C984 /* ExceptionCode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93831B560D087D6000E5C984 /* ExceptionCode.cpp */; };
                938E65F109F09840008A48EC /* JSHTMLElementWrapperFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 938E65F009F09840008A48EC /* JSHTMLElementWrapperFactory.h */; };
                938E65F709F0985D008A48EC /* JSHTMLElementWrapperFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 938E65F609F0985D008A48EC /* JSHTMLElementWrapperFactory.cpp */; };
                938E666009F09B81008A48EC /* JSHTMLCanvasElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 938E665F09F09B81008A48EC /* JSHTMLCanvasElement.cpp */; };
                9380F47109A11AB4001FDB34 /* Widget.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Widget.cpp; sourceTree = "<group>"; };
                9380F47209A11AB4001FDB34 /* Widget.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Widget.h; sourceTree = "<group>"; };
                9380F47709A11ACC001FDB34 /* WidgetMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = WidgetMac.mm; sourceTree = "<group>"; };
+               93831B560D087D6000E5C984 /* ExceptionCode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExceptionCode.cpp; sourceTree = "<group>"; };
                938E65F009F09840008A48EC /* JSHTMLElementWrapperFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSHTMLElementWrapperFactory.h; sourceTree = "<group>"; };
                938E65F609F0985D008A48EC /* JSHTMLElementWrapperFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLElementWrapperFactory.cpp; sourceTree = "<group>"; };
                938E662509F09956008A48EC /* HTMLCanvasElement.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HTMLCanvasElement.idl; sourceTree = "<group>"; };
                                14EC267E09CA07E000E1EEEC /* EventTargetNode.cpp */,
                                14EC267D09CA07E000E1EEEC /* EventTargetNode.h */,
                                935FBCF109BA143B00E230B1 /* ExceptionCode.h */,
+                               93831B560D087D6000E5C984 /* ExceptionCode.cpp */,
                                85031B2D0A44EFC700F992E0 /* KeyboardEvent.cpp */,
                                85031B2E0A44EFC700F992E0 /* KeyboardEvent.h */,
                                14CF7C2009F7110600EB3665 /* KeyboardEvent.idl */,
                                B25599B60D00D8BA00BB825C /* SVGResourceFilter.cpp in Sources */,
                                B25599B90D00D8BA00BB825C /* SVGResourceMarker.cpp in Sources */,
                                B25599BB0D00D8BA00BB825C /* SVGResourceMasker.cpp in Sources */,
+                               93831B570D087D6000E5C984 /* ExceptionCode.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index 872e421..94cd769 100644 (file)
@@ -303,6 +303,7 @@ This file contains the list of files needed to build WebCore.
         dom/EventNames.cpp
         dom/EventTarget.cpp
         dom/EventTargetNode.cpp
+        dom/ExceptionCode.cpp
         dom/KeyboardEvent.cpp
         dom/MappedAttribute.cpp
         dom/MouseEvent.cpp
index 296091d..b4c6c86 100644 (file)
 #include "config.h"
 #include "kjs_binding.h"
 
-#include "Chrome.h"
-#include "Event.h"
-#include "EventNames.h"
-#include "Frame.h"
+#include "ExceptionCode.h"
 #include "HTMLImageElement.h"
 #include "HTMLNames.h"
 #include "JSNode.h"
-#include "Page.h"
-#include "PlatformString.h"
-#include "Range.h"
-#include "RangeException.h"
 #include "XMLHttpRequest.h"
-#include "kjs_dom.h"
-#include "kjs_window.h"
-#include <kjs/collector.h>
-#include <wtf/HashMap.h>
-
-#if ENABLE(SVG)
-#include "SVGException.h"
-#endif
-
-#if ENABLE(XPATH)
-#include "XPathEvaluator.h"
-#endif
 
 using namespace WebCore;
-using namespace EventNames;
 using namespace HTMLNames;
 
 namespace KJS {
@@ -275,130 +255,35 @@ String valueToStringWithUndefinedOrNullCheck(ExecState* exec, JSValue* val)
     return val->toString(exec);
 }
 
-static const char* const exceptionNames[] = {
-    0,
-    "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",
-};
-
-static const char* const rangeExceptionNames[] = {
-    0, "BAD_BOUNDARYPOINTS_ERR", "INVALID_NODE_TYPE_ERR"
-};
-
-static const char* const eventExceptionNames[] = {
-    "UNSPECIFIED_EVENT_TYPE_ERR"
-};
-
-static const char* const xmlHttpRequestExceptionNames[] = {
-    "NETWORK_ERR"
-};
-
-#if ENABLE(XPATH)
-static const char* const xpathExceptionNames[] = {
-    "INVALID_EXPRESSION_ERR",
-    "TYPE_ERR"
-};
-#endif
-
-#if ENABLE(SVG)
-static const char* const svgExceptionNames[] = {
-    "SVG_WRONG_TYPE_ERR",
-    "SVG_INVALID_VALUE_ERR",
-    "SVG_MATRIX_NOT_INVERTABLE"
-};
-#endif
-
 void setDOMException(ExecState* exec, ExceptionCode ec)
 {
     if (!ec || exec->hadException())
         return;
 
-    const char* type = "DOM";
-    int code = ec;
-
-    const char* const* nameTable;
-  
-    int nameTableSize;
-    int nameIndex;
-    if (code >= RangeExceptionOffset && code <= RangeExceptionMax) {
-        type = "DOM Range";
-        code -= RangeExceptionOffset;
-        nameIndex = code;
-        nameTable = rangeExceptionNames;
-        nameTableSize = sizeof(rangeExceptionNames) / sizeof(rangeExceptionNames[0]);
-    } else if (code >= EventExceptionOffset && code <= EventExceptionMax) {
-        type = "DOM Events";
-        code -= EventExceptionOffset;
-        nameIndex = code;
-        nameTable = eventExceptionNames;
-        nameTableSize = sizeof(eventExceptionNames) / sizeof(eventExceptionNames[0]);
-    } else if (code == XMLHttpRequestExceptionOffset) {
-        // FIXME: this exception should be replaced with DOM SECURITY_ERR when it finds its way to the spec.
+    // To be removed: See XMLHttpRequest.h.
+    if (ec == XMLHttpRequestExceptionOffset + PERMISSION_DENIED) {
         throwError(exec, GeneralError, "Permission denied");
         return;
-    } else if (code > XMLHttpRequestExceptionOffset && code <= XMLHttpRequestExceptionMax) {
-        type = "XMLHttpRequest";
-        // XMLHttpRequest exception codes start with 101 and we don't want 100 empty elements in the name array
-        nameIndex = code - NETWORK_ERR;
-        code -= XMLHttpRequestExceptionOffset;
-        nameTable = xmlHttpRequestExceptionNames;
-        nameTableSize = sizeof(xmlHttpRequestExceptionNames) / sizeof(xmlHttpRequestExceptionNames[0]);
-#if ENABLE(XPATH)
-    } else if (code >= XPathExceptionOffset && code <= XPathExceptionMax) {
-        type = "DOM XPath";
-        // XPath exception codes start with 51 and we don't want 51 empty elements in the name array
-        nameIndex = code - INVALID_EXPRESSION_ERR;
-        code -= XPathExceptionOffset;
-        nameTable = xpathExceptionNames;
-        nameTableSize = sizeof(xpathExceptionNames) / sizeof(xpathExceptionNames[0]);
-#endif
-#if ENABLE(SVG)
-    } else if (code >= SVGExceptionOffset && code <= SVGExceptionMax) {
-        type = "DOM SVG";
-        code -= SVGExceptionOffset;
-        nameIndex = code;
-        nameTable = svgExceptionNames;
-        nameTableSize = sizeof(svgExceptionNames) / sizeof(svgExceptionNames[0]);
-#endif
-    } else {
-        nameIndex = code;
-        nameTable = exceptionNames;
-        nameTableSize = sizeof(exceptionNames) / sizeof(exceptionNames[0]);
     }
 
-    const char* name = (nameIndex < nameTableSize && nameIndex >= 0) ? nameTable[nameIndex] : 0;
+    ExceptionCodeDescription description;
+    getExceptionCodeDescription(ec, description);
 
     // 100 characters is a big enough buffer, because there are:
     //   13 characters in the message
-    //   10 characters in the longest type, "DOM Events"
-    //   27 characters in the longest name, "NO_MODIFICATION_ALLOWED_ERR"
+    //   10 characters in the longest type name
+    //   27 characters in the longest exception name
     //   20 or so digits in the longest integer's ASCII form (even if int is 64-bit)
     //   1 byte for a null character
     // That adds up to about 70 bytes.
     char buffer[100];
-
-    if (name)
-        sprintf(buffer, "%s: %s Exception %d", name, type, code);
+    if (description.name)
+        sprintf(buffer, "%s: %s Exception %d", description.name, description.typeName, description.code);
     else
-        sprintf(buffer, "%s Exception %d", type, code);
+        sprintf(buffer, "%s Exception %d", description.typeName, description.code);
 
     JSObject* errorObject = throwError(exec, GeneralError, buffer);
-    errorObject->put(exec, "code", jsNumber(code));
+    errorObject->put(exec, "code", jsNumber(description.code));
 }
 
 }
index 43e6668..e9e42a8 100644 (file)
 #include "config.h"
 #include "ExceptionHandlers.h"
 
-#include "Event.h"
-#include "RangeException.h"
-#include "SVGException.h"
-#include "XPathEvaluator.h"
+#include "ExceptionCode.h"
 
 NSString * DOMException = @"DOMException";
 NSString * DOMRangeException = @"DOMRangeException";
@@ -43,30 +40,34 @@ void raiseDOMException(ExceptionCode ec)
 {
     ASSERT(ec);
 
-    NSString *name = DOMException;
+    ExceptionCodeDescription description;
+    getExceptionCodeDescription(ec, description);
 
-    int code = ec;
-    if (ec >= RangeExceptionOffset && ec <= RangeExceptionMax) {
-        name = DOMRangeException;
-        code -= RangeExceptionOffset;
-    } else if (ec >= EventExceptionOffset && ec <= EventExceptionMax) {
-        name = DOMEventException;
-        code -= EventExceptionOffset;
-#if ENABLE(SVG)
-    } else if (ec >= SVGExceptionOffset && ec <= SVGExceptionMax) {
-        name = DOMSVGException;
-        code -= SVGExceptionOffset;
-#endif
-#if ENABLE(XPATH)
-    } else if (ec >= XPathExceptionOffset && ec <= XPathExceptionMax) {
-        name = DOMXPathException;
-        code -= XPathExceptionOffset;
-#endif
-    }
+    NSString *exceptionName;
+    if (strcmp(description.typeName, "DOM Range") == 0)
+        exceptionName = DOMRangeException;
+    else if (strcmp(description.typeName, "DOM Events") == 0)
+        exceptionName = DOMEventException;
+    else if (strcmp(description.typeName, "DOM SVG") == 0)
+        exceptionName = DOMSVGException;
+    else if (strcmp(description.typeName, "DOM XPath") == 0)
+        exceptionName = DOMXPathException;
+    else
+        exceptionName = DOMException;
+
+    NSString *reason;
+    if (description.name)
+        reason = [[NSString alloc] initWithFormat:@"*** %s: %@ %d", description.name, exceptionName, description.code];
+    else
+        reason = [[NSString alloc] initWithFormat:@"*** %@ %d", exceptionName, description.code];
+
+    NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:description.code], exceptionName, nil];
+
+    NSException *exception = [NSException exceptionWithName:exceptionName reason:reason userInfo:userInfo];
+
+    [reason release];
+    [userInfo release];
 
-    NSString *reason = [NSString stringWithFormat:@"*** Exception received from DOM API: %d", code];
-    NSException *exception = [NSException exceptionWithName:name reason:reason
-        userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:code] forKey:name]];
     [exception raise];
 }
 
diff --git a/WebCore/dom/ExceptionCode.cpp b/WebCore/dom/ExceptionCode.cpp
new file mode 100644 (file)
index 0000000..0a953d6
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ *  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 "Event.h"
+#include "RangeException.h"
+#include "XMLHttpRequest.h"
+
+#if ENABLE(SVG)
+#include "SVGException.h"
+#endif
+
+#if ENABLE(XPATH)
+#include "XPathEvaluator.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"
+};
+
+static const char* const rangeExceptionNames[] = {
+    "BAD_BOUNDARYPOINTS_ERR",
+    "INVALID_NODE_TYPE_ERR"
+};
+
+static const char* const eventExceptionNames[] = {
+    "UNSPECIFIED_EVENT_TYPE_ERR"
+};
+
+static const char* const xmlHttpRequestExceptionNames[] = {
+    "NETWORK_ERR"
+};
+
+#if ENABLE(XPATH)
+static const char* const xpathExceptionNames[] = {
+    "INVALID_EXPRESSION_ERR",
+    "TYPE_ERR"
+};
+#endif
+
+#if ENABLE(SVG)
+static const char* const svgExceptionNames[] = {
+    "SVG_WRONG_TYPE_ERR",
+    "SVG_INVALID_VALUE_ERR",
+    "SVG_MATRIX_NOT_INVERTABLE"
+};
+#endif
+
+void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& description)
+{
+    ASSERT(ec);
+
+    const char* typeName = "DOM";
+    int code = ec;
+    const char* const* nameTable;
+    int nameTableSize;
+    int nameTableOffset;
+    if (code >= RangeExceptionOffset && code <= RangeExceptionMax) {
+        typeName = "DOM Range";
+        code -= RangeExceptionOffset;
+        nameTable = rangeExceptionNames;
+        nameTableSize = sizeof(rangeExceptionNames) / sizeof(rangeExceptionNames[0]);
+        nameTableOffset = BAD_BOUNDARYPOINTS_ERR;
+    } else if (code >= EventExceptionOffset && code <= EventExceptionMax) {
+        typeName = "DOM Events";
+        code -= EventExceptionOffset;
+        nameTable = eventExceptionNames;
+        nameTableSize = sizeof(eventExceptionNames) / sizeof(eventExceptionNames[0]);
+        nameTableOffset = UNSPECIFIED_EVENT_TYPE_ERR;
+    } else if (code >= XMLHttpRequestExceptionOffset && code <= XMLHttpRequestExceptionMax) {
+        typeName = "XMLHttpRequest";
+        code -= XMLHttpRequestExceptionOffset;
+        nameTable = xmlHttpRequestExceptionNames;
+        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 = NETWORK_ERR;
+#if ENABLE(XPATH)
+    } else if (code >= XPathExceptionOffset && code <= XPathExceptionMax) {
+        typeName = "DOM XPath";
+        code -= XPathExceptionOffset;
+        nameTable = xpathExceptionNames;
+        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 = INVALID_EXPRESSION_ERR;
+#endif
+#if ENABLE(SVG)
+    } else if (code >= SVGExceptionOffset && code <= SVGExceptionMax) {
+        typeName = "DOM SVG";
+        code -= SVGExceptionOffset;
+        nameTable = svgExceptionNames;
+        nameTableSize = sizeof(svgExceptionNames) / sizeof(svgExceptionNames[0]);
+        nameTableOffset = SVG_WRONG_TYPE_ERR;
+#endif
+    } else {
+        typeName = "DOM";
+        nameTable = exceptionNames;
+        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.code = code;
+
+    // All exceptions used in the DOM code should have names.
+    ASSERT(description.name);
+}
+
+}
index be148e4..f905687 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2006 Apple Computer, Inc.
+ *  Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -51,6 +51,13 @@ namespace WebCore {
         TYPE_MISMATCH_ERR = 17
     };
 
+    struct ExceptionCodeDescription {
+        const char* typeName; // has spaces and is suitable for use in exception description strings; maximum length is 10 characters
+        const char* name; // exception name, also intended for use in exception description strings; 0 if name not known; maximum length is 27 characters
+        int code; // numeric value of the exception within a particular type
+    };
+    void getExceptionCodeDescription(ExceptionCode, ExceptionCodeDescription&);
+
 }
 
 #endif
index dee360a..299dd5b 100644 (file)
 
 #ifndef SVGException_h
 #define SVGException_h
+
 #if ENABLE(SVG)
 
+#include <wtf/RefCounted.h>
+
 namespace WebCore {
 
     const int SVGExceptionOffset = 300;
@@ -34,17 +37,15 @@ namespace WebCore {
         SVG_MATRIX_NOT_INVERTABLE   = SVGExceptionOffset + 2
     };
 
-    // This class is NEVER used inside ksvg2. It only inherits from Shared for IDL generation.
     class SVGException : public RefCounted<SVGException> {
     public:
-        // Forward declare these enums in the w3c naming scheme, for IDL generation
-        // We do NOT match the W3C here - we can't return 0/1/2 as JS values - we have to match ours!
         enum {
-            SVG_WRONG_TYPE_ERR          = WebCore::SVG_WRONG_TYPE_ERR - SVGExceptionOffset,
-            SVG_INVALID_VALUE_ERR       = WebCore::SVG_INVALID_VALUE_ERR - SVGExceptionOffset,
-            SVG_MATRIX_NOT_INVERTABLE   = WebCore::SVG_MATRIX_NOT_INVERTABLE - SVGExceptionOffset
+            SVG_WRONG_TYPE_ERR          = 0,
+            SVG_INVALID_VALUE_ERR       = 1,
+            SVG_MATRIX_NOT_INVERTABLE   = 2
         };
     };
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)