| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| 11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
| 12 * | 12 * |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND | 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND |
| 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR | 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR |
| 17 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 17 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| 19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| 20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 21 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 21 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 #include "bindings/core/v8/V8ThrowException.h" | 25 #include "bindings/core/v8/V8ThrowException.h" |
| 26 | 26 |
| 27 #include "bindings/core/v8/BindingSecurity.h" | |
| 28 #include "bindings/core/v8/V8Binding.h" | 27 #include "bindings/core/v8/V8Binding.h" |
| 29 #include "bindings/core/v8/V8DOMException.h" | |
| 30 #include "bindings/core/v8/V8PrivateProperty.h" | |
| 31 #include "core/dom/DOMException.h" | |
| 32 #include "core/dom/ExceptionCode.h" | |
| 33 | 28 |
| 34 namespace blink { | 29 namespace blink { |
| 35 | 30 |
| 36 namespace { | |
| 37 | |
| 38 void DomExceptionStackGetter(v8::Local<v8::Name> name, | |
| 39 const v8::PropertyCallbackInfo<v8::Value>& info) { | |
| 40 v8::Isolate* isolate = info.GetIsolate(); | |
| 41 v8::Local<v8::Value> value; | |
| 42 if (info.Data() | |
| 43 .As<v8::Object>() | |
| 44 ->Get(isolate->GetCurrentContext(), V8AtomicString(isolate, "stack")) | |
| 45 .ToLocal(&value)) | |
| 46 V8SetReturnValue(info, value); | |
| 47 } | |
| 48 | |
| 49 void DomExceptionStackSetter(v8::Local<v8::Name> name, | |
| 50 v8::Local<v8::Value> value, | |
| 51 const v8::PropertyCallbackInfo<void>& info) { | |
| 52 v8::Maybe<bool> unused = info.Data().As<v8::Object>()->Set( | |
| 53 info.GetIsolate()->GetCurrentContext(), | |
| 54 V8AtomicString(info.GetIsolate(), "stack"), value); | |
| 55 ALLOW_UNUSED_LOCAL(unused); | |
| 56 } | |
| 57 | |
| 58 } // namespace | |
| 59 | |
| 60 v8::Local<v8::Value> V8ThrowException::CreateDOMException( | |
| 61 v8::Isolate* isolate, | |
| 62 ExceptionCode exception_code, | |
| 63 const String& sanitized_message, | |
| 64 const String& unsanitized_message) { | |
| 65 DCHECK_GT(exception_code, 0); | |
| 66 DCHECK(exception_code == kSecurityError || unsanitized_message.IsNull()); | |
| 67 | |
| 68 if (isolate->IsExecutionTerminating()) | |
| 69 return v8::Local<v8::Value>(); | |
| 70 | |
| 71 switch (exception_code) { | |
| 72 case kV8Error: | |
| 73 return CreateError(isolate, sanitized_message); | |
| 74 case kV8TypeError: | |
| 75 return CreateTypeError(isolate, sanitized_message); | |
| 76 case kV8RangeError: | |
| 77 return CreateRangeError(isolate, sanitized_message); | |
| 78 case kV8SyntaxError: | |
| 79 return CreateSyntaxError(isolate, sanitized_message); | |
| 80 case kV8ReferenceError: | |
| 81 return CreateReferenceError(isolate, sanitized_message); | |
| 82 } | |
| 83 | |
| 84 DOMException* dom_exception = DOMException::Create( | |
| 85 exception_code, sanitized_message, unsanitized_message); | |
| 86 v8::Local<v8::Object> exception_obj = | |
| 87 ToV8(dom_exception, isolate->GetCurrentContext()->Global(), isolate) | |
| 88 .As<v8::Object>(); | |
| 89 // Attach an Error object to the DOMException. This is then lazily used to | |
| 90 // get the stack value. | |
| 91 v8::Local<v8::Value> error = | |
| 92 v8::Exception::Error(V8String(isolate, dom_exception->message())); | |
| 93 exception_obj | |
| 94 ->SetAccessor(isolate->GetCurrentContext(), | |
| 95 V8AtomicString(isolate, "stack"), DomExceptionStackGetter, | |
| 96 DomExceptionStackSetter, error) | |
| 97 .ToChecked(); | |
| 98 | |
| 99 auto private_error = V8PrivateProperty::GetDOMExceptionError(isolate); | |
| 100 private_error.Set(exception_obj, error); | |
| 101 | |
| 102 return exception_obj; | |
| 103 } | |
| 104 | |
| 105 #define DEFINE_CREATE_AND_THROW_ERROR_FUNC(blinkErrorType, v8ErrorType, \ | 31 #define DEFINE_CREATE_AND_THROW_ERROR_FUNC(blinkErrorType, v8ErrorType, \ |
| 106 defaultMessage) \ | 32 defaultMessage) \ |
| 107 v8::Local<v8::Value> V8ThrowException::Create##blinkErrorType( \ | 33 v8::Local<v8::Value> V8ThrowException::Create##blinkErrorType( \ |
| 108 v8::Isolate* isolate, const String& message) { \ | 34 v8::Isolate* isolate, const String& message) { \ |
| 109 return v8::Exception::v8ErrorType( \ | 35 return v8::Exception::v8ErrorType( \ |
| 110 V8String(isolate, message.IsNull() ? defaultMessage : message)); \ | 36 V8String(isolate, message.IsNull() ? defaultMessage : message)); \ |
| 111 } \ | 37 } \ |
| 112 \ | 38 \ |
| 113 void V8ThrowException::Throw##blinkErrorType(v8::Isolate* isolate, \ | 39 void V8ThrowException::Throw##blinkErrorType(v8::Isolate* isolate, \ |
| 114 const String& message) { \ | 40 const String& message) { \ |
| 115 ThrowException(isolate, Create##blinkErrorType(isolate, message)); \ | 41 ThrowException(isolate, Create##blinkErrorType(isolate, message)); \ |
| 116 } | 42 } |
| 117 | 43 |
| 118 DEFINE_CREATE_AND_THROW_ERROR_FUNC(Error, Error, "Error") | 44 DEFINE_CREATE_AND_THROW_ERROR_FUNC(Error, Error, "Error") |
| 119 DEFINE_CREATE_AND_THROW_ERROR_FUNC(RangeError, RangeError, "Range error") | 45 DEFINE_CREATE_AND_THROW_ERROR_FUNC(RangeError, RangeError, "Range error") |
| 120 DEFINE_CREATE_AND_THROW_ERROR_FUNC(ReferenceError, | 46 DEFINE_CREATE_AND_THROW_ERROR_FUNC(ReferenceError, |
| 121 ReferenceError, | 47 ReferenceError, |
| 122 "Reference error") | 48 "Reference error") |
| 123 DEFINE_CREATE_AND_THROW_ERROR_FUNC(SyntaxError, SyntaxError, "Syntax error") | 49 DEFINE_CREATE_AND_THROW_ERROR_FUNC(SyntaxError, SyntaxError, "Syntax error") |
| 124 DEFINE_CREATE_AND_THROW_ERROR_FUNC(TypeError, TypeError, "Type error") | 50 DEFINE_CREATE_AND_THROW_ERROR_FUNC(TypeError, TypeError, "Type error") |
| 125 | 51 |
| 126 #undef DEFINE_CREATE_AND_THROW_ERROR_FUNC | 52 #undef DEFINE_CREATE_AND_THROW_ERROR_FUNC |
| 127 | 53 |
| 128 } // namespace blink | 54 } // namespace blink |
| OLD | NEW |