OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 if (Traversal<HTMLTableColElement>::FirstChild(*table_element)) | 158 if (Traversal<HTMLTableColElement>::FirstChild(*table_element)) |
159 return true; | 159 return true; |
160 | 160 |
161 // go through the cell's and check for tell-tale signs of "data" table status | 161 // go through the cell's and check for tell-tale signs of "data" table status |
162 // cells have borders, or use attributes like headers, abbr, scope or axis | 162 // cells have borders, or use attributes like headers, abbr, scope or axis |
163 table->RecalcSectionsIfNeeded(); | 163 table->RecalcSectionsIfNeeded(); |
164 LayoutTableSection* first_body = table->FirstBody(); | 164 LayoutTableSection* first_body = table->FirstBody(); |
165 if (!first_body) | 165 if (!first_body) |
166 return false; | 166 return false; |
167 | 167 |
168 int num_cols_in_first_body = first_body->NumEffectiveColumns(); | 168 int num_cols_in_first_body = first_body->MaxNumEffectiveColumnsOfRows(); |
169 int num_rows = first_body->NumRows(); | 169 int num_rows = first_body->NumRows(); |
170 | 170 |
171 // If there's only one cell, it's not a good AXTable candidate. | 171 // If there's only one cell, it's not a good AXTable candidate. |
172 if (num_rows == 1 && num_cols_in_first_body == 1) | 172 if (num_rows == 1 && num_cols_in_first_body == 1) |
173 return false; | 173 return false; |
174 | 174 |
175 // If there are at least 20 rows, we'll call it a data table. | 175 // If there are at least 20 rows, we'll call it a data table. |
176 if (num_rows >= 20) | 176 if (num_rows >= 20) |
177 return true; | 177 return true; |
178 | 178 |
(...skipping 18 matching lines...) Expand all Loading... |
197 unsigned cells_with_bottom_border = 0; | 197 unsigned cells_with_bottom_border = 0; |
198 unsigned cells_with_left_border = 0; | 198 unsigned cells_with_left_border = 0; |
199 unsigned cells_with_right_border = 0; | 199 unsigned cells_with_right_border = 0; |
200 | 200 |
201 Color alternating_row_colors[5]; | 201 Color alternating_row_colors[5]; |
202 int alternating_row_color_count = 0; | 202 int alternating_row_color_count = 0; |
203 | 203 |
204 int headers_in_first_column_count = 0; | 204 int headers_in_first_column_count = 0; |
205 for (int row = 0; row < num_rows; ++row) { | 205 for (int row = 0; row < num_rows; ++row) { |
206 int headers_in_first_row_count = 0; | 206 int headers_in_first_row_count = 0; |
207 int n_cols = first_body->NumCols(row); | 207 int n_cols = first_body->NumEffectiveColumns(row); |
208 for (int col = 0; col < n_cols; ++col) { | 208 for (int col = 0; col < n_cols; ++col) { |
209 LayoutTableCell* cell = first_body->PrimaryCellAt(row, col); | 209 LayoutTableCell* cell = first_body->PrimaryCellAt(row, col); |
210 if (!cell) | 210 if (!cell) |
211 continue; | 211 continue; |
212 Node* cell_node = cell->GetNode(); | 212 Node* cell_node = cell->GetNode(); |
213 if (!cell_node) | 213 if (!cell_node) |
214 continue; | 214 continue; |
215 | 215 |
216 if (cell->Size().Width() < 1 || cell->Size().Height() < 1) | 216 if (cell->Size().Width() < 1 || cell->Size().Height() < 1) |
217 continue; | 217 continue; |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 rows_.push_back(row); | 422 rows_.push_back(row); |
423 if (!row->AccessibilityIsIgnored()) | 423 if (!row->AccessibilityIsIgnored()) |
424 children_.push_back(row); | 424 children_.push_back(row); |
425 appended_rows.insert(row); | 425 appended_rows.insert(row); |
426 } | 426 } |
427 | 427 |
428 table_section = table->SectionBelow(table_section, kSkipEmptySections); | 428 table_section = table->SectionBelow(table_section, kSkipEmptySections); |
429 } | 429 } |
430 | 430 |
431 // make the columns based on the number of columns in the first body | 431 // make the columns based on the number of columns in the first body |
432 unsigned length = initial_table_section->NumEffectiveColumns(); | 432 unsigned length = initial_table_section->MaxNumEffectiveColumnsOfRows(); |
433 for (unsigned i = 0; i < length; ++i) { | 433 for (unsigned i = 0; i < length; ++i) { |
434 AXTableColumn* column = ToAXTableColumn(ax_cache.GetOrCreate(kColumnRole)); | 434 AXTableColumn* column = ToAXTableColumn(ax_cache.GetOrCreate(kColumnRole)); |
435 column->SetColumnIndex((int)i); | 435 column->SetColumnIndex((int)i); |
436 column->SetParent(this); | 436 column->SetParent(this); |
437 columns_.push_back(column); | 437 columns_.push_back(column); |
438 if (!column->AccessibilityIsIgnored()) | 438 if (!column->AccessibilityIsIgnored()) |
439 children_.push_back(column); | 439 children_.push_back(column); |
440 } | 440 } |
441 | 441 |
442 AXObjectImpl* header_container_object = HeaderContainer(); | 442 AXObjectImpl* header_container_object = HeaderContainer(); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 } | 609 } |
610 | 610 |
611 DEFINE_TRACE(AXTable) { | 611 DEFINE_TRACE(AXTable) { |
612 visitor->Trace(rows_); | 612 visitor->Trace(rows_); |
613 visitor->Trace(columns_); | 613 visitor->Trace(columns_); |
614 visitor->Trace(header_container_); | 614 visitor->Trace(header_container_); |
615 AXLayoutObject::Trace(visitor); | 615 AXLayoutObject::Trace(visitor); |
616 } | 616 } |
617 | 617 |
618 } // namespace blink | 618 } // namespace blink |
OLD | NEW |