diff options
Diffstat (limited to 'WebCore/page/Page.cpp')
-rw-r--r-- | WebCore/page/Page.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/WebCore/page/Page.cpp b/WebCore/page/Page.cpp index 8a685f4..c4f33d6 100644 --- a/WebCore/page/Page.cpp +++ b/WebCore/page/Page.cpp @@ -21,6 +21,7 @@ #include "config.h" #include "Page.h" +#include "BackForwardList.h" #include "Base64.h" #include "CSSStyleSelector.h" #include "Chrome.h" @@ -277,20 +278,30 @@ void Page::goBackOrForward(int distance) void Page::goToItem(HistoryItem* item, FrameLoadType type) { - // Abort any current load if we're going to a history item +#if !ASSERT_DISABLED + // If we're navigating to an item with history state for a Document other than the + // current Document, the new Document had better be in the page cache. + if (item->stateObject() && item->document() != m_mainFrame->document()) + ASSERT(item->document()->inPageCache()); +#endif - // Define what to do with any open database connections. By default we stop them and terminate the database thread. - DatabasePolicy databasePolicy = DatabasePolicyStop; + // Abort any current load unless we're navigating the current document to a new state object + if (!item->stateObject() || item->document() != m_mainFrame->document()) { + // Define what to do with any open database connections. By default we stop them and terminate the database thread. + DatabasePolicy databasePolicy = DatabasePolicyStop; #if ENABLE(DATABASE) - // If we're navigating the history via a fragment on the same document, then we do not want to stop databases. - const KURL& currentURL = m_mainFrame->loader()->url(); - const KURL& newURL = item->url(); - - if (newURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(currentURL, newURL)) - databasePolicy = DatabasePolicyContinue; + // If we're navigating the history via a fragment on the same document, then we do not want to stop databases. + const KURL& currentURL = m_mainFrame->loader()->url(); + const KURL& newURL = item->url(); + + if (newURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(currentURL, newURL)) + databasePolicy = DatabasePolicyContinue; #endif - m_mainFrame->loader()->stopAllLoaders(databasePolicy); + + m_mainFrame->loader()->stopAllLoaders(databasePolicy); + } + m_mainFrame->loader()->history()->goToItem(item, type); } @@ -542,7 +553,7 @@ void Page::userStyleSheetLocationChanged() Vector<char> styleSheetAsUTF8; if (base64Decode(encodedData, styleSheetAsUTF8)) - m_userStyleSheet = String::fromUTF8(styleSheetAsUTF8.data()); + m_userStyleSheet = String::fromUTF8(styleSheetAsUTF8.data(), styleSheetAsUTF8.size()); } for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) { |