SVN commit 762890 by porten: Make DOMException an object type of its own. Still todo: harmonize exception objects and properties. M +7 -0 kjs_binding.cpp M +12 -53 kjs_dom.cpp M +4 -6 kjs_dom.h --- branches/KDE/4.0/kdelibs/khtml/ecma/kjs_binding.cpp #762889:762890 @@ -319,6 +319,9 @@ const char* const* nameTable; int nameTableSize; + // ### clean up after harmonizing exception objects. maybe use a + // ### single class? Some human readable message would be nice, too. + if (code >= DOM::RangeException::_EXCEPTION_OFFSET && code <= DOM::RangeException::_EXCEPTION_MAX) { type = "DOM Range"; code -= DOM::RangeException::_EXCEPTION_OFFSET; @@ -341,6 +344,10 @@ } else { nameTable = exceptionNames; nameTableSize = sizeof(exceptionNames) / sizeof(exceptionNames[0]); + errorObject = new JSDOMException(exec); + exec->setException(errorObject); + errorObject->put(exec, exec->propertyNames().name, jsString(UString(type) + " Exception")); + errorObject->put(exec, exec->propertyNames().message, jsString(nameTable[code])); } const char* name = (code >= 0 && code < nameTableSize) ? nameTable[code] : 0; --- branches/KDE/4.0/kdelibs/khtml/ecma/kjs_dom.cpp #762889:762890 @@ -1702,10 +1702,8 @@ IMPLEMENT_PSEUDO_CONSTRUCTOR_WITH_PARENT(NodeConstructor, "NodeConstructor", DOMNodeProto, DOMNodeConstants) // ------------------------------------------------------------------------- -const ClassInfo DOMExceptionConstructor::info = { "DOMExceptionConstructor", 0, 0, 0 }; - -/* Source for DOMExceptionConstructorTable. -@begin DOMExceptionConstructorTable 15 +/* Source for DOMExceptionProtoTable. +@begin DOMExceptionProtoTable 15 INDEX_SIZE_ERR DOM::DOMException::INDEX_SIZE_ERR DontDelete|ReadOnly DOMSTRING_SIZE_ERR DOM::DOMException::DOMSTRING_SIZE_ERR DontDelete|ReadOnly HIERARCHY_REQUEST_ERR DOM::DOMException::HIERARCHY_REQUEST_ERR DontDelete|ReadOnly @@ -1726,62 +1724,23 @@ @end */ -DOMExceptionConstructor::DOMExceptionConstructor(ExecState* exec) - : DOMObject(exec->lexicalInterpreter()->builtinObjectPrototype()) -{ -} +DEFINE_CONSTANT_TABLE(DOMExceptionProto) +IMPLEMENT_CONSTANT_TABLE(DOMExceptionProto, "DOMException") -bool DOMExceptionConstructor::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot) -{ - return getStaticValueSlot(exec, &DOMExceptionConstructorTable, this, propertyName, slot); -} +IMPLEMENT_PSEUDO_CONSTRUCTOR_WITH_PARENT(DOMExceptionPseudoCtor, + "DOMException", + DOMExceptionProto, DOMExceptionProto) -JSValue* DOMExceptionConstructor::getValueProperty(ExecState *, int token) const +JSDOMException::JSDOMException(ExecState* exec) + : DOMObject(DOMExceptionProto::self(exec)) { - // We use the token as the value to return directly - return jsNumber((unsigned int)token); -#if 0 - switch (token) { - case INDEX_SIZE_ERR: - return jsNumber((unsigned int)DOM::DOMException::INDEX_SIZE_ERR); - case DOMSTRING_SIZE_ERR: - return jsNumber((unsigned int)DOM::DOMException::DOMSTRING_SIZE_ERR); - case HIERARCHY_REQUEST_ERR: - return jsNumber((unsigned int)DOM::DOMException::HIERARCHY_REQUEST_ERR); - case WRONG_DOCUMENT_ERR: - return jsNumber((unsigned int)DOM::DOMException::WRONG_DOCUMENT_ERR); - case INVALID_CHARACTER_ERR: - return jsNumber((unsigned int)DOM::DOMException::INVALID_CHARACTER_ERR); - case NO_DATA_ALLOWED_ERR: - return jsNumber((unsigned int)DOM::DOMException::NO_DATA_ALLOWED_ERR); - case NO_MODIFICATION_ALLOWED_ERR: - return jsNumber((unsigned int)DOM::DOMException::NO_MODIFICATION_ALLOWED_ERR); - case NOT_FOUND_ERR: - return jsNumber((unsigned int)DOM::DOMException::NOT_FOUND_ERR); - case NOT_SUPPORTED_ERR: - return jsNumber((unsigned int)DOM::DOMException::NOT_SUPPORTED_ERR); - case INUSE_ATTRIBUTE_ERR: - return jsNumber((unsigned int)DOM::DOMException::INUSE_ATTRIBUTE_ERR); - case INVALID_STATE_ERR: - return jsNumber((unsigned int)DOM::DOMException::INVALID_STATE_ERR); - case SYNTAX_ERR: - return jsNumber((unsigned int)DOM::DOMException::SYNTAX_ERR); - case INVALID_MODIFICATION_ERR: - return jsNumber((unsigned int)DOM::DOMException::INVALID_MODIFICATION_ERR); - case NAMESPACE_ERR: - return jsNumber((unsigned int)DOM::DOMException::NAMESPACE_ERR); - case INVALID_ACCESS_ERR: - return jsNumber((unsigned int)DOM::DOMException::INVALID_ACCESS_ERR); - default: - kDebug(6070) << "WARNING: DOMExceptionConstructor::getValueProperty unhandled token " << token; - return jsNull(); - } -#endif } +const ClassInfo JSDOMException::info = { "DOMException", 0, 0, 0 }; + JSObject *KJS::getDOMExceptionConstructor(ExecState *exec) { - return cacheGlobalObject(exec, "[[DOMException.constructor]]"); + return DOMExceptionPseudoCtor::self(exec); } // ------------------------------------------------------------------------- --- branches/KDE/4.0/kdelibs/khtml/ecma/kjs_dom.h #762889:762890 @@ -261,13 +261,11 @@ enum { PublicId, SystemId, NotationName }; }; - // Constructor for DOMException - constructor stuff not implemented yet - class DOMExceptionConstructor : public DOMObject { + DEFINE_PSEUDO_CONSTRUCTOR(DOMExceptionPseudoCtor); + + class JSDOMException : public DOMObject { public: - DOMExceptionConstructor(ExecState *); - virtual bool getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot); - JSValue* getValueProperty(ExecState *exec, int token) const; - // no put - all read-only + JSDOMException(ExecState* exec); virtual const ClassInfo* classInfo() const { return &info; } static const ClassInfo info; };