summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/layout/layout_table_col.h
blob: f43776fa8c7159694800b9f1fcab5bd6156ed735 (plain)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
 *           (C) 1997 Torben Weis (weis@kde.org)
 *           (C) 1998 Waldo Bastian (bastian@kde.org)
 *           (C) 1999 Lars Knoll (knoll@kde.org)
 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved.
 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_TABLE_COL_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_TABLE_COL_H_

#include "third_party/blink/renderer/core/layout/layout_table_box_component.h"

namespace blink {

class LayoutTable;

// LayoutTableCol is used to represent table column or column groups
// (display: table-column and display: table-column-group).
//
// The reason to use the same LayoutObject is that both objects behave in a very
// similar way. The main difference between the 2 is that table-column-group
// allows table-column children, when table-column don't.
// Note that this matches how <col> and <colgroup> map to the same class:
// HTMLTableColElement.
//
// In HTML and CSS, table columns and colgroups don't own the cells, they are
// descendants of the rows.
// As such table columns and colgroups have a very limited scope in the table:
// - column / cell sizing (the 'width' property)
// - background painting (the 'background' property).
// - border collapse resolution
//   (http://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution)
//
// See http://www.w3.org/TR/CSS21/tables.html#columns for the standard.
// Note that we don't implement the "visibility: collapse" inheritance to the
// cells.
//
// Because table columns and column groups are placeholder elements (see
// previous paragraph), they are never laid out and layout() should not be
// called on them.
class LayoutTableCol final : public LayoutTableBoxComponent {
 public:
  explicit LayoutTableCol(Element*);

  void ClearIntrinsicLogicalWidthsDirtyBits();

  // The 'span' attribute in HTML.
  // For CSS table columns or colgroups, this is always 1.
  unsigned Span() const {
    NOT_DESTROYED();
    return span_;
  }

  bool IsTableColumnGroupWithColumnChildren() {
    NOT_DESTROYED();
    return FirstChild();
  }
  bool IsTableColumn() const {
    NOT_DESTROYED();
    return StyleRef().Display() == EDisplay::kTableColumn;
  }
  bool IsTableColumnGroup() const {
    NOT_DESTROYED();
    return StyleRef().Display() == EDisplay::kTableColumnGroup;
  }

  LayoutTableCol* EnclosingColumnGroup() const;

  // Returns the next column or column-group.
  LayoutTableCol* NextColumn() const;

  const char* GetName() const override {
    NOT_DESTROYED();
    return "LayoutTableCol";
  }

 private:
  bool IsOfType(LayoutObjectType type) const override {
    NOT_DESTROYED();
    return type == kLayoutObjectTableCol || LayoutBox::IsOfType(type);
  }
  void UpdateFromElement() override;

  MinMaxSizes PreferredLogicalWidths() const override {
    NOT_DESTROYED();
    NOTREACHED();
    return MinMaxSizes();
  }
  MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
    NOT_DESTROYED();
    NOTREACHED();
    return MinMaxSizes();
  }

  void InsertedIntoTree() override;
  void WillBeRemovedFromTree() override;

  bool IsChildAllowed(LayoutObject*, const ComputedStyle&) const override;
  bool CanHaveChildren() const override;
  PaintLayerType LayerTypeRequired() const override {
    NOT_DESTROYED();
    return kNoPaintLayer;
  }

  void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override;

  LayoutTable* Table() const final;

  unsigned span_;
};

DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableCol, IsLayoutTableCol());

}  // namespace blink

#endif