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); }
PassOwnPtr<HistoryNode> HistoryNode::cloneAndReplace(HistoryEntry* newEntry, HistoryItem* newItem, bool clipAtTarget, LocalFrame* targetFrame, LocalFrame* currentFrame) { bool isNodeBeingNavigated = targetFrame == currentFrame; HistoryItem* itemForCreate = isNodeBeingNavigated ? newItem : m_value.get(); OwnPtr<HistoryNode> newHistoryNode = create(newEntry, itemForCreate, currentFrame->frameID()); if (!clipAtTarget || !isNodeBeingNavigated) { for (LocalFrame* child = currentFrame->tree().firstChild(); child; child = child->tree().nextSibling()) { HistoryNode* childHistoryNode = m_entry->historyNodeForFrame(child); if (!childHistoryNode) continue; newHistoryNode->m_children.append(childHistoryNode->cloneAndReplace(newEntry, newItem, clipAtTarget, targetFrame, child)); } } return newHistoryNode.release(); }
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); }