diff options
Diffstat (limited to 'Source/WebCore/page/DOMWindowProperty.cpp')
-rw-r--r-- | Source/WebCore/page/DOMWindowProperty.cpp | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/Source/WebCore/page/DOMWindowProperty.cpp b/Source/WebCore/page/DOMWindowProperty.cpp index 31ea44e7d..f4f32c29e 100644 --- a/Source/WebCore/page/DOMWindowProperty.cpp +++ b/Source/WebCore/page/DOMWindowProperty.cpp @@ -33,6 +33,7 @@ namespace WebCore { DOMWindowProperty::DOMWindowProperty(Frame* frame) : m_frame(frame) + , m_disconnectedDOMWindow(0) { if (m_frame) m_frame->domWindow()->registerProperty(this); @@ -40,25 +41,53 @@ DOMWindowProperty::DOMWindowProperty(Frame* frame) DOMWindowProperty::~DOMWindowProperty() { - if (m_frame) + if (m_frame) { + ASSERT(!m_disconnectedDOMWindow); m_frame->domWindow()->unregisterProperty(this); + } else if (m_disconnectedDOMWindow) + m_disconnectedDOMWindow->unregisterProperty(this); } -void DOMWindowProperty::disconnectFrame() +void DOMWindowProperty::disconnectFrameForPageCache() { + ASSERT(m_frame); + ASSERT(!m_disconnectedDOMWindow); + m_disconnectedDOMWindow = m_frame->domWindow(); m_frame = 0; } -void DOMWindowProperty::reconnectFrame(Frame* frame) +void DOMWindowProperty::reconnectFrameFromPageCache(Frame* frame) { ASSERT(frame); ASSERT(!m_frame); + ASSERT(m_disconnectedDOMWindow); m_frame = frame; + m_disconnectedDOMWindow = 0; +} + +void DOMWindowProperty::willDestroyGlobalObjectInCachedFrame() +{ + ASSERT(m_disconnectedDOMWindow); + // DOMWindowProperty lifetime isn't tied directly to the DOMWindow itself so it is important + // that it unregister itself from any DOMWindow it is associated with. + m_disconnectedDOMWindow->unregisterProperty(this); + m_disconnectedDOMWindow = 0; +} + +void DOMWindowProperty::willDestroyGlobalObjectInFrame() +{ + ASSERT(m_frame); + ASSERT(!m_disconnectedDOMWindow); + // DOMWindowProperty lifetime isn't tied directly to the DOMWindow itself so it is important that it unregister + // itself from any DOMWindow it is associated with. + m_frame->domWindow()->unregisterProperty(this); + m_frame = 0; } -void DOMWindowProperty::willDetachPage() +void DOMWindowProperty::willDetachGlobalObjectFromFrame() { - // Subclasses should override this function to handle this notification. + ASSERT(m_frame); + ASSERT(!m_disconnectedDOMWindow); } } |