OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 HistoryItem* HistoryEntry::itemForFrame(Frame* frame) | 112 HistoryItem* HistoryEntry::itemForFrame(Frame* frame) |
113 { | 113 { |
114 if (HistoryNode* historyNode = historyNodeForFrame(frame)) | 114 if (HistoryNode* historyNode = historyNodeForFrame(frame)) |
115 return historyNode->value(); | 115 return historyNode->value(); |
116 return 0; | 116 return 0; |
117 } | 117 } |
118 | 118 |
119 HistoryController::HistoryController(Page* page) | 119 HistoryController::HistoryController(Page* page) |
120 : m_page(page) | 120 : m_page(page) |
121 , m_defersLoading(false) | 121 , m_defersLoading(false) |
| 122 , m_deferredCachePolicy(UseProtocolCachePolicy) |
122 { | 123 { |
123 } | 124 } |
124 | 125 |
125 HistoryController::~HistoryController() | 126 HistoryController::~HistoryController() |
126 { | 127 { |
127 } | 128 } |
128 | 129 |
129 void HistoryController::updateBackForwardListForFragmentScroll(Frame* frame, His
toryItem* item) | 130 void HistoryController::updateBackForwardListForFragmentScroll(Frame* frame, His
toryItem* item) |
130 { | 131 { |
131 m_provisionalEntry.clear(); | 132 m_provisionalEntry.clear(); |
132 createNewBackForwardItem(frame, item, false); | 133 createNewBackForwardItem(frame, item, false); |
133 } | 134 } |
134 | 135 |
135 void HistoryController::goToEntry(PassOwnPtr<HistoryEntry> targetEntry) | 136 void HistoryController::goToEntry(PassOwnPtr<HistoryEntry> targetEntry, Resource
RequestCachePolicy cachePolicy) |
136 { | 137 { |
137 ASSERT(m_sameDocumentLoadsInProgress.isEmpty()); | 138 ASSERT(m_sameDocumentLoadsInProgress.isEmpty()); |
138 ASSERT(m_differentDocumentLoadsInProgress.isEmpty()); | 139 ASSERT(m_differentDocumentLoadsInProgress.isEmpty()); |
139 | 140 |
140 m_provisionalEntry = targetEntry; | 141 m_provisionalEntry = targetEntry; |
141 recursiveGoToEntry(m_page->mainFrame()); | 142 recursiveGoToEntry(m_page->mainFrame()); |
142 | 143 |
143 if (m_sameDocumentLoadsInProgress.isEmpty() && m_differentDocumentLoadsInPro
gress.isEmpty()) | 144 if (m_sameDocumentLoadsInProgress.isEmpty() && m_differentDocumentLoadsInPro
gress.isEmpty()) |
144 m_sameDocumentLoadsInProgress.set(m_page->mainFrame(), m_provisionalEntr
y->root()); | 145 m_sameDocumentLoadsInProgress.set(m_page->mainFrame(), m_provisionalEntr
y->root()); |
145 | 146 |
146 if (m_differentDocumentLoadsInProgress.isEmpty()) { | 147 if (m_differentDocumentLoadsInProgress.isEmpty()) { |
147 m_previousEntry = m_currentEntry.release(); | 148 m_previousEntry = m_currentEntry.release(); |
148 m_currentEntry = m_provisionalEntry.release(); | 149 m_currentEntry = m_provisionalEntry.release(); |
149 } | 150 } |
150 | 151 |
151 for (HistoryFrameLoadSet::iterator it = m_sameDocumentLoadsInProgress.begin(
); it != m_sameDocumentLoadsInProgress.end(); ++it) | 152 for (HistoryFrameLoadSet::iterator it = m_sameDocumentLoadsInProgress.begin(
); it != m_sameDocumentLoadsInProgress.end(); ++it) |
152 it->key->loader().loadHistoryItem(it->value, HistorySameDocumentLoad); | 153 it->key->loader().loadHistoryItem(it->value, HistorySameDocumentLoad, ca
chePolicy); |
153 for (HistoryFrameLoadSet::iterator it = m_differentDocumentLoadsInProgress.b
egin(); it != m_differentDocumentLoadsInProgress.end(); ++it) | 154 for (HistoryFrameLoadSet::iterator it = m_differentDocumentLoadsInProgress.b
egin(); it != m_differentDocumentLoadsInProgress.end(); ++it) |
154 it->key->loader().loadHistoryItem(it->value, HistoryDifferentDocumentLoa
d); | 155 it->key->loader().loadHistoryItem(it->value, HistoryDifferentDocumentLoa
d, cachePolicy); |
155 m_sameDocumentLoadsInProgress.clear(); | 156 m_sameDocumentLoadsInProgress.clear(); |
156 m_differentDocumentLoadsInProgress.clear(); | 157 m_differentDocumentLoadsInProgress.clear(); |
157 } | 158 } |
158 | 159 |
159 void HistoryController::recursiveGoToEntry(Frame* frame) | 160 void HistoryController::recursiveGoToEntry(Frame* frame) |
160 { | 161 { |
161 HistoryItem* newItem = m_provisionalEntry->itemForFrame(frame); | 162 HistoryItem* newItem = m_provisionalEntry->itemForFrame(frame); |
162 HistoryItem* oldItem = m_currentEntry ? m_currentEntry->itemForFrame(frame)
: 0; | 163 HistoryItem* oldItem = m_currentEntry ? m_currentEntry->itemForFrame(frame)
: 0; |
163 if (!newItem) | 164 if (!newItem) |
164 return; | 165 return; |
165 | 166 |
166 if (!oldItem || (newItem != oldItem && newItem->itemSequenceNumber() != oldI
tem->itemSequenceNumber())) { | 167 if (!oldItem || (newItem != oldItem && newItem->itemSequenceNumber() != oldI
tem->itemSequenceNumber())) { |
167 if (oldItem && newItem->documentSequenceNumber() == oldItem->documentSeq
uenceNumber()) | 168 if (oldItem && newItem->documentSequenceNumber() == oldItem->documentSeq
uenceNumber()) |
168 m_sameDocumentLoadsInProgress.set(frame, newItem); | 169 m_sameDocumentLoadsInProgress.set(frame, newItem); |
169 else | 170 else |
170 m_differentDocumentLoadsInProgress.set(frame, newItem); | 171 m_differentDocumentLoadsInProgress.set(frame, newItem); |
171 return; | 172 return; |
172 } | 173 } |
173 | 174 |
174 for (Frame* child = frame->tree().firstChild(); child; child = child->tree()
.nextSibling()) | 175 for (Frame* child = frame->tree().firstChild(); child; child = child->tree()
.nextSibling()) |
175 recursiveGoToEntry(child); | 176 recursiveGoToEntry(child); |
176 } | 177 } |
177 | 178 |
178 void HistoryController::goToItem(HistoryItem* targetItem) | 179 void HistoryController::goToItem(HistoryItem* targetItem, ResourceRequestCachePo
licy cachePolicy) |
179 { | 180 { |
180 if (m_defersLoading) { | 181 if (m_defersLoading) { |
181 m_deferredItem = targetItem; | 182 m_deferredItem = targetItem; |
| 183 m_deferredCachePolicy = cachePolicy; |
182 return; | 184 return; |
183 } | 185 } |
184 | 186 |
185 OwnPtr<HistoryEntry> newEntry = HistoryEntry::create(targetItem); | 187 OwnPtr<HistoryEntry> newEntry = HistoryEntry::create(targetItem); |
186 Deque<HistoryNode*> historyNodes; | 188 Deque<HistoryNode*> historyNodes; |
187 historyNodes.append(newEntry->rootHistoryNode()); | 189 historyNodes.append(newEntry->rootHistoryNode()); |
188 while (!historyNodes.isEmpty()) { | 190 while (!historyNodes.isEmpty()) { |
189 // For each item, read the children (if any) off the HistoryItem, | 191 // For each item, read the children (if any) off the HistoryItem, |
190 // create a new HistoryNode for each child and attach it, | 192 // create a new HistoryNode for each child and attach it, |
191 // then clear the children on the HistoryItem. | 193 // then clear the children on the HistoryItem. |
192 HistoryNode* historyNode = historyNodes.takeFirst(); | 194 HistoryNode* historyNode = historyNodes.takeFirst(); |
193 const HistoryItemVector& children = historyNode->value()->children(); | 195 const HistoryItemVector& children = historyNode->value()->children(); |
194 for (size_t i = 0; i < children.size(); i++) { | 196 for (size_t i = 0; i < children.size(); i++) { |
195 HistoryNode* childHistoryNode = historyNode->addChild(children[i].ge
t()); | 197 HistoryNode* childHistoryNode = historyNode->addChild(children[i].ge
t()); |
196 historyNodes.append(childHistoryNode); | 198 historyNodes.append(childHistoryNode); |
197 } | 199 } |
198 historyNode->value()->clearChildren(); | 200 historyNode->value()->clearChildren(); |
199 } | 201 } |
200 goToEntry(newEntry.release()); | 202 goToEntry(newEntry.release(), cachePolicy); |
201 } | 203 } |
202 | 204 |
203 void HistoryController::setDefersLoading(bool defer) | 205 void HistoryController::setDefersLoading(bool defer) |
204 { | 206 { |
205 m_defersLoading = defer; | 207 m_defersLoading = defer; |
206 if (!defer && m_deferredItem) { | 208 if (!defer && m_deferredItem) { |
207 goToItem(m_deferredItem.get()); | 209 goToItem(m_deferredItem.get(), m_deferredCachePolicy); |
208 m_deferredItem = 0; | 210 m_deferredItem = 0; |
| 211 m_deferredCachePolicy = UseProtocolCachePolicy; |
209 } | 212 } |
210 } | 213 } |
211 | 214 |
212 void HistoryController::updateForInitialLoadInChildFrame(Frame* frame, HistoryIt
em* item) | 215 void HistoryController::updateForInitialLoadInChildFrame(Frame* frame, HistoryIt
em* item) |
213 { | 216 { |
214 ASSERT(frame->tree().parent()); | 217 ASSERT(frame->tree().parent()); |
215 if (!m_currentEntry || m_currentEntry->historyNodeForFrame(frame)) | 218 if (!m_currentEntry || m_currentEntry->historyNodeForFrame(frame)) |
216 return; | 219 return; |
217 if (HistoryNode* parentHistoryNode = m_currentEntry->historyNodeForFrame(fra
me->tree().parent())) | 220 if (HistoryNode* parentHistoryNode = m_currentEntry->historyNodeForFrame(fra
me->tree().parent())) |
218 parentHistoryNode->addChild(item); | 221 parentHistoryNode->addChild(item); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 } else { | 289 } else { |
287 HistoryItem* oldItem = m_currentEntry->itemForFrame(targetFrame); | 290 HistoryItem* oldItem = m_currentEntry->itemForFrame(targetFrame); |
288 if (!clipAtTarget && oldItem) | 291 if (!clipAtTarget && oldItem) |
289 newItem->setDocumentSequenceNumber(oldItem->documentSequenceNumber()
); | 292 newItem->setDocumentSequenceNumber(oldItem->documentSequenceNumber()
); |
290 m_previousEntry = m_currentEntry.release(); | 293 m_previousEntry = m_currentEntry.release(); |
291 m_currentEntry = m_previousEntry->cloneAndReplace(newItem.get(), clipAtT
arget, targetFrame, m_page); | 294 m_currentEntry = m_previousEntry->cloneAndReplace(newItem.get(), clipAtT
arget, targetFrame, m_page); |
292 } | 295 } |
293 } | 296 } |
294 | 297 |
295 } // namespace WebCore | 298 } // namespace WebCore |
OLD | NEW |