Reviewed by John.
[WebKit-https.git] / WebCore / kwq / KWQPageState.mm
1 /*
2  * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "KWQPageState.h"
27
28 #import <JavaScriptCore/property_map.h>
29
30 #import "dom_docimpl.h"
31 #import "khtmlview.h"
32 #import "kjs_window.h"
33
34 #import "KWQAssertions.h"
35 #import "KWQFoundationExtras.h"
36 #import "KWQKHTMLPart.h"
37
38 using DOM::DocumentImpl;
39
40 using khtml::RenderObject;
41
42 using KJS::SavedProperties;
43 using KJS::SavedBuiltins;
44
45 @implementation KWQPageState
46
47 - initWithDocument:(DocumentImpl *)doc URL:(const KURL &)u windowProperties:(SavedProperties *)wp locationProperties:(SavedProperties *)lp interpreterBuiltins:(SavedBuiltins *)ib
48 {
49     [super init];
50     doc->ref();
51     document = doc;
52     document->setInPageCache(YES);
53     parseMode = document->parseMode();
54     document->view()->ref();
55     mousePressNode = static_cast<KWQKHTMLPart *>(document->part())->mousePressNode();
56     if (mousePressNode) {
57         mousePressNode->ref();
58     }
59     URL = new KURL(u);
60     windowProperties = wp;
61     locationProperties = lp;
62     interpreterBuiltins = ib;
63     return self;
64 }
65
66 - (DOM::DocumentImpl::ParseMode)parseMode { return parseMode; }
67
68 - (void)setPausedActions: (QMap<int, KJS::ScheduledAction*> *)pa
69 {
70     pausedActions = pa;
71 }
72
73 - (QMap<int, KJS::ScheduledAction*> *)pausedActions
74 {
75     return pausedActions;
76 }
77
78 - (void)_cleanupPausedActions
79 {
80     if (pausedActions){
81         QMapIterator<int,KJS::ScheduledAction*> it;
82         for (it = pausedActions->begin(); it != pausedActions->end(); ++it) {
83             KJS::ScheduledAction *action = *it;
84             delete action;
85         }
86         delete pausedActions;
87         pausedActions = 0;
88     }
89     QObject::clearPausedTimers(self);
90 }
91
92 - (void)clear
93 {
94     document = 0;
95     mousePressNode = 0;
96
97     delete URL;
98     URL = 0;
99     delete windowProperties;
100     windowProperties = 0;
101     delete locationProperties;
102     locationProperties = 0;
103     delete interpreterBuiltins;
104     interpreterBuiltins = 0;
105     [self _cleanupPausedActions];
106 }
107
108 - (void)invalidate
109 {
110     // Should only ever invalidate once.
111     ASSERT(document);
112     ASSERT(document->view());
113     ASSERT(!document->inPageCache());
114
115     if (document && document->view()) {
116         document->view()->deref();
117         document->deref();
118     }
119     
120     [self clear];
121 }
122
123 - (void)dealloc
124 {
125     if (document) {
126         ASSERT(document->inPageCache());
127         ASSERT(document->view());
128
129         KHTMLView *view = document->view();
130
131         KWQKHTMLPart::clearTimers(view);
132
133         bool detached = document->renderer() == 0;
134         document->setInPageCache(NO);
135         if (detached) {
136             document->detach();
137             document->removeAllEventListenersFromAllNodes();
138         }
139         document->deref();
140         
141         if (mousePressNode) {
142             mousePressNode->deref();
143         }
144         
145         if (view) {
146             view->clearPart();
147             view->deref();
148         }
149     }
150
151     [self clear];
152
153     [super dealloc];
154 }
155
156 - (void)finalize
157 {
158     // FIXME: This work really should not be done at deallocation time.
159     // We need to do it at some well-defined time instead.
160
161     if (document) {
162         ASSERT(document->inPageCache());
163         ASSERT(document->view());
164
165         KHTMLView *view = document->view();
166
167         KWQKHTMLPart::clearTimers(view);
168
169         bool detached = document->renderer() == 0;
170         document->setInPageCache(NO);
171         if (detached) {
172             document->detach();
173             document->removeAllEventListenersFromAllNodes();
174         }
175         document->deref();
176         
177         if (view) {
178             view->clearPart();
179             view->deref();
180         }
181     }
182
183     [self clear];
184
185     [super finalize];
186 }
187
188 - (DocumentImpl *)document
189 {
190     return document;
191 }
192
193 - (DOM::NodeImpl *)mousePressNode
194 {
195     return mousePressNode;
196 }
197
198 - (KURL *)URL
199 {
200     return URL;
201 }
202
203 - (SavedProperties *)windowProperties
204 {
205     return windowProperties;
206 }
207
208 - (SavedProperties *)locationProperties
209 {
210     return locationProperties;
211 }
212
213 - (SavedBuiltins *)interpreterBuiltins
214 {
215     return interpreterBuiltins;
216 }
217
218 @end