~ubuntu-branches/ubuntu/karmic/webkit/karmic-proposed

« back to all changes in this revision

Viewing changes to WebCore/page/AccessibilityRenderObject.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Gustavo Noronha Silva
  • Date: 2009-05-15 18:30:58 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20090515183058-50q5exjo9b1kxy9s
Tags: 1.1.7-1
* New upstream release
* debian/libwebkit-1.0-2.symbols:
- updated with the new symbols in 1.1.7
* debian/libwebkit-dev.install, debian/libwebkit-dev.links,
  debian/rules:
- Build, and ship gtk-doc documentation (Closes: #526683)
* debian/copyright:
- updated.

Show diffs side-by-side

added added

removed removed

Lines of Context:
57
57
#include "Page.h"
58
58
#include "RenderFieldset.h"
59
59
#include "RenderFileUploadControl.h"
 
60
#include "RenderHTMLCanvas.h"
60
61
#include "RenderImage.h"
61
62
#include "RenderInline.h"
62
63
#include "RenderListBox.h"
568
569
    Node* node = m_renderer->node();
569
570
    if (!node)
570
571
        return 0;
571
 
    if (!node->isElementNode())
 
572
    
 
573
    // check if our parent is a mouse button listener
 
574
    while (node && !node->isElementNode())
 
575
        node = node->parent();
 
576
 
 
577
    if (!node)
572
578
        return 0;
573
579
 
574
580
    // FIXME: Do the continuation search like anchorElement does
983
989
 
984
990
IntRect AccessibilityRenderObject::boundingBoxRect() const
985
991
{
986
 
    IntRect rect;
987
992
    RenderObject* obj = m_renderer;
988
993
    
989
994
    if (!obj)
992
997
    if (obj->node()) // If we are a continuation, we want to make sure to use the primary renderer.
993
998
        obj = obj->node()->renderer();
994
999
    
995
 
    // FIXME: This doesn't work correctly with transforms.
996
 
    Vector<IntRect> rects;
997
 
    FloatPoint absPos = obj->localToAbsolute();
998
 
    obj->absoluteRects(rects, absPos.x(), absPos.y());
999
 
    const size_t n = rects.size();
 
1000
    Vector<FloatQuad> quads;
 
1001
    obj->absoluteQuads(quads);
 
1002
    const size_t n = quads.size();
 
1003
    if (!n)
 
1004
        return IntRect();
 
1005
 
 
1006
    IntRect result;
1000
1007
    for (size_t i = 0; i < n; ++i) {
1001
 
        IntRect r = rects[i];
 
1008
        IntRect r = quads[i].enclosingBoundingBox();
1002
1009
        if (!r.isEmpty()) {
1003
1010
            if (obj->style()->hasAppearance())
1004
1011
                theme()->adjustRepaintRect(obj, r);
1005
 
            rect.unite(r);
 
1012
            result.unite(r);
1006
1013
        }
1007
1014
    }
1008
 
    return rect;
 
1015
    return result;
1009
1016
}
1010
1017
    
1011
1018
IntRect AccessibilityRenderObject::checkboxOrRadioRect() const
1128
1135
        addRadioButtonGroupMembers(linkedUIElements);
1129
1136
}
1130
1137
 
 
1138
bool AccessibilityRenderObject::exposesTitleUIElement() const
 
1139
{
 
1140
    if (!isControl())
 
1141
        return false;
 
1142
 
 
1143
    // checkbox or radio buttons don't expose the title ui element unless it has a title already
 
1144
    if (isCheckboxOrRadio() && getAttribute(titleAttr).isEmpty())
 
1145
        return false;
 
1146
    
 
1147
    return true;
 
1148
}
 
1149
    
1131
1150
AccessibilityObject* AccessibilityRenderObject::titleUIElement() const
1132
1151
{
1133
1152
    if (!m_renderer)
1137
1156
    if (isFieldset())
1138
1157
        return axObjectCache()->getOrCreate(static_cast<RenderFieldset*>(m_renderer)->findLegend());
1139
1158
    
1140
 
    // checkbox and radio hide their labels. Only controls get titleUIElements for now
1141
 
    if (isCheckboxOrRadio() || !isControl())
 
1159
    if (!exposesTitleUIElement())
1142
1160
        return 0;
1143
1161
    
1144
1162
    Node* element = m_renderer->node();
1171
1189
        HTMLElement* correspondingControl = labelElement->correspondingControl();
1172
1190
        if (correspondingControl && correspondingControl->renderer()) {
1173
1191
            AccessibilityObject* controlObject = axObjectCache()->getOrCreate(correspondingControl->renderer());
1174
 
            if (controlObject->isCheckboxOrRadio())
 
1192
            if (!controlObject->exposesTitleUIElement())
1175
1193
                return true;
1176
1194
        }
1177
1195
    }
1227
1245
                return true;
1228
1246
        }
1229
1247
        
 
1248
        if (node && node->hasTagName(canvasTag)) {
 
1249
            RenderHTMLCanvas* canvas = static_cast<RenderHTMLCanvas*>(m_renderer);
 
1250
            if (canvas->height() <= 1 || canvas->width() <= 1)
 
1251
                return true;
 
1252
            return false;
 
1253
        }
 
1254
        
1230
1255
        // check for one-dimensional image
1231
1256
        RenderImage* image = toRenderImage(m_renderer);
1232
1257
        if (image->height() <= 1 || image->width() <= 1)
1487
1512
bool AccessibilityRenderObject::isEnabled() const
1488
1513
{
1489
1514
    ASSERT(m_renderer);
1490
 
    if (!m_renderer->node() || !m_renderer->node()->isElementNode())
1491
 
        return true;
1492
 
 
1493
 
    FormControlElement* formControlElement = toFormControlElement(static_cast<Element*>(m_renderer->node()));
1494
 
    if (!formControlElement)
1495
 
        return true;
1496
 
 
1497
 
    return formControlElement->isEnabled();    
 
1515
    Node* node = m_renderer->node();
 
1516
    if (!node || !node->isElementNode())
 
1517
        return true;
 
1518
 
 
1519
    return static_cast<Element*>(node)->isEnabledFormControl();
1498
1520
}
1499
1521
 
1500
1522
RenderView* AccessibilityRenderObject::topRenderer() const
1531
1553
    if (!m_renderer || !map)
1532
1554
        return 0;
1533
1555
 
 
1556
    String mapName = map->getName().string().lower();
1534
1557
    RefPtr<HTMLCollection> coll = m_renderer->document()->images();
1535
1558
    for (Node* curr = coll->firstItem(); curr; curr = coll->nextItem()) {
1536
1559
        RenderObject* obj = curr->renderer();
1539
1562
        
1540
1563
        // The HTMLImageElement's useMap() value includes the '#' symbol at the beginning,
1541
1564
        // which has to be stripped off
1542
 
        if (static_cast<HTMLImageElement*>(curr)->useMap().substring(1) == map->getName())
 
1565
        String useMapName = static_cast<HTMLImageElement*>(curr)->useMap().substring(1).lower();
 
1566
        if (useMapName == mapName)
1543
1567
            return axObjectCache()->getOrCreate(obj);
1544
1568
    }
1545
1569
    
1699
1723
    ExceptionCode ec = 0;
1700
1724
    RefPtr<Range> range = Range::create(m_renderer->document());
1701
1725
    range->setStart(node, 0, ec);
1702
 
    range->setEnd(indexPosition.node(), indexPosition.m_offset, ec);
 
1726
    range->setEnd(indexPosition.node(), indexPosition.deprecatedEditingOffset(), ec);
1703
1727
    return TextIterator::rangeLength(range.get());
1704
1728
}
1705
1729
 
1927
1951
    return IntRect();
1928
1952
}
1929
1953
 
 
1954
AccessibilityObject* AccessibilityRenderObject::accessibilityImageMapHitTest(HTMLAreaElement* area, const IntPoint& point) const
 
1955
{
 
1956
    if (!area)
 
1957
        return 0;
 
1958
    
 
1959
    HTMLMapElement *map = static_cast<HTMLMapElement*>(area->parent());
 
1960
    AccessibilityObject* parent = accessibilityParentForImageMap(map);
 
1961
    if (!parent)
 
1962
        return 0;
 
1963
    
 
1964
    AccessibilityObject::AccessibilityChildrenVector children = parent->children();
 
1965
    
 
1966
    unsigned count = children.size();
 
1967
    for (unsigned k = 0; k < count; ++k) {
 
1968
        if (children[k]->elementRect().contains(point))
 
1969
            return children[k].get();
 
1970
    }
 
1971
    
 
1972
    return 0;
 
1973
}
 
1974
    
1930
1975
AccessibilityObject* AccessibilityRenderObject::doAccessibilityHitTest(const IntPoint& point) const
1931
1976
{
1932
1977
    if (!m_renderer || !m_renderer->hasLayer())
1941
1986
    if (!hitTestResult.innerNode())
1942
1987
        return 0;
1943
1988
    Node* node = hitTestResult.innerNode()->shadowAncestorNode();
 
1989
 
 
1990
    if (node->hasTagName(areaTag)) 
 
1991
        return accessibilityImageMapHitTest(static_cast<HTMLAreaElement*>(node), point);
 
1992
    
1944
1993
    RenderObject* obj = node->renderer();
1945
1994
    if (!obj)
1946
1995
        return 0;
2170
2219
            return ButtonRole;
2171
2220
        return ImageRole;
2172
2221
    }
 
2222
    if (node && node->hasTagName(canvasTag))
 
2223
        return ImageRole;
 
2224
    
2173
2225
    if (m_renderer->isRenderView())
2174
2226
        return WebAreaRole;
2175
2227
    
2239
2291
bool AccessibilityRenderObject::canSetFocusAttribute() const
2240
2292
{
2241
2293
    ASSERT(m_renderer);
 
2294
    Node* node = m_renderer->node();
2242
2295
 
2243
2296
    // NOTE: It would be more accurate to ask the document whether setFocusedNode() would
2244
2297
    // do anything.  For example, it setFocusedNode() will do nothing if the current focused
2245
2298
    // node will not relinquish the focus.
2246
 
    if (!m_renderer->node() || !m_renderer->node()->isElementNode())
 
2299
    if (!node || !node->isElementNode())
2247
2300
        return false;
2248
2301
 
2249
 
    FormControlElement* formControlElement = toFormControlElement(static_cast<Element*>(m_renderer->node()));
2250
 
    if (formControlElement && !formControlElement->isEnabled())
 
2302
    if (!static_cast<Element*>(node)->isEnabledFormControl())
2251
2303
        return false;
2252
2304
 
2253
2305
    switch (roleValue()) {