OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009, 2011 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 10 matching lines...) Expand all Loading... |
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 */ | 27 */ |
28 | 28 |
29 #include "modules/accessibility/AXObject.h" | 29 #include "modules/accessibility/AXObject.h" |
30 | 30 |
| 31 #include "SkMatrix44.h" |
31 #include "core/editing/EditingUtilities.h" | 32 #include "core/editing/EditingUtilities.h" |
32 #include "core/editing/VisibleUnits.h" | 33 #include "core/editing/VisibleUnits.h" |
33 #include "core/frame/FrameView.h" | 34 #include "core/frame/FrameView.h" |
34 #include "core/frame/LocalFrame.h" | 35 #include "core/frame/LocalFrame.h" |
35 #include "core/frame/Settings.h" | 36 #include "core/frame/Settings.h" |
36 #include "core/html/HTMLDialogElement.h" | 37 #include "core/html/HTMLDialogElement.h" |
37 #include "core/html/HTMLFrameOwnerElement.h" | 38 #include "core/html/HTMLFrameOwnerElement.h" |
38 #include "core/html/parser/HTMLParserIdioms.h" | 39 #include "core/html/parser/HTMLParserIdioms.h" |
| 40 #include "core/layout/LayoutInline.h" |
39 #include "core/layout/LayoutTheme.h" | 41 #include "core/layout/LayoutTheme.h" |
40 #include "modules/accessibility/AXObjectCacheImpl.h" | 42 #include "modules/accessibility/AXObjectCacheImpl.h" |
41 #include "platform/UserGestureIndicator.h" | 43 #include "platform/UserGestureIndicator.h" |
42 #include "platform/text/PlatformLocale.h" | 44 #include "platform/text/PlatformLocale.h" |
43 #include "wtf/HashSet.h" | 45 #include "wtf/HashSet.h" |
44 #include "wtf/StdLibExtras.h" | 46 #include "wtf/StdLibExtras.h" |
45 #include "wtf/text/WTFString.h" | 47 #include "wtf/text/WTFString.h" |
46 | 48 |
47 using blink::WebLocalizedString; | 49 using blink::WebLocalizedString; |
48 | 50 |
(...skipping 1076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 updateCachedAttributeValuesIfNeeded(); | 1127 updateCachedAttributeValuesIfNeeded(); |
1126 return m_cachedLiveRegionRoot && m_cachedLiveRegionRoot->liveRegionAtomic(); | 1128 return m_cachedLiveRegionRoot && m_cachedLiveRegionRoot->liveRegionAtomic(); |
1127 } | 1129 } |
1128 | 1130 |
1129 bool AXObject::containerLiveRegionBusy() const | 1131 bool AXObject::containerLiveRegionBusy() const |
1130 { | 1132 { |
1131 updateCachedAttributeValuesIfNeeded(); | 1133 updateCachedAttributeValuesIfNeeded(); |
1132 return m_cachedLiveRegionRoot && m_cachedLiveRegionRoot->liveRegionBusy(); | 1134 return m_cachedLiveRegionRoot && m_cachedLiveRegionRoot->liveRegionBusy(); |
1133 } | 1135 } |
1134 | 1136 |
1135 void AXObject::markCachedElementRectDirty() const | |
1136 { | |
1137 for (const auto& child : m_children) | |
1138 child->markCachedElementRectDirty(); | |
1139 } | |
1140 | |
1141 IntPoint AXObject::clickPoint() | |
1142 { | |
1143 LayoutRect rect = elementRect(); | |
1144 return roundedIntPoint(LayoutPoint(rect.x() + rect.width() / 2, rect.y() + r
ect.height() / 2)); | |
1145 } | |
1146 | |
1147 SkMatrix44 AXObject::transformFromLocalParentFrame() const | |
1148 { | |
1149 return SkMatrix44(); | |
1150 } | |
1151 | |
1152 IntRect AXObject::boundingBoxForQuads(LayoutObject* obj, const Vector<FloatQuad>
& quads) | |
1153 { | |
1154 ASSERT(obj); | |
1155 if (!obj) | |
1156 return IntRect(); | |
1157 | |
1158 size_t count = quads.size(); | |
1159 if (!count) | |
1160 return IntRect(); | |
1161 | |
1162 IntRect result; | |
1163 for (size_t i = 0; i < count; ++i) { | |
1164 IntRect r = quads[i].enclosingBoundingBox(); | |
1165 if (!r.isEmpty()) { | |
1166 // TODO(pdr): Should this be using visualOverflowRect? | |
1167 if (obj->style()->hasAppearance()) | |
1168 LayoutTheme::theme().addVisualOverflow(*obj, r); | |
1169 result.unite(r); | |
1170 } | |
1171 } | |
1172 return result; | |
1173 } | |
1174 | |
1175 AXObject* AXObject::elementAccessibilityHitTest(const IntPoint& point) const | 1137 AXObject* AXObject::elementAccessibilityHitTest(const IntPoint& point) const |
1176 { | 1138 { |
1177 // Check if there are any mock elements that need to be handled. | 1139 // Check if there are any mock elements that need to be handled. |
1178 for (const auto& child : m_children) { | 1140 for (const auto& child : m_children) { |
1179 if (child->isMockObject() && child->elementRect().contains(point)) | 1141 if (child->isMockObject() && child->getBoundsInFrameCoordinates().contai
ns(point)) |
1180 return child->elementAccessibilityHitTest(point); | 1142 return child->elementAccessibilityHitTest(point); |
1181 } | 1143 } |
1182 | 1144 |
1183 return const_cast<AXObject*>(this); | 1145 return const_cast<AXObject*>(this); |
1184 } | 1146 } |
1185 | 1147 |
1186 const AXObject::AXObjectVector& AXObject::children() | 1148 const AXObject::AXObjectVector& AXObject::children() |
1187 { | 1149 { |
1188 updateChildrenIfNecessary(); | 1150 updateChildrenIfNecessary(); |
1189 | 1151 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 void AXObject::setScrollOffset(const IntPoint& offset) const | 1307 void AXObject::setScrollOffset(const IntPoint& offset) const |
1346 { | 1308 { |
1347 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1309 ScrollableArea* area = getScrollableAreaIfScrollable(); |
1348 if (!area) | 1310 if (!area) |
1349 return; | 1311 return; |
1350 | 1312 |
1351 // TODO(bokan): This should potentially be a UserScroll. | 1313 // TODO(bokan): This should potentially be a UserScroll. |
1352 area->setScrollPosition(DoublePoint(offset.x(), offset.y()), ProgrammaticScr
oll); | 1314 area->setScrollPosition(DoublePoint(offset.x(), offset.y()), ProgrammaticScr
oll); |
1353 } | 1315 } |
1354 | 1316 |
1355 void AXObject::getRelativeBounds(AXObject** container, FloatRect& boundsInContai
ner, SkMatrix44& containerTransform) const | 1317 void AXObject::getRelativeBounds(AXObject** outContainer, FloatRect& outBoundsIn
Container, SkMatrix44& outContainerTransform) const |
1356 { | 1318 { |
1357 *container = nullptr; | 1319 *outContainer = nullptr; |
1358 boundsInContainer = FloatRect(); | 1320 outBoundsInContainer = FloatRect(); |
1359 containerTransform.setIdentity(); | 1321 outContainerTransform.setIdentity(); |
| 1322 |
| 1323 // First check if it has explicit bounds, for example if this element is tie
d to a |
| 1324 // canvas path. When explicit coordinates are provided, the ID of the explic
it container |
| 1325 // element that the coordinates are relative to must be provided too. |
| 1326 if (!m_explicitElementRect.isEmpty()) { |
| 1327 *outContainer = axObjectCache().objectFromAXID(m_explicitContainerID); |
| 1328 if (*outContainer) { |
| 1329 outBoundsInContainer = FloatRect(m_explicitElementRect); |
| 1330 return; |
| 1331 } |
| 1332 } |
| 1333 |
| 1334 LayoutObject* layoutObject = layoutObjectForRelativeBounds(); |
| 1335 if (!layoutObject) |
| 1336 return; |
| 1337 |
| 1338 if (isWebArea()) { |
| 1339 if (layoutObject->frame()->view()) |
| 1340 outBoundsInContainer.setSize(FloatSize(layoutObject->frame()->view()
->contentsSize())); |
| 1341 return; |
| 1342 } |
| 1343 |
| 1344 // First compute the container. The container must be an ancestor in the acc
essibility tree, and |
| 1345 // its LayoutObject must be an ancestor in the layout tree. Get the first su
ch ancestor that's |
| 1346 // either scrollable or has a paint layer. |
| 1347 AXObject* container = parentObjectUnignored(); |
| 1348 LayoutObject* containerLayoutObject = nullptr; |
| 1349 while (container) { |
| 1350 containerLayoutObject = container->getLayoutObject(); |
| 1351 if (containerLayoutObject && containerLayoutObject->isBoxModelObject() &
& layoutObject->isDescendantOf(containerLayoutObject)) { |
| 1352 if (container->isScrollableContainer() || containerLayoutObject->has
Layer()) |
| 1353 break; |
| 1354 } |
| 1355 |
| 1356 container = container->parentObjectUnignored(); |
| 1357 } |
| 1358 |
| 1359 if (!container) |
| 1360 return; |
| 1361 *outContainer = container; |
| 1362 |
| 1363 // Next get the local bounds of this LayoutObject, which is typically |
| 1364 // a rect at point (0, 0) with the width and height of the LayoutObject. |
| 1365 LayoutRect localBounds; |
| 1366 if (layoutObject->isText()) { |
| 1367 Vector<FloatQuad> quads; |
| 1368 toLayoutText(layoutObject)->quads(quads, LayoutText::ClipToEllipsis, Lay
outText::LocalQuads); |
| 1369 for (const FloatQuad& quad : quads) |
| 1370 localBounds.unite(LayoutRect(quad.boundingBox())); |
| 1371 } else if (layoutObject->isLayoutInline()) { |
| 1372 Vector<LayoutRect> rects; |
| 1373 toLayoutInline(layoutObject)->addOutlineRects(rects, LayoutPoint(), Layo
utObject::IncludeBlockVisualOverflow); |
| 1374 localBounds = unionRect(rects); |
| 1375 } else if (layoutObject->isBox()) { |
| 1376 localBounds = LayoutRect(LayoutPoint(), toLayoutBox(layoutObject)->size(
)); |
| 1377 } else if (layoutObject->isSVG()) { |
| 1378 localBounds = LayoutRect(layoutObject->strokeBoundingBox()); |
| 1379 } else { |
| 1380 DCHECK(false); |
| 1381 } |
| 1382 outBoundsInContainer = FloatRect(localBounds); |
| 1383 |
| 1384 // If the container has a scroll offset, subtract that out because we want o
ur |
| 1385 // bounds to be relative to the *unscrolled* position of the container objec
t. |
| 1386 ScrollableArea* scrollableArea = container->getScrollableAreaIfScrollable(); |
| 1387 if (scrollableArea && !container->isWebArea()) { |
| 1388 IntPoint scrollPosition = scrollableArea->scrollPosition(); |
| 1389 outBoundsInContainer.move(FloatSize(scrollPosition.x(), scrollPosition.y
())); |
| 1390 } |
| 1391 |
| 1392 // Compute the transform between the container's coordinate space and this o
bject. |
| 1393 // If the transform is just a simple translation, apply that to the bounding
box, but |
| 1394 // if it's a non-trivial transformation like a rotation, scaling, etc. then
return |
| 1395 // the full matrix instead. |
| 1396 TransformationMatrix transform = layoutObject->localToAncestorTransform(toLa
youtBoxModelObject(containerLayoutObject)); |
| 1397 if (transform.isIdentityOr2DTranslation()) { |
| 1398 outBoundsInContainer.move(transform.to2DTranslation()); |
| 1399 } else { |
| 1400 outContainerTransform = TransformationMatrix::toSkMatrix44(transform); |
| 1401 } |
| 1402 } |
| 1403 |
| 1404 LayoutRect AXObject::getBoundsInFrameCoordinates() const |
| 1405 { |
| 1406 AXObject* container = nullptr; |
| 1407 FloatRect bounds; |
| 1408 SkMatrix44 transform; |
| 1409 getRelativeBounds(&container, bounds, transform); |
| 1410 FloatRect computedBounds(0, 0, bounds.width(), bounds.height()); |
| 1411 while (container && container != this) { |
| 1412 computedBounds.move(bounds.x(), bounds.y()); |
| 1413 if (!container->isWebArea()) |
| 1414 computedBounds.move(-container->scrollOffset().x(), -container->scro
llOffset().y()); |
| 1415 if (!transform.isIdentity()) { |
| 1416 TransformationMatrix transformationMatrix(transform); |
| 1417 transformationMatrix.mapRect(computedBounds); |
| 1418 } |
| 1419 container->getRelativeBounds(&container, bounds, transform); |
| 1420 } |
| 1421 return LayoutRect(computedBounds); |
1360 } | 1422 } |
1361 | 1423 |
1362 // | 1424 // |
1363 // Modify or take an action on an object. | 1425 // Modify or take an action on an object. |
1364 // | 1426 // |
1365 | 1427 |
1366 bool AXObject::press() const | 1428 bool AXObject::press() const |
1367 { | 1429 { |
1368 Element* actionElem = actionElement(); | 1430 Element* actionElem = actionElement(); |
1369 if (!actionElem) | 1431 if (!actionElem) |
1370 return false; | 1432 return false; |
1371 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); | 1433 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); |
1372 actionElem->accessKeyAction(true); | 1434 actionElem->accessKeyAction(true); |
1373 return true; | 1435 return true; |
1374 } | 1436 } |
1375 | 1437 |
1376 void AXObject::scrollToMakeVisible() const | 1438 void AXObject::scrollToMakeVisible() const |
1377 { | 1439 { |
1378 IntRect objectRect = pixelSnappedIntRect(elementRect()); | 1440 IntRect objectRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
1379 objectRect.setLocation(IntPoint()); | 1441 objectRect.setLocation(IntPoint()); |
1380 scrollToMakeVisibleWithSubFocus(objectRect); | 1442 scrollToMakeVisibleWithSubFocus(objectRect); |
1381 } | 1443 } |
1382 | 1444 |
1383 // This is a 1-dimensional scroll offset helper function that's applied | 1445 // This is a 1-dimensional scroll offset helper function that's applied |
1384 // separately in the horizontal and vertical directions, because the | 1446 // separately in the horizontal and vertical directions, because the |
1385 // logic is the same. The goal is to compute the best scroll offset | 1447 // logic is the same. The goal is to compute the best scroll offset |
1386 // in order to make an object visible within a viewport. | 1448 // in order to make an object visible within a viewport. |
1387 // | 1449 // |
1388 // If the object is already fully visible, returns the same scroll | 1450 // If the object is already fully visible, returns the same scroll |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 ScrollableArea* scrollableArea = 0; | 1540 ScrollableArea* scrollableArea = 0; |
1479 while (scrollParent) { | 1541 while (scrollParent) { |
1480 scrollableArea = scrollParent->getScrollableAreaIfScrollable(); | 1542 scrollableArea = scrollParent->getScrollableAreaIfScrollable(); |
1481 if (scrollableArea) | 1543 if (scrollableArea) |
1482 break; | 1544 break; |
1483 scrollParent = scrollParent->parentObject(); | 1545 scrollParent = scrollParent->parentObject(); |
1484 } | 1546 } |
1485 if (!scrollParent || !scrollableArea) | 1547 if (!scrollParent || !scrollableArea) |
1486 return; | 1548 return; |
1487 | 1549 |
1488 IntRect objectRect = pixelSnappedIntRect(elementRect()); | 1550 IntRect objectRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
1489 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1551 IntPoint scrollPosition = scrollableArea->scrollPosition(); |
1490 IntRect scrollVisibleRect = scrollableArea->visibleContentRect(); | 1552 IntRect scrollVisibleRect = scrollableArea->visibleContentRect(); |
1491 | 1553 |
1492 // Convert the object rect into local coordinates. | 1554 // Convert the object rect into local coordinates. |
1493 if (!scrollParent->isWebArea()) { | 1555 if (!scrollParent->isWebArea()) { |
1494 objectRect.moveBy(scrollPosition); | 1556 objectRect.moveBy(scrollPosition); |
1495 objectRect.moveBy(-pixelSnappedIntRect(scrollParent->elementRect()).loca
tion()); | 1557 objectRect.moveBy(-pixelSnappedIntRect(scrollParent->getBoundsInFrameCoo
rdinates()).location()); |
1496 } | 1558 } |
1497 | 1559 |
1498 int desiredX = computeBestScrollOffset( | 1560 int desiredX = computeBestScrollOffset( |
1499 scrollPosition.x(), | 1561 scrollPosition.x(), |
1500 objectRect.x() + subfocus.x(), objectRect.x() + subfocus.maxX(), | 1562 objectRect.x() + subfocus.x(), objectRect.x() + subfocus.maxX(), |
1501 objectRect.x(), objectRect.maxX(), | 1563 objectRect.x(), objectRect.maxX(), |
1502 0, scrollVisibleRect.width()); | 1564 0, scrollVisibleRect.width()); |
1503 int desiredY = computeBestScrollOffset( | 1565 int desiredY = computeBestScrollOffset( |
1504 scrollPosition.y(), | 1566 scrollPosition.y(), |
1505 objectRect.y() + subfocus.y(), objectRect.y() + subfocus.maxY(), | 1567 objectRect.y() + subfocus.y(), objectRect.y() + subfocus.maxY(), |
1506 objectRect.y(), objectRect.maxY(), | 1568 objectRect.y(), objectRect.maxY(), |
1507 0, scrollVisibleRect.height()); | 1569 0, scrollVisibleRect.height()); |
1508 | 1570 |
1509 scrollParent->setScrollOffset(IntPoint(desiredX, desiredY)); | 1571 scrollParent->setScrollOffset(IntPoint(desiredX, desiredY)); |
1510 | 1572 |
1511 // Convert the subfocus into the coordinates of the scroll parent. | 1573 // Convert the subfocus into the coordinates of the scroll parent. |
1512 IntRect newSubfocus = subfocus; | 1574 IntRect newSubfocus = subfocus; |
1513 IntRect newElementRect = pixelSnappedIntRect(elementRect()); | 1575 IntRect newElementRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
1514 IntRect scrollParentRect = pixelSnappedIntRect(scrollParent->elementRect()); | 1576 IntRect scrollParentRect = pixelSnappedIntRect(scrollParent->getBoundsInFram
eCoordinates()); |
1515 newSubfocus.move(newElementRect.x(), newElementRect.y()); | 1577 newSubfocus.move(newElementRect.x(), newElementRect.y()); |
1516 newSubfocus.move(-scrollParentRect.x(), -scrollParentRect.y()); | 1578 newSubfocus.move(-scrollParentRect.x(), -scrollParentRect.y()); |
1517 | 1579 |
1518 // Recursively make sure the scroll parent itself is visible. | 1580 // Recursively make sure the scroll parent itself is visible. |
1519 if (scrollParent->parentObject()) | 1581 if (scrollParent->parentObject()) |
1520 scrollParent->scrollToMakeVisibleWithSubFocus(newSubfocus); | 1582 scrollParent->scrollToMakeVisibleWithSubFocus(newSubfocus); |
1521 } | 1583 } |
1522 | 1584 |
1523 void AXObject::scrollToGlobalPoint(const IntPoint& globalPoint) const | 1585 void AXObject::scrollToGlobalPoint(const IntPoint& globalPoint) const |
1524 { | 1586 { |
(...skipping 10 matching lines...) Expand all Loading... |
1535 // Start with the outermost scrollable (the main window) and try to scroll t
he | 1597 // Start with the outermost scrollable (the main window) and try to scroll t
he |
1536 // next innermost object to the given point. | 1598 // next innermost object to the given point. |
1537 int offsetX = 0, offsetY = 0; | 1599 int offsetX = 0, offsetY = 0; |
1538 IntPoint point = globalPoint; | 1600 IntPoint point = globalPoint; |
1539 size_t levels = objects.size() - 1; | 1601 size_t levels = objects.size() - 1; |
1540 for (size_t i = 0; i < levels; i++) { | 1602 for (size_t i = 0; i < levels; i++) { |
1541 const AXObject* outer = objects[i]; | 1603 const AXObject* outer = objects[i]; |
1542 const AXObject* inner = objects[i + 1]; | 1604 const AXObject* inner = objects[i + 1]; |
1543 ScrollableArea* scrollableArea = outer->getScrollableAreaIfScrollable(); | 1605 ScrollableArea* scrollableArea = outer->getScrollableAreaIfScrollable(); |
1544 | 1606 |
1545 IntRect innerRect = inner->isWebArea() ? pixelSnappedIntRect(inner->pare
ntObject()->elementRect()) : pixelSnappedIntRect(inner->elementRect()); | 1607 IntRect innerRect = inner->isWebArea() ? pixelSnappedIntRect(inner->pare
ntObject()->getBoundsInFrameCoordinates()) : pixelSnappedIntRect(inner->getBound
sInFrameCoordinates()); |
1546 IntRect objectRect = innerRect; | 1608 IntRect objectRect = innerRect; |
1547 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1609 IntPoint scrollPosition = scrollableArea->scrollPosition(); |
1548 | 1610 |
1549 // Convert the object rect into local coordinates. | 1611 // Convert the object rect into local coordinates. |
1550 objectRect.move(offsetX, offsetY); | 1612 objectRect.move(offsetX, offsetY); |
1551 if (!outer->isWebArea()) | 1613 if (!outer->isWebArea()) |
1552 objectRect.move(scrollPosition.x(), scrollPosition.y()); | 1614 objectRect.move(scrollPosition.x(), scrollPosition.y()); |
1553 | 1615 |
1554 int desiredX = computeBestScrollOffset( | 1616 int desiredX = computeBestScrollOffset( |
1555 0, | 1617 0, |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1754 | 1816 |
1755 DEFINE_TRACE(AXObject) | 1817 DEFINE_TRACE(AXObject) |
1756 { | 1818 { |
1757 visitor->trace(m_children); | 1819 visitor->trace(m_children); |
1758 visitor->trace(m_parent); | 1820 visitor->trace(m_parent); |
1759 visitor->trace(m_cachedLiveRegionRoot); | 1821 visitor->trace(m_cachedLiveRegionRoot); |
1760 visitor->trace(m_axObjectCache); | 1822 visitor->trace(m_axObjectCache); |
1761 } | 1823 } |
1762 | 1824 |
1763 } // namespace blink | 1825 } // namespace blink |
OLD | NEW |