Chromium Code Reviews| Index: Source/core/frame/FrameView.cpp |
| diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp |
| index ecd52bd8539f5d48b1a7513c8e0f6691a58ffd0d..f752d59dda0f68d5444fdcf3e145b13a95b63d9b 100644 |
| --- a/Source/core/frame/FrameView.cpp |
| +++ b/Source/core/frame/FrameView.cpp |
| @@ -33,6 +33,7 @@ |
| #include "core/css/resolver/StyleResolver.h" |
| #include "core/dom/DocumentMarkerController.h" |
| #include "core/editing/FrameSelection.h" |
| +#include "core/editing/RenderedPosition.h" |
| #include "core/events/OverflowEvent.h" |
| #include "core/fetch/ResourceFetcher.h" |
| #include "core/fetch/ResourceLoadPriorityOptimizer.h" |
| @@ -65,6 +66,7 @@ |
| #include "core/rendering/RenderWidget.h" |
| #include "core/rendering/TextAutosizer.h" |
| #include "core/rendering/compositing/CompositedLayerMapping.h" |
| +#include "core/rendering/compositing/CompositedSelectionBound.h" |
| #include "core/rendering/compositing/RenderLayerCompositor.h" |
| #include "core/rendering/style/RenderStyle.h" |
| #include "core/rendering/svg/RenderSVGRoot.h" |
| @@ -1570,6 +1572,34 @@ void FrameView::updateFixedElementPaintInvalidationRectsAfterScroll() |
| } |
| } |
| +static bool computeCompositedSelectionBounds(LocalFrame& frame, CompositedSelectionBound& start, CompositedSelectionBound& end) |
|
chrishtr
2014/09/05 22:14:56
Make this a static member method of FrameView.
trchen
2014/09/06 00:06:26
Acknowledged.
|
| +{ |
| + const VisibleSelection &selection = frame.selection().selection(); |
| + if (!selection.isCaretOrRange()) |
| + return false; |
| + |
| + VisiblePosition visibleStart(selection.visibleStart()); |
| + VisiblePosition visibleEnd(selection.visibleEnd()); |
| + |
| + RenderedPosition renderedStart(visibleStart); |
| + RenderedPosition renderedEnd(visibleEnd); |
| + FloatPoint edgeTop, edgeBottom; |
| + |
| + renderedStart.layerPoints(start.layer, start.edgeTopInLayer, start.edgeBottomInLayer); |
| + renderedEnd.layerPoints(end.layer, end.edgeTopInLayer, end.edgeBottomInLayer); |
| + |
| + if (selection.isCaret()) { |
| + start.type = end.type = CompositedSelectionBound::Caret; |
| + return true; |
| + } |
| + |
| + TextDirection startDir = visibleStart.deepEquivalent().primaryDirection(); |
| + TextDirection endDir = visibleEnd.deepEquivalent().primaryDirection(); |
| + start.type = startDir == RTL ? CompositedSelectionBound::SelectionRight : CompositedSelectionBound::SelectionLeft; |
| + end.type = endDir == RTL ? CompositedSelectionBound::SelectionLeft : CompositedSelectionBound::SelectionRight; |
| + return true; |
| +} |
| + |
| void FrameView::updateCompositedSelectionBoundsIfNeeded() |
| { |
| if (!RuntimeEnabledFeatures::compositedSelectionUpdatesEnabled()) |
| @@ -1578,13 +1608,14 @@ void FrameView::updateCompositedSelectionBoundsIfNeeded() |
| Page* page = frame().page(); |
| ASSERT(page); |
| + CompositedSelectionBound start, end; |
| LocalFrame* frame = toLocalFrame(page->focusController().focusedOrMainFrame()); |
| - if (!frame || !frame->selection().isCaretOrRange()) { |
| + if (!frame || !computeCompositedSelectionBounds(*frame, start, end)) { |
| page->chrome().client().clearCompositedSelectionBounds(); |
| return; |
| } |
| - // TODO(jdduke): Compute and route selection bounds through ChromeClient. |
| + page->chrome().client().updateCompositedSelectionBounds(start, end); |
| } |
| bool FrameView::isRubberBandInProgress() const |