void HistoryController::goToItem(HistoryItem* targetItem, ResourceRequestCachePolicy cachePolicy) { if (m_defersLoading) { m_deferredItem = targetItem; m_deferredCachePolicy = cachePolicy; return; } OwnPtr<HistoryEntry> newEntry = HistoryEntry::create(targetItem); Deque<HistoryNode*> historyNodes; historyNodes.append(newEntry->rootHistoryNode()); while (!historyNodes.isEmpty()) { // For each item, read the children (if any) off the HistoryItem, // create a new HistoryNode for each child and attach it, // then clear the children on the HistoryItem. HistoryNode* historyNode = historyNodes.takeFirst(); const HistoryItemVector& children = historyNode->value()->children(); for (size_t i = 0; i < children.size(); i++) { HistoryNode* childHistoryNode = historyNode->addChild(children[i].get()); historyNodes.append(childHistoryNode); } historyNode->value()->clearChildren(); } goToEntry(newEntry.release(), cachePolicy); }
void HistoryController::goToItem(HistoryItem* targetItem, ResourceRequestCachePolicy cachePolicy) { // We don't have enough information to set a correct frame id here. This might be a restore from // disk, and the frame ids might not match up if the state was saved from a different process. // Ensure the HistoryEntry's main frame id matches the actual main frame id. Its subframe ids // are invalid to ensure they don't accidentally match a potentially random frame. OwnPtr<HistoryEntry> newEntry = HistoryEntry::create(targetItem, m_page->mainFrame()->frameID()); Deque<HistoryNode*> historyNodes; historyNodes.append(newEntry->rootHistoryNode()); while (!historyNodes.isEmpty()) { // For each item, read the children (if any) off the HistoryItem, // create a new HistoryNode for each child and attach it, // then clear the children on the HistoryItem. HistoryNode* historyNode = historyNodes.takeFirst(); const HistoryItemVector& children = historyNode->value()->deprecatedChildren(); for (size_t i = 0; i < children.size(); i++) { HistoryNode* childHistoryNode = historyNode->addChild(children[i].get(), -1); historyNodes.append(childHistoryNode); } historyNode->value()->deprecatedClearChildren(); } goToEntry(newEntry.release(), cachePolicy); }