Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/DOMWindow.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp |
| index 7e94256eeb1bf98fc362e9e48c664d7de2d55314..009c197fba9fa9f9422ffd52d3bf631b2d7d0780 100644 |
| --- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp |
| +++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp |
| @@ -4,6 +4,7 @@ |
| #include "core/frame/DOMWindow.h" |
| +#include "bindings/core/v8/WindowProxy.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/ExceptionCode.h" |
| #include "core/dom/ExecutionContext.h" |
| @@ -39,23 +40,34 @@ DOMWindow::DOMWindow(Frame& frame) : m_frame(frame), m_windowIsClosing(false) {} |
| DOMWindow::~DOMWindow() { |
| // The frame must be disconnected before finalization. |
| DCHECK(!m_frame); |
| + |
| + // Because the wrapper object of a DOMWindow is the global proxy object which |
| + // may live much longer than the DOMWindow, we need to dissociate all wrappers |
| + // for this instance. |
| + DOMWrapperWorld::dissociateWrappersInAllWorlds(this); |
| } |
| -v8::Local<v8::Object> DOMWindow::wrap(v8::Isolate*, |
| +v8::Local<v8::Object> DOMWindow::wrap(v8::Isolate* isolate, |
| v8::Local<v8::Object> creationContext) { |
| - LOG(FATAL) << "DOMWindow must never be wrapped with wrap method. The " |
| - "wrappers must be created at WindowProxy::createContext() and " |
| - "setupWindowPrototypeChain()."; |
| - return v8::Local<v8::Object>(); |
| + // Notice that we explicitly ignore |creationContext| because the DOMWindow |
| + // has its own creation context. |
| + |
| + Frame* frame = this->frame(); |
| + CHECK(frame); |
|
haraken
2017/02/09 12:46:40
Would you help me understand why frame is guarante
Yuki
2017/02/10 07:47:21
If WindowProxy::initialize() was already called, t
|
| + |
| + v8::Local<v8::Object> globalProxy = |
| + frame->windowProxy(DOMWrapperWorld::current(isolate)) |
| + ->globalIfNotDetached(); |
| + CHECK(!globalProxy.IsEmpty()); |
| + |
| + return globalProxy; |
| } |
| v8::Local<v8::Object> DOMWindow::associateWithWrapper( |
| v8::Isolate*, |
| const WrapperTypeInfo*, |
| v8::Local<v8::Object> wrapper) { |
| - LOG(FATAL) << "DOMWindow must never be wrapped with wrap method. The " |
| - "wrappers must be created at WindowProxy::createContext() and " |
| - "setupWindowPrototypeChain()."; |
| + NOTREACHED(); |
| return v8::Local<v8::Object>(); |
| } |