1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/layout/line/InlineTextBox.h"
#include "core/layout/LayoutTestHelper.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
class InlineTextBoxTest : public RenderingTest {};
class TestInlineTextBox : public InlineTextBox {
public:
TestInlineTextBox(LineLayoutItem item) : InlineTextBox(item, 0, 0) {
setHasVirtualLogicalHeight();
}
static TestInlineTextBox* create(Document& document, const String& string) {
Text* node = document.createTextNode(string);
LayoutText* text = new LayoutText(node, string.impl());
text->setStyle(ComputedStyle::create());
return new TestInlineTextBox(LineLayoutItem(text));
}
LayoutUnit virtualLogicalHeight() const override { return m_logicalHeight; }
void setLogicalFrameRect(const LayoutRect& rect) {
setX(rect.x());
setY(rect.y());
setLogicalWidth(rect.width());
m_logicalHeight = rect.height();
}
private:
LayoutUnit m_logicalHeight;
};
static void moveAndTest(InlineTextBox* box,
const LayoutSize& move,
LayoutRect& frame,
LayoutRect& overflow) {
box->move(move);
frame.move(move);
overflow.move(move);
ASSERT_EQ(frame, box->logicalFrameRect());
ASSERT_EQ(overflow, box->logicalOverflowRect());
}
TEST_F(InlineTextBoxTest, LogicalOverflowRect) {
// Setup a TestInlineTextBox.
TestInlineTextBox* box = TestInlineTextBox::create(document(), "");
// Initially, logicalOverflowRect() should be the same as logicalFrameRect().
LayoutRect frame(5, 20, 100, 200);
LayoutRect overflow = frame;
box->setLogicalFrameRect(frame);
ASSERT_EQ(frame, box->logicalFrameRect());
ASSERT_EQ(overflow, box->logicalOverflowRect());
// Ensure it's movable and the rects are correct.
LayoutSize move(10, 10);
moveAndTest(box, move, frame, overflow);
// Ensure clearKnownToHaveNoOverflow() doesn't change either rects.
box->clearKnownToHaveNoOverflow();
ASSERT_EQ(frame, box->logicalFrameRect());
ASSERT_EQ(overflow, box->logicalOverflowRect());
// Ensure it's still movable correctly when !knownToHaveNoOverflow().
moveAndTest(box, move, frame, overflow);
// Let it have different logicalOverflowRect() than logicalFrameRect().
overflow.expand(LayoutSize(10, 10));
box->setLogicalOverflowRect(overflow);
ASSERT_EQ(frame, box->logicalFrameRect());
ASSERT_EQ(overflow, box->logicalOverflowRect());
// Ensure it's still movable correctly.
moveAndTest(box, move, frame, overflow);
}
} // namespace blink
|