1/*
2 * Copyright (C) 2011 Google, Inc. All Rights Reserved.
3 * Copyright (C) 2012 Apple Inc. All Rights Reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28#include "DOMWindowProperty.h"
29
30#include "DOMWindow.h"
31#include "Document.h"
32#include "Frame.h"
33
34namespace WebCore {
35
36DOMWindowProperty::DOMWindowProperty(Frame* frame)
37    : m_frame(frame)
38    , m_associatedDOMWindow(0)
39{
40    // FIXME: For now it *is* acceptable for a DOMWindowProperty to be created with a null frame.
41    // See fast/dom/navigator-detached-no-crash.html for the recipe.
42    // We should fix that.  <rdar://problem/11567132>
43    if (m_frame) {
44        m_associatedDOMWindow = m_frame->document()->domWindow();
45        m_associatedDOMWindow->registerProperty(this);
46    }
47}
48
49DOMWindowProperty::~DOMWindowProperty()
50{
51    if (m_associatedDOMWindow)
52        m_associatedDOMWindow->unregisterProperty(this);
53
54    m_associatedDOMWindow = 0;
55    m_frame = 0;
56}
57
58void DOMWindowProperty::disconnectFrameForPageCache()
59{
60    // If this property is being disconnected from its Frame to enter the PageCache, it must have
61    // been created with a Frame in the first place.
62    ASSERT(m_frame);
63    ASSERT(m_associatedDOMWindow);
64
65    m_frame = 0;
66}
67
68void DOMWindowProperty::reconnectFrameFromPageCache(Frame* frame)
69{
70    // If this property is being reconnected to its Frame to enter the PageCache, it must have
71    // been disconnected from its Frame in the first place and it should still have an associated DOMWindow.
72    ASSERT(frame);
73    ASSERT(!m_frame);
74    ASSERT(frame->document()->domWindow() == m_associatedDOMWindow);
75
76    m_frame = frame;
77}
78
79void DOMWindowProperty::willDestroyGlobalObjectInCachedFrame()
80{
81    // If the property has been disconnected from its Frame for the page cache, then it must have originally had a Frame
82    // and therefore should still have an associated DOMWindow.
83    ASSERT(!m_frame);
84    ASSERT(m_associatedDOMWindow);
85
86    // DOMWindowProperty lifetime isn't tied directly to the DOMWindow itself so it is important that it unregister
87    // itself from any DOMWindow it is associated with if that DOMWindow is going away.
88    if (m_associatedDOMWindow)
89        m_associatedDOMWindow->unregisterProperty(this);
90    m_associatedDOMWindow = 0;
91    m_frame = 0;
92}
93
94void DOMWindowProperty::willDestroyGlobalObjectInFrame()
95{
96    // If the property is getting this callback it must have been created with a Frame/DOMWindow and it should still have them.
97    ASSERT(m_frame);
98    ASSERT(m_associatedDOMWindow);
99
100    // DOMWindowProperty lifetime isn't tied directly to the DOMWindow itself so it is important that it unregister
101    // itself from any DOMWindow it is associated with if that DOMWindow is going away.
102    if (m_associatedDOMWindow)
103        m_associatedDOMWindow->unregisterProperty(this);
104    m_associatedDOMWindow = 0;
105    m_frame = 0;
106}
107
108void DOMWindowProperty::willDetachGlobalObjectFromFrame()
109{
110    // If the property is getting this callback it must have been created with a Frame/DOMWindow and it should still have them.
111    ASSERT(m_frame);
112    ASSERT(m_associatedDOMWindow);
113}
114
115}
116