OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "config.h" |
| 6 #include "core/rendering/RenderObject.h" |
| 7 |
| 8 #include "core/html/HTMLElement.h" |
| 9 #include "core/rendering/RenderView.h" |
| 10 #include "core/testing/DummyPageHolder.h" |
| 11 #include <gtest/gtest.h> |
| 12 |
| 13 using namespace WebCore; |
| 14 |
| 15 namespace { |
| 16 |
| 17 // Base class for RenderObject testing, it exposes some useful getter. |
| 18 class RenderObjectTest : public testing::Test { |
| 19 protected: |
| 20 virtual void SetUp() OVERRIDE |
| 21 { |
| 22 m_pageHolder = DummyPageHolder::create(IntSize(800, 600)); |
| 23 |
| 24 // This ensures that the minimal DOM tree gets attached |
| 25 // correctly for tests that don't call setBodyInnerHTML. |
| 26 document().view()->updateLayoutAndStyleIfNeededRecursive(); |
| 27 } |
| 28 |
| 29 Document& document() const { return m_pageHolder->document(); } |
| 30 RenderView& renderView() const { return *document().renderView(); } |
| 31 |
| 32 void setBodyInnerHTML(const char*); |
| 33 |
| 34 private: |
| 35 OwnPtr<DummyPageHolder> m_pageHolder; |
| 36 }; |
| 37 |
| 38 void RenderObjectTest::setBodyInnerHTML(const char* htmlContent) |
| 39 { |
| 40 document().body()->setInnerHTML(String::fromUTF8(htmlContent), ASSERT_NO_EXC
EPTION); |
| 41 document().view()->updateLayoutAndStyleIfNeededRecursive(); |
| 42 } |
| 43 |
| 44 TEST_F(RenderObjectTest, DisplayNoneCreateObject) |
| 45 { |
| 46 setBodyInnerHTML("<div style='display:none'></div>"); |
| 47 EXPECT_EQ(nullptr, document().body()->firstChild()->renderer()); |
| 48 } |
| 49 |
| 50 TEST_F(RenderObjectTest, DisplayBlockCreateObject) |
| 51 { |
| 52 setBodyInnerHTML("<foo style='display:block'></foo>"); |
| 53 RenderObject* renderer = document().body()->firstChild()->renderer(); |
| 54 EXPECT_NE(nullptr, renderer); |
| 55 EXPECT_TRUE(renderer->isRenderBlockFlow()); |
| 56 } |
| 57 |
| 58 TEST_F(RenderObjectTest, DisplayInlineBlockCreateObject) |
| 59 { |
| 60 setBodyInnerHTML("<foo style='display:inline-block'></foo>"); |
| 61 RenderObject* renderer = document().body()->firstChild()->renderer(); |
| 62 EXPECT_NE(nullptr, renderer); |
| 63 EXPECT_TRUE(renderer->isRenderBlockFlow()); |
| 64 } |
| 65 |
| 66 |
| 67 |
| 68 // Containing block test. |
| 69 TEST_F(RenderObjectTest, ContainingBlockRenderViewShouldBeNull) |
| 70 { |
| 71 EXPECT_EQ(nullptr, renderView().containingBlock()); |
| 72 } |
| 73 |
| 74 TEST_F(RenderObjectTest, ContainingBlockBodyShouldBeDocumentElement) |
| 75 { |
| 76 EXPECT_EQ(document().body()->renderer()->containingBlock(), document().docum
entElement()->renderer()); |
| 77 } |
| 78 |
| 79 TEST_F(RenderObjectTest, ContainingBlockDocumentElementShouldBeRenderView) |
| 80 { |
| 81 EXPECT_EQ(document().documentElement()->renderer()->containingBlock(), rende
rView()); |
| 82 } |
| 83 |
| 84 TEST_F(RenderObjectTest, ContainingBlockStaticRendererShouldBeParent) |
| 85 { |
| 86 setBodyInnerHTML("<foo style='position:static'></foo>"); |
| 87 RenderObject* bodyRenderer = document().body()->renderer(); |
| 88 RenderObject* renderer = bodyRenderer->slowFirstChild(); |
| 89 EXPECT_EQ(renderer->containingBlock(), bodyRenderer); |
| 90 } |
| 91 |
| 92 TEST_F(RenderObjectTest, ContainingBlockAbsoluteRendererShouldBeRenderView) |
| 93 { |
| 94 setBodyInnerHTML("<foo style='position:absolute'></foo>"); |
| 95 RenderObject* renderer = document().body()->renderer()->slowFirstChild(); |
| 96 EXPECT_EQ(renderer->containingBlock(), renderView()); |
| 97 } |
| 98 |
| 99 TEST_F(RenderObjectTest, ContainingBlockAbsoluteRendererShouldBeNonStaticlyPosit
ionedBlockAncestor) |
| 100 { |
| 101 setBodyInnerHTML("<div style='position:relative'><bar style='position:absolu
te'></bar></div>"); |
| 102 RenderObject* containingBlockRenderer = document().body()->renderer()->slowF
irstChild(); |
| 103 RenderObject* renderer = containingBlockRenderer->slowFirstChild(); |
| 104 EXPECT_EQ(renderer->containingBlock(), containingBlockRenderer); |
| 105 } |
| 106 |
| 107 TEST_F(RenderObjectTest, ContainingBlockAbsoluteRendererShouldNotBeNonStaticlyPo
sitionedInlineAncestor) |
| 108 { |
| 109 setBodyInnerHTML("<span style='position:relative'><bar style='position:absol
ute'></bar></span>"); |
| 110 RenderObject* bodyRenderer = document().body()->renderer(); |
| 111 RenderObject* renderer = bodyRenderer->slowFirstChild()->slowFirstChild(); |
| 112 EXPECT_EQ(renderer->containingBlock(), bodyRenderer); |
| 113 } |
| 114 |
| 115 } // namespace |
OLD | NEW |