summaryrefslogtreecommitdiffstats
path: root/source/kde/kde/patch/ktexteditor/686da7797105a93035cfbc7edbf2a8e8f8adf0ec.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/kde/kde/patch/ktexteditor/686da7797105a93035cfbc7edbf2a8e8f8adf0ec.patch')
-rw-r--r--source/kde/kde/patch/ktexteditor/686da7797105a93035cfbc7edbf2a8e8f8adf0ec.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/source/kde/kde/patch/ktexteditor/686da7797105a93035cfbc7edbf2a8e8f8adf0ec.patch b/source/kde/kde/patch/ktexteditor/686da7797105a93035cfbc7edbf2a8e8f8adf0ec.patch
new file mode 100644
index 000000000..7fca1a9e5
--- /dev/null
+++ b/source/kde/kde/patch/ktexteditor/686da7797105a93035cfbc7edbf2a8e8f8adf0ec.patch
@@ -0,0 +1,101 @@
+From 686da7797105a93035cfbc7edbf2a8e8f8adf0ec Mon Sep 17 00:00:00 2001
+From: Christoph Cullmann <cullmann@kde.org>
+Date: Wed, 17 Feb 2021 20:51:12 +0100
+Subject: [PATCH] ensure rangesForLine caching is correcly updated
+
+during fixing a segfault, as invalid range pointer were kept
+in the rangesForLine cache, too many ranges were purged
+
+properly update the cache before potential invalidation
+
+add unit test to avoid regressions in the future
+---
+ autotests/src/movingrange_test.cpp | 33 ++++++++++++++++++++++++++++++
+ autotests/src/movingrange_test.h | 1 +
+ src/buffer/katetextblock.cpp | 10 +++++++++
+ 3 files changed, 44 insertions(+)
+
+diff --git a/autotests/src/movingrange_test.cpp b/autotests/src/movingrange_test.cpp
+index 66393ae7..81a85b1a 100644
+--- a/autotests/src/movingrange_test.cpp
++++ b/autotests/src/movingrange_test.cpp
+@@ -459,3 +459,36 @@ void MovingRangeTest::testLineRemoved()
+ auto r = doc.buffer().rangesForLine(1, view, true);
+ QVERIFY(r.isEmpty());
+ }
++
++void MovingRangeTest::testLineWrapOrUnwrapUpdateRangeForLineCache()
++{
++ KTextEditor::DocumentPrivate doc;
++ doc.setText(
++ QStringLiteral("abcd\n"
++ "efgh\n"
++ "hijk\n"));
++
++ // add range to line 2, it shall be in rangeForLine for the right lines after each update!
++ // must be single line range to be in the cache!
++ auto range = static_cast<Kate::TextRange *>(doc.newMovingRange({2, 1, 2, 3},
++ KTextEditor::MovingRange::ExpandLeft | KTextEditor::MovingRange::ExpandRight,
++ KTextEditor::MovingRange::InvalidateIfEmpty));
++
++ // range shall be in the lookup cache for line 2
++ QVERIFY(doc.buffer().rangesForLine(0, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(1, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(2, nullptr, false).contains(range));
++
++ // wrap line 1 => range should move to line 3
++ doc.editWrapLine(1, 1);
++ QVERIFY(doc.buffer().rangesForLine(0, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(1, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(2, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(3, nullptr, false).contains(range));
++
++ // unwrap line 1 => range should back move to line 2
++ doc.editUnWrapLine(1);
++ QVERIFY(doc.buffer().rangesForLine(0, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(1, nullptr, false).isEmpty());
++ QVERIFY(doc.buffer().rangesForLine(2, nullptr, false).contains(range));
++}
+diff --git a/autotests/src/movingrange_test.h b/autotests/src/movingrange_test.h
+index 6f8c057d..016655f7 100644
+--- a/autotests/src/movingrange_test.h
++++ b/autotests/src/movingrange_test.h
+@@ -24,6 +24,7 @@ private Q_SLOTS:
+ void testFeedbackCaret();
+ void testFeedbackMouse();
+ void testLineRemoved();
++ void testLineWrapOrUnwrapUpdateRangeForLineCache();
+ };
+
+ #endif // KATE_MOVINGRANGE_TEST_H
+diff --git a/src/buffer/katetextblock.cpp b/src/buffer/katetextblock.cpp
+index 43d137e4..246897b4 100644
+--- a/src/buffer/katetextblock.cpp
++++ b/src/buffer/katetextblock.cpp
+@@ -167,6 +167,11 @@ void TextBlock::wrapLine(const KTextEditor::Cursor &position, int fixStartLinesS
+ // we might need to invalidate ranges or notify about their changes
+ // checkValidity might trigger delete of the range!
+ for (TextRange *range : qAsConst(changedRanges)) {
++ // we need to do updateRange to ALWAYS ensure the line => range and back cache is updated
++ // see MovingRangeTest::testLineWrapOrUnwrapUpdateRangeForLineCache
++ updateRange(range);
++
++ // in addition: ensure that we really invalidate bad ranges!
+ range->checkValidity(range->toLineRange());
+ }
+ }
+@@ -333,6 +338,11 @@ void TextBlock::unwrapLine(int line, TextBlock *previousBlock, int fixStartLines
+ // we might need to invalidate ranges or notify about their changes
+ // checkValidity might trigger delete of the range!
+ for (TextRange *range : qAsConst(changedRanges)) {
++ // we need to do updateRange to ALWAYS ensure the line => range and back cache is updated
++ // see MovingRangeTest::testLineWrapOrUnwrapUpdateRangeForLineCache
++ updateRange(range);
++
++ // in addition: ensure that we really invalidate bad ranges!
+ range->checkValidity(range->toLineRange());
+ }
+ }
+--
+GitLab
+