diff --git a/mozilla/content/html/document/src/nsHTMLContentSink.cpp b/mozilla/content/html/document/src/nsHTMLContentSink.cpp
index a4a0c931c87..a95df350160 100644
--- a/mozilla/content/html/document/src/nsHTMLContentSink.cpp
+++ b/mozilla/content/html/document/src/nsHTMLContentSink.cpp
@@ -93,6 +93,7 @@
#include "nsITimer.h"
#include "nsITimerCallback.h"
#include "nsDOMError.h"
+#include "nsIScrollable.h"
#ifdef ALLOW_ASYNCH_STYLE_SHEETS
const PRBool kBlock=PR_FALSE;
@@ -3023,11 +3024,19 @@ HTMLContentSink::StartLayout()
mLastNotificationTime = PR_Now();
// If it's a frameset document then disable scrolling.
- // Scrolling was reset nsWebShell::LoadURL() by InitFrameData()
+ // Else, reset scrolling to default settings for this shell.
+ // This must happen before the initial reflow, when we create the root frame
+ nsresult rv;
if (mWebShell) {
- if (mFrameset) {
- mWebShell->SetScrolling(NS_STYLE_OVERFLOW_HIDDEN, PR_FALSE);
- }
+ nsCOMPtr scrollableContainer = do_QueryInterface(mWebShell, &rv);
+ if (NS_SUCCEEDED(rv) && scrollableContainer) {
+ if (mFrameset) {
+ scrollableContainer->SetCurrentScrollbarPreferences(nsIScrollable::ScrollOrientation_Y, NS_STYLE_OVERFLOW_HIDDEN);
+ scrollableContainer->SetCurrentScrollbarPreferences(nsIScrollable::ScrollOrientation_X, NS_STYLE_OVERFLOW_HIDDEN);
+ } else {
+ scrollableContainer->ResetScrollbarPreferences();
+ }
+ }
}
PRInt32 i, ns = mDocument->GetNumberOfShells();
@@ -3057,7 +3066,7 @@ HTMLContentSink::StartLayout()
// frameset document, disable the scroll bars on the views.
char* ref = nsnull; // init in case mDocumentURI is not a url
nsIURL* url;
- nsresult rv = mDocumentURI->QueryInterface(NS_GET_IID(nsIURL), (void**)&url);
+ rv = mDocumentURI->QueryInterface(NS_GET_IID(nsIURL), (void**)&url);
if (NS_SUCCEEDED(rv)) {
rv = url->GetRef(&ref);
NS_RELEASE(url);
diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp
index 4d14c113015..bffe563cec4 100644
--- a/mozilla/docshell/base/nsDocShell.cpp
+++ b/mozilla/docshell/base/nsDocShell.cpp
@@ -40,6 +40,7 @@
#include "nsIChromeEventHandler.h"
#include "nsIDOMWindow.h"
#include "nsIWebBrowserChrome.h"
+#include "nsPoint.h"
// Interfaces Needed
#include "nsIGlobalHistory.h"
@@ -69,7 +70,9 @@ nsDocShell::nsDocShell() :
mInitialPageLoad(PR_TRUE),
mParent(nsnull),
mTreeOwner(nsnull),
- mChromeEventHandler(nsnull)
+ mChromeEventHandler(nsnull),
+ mCurrentScrollbarPref(-1,-1),
+ mDefaultScrollbarPref(-1,-1)
{
NS_INIT_REFCNT();
}
@@ -270,8 +273,6 @@ nsDocShell::SetDocument(nsIDOMDocument *aDOMDoc, nsIDOMElement *aRootNode)
doc->SetRootContent(rootContent);
// (6) reflow the document
- //XXX: SetScrolling doesn't make any sense
- //SetScrolling(-1, PR_FALSE);
PRInt32 i;
PRInt32 ns = doc->GetNumberOfShells();
for (i = 0; i < ns; i++)
@@ -1575,41 +1576,109 @@ NS_IMETHODIMP nsDocShell::SetScrollRangeEx(PRInt32 minHorizontalPos,
return NS_ERROR_FAILURE;
}
-NS_IMETHODIMP nsDocShell::GetScrollbarPreferences(PRInt32 scrollOrientation,
+// Get scroll setting for this document only
+//
+// One important client is nsCSSFrameConstructor::ConstructRootFrame()
+NS_IMETHODIMP nsDocShell::GetCurrentScrollbarPreferences(PRInt32 scrollOrientation,
PRInt32* scrollbarPref)
{
NS_ENSURE_ARG_POINTER(scrollbarPref);
+ switch(scrollOrientation) {
+ case ScrollOrientation_X:
+ *scrollbarPref = mCurrentScrollbarPref.x;
+ return NS_OK;
- nsCOMPtr scrollView;
- NS_ENSURE_SUCCESS(GetRootScrollableView(getter_AddRefs(scrollView)),
- NS_ERROR_FAILURE);
+ case ScrollOrientation_Y:
+ *scrollbarPref = mCurrentScrollbarPref.y;
+ return NS_OK;
- // XXX This is all evil, we need to convert. We don't know our prefs
- // are the same as this interfaces.
- /* nsScrollPreference scrollPref;
-
- NS_ENSURE_SUCCESS(scrollView->GetScrollPreference(scrollPref),
- NS_ERROR_FAILURE);
-
- *scrollbarPref = scrollPref; */
-
- return NS_OK;
+ default:
+ NS_ENSURE_TRUE(PR_FALSE, NS_ERROR_INVALID_ARG);
+ }
+ return NS_ERROR_FAILURE;
}
-NS_IMETHODIMP nsDocShell::SetScrollbarPreferences(PRInt32 scrollOrientation,
+// This returns setting for all documents in this webshell
+NS_IMETHODIMP nsDocShell::GetDefaultScrollbarPreferences(PRInt32 scrollOrientation,
+ PRInt32* scrollbarPref)
+{
+ NS_ENSURE_ARG_POINTER(scrollbarPref);
+ switch(scrollOrientation) {
+ case ScrollOrientation_X:
+ *scrollbarPref = mDefaultScrollbarPref.x;
+ return NS_OK;
+
+ case ScrollOrientation_Y:
+ *scrollbarPref = mDefaultScrollbarPref.y;
+ return NS_OK;
+
+ default:
+ NS_ENSURE_TRUE(PR_FALSE, NS_ERROR_INVALID_ARG);
+ }
+ return NS_ERROR_FAILURE;
+}
+
+// Set scrolling preference for this document only.
+//
+// There are three possible values stored in the shell:
+// 1) NS_STYLE_OVERFLOW_HIDDEN = no scrollbars
+// 2) NS_STYLE_OVERFLOW_AUTO = scrollbars appear if needed
+// 3) NS_STYLE_OVERFLOW_SCROLL = scrollbars always
+//
+// XXX Currently OVERFLOW_SCROLL isn't honored,
+// as it is not implemented by Gfx scrollbars
+// XXX setting has no effect after the root frame is created
+// as it is not implemented by Gfx scrollbars
+//
+// One important client is HTMLContentSink::StartLayout()
+NS_IMETHODIMP nsDocShell::SetCurrentScrollbarPreferences(PRInt32 scrollOrientation,
PRInt32 scrollbarPref)
{
- nsCOMPtr scrollView;
- NS_ENSURE_SUCCESS(GetRootScrollableView(getter_AddRefs(scrollView)),
- NS_ERROR_FAILURE);
+ switch(scrollOrientation) {
+ case ScrollOrientation_X:
+ mCurrentScrollbarPref.x = scrollbarPref;
+ return NS_OK;
- // XXX This is evil. We should do a mapping, we don't know our prefs
- // are the same as this interface. In fact it doesn't compile
- /* nsScrollPreference scrollPref = scrollbarPref;
- NS_ENSURE_SUCCESS(scrollView->SetScrollPreference(scrollPref),
- NS_ERROR_FAILURE); */
+ case ScrollOrientation_Y:
+ mCurrentScrollbarPref.y = scrollbarPref;
+ return NS_OK;
- return NS_OK;
+ default:
+ NS_ENSURE_TRUE(PR_FALSE, NS_ERROR_INVALID_ARG);
+ }
+ return NS_ERROR_FAILURE;
+}
+
+// Set scrolling preference for all documents in this shell
+// One important client is nsHTMLFrameInnerFrame::CreateWebShell()
+NS_IMETHODIMP nsDocShell::SetDefaultScrollbarPreferences(PRInt32 scrollOrientation,
+ PRInt32 scrollbarPref)
+{
+ switch(scrollOrientation) {
+ case ScrollOrientation_X:
+ mDefaultScrollbarPref.x = scrollbarPref;
+ return NS_OK;
+
+ case ScrollOrientation_Y:
+ mDefaultScrollbarPref.y = scrollbarPref;
+ return NS_OK;
+
+ default:
+ NS_ENSURE_TRUE(PR_FALSE, NS_ERROR_INVALID_ARG);
+ }
+ return NS_ERROR_FAILURE;
+}
+
+// Reset 'current' scrollbar settings to 'default'.
+// This must be called before every document load or else
+// frameset scrollbar settings (e.g.