diff --git a/content/base/src/nsContentSink.cpp b/content/base/src/nsContentSink.cpp index db26a387ccbb..8e50f1b95736 100644 --- a/content/base/src/nsContentSink.cpp +++ b/content/base/src/nsContentSink.cpp @@ -287,6 +287,12 @@ nsContentSink::Init(nsIDocument* aDoc, mDocumentURI = aURI; mDocumentBaseURI = aURI; mDocShell = do_QueryInterface(aContainer); + if (mDocShell) { + PRUint32 loadType = 0; + mDocShell->GetLoadType(&loadType); + mChangeScrollPosWhenScrollingToRef = + ((loadType & nsIDocShell::LOAD_CMD_HISTORY) == 0); + } // use this to avoid a circular reference sink->document->scriptloader->sink nsCOMPtr proxy = @@ -886,18 +892,18 @@ nsContentSink::PrefetchHref(const nsAString &aHref, PRBool aExplicit) } -PRBool -nsContentSink::ScrollToRef(PRBool aReallyScroll) +void +nsContentSink::ScrollToRef() { if (mRef.IsEmpty()) { - return PR_FALSE; + return; } PRBool didScroll = PR_FALSE; char* tmpstr = ToNewCString(mRef); if (!tmpstr) { - return PR_FALSE; + return; } nsUnescape(tmpstr); @@ -917,7 +923,7 @@ nsContentSink::ScrollToRef(PRBool aReallyScroll) // Check an empty string which might be caused by the UTF-8 conversion if (!ref.IsEmpty()) { // Note that GoToAnchor will handle flushing layout as needed. - rv = shell->GoToAnchor(ref, aReallyScroll); + rv = shell->GoToAnchor(ref, mChangeScrollPosWhenScrollingToRef); } else { rv = NS_ERROR_FAILURE; } @@ -931,15 +937,13 @@ nsContentSink::ScrollToRef(PRBool aReallyScroll) rv = nsContentUtils::ConvertStringFromCharset(docCharset, unescapedRef, ref); if (NS_SUCCEEDED(rv) && !ref.IsEmpty()) - rv = shell->GoToAnchor(ref, aReallyScroll); + rv = shell->GoToAnchor(ref, mChangeScrollPosWhenScrollingToRef); } if (NS_SUCCEEDED(rv)) { - didScroll = PR_TRUE; + mScrolledToRefAlready = PR_TRUE; } } } - - return didScroll; } nsresult @@ -1032,6 +1036,20 @@ nsContentSink::StartLayout(PRBool aIsFrameset) } } +void +nsContentSink::TryToScrollToRef() +{ + if (mRef.IsEmpty()) { + return; + } + + if (mScrolledToRefAlready) { + return; + } + + ScrollToRef(); +} + void nsContentSink::NotifyAppend(nsIContent* aContainer, PRUint32 aStartIndex) { diff --git a/content/base/src/nsContentSink.h b/content/base/src/nsContentSink.h index e61c961ac1ec..b3b9de0da78e 100644 --- a/content/base/src/nsContentSink.h +++ b/content/base/src/nsContentSink.h @@ -169,7 +169,7 @@ protected: void PrefetchHref(const nsAString &aHref, PRBool aExplicit); - PRBool ScrollToRef(PRBool aReallyScroll); + void ScrollToRef(); nsresult RefreshIfEnabled(nsIViewManager* vm); void StartLayout(PRBool aIsFrameset); @@ -202,9 +202,7 @@ protected: virtual nsresult FlushTags() = 0; - virtual void TryToScrollToRef() - { - } + void TryToScrollToRef(); // CanInterrupt parsing related routines nsresult AddDummyParserRequest(void); @@ -257,7 +255,7 @@ protected: PRUint8 mParsing : 1; PRUint8 mDroppedTimer : 1; PRUint8 mInTitle : 1; - PRUint8 unused : 2; // bits available if someone needs one + PRUint8 mChangeScrollPosWhenScrollingToRef : 1; // -- Can interrupt parsing members -- PRUint32 mDelayTimerStart; diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index 266316a5749c..88f1e85cb631 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -283,8 +283,6 @@ protected: void StartLayout(); - void TryToScrollToRef(); - /** * AddBaseTagInfo adds the "current" base URI and target to the content node * in the form of bogo-attributes. This MUST be called before attributes are @@ -1847,14 +1845,7 @@ HTMLContentSink::DidBuildModel(void) } } - if (mDocShell) { - PRUint32 LoadType = 0; - mDocShell->GetLoadType(&LoadType); - - if (ScrollToRef(!(LoadType & nsIDocShell::LOAD_CMD_HISTORY))) { - mScrolledToRefAlready = PR_TRUE; - } - } + ScrollToRef(); nsScriptLoader *loader = mDocument->GetScriptLoader(); if (loader) { @@ -2826,22 +2817,6 @@ HTMLContentSink::StartLayout() nsContentSink::StartLayout(mFrameset != nsnull); } -void -HTMLContentSink::TryToScrollToRef() -{ - if (mRef.IsEmpty()) { - return; - } - - if (mScrolledToRefAlready) { - return; - } - - if (ScrollToRef(PR_TRUE)) { - mScrolledToRefAlready = PR_TRUE; - } -} - void HTMLContentSink::AddBaseTagInfo(nsIContent* aContent) { diff --git a/content/xml/document/src/nsXMLContentSink.cpp b/content/xml/document/src/nsXMLContentSink.cpp index f530e527ce05..f9ebd153cc1c 100644 --- a/content/xml/document/src/nsXMLContentSink.cpp +++ b/content/xml/document/src/nsXMLContentSink.cpp @@ -347,16 +347,7 @@ nsXMLContentSink::DidBuildModel() StartLayout(); -#if 0 /* Disable until this works for XML */ - // Scroll to Anchor only if the document was *not* loaded through history means. - if (mDocShell) { - PRUint32 documentLoadType = 0; - mDocShell->GetLoadType(&documentLoadType); - ScrollToRef(!(documentLoadType & nsIDocShell::LOAD_CMD_HISTORY)); - } -#else - ScrollToRef(PR_TRUE); -#endif + ScrollToRef(); mDocument->RemoveObserver(this); @@ -437,14 +428,7 @@ nsXMLContentSink::OnTransformDone(nsresult aResult, // Start the layout process StartLayout(); -#if 0 /* Disable until this works for XML */ - // Scroll to Anchor only if the document was *not* loaded through history means. - PRUint32 documentLoadType = 0; - docShell->GetLoadType(&documentLoadType); - ScrollToRef(!(documentLoadType & nsIDocShell::LOAD_CMD_HISTORY)); -#else - ScrollToRef(PR_TRUE); -#endif + ScrollToRef(); originalDocument->EndLoad();