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