Index: WebCore/loader/HistoryController.cpp |
=================================================================== |
--- WebCore/loader/HistoryController.cpp (revision 78353) |
+++ WebCore/loader/HistoryController.cpp (working copy) |
@@ -248,10 +248,6 @@ |
// Must grab the current scroll position before disturbing it |
if (!m_frameLoadComplete) |
saveScrollPositionAndViewStateToItem(m_previousItem.get()); |
- |
- // When traversing history, we may end up redirecting to a different URL |
- // this time (e.g., due to cookies). See http://webkit.org/b/49654. |
- updateCurrentItem(); |
} |
void HistoryController::updateForReload() |
@@ -266,11 +262,11 @@ |
if (m_frame->loader()->loadType() == FrameLoadTypeReload || m_frame->loader()->loadType() == FrameLoadTypeReloadFromOrigin) |
saveScrollPositionAndViewStateToItem(m_currentItem.get()); |
+ |
+ // Sometimes loading a page again leads to a different result because of cookies. Bugzilla 4072 |
+ if (m_frame->loader()->documentLoader()->unreachableURL().isEmpty()) |
+ m_currentItem->setURL(m_frame->loader()->documentLoader()->requestURL()); |
} |
- |
- // When reloading the page, we may end up redirecting to a different URL |
- // this time (e.g., due to cookies). See http://webkit.org/b/4072. |
- updateCurrentItem(); |
} |
// There are 3 things you might think of as "history", all of which are handled by these functions. |
@@ -302,9 +298,9 @@ |
if (Page* page = m_frame->page()) |
page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForward()->currentItem()); |
} |
- } else { |
- // The client redirect replaces the current history item. |
- updateCurrentItem(); |
+ } else if (frameLoader->documentLoader()->unreachableURL().isEmpty() && m_currentItem) { |
+ m_currentItem->setURL(frameLoader->documentLoader()->url()); |
+ m_currentItem->setFormInfoFromRequest(frameLoader->documentLoader()->request()); |
} |
if (!historyURL.isEmpty() && !needPrivacy) { |
@@ -341,12 +337,14 @@ |
page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForward()->currentItem()); |
} |
} |
- // The client redirect replaces the current history item. |
- updateCurrentItem(); |
+ if (m_currentItem) { |
+ m_currentItem->setURL(m_frame->loader()->documentLoader()->url()); |
+ m_currentItem->setFormInfoFromRequest(m_frame->loader()->documentLoader()->request()); |
+ } |
} else { |
Frame* parentFrame = m_frame->tree()->parent(); |
if (parentFrame && parentFrame->loader()->history()->m_currentItem) |
- parentFrame->loader()->history()->m_currentItem->setChildItem(createItem()); |
+ parentFrame->loader()->history()->m_currentItem->setChildItem(createItem(true)); |
} |
if (!historyURL.isEmpty() && !needPrivacy) { |
@@ -455,13 +453,12 @@ |
m_provisionalItem = item; |
} |
-void HistoryController::initializeItem(HistoryItem* item) |
+PassRefPtr<HistoryItem> HistoryController::createItem(bool useOriginal) |
{ |
DocumentLoader* documentLoader = m_frame->loader()->documentLoader(); |
- ASSERT(documentLoader); |
- |
- KURL unreachableURL = documentLoader->unreachableURL(); |
- |
+ |
+ KURL unreachableURL = documentLoader ? documentLoader->unreachableURL() : KURL(); |
+ |
KURL url; |
KURL originalURL; |
@@ -469,10 +466,15 @@ |
url = unreachableURL; |
originalURL = unreachableURL; |
} else { |
- url = documentLoader->url(); |
- originalURL = documentLoader->originalURL(); |
+ originalURL = documentLoader ? documentLoader->originalURL() : KURL(); |
+ if (useOriginal) |
+ url = originalURL; |
+ else if (documentLoader) |
+ url = documentLoader->requestURL(); |
} |
+ LOG(History, "WebCoreHistory: Creating item for %s", url.string().ascii().data()); |
+ |
// Frames that have never successfully loaded any content |
// may have no URL at all. Currently our history code can't |
// deal with such things, so we nip that in the bud here. |
@@ -485,25 +487,21 @@ |
Frame* parentFrame = m_frame->tree()->parent(); |
String parent = parentFrame ? parentFrame->tree()->uniqueName() : ""; |
- String title = documentLoader->title(); |
+ String title = documentLoader ? documentLoader->title() : ""; |
- item->setURL(url); |
- item->setTarget(m_frame->tree()->uniqueName()); |
- item->setParent(parent); |
- item->setTitle(title); |
+ RefPtr<HistoryItem> item = HistoryItem::create(url, m_frame->tree()->uniqueName(), parent, title); |
item->setOriginalURLString(originalURL.string()); |
- if (!unreachableURL.isEmpty() || documentLoader->response().httpStatusCode() >= 400) |
+ if (!unreachableURL.isEmpty() || !documentLoader || documentLoader->response().httpStatusCode() >= 400) |
item->setLastVisitWasFailure(true); |
// Save form state if this is a POST |
- item->setFormInfoFromRequest(documentLoader->request()); |
-} |
- |
-PassRefPtr<HistoryItem> HistoryController::createItem() |
-{ |
- RefPtr<HistoryItem> item = HistoryItem::create(); |
- initializeItem(item.get()); |
+ if (documentLoader) { |
+ if (useOriginal) |
+ item->setFormInfoFromRequest(documentLoader->originalRequest()); |
+ else |
+ item->setFormInfoFromRequest(documentLoader->request()); |
+ } |
// Set the item for which we will save document state |
m_frameLoadComplete = false; |
@@ -515,7 +513,7 @@ |
PassRefPtr<HistoryItem> HistoryController::createItemTree(Frame* targetFrame, bool clipAtTarget) |
{ |
- RefPtr<HistoryItem> bfItem = createItem(); |
+ RefPtr<HistoryItem> bfItem = createItem(m_frame->tree()->parent() ? true : false); |
if (!m_frameLoadComplete) |
saveScrollPositionAndViewStateToItem(m_previousItem.get()); |
@@ -649,31 +647,6 @@ |
page->backForward()->addItem(topItem.release()); |
} |
-void HistoryController::updateCurrentItem() |
-{ |
- if (!m_currentItem) |
- return; |
- |
- DocumentLoader* documentLoader = m_frame->loader()->documentLoader(); |
- |
- if (!documentLoader->unreachableURL().isEmpty()) |
- return; |
- |
- if (m_currentItem->url() != documentLoader->url()) { |
- // We ended up on a completely different URL this time, so the HistoryItem |
- // needs to be re-initialized. Preserve the isTargetItem flag as it is a |
- // property of how this HistoryItem was originally created and is not |
- // dependent on the document. |
- bool isTargetItem = m_currentItem->isTargetItem(); |
- m_currentItem->reset(); |
- initializeItem(m_currentItem.get()); |
- m_currentItem->setIsTargetItem(isTargetItem); |
- } else { |
- // Even if the final URL didn't change, the form data may have changed. |
- m_currentItem->setFormInfoFromRequest(documentLoader->request()); |
- } |
-} |
- |
void HistoryController::pushState(PassRefPtr<SerializedScriptValue> stateObject, const String& title, const String& urlString) |
{ |
if (!m_currentItem) |