| 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 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 | 1202 |
| 1203 bool AXObject::isScrollableContainer() const { | 1203 bool AXObject::isScrollableContainer() const { |
| 1204 return !!getScrollableAreaIfScrollable(); | 1204 return !!getScrollableAreaIfScrollable(); |
| 1205 } | 1205 } |
| 1206 | 1206 |
| 1207 IntPoint AXObject::scrollOffset() const { | 1207 IntPoint AXObject::scrollOffset() const { |
| 1208 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1208 ScrollableArea* area = getScrollableAreaIfScrollable(); |
| 1209 if (!area) | 1209 if (!area) |
| 1210 return IntPoint(); | 1210 return IntPoint(); |
| 1211 | 1211 |
| 1212 return IntPoint(area->scrollPosition().x(), area->scrollPosition().y()); | 1212 return IntPoint(area->scrollOffsetInt().width(), |
| 1213 area->scrollOffsetInt().height()); |
| 1213 } | 1214 } |
| 1214 | 1215 |
| 1215 IntPoint AXObject::minimumScrollOffset() const { | 1216 IntPoint AXObject::minimumScrollOffset() const { |
| 1216 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1217 ScrollableArea* area = getScrollableAreaIfScrollable(); |
| 1217 if (!area) | 1218 if (!area) |
| 1218 return IntPoint(); | 1219 return IntPoint(); |
| 1219 | 1220 |
| 1220 return IntPoint(area->minimumScrollPosition().x(), | 1221 return IntPoint(area->minimumScrollOffsetInt().width(), |
| 1221 area->minimumScrollPosition().y()); | 1222 area->minimumScrollOffsetInt().height()); |
| 1222 } | 1223 } |
| 1223 | 1224 |
| 1224 IntPoint AXObject::maximumScrollOffset() const { | 1225 IntPoint AXObject::maximumScrollOffset() const { |
| 1225 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1226 ScrollableArea* area = getScrollableAreaIfScrollable(); |
| 1226 if (!area) | 1227 if (!area) |
| 1227 return IntPoint(); | 1228 return IntPoint(); |
| 1228 | 1229 |
| 1229 return IntPoint(area->maximumScrollPosition().x(), | 1230 return IntPoint(area->maximumScrollOffsetInt().width(), |
| 1230 area->maximumScrollPosition().y()); | 1231 area->maximumScrollOffsetInt().height()); |
| 1231 } | 1232 } |
| 1232 | 1233 |
| 1233 void AXObject::setScrollOffset(const IntPoint& offset) const { | 1234 void AXObject::setScrollOffset(const IntPoint& offset) const { |
| 1234 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1235 ScrollableArea* area = getScrollableAreaIfScrollable(); |
| 1235 if (!area) | 1236 if (!area) |
| 1236 return; | 1237 return; |
| 1237 | 1238 |
| 1238 // TODO(bokan): This should potentially be a UserScroll. | 1239 // TODO(bokan): This should potentially be a UserScroll. |
| 1239 area->setScrollPosition(DoublePoint(offset.x(), offset.y()), | 1240 area->setScrollOffset(ScrollOffset(offset.x(), offset.y()), |
| 1240 ProgrammaticScroll); | 1241 ProgrammaticScroll); |
| 1241 } | 1242 } |
| 1242 | 1243 |
| 1243 void AXObject::getRelativeBounds(AXObject** outContainer, | 1244 void AXObject::getRelativeBounds(AXObject** outContainer, |
| 1244 FloatRect& outBoundsInContainer, | 1245 FloatRect& outBoundsInContainer, |
| 1245 SkMatrix44& outContainerTransform) const { | 1246 SkMatrix44& outContainerTransform) const { |
| 1246 *outContainer = nullptr; | 1247 *outContainer = nullptr; |
| 1247 outBoundsInContainer = FloatRect(); | 1248 outBoundsInContainer = FloatRect(); |
| 1248 outContainerTransform.setIdentity(); | 1249 outContainerTransform.setIdentity(); |
| 1249 | 1250 |
| 1250 // First check if it has explicit bounds, for example if this element is tied
to a | 1251 // First check if it has explicit bounds, for example if this element is tied
to a |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1288 | 1289 |
| 1289 if (!container) | 1290 if (!container) |
| 1290 return; | 1291 return; |
| 1291 *outContainer = container; | 1292 *outContainer = container; |
| 1292 outBoundsInContainer = layoutObject->localBoundingBoxRectForAccessibility(); | 1293 outBoundsInContainer = layoutObject->localBoundingBoxRectForAccessibility(); |
| 1293 | 1294 |
| 1294 // If the container has a scroll offset, subtract that out because we want our | 1295 // If the container has a scroll offset, subtract that out because we want our |
| 1295 // bounds to be relative to the *unscrolled* position of the container object. | 1296 // bounds to be relative to the *unscrolled* position of the container object. |
| 1296 ScrollableArea* scrollableArea = container->getScrollableAreaIfScrollable(); | 1297 ScrollableArea* scrollableArea = container->getScrollableAreaIfScrollable(); |
| 1297 if (scrollableArea && !container->isWebArea()) { | 1298 if (scrollableArea && !container->isWebArea()) { |
| 1298 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1299 ScrollOffset scrollOffset = scrollableArea->scrollOffset(); |
| 1299 outBoundsInContainer.move( | 1300 outBoundsInContainer.move(scrollOffset); |
| 1300 FloatSize(scrollPosition.x(), scrollPosition.y())); | |
| 1301 } | 1301 } |
| 1302 | 1302 |
| 1303 // Compute the transform between the container's coordinate space and this obj
ect. | 1303 // Compute the transform between the container's coordinate space and this obj
ect. |
| 1304 // If the transform is just a simple translation, apply that to the bounding b
ox, but | 1304 // If the transform is just a simple translation, apply that to the bounding b
ox, but |
| 1305 // if it's a non-trivial transformation like a rotation, scaling, etc. then re
turn | 1305 // if it's a non-trivial transformation like a rotation, scaling, etc. then re
turn |
| 1306 // the full matrix instead. | 1306 // the full matrix instead. |
| 1307 TransformationMatrix transform = layoutObject->localToAncestorTransform( | 1307 TransformationMatrix transform = layoutObject->localToAncestorTransform( |
| 1308 toLayoutBoxModelObject(containerLayoutObject)); | 1308 toLayoutBoxModelObject(containerLayoutObject)); |
| 1309 if (transform.isIdentityOr2DTranslation()) { | 1309 if (transform.isIdentityOr2DTranslation()) { |
| 1310 outBoundsInContainer.move(transform.to2DTranslation()); | 1310 outBoundsInContainer.move(transform.to2DTranslation()); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1455 while (scrollParent) { | 1455 while (scrollParent) { |
| 1456 scrollableArea = scrollParent->getScrollableAreaIfScrollable(); | 1456 scrollableArea = scrollParent->getScrollableAreaIfScrollable(); |
| 1457 if (scrollableArea) | 1457 if (scrollableArea) |
| 1458 break; | 1458 break; |
| 1459 scrollParent = scrollParent->parentObject(); | 1459 scrollParent = scrollParent->parentObject(); |
| 1460 } | 1460 } |
| 1461 if (!scrollParent || !scrollableArea) | 1461 if (!scrollParent || !scrollableArea) |
| 1462 return; | 1462 return; |
| 1463 | 1463 |
| 1464 IntRect objectRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); | 1464 IntRect objectRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
| 1465 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1465 IntSize scrollOffset = scrollableArea->scrollOffsetInt(); |
| 1466 IntRect scrollVisibleRect = scrollableArea->visibleContentRect(); | 1466 IntRect scrollVisibleRect = scrollableArea->visibleContentRect(); |
| 1467 | 1467 |
| 1468 // Convert the object rect into local coordinates. | 1468 // Convert the object rect into local coordinates. |
| 1469 if (!scrollParent->isWebArea()) { | 1469 if (!scrollParent->isWebArea()) { |
| 1470 objectRect.moveBy(scrollPosition); | 1470 objectRect.moveBy(IntPoint(scrollOffset)); |
| 1471 objectRect.moveBy( | 1471 objectRect.moveBy( |
| 1472 -pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()) | 1472 -pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()) |
| 1473 .location()); | 1473 .location()); |
| 1474 } | 1474 } |
| 1475 | 1475 |
| 1476 int desiredX = | 1476 int desiredX = computeBestScrollOffset( |
| 1477 computeBestScrollOffset(scrollPosition.x(), objectRect.x() + subfocus.x(), | 1477 scrollOffset.width(), objectRect.x() + subfocus.x(), |
| 1478 objectRect.x() + subfocus.maxX(), objectRect.x(), | 1478 objectRect.x() + subfocus.maxX(), objectRect.x(), objectRect.maxX(), 0, |
| 1479 objectRect.maxX(), 0, scrollVisibleRect.width()); | 1479 scrollVisibleRect.width()); |
| 1480 int desiredY = | 1480 int desiredY = computeBestScrollOffset( |
| 1481 computeBestScrollOffset(scrollPosition.y(), objectRect.y() + subfocus.y(), | 1481 scrollOffset.height(), objectRect.y() + subfocus.y(), |
| 1482 objectRect.y() + subfocus.maxY(), objectRect.y(), | 1482 objectRect.y() + subfocus.maxY(), objectRect.y(), objectRect.maxY(), 0, |
| 1483 objectRect.maxY(), 0, scrollVisibleRect.height()); | 1483 scrollVisibleRect.height()); |
| 1484 | 1484 |
| 1485 scrollParent->setScrollOffset(IntPoint(desiredX, desiredY)); | 1485 scrollParent->setScrollOffset(IntPoint(desiredX, desiredY)); |
| 1486 | 1486 |
| 1487 // Convert the subfocus into the coordinates of the scroll parent. | 1487 // Convert the subfocus into the coordinates of the scroll parent. |
| 1488 IntRect newSubfocus = subfocus; | 1488 IntRect newSubfocus = subfocus; |
| 1489 IntRect newElementRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); | 1489 IntRect newElementRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
| 1490 IntRect scrollParentRect = | 1490 IntRect scrollParentRect = |
| 1491 pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()); | 1491 pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()); |
| 1492 newSubfocus.move(newElementRect.x(), newElementRect.y()); | 1492 newSubfocus.move(newElementRect.x(), newElementRect.y()); |
| 1493 newSubfocus.move(-scrollParentRect.x(), -scrollParentRect.y()); | 1493 newSubfocus.move(-scrollParentRect.x(), -scrollParentRect.y()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1518 const AXObject* outer = objects[i]; | 1518 const AXObject* outer = objects[i]; |
| 1519 const AXObject* inner = objects[i + 1]; | 1519 const AXObject* inner = objects[i + 1]; |
| 1520 ScrollableArea* scrollableArea = outer->getScrollableAreaIfScrollable(); | 1520 ScrollableArea* scrollableArea = outer->getScrollableAreaIfScrollable(); |
| 1521 | 1521 |
| 1522 IntRect innerRect = | 1522 IntRect innerRect = |
| 1523 inner->isWebArea() | 1523 inner->isWebArea() |
| 1524 ? pixelSnappedIntRect( | 1524 ? pixelSnappedIntRect( |
| 1525 inner->parentObject()->getBoundsInFrameCoordinates()) | 1525 inner->parentObject()->getBoundsInFrameCoordinates()) |
| 1526 : pixelSnappedIntRect(inner->getBoundsInFrameCoordinates()); | 1526 : pixelSnappedIntRect(inner->getBoundsInFrameCoordinates()); |
| 1527 IntRect objectRect = innerRect; | 1527 IntRect objectRect = innerRect; |
| 1528 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1528 IntSize scrollOffset = scrollableArea->scrollOffsetInt(); |
| 1529 | 1529 |
| 1530 // Convert the object rect into local coordinates. | 1530 // Convert the object rect into local coordinates. |
| 1531 objectRect.move(offsetX, offsetY); | 1531 objectRect.move(offsetX, offsetY); |
| 1532 if (!outer->isWebArea()) | 1532 if (!outer->isWebArea()) |
| 1533 objectRect.move(scrollPosition.x(), scrollPosition.y()); | 1533 objectRect.move(scrollOffset.width(), scrollOffset.height()); |
| 1534 | 1534 |
| 1535 int desiredX = computeBestScrollOffset(0, objectRect.x(), objectRect.maxX(), | 1535 int desiredX = computeBestScrollOffset(0, objectRect.x(), objectRect.maxX(), |
| 1536 objectRect.x(), objectRect.maxX(), | 1536 objectRect.x(), objectRect.maxX(), |
| 1537 point.x(), point.x()); | 1537 point.x(), point.x()); |
| 1538 int desiredY = computeBestScrollOffset(0, objectRect.y(), objectRect.maxY(), | 1538 int desiredY = computeBestScrollOffset(0, objectRect.y(), objectRect.maxY(), |
| 1539 objectRect.y(), objectRect.maxY(), | 1539 objectRect.y(), objectRect.maxY(), |
| 1540 point.y(), point.y()); | 1540 point.y(), point.y()); |
| 1541 outer->setScrollOffset(IntPoint(desiredX, desiredY)); | 1541 outer->setScrollOffset(IntPoint(desiredX, desiredY)); |
| 1542 | 1542 |
| 1543 if (outer->isWebArea() && !inner->isWebArea()) { | 1543 if (outer->isWebArea() && !inner->isWebArea()) { |
| 1544 // If outer object we just scrolled is a web area (frame) but the inner ob
ject | 1544 // If outer object we just scrolled is a web area (frame) but the inner ob
ject |
| 1545 // is not, keep track of the coordinate transformation to apply to | 1545 // is not, keep track of the coordinate transformation to apply to |
| 1546 // future nested calculations. | 1546 // future nested calculations. |
| 1547 scrollPosition = scrollableArea->scrollPosition(); | 1547 scrollOffset = scrollableArea->scrollOffsetInt(); |
| 1548 offsetX -= (scrollPosition.x() + point.x()); | 1548 offsetX -= (scrollOffset.width() + point.x()); |
| 1549 offsetY -= (scrollPosition.y() + point.y()); | 1549 offsetY -= (scrollOffset.height() + point.y()); |
| 1550 point.move(scrollPosition.x() - innerRect.x(), | 1550 point.move(scrollOffset.width() - innerRect.width(), |
| 1551 scrollPosition.y() - innerRect.y()); | 1551 scrollOffset.height() - innerRect.y()); |
| 1552 } else if (inner->isWebArea()) { | 1552 } else if (inner->isWebArea()) { |
| 1553 // Otherwise, if the inner object is a web area, reset the coordinate tran
sformation. | 1553 // Otherwise, if the inner object is a web area, reset the coordinate tran
sformation. |
| 1554 offsetX = 0; | 1554 offsetX = 0; |
| 1555 offsetY = 0; | 1555 offsetY = 0; |
| 1556 } | 1556 } |
| 1557 } | 1557 } |
| 1558 } | 1558 } |
| 1559 | 1559 |
| 1560 void AXObject::notifyIfIgnoredValueChanged() { | 1560 void AXObject::notifyIfIgnoredValueChanged() { |
| 1561 bool isIgnored = accessibilityIsIgnored(); | 1561 bool isIgnored = accessibilityIsIgnored(); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 } | 1724 } |
| 1725 | 1725 |
| 1726 DEFINE_TRACE(AXObject) { | 1726 DEFINE_TRACE(AXObject) { |
| 1727 visitor->trace(m_children); | 1727 visitor->trace(m_children); |
| 1728 visitor->trace(m_parent); | 1728 visitor->trace(m_parent); |
| 1729 visitor->trace(m_cachedLiveRegionRoot); | 1729 visitor->trace(m_cachedLiveRegionRoot); |
| 1730 visitor->trace(m_axObjectCache); | 1730 visitor->trace(m_axObjectCache); |
| 1731 } | 1731 } |
| 1732 | 1732 |
| 1733 } // namespace blink | 1733 } // namespace blink |
| OLD | NEW |