void HistoryController::updateForCommit() { FrameLoader& frameLoader = m_frame.loader(); LOG(History, "HistoryController %p updateForCommit: Updating History for commit in frame %p (main frame %d) %s", this, &m_frame, m_frame.isMainFrame(), m_frame.loader().documentLoader() ? m_frame.loader().documentLoader()->url().string().utf8().data() : ""); FrameLoadType type = frameLoader.loadType(); if (isBackForwardLoadType(type) || isReplaceLoadTypeWithProvisionalItem(type) || (isReloadTypeWithProvisionalItem(type) && !frameLoader.provisionalDocumentLoader()->unreachableURL().isEmpty())) { // Once committed, we want to use current item for saving DocState, and // the provisional item for restoring state. // Note previousItem must be set before we close the URL, which will // happen when the data source is made non-provisional below // FIXME: https://bugs.webkit.org/show_bug.cgi?id=146842 // We should always have a provisional item when committing, but we sometimes don't. // Not having one leads to us not having a m_currentItem later, which is also a terrible known issue. // We should get to the bottom of this. ASSERT(m_provisionalItem); setCurrentItem(m_provisionalItem.get()); m_provisionalItem = nullptr; // Tell all other frames in the tree to commit their provisional items and // restore their scroll position. We'll avoid this frame (which has already // committed) and its children (which will be replaced). m_frame.mainFrame().loader().history().recursiveUpdateForCommit(); } }
void HistoryController::updateForCommit() { FrameLoader* frameLoader = m_frame->loader(); #if !LOG_DISABLED if (frameLoader->documentLoader()) LOG(History, "WebCoreHistory: Updating History for commit in frame %s", frameLoader->documentLoader()->title().string().utf8().data()); #endif FrameLoadType type = frameLoader->loadType(); if (isBackForwardLoadType(type) || isReplaceLoadTypeWithProvisionalItem(type) || (isReloadTypeWithProvisionalItem(type) && !frameLoader->provisionalDocumentLoader()->unreachableURL().isEmpty())) { // Once committed, we want to use current item for saving DocState, and // the provisional item for restoring state. // Note previousItem must be set before we close the URL, which will // happen when the data source is made non-provisional below m_frameLoadComplete = false; m_previousItem = m_currentItem; ASSERT(m_provisionalItem); m_currentItem = m_provisionalItem; m_provisionalItem = 0; // Tell all other frames in the tree to commit their provisional items and // restore their scroll position. We'll avoid this frame (which has already // committed) and its children (which will be replaced). Page* page = m_frame->page(); ASSERT(page); page->mainFrame()->loader()->history()->recursiveUpdateForCommit(); } }
void HistoryController::updateForCommit() { FrameLoader* frameLoader = m_frame->loader(); #if !LOG_DISABLED if (m_frame->document()) LOG(History, "WebCoreHistory: Updating History for commit in frame %s", m_frame->document()->title().utf8().data()); #endif FrameLoadType type = frameLoader->loadType(); if (isBackForwardLoadType(type) || (isReloadTypeWithProvisionalItem(type) && !frameLoader->documentLoader()->unreachableURL().isEmpty())) { // Once committed, we want to use current item for saving DocState, and // the provisional item for restoring state. // Note previousItem must be set before we close the URL, which will // happen when the data source is made non-provisional below m_previousItem = m_currentItem; ASSERT(m_provisionalItem); m_currentItem = m_provisionalItem; m_provisionalItem = 0; // Tell all other frames in the tree to commit their provisional items and // restore their scroll position. We'll avoid this frame (which has already // committed) and its children (which will be replaced). Page* page = m_frame->page(); ASSERT(page); page->mainFrame()->loader()->history()->recursiveUpdateForCommit(); } switch (type) { case FrameLoadTypeBackForward: updateForBackForwardNavigation(); return; case FrameLoadTypeReload: case FrameLoadTypeReloadFromOrigin: case FrameLoadTypeSame: updateForReload(); return; case FrameLoadTypeStandard: updateForStandardLoad(); return; case FrameLoadTypeRedirectWithLockedBackForwardList: updateForRedirectWithLockedBackForwardList(); return; case FrameLoadTypeInitialInChildFrame: updateForInitialLoadInChildFrame(); return; default: ASSERT_NOT_REACHED(); } }