Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/V8DOMWrapper.h |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/V8DOMWrapper.h b/third_party/WebKit/Source/bindings/core/v8/V8DOMWrapper.h |
| index bc0ca27546ad2755bf250fb64e15a136b3ddf7e9..3837e11c34ed5d309aed14c0107439c537f15a3a 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/V8DOMWrapper.h |
| +++ b/third_party/WebKit/Source/bindings/core/v8/V8DOMWrapper.h |
| @@ -31,10 +31,10 @@ |
| #ifndef V8DOMWrapper_h |
| #define V8DOMWrapper_h |
| -#include "bindings/core/v8/BindingSecurity.h" |
| #include "bindings/core/v8/DOMDataStore.h" |
| #include "bindings/core/v8/ScriptWrappable.h" |
| #include "bindings/core/v8/V8Binding.h" |
| +#include "bindings/core/v8/WrapperCreationSecurityCheck.h" |
| #include "core/CoreExport.h" |
| #include "v8/include/v8.h" |
| #include "wtf/Compiler.h" |
| @@ -125,11 +125,12 @@ class V8WrapperInstantiationScope { |
| public: |
| V8WrapperInstantiationScope(v8::Local<v8::Object> creationContext, |
| v8::Isolate* isolate, |
| - bool withSecurityCheck) |
| + const WrapperTypeInfo* type) |
| : m_didEnterContext(false), |
| m_context(isolate->GetCurrentContext()), |
| m_tryCatch(isolate), |
| - m_convertExceptions(false) { |
| + m_type(type), |
| + m_accessCheckFailed(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. |
| @@ -141,12 +142,16 @@ class V8WrapperInstantiationScope { |
| // context is different from the context that we are about to enter. |
| if (contextForWrapper == m_context) |
| return; |
| - if (withSecurityCheck) { |
| - securityCheck(isolate, contextForWrapper); |
| - } else { |
| - m_convertExceptions = true; |
| + m_context = contextForWrapper; |
| + |
| + if (!WrapperCreationSecurityCheck::verifyContextAccess(isolate, m_context, |
| + m_type)) { |
| + DCHECK(m_tryCatch.HasCaught()); |
| + m_tryCatch.ReThrow(); |
| + m_accessCheckFailed = true; |
| + return; |
| } |
| - m_context = v8::Local<v8::Context>::New(isolate, contextForWrapper); |
| + |
| m_didEnterContext = true; |
| m_context->Enter(); |
| } |
| @@ -157,26 +162,27 @@ class V8WrapperInstantiationScope { |
| 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(); |
| - } |
| + |
| + if (!m_tryCatch.HasCaught()) |
| + return; |
| + |
| + v8::Isolate* isolate = m_context->GetIsolate(); |
|
haraken
2017/04/07 04:23:36
Would you add a comment on why we need this comple
adithyas
2017/04/07 18:42:53
Ok done.
|
| + v8::Local<v8::Value> caughtException = m_tryCatch.Exception(); |
| + m_tryCatch.Reset(); |
| + WrapperCreationSecurityCheck::rethrowCrossContextException( |
| + isolate, m_context, m_type, caughtException); |
| + m_tryCatch.ReThrow(); |
| } |
| v8::Local<v8::Context> context() const { return m_context; } |
| + bool accessCheckFailed() const { return m_accessCheckFailed; } |
| 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; |
| + const WrapperTypeInfo* m_type; |
| + bool m_accessCheckFailed; |
| }; |
| } // namespace blink |