[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

hyatt hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:38:46 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 642b72a7108d47f1c5b35f3f0cfa85111aac1acf
Author: hyatt <hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Apr 25 21:14:28 2003 +0000

    	Part two of the overflow patch.  This adds the scrollbars and
    	patches the layers code, but it doesn't yet turn on the
    	overflow:auto capability.
    
            Reviewed by mjs/gramps
    
            * ForwardingHeaders/qscrollbar.h: Added.
            * WebCore.pbproj/project.pbxproj:
            * khtml/ecma/kjs_dom.cpp:
            (DOMNode::getValueProperty):
            (DOMNode::putValue):
            * khtml/ecma/kjs_dom.h:
            * khtml/ecma/kjs_dom.lut.h:
            * khtml/rendering/render_box.cpp:
            (RenderBox::contentWidth):
            (RenderBox::repaintRectangle):
            (RenderBox::calcAbsoluteHorizontal):
            (RenderBox::calcAbsoluteVertical):
            (RenderBox::lowestPosition):
            * khtml/rendering/render_layer.cpp:
            (RenderScrollMediator::slotValueChanged):
            (RenderLayer::RenderLayer):
            (RenderLayer::~RenderLayer):
            (RenderLayer::updateLayerPosition):
            (RenderLayer::scrollOffset):
            (RenderLayer::subtractScrollOffset):
            (RenderLayer::scrollToOffset):
            (RenderLayer::updateScrollPositionFromScrollbars):
            (RenderLayer::setHasHorizontalScrollbar):
            (RenderLayer::setHasVerticalScrollbar):
            (RenderLayer::verticalScrollbarWidth):
            (RenderLayer::horizontalScrollbarHeight):
            (RenderLayer::moveScrollbarsAside):
            (RenderLayer::positionScrollbars):
            (RenderLayer::checkScrollbarsAfterLayout):
            (RenderLayer::paintScrollbars):
            (RenderLayer::paint):
            (RenderLayer::nodeAtPoint):
            * khtml/rendering/render_layer.h:
            * khtml/rendering/render_object.cpp:
            (RenderObject::clientWidth):
            (RenderObject::clientHeight):
            (RenderObject::scrollWidth):
            (RenderObject::scrollHeight):
            (RenderObject::nodeAtPoint):
            * khtml/rendering/render_object.h:
            * kwq/KWQKHTMLPart.h:
            * kwq/KWQKHTMLPart.mm:
            (KWQKHTMLPart::passWidgetMouseDownEventToWidget):
            * kwq/KWQNamespace.h:
            * kwq/KWQScrollBar.h: Added.
            * kwq/KWQScrollBar.mm: Added.
            (-[KWQScrollBar initWithQScrollBar:]):
            (-[KWQScrollBar scroll:]):
            (:m_valueChanged):
            (QScrollBar::~QScrollBar):
            (QScrollBar::setValue):
            (QScrollBar::setSteps):
            (QScrollBar::setKnobProportion):
            (QScrollBar::scrollbarHit):
            (QScrollBar::valueChanged):
            * kwq/KWQSlot.mm:
            (KWQSlot::KWQSlot):
            (KWQSlot::call):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@4187 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index f9a1c5b..8a22c20 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,70 @@
+2003-04-25  David Hyatt  <hyatt at apple.com>
+
+	Part two of the overflow patch.  This adds the scrollbars and
+	patches the layers code, but it doesn't yet turn on the
+	overflow:auto capability.
+	
+        Reviewed by mjs/gramps
+
+        * ForwardingHeaders/qscrollbar.h: Added.
+        * WebCore.pbproj/project.pbxproj:
+        * khtml/ecma/kjs_dom.cpp:
+        (DOMNode::getValueProperty):
+        (DOMNode::putValue):
+        * khtml/ecma/kjs_dom.h:
+        * khtml/ecma/kjs_dom.lut.h:
+        * khtml/rendering/render_box.cpp:
+        (RenderBox::contentWidth):
+        (RenderBox::repaintRectangle):
+        (RenderBox::calcAbsoluteHorizontal):
+        (RenderBox::calcAbsoluteVertical):
+        (RenderBox::lowestPosition):
+        * khtml/rendering/render_layer.cpp:
+        (RenderScrollMediator::slotValueChanged):
+        (RenderLayer::RenderLayer):
+        (RenderLayer::~RenderLayer):
+        (RenderLayer::updateLayerPosition):
+        (RenderLayer::scrollOffset):
+        (RenderLayer::subtractScrollOffset):
+        (RenderLayer::scrollToOffset):
+        (RenderLayer::updateScrollPositionFromScrollbars):
+        (RenderLayer::setHasHorizontalScrollbar):
+        (RenderLayer::setHasVerticalScrollbar):
+        (RenderLayer::verticalScrollbarWidth):
+        (RenderLayer::horizontalScrollbarHeight):
+        (RenderLayer::moveScrollbarsAside):
+        (RenderLayer::positionScrollbars):
+        (RenderLayer::checkScrollbarsAfterLayout):
+        (RenderLayer::paintScrollbars):
+        (RenderLayer::paint):
+        (RenderLayer::nodeAtPoint):
+        * khtml/rendering/render_layer.h:
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::clientWidth):
+        (RenderObject::clientHeight):
+        (RenderObject::scrollWidth):
+        (RenderObject::scrollHeight):
+        (RenderObject::nodeAtPoint):
+        * khtml/rendering/render_object.h:
+        * kwq/KWQKHTMLPart.h:
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::passWidgetMouseDownEventToWidget):
+        * kwq/KWQNamespace.h:
+        * kwq/KWQScrollBar.h: Added.
+        * kwq/KWQScrollBar.mm: Added.
+        (-[KWQScrollBar initWithQScrollBar:]):
+        (-[KWQScrollBar scroll:]):
+        (:m_valueChanged):
+        (QScrollBar::~QScrollBar):
+        (QScrollBar::setValue):
+        (QScrollBar::setSteps):
+        (QScrollBar::setKnobProportion):
+        (QScrollBar::scrollbarHit):
+        (QScrollBar::valueChanged):
+        * kwq/KWQSlot.mm:
+        (KWQSlot::KWQSlot):
+        (KWQSlot::call):
+
 2003-04-24  David Hyatt  <hyatt at apple.com>
 
 	Rename inQuirksMode to inCompatMode.  Drop uses of it in 
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index f9a1c5b..8a22c20 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,70 @@
+2003-04-25  David Hyatt  <hyatt at apple.com>
+
+	Part two of the overflow patch.  This adds the scrollbars and
+	patches the layers code, but it doesn't yet turn on the
+	overflow:auto capability.
+	
+        Reviewed by mjs/gramps
+
+        * ForwardingHeaders/qscrollbar.h: Added.
+        * WebCore.pbproj/project.pbxproj:
+        * khtml/ecma/kjs_dom.cpp:
+        (DOMNode::getValueProperty):
+        (DOMNode::putValue):
+        * khtml/ecma/kjs_dom.h:
+        * khtml/ecma/kjs_dom.lut.h:
+        * khtml/rendering/render_box.cpp:
+        (RenderBox::contentWidth):
+        (RenderBox::repaintRectangle):
+        (RenderBox::calcAbsoluteHorizontal):
+        (RenderBox::calcAbsoluteVertical):
+        (RenderBox::lowestPosition):
+        * khtml/rendering/render_layer.cpp:
+        (RenderScrollMediator::slotValueChanged):
+        (RenderLayer::RenderLayer):
+        (RenderLayer::~RenderLayer):
+        (RenderLayer::updateLayerPosition):
+        (RenderLayer::scrollOffset):
+        (RenderLayer::subtractScrollOffset):
+        (RenderLayer::scrollToOffset):
+        (RenderLayer::updateScrollPositionFromScrollbars):
+        (RenderLayer::setHasHorizontalScrollbar):
+        (RenderLayer::setHasVerticalScrollbar):
+        (RenderLayer::verticalScrollbarWidth):
+        (RenderLayer::horizontalScrollbarHeight):
+        (RenderLayer::moveScrollbarsAside):
+        (RenderLayer::positionScrollbars):
+        (RenderLayer::checkScrollbarsAfterLayout):
+        (RenderLayer::paintScrollbars):
+        (RenderLayer::paint):
+        (RenderLayer::nodeAtPoint):
+        * khtml/rendering/render_layer.h:
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::clientWidth):
+        (RenderObject::clientHeight):
+        (RenderObject::scrollWidth):
+        (RenderObject::scrollHeight):
+        (RenderObject::nodeAtPoint):
+        * khtml/rendering/render_object.h:
+        * kwq/KWQKHTMLPart.h:
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::passWidgetMouseDownEventToWidget):
+        * kwq/KWQNamespace.h:
+        * kwq/KWQScrollBar.h: Added.
+        * kwq/KWQScrollBar.mm: Added.
+        (-[KWQScrollBar initWithQScrollBar:]):
+        (-[KWQScrollBar scroll:]):
+        (:m_valueChanged):
+        (QScrollBar::~QScrollBar):
+        (QScrollBar::setValue):
+        (QScrollBar::setSteps):
+        (QScrollBar::setKnobProportion):
+        (QScrollBar::scrollbarHit):
+        (QScrollBar::valueChanged):
+        * kwq/KWQSlot.mm:
+        (KWQSlot::KWQSlot):
+        (KWQSlot::call):
+
 2003-04-24  David Hyatt  <hyatt at apple.com>
 
 	Rename inQuirksMode to inCompatMode.  Drop uses of it in 
diff --git a/WebCore/ForwardingHeaders/qscrollbar.h b/WebCore/ForwardingHeaders/qscrollbar.h
new file mode 100644
index 0000000..88ae0bb
--- /dev/null
+++ b/WebCore/ForwardingHeaders/qscrollbar.h
@@ -0,0 +1 @@
+#include "KWQScrollBar.h"
diff --git a/WebCore/WebCore.pbproj/project.pbxproj b/WebCore/WebCore.pbproj/project.pbxproj
index 7e8f3c8..f4a04fc 100644
--- a/WebCore/WebCore.pbproj/project.pbxproj
+++ b/WebCore/WebCore.pbproj/project.pbxproj
@@ -493,6 +493,7 @@
 				F58786FD02DE3B8601EA4122,
 				F587870902DE3B8601EA4122,
 				F587871502DE3B8601EA4122,
+				BC7B2AFA0450824100A8000F,
 			);
 			isa = PBXHeadersBuildPhase;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -740,6 +741,7 @@
 				BC8F61880405949900A80004,
 				BC8F61890405949900A80004,
 				9325AABA041D0E9A00A9CAC5,
+				BC7B2AFB0450824100A8000F,
 			);
 			isa = PBXSourcesBuildPhase;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1523,6 +1525,30 @@
 			settings = {
 			};
 		};
+		BC7B2AF80450824100A8000F = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = KWQScrollBar.h;
+			refType = 4;
+		};
+		BC7B2AF90450824100A8000F = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = KWQScrollBar.mm;
+			refType = 4;
+		};
+		BC7B2AFA0450824100A8000F = {
+			fileRef = BC7B2AF80450824100A8000F;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		BC7B2AFB0450824100A8000F = {
+			fileRef = BC7B2AF90450824100A8000F;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
 		BC7C964E03E9EE7000A80004 = {
 			fileEncoding = 30;
 			isa = PBXFileReference;
@@ -1797,6 +1823,8 @@
 				F587854102DE375901EA4122,
 				F587854302DE375901EA4122,
 				F587854402DE375901EA4122,
+				BC7B2AF80450824100A8000F,
+				BC7B2AF90450824100A8000F,
 			);
 			isa = PBXGroup;
 			name = other;
diff --git a/WebCore/khtml/ecma/kjs_dom.cpp b/WebCore/khtml/ecma/kjs_dom.cpp
index a3764d0..48089fb 100644
--- a/WebCore/khtml/ecma/kjs_dom.cpp
+++ b/WebCore/khtml/ecma/kjs_dom.cpp
@@ -83,7 +83,7 @@ bool DOMNode::toBoolean(ExecState *) const
 }
 
 /* Source for DOMNodeTable. Use "make hashtables" to regenerate.
- at begin DOMNodeTable 53
+ at begin DOMNodeTable 55
   nodeName	DOMNode::NodeName	DontDelete|ReadOnly
   nodeValue	DOMNode::NodeValue	DontDelete
   nodeType	DOMNode::NodeType	DontDelete|ReadOnly
@@ -132,8 +132,10 @@ bool DOMNode::toBoolean(ExecState *) const
   offsetParent	DOMNode::OffsetParent		DontDelete|ReadOnly
   clientWidth	DOMNode::ClientWidth		DontDelete|ReadOnly
   clientHeight	DOMNode::ClientHeight		DontDelete|ReadOnly
-  scrollLeft	DOMNode::ScrollLeft		DontDelete|ReadOnly
-  scrollTop	DOMNode::ScrollTop		DontDelete|ReadOnly
+  scrollLeft	DOMNode::ScrollLeft		DontDelete
+  scrollTop	DOMNode::ScrollTop		DontDelete
+  scrollWidth   DOMNode::ScrollWidth            DontDelete|ReadOnly
+  scrollHeight  DOMNode::ScrollHeight           DontDelete|ReadOnly
 @end
 */
 Value DOMNode::tryGet(ExecState *exec, const Identifier &propertyName) const
@@ -254,25 +256,17 @@ Value DOMNode::getValueProperty(ExecState *exec, int token) const
       return getDOMNode(exec, par ? par->element() : 0);
     }
     case ClientWidth:
-      if (!rend)
-        return Undefined();
-      else
-        // "Width of the object including padding, but not including margin, border, or scroll bar."
-        return Number(rend->width() - rend->borderLeft() - rend->borderRight() );
+      return rend ? static_cast<Value>(Number(rend->clientWidth()) ) : Value(Undefined());
     case ClientHeight:
-      if (!rend)
-        return Undefined();
-      else
-        // "Width of the object including padding, but not including margin, border, or scroll bar."
-        return Number(rend->height() - rend->borderTop() - rend->borderBottom() );
+      return rend ? static_cast<Value>(Number(rend->clientHeight()) ) : Value(Undefined());
+    case ScrollWidth:
+        return rend ? static_cast<Value>(Number(rend->scrollWidth()) ) : Value(Undefined());
+    case ScrollHeight:
+        return rend ? static_cast<Value>(Number(rend->scrollHeight()) ) : Value(Undefined());
     case ScrollLeft:
-      if (!rend || !v)
-        return Undefined();
-      return Number(-rend->xPos() + v->contentsX());
+      return Number(rend && rend->layer() ? rend->layer()->scrollXOffset() : 0);
     case ScrollTop:
-      if (!rend || !v)
-        return Undefined();
-      return Number(-rend->yPos() + v->contentsY());
+      return Number(rend && rend->layer() ? rend->layer()->scrollYOffset() : 0);
     default:
       kdWarning() << "Unhandled token in DOMNode::getValueProperty : " << token << endl;
       break;
@@ -369,6 +363,18 @@ void DOMNode::putValue(ExecState *exec, int token, const Value& value, int /*att
   case OnUnload:
     setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value);
     break;
+  case ScrollTop: {
+    khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;
+    if (rend && rend->layer())
+        rend->layer()->scrollToYOffset(value.toInt32(exec));
+    break;
+  }
+  case ScrollLeft: {
+    khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;
+    if (rend && rend->layer())
+      rend->layer()->scrollToXOffset(value.toInt32(exec));
+    break;
+  }
   default:
     kdWarning() << "DOMNode::putValue unhandled token " << token << endl;
   }
diff --git a/WebCore/khtml/ecma/kjs_dom.h b/WebCore/khtml/ecma/kjs_dom.h
index a0c118e..f44217f 100644
--- a/WebCore/khtml/ecma/kjs_dom.h
+++ b/WebCore/khtml/ecma/kjs_dom.h
@@ -64,7 +64,7 @@ namespace KJS {
            OnMouseMove, OnMouseOut, OnMouseOver, OnMouseUp, OnMove, OnReset,
            OnResize, OnSelect, OnSubmit, OnUnload,
            OffsetLeft, OffsetTop, OffsetWidth, OffsetHeight, OffsetParent,
-           ClientWidth, ClientHeight, ScrollLeft, ScrollTop };
+           ClientWidth, ClientHeight, ScrollLeft, ScrollTop, ScrollWidth, ScrollHeight };
 
   protected:
     DOM::Node node;
diff --git a/WebCore/khtml/ecma/kjs_dom.lut.h b/WebCore/khtml/ecma/kjs_dom.lut.h
index 3d2d580..4b68329 100644
--- a/WebCore/khtml/ecma/kjs_dom.lut.h
+++ b/WebCore/khtml/ecma/kjs_dom.lut.h
@@ -28,74 +28,77 @@ const struct HashTable DOMNodeProtoTable = { 2, 16, DOMNodeProtoTableEntries, 13
 namespace KJS {
 
 const struct HashEntry DOMNodeTableEntries[] = {
-   { "offsetTop", DOMNode::OffsetTop, DontDelete|ReadOnly, 0, 0 },
-   { "onload", DOMNode::OnLoad, DontDelete, 0, 0 },
+   { "ondblclick", DOMNode::OnDblClick, DontDelete, 0, &DOMNodeTableEntries[58] },
+   { "onsubmit", DOMNode::OnSubmit, DontDelete, 0, 0 },
+   { 0, 0, 0, 0, 0 },
+   { "onmousemove", DOMNode::OnMouseMove, DontDelete, 0, 0 },
+   { "nextSibling", DOMNode::NextSibling, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[59] },
+   { "onerror", DOMNode::OnError, DontDelete, 0, &DOMNodeTableEntries[65] },
+   { 0, 0, 0, 0, 0 },
+   { "onkeypress", DOMNode::OnKeyPress, DontDelete, 0, 0 },
+   { "onmouseover", DOMNode::OnMouseOver, DontDelete, 0, 0 },
+   { "onkeyup", DOMNode::OnKeyUp, DontDelete, 0, 0 },
+   { "previousSibling", DOMNode::PreviousSibling, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[56] },
+   { "ownerDocument", DOMNode::OwnerDocument, DontDelete|ReadOnly, 0, 0 },
+   { "scrollWidth", DOMNode::ScrollWidth, DontDelete|ReadOnly, 0, 0 },
+   { "onmouseup", DOMNode::OnMouseUp, DontDelete, 0, 0 },
    { 0, 0, 0, 0, 0 },
+   { "nodeType", DOMNode::NodeType, DontDelete|ReadOnly, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { "onmouseout", DOMNode::OnMouseOut, DontDelete, 0, 0 },
+   { "offsetTop", DOMNode::OffsetTop, DontDelete|ReadOnly, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "localName", DOMNode::LocalName, DontDelete|ReadOnly, 0, 0 },
-   { "ownerDocument", DOMNode::OwnerDocument, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[64] },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "nodeName", DOMNode::NodeName, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[55] },
-   { "onselect", DOMNode::OnSelect, DontDelete, 0, 0 },
-   { "childNodes", DOMNode::ChildNodes, DontDelete|ReadOnly, 0, 0 },
-   { "previousSibling", DOMNode::PreviousSibling, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[53] },
-   { "onunload", DOMNode::OnUnload, DontDelete, 0, 0 },
+   { "onclick", DOMNode::OnClick, DontDelete, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "prefix", DOMNode::Prefix, DontDelete, 0, 0 },
-   { "lastChild", DOMNode::LastChild, DontDelete|ReadOnly, 0, 0 },
+   { "namespaceURI", DOMNode::NamespaceURI, DontDelete|ReadOnly, 0, 0 },
+   { "ondragdrop", DOMNode::OnDragDrop, DontDelete, 0, &DOMNodeTableEntries[66] },
+   { "localName", DOMNode::LocalName, DontDelete|ReadOnly, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { "clientHeight", DOMNode::ClientHeight, DontDelete|ReadOnly, 0, 0 },
-   { "onblur", DOMNode::OnBlur, DontDelete, 0, 0 },
-   { "onfocus", DOMNode::OnFocus, DontDelete, 0, 0 },
-   { "onmove", DOMNode::OnMove, DontDelete, 0, 0 },
+   { "childNodes", DOMNode::ChildNodes, DontDelete|ReadOnly, 0, 0 },
+   { "onload", DOMNode::OnLoad, DontDelete, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "onreset", DOMNode::OnReset, DontDelete, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "firstChild", DOMNode::FirstChild, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[61] },
-   { "nodeValue", DOMNode::NodeValue, DontDelete, 0, 0 },
-   { "onresize", DOMNode::OnResize, DontDelete, 0, 0 },
+   { "onselect", DOMNode::OnSelect, DontDelete, 0, 0 },
+   { "nodeName", DOMNode::NodeName, DontDelete|ReadOnly, 0, 0 },
+   { "offsetHeight", DOMNode::OffsetHeight, DontDelete|ReadOnly, 0, 0 },
+   { "onunload", DOMNode::OnUnload, DontDelete, 0, 0 },
+   { "lastChild", DOMNode::LastChild, DontDelete|ReadOnly, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "parentNode", DOMNode::ParentNode, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[56] },
+   { "onabort", DOMNode::OnAbort, DontDelete, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "attributes", DOMNode::Attributes, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[59] },
-   { "onkeydown", DOMNode::OnKeyDown, DontDelete, 0, 0 },
-   { "onkeyup", DOMNode::OnKeyUp, DontDelete, 0, 0 },
-   { "ondblclick", DOMNode::OnDblClick, DontDelete, 0, &DOMNodeTableEntries[63] },
    { "parentElement", DOMNode::ParentElement, DontDelete|ReadOnly, 0, 0 },
-   { "onchange", DOMNode::OnChange, DontDelete, 0, 0 },
-   { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "scrollLeft", DOMNode::ScrollLeft, DontDelete|ReadOnly, 0, 0 },
+   { "firstChild", DOMNode::FirstChild, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[67] },
    { 0, 0, 0, 0, 0 },
-   { "nodeType", DOMNode::NodeType, DontDelete|ReadOnly, 0, 0 },
-   { "nextSibling", DOMNode::NextSibling, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[60] },
-   { "onkeypress", DOMNode::OnKeyPress, DontDelete, 0, &DOMNodeTableEntries[57] },
-   { "onmousedown", DOMNode::OnMouseDown, DontDelete, 0, 0 },
-   { "onmouseup", DOMNode::OnMouseUp, DontDelete, 0, 0 },
-   { "onclick", DOMNode::OnClick, DontDelete, 0, 0 },
    { 0, 0, 0, 0, 0 },
-   { "onmouseover", DOMNode::OnMouseOver, DontDelete, 0, 0 },
-   { "namespaceURI", DOMNode::NamespaceURI, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[54] },
-   { "onabort", DOMNode::OnAbort, DontDelete, 0, 0 },
-   { "ondragdrop", DOMNode::OnDragDrop, DontDelete, 0, 0 },
-   { "onerror", DOMNode::OnError, DontDelete, 0, &DOMNodeTableEntries[58] },
-   { "onmousemove", DOMNode::OnMouseMove, DontDelete, 0, 0 },
-   { "onsubmit", DOMNode::OnSubmit, DontDelete, 0, 0 },
+   { "prefix", DOMNode::Prefix, DontDelete, 0, 0 },
+   { "parentNode", DOMNode::ParentNode, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[55] },
+   { "nodeValue", DOMNode::NodeValue, DontDelete, 0, &DOMNodeTableEntries[64] },
    { "offsetLeft", DOMNode::OffsetLeft, DontDelete|ReadOnly, 0, 0 },
-   { "offsetWidth", DOMNode::OffsetWidth, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[62] },
-   { "offsetHeight", DOMNode::OffsetHeight, DontDelete|ReadOnly, 0, 0 },
+   { "onblur", DOMNode::OnBlur, DontDelete, 0, &DOMNodeTableEntries[61] },
+   { "onresize", DOMNode::OnResize, DontDelete, 0, 0 },
+   { "attributes", DOMNode::Attributes, DontDelete|ReadOnly, 0, &DOMNodeTableEntries[57] },
+   { "onchange", DOMNode::OnChange, DontDelete, 0, 0 },
+   { "onfocus", DOMNode::OnFocus, DontDelete, 0, 0 },
+   { "onkeydown", DOMNode::OnKeyDown, DontDelete, 0, &DOMNodeTableEntries[60] },
+   { "onmousedown", DOMNode::OnMouseDown, DontDelete, 0, &DOMNodeTableEntries[62] },
+   { "onmove", DOMNode::OnMove, DontDelete, 0, &DOMNodeTableEntries[63] },
+   { "onreset", DOMNode::OnReset, DontDelete, 0, 0 },
+   { "offsetWidth", DOMNode::OffsetWidth, DontDelete|ReadOnly, 0, 0 },
    { "offsetParent", DOMNode::OffsetParent, DontDelete|ReadOnly, 0, 0 },
    { "clientWidth", DOMNode::ClientWidth, DontDelete|ReadOnly, 0, 0 },
-   { "scrollTop", DOMNode::ScrollTop, DontDelete|ReadOnly, 0, 0 }
+   { "scrollLeft", DOMNode::ScrollLeft, DontDelete, 0, 0 },
+   { "scrollTop", DOMNode::ScrollTop, DontDelete, 0, 0 },
+   { "scrollHeight", DOMNode::ScrollHeight, DontDelete|ReadOnly, 0, 0 }
 };
 
-const struct HashTable DOMNodeTable = { 2, 65, DOMNodeTableEntries, 53 };
+const struct HashTable DOMNodeTable = { 2, 68, DOMNodeTableEntries, 55 };
 
 }; // namespace
 
diff --git a/WebCore/khtml/rendering/render_box.cpp b/WebCore/khtml/rendering/render_box.cpp
index c20e40d..d0788f6 100644
--- a/WebCore/khtml/rendering/render_box.cpp
+++ b/WebCore/khtml/rendering/render_box.cpp
@@ -119,6 +119,9 @@ short RenderBox::contentWidth() const
     short w = m_width - borderLeft() - borderRight();
     w -= paddingLeft() + paddingRight();
 
+    if (style()->scrollsOverflow() && m_layer)
+        w -= m_layer->verticalScrollbarWidth();
+    
     //kdDebug( 6040 ) << "RenderBox::contentWidth(2) = " << w << endl;
     return w;
 }
@@ -455,20 +458,6 @@ void RenderBox::repaint(bool immediate)
 
 void RenderBox::repaintRectangle(int x, int y, int w, int h, bool immediate, bool f)
 {
-    if (style()->hidesOverflow()) {
-        int ow = style() ? style()->outlineWidth() : 0;
-        QRect boxRect(-ow, -ow, width()+ow*2, height()+ow*2);
-        m_layer->scrollOffset(x,y); // For overflow:auto/scroll.
-        QRect repaintRect(x, y, w, h);
-        if (!repaintRect.intersects(boxRect))
-            return;
-        repaintRect = repaintRect.intersect(boxRect);
-        x = repaintRect.x();
-        y = repaintRect.y();
-        w = repaintRect.width();
-        h = repaintRect.height();
-    }
-        
     x += m_x;
     y += m_y;
     
@@ -480,10 +469,24 @@ void RenderBox::repaintRectangle(int x, int y, int w, int h, bool immediate, boo
     
     if (style()->position()==FIXED) f=true;
 
-    
-    // kdDebug( 6040 ) << "RenderBox(" << renderName() << ")::repaintRectangle (" << x << "/" << y << ") (" << w << "/" << h << ")" << endl;
-    RenderObject *o = container();
-    if( o ) o->repaintRectangle(x, y, w, h, immediate, f);
+    RenderObject* o = container();
+    if (o) {
+        if (o->style()->hidesOverflow()) {
+            int ow = o->style() ? o->style()->outlineWidth() : 0;
+            QRect boxRect(-ow, -ow, o->width()+ow*2, o->height()+ow*2);
+            if (o->layer())
+                o->layer()->subtractScrollOffset(x,y); // For overflow:auto/scroll/hidden.
+            QRect repaintRect(x, y, w, h);
+            if (!repaintRect.intersects(boxRect))
+                return;
+            repaintRect = repaintRect.intersect(boxRect);
+            x = repaintRect.x();
+            y = repaintRect.y();
+            w = repaintRect.width();
+            h = repaintRect.height();
+        }
+        o->repaintRectangle(x, y, w, h, immediate, f);
+    }
 }
 
 void RenderBox::relativePositionOffset(int &tx, int &ty)
@@ -870,8 +873,9 @@ void RenderBox::calcAbsoluteHorizontal()
         //          3) precalc for case 2 below
 
         // all positioned elements are blocks, so that
-        // would be at the left edge
+        // would be at the left edge, but inset by our border/padding.
         RenderObject* po = parent();
+        static_distance += po->borderLeft() + po->paddingLeft();
         while (po && po!=containingBlock()) {
             static_distance+=po->xPos();
             po=po->parent();
@@ -887,7 +891,7 @@ void RenderBox::calcAbsoluteHorizontal()
             RenderObject* po = parent();
 
             static_distance = cw - po->width();
-
+            static_distance -= po->borderRight() + po->paddingRight();
             while (po && po!=containingBlock()) {
                 static_distance-=po->xPos();
                 po=po->parent();
@@ -1027,10 +1031,7 @@ void RenderBox::calcAbsoluteVertical()
         h = style()->height().width(ch);
         
         if (m_height-pab > h) {
-            if (style()->overflow() == OHIDDEN)
-                setOverflowHeight(h+pab);
-            else
-                setOverflowHeight(m_height + pab - (paddingBottom() + borderBottom()));
+            setOverflowHeight(m_height + pab - (paddingBottom() + borderBottom()));
             m_height = h+pab;
         }
     }
@@ -1051,13 +1052,16 @@ void RenderBox::calcAbsoluteVertical()
         //          3) precalc for case 2 below
 
         RenderObject* ro = previousSibling();
-        while ( ro && ro->isPositioned())
+        while ( ro && ro->isFloatingOrPositioned())
             ro = ro->previousSibling();
 
+        RenderObject* po = parent();
         if (ro)
             static_top = ro->yPos() + ro->marginBottom() + ro->height();
+        else
+            static_top += po->borderTop() + po->paddingTop();
         
-        for (RenderObject* po = parent(); po && po != cb; po = po->parent())
+        for (; po && po != cb; po = po->parent())
             static_top += po->yPos();
         
         if (h==AUTO || style()->top().isStatic())
@@ -1149,7 +1153,7 @@ void RenderBox::calcAbsoluteVertical()
 
 int RenderBox::lowestPosition(bool includeOverflowInterior) const
 {
-    return m_height + marginBottom();
+    return m_height;
 }
 
 int RenderBox::rightmostPosition(bool includeOverflowInterior) const
diff --git a/WebCore/khtml/rendering/render_html.cpp b/WebCore/khtml/rendering/render_html.cpp
index a76aa92..7737abc 100644
--- a/WebCore/khtml/rendering/render_html.cpp
+++ b/WebCore/khtml/rendering/render_html.cpp
@@ -123,6 +123,7 @@ void RenderHtml::layout()
     //kdDebug(0) << renderName() << " height = " << m_height << endl;
     RenderObject *r = root();
     int lp = r ? r->lowestPosition() : lowestPosition();
+    
     // margins of Html element can only be fixed, right?
     int margins  = style()->marginTop().isFixed() ? style()->marginTop().value : 0;
         margins += style()->marginBottom().isFixed() ? style()->marginBottom().value : 0;
diff --git a/WebCore/khtml/rendering/render_layer.cpp b/WebCore/khtml/rendering/render_layer.cpp
index 7e4a05e..0ac1574 100644
--- a/WebCore/khtml/rendering/render_layer.cpp
+++ b/WebCore/khtml/rendering/render_layer.cpp
@@ -45,19 +45,27 @@
 #include <kdebug.h>
 #include <assert.h>
 #include "khtmlview.h"
-#include "render_box.h"
+#include "render_block.h"
 #include "render_arena.h"
 #include "xml/dom_docimpl.h"
 
 using namespace DOM;
 using namespace khtml;
 
+QWidget* RenderLayer::gScrollBar = 0;
+
 #ifndef NDEBUG
 static bool inRenderLayerDetach;
 static bool inRenderLayerElementDetach;
 static bool inRenderZTreeNodeDetach;
 #endif
 
+void
+RenderScrollMediator::slotValueChanged(int val)
+{
+    m_layer->updateScrollPositionFromScrollbars();
+}
+
 RenderLayer::RenderLayer(RenderObject* object)
 : m_object( object ),
 m_parent( 0 ),
@@ -68,7 +76,14 @@ m_last( 0 ),
 m_height( 0 ),
 m_y( 0 ),
 m_x( 0 ),
-m_width( 0 )
+m_width( 0 ),
+m_scrollX( 0 ),
+m_scrollY( 0 ),
+m_scrollWidth( 0 ),
+m_scrollHeight( 0 ),
+m_hBar( 0 ),
+m_vBar( 0 ),
+m_scrollMediator( 0 )
 {
 }
 
@@ -77,6 +92,9 @@ RenderLayer::~RenderLayer()
     // Child layers will be deleted by their corresponding render objects, so
     // our destructor doesn't have to do anything.
     m_parent = m_previous = m_next = m_first = m_last = 0;
+    delete m_hBar;
+    delete m_vBar;
+    delete m_scrollMediator;
 }
 
 void RenderLayer::updateLayerPosition()
@@ -97,9 +115,16 @@ void RenderLayer::updateLayerPosition()
 
     if (m_object->isRelPositioned())
         static_cast<RenderBox*>(m_object)->relativePositionOffset(x, y);
+
+    // Subtract our parent's scroll offset.
+    if (parent())
+        parent()->subtractScrollOffset(x, y);
     
     setPos(x,y);
 
+    setWidth(m_object->width());
+    setHeight(m_object->height());
+    
     if (!m_object->style()->hidesOverflow()) {
         if (m_object->overflowWidth() > m_object->width())
             setWidth(m_object->overflowWidth());
@@ -257,7 +282,237 @@ RenderLayer::convertToLayerCoords(RenderLayer* ancestorLayer, int& x, int& y)
 void
 RenderLayer::scrollOffset(int& x, int& y)
 {
-    // FIXME: Implement for overflow:auto/scroll
+    x += scrollXOffset();
+    y += scrollYOffset();
+}
+
+void
+RenderLayer::subtractScrollOffset(int& x, int& y)
+{
+    x -= scrollXOffset();
+    y -= scrollYOffset();
+}
+
+void
+RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars)
+{
+    if (x < 0) x = 0;
+    if (y < 0) y = 0;
+    int maxX = m_scrollWidth - m_object->clientWidth();
+    int maxY = m_scrollHeight - m_object->clientHeight();
+    if (x > maxX) x = maxX;
+    if (y > maxY) y = maxY;
+
+    // FIXME: Eventually, we will want to perform a blit.  For now never
+    // blit, since the check for blitting is going to be very
+    // complicated (since it will involve testing whether our layer
+    // is either occluded by another layer or clipped by an enclosing
+    // layer or contains fixed backgrounds, etc.).
+    m_scrollX = x;
+    m_scrollY = y;
+
+    // FIXME: Fire the onscroll DOM event.
+    
+    // Just schedule a full repaint of our object.
+    m_object->repaint(true);
+    
+    if (updateScrollbars) {
+        if (m_hBar)
+            m_hBar->setValue(m_scrollX);
+        if (m_vBar)
+            m_vBar->setValue(m_scrollY);
+    }
+}
+
+void
+RenderLayer::updateScrollPositionFromScrollbars()
+{
+    bool needUpdate = false;
+    int newX = m_scrollX;
+    int newY = m_scrollY;
+    
+    if (m_hBar) {
+        newX = m_hBar->value();
+        if (newX != m_scrollX)
+           needUpdate = true;
+    }
+
+    if (m_vBar) {
+        newY = m_vBar->value();
+        if (newY != m_scrollY)
+           needUpdate = true;
+    }
+
+    if (needUpdate)
+        scrollToOffset(newX, newY, false);
+}
+
+void
+RenderLayer::setHasHorizontalScrollbar(bool hasScrollbar)
+{
+    if (hasScrollbar && !m_hBar) {
+        QScrollView* scrollView = m_object->element()->getDocument()->view();
+        m_hBar = new QScrollBar(Qt::Horizontal, scrollView);
+        scrollView->addChild(m_hBar, 0, -50000);
+        if (!m_scrollMediator)
+            m_scrollMediator = new RenderScrollMediator(this);
+        m_scrollMediator->connect(m_hBar, SIGNAL(valueChanged(int)), SLOT(slotValueChanged(int)));
+    }
+    else if (!hasScrollbar && m_hBar) {
+        m_scrollMediator->disconnect(m_hBar, SIGNAL(valueChanged(int)),
+                                     m_scrollMediator, SLOT(slotValueChanged(int)));
+        delete m_hBar;
+        m_hBar = 0;
+    }
+}
+
+void
+RenderLayer::setHasVerticalScrollbar(bool hasScrollbar)
+{
+    if (hasScrollbar && !m_vBar) {
+        QScrollView* scrollView = m_object->element()->getDocument()->view();
+        m_vBar = new QScrollBar(Qt::Vertical, scrollView);
+        scrollView->addChild(m_vBar, 0, -50000);
+        if (!m_scrollMediator)
+            m_scrollMediator = new RenderScrollMediator(this);
+        m_scrollMediator->connect(m_vBar, SIGNAL(valueChanged(int)), SLOT(slotValueChanged(int)));
+    }
+    else if (!hasScrollbar && m_vBar) {
+        m_scrollMediator->disconnect(m_vBar, SIGNAL(valueChanged(int)),
+                                     m_scrollMediator, SLOT(slotValueChanged(int)));
+        delete m_vBar;
+        m_vBar = 0;
+    }
+}
+
+int
+RenderLayer::verticalScrollbarWidth()
+{
+    if (!m_vBar)
+        return 0;
+
+    return m_vBar->width();
+}
+
+int
+RenderLayer::horizontalScrollbarHeight()
+{
+    if (!m_hBar)
+        return 0;
+
+    return m_hBar->height();
+}
+
+void
+RenderLayer::moveScrollbarsAside()
+{
+    if (m_hBar)
+        m_hBar->move(0, -50000);
+    if (m_vBar)
+        m_vBar->move(0, -50000);
+}
+
+void
+RenderLayer::positionScrollbars(const QRect& absBounds)
+{
+    if (m_vBar) {
+        m_vBar->move(absBounds.x()+absBounds.width()-m_object->borderRight()-m_vBar->width(),
+                     absBounds.y()+m_object->borderTop());
+        m_vBar->resize(m_vBar->width(), absBounds.height() -
+                       (m_object->borderTop()+m_object->borderBottom()) -
+                       (m_hBar ? m_hBar->height()-1 : 0));
+    }
+
+    if (m_hBar) {
+        m_hBar->move(absBounds.x()+m_object->borderLeft(),
+                     absBounds.y()+absBounds.height()-m_object->borderBottom()-m_hBar->height());
+        m_hBar->resize(absBounds.width() - (m_object->borderLeft()+m_object->borderRight()) -
+                       (m_vBar ? m_vBar->width()-1 : 0),
+                       m_hBar->height());
+    }
+}
+
+#define LINE_STEP   10
+#define PAGE_KEEP   40
+
+void
+RenderLayer::checkScrollbarsAfterLayout()
+{
+    updateLayerPosition();
+    
+    int rightPos = m_object->rightmostPosition();
+    int bottomPos = m_object->lowestPosition();
+
+    int clientWidth = m_object->clientWidth();
+    int clientHeight = m_object->clientHeight();
+    m_scrollWidth = clientWidth;
+    m_scrollHeight = clientHeight;
+    
+    if (rightPos - m_object->borderLeft() > m_scrollWidth)
+        m_scrollWidth = rightPos - m_object->borderLeft();
+    if (bottomPos - m_object->borderTop() > m_scrollHeight)
+        m_scrollHeight = bottomPos - m_object->borderTop();
+    
+    bool needHorizontalBar = rightPos > m_width;
+    bool needVerticalBar = bottomPos > m_height;
+
+    bool haveHorizontalBar = m_hBar;
+    bool haveVerticalBar = m_vBar;
+
+    // overflow:scroll should just enable/disable.
+    if (m_object->style()->overflow() == OSCROLL) {
+        m_hBar->setEnabled(needHorizontalBar);
+        m_vBar->setEnabled(needVerticalBar);
+    }
+
+    // overflow:auto may need to lay out again if scrollbars got added/removed.
+    bool scrollbarsChanged = (m_object->style()->overflow() == OAUTO) &&
+        (haveHorizontalBar != needHorizontalBar || haveVerticalBar != needVerticalBar);    
+    if (scrollbarsChanged) {
+        setHasHorizontalScrollbar(needHorizontalBar);
+        setHasVerticalScrollbar(needVerticalBar);
+       
+        m_object->setLayouted(false);
+	/* FIXME        if (m_object->isRenderBlock())
+            static_cast<RenderBlock*>(m_object)->layoutBlock(true);
+        else
+            m_object->layout();
+	*/
+	return;
+    }
+
+    // Set up the range (and page step/line step).
+    if (m_hBar) {
+        int pageStep = (clientWidth-PAGE_KEEP);
+        if (pageStep < 0) pageStep = clientWidth;
+        m_hBar->setSteps(LINE_STEP, pageStep);
+#ifdef APPLE_CHANGES
+        m_hBar->setKnobProportion(clientWidth, m_scrollWidth);
+#else
+        m_hBar->setRange(0, m_scrollWidth-clientWidth);
+#endif
+    }
+    if (m_vBar) {
+        int pageStep = (clientHeight-PAGE_KEEP);
+        if (pageStep < 0) pageStep = clientHeight;
+        m_vBar->setSteps(LINE_STEP, pageStep);
+#ifdef APPLE_CHANGES
+        m_vBar->setKnobProportion(clientHeight, m_scrollHeight);
+#else
+        m_vBar->setRange(0, m_scrollHeight-clientHeight);
+#endif
+    }
+}
+
+void
+RenderLayer::paintScrollbars(QPainter* p, int x, int y, int w, int h)
+{
+#if APPLE_CHANGES
+    if (m_hBar)
+        m_hBar->paint(p, QRect(x, y, w, h));
+    if (m_vBar)
+        m_vBar->paint(p, QRect(x, y, w, h));
+#endif
 }
 
 void
@@ -345,6 +600,9 @@ RenderLayer::paint(QPainter *p, int x, int y, int w, int h, bool selectionOnly)
             }
         }
 
+        if (currRect.isEmpty())
+            continue;
+        
         if (selectionOnly) {
             elt->layer->renderer()->paint(p, x, y, w, h,
                                           elt->absBounds.x() - elt->layer->renderer()->xPos(),
@@ -363,6 +621,15 @@ RenderLayer::paint(QPainter *p, int x, int y, int w, int h, bool selectionOnly)
                                         elt->absBounds.x() - elt->layer->renderer()->xPos(),
                                         elt->absBounds.y() - elt->layer->renderer()->yPos(),
                                         PaintActionForeground);
+
+            // Position our scrollbars.
+            elt->layer->positionScrollbars(elt->absBounds);
+
+#if APPLE_CHANGES
+            // Our widgets paint exactly when we tell them to, so that they work properly with
+            // z-index.
+            elt->layer->paintScrollbars(p, x, y, w, h);
+#endif
         }
     }
     
@@ -408,6 +675,9 @@ RenderLayer::clearHoverAndActiveState(RenderObject* obj)
 bool
 RenderLayer::nodeAtPoint(RenderObject::NodeInfo& info, int x, int y)
 {
+    // Clear out our global scrollbar tracking variable.
+    gScrollBar = 0;
+    
     bool inside = false;
     RenderLayer* insideLayer = 0;
     QRect damageRect(m_x, m_y, m_width, m_height);
diff --git a/WebCore/khtml/rendering/render_layer.h b/WebCore/khtml/rendering/render_layer.h
index 005fbe7..0eb002b 100644
--- a/WebCore/khtml/rendering/render_layer.h
+++ b/WebCore/khtml/rendering/render_layer.h
@@ -50,6 +50,7 @@
 
 #include "render_object.h"
 #include <qvector.h>
+#include <qscrollbar.h>
 
 namespace khtml {
     class RenderStyle;
@@ -59,6 +60,18 @@ namespace khtml {
     class RenderText;
     class RenderFrameSet;
     class RenderObject;
+
+class RenderScrollMediator: public QObject
+{
+public:
+    RenderScrollMediator(RenderLayer* layer)
+    :m_layer(layer) {}
+
+    void slotValueChanged(int);
+    
+private:
+    RenderLayer* m_layer;
+};
     
 class RenderLayer
 {
@@ -90,7 +103,9 @@ public:
     int yPos() const { return m_y; }
     short width() const { return m_width; }
     int height() const { return m_height; }
-
+    short scrollWidth() const { return m_scrollWidth; }
+    int scrollHeight() const { return m_scrollHeight; }
+    
     void setWidth( int width ) {
         m_width = width;
     }
@@ -102,7 +117,26 @@ public:
         m_y = yPos;
     }
 
+    // Scrolling methods for layers that can scroll their overflow.
     void scrollOffset(int& x, int& y);
+    void subtractScrollOffset(int& x, int& y);
+    short scrollXOffset() { return m_scrollX; }
+    int scrollYOffset() { return m_scrollY; }
+    void scrollToOffset(int x, int y, bool updateScrollbars = true);
+    void scrollToXOffset(int x) { scrollToOffset(x, m_scrollY); }
+    void scrollToYOffset(int y) { scrollToOffset(m_scrollX, y); }
+    void setHasHorizontalScrollbar(bool hasScrollbar);
+    void setHasVerticalScrollbar(bool hasScrollbar);
+    QWidget* horizontalScrollbar() { return m_hBar; }
+    QWidget* verticalScrollbar() { return m_vBar; }
+    int verticalScrollbarWidth();
+    int horizontalScrollbarHeight();
+    void moveScrollbarsAside();
+    void positionScrollbars(const QRect& absBounds);
+    void paintScrollbars(QPainter* p, int x, int y, int w, int h);
+    void checkScrollbarsAfterLayout();
+    void slotValueChanged(int);
+    void updateScrollPositionFromScrollbars();
     
     void updateLayerPosition();
     
@@ -238,7 +272,9 @@ public:
       // The normal operator new is disallowed.
       void* operator new(size_t sz) throw();
     };
-    
+
+    static QWidget* gScrollBar;
+
     // For debugging.
     QPtrVector<RenderLayerElement> elementList(RenderZTreeNode *&node);
       
@@ -324,6 +360,19 @@ protected:
     int m_y;
     short m_x;
     short m_width;
+
+    // Our scroll offsets if the view is scrolled.
+    short m_scrollX;
+    int m_scrollY;
+
+    // The width/height of our scrolled area.
+    short m_scrollWidth;
+    short m_scrollHeight;
+    
+    // For layers with overflow, we have a pair of scrollbars.
+    QScrollBar* m_hBar;
+    QScrollBar* m_vBar;
+    RenderScrollMediator* m_scrollMediator;
 };
 
 }; // namespace
diff --git a/WebCore/khtml/rendering/render_object.cpp b/WebCore/khtml/rendering/render_object.cpp
index 1302cd9..1faa6a0 100644
--- a/WebCore/khtml/rendering/render_object.cpp
+++ b/WebCore/khtml/rendering/render_object.cpp
@@ -350,6 +350,36 @@ RenderObject* RenderObject::offsetParent() const
     return curr;
 }
 
+// More IE extensions.  clientWidth and clientHeight represent the interior of an object
+// excluding border and scrollbar.
+short
+RenderObject::clientWidth() const
+{
+    return width() - borderLeft() - borderRight() -
+        (layer() ? layer()->verticalScrollbarWidth() : 0);
+}
+
+short
+RenderObject::clientHeight() const
+{
+    return height() - borderTop() - borderBottom() -
+      (layer() ? layer()->horizontalScrollbarHeight() : 0);
+}
+
+// scrollWidth/scrollHeight will be the same as clientWidth/clientHeight unless the
+// object has overflow:hidden/scroll/auto specified and also has overflow.
+short
+RenderObject::scrollWidth() const
+{
+    return (style()->hidesOverflow() && layer()) ? layer()->scrollWidth() : clientWidth();
+}
+
+short
+RenderObject::scrollHeight() const
+{
+    return (style()->hidesOverflow() && layer()) ? layer()->scrollHeight() : clientHeight();
+}
+
 void RenderObject::markAllDescendantsWithFloatsForLayout(RenderObject*)
 {
 }
@@ -1261,13 +1291,20 @@ bool RenderObject::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx, int _ty,
     int tx = _tx + xPos();
     int ty = _ty + yPos();
     
-    inside |= (style()->visibility() != HIDDEN && ((_y >= ty) && (_y < ty + overflowHeight()) &&
-                  (_x >= tx) && (_x < tx + overflowWidth()))) || isBody() || isHtml();
+    inside |= (style()->visibility() != HIDDEN && ((_y >= ty) && (_y < ty + effectiveHeight()) &&
+                  (_x >= tx) && (_x < tx + effectiveWidth()))) || isBody() || isHtml();
     
     // ### table should have its own, more performant method
-    if (overhangingContents() || isInline() || isRoot() || isTableRow() || isTableSection() || inside || mouseInside() || (childrenInline() && firstChild() && firstChild()->isCompact())) {
+    if (/* FIXME (!isRenderBlock() ||
+	  !static_cast<RenderBlock*>(this)->isPointInScrollbar(_x, _y, _tx, _ty)) &&*/
+        (overhangingContents() || isInline() || isRoot() || isTableRow() || isTableSection() || inside || mouseInside() || (childrenInline() && firstChild() && firstChild()->isCompact()))) {
+        int stx = _tx + xPos();
+        int sty = _ty + yPos();
+        if (style()->hidesOverflow() && layer())
+            layer()->subtractScrollOffset(stx, sty);
         for (RenderObject* child = lastChild(); child; child = child->previousSibling())
-            if (!child->layer() && !child->isFloating() && child->nodeAtPoint(info, _x, _y, _tx+xPos(), _ty+yPos()))
+            if (!child->layer() && !child->isFloating() &&
+                child->nodeAtPoint(info, _x, _y, stx, sty))
                 inside = true;
     }
 
diff --git a/WebCore/khtml/rendering/render_object.h b/WebCore/khtml/rendering/render_object.h
index 973328d..d6dc223 100644
--- a/WebCore/khtml/rendering/render_object.h
+++ b/WebCore/khtml/rendering/render_object.h
@@ -429,7 +429,17 @@ public:
     virtual int offsetLeft() const;
     virtual int offsetTop() const;
     virtual RenderObject* offsetParent() const;
-    
+
+    // More IE extensions.  clientWidth and clientHeight represent the interior of an object
+    // excluding border and scrollbar.
+    short clientWidth() const;
+    short clientHeight() const;
+
+    // scrollWidth/scrollHeight will be the same as clientWidth/clientHeight unless the
+    // object has overflow:hidden/scroll/auto specified and also has overflow.
+    short scrollWidth() const;
+    short scrollHeight() const;
+
     // The following seven functions are used to implement collapsing margins.
     // All objects know their maximal positive and negative margins.  The
     // formula for computing a collapsed margin is |maxPosMargin|-|maxNegmargin|.
diff --git a/WebCore/kwq/KWQKHTMLPart.h b/WebCore/kwq/KWQKHTMLPart.h
index e53c7c5..2559746 100644
--- a/WebCore/kwq/KWQKHTMLPart.h
+++ b/WebCore/kwq/KWQKHTMLPart.h
@@ -213,7 +213,8 @@ private:
 
     bool passWidgetMouseDownEventToWidget(khtml::MouseEvent *);
     bool passWidgetMouseDownEventToWidget(khtml::RenderWidget *);
-
+    bool passWidgetMouseDownEventToWidget(QWidget *);
+    
     void setPolicyBaseURL(const DOM::DOMString &);
     
     NSView *mouseDownViewIfStillGood();
diff --git a/WebCore/kwq/KWQKHTMLPart.mm b/WebCore/kwq/KWQKHTMLPart.mm
index c6fe277..64845a3 100644
--- a/WebCore/kwq/KWQKHTMLPart.mm
+++ b/WebCore/kwq/KWQKHTMLPart.mm
@@ -74,6 +74,7 @@ using khtml::RenderStyle;
 using khtml::RenderText;
 using khtml::RenderWidget;
 using khtml::RenderTableCell;
+using khtml::RenderLayer;
 using khtml::VISIBLE;
 
 using KIO::Job;
@@ -1291,8 +1292,14 @@ bool KWQKHTMLPart::passWidgetMouseDownEventToWidget(khtml::MouseEvent *event)
 {
     // Figure out which view to send the event to.
     RenderObject *target = event->innerNode().handle()->renderer();
-    if (!target || !target->isWidget()) {
+    if (!target)
         return false;
+
+    QWidget* widget = RenderLayer::gScrollBar;
+    if (!widget) {
+        if (!target->isWidget())
+            return false;
+        widget = static_cast<RenderWidget *>(target)->widget();
     }
 
     // Doubleclick events don't exist in Cocoa.  Since passWidgetMouseDownEventToWidget will
@@ -1300,18 +1307,23 @@ bool KWQKHTMLPart::passWidgetMouseDownEventToWidget(khtml::MouseEvent *event)
     // don't correspond to Cocoa events.  The mousedown/ups will have already been passed on as
     // part of the pressed/released handling.
     if (!MouseDoubleClickEvent::test(event))
-        return passWidgetMouseDownEventToWidget(static_cast<RenderWidget *>(target));
+        return passWidgetMouseDownEventToWidget(widget);
     else
         return true;
 }
 
 bool KWQKHTMLPart::passWidgetMouseDownEventToWidget(RenderWidget *renderWidget)
 {
-    QWidget *widget = renderWidget->widget();
+    return passWidgetMouseDownEventToWidget(renderWidget->widget());
+}
+
+bool KWQKHTMLPart::passWidgetMouseDownEventToWidget(QWidget* widget)
+{
     if (!widget) {
         ERROR("hit a RenderWidget without a corresponding QWidget, means a frame is half-constructed");
         return true;
     }
+    
     NSView *nodeView = widget->getView();
     ASSERT(nodeView);
     ASSERT([nodeView superview]);
diff --git a/WebCore/kwq/KWQNamespace.h b/WebCore/kwq/KWQNamespace.h
index 605ef60..2b3e5e8 100644
--- a/WebCore/kwq/KWQNamespace.h
+++ b/WebCore/kwq/KWQNamespace.h
@@ -63,6 +63,11 @@ public:
 	WordBreak	= 0x0400,
     };
 
+    enum Orientation {
+        Horizontal,
+        Vertical
+    };
+    
     enum PenStyle {
         NoPen,
         SolidLine,
diff --git a/WebCore/kwq/KWQComboBox.h b/WebCore/kwq/KWQScrollBar.h
similarity index 61%
copy from WebCore/kwq/KWQComboBox.h
copy to WebCore/kwq/KWQScrollBar.h
index 95a0a5e..c4ee4fd 100644
--- a/WebCore/kwq/KWQComboBox.h
+++ b/WebCore/kwq/KWQScrollBar.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2001, 2002 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,45 +23,44 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#ifndef QCOMBOBOX_H_
-#define QCOMBOBOX_H_
+#ifndef KWQSCROLLBAR_H_
+#define KWQSCROLLBAR_H_
 
-#include "KWQListBox.h"
-#include "KWQWidget.h"
+#include <qwidget.h>
+#include "KWQNamespace.h"
 
 #ifdef __OBJC__
- at class KWQComboBoxAdapter;
+ at class NSScroller;
 #else
-class KWQComboBoxAdapter;
+class NSScroller;
+typedef int NSScrollerPart;
 #endif
 
-class QComboBox : public QWidget {
+class QScrollBar : public QWidget {
 public:
-    QComboBox();
-    ~QComboBox();
-    
-    void clear();
-    void insertItem(const QString &text, int index=-1);
-
-    int currentItem() const;
-    void setCurrentItem(int);
+    QScrollBar(Qt::Orientation orientation, QWidget* parent);
+    ~QScrollBar();
 
-    QListBox *listBox() const { return 0; }
-    void popup() { }
-    
-    QSize sizeHint() const;
-    QRect frameGeometry() const;
-    void setFrameGeometry(const QRect &);
-    int baselinePosition() const;
+    Qt::Orientation orientation() { return m_orientation; };
 
-    void activated() { _activated.call(currentItem()); }
+    int value() { return m_currentPos; }
+    void setValue(int v);
 
+    void setSteps(int lineStep, int pageStep);
+    void setKnobProportion(int visibleSize, int totalSize);
+    
+    void scrollbarHit(NSScrollerPart hitPart);
+    void valueChanged();
+    
 private:
-    KWQComboBoxAdapter *_adapter;
-    mutable float _width;
-    mutable bool _widthGood;
-
-    KWQSignal _activated;
+    Qt::Orientation m_orientation : 1;
+    NSScroller* m_scroller;
+    int m_visibleSize;
+    int m_totalSize;
+    int m_currentPos;
+    int m_lineStep;
+    int m_pageStep;
+    KWQSignal m_valueChanged;
 };
 
 #endif
diff --git a/WebCore/kwq/KWQScrollBar.mm b/WebCore/kwq/KWQScrollBar.mm
new file mode 100644
index 0000000..e90053c
--- /dev/null
+++ b/WebCore/kwq/KWQScrollBar.mm
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+                                        * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+                                        * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "KWQScrollBar.h"
+
+ at interface KWQScrollBar : NSScroller
+{
+    QScrollBar* scrollBar;
+}
+
+- (id)initWithQScrollBar:(QScrollBar*)s;
+
+ at end
+
+ at implementation KWQScrollBar
+
+
+- (id)initWithQScrollBar:(QScrollBar*)s
+{
+    scrollBar = s;
+
+    // Cocoa scrollbars just set their orientation by examining their own
+    // dimensions, so we have to do this unsavory hack.
+    NSRect orientation;
+    orientation.origin.x = orientation.origin.y = 0;
+    if ( s->orientation() == Qt::Vertical ) {
+        orientation.size.width = [NSScroller scrollerWidth];
+        orientation.size.height = 100;
+    }
+    else {
+        orientation.size.width = 100;
+        orientation.size.height = [NSScroller scrollerWidth];
+    }
+    id result = [self initWithFrame: orientation];
+    [result setEnabled: YES];
+    [self setTarget:self];
+    [self setAction:@selector(scroll:)];
+    return result;
+}
+
+-(IBAction)scroll:(NSScroller*)sender
+{
+    scrollBar->scrollbarHit([sender hitPart]);
+}
+ at end
+
+QScrollBar::QScrollBar(Qt::Orientation orientation, QWidget* parent)
+:m_valueChanged(this, SIGNAL(valueChanged(int)))
+{
+    m_orientation = orientation;
+    m_scroller = [[KWQScrollBar alloc] initWithQScrollBar:this];
+    m_visibleSize = 0;
+    m_totalSize = 0;
+    m_currentPos = 0;
+    m_lineStep = 0;
+    m_pageStep = 0;
+    setView(m_scroller);
+    setFocusPolicy(NoFocus);
+    [parent->getView() addSubview: m_scroller];
+    [m_scroller release];
+}
+
+QScrollBar::~QScrollBar()
+{
+    [m_scroller removeFromSuperview];
+}
+
+void QScrollBar::setValue(int v)
+{
+    int maxPos = m_totalSize - m_visibleSize;
+    if (v < 0) v = 0;
+    if (v > maxPos)
+        v = maxPos;
+    if (m_currentPos == v)
+        return; // Our value stayed the same.
+    m_currentPos = v;
+    [m_scroller setFloatValue: (float)m_currentPos/maxPos
+               knobProportion: [m_scroller knobProportion]];
+    valueChanged(); // Emit the signal that indicates our value has changed.
+}
+
+void QScrollBar::setSteps(int lineStep, int pageStep)
+{
+    m_lineStep = lineStep;
+    m_pageStep = pageStep;
+}
+
+void QScrollBar::setKnobProportion(int visibleArea, int totalArea)
+{
+    m_visibleSize = visibleArea;
+    m_totalSize = totalArea;
+    float val = (float)m_visibleSize/m_totalSize;
+    if (val == [m_scroller knobProportion] || val < 0.0)
+        return;
+    [m_scroller setFloatValue: [m_scroller floatValue] knobProportion: val];
+}
+
+void QScrollBar::scrollbarHit(NSScrollerPart hitPart)
+{
+    int maxPos = m_totalSize - m_visibleSize;
+    if (maxPos <= 0)
+        return; // Impossible to scroll anywhere.
+    
+    int newPos = m_currentPos;
+    switch (hitPart) {
+        case NSScrollerDecrementLine:
+            newPos -= m_lineStep;
+            break;
+        case NSScrollerIncrementLine:
+            newPos += m_lineStep;
+            break;
+        case NSScrollerDecrementPage:
+            newPos -= m_pageStep;
+            break;
+        case NSScrollerIncrementPage:
+            newPos += m_pageStep;
+            break;
+
+            // If the thumb is hit, then the scrollbar changed its value for us.
+        case NSScrollerKnob:
+        case NSScrollerKnobSlot:
+            newPos = (int)([m_scroller floatValue]*maxPos);
+            break;
+        default: ;
+    }
+
+    setValue(newPos);
+}
+
+void QScrollBar::valueChanged()
+{
+    m_valueChanged.call(m_currentPos);
+}
diff --git a/WebCore/kwq/KWQSlot.mm b/WebCore/kwq/KWQSlot.mm
index 817e332..1c90438 100644
--- a/WebCore/kwq/KWQSlot.mm
+++ b/WebCore/kwq/KWQSlot.mm
@@ -31,6 +31,7 @@
 #import "khtml_part.h"
 #import "kjs_window.h"
 #import "render_form.h"
+#import "render_layer.h"
 
 using DOM::DocumentImpl;
 using khtml::CachedObject;
@@ -42,6 +43,7 @@ using khtml::RenderLineEdit;
 using khtml::RenderSelect;
 using khtml::RenderTextArea;
 using khtml::RenderWidget;
+using khtml::RenderScrollMediator;
 using KIO::Job;
 using KJS::WindowQObject;
 
@@ -65,6 +67,7 @@ enum FunctionNumber {
     slotSubmitFormAgain,
     slotTextChanged,
     slotTextChangedWithString,
+    slotValueChanged,
     slotWidgetDestructed
 };
 
@@ -90,6 +93,7 @@ KWQSlot::KWQSlot(QObject *object, const char *member)
     CASE(slotSelectionChanged, (), RenderSelect)
     CASE(slotStateChanged, (int), RenderCheckBox)
     CASE(slotTextChanged, (), RenderTextArea)
+    CASE(slotValueChanged, (int), RenderScrollMediator)
     CASE(slotWidgetDestructed, (), RenderWidget)
         
     #undef CASE
@@ -180,6 +184,9 @@ void KWQSlot::call(int i) const
         case slotSelected:
             static_cast<RenderSelect *>(m_object.pointer())->slotSelected(i);
             return;
+        case slotValueChanged:
+            static_cast<RenderScrollMediator *>(m_object.pointer())->slotValueChanged(i);
+            return;
     }
     
     call();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list