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(); }