blob: 0acff48f33cc2ccf8c9592108859c9e88937a043 [file] [log] [blame]
// Copyright 2017 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/ng/ng_layout_input_node.h"
#include "core/layout/ng/inline/ng_inline_node.h"
#include "core/layout/ng/layout_ng_block_flow.h"
#include "core/layout/ng/ng_block_node.h"
#include "core/layout/ng/ng_layout_result.h"
#include "core/layout/ng/ng_min_max_content_size.h"
#include "platform/wtf/text/StringBuilder.h"
namespace blink {
namespace {
#ifndef NDEBUG
void AppendNodeToString(NGLayoutInputNode node,
StringBuilder* string_builder,
unsigned indent = 2) {
if (!node)
return;
DCHECK(string_builder);
string_builder->Append(node.ToString());
string_builder->Append("\n");
StringBuilder indent_builder;
for (unsigned i = 0; i < indent; i++)
indent_builder.Append(" ");
if (node.IsBlock()) {
NGLayoutInputNode first_child = ToNGBlockNode(node).FirstChild();
for (NGLayoutInputNode node_runner = first_child; node_runner;
node_runner = node_runner.NextSibling()) {
string_builder->Append(indent_builder.ToString());
AppendNodeToString(node_runner, string_builder, indent + 2);
}
}
if (node.IsInline()) {
for (const NGInlineItem& inline_item : ToNGInlineNode(node).Items()) {
string_builder->Append(indent_builder.ToString());
string_builder->Append(inline_item.ToString());
string_builder->Append("\n");
}
NGLayoutInputNode next_sibling = ToNGInlineNode(node).NextSibling();
for (NGLayoutInputNode node_runner = next_sibling; node_runner;
node_runner = node_runner.NextSibling()) {
string_builder->Append(indent_builder.ToString());
AppendNodeToString(node_runner, string_builder, indent + 2);
}
}
}
#endif
} // namespace
bool NGLayoutInputNode::IsInline() const {
return box_->LayoutNGInline();
}
bool NGLayoutInputNode::IsBlock() const {
return !IsInline();
}
bool NGLayoutInputNode::IsFloating() const {
return IsBlock() && Style().IsFloating();
}
bool NGLayoutInputNode::IsOutOfFlowPositioned() const {
return IsBlock() && Style().HasOutOfFlowPosition();
}
RefPtr<NGLayoutResult> NGLayoutInputNode::Layout(NGConstraintSpace* space,
NGBreakToken* break_token) {
return IsInline() ? ToNGInlineNode(*this).Layout(space, break_token)
: ToNGBlockNode(*this).Layout(space, break_token);
}
MinMaxContentSize NGLayoutInputNode::ComputeMinMaxContentSize() {
return IsInline() ? ToNGInlineNode(*this).ComputeMinMaxContentSize()
: ToNGBlockNode(*this).ComputeMinMaxContentSize();
}
NGLayoutInputNode NGLayoutInputNode::NextSibling() {
return IsInline() ? ToNGInlineNode(*this).NextSibling()
: ToNGBlockNode(*this).NextSibling();
}
LayoutObject* NGLayoutInputNode::GetLayoutObject() const {
return box_;
}
const ComputedStyle& NGLayoutInputNode::Style() const {
return box_->StyleRef();
}
String NGLayoutInputNode::ToString() const {
return IsInline() ? ToNGInlineNode(*this).ToString()
: ToNGBlockNode(*this).ToString();
}
#ifndef NDEBUG
void NGLayoutInputNode::ShowNodeTree() const {
StringBuilder string_builder;
string_builder.Append("\n.:: LayoutNG Node Tree ::.\n\n");
AppendNodeToString(*this, &string_builder);
fprintf(stderr, "%s\n", string_builder.ToString().Utf8().data());
}
#endif
} // namespace blink