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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 LayoutTable* table = ToLayoutTable(layout_object_); | 380 LayoutTable* table = ToLayoutTable(layout_object_); |
381 AXObjectCacheImpl& ax_cache = AxObjectCache(); | 381 AXObjectCacheImpl& ax_cache = AxObjectCache(); |
382 | 382 |
383 Node* table_node = table->GetNode(); | 383 Node* table_node = table->GetNode(); |
384 if (!isHTMLTableElement(table_node)) | 384 if (!isHTMLTableElement(table_node)) |
385 return; | 385 return; |
386 | 386 |
387 // Add caption | 387 // Add caption |
388 if (HTMLTableCaptionElement* caption = | 388 if (HTMLTableCaptionElement* caption = |
389 toHTMLTableElement(table_node)->caption()) { | 389 toHTMLTableElement(table_node)->caption()) { |
390 AXObject* caption_object = ax_cache.GetOrCreate(caption); | 390 AXObjectImpl* caption_object = ax_cache.GetOrCreate(caption); |
391 if (caption_object && !caption_object->AccessibilityIsIgnored()) | 391 if (caption_object && !caption_object->AccessibilityIsIgnored()) |
392 children_.push_back(caption_object); | 392 children_.push_back(caption_object); |
393 } | 393 } |
394 | 394 |
395 // Go through all the available sections to pull out the rows and add them as | 395 // Go through all the available sections to pull out the rows and add them as |
396 // children. | 396 // children. |
397 table->RecalcSectionsIfNeeded(); | 397 table->RecalcSectionsIfNeeded(); |
398 LayoutTableSection* table_section = table->TopSection(); | 398 LayoutTableSection* table_section = table->TopSection(); |
399 if (!table_section) | 399 if (!table_section) |
400 return; | 400 return; |
401 | 401 |
402 LayoutTableSection* initial_table_section = table_section; | 402 LayoutTableSection* initial_table_section = table_section; |
403 while (table_section) { | 403 while (table_section) { |
404 HeapHashSet<Member<AXObject>> appended_rows; | 404 HeapHashSet<Member<AXObjectImpl>> appended_rows; |
405 unsigned num_rows = table_section->NumRows(); | 405 unsigned num_rows = table_section->NumRows(); |
406 for (unsigned row_index = 0; row_index < num_rows; ++row_index) { | 406 for (unsigned row_index = 0; row_index < num_rows; ++row_index) { |
407 LayoutTableRow* layout_row = table_section->RowLayoutObjectAt(row_index); | 407 LayoutTableRow* layout_row = table_section->RowLayoutObjectAt(row_index); |
408 if (!layout_row) | 408 if (!layout_row) |
409 continue; | 409 continue; |
410 | 410 |
411 AXObject* row_object = ax_cache.GetOrCreate(layout_row); | 411 AXObjectImpl* row_object = ax_cache.GetOrCreate(layout_row); |
412 if (!row_object || !row_object->IsTableRow()) | 412 if (!row_object || !row_object->IsTableRow()) |
413 continue; | 413 continue; |
414 | 414 |
415 AXTableRow* row = ToAXTableRow(row_object); | 415 AXTableRow* row = ToAXTableRow(row_object); |
416 // We need to check every cell for a new row, because cell spans | 416 // We need to check every cell for a new row, because cell spans |
417 // can cause us to miss rows if we just check the first column. | 417 // can cause us to miss rows if we just check the first column. |
418 if (appended_rows.Contains(row)) | 418 if (appended_rows.Contains(row)) |
419 continue; | 419 continue; |
420 | 420 |
421 row->SetRowIndex(static_cast<int>(rows_.size())); | 421 row->SetRowIndex(static_cast<int>(rows_.size())); |
(...skipping 10 matching lines...) Expand all Loading... |
432 unsigned length = initial_table_section->NumEffectiveColumns(); | 432 unsigned length = initial_table_section->NumEffectiveColumns(); |
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 AXObject* header_container_object = HeaderContainer(); | 442 AXObjectImpl* header_container_object = HeaderContainer(); |
443 if (header_container_object && | 443 if (header_container_object && |
444 !header_container_object->AccessibilityIsIgnored()) | 444 !header_container_object->AccessibilityIsIgnored()) |
445 children_.push_back(header_container_object); | 445 children_.push_back(header_container_object); |
446 } | 446 } |
447 | 447 |
448 AXObject* AXTable::HeaderContainer() { | 448 AXObjectImpl* AXTable::HeaderContainer() { |
449 if (header_container_) | 449 if (header_container_) |
450 return header_container_.Get(); | 450 return header_container_.Get(); |
451 | 451 |
452 AXMockObject* table_header = | 452 AXMockObject* table_header = |
453 ToAXMockObject(AxObjectCache().GetOrCreate(kTableHeaderContainerRole)); | 453 ToAXMockObject(AxObjectCache().GetOrCreate(kTableHeaderContainerRole)); |
454 table_header->SetParent(this); | 454 table_header->SetParent(this); |
455 | 455 |
456 header_container_ = table_header; | 456 header_container_ = table_header; |
457 return header_container_.Get(); | 457 return header_container_.Get(); |
458 } | 458 } |
459 | 459 |
460 const AXObject::AXObjectVector& AXTable::Columns() { | 460 const AXObjectImpl::AXObjectVector& AXTable::Columns() { |
461 UpdateChildrenIfNecessary(); | 461 UpdateChildrenIfNecessary(); |
462 | 462 |
463 return columns_; | 463 return columns_; |
464 } | 464 } |
465 | 465 |
466 const AXObject::AXObjectVector& AXTable::Rows() { | 466 const AXObjectImpl::AXObjectVector& AXTable::Rows() { |
467 UpdateChildrenIfNecessary(); | 467 UpdateChildrenIfNecessary(); |
468 | 468 |
469 return rows_; | 469 return rows_; |
470 } | 470 } |
471 | 471 |
472 void AXTable::ColumnHeaders(AXObjectVector& headers) { | 472 void AXTable::ColumnHeaders(AXObjectVector& headers) { |
473 if (!layout_object_) | 473 if (!layout_object_) |
474 return; | 474 return; |
475 | 475 |
476 UpdateChildrenIfNecessary(); | 476 UpdateChildrenIfNecessary(); |
477 unsigned column_count = columns_.size(); | 477 unsigned column_count = columns_.size(); |
478 for (unsigned c = 0; c < column_count; c++) { | 478 for (unsigned c = 0; c < column_count; c++) { |
479 AXObject* column = columns_[c].Get(); | 479 AXObjectImpl* column = columns_[c].Get(); |
480 if (column->IsTableCol()) | 480 if (column->IsTableCol()) |
481 ToAXTableColumn(column)->HeaderObjectsForColumn(headers); | 481 ToAXTableColumn(column)->HeaderObjectsForColumn(headers); |
482 } | 482 } |
483 } | 483 } |
484 | 484 |
485 void AXTable::RowHeaders(AXObjectVector& headers) { | 485 void AXTable::RowHeaders(AXObjectVector& headers) { |
486 if (!layout_object_) | 486 if (!layout_object_) |
487 return; | 487 return; |
488 | 488 |
489 UpdateChildrenIfNecessary(); | 489 UpdateChildrenIfNecessary(); |
490 unsigned row_count = rows_.size(); | 490 unsigned row_count = rows_.size(); |
491 for (unsigned r = 0; r < row_count; r++) { | 491 for (unsigned r = 0; r < row_count; r++) { |
492 AXObject* row = rows_[r].Get(); | 492 AXObjectImpl* row = rows_[r].Get(); |
493 if (row->IsTableRow()) | 493 if (row->IsTableRow()) |
494 ToAXTableRow(rows_[r].Get())->HeaderObjectsForRow(headers); | 494 ToAXTableRow(rows_[r].Get())->HeaderObjectsForRow(headers); |
495 } | 495 } |
496 } | 496 } |
497 | 497 |
498 int AXTable::AriaColumnCount() { | 498 int AXTable::AriaColumnCount() { |
499 if (!HasAttribute(aria_colcountAttr)) | 499 if (!HasAttribute(aria_colcountAttr)) |
500 return 0; | 500 return 0; |
501 | 501 |
502 const AtomicString& col_count_value = GetAttribute(aria_colcountAttr); | 502 const AtomicString& col_count_value = GetAttribute(aria_colcountAttr); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 for (unsigned row_index_counter = row + 1; row_index_counter > 0; | 558 for (unsigned row_index_counter = row + 1; row_index_counter > 0; |
559 --row_index_counter) { | 559 --row_index_counter) { |
560 unsigned row_index = row_index_counter - 1; | 560 unsigned row_index = row_index_counter - 1; |
561 const auto& children = rows_[row_index]->Children(); | 561 const auto& children = rows_[row_index]->Children(); |
562 // Since some cells may have colspans, we have to check the actual range of | 562 // Since some cells may have colspans, we have to check the actual range of |
563 // each cell to determine which is the right one. | 563 // each cell to determine which is the right one. |
564 for (unsigned col_index_counter = | 564 for (unsigned col_index_counter = |
565 std::min(static_cast<unsigned>(children.size()), column + 1); | 565 std::min(static_cast<unsigned>(children.size()), column + 1); |
566 col_index_counter > 0; --col_index_counter) { | 566 col_index_counter > 0; --col_index_counter) { |
567 unsigned col_index = col_index_counter - 1; | 567 unsigned col_index = col_index_counter - 1; |
568 AXObject* child = children[col_index].Get(); | 568 AXObjectImpl* child = children[col_index].Get(); |
569 | 569 |
570 if (!child->IsTableCell()) | 570 if (!child->IsTableCell()) |
571 continue; | 571 continue; |
572 | 572 |
573 std::pair<unsigned, unsigned> column_range; | 573 std::pair<unsigned, unsigned> column_range; |
574 std::pair<unsigned, unsigned> row_range; | 574 std::pair<unsigned, unsigned> row_range; |
575 AXTableCell* table_cell_child = ToAXTableCell(child); | 575 AXTableCell* table_cell_child = ToAXTableCell(child); |
576 table_cell_child->ColumnIndexRange(column_range); | 576 table_cell_child->ColumnIndexRange(column_range); |
577 table_cell_child->RowIndexRange(row_range); | 577 table_cell_child->RowIndexRange(row_range); |
578 | 578 |
(...skipping 30 matching lines...) Expand all 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 |