OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights |
3 * reserved. | 3 * reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
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 2534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2545 computeInlineBoxPosition(position.position(), position.affinity()); | 2545 computeInlineBoxPosition(position.position(), position.affinity()); |
2546 | 2546 |
2547 if (boxPosition.inlineBox) | 2547 if (boxPosition.inlineBox) |
2548 layoutObject = LineLayoutAPIShim::layoutObjectFrom( | 2548 layoutObject = LineLayoutAPIShim::layoutObjectFrom( |
2549 boxPosition.inlineBox->getLineLayoutItem()); | 2549 boxPosition.inlineBox->getLineLayoutItem()); |
2550 | 2550 |
2551 return layoutObject->localCaretRect(boxPosition.inlineBox, | 2551 return layoutObject->localCaretRect(boxPosition.inlineBox, |
2552 boxPosition.offsetInBox); | 2552 boxPosition.offsetInBox); |
2553 } | 2553 } |
2554 | 2554 |
| 2555 // This function was added because the selection rect is different from the |
| 2556 // caret rect. |
| 2557 template <typename Strategy> |
| 2558 LayoutRect localSelectionRectOfPositionTemplate( |
| 2559 const PositionWithAffinityTemplate<Strategy>& position, |
| 2560 LayoutObject*& layoutObject) { |
| 2561 LayoutRect rect = localCaretRectOfPositionTemplate(position, layoutObject); |
| 2562 |
| 2563 if (rect.isEmpty()) |
| 2564 return rect; |
| 2565 |
| 2566 InlineBoxPosition boxPosition = |
| 2567 computeInlineBoxPosition(position.position(), position.affinity()); |
| 2568 |
| 2569 InlineTextBox* box = toInlineTextBox(boxPosition.inlineBox); |
| 2570 if (layoutObject->style()->isHorizontalWritingMode()) { |
| 2571 rect.setY(box->root().selectionTop()); |
| 2572 rect.setHeight(box->root().selectionHeight()); |
| 2573 } else { |
| 2574 rect.setX(box->root().selectionTop()); |
| 2575 rect.setWidth(box->root().selectionHeight()); |
| 2576 } |
| 2577 |
| 2578 return rect; |
| 2579 } |
| 2580 |
2555 LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, | 2581 LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, |
2556 LayoutObject*& layoutObject) { | 2582 LayoutObject*& layoutObject) { |
2557 return localCaretRectOfPositionTemplate<EditingStrategy>(position, | 2583 return localCaretRectOfPositionTemplate<EditingStrategy>(position, |
2558 layoutObject); | 2584 layoutObject); |
2559 } | 2585 } |
2560 | 2586 |
| 2587 LayoutRect localSelectionRectOfPosition(const PositionWithAffinity& position, |
| 2588 LayoutObject*& layoutObject) { |
| 2589 return localSelectionRectOfPositionTemplate<EditingStrategy>(position, |
| 2590 layoutObject); |
| 2591 } |
| 2592 |
2561 LayoutRect localCaretRectOfPosition( | 2593 LayoutRect localCaretRectOfPosition( |
2562 const PositionInFlatTreeWithAffinity& position, | 2594 const PositionInFlatTreeWithAffinity& position, |
2563 LayoutObject*& layoutObject) { | 2595 LayoutObject*& layoutObject) { |
2564 return localCaretRectOfPositionTemplate<EditingInFlatTreeStrategy>( | 2596 return localCaretRectOfPositionTemplate<EditingInFlatTreeStrategy>( |
2565 position, layoutObject); | 2597 position, layoutObject); |
2566 } | 2598 } |
2567 | 2599 |
2568 static LayoutUnit boundingBoxLogicalHeight(LayoutObject* o, | 2600 static LayoutUnit boundingBoxLogicalHeight(LayoutObject* o, |
2569 const LayoutRect& rect) { | 2601 const LayoutRect& rect) { |
2570 return o->style()->isHorizontalWritingMode() ? rect.height() : rect.width(); | 2602 return o->style()->isHorizontalWritingMode() ? rect.height() : rect.width(); |
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3224 return IntRect(); | 3256 return IntRect(); |
3225 | 3257 |
3226 return layoutObject->localToAbsoluteQuad(FloatRect(localRect)) | 3258 return layoutObject->localToAbsoluteQuad(FloatRect(localRect)) |
3227 .enclosingBoundingBox(); | 3259 .enclosingBoundingBox(); |
3228 } | 3260 } |
3229 | 3261 |
3230 IntRect absoluteCaretBoundsOf(const VisiblePosition& visiblePosition) { | 3262 IntRect absoluteCaretBoundsOf(const VisiblePosition& visiblePosition) { |
3231 return absoluteCaretBoundsOfAlgorithm<EditingStrategy>(visiblePosition); | 3263 return absoluteCaretBoundsOfAlgorithm<EditingStrategy>(visiblePosition); |
3232 } | 3264 } |
3233 | 3265 |
| 3266 template <typename Strategy> |
| 3267 static IntRect absoluteSelectionBoundsOfAlgorithm( |
| 3268 const VisiblePositionTemplate<Strategy>& visiblePosition) { |
| 3269 DCHECK(visiblePosition.isValid()) << visiblePosition; |
| 3270 LayoutObject* layoutObject; |
| 3271 LayoutRect localRect = localSelectionRectOfPosition( |
| 3272 visiblePosition.toPositionWithAffinity(), layoutObject); |
| 3273 if (localRect.isEmpty() || !layoutObject) |
| 3274 return IntRect(); |
| 3275 |
| 3276 return layoutObject->localToAbsoluteQuad(FloatRect(localRect)) |
| 3277 .enclosingBoundingBox(); |
| 3278 } |
| 3279 |
| 3280 IntRect absoluteSelectionBoundsOf(const VisiblePosition& visiblePosition) { |
| 3281 return absoluteSelectionBoundsOfAlgorithm<EditingStrategy>(visiblePosition); |
| 3282 } |
| 3283 |
3234 IntRect absoluteCaretBoundsOf( | 3284 IntRect absoluteCaretBoundsOf( |
3235 const VisiblePositionInFlatTree& visiblePosition) { | 3285 const VisiblePositionInFlatTree& visiblePosition) { |
3236 return absoluteCaretBoundsOfAlgorithm<EditingInFlatTreeStrategy>( | 3286 return absoluteCaretBoundsOfAlgorithm<EditingInFlatTreeStrategy>( |
3237 visiblePosition); | 3287 visiblePosition); |
3238 } | 3288 } |
3239 | 3289 |
3240 template <typename Strategy> | 3290 template <typename Strategy> |
3241 static VisiblePositionTemplate<Strategy> skipToEndOfEditingBoundary( | 3291 static VisiblePositionTemplate<Strategy> skipToEndOfEditingBoundary( |
3242 const VisiblePositionTemplate<Strategy>& pos, | 3292 const VisiblePositionTemplate<Strategy>& pos, |
3243 const PositionTemplate<Strategy>& anchor) { | 3293 const PositionTemplate<Strategy>& anchor) { |
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3848 | 3898 |
3849 VisiblePositionInFlatTree previousPositionOf( | 3899 VisiblePositionInFlatTree previousPositionOf( |
3850 const VisiblePositionInFlatTree& visiblePosition, | 3900 const VisiblePositionInFlatTree& visiblePosition, |
3851 EditingBoundaryCrossingRule rule) { | 3901 EditingBoundaryCrossingRule rule) { |
3852 DCHECK(visiblePosition.isValid()) << visiblePosition; | 3902 DCHECK(visiblePosition.isValid()) << visiblePosition; |
3853 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>( | 3903 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>( |
3854 visiblePosition.deepEquivalent(), rule); | 3904 visiblePosition.deepEquivalent(), rule); |
3855 } | 3905 } |
3856 | 3906 |
3857 } // namespace blink | 3907 } // namespace blink |
OLD | NEW |