Index: third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp |
index 82db35ef03c2c8806b5f2b29d6e9fbcfb4d90c9d..ec69df95154641b5e71f59cf1f48fa6e24bd9d25 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp |
@@ -33,6 +33,7 @@ |
#include "bindings/core/v8/ConditionalFeatures.h" |
#include "bindings/core/v8/DOMWrapperWorld.h" |
#include "bindings/core/v8/ScriptController.h" |
+#include "bindings/core/v8/ToV8.h" |
#include "bindings/core/v8/V8Binding.h" |
#include "bindings/core/v8/V8DOMActivityLogger.h" |
#include "bindings/core/v8/V8Document.h" |
@@ -73,11 +74,6 @@ |
namespace blink { |
-static void checkDocumentWrapper(v8::Local<v8::Object> wrapper, |
- Document* document) { |
- ASSERT(V8Document::toImpl(wrapper) == document); |
-} |
- |
WindowProxy* WindowProxy::create(v8::Isolate* isolate, |
Frame* frame, |
DOMWrapperWorld& world) { |
@@ -417,33 +413,24 @@ bool WindowProxy::setupWindowPrototypeChain() { |
return true; |
} |
-void WindowProxy::updateDocumentWrapper(v8::Local<v8::Object> wrapper) { |
- ASSERT(m_world->isMainWorld()); |
- m_document.set(m_isolate, wrapper); |
-} |
- |
void WindowProxy::updateDocumentProperty() { |
- if (!m_world->isMainWorld()) |
- return; |
+ DCHECK(m_world->isMainWorld()); |
- if (m_frame->isRemoteFrame()) { |
+ if (m_frame->isRemoteFrame()) |
return; |
- } |
ScriptState::Scope scope(m_scriptState.get()); |
v8::Local<v8::Context> context = m_scriptState->context(); |
LocalFrame* frame = toLocalFrame(m_frame); |
+ // In the main world, the window.document attribute must be set right after |
+ // the initialization of the Window or right after the installation of a new |
+ // document, thus this must be the first time of the wrapper instantiation of |
+ // the document. |
+ CHECK(!frame->document()->containsWrapper()); |
v8::Local<v8::Value> documentWrapper = |
- toV8(frame->document(), context->Global(), context->GetIsolate()); |
- if (documentWrapper.IsEmpty()) |
- return; |
- ASSERT(documentWrapper == m_document.newLocal(m_isolate) || |
- m_document.isEmpty()); |
- if (m_document.isEmpty()) |
- updateDocumentWrapper(v8::Local<v8::Object>::Cast(documentWrapper)); |
- checkDocumentWrapper(m_document.newLocal(m_isolate), frame->document()); |
- |
- ASSERT(documentWrapper->IsObject()); |
+ toV8(frame->document(), context->Global(), m_isolate); |
+ DCHECK(documentWrapper->IsObject()); |
+ m_document.set(m_isolate, documentWrapper.As<v8::Object>()); |
// Update cached accessor. |
CHECK(V8PrivateProperty::getWindowDocumentCachedAccessor(m_isolate).set( |
@@ -511,7 +498,7 @@ void WindowProxy::setSecurityToken(SecurityOrigin* origin) { |
} |
void WindowProxy::updateDocument() { |
- ASSERT(m_world->isMainWorld()); |
+ DCHECK(m_world->isMainWorld()); |
if (!isGlobalInitialized()) |
return; |
if (!isContextInitialized()) |
@@ -568,24 +555,31 @@ static void getter(v8::Local<v8::Name> property, |
v8SetReturnValue(info, value); |
} |
+void WindowProxy::checkDocumentWrapper(v8::Local<v8::Object> wrapper, |
+ Document* document) const { |
+ DCHECK(!wrapper.IsEmpty()); |
+ DCHECK_EQ(V8Document::toImpl(wrapper), document); |
+ DCHECK(wrapper == |
+ toV8(document, m_globalProxy.newLocal(m_isolate), m_isolate)); |
+} |
+ |
void WindowProxy::namedItemAdded(HTMLDocument* document, |
const AtomicString& name) { |
- ASSERT(m_world->isMainWorld()); |
+ DCHECK(m_world->isMainWorld()); |
if (!isContextInitialized() || !m_scriptState->contextIsValid()) |
return; |
ScriptState::Scope scope(m_scriptState.get()); |
- ASSERT(!m_document.isEmpty()); |
- v8::Local<v8::Context> context = m_scriptState->context(); |
- v8::Local<v8::Object> documentHandle = m_document.newLocal(m_isolate); |
- checkDocumentWrapper(documentHandle, document); |
- documentHandle->SetAccessor(context, v8String(m_isolate, name), getter); |
+ v8::Local<v8::Object> documentWrapper = m_document.newLocal(m_isolate); |
+ checkDocumentWrapper(documentWrapper, document); |
+ documentWrapper->SetAccessor(m_isolate->GetCurrentContext(), |
+ v8String(m_isolate, name), getter); |
} |
void WindowProxy::namedItemRemoved(HTMLDocument* document, |
const AtomicString& name) { |
- ASSERT(m_world->isMainWorld()); |
+ DCHECK(m_world->isMainWorld()); |
if (!isContextInitialized()) |
return; |
@@ -594,11 +588,10 @@ void WindowProxy::namedItemRemoved(HTMLDocument* document, |
return; |
ScriptState::Scope scope(m_scriptState.get()); |
- ASSERT(!m_document.isEmpty()); |
- v8::Local<v8::Object> documentHandle = m_document.newLocal(m_isolate); |
- checkDocumentWrapper(documentHandle, document); |
- documentHandle->Delete(m_isolate->GetCurrentContext(), |
- v8String(m_isolate, name)); |
+ v8::Local<v8::Object> documentWrapper = m_document.newLocal(m_isolate); |
+ checkDocumentWrapper(documentWrapper, document); |
+ documentWrapper->Delete(m_isolate->GetCurrentContext(), |
+ v8String(m_isolate, name)); |
} |
void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) { |