OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 } | 119 } |
120 | 120 |
121 void ClipRects::destroy(RenderArena* renderArena) | 121 void ClipRects::destroy(RenderArena* renderArena) |
122 { | 122 { |
123 delete this; | 123 delete this; |
124 | 124 |
125 // Recover the size left there for us by operator delete and free the memory
. | 125 // Recover the size left there for us by operator delete and free the memory
. |
126 renderArena->free(*(size_t *)this, this); | 126 renderArena->free(*(size_t *)this, this); |
127 } | 127 } |
128 | 128 |
129 RenderLayer::RenderLayer(RenderBoxModelObject* renderer) | 129 RenderLayer::RenderLayer(RenderBox* renderer) |
130 : m_renderer(renderer) | 130 : m_renderer(renderer) |
131 , m_parent(0) | 131 , m_parent(0) |
132 , m_previous(0) | 132 , m_previous(0) |
133 , m_next(0) | 133 , m_next(0) |
134 , m_first(0) | 134 , m_first(0) |
135 , m_last(0) | 135 , m_last(0) |
136 , m_relX(0) | 136 , m_relX(0) |
137 , m_relY(0) | 137 , m_relY(0) |
138 , m_x(0) | 138 , m_x(0) |
139 , m_y(0) | 139 , m_y(0) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 } | 221 } |
222 | 222 |
223 #if USE(ACCELERATED_COMPOSITING) | 223 #if USE(ACCELERATED_COMPOSITING) |
224 RenderLayerCompositor* RenderLayer::compositor() const | 224 RenderLayerCompositor* RenderLayer::compositor() const |
225 { | 225 { |
226 ASSERT(renderer()->view()); | 226 ASSERT(renderer()->view()); |
227 return renderer()->view()->compositor(); | 227 return renderer()->view()->compositor(); |
228 } | 228 } |
229 #endif // USE(ACCELERATED_COMPOSITING) | 229 #endif // USE(ACCELERATED_COMPOSITING) |
230 | 230 |
231 void RenderLayer::setStaticY(int staticY) | |
232 { | |
233 if (m_staticY == staticY) | |
234 return; | |
235 m_staticY = staticY; | |
236 renderer()->setChildNeedsLayout(true, false); | |
237 } | |
238 | |
239 void RenderLayer::updateLayerPositions(bool doFullRepaint, bool checkForRepaint) | 231 void RenderLayer::updateLayerPositions(bool doFullRepaint, bool checkForRepaint) |
240 { | 232 { |
241 if (doFullRepaint) { | 233 if (doFullRepaint) { |
242 renderer()->repaint(); | 234 renderer()->repaint(); |
243 #if USE(ACCELERATED_COMPOSITING) | 235 #if USE(ACCELERATED_COMPOSITING) |
244 checkForRepaint = false; | 236 checkForRepaint = false; |
245 // We need the full repaint to propagate to child layers if we are hardw
are compositing. | 237 // We need the full repaint to propagate to child layers if we are hardw
are compositing. |
246 if (!compositor()->inCompositingMode()) | 238 if (!compositor()->inCompositingMode()) |
247 doFullRepaint = false; | 239 doFullRepaint = false; |
248 #else | 240 #else |
(...skipping 14 matching lines...) Expand all Loading... |
263 | 255 |
264 updateTransform(); | 256 updateTransform(); |
265 | 257 |
266 if (m_hasVisibleContent) { | 258 if (m_hasVisibleContent) { |
267 RenderView* view = renderer()->view(); | 259 RenderView* view = renderer()->view(); |
268 ASSERT(view); | 260 ASSERT(view); |
269 // FIXME: Optimize using LayoutState and remove the disableLayoutState()
call | 261 // FIXME: Optimize using LayoutState and remove the disableLayoutState()
call |
270 // from updateScrollInfoAfterLayout(). | 262 // from updateScrollInfoAfterLayout(). |
271 ASSERT(!view->layoutStateEnabled()); | 263 ASSERT(!view->layoutStateEnabled()); |
272 | 264 |
273 RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint
(); | 265 RenderBox* repaintContainer = renderer()->containerForRepaint(); |
274 IntRect newRect = renderer()->clippedOverflowRectForRepaint(repaintConta
iner); | 266 IntRect newRect = renderer()->clippedOverflowRectForRepaint(repaintConta
iner); |
275 IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintConta
iner); | 267 IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintConta
iner); |
276 if (checkForRepaint) { | 268 if (checkForRepaint) { |
277 if (view && !view->printing()) { | 269 if (view && !view->printing()) { |
278 if (m_needsFullRepaint) { | 270 if (m_needsFullRepaint) { |
279 renderer()->repaintUsingContainer(repaintContainer, m_repain
tRect); | 271 renderer()->repaintUsingContainer(repaintContainer, m_repain
tRect); |
280 if (newRect != m_repaintRect) | 272 if (newRect != m_repaintRect) |
281 renderer()->repaintUsingContainer(repaintContainer, newR
ect); | 273 renderer()->repaintUsingContainer(repaintContainer, newR
ect); |
282 } else | 274 } else |
283 renderer()->repaintAfterLayoutIfNeeded(repaintContainer, m_r
epaintRect, m_outlineBox); | 275 renderer()->repaintAfterLayoutIfNeeded(repaintContainer, m_r
epaintRect, m_outlineBox); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 bool hasTransform = renderer()->hasTransform(); | 309 bool hasTransform = renderer()->hasTransform(); |
318 bool hadTransform = m_transform; | 310 bool hadTransform = m_transform; |
319 if (hasTransform != hadTransform) { | 311 if (hasTransform != hadTransform) { |
320 if (hasTransform) | 312 if (hasTransform) |
321 m_transform.set(new TransformationMatrix); | 313 m_transform.set(new TransformationMatrix); |
322 else | 314 else |
323 m_transform.clear(); | 315 m_transform.clear(); |
324 } | 316 } |
325 | 317 |
326 if (hasTransform) { | 318 if (hasTransform) { |
327 RenderBox* box = renderBox(); | |
328 ASSERT(box); | |
329 m_transform->reset(); | 319 m_transform->reset(); |
330 box->style()->applyTransform(*m_transform, box->borderBoxRect().size()); | 320 renderer()->style()->applyTransform(*m_transform, renderer()->borderBoxR
ect().size()); |
331 } | 321 } |
332 } | 322 } |
333 | 323 |
334 void RenderLayer::setHasVisibleContent(bool b) | 324 void RenderLayer::setHasVisibleContent(bool b) |
335 { | 325 { |
336 if (m_hasVisibleContent == b && !m_visibleContentStatusDirty) | 326 if (m_hasVisibleContent == b && !m_visibleContentStatusDirty) |
337 return; | 327 return; |
338 m_visibleContentStatusDirty = false; | 328 m_visibleContentStatusDirty = false; |
339 m_hasVisibleContent = b; | 329 m_hasVisibleContent = b; |
340 if (m_hasVisibleContent) { | 330 if (m_hasVisibleContent) { |
341 RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint
(); | 331 RenderBox* repaintContainer = renderer()->containerForRepaint(); |
342 m_repaintRect = renderer()->clippedOverflowRectForRepaint(repaintContain
er); | 332 m_repaintRect = renderer()->clippedOverflowRectForRepaint(repaintContain
er); |
343 m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer); | 333 m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer); |
344 if (!isOverflowOnly()) | 334 if (!isOverflowOnly()) |
345 dirtyStackingContextZOrderLists(); | 335 dirtyStackingContextZOrderLists(); |
346 } | 336 } |
347 if (parent()) | 337 if (parent()) |
348 parent()->childVisibilityChanged(m_hasVisibleContent); | 338 parent()->childVisibilityChanged(m_hasVisibleContent); |
349 } | 339 } |
350 | 340 |
351 void RenderLayer::dirtyVisibleContentStatus() | 341 void RenderLayer::dirtyVisibleContentStatus() |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 } | 411 } |
422 m_visibleContentStatusDirty = false; | 412 m_visibleContentStatusDirty = false; |
423 } | 413 } |
424 } | 414 } |
425 | 415 |
426 void RenderLayer::updateLayerPosition() | 416 void RenderLayer::updateLayerPosition() |
427 { | 417 { |
428 // Clear our cached clip rect information. | 418 // Clear our cached clip rect information. |
429 clearClipRects(); | 419 clearClipRects(); |
430 | 420 |
431 RenderBox* rendererBox = renderBox(); | 421 int x = renderer()->x(); |
432 | 422 int y = renderer()->y(); |
433 int x = rendererBox ? rendererBox->x() : 0; | |
434 int y = rendererBox ? rendererBox->y() : 0; | |
435 | 423 |
436 if (!renderer()->isPositioned() && renderer()->parent()) { | 424 if (!renderer()->isPositioned() && renderer()->parent()) { |
437 // We must adjust our position by walking up the render tree looking for
the | 425 // We must adjust our position by walking up the render tree looking for
the |
438 // nearest enclosing object with a layer. | 426 // nearest enclosing object with a layer. |
439 RenderObject* curr = renderer()->parent(); | 427 RenderBox* curr = renderer()->parentBox(); |
440 while (curr && !curr->hasLayer()) { | 428 while (curr && !curr->hasLayer()) { |
441 if (curr->isBox() && !curr->isTableRow()) { | 429 if (!curr->isTableRow()) { |
442 // Rows and cells share the same coordinate space (that of the s
ection). | 430 // Rows and cells share the same coordinate space (that of the s
ection). |
443 // Omit them when computing our xpos/ypos. | 431 // Omit them when computing our xpos/ypos. |
444 RenderBox* currBox = toRenderBox(curr); | 432 x += curr->x(); |
445 x += currBox->x(); | 433 y += curr->y(); |
446 y += currBox->y(); | |
447 } | 434 } |
448 curr = curr->parent(); | 435 curr = curr->parentBox(); |
449 } | 436 } |
450 if (curr->isBox() && curr->isTableRow()) { | 437 if (curr->isTableRow()) { |
451 // Put ourselves into the row coordinate space. | 438 // Put ourselves into the row coordinate space. |
452 RenderBox* currBox = toRenderBox(curr); | 439 x -= curr->x(); |
453 x -= currBox->x(); | 440 y -= curr->y(); |
454 y -= currBox->y(); | |
455 } | 441 } |
456 } | 442 } |
457 | 443 |
458 m_relX = m_relY = 0; | 444 m_relX = m_relY = 0; |
459 if (renderer()->isRelPositioned()) { | 445 if (renderer()->isRelPositioned()) { |
460 m_relX = renderer()->relativePositionOffsetX(); | 446 m_relX = renderer()->relativePositionOffsetX(); |
461 m_relY = renderer()->relativePositionOffsetY(); | 447 m_relY = renderer()->relativePositionOffsetY(); |
462 x += m_relX; y += m_relY; | 448 x += m_relX; y += m_relY; |
463 } | 449 } |
464 | 450 |
465 // Subtract our parent's scroll offset. | 451 // Subtract our parent's scroll offset. |
466 if (renderer()->isPositioned() && enclosingPositionedAncestor()) { | 452 if (renderer()->isPositioned() && enclosingPositionedAncestor()) { |
467 RenderLayer* positionedParent = enclosingPositionedAncestor(); | 453 RenderLayer* positionedParent = enclosingPositionedAncestor(); |
468 | 454 |
469 // For positioned layers, we subtract out the enclosing positioned layer
's scroll offset. | 455 // For positioned layers, we subtract out the enclosing positioned layer
's scroll offset. |
470 positionedParent->subtractScrolledContentOffset(x, y); | 456 positionedParent->subtractScrolledContentOffset(x, y); |
471 | 457 |
472 if (renderer()->isPositioned() && positionedParent->renderer()->isRelPos
itioned() && positionedParent->renderer()->isRenderInline()) { | 458 if (renderer()->isPositioned() && positionedParent->renderer()->isRelPos
itioned() && positionedParent->renderer()->isRenderInline()) { |
473 IntSize offset = toRenderInline(positionedParent->renderer())->relat
ivePositionedInlineOffset(toRenderBox(renderer())); | 459 IntSize offset = toRenderInline(positionedParent->renderer())->relat
ivePositionedInlineOffset(renderer()); |
474 x += offset.width(); | 460 x += offset.width(); |
475 y += offset.height(); | 461 y += offset.height(); |
476 } | 462 } |
477 } else if (parent()) | 463 } else if (parent()) |
478 parent()->subtractScrolledContentOffset(x, y); | 464 parent()->subtractScrolledContentOffset(x, y); |
479 | 465 |
480 // FIXME: We'd really like to just get rid of the concept of a layer rectang
le and rely on the renderers. | 466 // FIXME: We'd really like to just get rid of the concept of a layer rectang
le and rely on the renderers. |
481 | 467 |
482 setPos(x, y); | 468 setPos(x, y); |
483 | 469 |
484 if (renderer()->isRenderInline()) { | 470 if (renderer()->isRenderInline()) { |
485 RenderInline* inlineFlow = toRenderInline(renderer()); | 471 RenderInline* inlineFlow = toRenderInline(renderer()); |
486 IntRect lineBox = inlineFlow->linesBoundingBox(); | 472 IntRect lineBox = inlineFlow->linesBoundingBox(); |
487 setWidth(lineBox.width()); | 473 setWidth(lineBox.width()); |
488 setHeight(lineBox.height()); | 474 setHeight(lineBox.height()); |
489 } else if (RenderBox* box = renderBox()) { | 475 } else { |
490 setWidth(box->width()); | 476 setWidth(renderer()->width()); |
491 setHeight(box->height()); | 477 setHeight(renderer()->height()); |
492 | 478 |
493 if (!box->hasOverflowClip()) { | 479 if (!renderer()->hasOverflowClip()) { |
494 if (box->overflowWidth() > box->width()) | 480 if (renderer()->overflowWidth() > renderer()->width()) |
495 setWidth(box->overflowWidth()); | 481 setWidth(renderer()->overflowWidth()); |
496 if (box->overflowHeight() > box->height()) | 482 if (renderer()->overflowHeight() > renderer()->height()) |
497 setHeight(box->overflowHeight()); | 483 setHeight(renderer()->overflowHeight()); |
498 } | 484 } |
499 } | 485 } |
500 } | 486 } |
501 | 487 |
502 RenderLayer *RenderLayer::stackingContext() const | 488 RenderLayer *RenderLayer::stackingContext() const |
503 { | 489 { |
504 RenderLayer* curr = parent(); | 490 RenderLayer* curr = parent(); |
505 for ( ; curr && !curr->renderer()->isRenderView() && !curr->renderer()->isRo
ot() && | 491 for ( ; curr && !curr->renderer()->isRenderView() && !curr->renderer()->isRo
ot() && |
506 curr->renderer()->style()->hasAutoZIndex(); | 492 curr->renderer()->style()->hasAutoZIndex(); |
507 curr = curr->parent()) { } | 493 curr = curr->parent()) { } |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 | 857 |
872 void | 858 void |
873 RenderLayer::subtractScrolledContentOffset(int& x, int& y) const | 859 RenderLayer::subtractScrolledContentOffset(int& x, int& y) const |
874 { | 860 { |
875 x -= scrollXOffset() + m_scrollLeftOverflow; | 861 x -= scrollXOffset() + m_scrollLeftOverflow; |
876 y -= scrollYOffset(); | 862 y -= scrollYOffset(); |
877 } | 863 } |
878 | 864 |
879 void RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars, bool repai
nt) | 865 void RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars, bool repai
nt) |
880 { | 866 { |
881 RenderBox* box = renderBox(); | 867 if (renderer()->style()->overflowX() != OMARQUEE) { |
882 if (!box) | |
883 return; | |
884 | |
885 if (box->style()->overflowX() != OMARQUEE) { | |
886 if (x < 0) x = 0; | 868 if (x < 0) x = 0; |
887 if (y < 0) y = 0; | 869 if (y < 0) y = 0; |
888 | 870 |
889 // Call the scrollWidth/Height functions so that the dimensions will be
computed if they need | 871 // Call the scrollWidth/Height functions so that the dimensions will be
computed if they need |
890 // to be (for overflow:hidden blocks). | 872 // to be (for overflow:hidden blocks). |
891 int maxX = scrollWidth() - box->clientWidth(); | 873 int maxX = scrollWidth() - renderer()->clientWidth(); |
892 int maxY = scrollHeight() - box->clientHeight(); | 874 int maxY = scrollHeight() - renderer()->clientHeight(); |
893 | 875 |
894 if (x > maxX) x = maxX; | 876 if (x > maxX) x = maxX; |
895 if (y > maxY) y = maxY; | 877 if (y > maxY) y = maxY; |
896 } | 878 } |
897 | 879 |
898 // FIXME: Eventually, we will want to perform a blit. For now never | 880 // FIXME: Eventually, we will want to perform a blit. For now never |
899 // blit, since the check for blitting is going to be very | 881 // blit, since the check for blitting is going to be very |
900 // complicated (since it will involve testing whether our layer | 882 // complicated (since it will involve testing whether our layer |
901 // is either occluded by another layer or clipped by an enclosing | 883 // is either occluded by another layer or clipped by an enclosing |
902 // layer or contains fixed backgrounds, etc.). | 884 // layer or contains fixed backgrounds, etc.). |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 if (updateScrollbars) { | 923 if (updateScrollbars) { |
942 if (m_hBar) | 924 if (m_hBar) |
943 m_hBar->setValue(scrollXOffset()); | 925 m_hBar->setValue(scrollXOffset()); |
944 if (m_vBar) | 926 if (m_vBar) |
945 m_vBar->setValue(m_scrollY); | 927 m_vBar->setValue(m_scrollY); |
946 } | 928 } |
947 | 929 |
948 // Schedule the scroll DOM event. | 930 // Schedule the scroll DOM event. |
949 if (view) { | 931 if (view) { |
950 if (FrameView* frameView = view->frameView()) | 932 if (FrameView* frameView = view->frameView()) |
951 frameView->scheduleEvent(Event::create(eventNames().scrollEvent, fal
se, false), renderer()->element()); | 933 frameView->scheduleEvent(Event::create(eventNames().scrollEvent, fal
se, false), EventTargetNodeCast(renderer()->element())); |
952 } | 934 } |
953 } | 935 } |
954 | 936 |
955 void RenderLayer::scrollRectToVisible(const IntRect &rect, bool scrollToAnchor,
const ScrollAlignment& alignX, const ScrollAlignment& alignY) | 937 void RenderLayer::scrollRectToVisible(const IntRect &rect, bool scrollToAnchor,
const ScrollAlignment& alignX, const ScrollAlignment& alignY) |
956 { | 938 { |
957 RenderLayer* parentLayer = 0; | 939 RenderLayer* parentLayer = 0; |
958 IntRect newRect = rect; | 940 IntRect newRect = rect; |
959 int xOffset = 0, yOffset = 0; | 941 int xOffset = 0, yOffset = 0; |
960 | 942 |
961 // We may end up propagating a scroll event. It is important that we suspend
events until | 943 // We may end up propagating a scroll event. It is important that we suspend
events until |
962 // the end of the function since they could delete the layer or the layer's
renderer(). | 944 // the end of the function since they could delete the layer or the layer's
renderer(). |
963 FrameView* frameView = renderer()->document()->view(); | 945 FrameView* frameView = renderer()->document()->view(); |
964 if (frameView) | 946 if (frameView) |
965 frameView->pauseScheduledEvents(); | 947 frameView->pauseScheduledEvents(); |
966 | 948 |
967 bool restrictedByLineClamp = false; | 949 bool restrictedByLineClamp = false; |
968 if (renderer()->parent()) { | 950 if (renderer()->parent()) { |
969 parentLayer = renderer()->parent()->enclosingLayer(); | 951 parentLayer = renderer()->parent()->enclosingLayer(); |
970 restrictedByLineClamp = renderer()->parent()->style()->lineClamp() >= 0; | 952 restrictedByLineClamp = renderer()->parent()->style()->lineClamp() >= 0; |
971 } | 953 } |
972 | 954 |
973 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) { | 955 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) { |
974 // Don't scroll to reveal an overflow layer that is restricted by the -w
ebkit-line-clamp property. | 956 // Don't scroll to reveal an overflow layer that is restricted by the -w
ebkit-line-clamp property. |
975 // This will prevent us from revealing text hidden by the slider in Safa
ri RSS. | 957 // This will prevent us from revealing text hidden by the slider in Safa
ri RSS. |
976 RenderBox* box = renderBox(); | 958 FloatPoint absPos = renderer()->localToAbsolute(); |
977 ASSERT(box); | 959 absPos.move(renderer()->borderLeft(), renderer()->borderTop()); |
978 FloatPoint absPos = box->localToAbsolute(); | |
979 absPos.move(box->borderLeft(), box->borderTop()); | |
980 | 960 |
981 IntRect layerBounds = IntRect(absPos.x() + scrollXOffset(), absPos.y() +
scrollYOffset(), box->clientWidth(), box->clientHeight()); | 961 IntRect layerBounds = IntRect(absPos.x() + scrollXOffset(), absPos.y() +
scrollYOffset(), renderer()->clientWidth(), renderer()->clientHeight()); |
982 IntRect exposeRect = IntRect(rect.x() + scrollXOffset(), rect.y() + scro
llYOffset(), rect.width(), rect.height()); | 962 IntRect exposeRect = IntRect(rect.x() + scrollXOffset(), rect.y() + scro
llYOffset(), rect.width(), rect.height()); |
983 IntRect r = getRectToExpose(layerBounds, exposeRect, alignX, alignY); | 963 IntRect r = getRectToExpose(layerBounds, exposeRect, alignX, alignY); |
984 | 964 |
985 xOffset = r.x() - absPos.x(); | 965 xOffset = r.x() - absPos.x(); |
986 yOffset = r.y() - absPos.y(); | 966 yOffset = r.y() - absPos.y(); |
987 // Adjust offsets if they're outside of the allowable range. | 967 // Adjust offsets if they're outside of the allowable range. |
988 xOffset = max(0, min(scrollWidth() - layerBounds.width(), xOffset)); | 968 xOffset = max(0, min(scrollWidth() - layerBounds.width(), xOffset)); |
989 yOffset = max(0, min(scrollHeight() - layerBounds.height(), yOffset)); | 969 yOffset = max(0, min(scrollHeight() - layerBounds.height(), yOffset)); |
990 | 970 |
991 if (xOffset != scrollXOffset() || yOffset != scrollYOffset()) { | 971 if (xOffset != scrollXOffset() || yOffset != scrollYOffset()) { |
992 int diffX = scrollXOffset(); | 972 int diffX = scrollXOffset(); |
993 int diffY = scrollYOffset(); | 973 int diffY = scrollYOffset(); |
994 scrollToOffset(xOffset, yOffset); | 974 scrollToOffset(xOffset, yOffset); |
995 diffX = scrollXOffset() - diffX; | 975 diffX = scrollXOffset() - diffX; |
996 diffY = scrollYOffset() - diffY; | 976 diffY = scrollYOffset() - diffY; |
997 newRect.setX(rect.x() - diffX); | 977 newRect.setX(rect.x() - diffX); |
998 newRect.setY(rect.y() - diffY); | 978 newRect.setY(rect.y() - diffY); |
999 } | 979 } |
1000 } else if (!parentLayer && renderer()->isBox() && renderBox()->canBePrograma
ticallyScrolled(scrollToAnchor)) { | 980 } else if (!parentLayer && renderer()->canBeProgramaticallyScrolled(scrollTo
Anchor)) { |
1001 if (frameView) { | 981 if (frameView) { |
1002 if (renderer()->document() && renderer()->document()->ownerElement()
&& renderer()->document()->ownerElement()->renderer()) { | 982 if (renderer()->document() && renderer()->document()->ownerElement()
&& renderer()->document()->ownerElement()->renderer()) { |
1003 IntRect viewRect = frameView->visibleContentRect(); | 983 IntRect viewRect = frameView->visibleContentRect(); |
1004 IntRect r = getRectToExpose(viewRect, rect, alignX, alignY); | 984 IntRect r = getRectToExpose(viewRect, rect, alignX, alignY); |
1005 | 985 |
1006 xOffset = r.x(); | 986 xOffset = r.x(); |
1007 yOffset = r.y(); | 987 yOffset = r.y(); |
1008 // Adjust offsets if they're outside of the allowable range. | 988 // Adjust offsets if they're outside of the allowable range. |
1009 xOffset = max(0, min(frameView->contentsWidth(), xOffset)); | 989 xOffset = max(0, min(frameView->contentsWidth(), xOffset)); |
1010 yOffset = max(0, min(frameView->contentsHeight(), yOffset)); | 990 yOffset = max(0, min(frameView->contentsHeight(), yOffset)); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 bool hasHorizontalBar = layer->horizontalScrollbar(); | 1230 bool hasHorizontalBar = layer->horizontalScrollbar(); |
1251 bool hasVerticalBar = layer->verticalScrollbar(); | 1231 bool hasVerticalBar = layer->verticalScrollbar(); |
1252 bool hasResizer = layer->renderer()->style()->resize() != RESIZE_NONE; | 1232 bool hasResizer = layer->renderer()->style()->resize() != RESIZE_NONE; |
1253 if ((hasHorizontalBar && hasVerticalBar) || (hasResizer && (hasHorizontalBar
|| hasVerticalBar))) | 1233 if ((hasHorizontalBar && hasVerticalBar) || (hasResizer && (hasHorizontalBar
|| hasVerticalBar))) |
1254 return cornerRect(layer, bounds); | 1234 return cornerRect(layer, bounds); |
1255 return IntRect(); | 1235 return IntRect(); |
1256 } | 1236 } |
1257 | 1237 |
1258 static IntRect resizerCornerRect(const RenderLayer* layer, const IntRect& bounds
) | 1238 static IntRect resizerCornerRect(const RenderLayer* layer, const IntRect& bounds
) |
1259 { | 1239 { |
1260 ASSERT(layer->renderer()->isBox()); | |
1261 if (layer->renderer()->style()->resize() == RESIZE_NONE) | 1240 if (layer->renderer()->style()->resize() == RESIZE_NONE) |
1262 return IntRect(); | 1241 return IntRect(); |
1263 return cornerRect(layer, bounds); | 1242 return cornerRect(layer, bounds); |
1264 } | 1243 } |
1265 | 1244 |
1266 bool RenderLayer::scrollbarCornerPresent() const | 1245 bool RenderLayer::scrollbarCornerPresent() const |
1267 { | 1246 { |
1268 ASSERT(renderer()->isBox()); | 1247 return !scrollCornerRect(this, renderer()->borderBoxRect()).isEmpty(); |
1269 return !scrollCornerRect(this, renderBox()->borderBoxRect()).isEmpty(); | |
1270 } | 1248 } |
1271 | 1249 |
1272 void RenderLayer::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& r
ect) | 1250 void RenderLayer::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& r
ect) |
1273 { | 1251 { |
1274 IntRect scrollRect = rect; | 1252 IntRect scrollRect = rect; |
1275 RenderBox* box = renderBox(); | |
1276 ASSERT(box); | |
1277 if (scrollbar == m_vBar.get()) | 1253 if (scrollbar == m_vBar.get()) |
1278 scrollRect.move(box->width() - box->borderRight() - box->width(), box->b
orderTop()); | 1254 scrollRect.move(renderer()->width() - renderer()->borderRight() - scroll
bar->width(), renderer()->borderTop()); |
1279 else | 1255 else |
1280 scrollRect.move(box->borderLeft(), box->height() - box->borderBottom() -
scrollbar->height()); | 1256 scrollRect.move(renderer()->borderLeft(), renderer()->height() - rendere
r()->borderBottom() - scrollbar->height()); |
1281 renderer()->repaintRectangle(scrollRect); | 1257 renderer()->repaintRectangle(scrollRect); |
1282 } | 1258 } |
1283 | 1259 |
1284 PassRefPtr<Scrollbar> RenderLayer::createScrollbar(ScrollbarOrientation orientat
ion) | 1260 PassRefPtr<Scrollbar> RenderLayer::createScrollbar(ScrollbarOrientation orientat
ion) |
1285 { | 1261 { |
1286 RefPtr<Scrollbar> widget; | 1262 RefPtr<Scrollbar> widget; |
1287 bool hasCustomScrollbarStyle = renderer()->node()->shadowAncestorNode()->ren
derer()->style()->hasPseudoStyle(SCROLLBAR); | 1263 bool hasCustomScrollbarStyle = renderer()->node()->shadowAncestorNode()->ren
derer()->style()->hasPseudoStyle(SCROLLBAR); |
1288 if (hasCustomScrollbarStyle) | 1264 if (hasCustomScrollbarStyle) |
1289 widget = RenderScrollbar::createCustomScrollbar(this, orientation, rende
rer()->node()->shadowAncestorNode()->renderBox()); | 1265 widget = RenderScrollbar::createCustomScrollbar(this, orientation, rende
rer()->node()->shadowAncestorNode()->renderBox()); |
1290 else | 1266 else |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 IntPoint bottomRight(width(), height()); | 1345 IntPoint bottomRight(width(), height()); |
1370 IntPoint localPoint = absoluteToContents(absolutePoint); | 1346 IntPoint localPoint = absoluteToContents(absolutePoint); |
1371 return localPoint - bottomRight; | 1347 return localPoint - bottomRight; |
1372 } | 1348 } |
1373 | 1349 |
1374 void RenderLayer::positionOverflowControls(int tx, int ty) | 1350 void RenderLayer::positionOverflowControls(int tx, int ty) |
1375 { | 1351 { |
1376 if (!m_hBar && !m_vBar && (!renderer()->hasOverflowClip() || renderer()->sty
le()->resize() == RESIZE_NONE)) | 1352 if (!m_hBar && !m_vBar && (!renderer()->hasOverflowClip() || renderer()->sty
le()->resize() == RESIZE_NONE)) |
1377 return; | 1353 return; |
1378 | 1354 |
1379 RenderBox* box = renderBox(); | 1355 IntRect borderBox = renderer()->borderBoxRect(); |
1380 if (!box) | |
1381 return; | |
1382 | |
1383 IntRect borderBox = box->borderBoxRect(); | |
1384 IntRect scrollCorner(scrollCornerRect(this, borderBox)); | 1356 IntRect scrollCorner(scrollCornerRect(this, borderBox)); |
1385 IntRect absBounds(borderBox.x() + tx, borderBox.y() + ty, borderBox.width(),
borderBox.height()); | 1357 IntRect absBounds(borderBox.x() + tx, borderBox.y() + ty, borderBox.width(),
borderBox.height()); |
1386 if (m_vBar) | 1358 if (m_vBar) |
1387 m_vBar->setFrameRect(IntRect(absBounds.right() - box->borderRight() - m_
vBar->width(), | 1359 m_vBar->setFrameRect(IntRect(absBounds.right() - renderer()->borderRight
() - m_vBar->width(), |
1388 absBounds.y() + box->borderTop(), | 1360 absBounds.y() + renderer()->borderTop(), |
1389 m_vBar->width(), | 1361 m_vBar->width(), |
1390 absBounds.height() - (box->borderTop() + bo
x->borderBottom()) - scrollCorner.height())); | 1362 absBounds.height() - (renderer()->borderTop
() + renderer()->borderBottom()) - scrollCorner.height())); |
1391 | 1363 |
1392 if (m_hBar) | 1364 if (m_hBar) |
1393 m_hBar->setFrameRect(IntRect(absBounds.x() + box->borderLeft(), | 1365 m_hBar->setFrameRect(IntRect(absBounds.x() + renderer()->borderLeft(), |
1394 absBounds.bottom() - box->borderBottom() -
m_hBar->height(), | 1366 absBounds.bottom() - renderer()->borderBott
om() - m_hBar->height(), |
1395 absBounds.width() - (box->borderLeft() + bo
x->borderRight()) - scrollCorner.width(), | 1367 absBounds.width() - (renderer()->borderLeft
() + renderer()->borderRight()) - scrollCorner.width(), |
1396 m_hBar->height())); | 1368 m_hBar->height())); |
1397 | 1369 |
1398 if (m_scrollCorner) | 1370 if (m_scrollCorner) |
1399 m_scrollCorner->setFrameRect(scrollCorner); | 1371 m_scrollCorner->setFrameRect(scrollCorner); |
1400 if (m_resizer) | 1372 if (m_resizer) |
1401 m_resizer->setFrameRect(resizerCornerRect(this, borderBox)); | 1373 m_resizer->setFrameRect(resizerCornerRect(this, borderBox)); |
1402 } | 1374 } |
1403 | 1375 |
1404 int RenderLayer::scrollWidth() | 1376 int RenderLayer::scrollWidth() |
1405 { | 1377 { |
1406 if (m_scrollDimensionsDirty) | 1378 if (m_scrollDimensionsDirty) |
1407 computeScrollDimensions(); | 1379 computeScrollDimensions(); |
1408 return m_scrollWidth; | 1380 return m_scrollWidth; |
1409 } | 1381 } |
1410 | 1382 |
1411 int RenderLayer::scrollHeight() | 1383 int RenderLayer::scrollHeight() |
1412 { | 1384 { |
1413 if (m_scrollDimensionsDirty) | 1385 if (m_scrollDimensionsDirty) |
1414 computeScrollDimensions(); | 1386 computeScrollDimensions(); |
1415 return m_scrollHeight; | 1387 return m_scrollHeight; |
1416 } | 1388 } |
1417 | 1389 |
1418 void RenderLayer::computeScrollDimensions(bool* needHBar, bool* needVBar) | 1390 void RenderLayer::computeScrollDimensions(bool* needHBar, bool* needVBar) |
1419 { | 1391 { |
1420 RenderBox* box = renderBox(); | |
1421 ASSERT(box); | |
1422 | |
1423 m_scrollDimensionsDirty = false; | 1392 m_scrollDimensionsDirty = false; |
1424 | 1393 |
1425 bool ltr = renderer()->style()->direction() == LTR; | 1394 bool ltr = renderer()->style()->direction() == LTR; |
1426 | 1395 |
1427 int clientWidth = box->clientWidth(); | 1396 int clientWidth = renderer()->clientWidth(); |
1428 int clientHeight = box->clientHeight(); | 1397 int clientHeight = renderer()->clientHeight(); |
1429 | 1398 |
1430 m_scrollLeftOverflow = ltr ? 0 : min(0, box->leftmostPosition(true, false) -
box->borderLeft()); | 1399 m_scrollLeftOverflow = ltr ? 0 : min(0, renderer()->leftmostPosition(true, f
alse) - renderer()->borderLeft()); |
1431 | 1400 |
1432 int rightPos = ltr ? | 1401 int rightPos = ltr ? |
1433 box->rightmostPosition(true, false) - box->borderLeft() : | 1402 renderer()->rightmostPosition(true, false) - renderer()->bor
derLeft() : |
1434 clientWidth - m_scrollLeftOverflow; | 1403 clientWidth - m_scrollLeftOverflow; |
1435 int bottomPos = renderer()->lowestPosition(true, false) - box->borderTop(); | 1404 int bottomPos = renderer()->lowestPosition(true, false) - renderer()->border
Top(); |
1436 | 1405 |
1437 m_scrollWidth = max(rightPos, clientWidth); | 1406 m_scrollWidth = max(rightPos, clientWidth); |
1438 m_scrollHeight = max(bottomPos, clientHeight); | 1407 m_scrollHeight = max(bottomPos, clientHeight); |
1439 | 1408 |
1440 m_scrollOriginX = ltr ? 0 : m_scrollWidth - clientWidth; | 1409 m_scrollOriginX = ltr ? 0 : m_scrollWidth - clientWidth; |
1441 | 1410 |
1442 if (needHBar) | 1411 if (needHBar) |
1443 *needHBar = rightPos > clientWidth; | 1412 *needHBar = rightPos > clientWidth; |
1444 if (needVBar) | 1413 if (needVBar) |
1445 *needVBar = bottomPos > clientHeight; | 1414 *needVBar = bottomPos > clientHeight; |
(...skipping 11 matching lines...) Expand all Loading... |
1457 | 1426 |
1458 bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow
); | 1427 bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow
); |
1459 bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow); | 1428 bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow); |
1460 | 1429 |
1461 if (horizontalOverflowChanged || verticalOverflowChanged) { | 1430 if (horizontalOverflowChanged || verticalOverflowChanged) { |
1462 m_horizontalOverflow = horizontalOverflow; | 1431 m_horizontalOverflow = horizontalOverflow; |
1463 m_verticalOverflow = verticalOverflow; | 1432 m_verticalOverflow = verticalOverflow; |
1464 | 1433 |
1465 if (FrameView* frameView = renderer()->document()->view()) { | 1434 if (FrameView* frameView = renderer()->document()->view()) { |
1466 frameView->scheduleEvent(OverflowEvent::create(horizontalOverflowCha
nged, horizontalOverflow, verticalOverflowChanged, verticalOverflow), | 1435 frameView->scheduleEvent(OverflowEvent::create(horizontalOverflowCha
nged, horizontalOverflow, verticalOverflowChanged, verticalOverflow), |
1467 renderer()->element()); | 1436 EventTargetNodeCast(renderer()->element())); |
1468 } | 1437 } |
1469 } | 1438 } |
1470 } | 1439 } |
1471 | 1440 |
1472 void | 1441 void |
1473 RenderLayer::updateScrollInfoAfterLayout() | 1442 RenderLayer::updateScrollInfoAfterLayout() |
1474 { | 1443 { |
1475 RenderBox* box = renderBox(); | |
1476 if (!box) | |
1477 return; | |
1478 | |
1479 m_scrollDimensionsDirty = true; | 1444 m_scrollDimensionsDirty = true; |
1480 | 1445 |
1481 bool horizontalOverflow, verticalOverflow; | 1446 bool horizontalOverflow, verticalOverflow; |
1482 computeScrollDimensions(&horizontalOverflow, &verticalOverflow); | 1447 computeScrollDimensions(&horizontalOverflow, &verticalOverflow); |
1483 | 1448 |
1484 if (box->style()->overflowX() != OMARQUEE) { | 1449 if (renderer()->style()->overflowX() != OMARQUEE) { |
1485 // Layout may cause us to be in an invalid scroll position. In this cas
e we need | 1450 // Layout may cause us to be in an invalid scroll position. In this cas
e we need |
1486 // to pull our scroll offsets back to the max (or push them up to the mi
n). | 1451 // to pull our scroll offsets back to the max (or push them up to the mi
n). |
1487 int newX = max(0, min(scrollXOffset(), scrollWidth() - box->clientWidth(
))); | 1452 int newX = max(0, min(scrollXOffset(), scrollWidth() - renderer()->clien
tWidth())); |
1488 int newY = max(0, min(m_scrollY, scrollHeight() - box->clientHeight())); | 1453 int newY = max(0, min(m_scrollY, scrollHeight() - renderer()->clientHeig
ht())); |
1489 if (newX != scrollXOffset() || newY != m_scrollY) { | 1454 if (newX != scrollXOffset() || newY != m_scrollY) { |
1490 RenderView* view = renderer()->view(); | 1455 RenderView* view = renderer()->view(); |
1491 ASSERT(view); | 1456 ASSERT(view); |
1492 // scrollToOffset() may call updateLayerPositions(), which doesn't w
ork | 1457 // scrollToOffset() may call updateLayerPositions(), which doesn't w
ork |
1493 // with LayoutState. | 1458 // with LayoutState. |
1494 // FIXME: Remove the disableLayoutState/enableLayoutState if the abo
ve changes. | 1459 // FIXME: Remove the disableLayoutState/enableLayoutState if the abo
ve changes. |
1495 if (view) | 1460 if (view) |
1496 view->disableLayoutState(); | 1461 view->disableLayoutState(); |
1497 scrollToOffset(newX, newY); | 1462 scrollToOffset(newX, newY); |
1498 if (view) | 1463 if (view) |
(...skipping 11 matching lines...) Expand all Loading... |
1510 m_vBar->setEnabled(verticalOverflow); | 1475 m_vBar->setEnabled(verticalOverflow); |
1511 | 1476 |
1512 // A dynamic change from a scrolling overflow to overflow:hidden means we ne
ed to get rid of any | 1477 // A dynamic change from a scrolling overflow to overflow:hidden means we ne
ed to get rid of any |
1513 // scrollbars that may be present. | 1478 // scrollbars that may be present. |
1514 if (renderer()->style()->overflowX() == OHIDDEN && haveHorizontalBar) | 1479 if (renderer()->style()->overflowX() == OHIDDEN && haveHorizontalBar) |
1515 setHasHorizontalScrollbar(false); | 1480 setHasHorizontalScrollbar(false); |
1516 if (renderer()->style()->overflowY() == OHIDDEN && haveVerticalBar) | 1481 if (renderer()->style()->overflowY() == OHIDDEN && haveVerticalBar) |
1517 setHasVerticalScrollbar(false); | 1482 setHasVerticalScrollbar(false); |
1518 | 1483 |
1519 // overflow:auto may need to lay out again if scrollbars got added/removed. | 1484 // overflow:auto may need to lay out again if scrollbars got added/removed. |
1520 bool scrollbarsChanged = (box->hasAutoHorizontalScrollbar() && haveHorizonta
lBar != horizontalOverflow) || | 1485 bool scrollbarsChanged = (renderer()->hasAutoHorizontalScrollbar() && haveHo
rizontalBar != horizontalOverflow) || |
1521 (box->hasAutoVerticalScrollbar() && haveVerticalBar
!= verticalOverflow); | 1486 (renderer()->hasAutoVerticalScrollbar() && haveVert
icalBar != verticalOverflow); |
1522 if (scrollbarsChanged) { | 1487 if (scrollbarsChanged) { |
1523 if (box->hasAutoHorizontalScrollbar()) | 1488 if (renderer()->hasAutoHorizontalScrollbar()) |
1524 setHasHorizontalScrollbar(horizontalOverflow); | 1489 setHasHorizontalScrollbar(horizontalOverflow); |
1525 if (box->hasAutoVerticalScrollbar()) | 1490 if (renderer()->hasAutoVerticalScrollbar()) |
1526 setHasVerticalScrollbar(verticalOverflow); | 1491 setHasVerticalScrollbar(verticalOverflow); |
1527 | 1492 |
1528 #if ENABLE(DASHBOARD_SUPPORT) | 1493 #if ENABLE(DASHBOARD_SUPPORT) |
1529 // Force an update since we know the scrollbars have changed things. | 1494 // Force an update since we know the scrollbars have changed things. |
1530 if (renderer()->document()->hasDashboardRegions()) | 1495 if (renderer()->document()->hasDashboardRegions()) |
1531 renderer()->document()->setDashboardRegionsDirty(true); | 1496 renderer()->document()->setDashboardRegionsDirty(true); |
1532 #endif | 1497 #endif |
1533 | 1498 |
1534 renderer()->repaint(); | 1499 renderer()->repaint(); |
1535 | 1500 |
1536 if (renderer()->style()->overflowX() == OAUTO || renderer()->style()->ov
erflowY() == OAUTO) { | 1501 if (renderer()->style()->overflowX() == OAUTO || renderer()->style()->ov
erflowY() == OAUTO) { |
1537 if (!m_inOverflowRelayout) { | 1502 if (!m_inOverflowRelayout) { |
1538 // Our proprietary overflow: overlay value doesn't trigger a lay
out. | 1503 // Our proprietary overflow: overlay value doesn't trigger a lay
out. |
1539 m_inOverflowRelayout = true; | 1504 m_inOverflowRelayout = true; |
1540 renderer()->setNeedsLayout(true, false); | 1505 renderer()->setNeedsLayout(true, false); |
1541 if (renderer()->isRenderBlock()) | 1506 if (renderer()->isRenderBlock()) |
1542 toRenderBlock(renderer())->layoutBlock(true); | 1507 toRenderBlock(renderer())->layoutBlock(true); |
1543 else | 1508 else |
1544 renderer()->layout(); | 1509 renderer()->layout(); |
1545 m_inOverflowRelayout = false; | 1510 m_inOverflowRelayout = false; |
1546 } | 1511 } |
1547 } | 1512 } |
1548 } | 1513 } |
1549 | 1514 |
1550 // If overflow:scroll is turned into overflow:auto a bar might still be disa
bled (Bug 11985). | 1515 // If overflow:scroll is turned into overflow:auto a bar might still be disa
bled (Bug 11985). |
1551 if (m_hBar && box->hasAutoHorizontalScrollbar()) | 1516 if (m_hBar && renderer()->hasAutoHorizontalScrollbar()) |
1552 m_hBar->setEnabled(true); | 1517 m_hBar->setEnabled(true); |
1553 if (m_vBar && box->hasAutoVerticalScrollbar()) | 1518 if (m_vBar && renderer()->hasAutoVerticalScrollbar()) |
1554 m_vBar->setEnabled(true); | 1519 m_vBar->setEnabled(true); |
1555 | 1520 |
1556 // Set up the range (and page step/line step). | 1521 // Set up the range (and page step/line step). |
1557 if (m_hBar) { | 1522 if (m_hBar) { |
1558 int clientWidth = box->clientWidth(); | 1523 int clientWidth = renderer()->clientWidth(); |
1559 int pageStep = (clientWidth - cAmountToKeepWhenPaging); | 1524 int pageStep = (clientWidth - cAmountToKeepWhenPaging); |
1560 if (pageStep < 0) pageStep = clientWidth; | 1525 if (pageStep < 0) pageStep = clientWidth; |
1561 m_hBar->setSteps(cScrollbarPixelsPerLineStep, pageStep); | 1526 m_hBar->setSteps(cScrollbarPixelsPerLineStep, pageStep); |
1562 m_hBar->setProportion(clientWidth, m_scrollWidth); | 1527 m_hBar->setProportion(clientWidth, m_scrollWidth); |
1563 m_hBar->setValue(scrollXOffset()); | 1528 m_hBar->setValue(scrollXOffset()); |
1564 } | 1529 } |
1565 if (m_vBar) { | 1530 if (m_vBar) { |
1566 int clientHeight = box->clientHeight(); | 1531 int clientHeight = renderer()->clientHeight(); |
1567 int pageStep = (clientHeight - cAmountToKeepWhenPaging); | 1532 int pageStep = (clientHeight - cAmountToKeepWhenPaging); |
1568 if (pageStep < 0) pageStep = clientHeight; | 1533 if (pageStep < 0) pageStep = clientHeight; |
1569 m_vBar->setSteps(cScrollbarPixelsPerLineStep, pageStep); | 1534 m_vBar->setSteps(cScrollbarPixelsPerLineStep, pageStep); |
1570 m_vBar->setProportion(clientHeight, m_scrollHeight); | 1535 m_vBar->setProportion(clientHeight, m_scrollHeight); |
1571 } | 1536 } |
1572 | 1537 |
1573 if (renderer()->element() && renderer()->document()->hasListenerType(Documen
t::OVERFLOWCHANGED_LISTENER)) | 1538 if (renderer()->element() && renderer()->document()->hasListenerType(Documen
t::OVERFLOWCHANGED_LISTENER)) |
1574 updateOverflowStatus(horizontalOverflow, verticalOverflow); | 1539 updateOverflowStatus(horizontalOverflow, verticalOverflow); |
1575 } | 1540 } |
1576 | 1541 |
(...skipping 17 matching lines...) Expand all Loading... |
1594 // We fill our scroll corner with white if we have a scrollbar that doesn't
run all the way up to the | 1559 // We fill our scroll corner with white if we have a scrollbar that doesn't
run all the way up to the |
1595 // edge of the box. | 1560 // edge of the box. |
1596 paintScrollCorner(context, tx, ty, damageRect); | 1561 paintScrollCorner(context, tx, ty, damageRect); |
1597 | 1562 |
1598 // Paint our resizer last, since it sits on top of the scroll corner. | 1563 // Paint our resizer last, since it sits on top of the scroll corner. |
1599 paintResizer(context, tx, ty, damageRect); | 1564 paintResizer(context, tx, ty, damageRect); |
1600 } | 1565 } |
1601 | 1566 |
1602 void RenderLayer::paintScrollCorner(GraphicsContext* context, int tx, int ty, co
nst IntRect& damageRect) | 1567 void RenderLayer::paintScrollCorner(GraphicsContext* context, int tx, int ty, co
nst IntRect& damageRect) |
1603 { | 1568 { |
1604 RenderBox* box = renderBox(); | 1569 IntRect cornerRect = scrollCornerRect(this, renderer()->borderBoxRect()); |
1605 ASSERT(box); | |
1606 | |
1607 IntRect cornerRect = scrollCornerRect(this, box->borderBoxRect()); | |
1608 IntRect absRect = IntRect(cornerRect.x() + tx, cornerRect.y() + ty, cornerRe
ct.width(), cornerRect.height()); | 1570 IntRect absRect = IntRect(cornerRect.x() + tx, cornerRect.y() + ty, cornerRe
ct.width(), cornerRect.height()); |
1609 if (!absRect.intersects(damageRect)) | 1571 if (!absRect.intersects(damageRect)) |
1610 return; | 1572 return; |
1611 | 1573 |
1612 if (context->updatingControlTints()) { | 1574 if (context->updatingControlTints()) { |
1613 updateScrollCornerStyle(); | 1575 updateScrollCornerStyle(); |
1614 return; | 1576 return; |
1615 } | 1577 } |
1616 | 1578 |
1617 if (m_scrollCorner) { | 1579 if (m_scrollCorner) { |
1618 m_scrollCorner->paintIntoRect(context, tx, ty, absRect); | 1580 m_scrollCorner->paintIntoRect(context, tx, ty, absRect); |
1619 return; | 1581 return; |
1620 } | 1582 } |
1621 | 1583 |
1622 context->fillRect(absRect, Color::white); | 1584 context->fillRect(absRect, Color::white); |
1623 } | 1585 } |
1624 | 1586 |
1625 void RenderLayer::paintResizer(GraphicsContext* context, int tx, int ty, const I
ntRect& damageRect) | 1587 void RenderLayer::paintResizer(GraphicsContext* context, int tx, int ty, const I
ntRect& damageRect) |
1626 { | 1588 { |
1627 if (renderer()->style()->resize() == RESIZE_NONE) | 1589 if (renderer()->style()->resize() == RESIZE_NONE) |
1628 return; | 1590 return; |
1629 | 1591 |
1630 RenderBox* box = renderBox(); | 1592 IntRect cornerRect = resizerCornerRect(this, renderer()->borderBoxRect()); |
1631 ASSERT(box); | |
1632 | |
1633 IntRect cornerRect = resizerCornerRect(this, box->borderBoxRect()); | |
1634 IntRect absRect = IntRect(cornerRect.x() + tx, cornerRect.y() + ty, cornerRe
ct.width(), cornerRect.height()); | 1593 IntRect absRect = IntRect(cornerRect.x() + tx, cornerRect.y() + ty, cornerRe
ct.width(), cornerRect.height()); |
1635 if (!absRect.intersects(damageRect)) | 1594 if (!absRect.intersects(damageRect)) |
1636 return; | 1595 return; |
1637 | 1596 |
1638 if (context->updatingControlTints()) { | 1597 if (context->updatingControlTints()) { |
1639 updateResizerStyle(); | 1598 updateResizerStyle(); |
1640 return; | 1599 return; |
1641 } | 1600 } |
1642 | 1601 |
1643 if (m_resizer) { | 1602 if (m_resizer) { |
(...skipping 18 matching lines...) Expand all Loading... |
1662 context->drawRect(largerCorner); | 1621 context->drawRect(largerCorner); |
1663 context->restore(); | 1622 context->restore(); |
1664 } | 1623 } |
1665 } | 1624 } |
1666 | 1625 |
1667 bool RenderLayer::isPointInResizeControl(const IntPoint& absolutePoint) const | 1626 bool RenderLayer::isPointInResizeControl(const IntPoint& absolutePoint) const |
1668 { | 1627 { |
1669 if (!renderer()->hasOverflowClip() || renderer()->style()->resize() == RESIZ
E_NONE) | 1628 if (!renderer()->hasOverflowClip() || renderer()->style()->resize() == RESIZ
E_NONE) |
1670 return false; | 1629 return false; |
1671 | 1630 |
1672 RenderBox* box = renderBox(); | |
1673 ASSERT(box); | |
1674 | |
1675 IntPoint localPoint = absoluteToContents(absolutePoint); | 1631 IntPoint localPoint = absoluteToContents(absolutePoint); |
1676 | 1632 |
1677 IntRect localBounds(0, 0, box->width(), box->height()); | 1633 IntRect localBounds(0, 0, renderer()->width(), renderer()->height()); |
1678 return resizerCornerRect(this, localBounds).contains(localPoint); | 1634 return resizerCornerRect(this, localBounds).contains(localPoint); |
1679 } | 1635 } |
1680 | 1636 |
1681 bool RenderLayer::hitTestOverflowControls(HitTestResult& result) | 1637 bool RenderLayer::hitTestOverflowControls(HitTestResult& result) |
1682 { | 1638 { |
1683 if (!m_hBar && !m_vBar && (!renderer()->hasOverflowClip() || renderer()->sty
le()->resize() == RESIZE_NONE)) | 1639 if (!m_hBar && !m_vBar && (!renderer()->hasOverflowClip() || renderer()->sty
le()->resize() == RESIZE_NONE)) |
1684 return false; | 1640 return false; |
1685 | 1641 |
1686 RenderBox* box = renderBox(); | |
1687 ASSERT(box); | |
1688 | |
1689 int x = 0; | 1642 int x = 0; |
1690 int y = 0; | 1643 int y = 0; |
1691 convertToLayerCoords(root(), x, y); | 1644 convertToLayerCoords(root(), x, y); |
1692 IntRect absBounds(x, y, box->width(), box->height()); | 1645 IntRect absBounds(x, y, renderer()->width(), renderer()->height()); |
1693 | 1646 |
1694 IntRect resizeControlRect; | 1647 IntRect resizeControlRect; |
1695 if (renderer()->style()->resize() != RESIZE_NONE) { | 1648 if (renderer()->style()->resize() != RESIZE_NONE) { |
1696 resizeControlRect = resizerCornerRect(this, absBounds); | 1649 resizeControlRect = resizerCornerRect(this, absBounds); |
1697 if (resizeControlRect.contains(result.point())) | 1650 if (resizeControlRect.contains(result.point())) |
1698 return true; | 1651 return true; |
1699 } | 1652 } |
1700 | 1653 |
1701 int resizeControlSize = max(resizeControlRect.height(), 0); | 1654 int resizeControlSize = max(resizeControlRect.height(), 0); |
1702 | 1655 |
1703 if (m_vBar) { | 1656 if (m_vBar) { |
1704 IntRect vBarRect(absBounds.right() - box->borderRight() - m_vBar->width(
), | 1657 IntRect vBarRect(absBounds.right() - renderer()->borderRight() - m_vBar-
>width(), absBounds.y() + renderer()->borderTop(), m_vBar->width(), absBounds.he
ight() - (renderer()->borderTop() + renderer()->borderBottom()) - (m_hBar ? m_hB
ar->height() : resizeControlSize)); |
1705 absBounds.y() + box->borderTop(), | |
1706 m_vBar->width(), | |
1707 absBounds.height() - (box->borderTop() + box->borderBot
tom()) - (m_hBar ? m_hBar->height() : resizeControlSize)); | |
1708 if (vBarRect.contains(result.point())) { | 1658 if (vBarRect.contains(result.point())) { |
1709 result.setScrollbar(m_vBar.get()); | 1659 result.setScrollbar(m_vBar.get()); |
1710 return true; | 1660 return true; |
1711 } | 1661 } |
1712 } | 1662 } |
1713 | 1663 |
1714 resizeControlSize = max(resizeControlRect.width(), 0); | 1664 resizeControlSize = max(resizeControlRect.width(), 0); |
1715 if (m_hBar) { | 1665 if (m_hBar) { |
1716 IntRect hBarRect(absBounds.x() + box->borderLeft(), | 1666 IntRect hBarRect(absBounds.x() + renderer()->borderLeft(), absBounds.bot
tom() - renderer()->borderBottom() - m_hBar->height(), absBounds.width() - (rend
erer()->borderLeft() + renderer()->borderRight()) - (m_vBar ? m_vBar->width() :
resizeControlSize), m_hBar->height()); |
1717 absBounds.bottom() - box->borderBottom() - m_hBar->heig
ht(), | |
1718 absBounds.width() - (box->borderLeft() + box->borderRig
ht()) - (m_vBar ? m_vBar->width() : resizeControlSize), | |
1719 m_hBar->height()); | |
1720 if (hBarRect.contains(result.point())) { | 1667 if (hBarRect.contains(result.point())) { |
1721 result.setScrollbar(m_hBar.get()); | 1668 result.setScrollbar(m_hBar.get()); |
1722 return true; | 1669 return true; |
1723 } | 1670 } |
1724 } | 1671 } |
1725 | 1672 |
1726 return false; | 1673 return false; |
1727 } | 1674 } |
1728 | 1675 |
1729 bool RenderLayer::scroll(ScrollDirection direction, ScrollGranularity granularit
y, float multiplier) | 1676 bool RenderLayer::scroll(ScrollDirection direction, ScrollGranularity granularit
y, float multiplier) |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1849 m_paintingInsideReflection = true; | 1796 m_paintingInsideReflection = true; |
1850 reflectionLayer()->paintLayer(rootLayer, p, paintDirtyRect, haveTranspar
ency, paintRestriction, paintingRoot, false, temporaryClipRects); | 1797 reflectionLayer()->paintLayer(rootLayer, p, paintDirtyRect, haveTranspar
ency, paintRestriction, paintingRoot, false, temporaryClipRects); |
1851 m_paintingInsideReflection = false; | 1798 m_paintingInsideReflection = false; |
1852 } | 1799 } |
1853 | 1800 |
1854 // Calculate the clip rects we should use. | 1801 // Calculate the clip rects we should use. |
1855 IntRect layerBounds, damageRect, clipRectToApply, outlineRect; | 1802 IntRect layerBounds, damageRect, clipRectToApply, outlineRect; |
1856 calculateRects(rootLayer, paintDirtyRect, layerBounds, damageRect, clipRectT
oApply, outlineRect, temporaryClipRects); | 1803 calculateRects(rootLayer, paintDirtyRect, layerBounds, damageRect, clipRectT
oApply, outlineRect, temporaryClipRects); |
1857 int x = layerBounds.x(); | 1804 int x = layerBounds.x(); |
1858 int y = layerBounds.y(); | 1805 int y = layerBounds.y(); |
1859 int tx = x - renderBoxX(); | 1806 int tx = x - renderer()->x(); |
1860 int ty = y - renderBoxY(); | 1807 int ty = y - renderer()->y(); |
1861 | 1808 |
1862 // Ensure our lists are up-to-date. | 1809 // Ensure our lists are up-to-date. |
1863 updateLayerListsIfNeeded(); | 1810 updateLayerListsIfNeeded(); |
1864 | 1811 |
1865 bool selectionOnly = paintRestriction == PaintRestrictionSelectionOnly || pa
intRestriction == PaintRestrictionSelectionOnlyBlackText; | 1812 bool selectionOnly = paintRestriction == PaintRestrictionSelectionOnly || pa
intRestriction == PaintRestrictionSelectionOnlyBlackText; |
1866 bool forceBlackText = paintRestriction == PaintRestrictionSelectionOnlyBlack
Text; | 1813 bool forceBlackText = paintRestriction == PaintRestrictionSelectionOnlyBlack
Text; |
1867 | 1814 |
1868 // If this layer's renderer is a child of the paintingRoot, we render uncond
itionally, which | 1815 // If this layer's renderer is a child of the paintingRoot, we render uncond
itionally, which |
1869 // is done by passing a nil paintingRoot down to our renderer (as if no pain
tingRoot was ever set). | 1816 // is done by passing a nil paintingRoot down to our renderer (as if no pain
tingRoot was ever set). |
1870 // Else, our renderer tree may or may not contain the painting root, so we p
ass that root along | 1817 // Else, our renderer tree may or may not contain the painting root, so we p
ass that root along |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2072 for (int i = m_overflowList->size() - 1; i >= 0; --i) { | 2019 for (int i = m_overflowList->size() - 1; i >= 0; --i) { |
2073 insideLayer = m_overflowList->at(i)->hitTestLayer(rootLayer, request
, result, hitTestRect, hitTestPoint); | 2020 insideLayer = m_overflowList->at(i)->hitTestLayer(rootLayer, request
, result, hitTestRect, hitTestPoint); |
2074 if (insideLayer) | 2021 if (insideLayer) |
2075 return insideLayer; | 2022 return insideLayer; |
2076 } | 2023 } |
2077 } | 2024 } |
2078 | 2025 |
2079 // Next we want to see if the mouse pos is inside the child RenderObjects of
the layer. | 2026 // Next we want to see if the mouse pos is inside the child RenderObjects of
the layer. |
2080 if (fgRect.contains(hitTestPoint) && | 2027 if (fgRect.contains(hitTestPoint) && |
2081 renderer()->hitTest(request, result, hitTestPoint, | 2028 renderer()->hitTest(request, result, hitTestPoint, |
2082 layerBounds.x() - renderBoxX(), | 2029 layerBounds.x() - renderer()->x(), |
2083 layerBounds.y() - renderBoxY(), | 2030 layerBounds.y() - renderer()->y(), |
2084 HitTestDescendants)) { | 2031 HitTestDescendants)) { |
2085 // For positioned generated content, we might still not have a | 2032 // For positioned generated content, we might still not have a |
2086 // node by the time we get to the layer level, since none of | 2033 // node by the time we get to the layer level, since none of |
2087 // the content in the layer has an element. So just walk up | 2034 // the content in the layer has an element. So just walk up |
2088 // the tree. | 2035 // the tree. |
2089 if (!result.innerNode() || !result.innerNonSharedNode()) { | 2036 if (!result.innerNode() || !result.innerNonSharedNode()) { |
2090 Node* e = enclosingElement(); | 2037 Node* e = enclosingElement(); |
2091 if (!result.innerNode()) | 2038 if (!result.innerNode()) |
2092 result.setInnerNode(e); | 2039 result.setInnerNode(e); |
2093 if (!result.innerNonSharedNode()) | 2040 if (!result.innerNonSharedNode()) |
2094 result.setInnerNonSharedNode(e); | 2041 result.setInnerNonSharedNode(e); |
2095 } | 2042 } |
2096 | 2043 |
2097 return this; | 2044 return this; |
2098 } | 2045 } |
2099 | 2046 |
2100 // Now check our negative z-index children. | 2047 // Now check our negative z-index children. |
2101 if (m_negZOrderList) { | 2048 if (m_negZOrderList) { |
2102 for (int i = m_negZOrderList->size() - 1; i >= 0; --i) { | 2049 for (int i = m_negZOrderList->size() - 1; i >= 0; --i) { |
2103 insideLayer = m_negZOrderList->at(i)->hitTestLayer(rootLayer, reques
t, result, hitTestRect, hitTestPoint); | 2050 insideLayer = m_negZOrderList->at(i)->hitTestLayer(rootLayer, reques
t, result, hitTestRect, hitTestPoint); |
2104 if (insideLayer) | 2051 if (insideLayer) |
2105 return insideLayer; | 2052 return insideLayer; |
2106 } | 2053 } |
2107 } | 2054 } |
2108 | 2055 |
2109 // Next we want to see if the mouse is inside this layer but not any of its
children. | 2056 // Next we want to see if the mouse is inside this layer but not any of its
children. |
2110 if (bgRect.contains(hitTestPoint) && | 2057 if (bgRect.contains(hitTestPoint) && |
2111 renderer()->hitTest(request, result, hitTestPoint, | 2058 renderer()->hitTest(request, result, hitTestPoint, |
2112 layerBounds.x() - renderBoxX(), | 2059 layerBounds.x() - renderer()->x(), |
2113 layerBounds.y() - renderBoxY(), | 2060 layerBounds.y() - renderer()->y(), |
2114 HitTestSelf)) { | 2061 HitTestSelf)) { |
2115 if (!result.innerNode() || !result.innerNonSharedNode()) { | 2062 if (!result.innerNode() || !result.innerNonSharedNode()) { |
2116 Node* e = enclosingElement(); | 2063 Node* e = enclosingElement(); |
2117 if (!result.innerNode()) | 2064 if (!result.innerNode()) |
2118 result.setInnerNode(e); | 2065 result.setInnerNode(e); |
2119 if (!result.innerNonSharedNode()) | 2066 if (!result.innerNonSharedNode()) |
2120 result.setInnerNonSharedNode(e); | 2067 result.setInnerNonSharedNode(e); |
2121 } | 2068 } |
2122 | 2069 |
2123 return this; | 2070 return this; |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2341 // Go from our first line box to our last line box. | 2288 // Go from our first line box to our last line box. |
2342 RenderInline* inlineFlow = toRenderInline(renderer()); | 2289 RenderInline* inlineFlow = toRenderInline(renderer()); |
2343 InlineFlowBox* firstBox = inlineFlow->firstLineBox(); | 2290 InlineFlowBox* firstBox = inlineFlow->firstLineBox(); |
2344 if (!firstBox) | 2291 if (!firstBox) |
2345 return result; | 2292 return result; |
2346 int top = firstBox->root()->topOverflow(); | 2293 int top = firstBox->root()->topOverflow(); |
2347 int bottom = inlineFlow->lastLineBox()->root()->bottomOverflow(); | 2294 int bottom = inlineFlow->lastLineBox()->root()->bottomOverflow(); |
2348 int left = firstBox->xPos(); | 2295 int left = firstBox->xPos(); |
2349 for (InlineRunBox* curr = firstBox->nextLineBox(); curr; curr = curr->ne
xtLineBox()) | 2296 for (InlineRunBox* curr = firstBox->nextLineBox(); curr; curr = curr->ne
xtLineBox()) |
2350 left = min(left, curr->xPos()); | 2297 left = min(left, curr->xPos()); |
2351 result = IntRect(left, top, width(), bottom - top); | 2298 result = IntRect(left, (top - renderer()->y()), width(), bottom - top); |
2352 } else if (renderer()->isTableRow()) { | 2299 } else if (renderer()->isTableRow()) { |
2353 // Our bounding box is just the union of all of our cells' border/overfl
ow rects. | 2300 // Our bounding box is just the union of all of our cells' border/overfl
ow rects. |
2354 for (RenderObject* child = renderer()->firstChild(); child; child = chil
d->nextSibling()) { | 2301 for (RenderObject* child = renderer()->firstChild(); child; child = chil
d->nextSibling()) { |
2355 if (child->isTableCell()) { | 2302 if (child->isTableCell()) { |
2356 IntRect bbox = toRenderBox(child)->borderBoxRect(); | 2303 IntRect bbox = toRenderBox(child)->borderBoxRect(); |
2357 result.unite(bbox); | 2304 result.unite(bbox); |
2358 IntRect overflowRect = renderBox()->overflowRect(false); | 2305 IntRect overflowRect = renderer()->overflowRect(false); |
2359 if (bbox != overflowRect) | 2306 if (bbox != overflowRect) |
2360 result.unite(overflowRect); | 2307 result.unite(overflowRect); |
2361 } | 2308 } |
2362 } | 2309 } |
2363 } else { | 2310 } else { |
2364 RenderBox* box = renderBox(); | 2311 if (renderer()->hasMask()) |
2365 ASSERT(box); | 2312 result = renderer()->maskClipRect(); |
2366 if (box->hasMask()) | |
2367 result = box->maskClipRect(); | |
2368 else { | 2313 else { |
2369 IntRect bbox = box->borderBoxRect(); | 2314 IntRect bbox = renderer()->borderBoxRect(); |
2370 result = bbox; | 2315 result = bbox; |
2371 IntRect overflowRect = box->overflowRect(false); | 2316 IntRect overflowRect = renderer()->overflowRect(false); |
2372 if (bbox != overflowRect) | 2317 if (bbox != overflowRect) |
2373 result.unite(overflowRect); | 2318 result.unite(overflowRect); |
2374 } | 2319 } |
2375 } | 2320 } |
2376 | 2321 |
2377 RenderView* view = renderer()->view(); | 2322 RenderView* view = renderer()->view(); |
2378 ASSERT(view); | 2323 ASSERT(view); |
2379 if (view) | 2324 if (view) |
2380 result.inflate(view->maximalOutlineSize()); // Used to apply a fudge fac
tor to dirty-rect checks on blocks/tables. | 2325 result.inflate(view->maximalOutlineSize()); // Used to apply a fudge fac
tor to dirty-rect checks on blocks/tables. |
2381 | 2326 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2834 if (m_marquee) | 2779 if (m_marquee) |
2835 m_marquee->suspend(); | 2780 m_marquee->suspend(); |
2836 | 2781 |
2837 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) | 2782 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) |
2838 curr->suspendMarquees(); | 2783 curr->suspendMarquees(); |
2839 } | 2784 } |
2840 | 2785 |
2841 } // namespace WebCore | 2786 } // namespace WebCore |
2842 | 2787 |
2843 | 2788 |
OLD | NEW |