| Index: Source/WebCore/rendering/RenderDialog.cpp
|
| diff --git a/Source/WebCore/rendering/RenderDialog.cpp b/Source/WebCore/rendering/RenderDialog.cpp
|
| index b8f3d198574f083664500983f180aa2d93850e9d..f40abc688ff32a499ef4c5b15c9222a81b31c97b 100644
|
| --- a/Source/WebCore/rendering/RenderDialog.cpp
|
| +++ b/Source/WebCore/rendering/RenderDialog.cpp
|
| @@ -40,28 +40,37 @@ void RenderDialog::layout()
|
| LayoutRepainter repainter(*this, true);
|
| LayoutStateMaintainer statePusher(view(), this, locationOffset(), hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode());
|
|
|
| + bool hadLayout = everHadLayout();
|
| + if (hadLayout) {
|
| + if (layer())
|
| + layer()->setStaticBlockPosition(m_staticBlockPos);
|
| + }
|
| RenderBlock::layout();
|
|
|
| RenderStyle* styleToUse = style();
|
| - if (styleToUse->position() != AbsolutePosition || !styleToUse->top().isAuto() || !styleToUse->bottom().isAuto()) {
|
| + if ((styleToUse->position() != AbsolutePosition && styleToUse->position() != RelativePosition) || !styleToUse->top().isAuto() || !styleToUse->bottom().isAuto()) {
|
| statePusher.pop();
|
| return;
|
| }
|
|
|
| - // Adjust the dialog's position to be centered in or at the top of the viewport.
|
| - // FIXME: Figure out what to do in vertical writing mode.
|
| - FrameView* frameView = document()->view();
|
| - int scrollTop = frameView->scrollOffset().height();
|
| - FloatPoint absolutePoint(0, scrollTop);
|
| - int visibleHeight = frameView->visibleContentRect(ScrollableArea::IncludeScrollbars).height();
|
| - if (height() < visibleHeight)
|
| - absolutePoint.move(0, (visibleHeight - height()) / 2);
|
| - FloatPoint localPoint = containingBlock()->absoluteToLocal(absolutePoint);
|
| - LayoutUnit localTop = LayoutSize(localPoint.x(), localPoint.y()).height();
|
| - setY(localTop);
|
| + if (!hadLayout) {
|
| + FrameView* frameView = document()->view();
|
| + int scrollTop = frameView->scrollOffset().height();
|
| + FloatPoint absolutePoint(0, scrollTop);
|
| + int visibleHeight = frameView->visibleContentRect(ScrollableArea::IncludeScrollbars).height();
|
| + if (height() < visibleHeight)
|
| + absolutePoint.move(0, (visibleHeight - height()) / 2);
|
| + FloatPoint localPoint = containingBlock()->absoluteToLocal(absolutePoint);
|
| + LayoutUnit localTop = LayoutSize(localPoint.x(), localPoint.y()).height();
|
|
|
| + m_staticBlockPos = localTop;
|
| + layer()->setStaticBlockPosition(m_staticBlockPos);
|
| + setNeedsLayout(true);
|
| + RenderBlock::layout();
|
| + } else {
|
| + ASSERT(layer()->staticBlockPosition() == m_staticBlockPos);
|
| + }
|
| statePusher.pop();
|
| - // FIXME: Since there is always a layer here, repainter shouldn't be necessary. But without it, the dialog is sometimes not painted (see bug 90670).
|
| repainter.repaintAfterLayout();
|
| }
|
|
|
|
|