summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/DOMWindowProperty.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/page/DOMWindowProperty.cpp')
-rw-r--r--Source/WebCore/page/DOMWindowProperty.cpp39
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);
}
}