| Index: third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp | 
| diff --git a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp | 
| index 83a42eecc02a4f4c41dd621161a7c034ac7bae10..f8b67fe85f9319a2dd69e92ffd586552872fc2e3 100644 | 
| --- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp | 
| +++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp | 
| @@ -156,7 +156,7 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& | 
| // 1. Paint backgrounds behind text if needed. Examples of such backgrounds include selection | 
| // and composition highlights. | 
| if (paintInfo.phase != PaintPhaseSelection && paintInfo.phase != PaintPhaseTextClip && !isPrinting) { | 
| -        paintDocumentMarkers(context, boxOrigin, styleToUse, font, true); | 
| +        paintDocumentMarkers(paintInfo, boxOrigin, styleToUse, font, DocumentMarkerPaintPhase::Background); | 
|  | 
| if (haveSelection && !paintsCompositionMarkers(textBoxLayoutObject)) { | 
| if (combinedText) | 
| @@ -243,7 +243,7 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& | 
| } | 
|  | 
| if (paintInfo.phase == PaintPhaseForeground) | 
| -        paintDocumentMarkers(context, boxOrigin, styleToUse, font, false); | 
| +        paintDocumentMarkers(paintInfo, boxOrigin, styleToUse, font, DocumentMarkerPaintPhase::Foreground); | 
|  | 
| if (shouldRotate) | 
| context.concatCTM(TextPainter::rotation(boxRect, TextPainter::Counterclockwise)); | 
| @@ -298,7 +298,7 @@ void InlineTextBoxPainter::paintSingleCompositionBackgroundRun(GraphicsContext& | 
| context.drawHighlightForText(font, m_inlineTextBox.constructTextRun(style, font), localOrigin, selHeight, backgroundColor, sPos, ePos); | 
| } | 
|  | 
| -void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext& context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, bool background) | 
| +void InlineTextBoxPainter::paintDocumentMarkers(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, DocumentMarkerPaintPhase markerPaintPhase) | 
| { | 
| if (!m_inlineTextBox.lineLayoutItem().node()) | 
| return; | 
| @@ -315,13 +315,10 @@ void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext& context, const | 
| switch (marker->type()) { | 
| case DocumentMarker::Grammar: | 
| case DocumentMarker::Spelling: | 
| -            if (background) | 
| +            if (markerPaintPhase == DocumentMarkerPaintPhase::Background) | 
| continue; | 
| break; | 
| case DocumentMarker::TextMatch: | 
| -            if (!background) | 
| -                continue; | 
| -            break; | 
| case DocumentMarker::Composition: | 
| break; | 
| default: | 
| @@ -341,21 +338,24 @@ void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext& context, const | 
| // marker intersects this run.  Paint it. | 
| switch (marker->type()) { | 
| case DocumentMarker::Spelling: | 
| -            m_inlineTextBox.paintDocumentMarker(context, boxOrigin, marker, style, font, false); | 
| +            m_inlineTextBox.paintDocumentMarker(paintInfo.context, boxOrigin, marker, style, font, false); | 
| break; | 
| case DocumentMarker::Grammar: | 
| -            m_inlineTextBox.paintDocumentMarker(context, boxOrigin, marker, style, font, true); | 
| +            m_inlineTextBox.paintDocumentMarker(paintInfo.context, boxOrigin, marker, style, font, true); | 
| break; | 
| case DocumentMarker::TextMatch: | 
| -            m_inlineTextBox.paintTextMatchMarker(context, boxOrigin, marker, style, font); | 
| +            if (markerPaintPhase == DocumentMarkerPaintPhase::Background) | 
| +                m_inlineTextBox.paintTextMatchMarkerBackground(paintInfo, boxOrigin, marker, style, font); | 
| +            else | 
| +                m_inlineTextBox.paintTextMatchMarkerForeground(paintInfo, boxOrigin, marker, style, font); | 
| break; | 
| case DocumentMarker::Composition: | 
| { | 
| CompositionUnderline underline(marker->startOffset(), marker->endOffset(), marker->underlineColor(), marker->thick(), marker->backgroundColor()); | 
| -                if (background) | 
| -                    paintSingleCompositionBackgroundRun(context, boxOrigin, style, font, underline.backgroundColor, underlinePaintStart(underline), underlinePaintEnd(underline)); | 
| +                if (markerPaintPhase == DocumentMarkerPaintPhase::Background) | 
| +                    paintSingleCompositionBackgroundRun(paintInfo.context, boxOrigin, style, font, underline.backgroundColor, underlinePaintStart(underline), underlinePaintEnd(underline)); | 
| else | 
| -                    paintCompositionUnderline(context, boxOrigin, underline); | 
| +                    paintCompositionUnderline(paintInfo.context, boxOrigin, underline); | 
| } | 
| break; | 
| default: | 
| @@ -830,8 +830,36 @@ void InlineTextBoxPainter::paintCompositionUnderline(GraphicsContext& context, c | 
| context.drawLineForText(FloatPoint(boxOrigin.x() + start, (boxOrigin.y() + m_inlineTextBox.logicalHeight() - lineThickness).toFloat()), width, m_inlineTextBox.lineLayoutItem().document().printing()); | 
| } | 
|  | 
| -void InlineTextBoxPainter::paintTextMatchMarker(GraphicsContext& context, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) | 
| +void InlineTextBoxPainter::paintTextMatchMarkerForeground(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) | 
| { | 
| +    if (!LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) | 
| +        return; | 
| + | 
| +    // TODO(ramya.v): Extract this into a helper function and share many copies of this code. | 
| +    int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsigned)0); | 
| +    int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineTextBox.len()); | 
| +    TextRun run = m_inlineTextBox.constructTextRun(style, font); | 
| + | 
| +    Color textColor = LayoutTheme::theme().platformTextSearchColor(marker->activeMatch()); | 
| +    if (style.visitedDependentColor(CSSPropertyColor) == textColor) | 
| +        return; | 
| +    TextPainter::Style textStyle; | 
| +    textStyle.currentColor = textStyle.fillColor = textStyle.strokeColor = textStyle.emphasisMarkColor = textColor; | 
| +    textStyle.strokeWidth = style.textStrokeWidth(); | 
| +    textStyle.shadow = 0; | 
| + | 
| +    LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_inlineTextBox.logicalHeight())); | 
| +    LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetrics().ascent()); | 
| +    TextPainter textPainter(paintInfo.context, font, run, textOrigin, boxRect, m_inlineTextBox.isHorizontal()); | 
| + | 
| +    textPainter.paint(sPos, ePos, m_inlineTextBox.len(), textStyle, 0); | 
| +} | 
| + | 
| +void InlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) | 
| +{ | 
| +    if (!LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) | 
| +        return; | 
| + | 
| // Use same y positioning and height as for selection, so that when the selection and this highlight are on | 
| // the same word there are no pieces sticking out. | 
| int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); | 
| @@ -841,31 +869,11 @@ void InlineTextBoxPainter::paintTextMatchMarker(GraphicsContext& context, const | 
| int ePos = std::min(marker->endOffset() - m_inlineTextBox.start(), m_inlineTextBox.len()); | 
| TextRun run = m_inlineTextBox.constructTextRun(style, font); | 
|  | 
| -    // Optionally highlight the text | 
| -    if (LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) { | 
| -        Color color = marker->activeMatch() ? | 
| -            LayoutTheme::theme().platformActiveTextSearchHighlightColor() : | 
| -            LayoutTheme::theme().platformInactiveTextSearchHighlightColor(); | 
| -        GraphicsContextStateSaver stateSaver(context); | 
| -        context.clip(FloatRect(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat(), m_inlineTextBox.logicalWidth().toFloat(), selHeight)); | 
| -        context.drawHighlightForText(font, run, FloatPoint(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat()), selHeight, color, sPos, ePos); | 
| - | 
| -        // Also Highlight the text with color:transparent | 
| -        if (style.visitedDependentColor(CSSPropertyColor) == Color::transparent) { | 
| -            int length = m_inlineTextBox.len(); | 
| -            TextPainter::Style textStyle; | 
| -            // When we use the text as a clip, we only care about the alpha, thus we make all the colors black. | 
| -            textStyle.currentColor = textStyle.fillColor = textStyle.strokeColor = textStyle.emphasisMarkColor = Color::black; | 
| -            textStyle.strokeWidth = style.textStrokeWidth(); | 
| -            textStyle.shadow = 0; | 
| - | 
| -            LayoutRect boxRect(boxOrigin, LayoutSize(m_inlineTextBox.logicalWidth(), m_inlineTextBox.logicalHeight())); | 
| -            LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetrics().ascent()); | 
| -            TextPainter textPainter(context, font, run, textOrigin, boxRect, m_inlineTextBox.isHorizontal()); | 
| - | 
| -            textPainter.paint(sPos, ePos, length, textStyle, 0); | 
| -        } | 
| -    } | 
| +    Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker->activeMatch()); | 
| +    GraphicsContext& context = paintInfo.context; | 
| +    GraphicsContextStateSaver stateSaver(context); | 
| +    context.clip(FloatRect(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat(), m_inlineTextBox.logicalWidth().toFloat(), selHeight)); | 
| +    context.drawHighlightForText(font, run, FloatPoint(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat()), selHeight, color, sPos, ePos); | 
| } | 
|  | 
|  | 
|  |