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 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 | 1206 |
1207 bool AXObject::isScrollableContainer() const { | 1207 bool AXObject::isScrollableContainer() const { |
1208 return !!getScrollableAreaIfScrollable(); | 1208 return !!getScrollableAreaIfScrollable(); |
1209 } | 1209 } |
1210 | 1210 |
1211 IntPoint AXObject::scrollOffset() const { | 1211 IntPoint AXObject::scrollOffset() const { |
1212 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1212 ScrollableArea* area = getScrollableAreaIfScrollable(); |
1213 if (!area) | 1213 if (!area) |
1214 return IntPoint(); | 1214 return IntPoint(); |
1215 | 1215 |
1216 return IntPoint(area->scrollPosition().x(), area->scrollPosition().y()); | 1216 return IntPoint(area->scrollOffsetInt().width(), |
| 1217 area->scrollOffsetInt().height()); |
1217 } | 1218 } |
1218 | 1219 |
1219 IntPoint AXObject::minimumScrollOffset() const { | 1220 IntPoint AXObject::minimumScrollOffset() const { |
1220 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1221 ScrollableArea* area = getScrollableAreaIfScrollable(); |
1221 if (!area) | 1222 if (!area) |
1222 return IntPoint(); | 1223 return IntPoint(); |
1223 | 1224 |
1224 return IntPoint(area->minimumScrollPosition().x(), | 1225 return IntPoint(area->minimumScrollOffsetInt().width(), |
1225 area->minimumScrollPosition().y()); | 1226 area->minimumScrollOffsetInt().height()); |
1226 } | 1227 } |
1227 | 1228 |
1228 IntPoint AXObject::maximumScrollOffset() const { | 1229 IntPoint AXObject::maximumScrollOffset() const { |
1229 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1230 ScrollableArea* area = getScrollableAreaIfScrollable(); |
1230 if (!area) | 1231 if (!area) |
1231 return IntPoint(); | 1232 return IntPoint(); |
1232 | 1233 |
1233 return IntPoint(area->maximumScrollPosition().x(), | 1234 return IntPoint(area->maximumScrollOffsetInt().width(), |
1234 area->maximumScrollPosition().y()); | 1235 area->maximumScrollOffsetInt().height()); |
1235 } | 1236 } |
1236 | 1237 |
1237 void AXObject::setScrollOffset(const IntPoint& offset) const { | 1238 void AXObject::setScrollOffset(const IntPoint& offset) const { |
1238 ScrollableArea* area = getScrollableAreaIfScrollable(); | 1239 ScrollableArea* area = getScrollableAreaIfScrollable(); |
1239 if (!area) | 1240 if (!area) |
1240 return; | 1241 return; |
1241 | 1242 |
1242 // TODO(bokan): This should potentially be a UserScroll. | 1243 // TODO(bokan): This should potentially be a UserScroll. |
1243 area->setScrollPosition(DoublePoint(offset.x(), offset.y()), | 1244 area->setScrollOffset(ScrollOffset(offset.x(), offset.y()), |
1244 ProgrammaticScroll); | 1245 ProgrammaticScroll); |
1245 } | 1246 } |
1246 | 1247 |
1247 void AXObject::getRelativeBounds(AXObject** outContainer, | 1248 void AXObject::getRelativeBounds(AXObject** outContainer, |
1248 FloatRect& outBoundsInContainer, | 1249 FloatRect& outBoundsInContainer, |
1249 SkMatrix44& outContainerTransform) const { | 1250 SkMatrix44& outContainerTransform) const { |
1250 *outContainer = nullptr; | 1251 *outContainer = nullptr; |
1251 outBoundsInContainer = FloatRect(); | 1252 outBoundsInContainer = FloatRect(); |
1252 outContainerTransform.setIdentity(); | 1253 outContainerTransform.setIdentity(); |
1253 | 1254 |
1254 // First check if it has explicit bounds, for example if this element is tied | 1255 // First check if it has explicit bounds, for example if this element is tied |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1294 | 1295 |
1295 if (!container) | 1296 if (!container) |
1296 return; | 1297 return; |
1297 *outContainer = container; | 1298 *outContainer = container; |
1298 outBoundsInContainer = layoutObject->localBoundingBoxRectForAccessibility(); | 1299 outBoundsInContainer = layoutObject->localBoundingBoxRectForAccessibility(); |
1299 | 1300 |
1300 // If the container has a scroll offset, subtract that out because we want our | 1301 // If the container has a scroll offset, subtract that out because we want our |
1301 // bounds to be relative to the *unscrolled* position of the container object. | 1302 // bounds to be relative to the *unscrolled* position of the container object. |
1302 ScrollableArea* scrollableArea = container->getScrollableAreaIfScrollable(); | 1303 ScrollableArea* scrollableArea = container->getScrollableAreaIfScrollable(); |
1303 if (scrollableArea && !container->isWebArea()) { | 1304 if (scrollableArea && !container->isWebArea()) { |
1304 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1305 ScrollOffset scrollOffset = scrollableArea->scrollOffset(); |
1305 outBoundsInContainer.move( | 1306 outBoundsInContainer.move(scrollOffset); |
1306 FloatSize(scrollPosition.x(), scrollPosition.y())); | |
1307 } | 1307 } |
1308 | 1308 |
1309 // Compute the transform between the container's coordinate space and this | 1309 // Compute the transform between the container's coordinate space and this |
1310 // object. If the transform is just a simple translation, apply that to the | 1310 // object. If the transform is just a simple translation, apply that to the |
1311 // bounding box, but if it's a non-trivial transformation like a rotation, | 1311 // bounding box, but if it's a non-trivial transformation like a rotation, |
1312 // scaling, etc. then return the full matrix instead. | 1312 // scaling, etc. then return the full matrix instead. |
1313 TransformationMatrix transform = layoutObject->localToAncestorTransform( | 1313 TransformationMatrix transform = layoutObject->localToAncestorTransform( |
1314 toLayoutBoxModelObject(containerLayoutObject)); | 1314 toLayoutBoxModelObject(containerLayoutObject)); |
1315 if (transform.isIdentityOr2DTranslation()) { | 1315 if (transform.isIdentityOr2DTranslation()) { |
1316 outBoundsInContainer.move(transform.to2DTranslation()); | 1316 outBoundsInContainer.move(transform.to2DTranslation()); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1462 while (scrollParent) { | 1462 while (scrollParent) { |
1463 scrollableArea = scrollParent->getScrollableAreaIfScrollable(); | 1463 scrollableArea = scrollParent->getScrollableAreaIfScrollable(); |
1464 if (scrollableArea) | 1464 if (scrollableArea) |
1465 break; | 1465 break; |
1466 scrollParent = scrollParent->parentObject(); | 1466 scrollParent = scrollParent->parentObject(); |
1467 } | 1467 } |
1468 if (!scrollParent || !scrollableArea) | 1468 if (!scrollParent || !scrollableArea) |
1469 return; | 1469 return; |
1470 | 1470 |
1471 IntRect objectRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); | 1471 IntRect objectRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
1472 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1472 IntSize scrollOffset = scrollableArea->scrollOffsetInt(); |
1473 IntRect scrollVisibleRect = scrollableArea->visibleContentRect(); | 1473 IntRect scrollVisibleRect = scrollableArea->visibleContentRect(); |
1474 | 1474 |
1475 // Convert the object rect into local coordinates. | 1475 // Convert the object rect into local coordinates. |
1476 if (!scrollParent->isWebArea()) { | 1476 if (!scrollParent->isWebArea()) { |
1477 objectRect.moveBy(scrollPosition); | 1477 objectRect.moveBy(IntPoint(scrollOffset)); |
1478 objectRect.moveBy( | 1478 objectRect.moveBy( |
1479 -pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()) | 1479 -pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()) |
1480 .location()); | 1480 .location()); |
1481 } | 1481 } |
1482 | 1482 |
1483 int desiredX = | 1483 int desiredX = computeBestScrollOffset( |
1484 computeBestScrollOffset(scrollPosition.x(), objectRect.x() + subfocus.x(), | 1484 scrollOffset.width(), objectRect.x() + subfocus.x(), |
1485 objectRect.x() + subfocus.maxX(), objectRect.x(), | 1485 objectRect.x() + subfocus.maxX(), objectRect.x(), objectRect.maxX(), 0, |
1486 objectRect.maxX(), 0, scrollVisibleRect.width()); | 1486 scrollVisibleRect.width()); |
1487 int desiredY = | 1487 int desiredY = computeBestScrollOffset( |
1488 computeBestScrollOffset(scrollPosition.y(), objectRect.y() + subfocus.y(), | 1488 scrollOffset.height(), objectRect.y() + subfocus.y(), |
1489 objectRect.y() + subfocus.maxY(), objectRect.y(), | 1489 objectRect.y() + subfocus.maxY(), objectRect.y(), objectRect.maxY(), 0, |
1490 objectRect.maxY(), 0, scrollVisibleRect.height()); | 1490 scrollVisibleRect.height()); |
1491 | 1491 |
1492 scrollParent->setScrollOffset(IntPoint(desiredX, desiredY)); | 1492 scrollParent->setScrollOffset(IntPoint(desiredX, desiredY)); |
1493 | 1493 |
1494 // Convert the subfocus into the coordinates of the scroll parent. | 1494 // Convert the subfocus into the coordinates of the scroll parent. |
1495 IntRect newSubfocus = subfocus; | 1495 IntRect newSubfocus = subfocus; |
1496 IntRect newElementRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); | 1496 IntRect newElementRect = pixelSnappedIntRect(getBoundsInFrameCoordinates()); |
1497 IntRect scrollParentRect = | 1497 IntRect scrollParentRect = |
1498 pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()); | 1498 pixelSnappedIntRect(scrollParent->getBoundsInFrameCoordinates()); |
1499 newSubfocus.move(newElementRect.x(), newElementRect.y()); | 1499 newSubfocus.move(newElementRect.x(), newElementRect.y()); |
1500 newSubfocus.move(-scrollParentRect.x(), -scrollParentRect.y()); | 1500 newSubfocus.move(-scrollParentRect.x(), -scrollParentRect.y()); |
(...skipping 24 matching lines...) Expand all Loading... |
1525 const AXObject* outer = objects[i]; | 1525 const AXObject* outer = objects[i]; |
1526 const AXObject* inner = objects[i + 1]; | 1526 const AXObject* inner = objects[i + 1]; |
1527 ScrollableArea* scrollableArea = outer->getScrollableAreaIfScrollable(); | 1527 ScrollableArea* scrollableArea = outer->getScrollableAreaIfScrollable(); |
1528 | 1528 |
1529 IntRect innerRect = | 1529 IntRect innerRect = |
1530 inner->isWebArea() | 1530 inner->isWebArea() |
1531 ? pixelSnappedIntRect( | 1531 ? pixelSnappedIntRect( |
1532 inner->parentObject()->getBoundsInFrameCoordinates()) | 1532 inner->parentObject()->getBoundsInFrameCoordinates()) |
1533 : pixelSnappedIntRect(inner->getBoundsInFrameCoordinates()); | 1533 : pixelSnappedIntRect(inner->getBoundsInFrameCoordinates()); |
1534 IntRect objectRect = innerRect; | 1534 IntRect objectRect = innerRect; |
1535 IntPoint scrollPosition = scrollableArea->scrollPosition(); | 1535 IntSize scrollOffset = scrollableArea->scrollOffsetInt(); |
1536 | 1536 |
1537 // Convert the object rect into local coordinates. | 1537 // Convert the object rect into local coordinates. |
1538 objectRect.move(offsetX, offsetY); | 1538 objectRect.move(offsetX, offsetY); |
1539 if (!outer->isWebArea()) | 1539 if (!outer->isWebArea()) |
1540 objectRect.move(scrollPosition.x(), scrollPosition.y()); | 1540 objectRect.move(scrollOffset.width(), scrollOffset.height()); |
1541 | 1541 |
1542 int desiredX = computeBestScrollOffset(0, objectRect.x(), objectRect.maxX(), | 1542 int desiredX = computeBestScrollOffset(0, objectRect.x(), objectRect.maxX(), |
1543 objectRect.x(), objectRect.maxX(), | 1543 objectRect.x(), objectRect.maxX(), |
1544 point.x(), point.x()); | 1544 point.x(), point.x()); |
1545 int desiredY = computeBestScrollOffset(0, objectRect.y(), objectRect.maxY(), | 1545 int desiredY = computeBestScrollOffset(0, objectRect.y(), objectRect.maxY(), |
1546 objectRect.y(), objectRect.maxY(), | 1546 objectRect.y(), objectRect.maxY(), |
1547 point.y(), point.y()); | 1547 point.y(), point.y()); |
1548 outer->setScrollOffset(IntPoint(desiredX, desiredY)); | 1548 outer->setScrollOffset(IntPoint(desiredX, desiredY)); |
1549 | 1549 |
1550 if (outer->isWebArea() && !inner->isWebArea()) { | 1550 if (outer->isWebArea() && !inner->isWebArea()) { |
1551 // If outer object we just scrolled is a web area (frame) but the inner | 1551 // If outer object we just scrolled is a web area (frame) but the inner |
1552 // object is not, keep track of the coordinate transformation to apply to | 1552 // object is not, keep track of the coordinate transformation to apply to |
1553 // future nested calculations. | 1553 // future nested calculations. |
1554 scrollPosition = scrollableArea->scrollPosition(); | 1554 scrollOffset = scrollableArea->scrollOffsetInt(); |
1555 offsetX -= (scrollPosition.x() + point.x()); | 1555 offsetX -= (scrollOffset.width() + point.x()); |
1556 offsetY -= (scrollPosition.y() + point.y()); | 1556 offsetY -= (scrollOffset.height() + point.y()); |
1557 point.move(scrollPosition.x() - innerRect.x(), | 1557 point.move(scrollOffset.width() - innerRect.width(), |
1558 scrollPosition.y() - innerRect.y()); | 1558 scrollOffset.height() - innerRect.y()); |
1559 } else if (inner->isWebArea()) { | 1559 } else if (inner->isWebArea()) { |
1560 // Otherwise, if the inner object is a web area, reset the coordinate | 1560 // Otherwise, if the inner object is a web area, reset the coordinate |
1561 // transformation. | 1561 // transformation. |
1562 offsetX = 0; | 1562 offsetX = 0; |
1563 offsetY = 0; | 1563 offsetY = 0; |
1564 } | 1564 } |
1565 } | 1565 } |
1566 } | 1566 } |
1567 | 1567 |
1568 void AXObject::notifyIfIgnoredValueChanged() { | 1568 void AXObject::notifyIfIgnoredValueChanged() { |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1733 } | 1733 } |
1734 | 1734 |
1735 DEFINE_TRACE(AXObject) { | 1735 DEFINE_TRACE(AXObject) { |
1736 visitor->trace(m_children); | 1736 visitor->trace(m_children); |
1737 visitor->trace(m_parent); | 1737 visitor->trace(m_parent); |
1738 visitor->trace(m_cachedLiveRegionRoot); | 1738 visitor->trace(m_cachedLiveRegionRoot); |
1739 visitor->trace(m_axObjectCache); | 1739 visitor->trace(m_axObjectCache); |
1740 } | 1740 } |
1741 | 1741 |
1742 } // namespace blink | 1742 } // namespace blink |
OLD | NEW |