Home | History | Annotate | Download | only in web
      1 /*
      2  * Copyright (C) 2009 Google 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 are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 #include "WebAccessibilityObject.h"
     33 
     34 #include "HTMLNames.h"
     35 #include "WebDocument.h"
     36 #include "WebNode.h"
     37 #include "core/accessibility/AXObjectCache.h"
     38 #include "core/accessibility/AccessibilityObject.h"
     39 #include "core/accessibility/AccessibilityTable.h"
     40 #include "core/accessibility/AccessibilityTableCell.h"
     41 #include "core/accessibility/AccessibilityTableColumn.h"
     42 #include "core/accessibility/AccessibilityTableRow.h"
     43 #include "core/css/CSSPrimitiveValueMappings.h"
     44 #include "core/dom/Document.h"
     45 #include "core/dom/Node.h"
     46 #include "core/page/EventHandler.h"
     47 #include "core/page/FrameView.h"
     48 #include "core/platform/PlatformKeyboardEvent.h"
     49 #include "core/rendering/style/RenderStyle.h"
     50 #include "public/platform/WebPoint.h"
     51 #include "public/platform/WebRect.h"
     52 #include "public/platform/WebString.h"
     53 #include "public/platform/WebURL.h"
     54 #include "wtf/text/StringBuilder.h"
     55 
     56 using namespace WebCore;
     57 
     58 namespace WebKit {
     59 
     60 void WebAccessibilityObject::reset()
     61 {
     62     m_private.reset();
     63 }
     64 
     65 void WebAccessibilityObject::assign(const WebKit::WebAccessibilityObject& other)
     66 {
     67     m_private = other.m_private;
     68 }
     69 
     70 bool WebAccessibilityObject::equals(const WebAccessibilityObject& n) const
     71 {
     72     return m_private.get() == n.m_private.get();
     73 }
     74 
     75 // static
     76 void WebAccessibilityObject::enableAccessibility()
     77 {
     78     AXObjectCache::enableAccessibility();
     79 }
     80 
     81 // static
     82 bool WebAccessibilityObject::accessibilityEnabled()
     83 {
     84     return AXObjectCache::accessibilityEnabled();
     85 }
     86 
     87 void WebAccessibilityObject::startCachingComputedObjectAttributesUntilTreeMutates()
     88 {
     89     m_private->axObjectCache()->startCachingComputedObjectAttributesUntilTreeMutates();
     90 }
     91 
     92 void WebAccessibilityObject::stopCachingComputedObjectAttributes()
     93 {
     94     m_private->axObjectCache()->stopCachingComputedObjectAttributes();
     95 }
     96 
     97 bool WebAccessibilityObject::isDetached() const
     98 {
     99     if (m_private.isNull())
    100         return true;
    101 
    102     return m_private->isDetached();
    103 }
    104 
    105 int WebAccessibilityObject::axID() const
    106 {
    107     if (isDetached())
    108         return -1;
    109 
    110     return m_private->axObjectID();
    111 }
    112 
    113 bool WebAccessibilityObject::updateBackingStoreAndCheckValidity()
    114 {
    115     if (!isDetached())
    116         m_private->updateBackingStore();
    117     return !isDetached();
    118 }
    119 
    120 WebString WebAccessibilityObject::accessibilityDescription() const
    121 {
    122     if (isDetached())
    123         return WebString();
    124 
    125     return m_private->accessibilityDescription();
    126 }
    127 
    128 WebString WebAccessibilityObject::actionVerb() const
    129 {
    130     if (isDetached())
    131         return WebString();
    132 
    133     return m_private->actionVerb();
    134 }
    135 
    136 bool WebAccessibilityObject::canDecrement() const
    137 {
    138     if (isDetached())
    139         return false;
    140 
    141     return m_private->isSlider();
    142 }
    143 
    144 bool WebAccessibilityObject::canIncrement() const
    145 {
    146     if (isDetached())
    147         return false;
    148 
    149     return m_private->isSlider();
    150 }
    151 
    152 bool WebAccessibilityObject::canPress() const
    153 {
    154     if (isDetached())
    155         return false;
    156 
    157     return m_private->actionElement() || m_private->isButton() || m_private->isMenuRelated();
    158 }
    159 
    160 bool WebAccessibilityObject::canSetFocusAttribute() const
    161 {
    162     if (isDetached())
    163         return false;
    164 
    165     return m_private->canSetFocusAttribute();
    166 }
    167 
    168 bool WebAccessibilityObject::canSetValueAttribute() const
    169 {
    170     if (isDetached())
    171         return false;
    172 
    173     return m_private->canSetValueAttribute();
    174 }
    175 
    176 unsigned WebAccessibilityObject::childCount() const
    177 {
    178     if (isDetached())
    179         return 0;
    180 
    181     return m_private->children().size();
    182 }
    183 
    184 WebAccessibilityObject WebAccessibilityObject::childAt(unsigned index) const
    185 {
    186     if (isDetached())
    187         return WebAccessibilityObject();
    188 
    189     if (m_private->children().size() <= index)
    190         return WebAccessibilityObject();
    191 
    192     return WebAccessibilityObject(m_private->children()[index]);
    193 }
    194 
    195 WebAccessibilityObject WebAccessibilityObject::parentObject() const
    196 {
    197     if (isDetached())
    198         return WebAccessibilityObject();
    199 
    200     return WebAccessibilityObject(m_private->parentObject());
    201 }
    202 
    203 bool WebAccessibilityObject::canSetSelectedAttribute() const
    204 {
    205     if (isDetached())
    206         return 0;
    207 
    208     return m_private->canSetSelectedAttribute();
    209 }
    210 
    211 bool WebAccessibilityObject::isAnchor() const
    212 {
    213     if (isDetached())
    214         return 0;
    215 
    216     return m_private->isAnchor();
    217 }
    218 
    219 bool WebAccessibilityObject::isAriaReadOnly() const
    220 {
    221     if (isDetached())
    222         return 0;
    223 
    224     return equalIgnoringCase(m_private->getAttribute(HTMLNames::aria_readonlyAttr), "true");
    225 }
    226 
    227 bool WebAccessibilityObject::isButtonStateMixed() const
    228 {
    229     if (isDetached())
    230         return 0;
    231 
    232     return m_private->checkboxOrRadioValue() == ButtonStateMixed;
    233 }
    234 
    235 bool WebAccessibilityObject::isChecked() const
    236 {
    237     if (isDetached())
    238         return 0;
    239 
    240     return m_private->isChecked();
    241 }
    242 
    243 bool WebAccessibilityObject::isCollapsed() const
    244 {
    245     if (isDetached())
    246         return 0;
    247 
    248     return m_private->isCollapsed();
    249 }
    250 
    251 bool WebAccessibilityObject::isControl() const
    252 {
    253     if (isDetached())
    254         return 0;
    255 
    256     return m_private->isControl();
    257 }
    258 
    259 bool WebAccessibilityObject::isEnabled() const
    260 {
    261     if (isDetached())
    262         return 0;
    263 
    264     return m_private->isEnabled();
    265 }
    266 
    267 bool WebAccessibilityObject::isFocused() const
    268 {
    269     if (isDetached())
    270         return 0;
    271 
    272     return m_private->isFocused();
    273 }
    274 
    275 bool WebAccessibilityObject::isHovered() const
    276 {
    277     if (isDetached())
    278         return 0;
    279 
    280     return m_private->isHovered();
    281 }
    282 
    283 bool WebAccessibilityObject::isIndeterminate() const
    284 {
    285     if (isDetached())
    286         return 0;
    287 
    288     return m_private->isIndeterminate();
    289 }
    290 
    291 bool WebAccessibilityObject::isLinked() const
    292 {
    293     if (isDetached())
    294         return 0;
    295 
    296     return m_private->isLinked();
    297 }
    298 
    299 bool WebAccessibilityObject::isLoaded() const
    300 {
    301     if (isDetached())
    302         return 0;
    303 
    304     return m_private->isLoaded();
    305 }
    306 
    307 bool WebAccessibilityObject::isMultiSelectable() const
    308 {
    309     if (isDetached())
    310         return 0;
    311 
    312     return m_private->isMultiSelectable();
    313 }
    314 
    315 bool WebAccessibilityObject::isOffScreen() const
    316 {
    317     if (isDetached())
    318         return 0;
    319 
    320     return m_private->isOffScreen();
    321 }
    322 
    323 bool WebAccessibilityObject::isPasswordField() const
    324 {
    325     if (isDetached())
    326         return 0;
    327 
    328     return m_private->isPasswordField();
    329 }
    330 
    331 bool WebAccessibilityObject::isPressed() const
    332 {
    333     if (isDetached())
    334         return 0;
    335 
    336     return m_private->isPressed();
    337 }
    338 
    339 bool WebAccessibilityObject::isReadOnly() const
    340 {
    341     if (isDetached())
    342         return 0;
    343 
    344     return m_private->isReadOnly();
    345 }
    346 
    347 bool WebAccessibilityObject::isRequired() const
    348 {
    349     if (isDetached())
    350         return 0;
    351 
    352     return m_private->isRequired();
    353 }
    354 
    355 bool WebAccessibilityObject::isSelected() const
    356 {
    357     if (isDetached())
    358         return 0;
    359 
    360     return m_private->isSelected();
    361 }
    362 
    363 bool WebAccessibilityObject::isSelectedOptionActive() const
    364 {
    365     if (isDetached())
    366         return false;
    367 
    368     return m_private->isSelectedOptionActive();
    369 }
    370 
    371 bool WebAccessibilityObject::isVertical() const
    372 {
    373     if (isDetached())
    374         return 0;
    375 
    376     return m_private->orientation() == AccessibilityOrientationVertical;
    377 }
    378 
    379 bool WebAccessibilityObject::isVisible() const
    380 {
    381     if (isDetached())
    382         return 0;
    383 
    384     return m_private->isVisible();
    385 }
    386 
    387 bool WebAccessibilityObject::isVisited() const
    388 {
    389     if (isDetached())
    390         return 0;
    391 
    392     return m_private->isVisited();
    393 }
    394 
    395 WebString WebAccessibilityObject::accessKey() const
    396 {
    397     if (isDetached())
    398         return WebString();
    399 
    400     return WebString(m_private->accessKey());
    401 }
    402 
    403 bool WebAccessibilityObject::ariaHasPopup() const
    404 {
    405     if (isDetached())
    406         return 0;
    407 
    408     return m_private->ariaHasPopup();
    409 }
    410 
    411 bool WebAccessibilityObject::ariaLiveRegionAtomic() const
    412 {
    413     if (isDetached())
    414         return 0;
    415 
    416     return m_private->ariaLiveRegionAtomic();
    417 }
    418 
    419 bool WebAccessibilityObject::ariaLiveRegionBusy() const
    420 {
    421     if (isDetached())
    422         return 0;
    423 
    424     return m_private->ariaLiveRegionBusy();
    425 }
    426 
    427 WebString WebAccessibilityObject::ariaLiveRegionRelevant() const
    428 {
    429     if (isDetached())
    430         return WebString();
    431 
    432     return m_private->ariaLiveRegionRelevant();
    433 }
    434 
    435 WebString WebAccessibilityObject::ariaLiveRegionStatus() const
    436 {
    437     if (isDetached())
    438         return WebString();
    439 
    440     return m_private->ariaLiveRegionStatus();
    441 }
    442 
    443 WebRect WebAccessibilityObject::boundingBoxRect() const
    444 {
    445     if (isDetached())
    446         return WebRect();
    447 
    448     return pixelSnappedIntRect(m_private->elementRect());
    449 }
    450 
    451 bool WebAccessibilityObject::canvasHasFallbackContent() const
    452 {
    453     if (isDetached())
    454         return false;
    455 
    456     return m_private->canvasHasFallbackContent();
    457 }
    458 
    459 WebPoint WebAccessibilityObject::clickPoint() const
    460 {
    461     if (isDetached())
    462         return WebPoint();
    463 
    464     return WebPoint(m_private->clickPoint());
    465 }
    466 
    467 void WebAccessibilityObject::colorValue(int& r, int& g, int& b) const
    468 {
    469     if (isDetached())
    470         return;
    471 
    472     m_private->colorValue(r, g, b);
    473 }
    474 
    475 double WebAccessibilityObject::estimatedLoadingProgress() const
    476 {
    477     if (isDetached())
    478         return 0.0;
    479 
    480     return m_private->estimatedLoadingProgress();
    481 }
    482 
    483 WebString WebAccessibilityObject::helpText() const
    484 {
    485     if (isDetached())
    486         return WebString();
    487 
    488     return m_private->helpText();
    489 }
    490 
    491 int WebAccessibilityObject::headingLevel() const
    492 {
    493     if (isDetached())
    494         return 0;
    495 
    496     return m_private->headingLevel();
    497 }
    498 
    499 int WebAccessibilityObject::hierarchicalLevel() const
    500 {
    501     if (isDetached())
    502         return 0;
    503 
    504     return m_private->hierarchicalLevel();
    505 }
    506 
    507 WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const
    508 {
    509     if (isDetached())
    510         return WebAccessibilityObject();
    511 
    512     IntPoint contentsPoint = m_private->documentFrameView()->windowToContents(point);
    513     RefPtr<AccessibilityObject> hit = m_private->accessibilityHitTest(contentsPoint);
    514 
    515     if (hit)
    516         return WebAccessibilityObject(hit);
    517 
    518     if (m_private->elementRect().contains(contentsPoint))
    519         return *this;
    520 
    521     return WebAccessibilityObject();
    522 }
    523 
    524 WebString WebAccessibilityObject::keyboardShortcut() const
    525 {
    526     if (isDetached())
    527         return WebString();
    528 
    529     String accessKey = m_private->accessKey();
    530     if (accessKey.isNull())
    531         return WebString();
    532 
    533     DEFINE_STATIC_LOCAL(String, modifierString, ());
    534     if (modifierString.isNull()) {
    535         unsigned modifiers = EventHandler::accessKeyModifiers();
    536         // Follow the same order as Mozilla MSAA implementation:
    537         // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings
    538         // should not be localized and defines the separator as "+".
    539         StringBuilder modifierStringBuilder;
    540         if (modifiers & PlatformEvent::CtrlKey)
    541             modifierStringBuilder.appendLiteral("Ctrl+");
    542         if (modifiers & PlatformEvent::AltKey)
    543             modifierStringBuilder.appendLiteral("Alt+");
    544         if (modifiers & PlatformEvent::ShiftKey)
    545             modifierStringBuilder.appendLiteral("Shift+");
    546         if (modifiers & PlatformEvent::MetaKey)
    547             modifierStringBuilder.appendLiteral("Win+");
    548         modifierString = modifierStringBuilder.toString();
    549     }
    550 
    551     return String(modifierString + accessKey);
    552 }
    553 
    554 bool WebAccessibilityObject::performDefaultAction() const
    555 {
    556     if (isDetached())
    557         return false;
    558 
    559     return m_private->performDefaultAction();
    560 }
    561 
    562 bool WebAccessibilityObject::increment() const
    563 {
    564     if (isDetached())
    565         return false;
    566 
    567     if (canIncrement()) {
    568         m_private->increment();
    569         return true;
    570     }
    571     return false;
    572 }
    573 
    574 bool WebAccessibilityObject::decrement() const
    575 {
    576     if (isDetached())
    577         return false;
    578 
    579     if (canDecrement()) {
    580         m_private->decrement();
    581         return true;
    582     }
    583     return false;
    584 }
    585 
    586 bool WebAccessibilityObject::press() const
    587 {
    588     if (isDetached())
    589         return false;
    590 
    591     return m_private->press();
    592 }
    593 
    594 WebAccessibilityRole WebAccessibilityObject::roleValue() const
    595 {
    596     if (isDetached())
    597         return WebKit::WebAccessibilityRoleUnknown;
    598 
    599     return static_cast<WebAccessibilityRole>(m_private->roleValue());
    600 }
    601 
    602 unsigned WebAccessibilityObject::selectionEnd() const
    603 {
    604     if (isDetached())
    605         return 0;
    606 
    607     return m_private->selectedTextRange().start + m_private->selectedTextRange().length;
    608 }
    609 
    610 unsigned WebAccessibilityObject::selectionStart() const
    611 {
    612     if (isDetached())
    613         return 0;
    614 
    615     return m_private->selectedTextRange().start;
    616 }
    617 
    618 unsigned WebAccessibilityObject::selectionEndLineNumber() const
    619 {
    620     if (isDetached())
    621         return 0;
    622 
    623     VisiblePosition position = m_private->visiblePositionForIndex(selectionEnd());
    624     int lineNumber = m_private->lineForPosition(position);
    625     if (lineNumber < 0)
    626         return 0;
    627     return lineNumber;
    628 }
    629 
    630 unsigned WebAccessibilityObject::selectionStartLineNumber() const
    631 {
    632     if (isDetached())
    633         return 0;
    634 
    635     VisiblePosition position = m_private->visiblePositionForIndex(selectionStart());
    636     int lineNumber = m_private->lineForPosition(position);
    637     if (lineNumber < 0)
    638         return 0;
    639     return lineNumber;
    640 }
    641 
    642 void WebAccessibilityObject::setFocused(bool on) const
    643 {
    644     if (!isDetached())
    645         m_private->setFocused(on);
    646 }
    647 
    648 void WebAccessibilityObject::setSelectedTextRange(int selectionStart, int selectionEnd) const
    649 {
    650     if (isDetached())
    651         return;
    652 
    653     m_private->setSelectedTextRange(PlainTextRange(selectionStart, selectionEnd - selectionStart));
    654 }
    655 
    656 WebString WebAccessibilityObject::stringValue() const
    657 {
    658     if (isDetached())
    659         return WebString();
    660 
    661     return m_private->stringValue();
    662 }
    663 
    664 WebString WebAccessibilityObject::title() const
    665 {
    666     if (isDetached())
    667         return WebString();
    668 
    669     return m_private->title();
    670 }
    671 
    672 WebAccessibilityObject WebAccessibilityObject::titleUIElement() const
    673 {
    674     if (isDetached())
    675         return WebAccessibilityObject();
    676 
    677     if (!m_private->exposesTitleUIElement())
    678         return WebAccessibilityObject();
    679 
    680     return WebAccessibilityObject(m_private->titleUIElement());
    681 }
    682 
    683 WebURL WebAccessibilityObject::url() const
    684 {
    685     if (isDetached())
    686         return WebURL();
    687 
    688     return m_private->url();
    689 }
    690 
    691 bool WebAccessibilityObject::supportsRangeValue() const
    692 {
    693     if (isDetached())
    694         return false;
    695 
    696     return m_private->supportsRangeValue();
    697 }
    698 
    699 WebString WebAccessibilityObject::valueDescription() const
    700 {
    701     if (isDetached())
    702         return WebString();
    703 
    704     return m_private->valueDescription();
    705 }
    706 
    707 float WebAccessibilityObject::valueForRange() const
    708 {
    709     if (isDetached())
    710         return 0.0;
    711 
    712     return m_private->valueForRange();
    713 }
    714 
    715 float WebAccessibilityObject::maxValueForRange() const
    716 {
    717     if (isDetached())
    718         return 0.0;
    719 
    720     return m_private->maxValueForRange();
    721 }
    722 
    723 float WebAccessibilityObject::minValueForRange() const
    724 {
    725     if (isDetached())
    726         return 0.0;
    727 
    728     return m_private->minValueForRange();
    729 }
    730 
    731 WebNode WebAccessibilityObject::node() const
    732 {
    733     if (isDetached())
    734         return WebNode();
    735 
    736     Node* node = m_private->node();
    737     if (!node)
    738         return WebNode();
    739 
    740     return WebNode(node);
    741 }
    742 
    743 WebDocument WebAccessibilityObject::document() const
    744 {
    745     if (isDetached())
    746         return WebDocument();
    747 
    748     Document* document = m_private->document();
    749     if (!document)
    750         return WebDocument();
    751 
    752     return WebDocument(document);
    753 }
    754 
    755 bool WebAccessibilityObject::hasComputedStyle() const
    756 {
    757     if (isDetached())
    758         return false;
    759 
    760     Document* document = m_private->document();
    761     if (document)
    762         document->updateStyleIfNeeded();
    763 
    764     Node* node = m_private->node();
    765     if (!node)
    766         return false;
    767 
    768     return node->computedStyle();
    769 }
    770 
    771 WebString WebAccessibilityObject::computedStyleDisplay() const
    772 {
    773     if (isDetached())
    774         return WebString();
    775 
    776     Document* document = m_private->document();
    777     if (document)
    778         document->updateStyleIfNeeded();
    779 
    780     Node* node = m_private->node();
    781     if (!node)
    782         return WebString();
    783 
    784     RenderStyle* renderStyle = node->computedStyle();
    785     if (!renderStyle)
    786         return WebString();
    787 
    788     return WebString(CSSPrimitiveValue::create(renderStyle->display())->getStringValue());
    789 }
    790 
    791 bool WebAccessibilityObject::accessibilityIsIgnored() const
    792 {
    793     if (isDetached())
    794         return false;
    795 
    796     return m_private->accessibilityIsIgnored();
    797 }
    798 
    799 bool WebAccessibilityObject::lineBreaks(WebVector<int>& result) const
    800 {
    801     if (isDetached())
    802         return false;
    803 
    804     Vector<int> lineBreaksVector;
    805     m_private->lineBreaks(lineBreaksVector);
    806 
    807     size_t vectorSize = lineBreaksVector.size();
    808     WebVector<int> lineBreaksWebVector(vectorSize);
    809     for (size_t i = 0; i< vectorSize; i++)
    810         lineBreaksWebVector[i] = lineBreaksVector[i];
    811     result.swap(lineBreaksWebVector);
    812 
    813     return true;
    814 }
    815 
    816 unsigned WebAccessibilityObject::columnCount() const
    817 {
    818     if (isDetached())
    819         return false;
    820 
    821     if (!m_private->isAccessibilityTable())
    822         return 0;
    823 
    824     return static_cast<WebCore::AccessibilityTable*>(m_private.get())->columnCount();
    825 }
    826 
    827 unsigned WebAccessibilityObject::rowCount() const
    828 {
    829     if (isDetached())
    830         return false;
    831 
    832     if (!m_private->isAccessibilityTable())
    833         return 0;
    834 
    835     return static_cast<WebCore::AccessibilityTable*>(m_private.get())->rowCount();
    836 }
    837 
    838 WebAccessibilityObject WebAccessibilityObject::cellForColumnAndRow(unsigned column, unsigned row) const
    839 {
    840     if (isDetached())
    841         return WebAccessibilityObject();
    842 
    843     if (!m_private->isAccessibilityTable())
    844         return WebAccessibilityObject();
    845 
    846     WebCore::AccessibilityTableCell* cell = static_cast<WebCore::AccessibilityTable*>(m_private.get())->cellForColumnAndRow(column, row);
    847     return WebAccessibilityObject(static_cast<WebCore::AccessibilityObject*>(cell));
    848 }
    849 
    850 WebAccessibilityObject WebAccessibilityObject::headerContainerObject() const
    851 {
    852     if (isDetached())
    853         return WebAccessibilityObject();
    854 
    855     if (!m_private->isAccessibilityTable())
    856         return WebAccessibilityObject();
    857 
    858     return WebAccessibilityObject(static_cast<WebCore::AccessibilityTable*>(m_private.get())->headerContainer());
    859 }
    860 
    861 WebAccessibilityObject WebAccessibilityObject::rowAtIndex(unsigned int rowIndex) const
    862 {
    863     if (isDetached())
    864         return WebAccessibilityObject();
    865 
    866     if (!m_private->isAccessibilityTable())
    867         return WebAccessibilityObject();
    868 
    869     const AccessibilityObject::AccessibilityChildrenVector& rows = static_cast<WebCore::AccessibilityTable*>(m_private.get())->rows();
    870     if (rowIndex < rows.size())
    871         return WebAccessibilityObject(rows[rowIndex]);
    872 
    873     return WebAccessibilityObject();
    874 }
    875 
    876 WebAccessibilityObject WebAccessibilityObject::columnAtIndex(unsigned int columnIndex) const
    877 {
    878     if (isDetached())
    879         return WebAccessibilityObject();
    880 
    881     if (!m_private->isAccessibilityTable())
    882         return WebAccessibilityObject();
    883 
    884     const AccessibilityObject::AccessibilityChildrenVector& columns = static_cast<WebCore::AccessibilityTable*>(m_private.get())->columns();
    885     if (columnIndex < columns.size())
    886         return WebAccessibilityObject(columns[columnIndex]);
    887 
    888     return WebAccessibilityObject();
    889 }
    890 
    891 unsigned WebAccessibilityObject::rowIndex() const
    892 {
    893     if (isDetached())
    894         return 0;
    895 
    896     if (!m_private->isTableRow())
    897         return 0;
    898 
    899     return static_cast<WebCore::AccessibilityTableRow*>(m_private.get())->rowIndex();
    900 }
    901 
    902 WebAccessibilityObject WebAccessibilityObject::rowHeader() const
    903 {
    904     if (isDetached())
    905         return WebAccessibilityObject();
    906 
    907     if (!m_private->isTableRow())
    908         return WebAccessibilityObject();
    909 
    910     return WebAccessibilityObject(static_cast<WebCore::AccessibilityTableRow*>(m_private.get())->headerObject());
    911 }
    912 
    913 unsigned WebAccessibilityObject::columnIndex() const
    914 {
    915     if (isDetached())
    916         return 0;
    917 
    918     if (m_private->roleValue() != ColumnRole)
    919         return 0;
    920 
    921     return static_cast<WebCore::AccessibilityTableColumn*>(m_private.get())->columnIndex();
    922 }
    923 
    924 WebAccessibilityObject WebAccessibilityObject::columnHeader() const
    925 {
    926     if (isDetached())
    927         return WebAccessibilityObject();
    928 
    929     if (m_private->roleValue() != ColumnRole)
    930         return WebAccessibilityObject();
    931 
    932     return WebAccessibilityObject(static_cast<WebCore::AccessibilityTableColumn*>(m_private.get())->headerObject());
    933 }
    934 
    935 unsigned WebAccessibilityObject::cellColumnIndex() const
    936 {
    937     if (isDetached())
    938         return 0;
    939 
    940     if (!m_private->isTableCell())
    941        return 0;
    942 
    943     pair<unsigned, unsigned> columnRange;
    944     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
    945     return columnRange.first;
    946 }
    947 
    948 unsigned WebAccessibilityObject::cellColumnSpan() const
    949 {
    950     if (isDetached())
    951         return 0;
    952 
    953     if (!m_private->isTableCell())
    954        return 0;
    955 
    956     pair<unsigned, unsigned> columnRange;
    957     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
    958     return columnRange.second;
    959 }
    960 
    961 unsigned WebAccessibilityObject::cellRowIndex() const
    962 {
    963     if (isDetached())
    964         return 0;
    965 
    966     if (!m_private->isTableCell())
    967        return 0;
    968 
    969     pair<unsigned, unsigned> rowRange;
    970     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
    971     return rowRange.first;
    972 }
    973 
    974 unsigned WebAccessibilityObject::cellRowSpan() const
    975 {
    976     if (isDetached())
    977         return 0;
    978 
    979     if (!m_private->isTableCell())
    980        return 0;
    981 
    982     pair<unsigned, unsigned> rowRange;
    983     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
    984     return rowRange.second;
    985 }
    986 
    987 void WebAccessibilityObject::scrollToMakeVisible() const
    988 {
    989     if (!isDetached())
    990         m_private->scrollToMakeVisible();
    991 }
    992 
    993 void WebAccessibilityObject::scrollToMakeVisibleWithSubFocus(const WebRect& subfocus) const
    994 {
    995     if (!isDetached())
    996         m_private->scrollToMakeVisibleWithSubFocus(subfocus);
    997 }
    998 
    999 void WebAccessibilityObject::scrollToGlobalPoint(const WebPoint& point) const
   1000 {
   1001     if (!isDetached())
   1002         m_private->scrollToGlobalPoint(point);
   1003 }
   1004 
   1005 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
   1006     : m_private(object)
   1007 {
   1008 }
   1009 
   1010 WebAccessibilityObject& WebAccessibilityObject::operator=(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
   1011 {
   1012     m_private = object;
   1013     return *this;
   1014 }
   1015 
   1016 WebAccessibilityObject::operator WTF::PassRefPtr<WebCore::AccessibilityObject>() const
   1017 {
   1018     return m_private.get();
   1019 }
   1020 
   1021 } // namespace WebKit
   1022