Index: Source/core/frame/FrameView.cpp |
diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp |
index f8a71d3407c2fe0d83be7085c7609d809014f072..a01b92e6e1ffd7896102f6f82204649cd353a438 100644 |
--- a/Source/core/frame/FrameView.cpp |
+++ b/Source/core/frame/FrameView.cpp |
@@ -34,6 +34,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" |
@@ -66,6 +67,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" |
@@ -1507,6 +1509,34 @@ void FrameView::updateLayersAndCompositingAfterScrollIfNeeded() |
} |
} |
+bool FrameView::computeCompositedSelectionBounds(LocalFrame& frame, CompositedSelectionBound& start, CompositedSelectionBound& end) |
+{ |
+ 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()) |
@@ -1515,13 +1545,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 |