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 |