1/* 2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include "config.h" 30#include "core/accessibility/AXARIAGridRow.h" 31 32#include "core/accessibility/AXTable.h" 33 34using namespace std; 35 36namespace WebCore { 37 38AXARIAGridRow::AXARIAGridRow(RenderObject* renderer) 39 : AXTableRow(renderer) 40{ 41} 42 43AXARIAGridRow::~AXARIAGridRow() 44{ 45} 46 47PassRefPtr<AXARIAGridRow> AXARIAGridRow::create(RenderObject* renderer) 48{ 49 return adoptRef(new AXARIAGridRow(renderer)); 50} 51 52bool AXARIAGridRow::isARIATreeGridRow() const 53{ 54 AXObject* parent = parentTable(); 55 if (!parent) 56 return false; 57 58 return parent->ariaRoleAttribute() == TreeGridRole; 59} 60 61void AXARIAGridRow::disclosedRows(AccessibilityChildrenVector& disclosedRows) 62{ 63 // The contiguous disclosed rows will be the rows in the table that 64 // have an aria-level of plus 1 from this row. 65 AXObject* parent = parentObjectUnignored(); 66 if (!parent || !parent->isAXTable()) 67 return; 68 69 // Search for rows that match the correct level. 70 // Only take the subsequent rows from this one that are +1 from this row's level. 71 int index = rowIndex(); 72 if (index < 0) 73 return; 74 75 unsigned level = hierarchicalLevel(); 76 AccessibilityChildrenVector& allRows = toAXTable(parent)->rows(); 77 int rowCount = allRows.size(); 78 for (int k = index + 1; k < rowCount; ++k) { 79 AXObject* row = allRows[k].get(); 80 // Stop at the first row that doesn't match the correct level. 81 if (row->hierarchicalLevel() != level + 1) 82 break; 83 84 disclosedRows.append(row); 85 } 86} 87 88AXObject* AXARIAGridRow::disclosedByRow() const 89{ 90 // The row that discloses this one is the row in the table 91 // that is aria-level subtract 1 from this row. 92 AXObject* parent = parentObjectUnignored(); 93 if (!parent || !parent->isAXTable()) 94 return 0; 95 96 // If the level is 1 or less, than nothing discloses this row. 97 unsigned level = hierarchicalLevel(); 98 if (level <= 1) 99 return 0; 100 101 // Search for the previous row that matches the correct level. 102 int index = rowIndex(); 103 AccessibilityChildrenVector& allRows = toAXTable(parent)->rows(); 104 int rowCount = allRows.size(); 105 if (index >= rowCount) 106 return 0; 107 108 for (int k = index - 1; k >= 0; --k) { 109 AXObject* row = allRows[k].get(); 110 if (row->hierarchicalLevel() == level - 1) 111 return row; 112 } 113 114 return 0; 115} 116 117AXObject* AXARIAGridRow::headerObject() 118{ 119 AccessibilityChildrenVector rowChildren = children(); 120 unsigned childrenCount = rowChildren.size(); 121 for (unsigned i = 0; i < childrenCount; ++i) { 122 AXObject* cell = rowChildren[i].get(); 123 if (cell->ariaRoleAttribute() == RowHeaderRole) 124 return cell; 125 } 126 127 return 0; 128} 129 130} // namespace WebCore 131