| 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 | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 39     v8::Local<v8::Value> value; | 39     v8::Local<v8::Value> value; | 
| 40     if (info.Data().As<v8::Object>()->Get(isolate->GetCurrentContext(), v8Atomic
     String(isolate, "stack")).ToLocal(&value)) | 40     if (info.Data().As<v8::Object>()->Get(isolate->GetCurrentContext(), v8Atomic
     String(isolate, "stack")).ToLocal(&value)) | 
| 41         v8SetReturnValue(info, value); | 41         v8SetReturnValue(info, value); | 
| 42 } | 42 } | 
| 43 | 43 | 
| 44 static void domExceptionStackSetter(v8::Local<v8::Name> name, v8::Local<v8::Valu
     e> value, const v8::PropertyCallbackInfo<void>& info) | 44 static void domExceptionStackSetter(v8::Local<v8::Name> name, v8::Local<v8::Valu
     e> value, const v8::PropertyCallbackInfo<void>& info) | 
| 45 { | 45 { | 
| 46     info.Data().As<v8::Object>()->Set(v8AtomicString(info.GetIsolate(), "stack")
     , value); | 46     info.Data().As<v8::Object>()->Set(v8AtomicString(info.GetIsolate(), "stack")
     , value); | 
| 47 } | 47 } | 
| 48 | 48 | 
| 49 v8::Handle<v8::Value> V8ThrowException::createDOMException(v8::Isolate* isolate,
      int ec, const String& sanitizedMessage, const String& unsanitizedMessage, const
      v8::Handle<v8::Object>& creationContext) | 49 v8::Local<v8::Value> V8ThrowException::createDOMException(v8::Isolate* isolate, 
     int ec, const String& sanitizedMessage, const String& unsanitizedMessage, const 
     v8::Local<v8::Object>& creationContext) | 
| 50 { | 50 { | 
| 51     if (ec <= 0 || v8::V8::IsExecutionTerminating()) | 51     if (ec <= 0 || v8::V8::IsExecutionTerminating()) | 
| 52         return v8Undefined(); | 52         return v8Undefined(); | 
| 53 | 53 | 
| 54     ASSERT(ec == SecurityError || unsanitizedMessage.isEmpty()); | 54     ASSERT(ec == SecurityError || unsanitizedMessage.isEmpty()); | 
| 55 | 55 | 
| 56     if (ec == V8GeneralError) | 56     if (ec == V8GeneralError) | 
| 57         return V8ThrowException::createGeneralError(isolate, sanitizedMessage); | 57         return V8ThrowException::createGeneralError(isolate, sanitizedMessage); | 
| 58     if (ec == V8TypeError) | 58     if (ec == V8TypeError) | 
| 59         return V8ThrowException::createTypeError(isolate, sanitizedMessage); | 59         return V8ThrowException::createTypeError(isolate, sanitizedMessage); | 
| 60     if (ec == V8RangeError) | 60     if (ec == V8RangeError) | 
| 61         return V8ThrowException::createRangeError(isolate, sanitizedMessage); | 61         return V8ThrowException::createRangeError(isolate, sanitizedMessage); | 
| 62     if (ec == V8SyntaxError) | 62     if (ec == V8SyntaxError) | 
| 63         return V8ThrowException::createSyntaxError(isolate, sanitizedMessage); | 63         return V8ThrowException::createSyntaxError(isolate, sanitizedMessage); | 
| 64     if (ec == V8ReferenceError) | 64     if (ec == V8ReferenceError) | 
| 65         return V8ThrowException::createReferenceError(isolate, sanitizedMessage)
     ; | 65         return V8ThrowException::createReferenceError(isolate, sanitizedMessage)
     ; | 
| 66 | 66 | 
| 67     v8::Handle<v8::Object> sanitizedCreationContext = creationContext; | 67     v8::Local<v8::Object> sanitizedCreationContext = creationContext; | 
| 68 | 68 | 
| 69     // FIXME: Is the current context always the right choice? | 69     // FIXME: Is the current context always the right choice? | 
| 70     Frame* frame = toFrameIfNotDetached(creationContext->CreationContext()); | 70     Frame* frame = toFrameIfNotDetached(creationContext->CreationContext()); | 
| 71     if (!frame || !BindingSecurity::shouldAllowAccessToFrame(isolate, frame, DoN
     otReportSecurityError)) | 71     if (!frame || !BindingSecurity::shouldAllowAccessToFrame(isolate, frame, DoN
     otReportSecurityError)) | 
| 72         sanitizedCreationContext = isolate->GetCurrentContext()->Global(); | 72         sanitizedCreationContext = isolate->GetCurrentContext()->Global(); | 
| 73 | 73 | 
| 74     v8::TryCatch tryCatch; | 74     v8::TryCatch tryCatch; | 
| 75 | 75 | 
| 76     DOMException* domException = DOMException::create(ec, sanitizedMessage, unsa
     nitizedMessage); | 76     DOMException* domException = DOMException::create(ec, sanitizedMessage, unsa
     nitizedMessage); | 
| 77     v8::Local<v8::Value> exception = toV8(domException, sanitizedCreationContext
     , isolate); | 77     v8::Local<v8::Value> exception = toV8(domException, sanitizedCreationContext
     , isolate); | 
| 78 | 78 | 
| 79     if (tryCatch.HasCaught()) { | 79     if (tryCatch.HasCaught()) { | 
| 80         ASSERT(exception.IsEmpty()); | 80         ASSERT(exception.IsEmpty()); | 
| 81         return tryCatch.Exception(); | 81         return tryCatch.Exception(); | 
| 82     } | 82     } | 
| 83     ASSERT(!exception.IsEmpty()); | 83     ASSERT(!exception.IsEmpty()); | 
| 84 | 84 | 
| 85     // Attach an Error object to the DOMException. This is then lazily used to g
     et the stack value. | 85     // Attach an Error object to the DOMException. This is then lazily used to g
     et the stack value. | 
| 86     v8::Local<v8::Value> error = v8::Exception::Error(v8String(isolate, domExcep
     tion->message())); | 86     v8::Local<v8::Value> error = v8::Exception::Error(v8String(isolate, domExcep
     tion->message())); | 
| 87     ASSERT(!error.IsEmpty()); | 87     ASSERT(!error.IsEmpty()); | 
| 88     v8::Local<v8::Object> exceptionObject = exception.As<v8::Object>(); | 88     v8::Local<v8::Object> exceptionObject = exception.As<v8::Object>(); | 
| 89     v8::Maybe<bool> result = exceptionObject->SetAccessor(isolate->GetCurrentCon
     text(), v8AtomicString(isolate, "stack"), domExceptionStackGetter, domExceptionS
     tackSetter, v8::MaybeLocal<v8::Value>(error)); | 89     v8::Maybe<bool> result = exceptionObject->SetAccessor(isolate->GetCurrentCon
     text(), v8AtomicString(isolate, "stack"), domExceptionStackGetter, domExceptionS
     tackSetter, v8::MaybeLocal<v8::Value>(error)); | 
| 90     ASSERT_UNUSED(result, result.FromJust()); | 90     ASSERT_UNUSED(result, result.FromJust()); | 
| 91     V8HiddenValue::setHiddenValue(isolate, exceptionObject, V8HiddenValue::error
     (isolate), error); | 91     V8HiddenValue::setHiddenValue(isolate, exceptionObject, V8HiddenValue::error
     (isolate), error); | 
| 92 | 92 | 
| 93     return exception; | 93     return exception; | 
| 94 } | 94 } | 
| 95 | 95 | 
| 96 v8::Handle<v8::Value> V8ThrowException::throwDOMException(int ec, const String& 
     sanitizedMessage, const String& unsanitizedMessage, const v8::Handle<v8::Object>
     & creationContext, v8::Isolate* isolate) | 96 v8::Local<v8::Value> V8ThrowException::throwDOMException(int ec, const String& s
     anitizedMessage, const String& unsanitizedMessage, const v8::Local<v8::Object>& 
     creationContext, v8::Isolate* isolate) | 
| 97 { | 97 { | 
| 98     ASSERT(ec == SecurityError || unsanitizedMessage.isEmpty()); | 98     ASSERT(ec == SecurityError || unsanitizedMessage.isEmpty()); | 
| 99     v8::Handle<v8::Value> exception = createDOMException(isolate, ec, sanitizedM
     essage, unsanitizedMessage, creationContext); | 99     v8::Local<v8::Value> exception = createDOMException(isolate, ec, sanitizedMe
     ssage, unsanitizedMessage, creationContext); | 
| 100     if (exception.IsEmpty()) | 100     if (exception.IsEmpty()) | 
| 101         return v8Undefined(); | 101         return v8Undefined(); | 
| 102 | 102 | 
| 103     return V8ThrowException::throwException(exception, isolate); | 103     return V8ThrowException::throwException(exception, isolate); | 
| 104 } | 104 } | 
| 105 | 105 | 
| 106 v8::Handle<v8::Value> V8ThrowException::createGeneralError(v8::Isolate* isolate,
      const String& message) | 106 v8::Local<v8::Value> V8ThrowException::createGeneralError(v8::Isolate* isolate, 
     const String& message) | 
| 107 { | 107 { | 
| 108     return v8::Exception::Error(v8String(isolate, message.isNull() ? "Error" : m
     essage)); | 108     return v8::Exception::Error(v8String(isolate, message.isNull() ? "Error" : m
     essage)); | 
| 109 } | 109 } | 
| 110 | 110 | 
| 111 v8::Handle<v8::Value> V8ThrowException::throwGeneralError(v8::Isolate* isolate, 
     const String& message) | 111 v8::Local<v8::Value> V8ThrowException::throwGeneralError(v8::Isolate* isolate, c
     onst String& message) | 
| 112 { | 112 { | 
| 113     v8::Handle<v8::Value> exception = V8ThrowException::createGeneralError(isola
     te, message); | 113     v8::Local<v8::Value> exception = V8ThrowException::createGeneralError(isolat
     e, message); | 
| 114     return V8ThrowException::throwException(exception, isolate); | 114     return V8ThrowException::throwException(exception, isolate); | 
| 115 } | 115 } | 
| 116 | 116 | 
| 117 v8::Handle<v8::Value> V8ThrowException::createTypeError(v8::Isolate* isolate, co
     nst String& message) | 117 v8::Local<v8::Value> V8ThrowException::createTypeError(v8::Isolate* isolate, con
     st String& message) | 
| 118 { | 118 { | 
| 119     return v8::Exception::TypeError(v8String(isolate, message.isNull() ? "Type e
     rror" : message)); | 119     return v8::Exception::TypeError(v8String(isolate, message.isNull() ? "Type e
     rror" : message)); | 
| 120 } | 120 } | 
| 121 | 121 | 
| 122 v8::Handle<v8::Value> V8ThrowException::throwTypeError(v8::Isolate* isolate, con
     st String& message) | 122 v8::Local<v8::Value> V8ThrowException::throwTypeError(v8::Isolate* isolate, cons
     t String& message) | 
| 123 { | 123 { | 
| 124     v8::Handle<v8::Value> exception = V8ThrowException::createTypeError(isolate,
      message); | 124     v8::Local<v8::Value> exception = V8ThrowException::createTypeError(isolate, 
     message); | 
| 125     return V8ThrowException::throwException(exception, isolate); | 125     return V8ThrowException::throwException(exception, isolate); | 
| 126 } | 126 } | 
| 127 | 127 | 
| 128 v8::Handle<v8::Value> V8ThrowException::createRangeError(v8::Isolate* isolate, c
     onst String& message) | 128 v8::Local<v8::Value> V8ThrowException::createRangeError(v8::Isolate* isolate, co
     nst String& message) | 
| 129 { | 129 { | 
| 130     return v8::Exception::RangeError(v8String(isolate, message.isNull() ? "Range
      error" : message)); | 130     return v8::Exception::RangeError(v8String(isolate, message.isNull() ? "Range
      error" : message)); | 
| 131 } | 131 } | 
| 132 | 132 | 
| 133 v8::Handle<v8::Value> V8ThrowException::throwRangeError(v8::Isolate* isolate, co
     nst String& message) | 133 v8::Local<v8::Value> V8ThrowException::throwRangeError(v8::Isolate* isolate, con
     st String& message) | 
| 134 { | 134 { | 
| 135     v8::Handle<v8::Value> exception = V8ThrowException::createRangeError(isolate
     , message); | 135     v8::Local<v8::Value> exception = V8ThrowException::createRangeError(isolate,
      message); | 
| 136     return V8ThrowException::throwException(exception, isolate); | 136     return V8ThrowException::throwException(exception, isolate); | 
| 137 } | 137 } | 
| 138 | 138 | 
| 139 v8::Handle<v8::Value> V8ThrowException::createSyntaxError(v8::Isolate* isolate, 
     const String& message) | 139 v8::Local<v8::Value> V8ThrowException::createSyntaxError(v8::Isolate* isolate, c
     onst String& message) | 
| 140 { | 140 { | 
| 141     return v8::Exception::SyntaxError(v8String(isolate, message.isNull() ? "Synt
     ax error" : message)); | 141     return v8::Exception::SyntaxError(v8String(isolate, message.isNull() ? "Synt
     ax error" : message)); | 
| 142 } | 142 } | 
| 143 | 143 | 
| 144 v8::Handle<v8::Value> V8ThrowException::throwSyntaxError(v8::Isolate* isolate, c
     onst String& message) | 144 v8::Local<v8::Value> V8ThrowException::throwSyntaxError(v8::Isolate* isolate, co
     nst String& message) | 
| 145 { | 145 { | 
| 146     v8::Handle<v8::Value> exception = V8ThrowException::createSyntaxError(isolat
     e, message); | 146     v8::Local<v8::Value> exception = V8ThrowException::createSyntaxError(isolate
     , message); | 
| 147     return V8ThrowException::throwException(exception, isolate); | 147     return V8ThrowException::throwException(exception, isolate); | 
| 148 } | 148 } | 
| 149 | 149 | 
| 150 v8::Handle<v8::Value> V8ThrowException::createReferenceError(v8::Isolate* isolat
     e, const String& message) | 150 v8::Local<v8::Value> V8ThrowException::createReferenceError(v8::Isolate* isolate
     , const String& message) | 
| 151 { | 151 { | 
| 152     return v8::Exception::ReferenceError(v8String(isolate, message.isNull() ? "R
     eference error" : message)); | 152     return v8::Exception::ReferenceError(v8String(isolate, message.isNull() ? "R
     eference error" : message)); | 
| 153 } | 153 } | 
| 154 | 154 | 
| 155 v8::Handle<v8::Value> V8ThrowException::throwReferenceError(v8::Isolate* isolate
     , const String& message) | 155 v8::Local<v8::Value> V8ThrowException::throwReferenceError(v8::Isolate* isolate,
      const String& message) | 
| 156 { | 156 { | 
| 157     v8::Handle<v8::Value> exception = V8ThrowException::createReferenceError(iso
     late, message); | 157     v8::Local<v8::Value> exception = V8ThrowException::createReferenceError(isol
     ate, message); | 
| 158     return V8ThrowException::throwException(exception, isolate); | 158     return V8ThrowException::throwException(exception, isolate); | 
| 159 } | 159 } | 
| 160 | 160 | 
| 161 v8::Handle<v8::Value> V8ThrowException::throwException(v8::Handle<v8::Value> exc
     eption, v8::Isolate* isolate) | 161 v8::Local<v8::Value> V8ThrowException::throwException(v8::Local<v8::Value> excep
     tion, v8::Isolate* isolate) | 
| 162 { | 162 { | 
| 163     if (!v8::V8::IsExecutionTerminating()) | 163     if (!v8::V8::IsExecutionTerminating()) | 
| 164         isolate->ThrowException(exception); | 164         isolate->ThrowException(exception); | 
| 165     return v8::Undefined(isolate); | 165     return v8::Undefined(isolate); | 
| 166 } | 166 } | 
| 167 | 167 | 
| 168 } // namespace blink | 168 } // namespace blink | 
| OLD | NEW | 
|---|