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 "AccessibilityARIAGridRow.h" 31 32 #include "AccessibilityObject.h" 33 #include "AccessibilityTable.h" 34 #include "RenderObject.h" 35 36 using namespace std; 37 38 namespace WebCore { 39 40 AccessibilityARIAGridRow::AccessibilityARIAGridRow(RenderObject* renderer) 41 : AccessibilityTableRow(renderer) 42 { 43 } 44 45 AccessibilityARIAGridRow::~AccessibilityARIAGridRow() 46 { 47 } 48 49 PassRefPtr<AccessibilityARIAGridRow> AccessibilityARIAGridRow::create(RenderObject* renderer) 50 { 51 return adoptRef(new AccessibilityARIAGridRow(renderer)); 52 } 53 54 bool AccessibilityARIAGridRow::isARIATreeGridRow() const 55 { 56 AccessibilityObject* parent = parentTable(); 57 if (!parent) 58 return false; 59 60 return parent->ariaRoleAttribute() == TreeGridRole; 61 } 62 63 void AccessibilityARIAGridRow::disclosedRows(AccessibilityChildrenVector& disclosedRows) 64 { 65 // The contiguous disclosed rows will be the rows in the table that 66 // have an aria-level of plus 1 from this row. 67 AccessibilityObject* parent = parentObjectUnignored(); 68 if (!parent || !parent->isAccessibilityTable()) 69 return; 70 71 // Search for rows that match the correct level. 72 // Only take the subsequent rows from this one that are +1 from this row's level. 73 int index = rowIndex(); 74 if (index < 0) 75 return; 76 77 unsigned level = hierarchicalLevel(); 78 AccessibilityChildrenVector& allRows = static_cast<AccessibilityTable*>(parent)->rows(); 79 int rowCount = allRows.size(); 80 for (int k = index + 1; k < rowCount; ++k) { 81 AccessibilityObject* row = allRows[k].get(); 82 // Stop at the first row that doesn't match the correct level. 83 if (row->hierarchicalLevel() != level + 1) 84 break; 85 86 disclosedRows.append(row); 87 } 88 } 89 90 AccessibilityObject* AccessibilityARIAGridRow::disclosedByRow() const 91 { 92 // The row that discloses this one is the row in the table 93 // that is aria-level subtract 1 from this row. 94 AccessibilityObject* parent = parentObjectUnignored(); 95 if (!parent || !parent->isAccessibilityTable()) 96 return 0; 97 98 // If the level is 1 or less, than nothing discloses this row. 99 unsigned level = hierarchicalLevel(); 100 if (level <= 1) 101 return 0; 102 103 // Search for the previous row that matches the correct level. 104 int index = rowIndex(); 105 AccessibilityChildrenVector& allRows = static_cast<AccessibilityTable*>(parent)->rows(); 106 int rowCount = allRows.size(); 107 if (index >= rowCount) 108 return 0; 109 110 for (int k = index - 1; k >= 0; --k) { 111 AccessibilityObject* row = allRows[k].get(); 112 if (row->hierarchicalLevel() == level - 1) 113 return row; 114 } 115 116 return 0; 117 } 118 119 AccessibilityObject* AccessibilityARIAGridRow::parentTable() const 120 { 121 AccessibilityObject* parent = parentObjectUnignored(); 122 if (!parent->isAccessibilityTable()) 123 return 0; 124 125 return parent; 126 } 127 128 AccessibilityObject* AccessibilityARIAGridRow::headerObject() 129 { 130 AccessibilityChildrenVector rowChildren = children(); 131 unsigned childrenCount = rowChildren.size(); 132 for (unsigned i = 0; i < childrenCount; ++i) { 133 AccessibilityObject* cell = rowChildren[i].get(); 134 if (cell->ariaRoleAttribute() == RowHeaderRole) 135 return cell; 136 } 137 138 return 0; 139 } 140 141 } // namespace WebCore 142