Index: Source/bindings/core/v8/V8DOMWrapper.h |
diff --git a/Source/bindings/core/v8/V8DOMWrapper.h b/Source/bindings/core/v8/V8DOMWrapper.h |
index 4effd0697a064eca0ee39364987b9d0f0c84f47a..169979317b4e3a67f5f7122b71bb5fb2cc6009de 100644 |
--- a/Source/bindings/core/v8/V8DOMWrapper.h |
+++ b/Source/bindings/core/v8/V8DOMWrapper.h |
@@ -113,18 +113,24 @@ public: |
V8WrapperInstantiationScope(v8::Local<v8::Object> creationContext, v8::Isolate* isolate, bool withSecurityCheck = true) |
: m_didEnterContext(false) |
, m_context(isolate->GetCurrentContext()) |
+ , m_tryCatch(isolate) |
+ , m_convertExceptions(false) |
{ |
// creationContext should not be empty. Because if we have an |
// empty creationContext, we will end up creating |
// a new object in the context currently entered. This is wrong. |
RELEASE_ASSERT(!creationContext.IsEmpty()); |
v8::Local<v8::Context> contextForWrapper = creationContext->CreationContext(); |
+ |
// For performance, we enter the context only if the currently running context |
// is different from the context that we are about to enter. |
if (contextForWrapper == m_context) |
return; |
- if (withSecurityCheck) |
+ if (withSecurityCheck) { |
securityCheck(isolate, contextForWrapper); |
+ } else { |
+ m_convertExceptions = true; |
+ } |
m_context = v8::Local<v8::Context>::New(isolate, contextForWrapper); |
m_didEnterContext = true; |
m_context->Enter(); |
@@ -132,18 +138,31 @@ public: |
~V8WrapperInstantiationScope() |
{ |
- if (!m_didEnterContext) |
+ if (!m_didEnterContext) { |
+ m_tryCatch.ReThrow(); |
return; |
+ } |
m_context->Exit(); |
+ // Rethrow any cross-context exceptions as security error. |
+ if (m_tryCatch.HasCaught()) { |
+ if (m_convertExceptions) { |
+ m_tryCatch.Reset(); |
+ convertException(); |
+ } |
+ m_tryCatch.ReThrow(); |
+ } |
} |
v8::Local<v8::Context> context() const { return m_context; } |
private: |
void securityCheck(v8::Isolate*, v8::Local<v8::Context> contextForWrapper); |
+ void convertException(); |
bool m_didEnterContext; |
v8::Local<v8::Context> m_context; |
+ v8::TryCatch m_tryCatch; |
+ bool m_convertExceptions; |
}; |
} // namespace blink |