Index: Source/WebCore/html/HTMLDialogElement.cpp |
diff --git a/Source/WebCore/html/HTMLDialogElement.cpp b/Source/WebCore/html/HTMLDialogElement.cpp |
index 3f32fa3cd223537a4fc0b09ea5a6d3bf26b88f55..12206db0b180ce306140bb264855d45883273d31 100644 |
--- a/Source/WebCore/html/HTMLDialogElement.cpp |
+++ b/Source/WebCore/html/HTMLDialogElement.cpp |
@@ -28,7 +28,10 @@ |
#include "HTMLDialogElement.h" |
#include "ExceptionCode.h" |
-#include "RenderDialog.h" |
+#include "FrameView.h" |
+#include "RenderBlock.h" |
+#include "RenderStyle.h" |
+#include "StyleResolver.h" |
namespace WebCore { |
@@ -36,8 +39,11 @@ using namespace HTMLNames; |
HTMLDialogElement::HTMLDialogElement(const QualifiedName& tagName, Document* document) |
: HTMLElement(tagName, document) |
+ , m_topIsValid(false) |
+ , m_top(0) |
{ |
ASSERT(hasTagName(dialogTag)); |
+ setHasCustomStyleCallbacks(); |
ScriptWrappable::init(this); |
} |
@@ -54,6 +60,50 @@ void HTMLDialogElement::close(ExceptionCode& ec) |
} |
setBooleanAttribute(openAttr, false); |
document()->removeFromTopLayer(this); |
+ m_topIsValid = false; |
+} |
+ |
+PassRefPtr<RenderStyle> HTMLDialogElement::customStyleForRenderer() |
+{ |
+ RefPtr<RenderStyle> originalStyle = document()->styleResolver()->styleForElement(this); |
+ RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get()); |
+ |
+ // Override top to remain centered after style recalcs. |
+ if (style->position() == AbsolutePosition && style->top().isAuto() && style->bottom().isAuto()) { |
esprehn
2013/04/16 08:32:06
Can you put this check in a static helper method?
falken
2013/04/16 12:02:14
Done.
|
+ if (m_topIsValid) |
+ style->setTop(Length(m_top.toInt(), WebCore::Fixed)); |
+ } |
+ |
+ return style.release(); |
+} |
+ |
+void HTMLDialogElement::setupDefaultUnanchoredPosition() |
esprehn
2013/04/16 08:32:06
I might rename this positionAndReattach(), it's no
falken
2013/04/16 12:02:14
Done.
|
+{ |
+ ASSERT(!m_topIsValid); |
+ |
+ // Layout because we need to know our ancestors' positions and our own height. |
+ document()->updateLayoutIgnorePendingStylesheets(); |
+ |
+ if (!renderer()) |
+ return; |
+ RenderStyle* styleToUse = renderer()->style(); |
+ if (styleToUse->position() != AbsolutePosition || !styleToUse->top().isAuto() || !styleToUse->bottom().isAuto()) |
+ return; |
+ RenderBlock* block = toRenderBlock(renderer()); |
esprehn
2013/04/16 08:32:06
I'd use a renderBox() method instead and RenderBox
falken
2013/04/16 12:02:14
Done.
|
+ |
+ // Set up dialog's position to be safe-centered in 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 (block->height() < visibleHeight) |
+ absolutePoint.move(0, (visibleHeight - block->height()) / 2); |
+ FloatPoint localPoint = block->containingBlock()->absoluteToLocal(absolutePoint); |
+ |
+ m_top = LayoutSize(localPoint.x(), localPoint.y()).height(); |
+ m_topIsValid = true; |
+ reattach(); |
esprehn
2013/04/16 08:32:06
You might add a FIXME here. We can instead mutate
falken
2013/04/16 12:02:14
Done.
|
} |
void HTMLDialogElement::show() |
@@ -61,6 +111,7 @@ void HTMLDialogElement::show() |
if (fastHasAttribute(openAttr)) |
return; |
setBooleanAttribute(openAttr, true); |
+ setupDefaultUnanchoredPosition(); |
esprehn
2013/04/16 08:32:06
You can trivially make this assert by doing dialog
falken
2013/04/16 12:02:14
Good point. I removed the assert and added a test
|
} |
void HTMLDialogElement::showModal(ExceptionCode& ec) |
@@ -69,8 +120,9 @@ void HTMLDialogElement::showModal(ExceptionCode& ec) |
ec = INVALID_STATE_ERR; |
return; |
} |
- setBooleanAttribute(openAttr, true); |
document()->addToTopLayer(this); |
+ setBooleanAttribute(openAttr, true); |
+ setupDefaultUnanchoredPosition(); |
} |
bool HTMLDialogElement::isPresentationAttribute(const QualifiedName& name) const |
@@ -83,11 +135,6 @@ bool HTMLDialogElement::isPresentationAttribute(const QualifiedName& name) const |
return HTMLElement::isPresentationAttribute(name); |
} |
-RenderObject* HTMLDialogElement::createRenderer(RenderArena* arena, RenderStyle*) |
-{ |
- return new (arena) RenderDialog(this); |
-} |
- |
} |
#endif |