Prepare frames for history navigation.
authorgavinp@chromium.org <gavinp@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Aug 2011 11:10:44 +0000 (11:10 +0000)
committergavinp@chromium.org <gavinp@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Aug 2011 11:10:44 +0000 (11:10 +0000)
Before beginning an explicit history navigation in a newly initialized
frame, it's important to give a "previous" item to avoid crashes, and
give a state to the state machine to avoid extra validating loads.

https://bugs.webkit.org/show_bug.cgi?id=66322

Reviewed by Darin Fisher.

Source/WebCore:

No new tests, as history navigation is very difficult to test in
DumpRenderTree.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::prepareForHistoryNavigation):
* loader/FrameLoader.h:

Source/WebKit/chromium:

* src/WebFrameImpl.cpp:
(WebKit::WebFrameImpl::loadHistoryItem):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@93296 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/loader/FrameLoader.cpp
Source/WebCore/loader/FrameLoader.h
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/WebFrameImpl.cpp

index b65e93e..577bdef 100644 (file)
@@ -1,3 +1,22 @@
+2011-08-18  Gavin Peters  <gavinp@chromium.org>
+
+        Prepare frames for history navigation.
+
+        Before beginning an explicit history navigation in a newly initialized
+        frame, it's important to give a "previous" item to avoid crashes, and
+        give a state to the state machine to avoid extra validating loads.
+
+        https://bugs.webkit.org/show_bug.cgi?id=66322
+
+        Reviewed by Darin Fisher.
+
+        No new tests, as history navigation is very difficult to test in
+        DumpRenderTree.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::prepareForHistoryNavigation):
+        * loader/FrameLoader.h:
+
 2011-08-18  Jing Zhao  <jingzhao@chromium.org>
 
         When changing the size of a menulist from x (x>1) to 1, the first item should be selected.
index 9dacad5..7432ec3 100644 (file)
@@ -1090,6 +1090,25 @@ void FrameLoader::started()
         frame->loader()->m_isComplete = false;
 }
 
+void FrameLoader::prepareForHistoryNavigation()
+{
+    // If there is no currentItem, but we still want to engage in 
+    // history navigation we need to manufacture one, and update
+    // the state machine of this frame to impersonate having
+    // loaded it.
+    RefPtr<HistoryItem> currentItem = history()->currentItem();
+    if (!currentItem) {
+        currentItem = HistoryItem::create();
+        currentItem->setLastVisitWasFailure(true);
+        history()->setCurrentItem(currentItem.get());
+        frame()->page()->backForward()->setCurrentItem(currentItem.get());
+
+        ASSERT(stateMachine()->isDisplayingInitialEmptyDocument());
+        stateMachine()->advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit);
+        stateMachine()->advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad);
+    }
+}
+
 void FrameLoader::prepareForLoadStart()
 {
     if (Page* page = m_frame->page())
index edfc5a1..d6a2119 100644 (file)
@@ -91,6 +91,7 @@ public:
     SubframeLoader* subframeLoader() const { return &m_subframeLoader; }
     IconController* icon() const { return &m_icon; }
 
+    void prepareForHistoryNavigation();
     void prepareForLoadStart();
     void setupForReplace();
 
index a5b2087..511404a 100644 (file)
@@ -1,3 +1,18 @@
+2011-08-18  Gavin Peters  <gavinp@chromium.org>
+
+        Prepare frames for history navigation.
+
+        Before beginning an explicit history navigation in a newly initialized
+        frame, it's important to give a "previous" item to avoid crashes, and
+        give a state to the state machine to avoid extra validating loads.
+
+        https://bugs.webkit.org/show_bug.cgi?id=66322
+
+        Reviewed by Darin Fisher.
+
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::loadHistoryItem):
+
 2011-08-18  Nico Weber  <thakis@chromium.org>
 
         [chromium/mac] Enable smooth scrolling
index 4216aa4..6c0617b 100644 (file)
@@ -889,17 +889,8 @@ void WebFrameImpl::loadHistoryItem(const WebHistoryItem& item)
     RefPtr<HistoryItem> historyItem = PassRefPtr<HistoryItem>(item);
     ASSERT(historyItem.get());
 
-    // If there is no currentItem, which happens when we are navigating in
-    // session history after a crash, we need to manufacture one otherwise WebKit
-    // hoarks. This is probably the wrong thing to do, but it seems to work.
+    m_frame->loader()->prepareForHistoryNavigation();
     RefPtr<HistoryItem> currentItem = m_frame->loader()->history()->currentItem();
-    if (!currentItem) {
-        currentItem = HistoryItem::create();
-        currentItem->setLastVisitWasFailure(true);
-        m_frame->loader()->history()->setCurrentItem(currentItem.get());
-        m_frame->page()->backForward()->setCurrentItem(currentItem.get());
-    }
-
     m_inSameDocumentHistoryLoad = currentItem->shouldDoSameDocumentNavigationTo(historyItem.get());
     m_frame->page()->goToItem(historyItem.get(),
                               FrameLoadTypeIndexedBackForward);