[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