Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(868)

Unified Diff: Source/core/paint/InlineTextBoxPainter.cpp

Issue 1325563002: Avoid style clobbering in setCompositionFromExistingText. (2nd land) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Delete CompositionUnderlinesRangeFilter (it's now dead code) Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/paint/InlineTextBoxPainter.cpp
diff --git a/Source/core/paint/InlineTextBoxPainter.cpp b/Source/core/paint/InlineTextBoxPainter.cpp
index eccefdcefdec29dc46ad70ed2bf67e374c7e8197..f9409adbad1a550f6ceac0cdfc9b4d81b485357c 100644
--- a/Source/core/paint/InlineTextBoxPainter.cpp
+++ b/Source/core/paint/InlineTextBoxPainter.cpp
@@ -6,9 +6,7 @@
#include "core/paint/InlineTextBoxPainter.h"
#include "core/editing/CompositionUnderline.h"
-#include "core/editing/CompositionUnderlineRangeFilter.h"
#include "core/editing/Editor.h"
-#include "core/editing/InputMethodController.h"
#include "core/editing/markers/DocumentMarkerController.h"
#include "core/editing/markers/RenderedDocumentMarker.h"
#include "core/frame/LocalFrame.h"
@@ -48,6 +46,11 @@ static bool paintsMarkerHighlights(const LayoutObject& layoutObject)
return layoutObject.node() && layoutObject.document().markers().hasMarkers(layoutObject.node());
}
+static bool paintsCompositionMarkers(const LayoutObject& layoutObject)
+{
+ return layoutObject.node() && layoutObject.document().markers().markersFor(layoutObject.node(), DocumentMarker::Composition).size() > 0;
+}
+
void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
if (m_inlineTextBox.isLineBreak() || !paintInfo.shouldPaintWithinRoot(&m_inlineTextBox.layoutObject()) || m_inlineTextBox.layoutObject().style()->visibility() != VISIBLE
@@ -78,10 +81,6 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
return;
}
- // Determine whether or not we have composition underlines to draw.
- bool containsComposition = m_inlineTextBox.layoutObject().node() && m_inlineTextBox.layoutObject().frame()->inputMethodController().compositionNode() == m_inlineTextBox.layoutObject().node();
- bool useCustomUnderlines = containsComposition && m_inlineTextBox.layoutObject().frame()->inputMethodController().compositionUsesCustomUnderlines();
-
// The text clip phase already has a DrawingRecorder. Text clips are initiated only in BoxPainter::paintLayerExtended, which is already
// within a DrawingRecorder.
Optional<DrawingRecorder> drawingRecorder;
@@ -90,7 +89,7 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
return;
LayoutRect paintRect(logicalVisualOverflow);
m_inlineTextBox.logicalRectToPhysicalRect(paintRect);
- if (paintInfo.phase != PaintPhaseSelection && (haveSelection || containsComposition || paintsMarkerHighlights(m_inlineTextBox.layoutObject())))
+ if (paintInfo.phase != PaintPhaseSelection && (haveSelection || paintsMarkerHighlights(m_inlineTextBox.layoutObject())))
paintRect.unite(m_inlineTextBox.localSelectionRect(m_inlineTextBox.start(), m_inlineTextBox.start() + m_inlineTextBox.len()));
paintRect.moveBy(adjustedPaintOffset);
drawingRecorder.emplace(*paintInfo.context, m_inlineTextBox, DisplayItem::paintPhaseToDrawingType(paintInfo.phase), FloatRect(paintRect));
@@ -152,13 +151,9 @@ 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) {
- if (containsComposition) {
- paintCompositionBackgrounds(context, boxOrigin, styleToUse, font, useCustomUnderlines);
- }
-
paintDocumentMarkers(context, boxOrigin, styleToUse, font, true);
- if (haveSelection && !useCustomUnderlines) {
+ if (haveSelection && !paintsCompositionMarkers(m_inlineTextBox.layoutObject())) {
if (combinedText)
paintSelection<InlineTextBoxPainter::PaintOptions::CombinedText>(context, boxRect, styleToUse, font, selectionStyle.fillColor, combinedText);
else
@@ -242,21 +237,9 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Counterclockwise));
}
- if (paintInfo.phase == PaintPhaseForeground) {
+ if (paintInfo.phase == PaintPhaseForeground)
paintDocumentMarkers(context, boxOrigin, styleToUse, font, false);
- // Paint custom underlines for compositions.
- if (useCustomUnderlines) {
- const Vector<CompositionUnderline>& underlines = m_inlineTextBox.layoutObject().frame()->inputMethodController().customCompositionUnderlines();
- CompositionUnderlineRangeFilter filter(underlines, m_inlineTextBox.start(), m_inlineTextBox.end());
- for (CompositionUnderlineRangeFilter::ConstIterator it = filter.begin(); it != filter.end(); ++it) {
- if (it->color == Color::transparent)
- continue;
- paintCompositionUnderline(context, boxOrigin, *it);
- }
- }
- }
-
if (shouldRotate)
context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Counterclockwise));
}
@@ -274,27 +257,11 @@ unsigned InlineTextBoxPainter::underlinePaintEnd(const CompositionUnderline& und
return paintEnd;
}
-void InlineTextBoxPainter::paintCompositionBackgrounds(GraphicsContext* pt, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, bool useCustomUnderlines)
-{
- if (useCustomUnderlines) {
- // Paint custom background highlights for compositions.
- const Vector<CompositionUnderline>& underlines = m_inlineTextBox.layoutObject().frame()->inputMethodController().customCompositionUnderlines();
- CompositionUnderlineRangeFilter filter(underlines, m_inlineTextBox.start(), m_inlineTextBox.end());
- for (CompositionUnderlineRangeFilter::ConstIterator it = filter.begin(); it != filter.end(); ++it) {
- if (it->backgroundColor == Color::transparent)
- continue;
- paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, it->backgroundColor, underlinePaintStart(*it), underlinePaintEnd(*it));
- }
-
- } else {
- paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, LayoutTheme::theme().platformDefaultCompositionBackgroundColor(),
- m_inlineTextBox.layoutObject().frame()->inputMethodController().compositionStart(),
- m_inlineTextBox.layoutObject().frame()->inputMethodController().compositionEnd());
- }
-}
-
void InlineTextBoxPainter::paintSingleCompositionBackgroundRun(GraphicsContext* context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, Color backgroundColor, int startPos, int endPos)
{
+ if (backgroundColor == Color::transparent)
+ return;
+
int sPos = std::max(startPos - static_cast<int>(m_inlineTextBox.start()), 0);
int ePos = std::min(endPos - static_cast<int>(m_inlineTextBox.start()), static_cast<int>(m_inlineTextBox.len()));
if (sPos >= ePos)
@@ -330,6 +297,8 @@ void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext* pt, const Layou
if (!background)
continue;
break;
+ case DocumentMarker::Composition:
+ break;
default:
continue;
}
@@ -355,6 +324,15 @@ void InlineTextBoxPainter::paintDocumentMarkers(GraphicsContext* pt, const Layou
case DocumentMarker::TextMatch:
m_inlineTextBox.paintTextMatchMarker(pt, boxOrigin, marker, style, font);
break;
+ case DocumentMarker::Composition:
+ {
+ CompositionUnderline underline(marker->startOffset(), marker->endOffset(), marker->underlineColor(), marker->thick(), marker->backgroundColor());
+ if (background)
+ paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, underline.backgroundColor, underlinePaintStart(underline), underlinePaintEnd(underline));
+ else
+ paintCompositionUnderline(pt, boxOrigin, underline);
+ }
+ break;
default:
ASSERT_NOT_REACHED();
}
@@ -765,6 +743,9 @@ void InlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, const Lay
void InlineTextBoxPainter::paintCompositionUnderline(GraphicsContext* ctx, const LayoutPoint& boxOrigin, const CompositionUnderline& underline)
{
+ if (underline.color == Color::transparent)
+ return;
+
if (m_inlineTextBox.truncation() == cFullTruncation)
return;

Powered by Google App Engine
This is Rietveld 408576698