PassRefPtr<HistoryItem> HistoryController::createItemTree(Frame* targetFrame, bool clipAtTarget) { RefPtr<HistoryItem> bfItem = createItem(); if (!m_frameLoadComplete) { saveScrollPositionAndViewStateToItem(m_previousItem.get()); saveTextWrapWidth(m_previousItem.get()); } if (!clipAtTarget || m_frame != targetFrame) { // save frame state for items that aren't loading (khtml doesn't save those) saveDocumentState(); // clipAtTarget is false for navigations within the same document, so // we should copy the documentSequenceNumber over to the newly create // item. Non-target items are just clones, and they should therefore // preserve the same itemSequenceNumber. if (m_previousItem) { if (m_frame != targetFrame) bfItem->setItemSequenceNumber(m_previousItem->itemSequenceNumber()); bfItem->setDocumentSequenceNumber(m_previousItem->documentSequenceNumber()); } for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { FrameLoader* childLoader = child->loader(); bool hasChildLoaded = childLoader->frameHasLoaded(); // If the child is a frame corresponding to an <object> element that never loaded, // we don't want to create a history item, because that causes fallback content // to be ignored on reload. if (!(!hasChildLoaded && childLoader->isHostedByObjectElement())) bfItem->addChildItem(childLoader->history()->createItemTree(targetFrame, clipAtTarget)); } } // FIXME: Eliminate the isTargetItem flag in favor of itemSequenceNumber. if (m_frame == targetFrame) bfItem->setIsTargetItem(true); return bfItem; }
PassRefPtr<HistoryItem> HistoryController::createItemTree(Frame* targetFrame, bool clipAtTarget) { RefPtr<HistoryItem> bfItem = createItem(m_frame->tree()->parent() ? true : false); if (m_previousItem) saveScrollPositionAndViewStateToItem(m_previousItem.get()); if (!(clipAtTarget && m_frame == targetFrame)) { // save frame state for items that aren't loading (khtml doesn't save those) saveDocumentState(); for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { FrameLoader* childLoader = child->loader(); bool hasChildLoaded = childLoader->frameHasLoaded(); // If the child is a frame corresponding to an <object> element that never loaded, // we don't want to create a history item, because that causes fallback content // to be ignored on reload. if (!(!hasChildLoaded && childLoader->isHostedByObjectElement())) bfItem->addChildItem(childLoader->history()->createItemTree(targetFrame, clipAtTarget)); } } if (m_frame == targetFrame) bfItem->setIsTargetItem(true); return bfItem; }