The Acid2 test and the reference rendering both make use of overflow:hidden on the...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Apr 2005 09:52:42 +0000 (09:52 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Apr 2005 09:52:42 +0000 (09:52 +0000)
the CSS2.1 wording for this behavior has been revised (based off WinIE/Mozilla behavior).  Change our behavior
to match and make <html> overflow apply to the viewport.

        * khtml/khtmlview.cpp:
        (KHTMLView::applyOverflowToViewport):
        (KHTMLView::layout):
        * khtml/khtmlview.h:
        * khtml/rendering/render_box.cpp:
        (RenderBox::setStyle):

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/khtmlview.cpp
WebCore/khtml/khtmlview.h
WebCore/khtml/rendering/render_box.cpp

index 36dce3f69761fa81a9f9e323b74f03d6b1874aa4..54187c9086f2dc6a408cc15f47528b9ccaa9b7ad 100644 (file)
@@ -1,3 +1,16 @@
+2005-04-15  David Hyatt  <hyatt@apple.com>
+
+       The Acid2 test and the reference rendering both make use of overflow:hidden on the <html> element.  Turns out
+       the CSS2.1 wording for this behavior has been revised (based off WinIE/Mozilla behavior).  Change our behavior
+       to match and make <html> overflow apply to the viewport.
+       
+        * khtml/khtmlview.cpp:
+        (KHTMLView::applyOverflowToViewport):
+        (KHTMLView::layout):
+        * khtml/khtmlview.h:
+        * khtml/rendering/render_box.cpp:
+        (RenderBox::setStyle):
+
 2005-04-14  David Hyatt  <hyatt@apple.com>
 
        3258403 and 3258402 can now be fixed.  min/max-width/height support is now complete.  This patch makes them
index 62116b202b9f74ecf3e14d800cd2fc43f6069c2e..0c21e6b97995b86d86186178487ccf4bf4777a43 100644 (file)
@@ -518,13 +518,12 @@ void KHTMLView::adjustViewSize()
     }
 }
 
-void KHTMLView::applyBodyScrollQuirk(khtml::RenderObject* o, ScrollBarMode& hMode, ScrollBarMode& vMode)
+void KHTMLView::applyOverflowToViewport(khtml::RenderObject* o, ScrollBarMode& hMode, ScrollBarMode& vMode)
 {
-    // Handle the overflow:hidden/scroll quirk for the body elements.  WinIE treats
+    // Handle the overflow:hidden/scroll case for the body/html elements.  WinIE treats
     // overflow:hidden and overflow:scroll on <body> as applying to the document's
-    // scrollbars.  The CSS2.1 draft has even added a sentence, "HTML UAs may apply overflow
-    // specified on the body or HTML elements to the viewport."  Since WinIE and Mozilla both
-    // do it, we will do it too for <body> elements.
+    // scrollbars.  The CSS2.1 draft states that HTML UAs should use the <html> or <body> element and XML/XHTML UAs should
+    // use the root element.
     switch(o->style()->overflow()) {
         case OHIDDEN:
             hMode = vMode = AlwaysOff;
@@ -604,6 +603,7 @@ void KHTMLView::layout()
     ScrollBarMode hMode = d->hmode;
     ScrollBarMode vMode = d->vmode;
     
+    RenderObject* rootRenderer = document->documentElement()->renderer();
     if (document->isHTMLDocument()) {
         NodeImpl *body = static_cast<HTMLDocumentImpl*>(document)->body();
         if (body && body->renderer()) {
@@ -612,10 +612,14 @@ void KHTMLView::layout()
                 vMode = AlwaysOff;
                 hMode = AlwaysOff;
             }
-            else if (body->id() == ID_BODY)
-                applyBodyScrollQuirk(body->renderer(), hMode, vMode); // Only applies to HTML UAs, not to XML/XHTML UAs
+            else if (body->id() == ID_BODY) {
+                RenderObject* o = (rootRenderer->style()->overflow() == OVISIBLE) ? body->renderer() : rootRenderer;
+                applyOverflowToViewport(o, hMode, vMode); // Only applies to HTML UAs, not to XML/XHTML UAs
+            }
         }
     }
+    else
+        applyOverflowToViewport(rootRenderer, hMode, vMode); // XML/XHTML UAs use the root element.
 
 #ifdef INSTRUMENT_LAYOUT_SCHEDULING
     if (d->firstLayout && !document->ownerElement())
index 5c21496f58bedea5323adf9ba573ddc8543ba208..7f3344c0e513a5c822f6ed1acf3b5cad2cf66e3f 100644 (file)
@@ -288,7 +288,7 @@ private:
                            int mouseEventType);
     bool dispatchDragEvent(int eventId, DOM::NodeImpl *dragTarget, const QPoint &loc, DOM::ClipboardImpl *clipboard);
 
-    void applyBodyScrollQuirk(khtml::RenderObject* o, ScrollBarMode& hMode, ScrollBarMode& vMode);
+    void applyOverflowToViewport(khtml::RenderObject* o, ScrollBarMode& hMode, ScrollBarMode& vMode);
 
 #if APPLE_CHANGES
     virtual bool isKHTMLView() const;
index d05e8205f1934d7f2e05b5ecf41862485ce111aa..dc4aef3f98e896dd9310fa2634bf7601a35441f3 100644 (file)
@@ -98,9 +98,9 @@ void RenderBox::setStyle(RenderStyle *_style)
 
     // FIXME: Note that we restrict overflow to blocks for now.  One day table bodies and cells 
     // will need to support overflow.
-    // We also deal with the body scroll quirk here, since it sets the scrollbars for the document.
-    if (_style->overflow() != OVISIBLE && isBlockFlow() && !isTableCell() &&
-        (!document()->isHTMLDocument() || !isBody()))
+    // We also handle <body> and <html>, whose overflow applies to the viewport.
+    if (_style->overflow() != OVISIBLE && isBlockFlow() && !isTableCell() && !isRoot() &&
+        (!isBody() || !document()->isHTMLDocument() || !(parent() && parent()->style()->overflow() == OVISIBLE)))
         setHasOverflowClip();
 
     if (requiresLayer()) {