| Index: third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
|
| index 139ed88755d5dc6b65b9f7e211821b49bc008987..ffc74338b177c609af1edeca0600708422afbcb8 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
|
| @@ -66,7 +66,7 @@
|
| namespace blink {
|
|
|
| void LocalWindowProxy::disposeContext(GlobalDetachmentBehavior behavior) {
|
| - if (m_lifecycle != Lifecycle::ContextInitialized)
|
| + if (m_lifecycle != Lifecycle::ContextIsInitialized)
|
| return;
|
|
|
| ScriptState::Scope scope(m_scriptState.get());
|
| @@ -104,8 +104,9 @@ void LocalWindowProxy::disposeContext(GlobalDetachmentBehavior behavior) {
|
| V8GCForContextDispose::instance().notifyContextDisposed(
|
| frame()->isMainFrame());
|
|
|
| - DCHECK(m_lifecycle == Lifecycle::ContextInitialized);
|
| - m_lifecycle = Lifecycle::ContextDetached;
|
| + DCHECK_EQ(m_lifecycle, Lifecycle::ContextIsInitialized);
|
| + m_lifecycle = behavior == DetachGlobal ? Lifecycle::GlobalObjectIsDetached
|
| + : Lifecycle::FrameIsDetached;
|
| }
|
|
|
| void LocalWindowProxy::initialize() {
|
| @@ -196,10 +197,9 @@ void LocalWindowProxy::createContext() {
|
|
|
| m_scriptState = ScriptState::create(context, m_world);
|
|
|
| - // TODO(haraken): Currently we cannot enable the following DCHECK because
|
| - // an already detached window proxy can be re-initialized. This is wrong.
|
| - // DCHECK(m_lifecycle == Lifecycle::ContextUninitialized);
|
| - m_lifecycle = Lifecycle::ContextInitialized;
|
| + DCHECK(m_lifecycle == Lifecycle::ContextIsUninitialized ||
|
| + m_lifecycle == Lifecycle::GlobalObjectIsDetached);
|
| + m_lifecycle = Lifecycle::ContextIsInitialized;
|
| DCHECK(m_scriptState->contextIsValid());
|
| }
|
|
|
| @@ -315,15 +315,14 @@ void LocalWindowProxy::updateDocument() {
|
| DCHECK(m_world->isMainWorld());
|
| // For an uninitialized main window proxy, there's nothing we need
|
| // to update. The update is done when the window proxy gets initialized later.
|
| - if (m_lifecycle == Lifecycle::ContextUninitialized)
|
| + if (m_lifecycle == Lifecycle::ContextIsUninitialized)
|
| return;
|
|
|
| - // If this WindowProxy was previously initialized, reinitialize it now to
|
| - // preserve JS object identity. Otherwise, extant references to the
|
| - // WindowProxy will be broken.
|
| - if (m_lifecycle == Lifecycle::ContextDetached) {
|
| + // For a navigated-away window proxy, reinitialize it as a new window with new
|
| + // context and document.
|
| + if (m_lifecycle == Lifecycle::GlobalObjectIsDetached) {
|
| initialize();
|
| - DCHECK_EQ(Lifecycle::ContextInitialized, m_lifecycle);
|
| + DCHECK_EQ(Lifecycle::ContextIsInitialized, m_lifecycle);
|
| // Initialization internally updates the document properties, so just
|
| // return afterwards.
|
| return;
|
| @@ -389,19 +388,18 @@ void LocalWindowProxy::namedItemAdded(HTMLDocument* document,
|
| const AtomicString& name) {
|
| DCHECK(m_world->isMainWorld());
|
|
|
| - // Context must be initialized before this point.
|
| - DCHECK(m_lifecycle >= Lifecycle::ContextInitialized);
|
| - // TODO(yukishiino): Is it okay to not update named properties
|
| - // after the context gets detached?
|
| - if (m_lifecycle == Lifecycle::ContextDetached)
|
| + // Currently only contexts in attached frames can change the named items.
|
| + // TODO(yukishiino): Support detached frame's case, too, since the spec is not
|
| + // saying that the document needs to be attached to the DOM.
|
| + // https://html.spec.whatwg.org/C/dom.html#dom-document-nameditem
|
| + DCHECK(m_lifecycle == Lifecycle::ContextIsInitialized);
|
| + // TODO(yukishiino): Remove the following if-clause due to the above DCHECK.
|
| + if (m_lifecycle != Lifecycle::ContextIsInitialized)
|
| return;
|
|
|
| ScriptState::Scope scope(m_scriptState.get());
|
| v8::Local<v8::Object> documentWrapper =
|
| m_world->domDataStore().get(document, isolate());
|
| - // TODO(yukishiino,peria): We should check if the own property with the same
|
| - // name already exists or not, and if it exists, we shouldn't define a new
|
| - // accessor property (it fails).
|
| documentWrapper->SetAccessor(isolate()->GetCurrentContext(),
|
| v8String(isolate(), name), getter).ToChecked();
|
| }
|
| @@ -410,11 +408,13 @@ void LocalWindowProxy::namedItemRemoved(HTMLDocument* document,
|
| const AtomicString& name) {
|
| DCHECK(m_world->isMainWorld());
|
|
|
| - // Context must be initialized before this point.
|
| - DCHECK(m_lifecycle >= Lifecycle::ContextInitialized);
|
| - // TODO(yukishiino): Is it okay to not update named properties
|
| - // after the context gets detached?
|
| - if (m_lifecycle == Lifecycle::ContextDetached)
|
| + // Currently only contexts in attached frames can change the named items.
|
| + // TODO(yukishiino): Support detached frame's case, too, since the spec is not
|
| + // saying that the document needs to be attached to the DOM.
|
| + // https://html.spec.whatwg.org/C/dom.html#dom-document-nameditem
|
| + DCHECK(m_lifecycle == Lifecycle::ContextIsInitialized);
|
| + // TODO(yukishiino): Remove the following if-clause due to the above DCHECK.
|
| + if (m_lifecycle != Lifecycle::ContextIsInitialized)
|
| return;
|
|
|
| if (document->hasNamedItem(name) || document->hasExtraNamedItem(name))
|
| @@ -428,13 +428,10 @@ void LocalWindowProxy::namedItemRemoved(HTMLDocument* document,
|
| }
|
|
|
| void LocalWindowProxy::updateSecurityOrigin(SecurityOrigin* origin) {
|
| - // For an uninitialized main window proxy, there's nothing we need
|
| - // to update. The update is done when the window proxy gets initialized later.
|
| - if (m_lifecycle == Lifecycle::ContextUninitialized)
|
| - return;
|
| - // TODO(yukishiino): Is it okay to not update security origin when the context
|
| - // is detached?
|
| - if (m_lifecycle == Lifecycle::ContextDetached)
|
| + // For an uninitialized window proxy, there's nothing we need to update. The
|
| + // update is done when the window proxy gets initialized later.
|
| + if (m_lifecycle == Lifecycle::ContextIsUninitialized ||
|
| + m_lifecycle == Lifecycle::GlobalObjectIsDetached)
|
| return;
|
|
|
| setSecurityToken(origin);
|
|
|