This source file includes following definitions.
- domExceptionStackGetter
- domExceptionStackSetter
- createDOMException
- throwDOMException
- createError
- throwError
- createTypeError
- throwTypeError
- throwError
#include "config.h"
#include "bindings/v8/V8ThrowException.h"
#include "V8DOMException.h"
#include "bindings/v8/V8Binding.h"
#include "core/dom/DOMException.h"
#include "core/dom/ExceptionCode.h"
namespace WebCore {
static void domExceptionStackGetter(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)
{
ASSERT(info.Data()->IsObject());
v8SetReturnValue(info, info.Data()->ToObject()->Get(v8AtomicString(info.GetIsolate(), "stack")));
}
static void domExceptionStackSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info)
{
ASSERT(info.Data()->IsObject());
info.Data()->ToObject()->Set(v8AtomicString(info.GetIsolate(), "stack"), value);
}
v8::Handle<v8::Value> V8ThrowException::createDOMException(int ec, const String& sanitizedMessage, const String& unsanitizedMessage, const v8::Handle<v8::Object>& creationContext, v8::Isolate* isolate)
{
if (ec <= 0 || v8::V8::IsExecutionTerminating())
return v8Undefined();
ASSERT(ec == SecurityError || unsanitizedMessage.isEmpty());
if (ec == TypeError)
return V8ThrowException::createTypeError(sanitizedMessage, isolate);
RefPtr<DOMException> domException = DOMException::create(ec, sanitizedMessage, unsanitizedMessage);
v8::Handle<v8::Value> exception = toV8(domException, creationContext, isolate);
if (exception.IsEmpty())
return v8Undefined();
v8::Handle<v8::Value> error = v8::Exception::Error(v8String(isolate, domException->message()));
ASSERT(!error.IsEmpty());
ASSERT(exception->IsObject());
exception->ToObject()->SetAccessor(v8AtomicString(isolate, "stack"), domExceptionStackGetter, domExceptionStackSetter, error);
return exception;
}
v8::Handle<v8::Value> V8ThrowException::throwDOMException(int ec, const String& sanitizedMessage, const String& unsanitizedMessage, const v8::Handle<v8::Object>& creationContext, v8::Isolate* isolate)
{
ASSERT(ec == SecurityError || unsanitizedMessage.isEmpty());
v8::Handle<v8::Value> exception = createDOMException(ec, sanitizedMessage, unsanitizedMessage, creationContext, isolate);
if (exception.IsEmpty())
return v8Undefined();
return V8ThrowException::throwError(exception, isolate);
}
v8::Handle<v8::Value> V8ThrowException::createError(V8ErrorType type, const String& message, v8::Isolate* isolate)
{
switch (type) {
case v8RangeError:
return v8::Exception::RangeError(v8String(isolate, message));
case v8ReferenceError:
return v8::Exception::ReferenceError(v8String(isolate, message));
case v8SyntaxError:
return v8::Exception::SyntaxError(v8String(isolate, message));
case v8TypeError:
return v8::Exception::TypeError(v8String(isolate, message));
case v8GeneralError:
return v8::Exception::Error(v8String(isolate, message));
default:
ASSERT_NOT_REACHED();
return v8Undefined();
}
}
v8::Handle<v8::Value> V8ThrowException::throwError(V8ErrorType type, const String& message, v8::Isolate* isolate)
{
v8::Handle<v8::Value> exception = V8ThrowException::createError(type, message, isolate);
if (exception.IsEmpty())
return v8Undefined();
return V8ThrowException::throwError(exception, isolate);
}
v8::Handle<v8::Value> V8ThrowException::createTypeError(const String& message, v8::Isolate* isolate)
{
return v8::Exception::TypeError(v8String(isolate, message.isNull() ? "Type error" : message));
}
v8::Handle<v8::Value> V8ThrowException::throwTypeError(const String& message, v8::Isolate* isolate)
{
v8::Handle<v8::Value> exception = V8ThrowException::createTypeError(message, isolate);
return V8ThrowException::throwError(exception, isolate);
}
v8::Handle<v8::Value> V8ThrowException::throwError(v8::Handle<v8::Value> exception, v8::Isolate* isolate)
{
if (!v8::V8::IsExecutionTerminating())
isolate->ThrowException(exception);
return v8::Undefined(isolate);
}
}