+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
dom/EventNames.cpp \
dom/EventTarget.cpp \
dom/EventTargetNode.cpp \
+ dom/ExceptionCode.cpp \
dom/KeyboardEvent.cpp \
dom/MappedAttribute.cpp \
dom/MouseEvent.cpp \
RelativePath="..\dom\EventTargetNode.h"\r
>\r
</File>\r
+ <File\r
+ RelativePath="..\dom\ExceptionCode.cpp"\r
+ >\r
+ </File>\r
<File\r
RelativePath="..\dom\ExceptionCode.h"\r
>\r
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;
};
dom/EventNames.cpp
dom/EventTarget.cpp
dom/EventTargetNode.cpp
+ dom/ExceptionCode.cpp
dom/KeyboardEvent.cpp
dom/MappedAttribute.cpp
dom/MouseEvent.cpp
#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 {
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));
}
}
#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";
{
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];
}
--- /dev/null
+/*
+ * 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);
+}
+
+}
/*
- * 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
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
#ifndef SVGException_h
#define SVGException_h
+
#if ENABLE(SVG)
+#include <wtf/RefCounted.h>
+
namespace WebCore {
const int SVGExceptionOffset = 300;
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)