Modified: trunk/Source/WebCore/rendering/MarkerSubrange.cpp (226136 => 226137)
--- trunk/Source/WebCore/rendering/MarkerSubrange.cpp 2017-12-19 21:22:22 UTC (rev 226136)
+++ trunk/Source/WebCore/rendering/MarkerSubrange.cpp 2017-12-19 21:28:33 UTC (rev 226137)
@@ -67,14 +67,22 @@
unsigned offsetSoFar = offsets[0].value;
for (unsigned i = 1; i < numberOfOffsets; ++i) {
if (offsets[i].value > offsets[i - 1].value) {
- if (overlapStrategy == OverlapStrategy::Frontmost) {
+ if (overlapStrategy == OverlapStrategy::Frontmost || overlapStrategy == OverlapStrategy::FrontmostWithLongestEffectiveRange) {
std::optional<unsigned> frontmost;
for (unsigned j = 0; j < i; ++j) {
if (!processedSubranges.contains(offsets[j].subrange))
frontmost = j;
}
- if (frontmost)
- result.append({ offsetSoFar, offsets[i].value, offsets[frontmost.value()].subrange->type, offsets[frontmost.value()].subrange->marker });
+ if (frontmost) {
+ if (overlapStrategy == OverlapStrategy::FrontmostWithLongestEffectiveRange && !result.isEmpty()) {
+ auto& previous = result.last();
+ if (previous.endOffset == offsetSoFar && previous.type == offsets[frontmost.value()].subrange->type && previous.marker == offsets[frontmost.value()].subrange->marker)
+ previous.endOffset = offsets[i].value;
+ else
+ result.append({ offsetSoFar, offsets[i].value, offsets[frontmost.value()].subrange->type, offsets[frontmost.value()].subrange->marker });
+ } else
+ result.append({ offsetSoFar, offsets[i].value, offsets[frontmost.value()].subrange->type, offsets[frontmost.value()].subrange->marker });
+ }
} else {
for (unsigned j = 0; j < i; ++j) {
if (!processedSubranges.contains(offsets[j].subrange))
Modified: trunk/Source/WebCore/rendering/MarkerSubrange.h (226136 => 226137)
--- trunk/Source/WebCore/rendering/MarkerSubrange.h 2017-12-19 21:22:22 UTC (rev 226136)
+++ trunk/Source/WebCore/rendering/MarkerSubrange.h 2017-12-19 21:28:33 UTC (rev 226137)
@@ -44,6 +44,7 @@
// FIXME: See <rdar://problem/8933352>. Also, remove the PLATFORM(IOS)-guard.
DictationPhraseWithAlternatives,
#endif
+ Selection,
};
#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
MarkerSubrange() = default;
@@ -61,7 +62,7 @@
const RenderedDocumentMarker* marker { nullptr };
};
-enum class OverlapStrategy { None, Frontmost };
+enum class OverlapStrategy { None, Frontmost, FrontmostWithLongestEffectiveRange };
WEBCORE_EXPORT Vector<MarkerSubrange> subdivide(const Vector<MarkerSubrange>&, OverlapStrategy = OverlapStrategy::None);
}
Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/MarkerSubrange.cpp (226136 => 226137)
--- trunk/Tools/TestWebKitAPI/Tests/WebCore/MarkerSubrange.cpp 2017-12-19 21:22:22 UTC (rev 226136)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/MarkerSubrange.cpp 2017-12-19 21:28:33 UTC (rev 226137)
@@ -36,23 +36,25 @@
std::ostream& operator<<(std::ostream& os, MarkerSubrange::Type type)
{
switch (type) {
- case MarkerSubrange::Unmarked:
- return os << "Unmarked";
- case MarkerSubrange::GrammarError:
- return os << "GrammarError";
case MarkerSubrange::Correction:
return os << "Correction";
- case MarkerSubrange::SpellingError:
- return os << "SpellingError";
- case MarkerSubrange::TextMatch:
- return os << "TextMatch";
case MarkerSubrange::DictationAlternatives:
return os << "DictationAlternatives";
#if PLATFORM(IOS)
- // FIXME: See <rdar://problem/8933352>. Also, remove the PLATFORM(IOS)-guard.
+ // FIXME: See <rdar://problem/8933352>. Also, remove the PLATFORM(IOS)-guard.
case MarkerSubrange::DictationPhraseWithAlternatives:
return os << "DictationPhraseWithAlternatives";
#endif
+ case MarkerSubrange::GrammarError:
+ return os << "GrammarError";
+ case MarkerSubrange::Selection:
+ return os << "Selection";
+ case MarkerSubrange::SpellingError:
+ return os << "SpellingError";
+ case MarkerSubrange::TextMatch:
+ return os << "TextMatch";
+ case MarkerSubrange::Unmarked:
+ return os << "Unmarked";
}
}
@@ -175,4 +177,40 @@
EXPECT_EQ(expectedSubranges[i], results[i]);
}
+TEST(MarkerSubrange, SubdivideGrammarAndSelectionOverlapFrontmost)
+{
+ Vector<MarkerSubrange> subranges {
+ MarkerSubrange { 0, 40, MarkerSubrange::GrammarError },
+ MarkerSubrange { 2, 60, MarkerSubrange::Selection },
+ MarkerSubrange { 50, 60, MarkerSubrange::GrammarError },
+ };
+ Vector<MarkerSubrange> expectedSubranges {
+ MarkerSubrange { 0, 2, MarkerSubrange::GrammarError },
+ MarkerSubrange { 2, 40, MarkerSubrange::Selection },
+ MarkerSubrange { 40, 50, MarkerSubrange::Selection },
+ MarkerSubrange { 50, 60, MarkerSubrange::Selection },
+ };
+ auto results = subdivide(subranges, OverlapStrategy::Frontmost);
+ ASSERT_EQ(expectedSubranges.size(), results.size());
+ for (size_t i = 0; i < expectedSubranges.size(); ++i)
+ EXPECT_EQ(expectedSubranges[i], results[i]);
}
+
+TEST(MarkerSubrange, SubdivideGrammarAndSelectionOverlapFrontmostWithLongestEffectiveRange)
+{
+ Vector<MarkerSubrange> subranges {
+ MarkerSubrange { 0, 40, MarkerSubrange::GrammarError },
+ MarkerSubrange { 2, 60, MarkerSubrange::Selection },
+ MarkerSubrange { 50, 60, MarkerSubrange::GrammarError },
+ };
+ Vector<MarkerSubrange> expectedSubranges {
+ MarkerSubrange { 0, 2, MarkerSubrange::GrammarError },
+ MarkerSubrange { 2, 60, MarkerSubrange::Selection },
+ };
+ auto results = subdivide(subranges, OverlapStrategy::FrontmostWithLongestEffectiveRange);
+ ASSERT_EQ(expectedSubranges.size(), results.size());
+ for (size_t i = 0; i < expectedSubranges.size(); ++i)
+ EXPECT_EQ(expectedSubranges[i], results[i]);
+}
+
+}