| Index: third_party/WebKit/Source/core/layout/LayoutTable.h
 | 
| diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.h b/third_party/WebKit/Source/core/layout/LayoutTable.h
 | 
| index 335eea31c9ba0c8eaf6dda84c94307acaa77c089..5431633915b68cebe38eb2e77e8039c288e3a3d3 100644
 | 
| --- a/third_party/WebKit/Source/core/layout/LayoutTable.h
 | 
| +++ b/third_party/WebKit/Source/core/layout/LayoutTable.h
 | 
| @@ -127,8 +127,8 @@ enum TableHeightChangingValue { kTableHeightNotChanging, kTableHeightChanging };
 | 
|  // </table>
 | 
|  //
 | 
|  // Columns can be split if we add a row with a different colspan structure.
 | 
| -// See splitEffectiveColumn() and appendEffectiveColumn() for operations
 | 
| -// over effectiveColumns() and effectiveColumnPositions().
 | 
| +// See SplitEffectiveColumn() and AppendEffectiveColumn() for operations
 | 
| +// over EffectiveColumns() and EffectiveColumnPositions().
 | 
|  //
 | 
|  // See absoluteColumnToEffectiveColumn() for converting an absolute column
 | 
|  // index into an index into effectiveColumns() and effectiveColumnPositions().
 | 
| @@ -356,6 +356,7 @@ class CORE_EXPORT LayoutTable final : public LayoutBlock {
 | 
|  
 | 
|    // Return the first column or column-group.
 | 
|    LayoutTableCol* FirstColumn() const;
 | 
| +  LayoutTableCol* FirstInnermostColumn() const;
 | 
|  
 | 
|    struct ColAndColGroup {
 | 
|      ColAndColGroup()
 | 
| @@ -369,15 +370,20 @@ class CORE_EXPORT LayoutTable final : public LayoutBlock {
 | 
|      bool adjoins_end_border_of_col_group;
 | 
|      LayoutTableCol* InnermostColOrColGroup() { return col ? col : colgroup; }
 | 
|    };
 | 
| -  ColAndColGroup ColElementAtAbsoluteColumn(
 | 
| -      unsigned absolute_column_index) const {
 | 
| -    // The common case is to not have col/colgroup elements, make that case
 | 
| -    // fast.
 | 
| -    if (!has_col_elements_)
 | 
| +  ColAndColGroup ColAndColGroupAtEffectiveColumn(
 | 
| +      unsigned effective_column) const {
 | 
| +    if (!cols_at_effective_columns_valid_)
 | 
| +      UpdateColsAtEffectiveColumns();
 | 
| +    if (!cols_at_effective_columns_ ||
 | 
| +        effective_column >= cols_at_effective_columns_->size())
 | 
|        return ColAndColGroup();
 | 
| -    return SlowColElementAtAbsoluteColumn(absolute_column_index);
 | 
| +    return cols_at_effective_columns_->at(effective_column);
 | 
| +  }
 | 
| +  bool HasColOrColGroups() const {
 | 
| +    if (!cols_at_effective_columns_valid_)
 | 
| +      UpdateColsAtEffectiveColumns();
 | 
| +    return !!cols_at_effective_columns_;
 | 
|    }
 | 
| -  bool HasColElements() const { return has_col_elements_; }
 | 
|  
 | 
|    bool NeedsSectionRecalc() const { return needs_section_recalc_; }
 | 
|    void SetNeedsSectionRecalc() {
 | 
| @@ -501,10 +507,8 @@ class CORE_EXPORT LayoutTable final : public LayoutBlock {
 | 
|    int FirstLineBoxBaseline() const override;
 | 
|    int InlineBlockBaseline(LineDirectionMode) const override;
 | 
|  
 | 
| -  ColAndColGroup SlowColElementAtAbsoluteColumn(unsigned col) const;
 | 
| -
 | 
| -  void UpdateColumnCache() const;
 | 
| -  void InvalidateCachedColumns();
 | 
| +  void UpdateColsAtEffectiveColumns() const;
 | 
| +  void InvalidateColsAtEffectiveColumns() const;
 | 
|  
 | 
|    void UpdateLogicalWidth() override;
 | 
|  
 | 
| @@ -557,11 +561,8 @@ class CORE_EXPORT LayoutTable final : public LayoutBlock {
 | 
|    // The captions associated with this object.
 | 
|    mutable Vector<LayoutTableCaption*> captions_;
 | 
|  
 | 
| -  // Holds pointers to LayoutTableCol objects for <col>s and <colgroup>s under
 | 
| -  // this table.
 | 
| -  // There is no direct relationship between the size of and index into this
 | 
| -  // vector and those of m_effectiveColumns because they hold different things.
 | 
| -  mutable Vector<LayoutTableCol*> column_layout_objects_;
 | 
| +  // Stores cached ColAndColGroup structures at effective columns.
 | 
| +  mutable std::unique_ptr<Vector<ColAndColGroup>> cols_at_effective_columns_;
 | 
|  
 | 
|    mutable LayoutTableSection* head_;
 | 
|    mutable LayoutTableSection* foot_;
 | 
| @@ -590,11 +591,10 @@ class CORE_EXPORT LayoutTable final : public LayoutBlock {
 | 
|    bool collapsed_borders_valid_ : 1;
 | 
|    bool needs_invalidate_collapsed_borders_for_all_cells_ : 1;
 | 
|  
 | 
| -  mutable bool has_col_elements_ : 1;
 | 
|    mutable bool needs_section_recalc_ : 1;
 | 
|  
 | 
|    bool column_logical_width_changed_ : 1;
 | 
| -  mutable bool column_layout_objects_valid_ : 1;
 | 
| +  mutable bool cols_at_effective_columns_valid_ : 1;
 | 
|    mutable unsigned no_cell_colspan_at_least_;
 | 
|    unsigned CalcNoCellColspanAtLeast() const {
 | 
|      for (unsigned c = 0; c < NumEffectiveColumns(); c++) {
 | 
| 
 |