sw/qa/uitest/writer_tests2/deleteFootnotes.py |   46 ++++++++++++++++++++++++++
 sw/source/core/crsr/swcrsr.cxx                |    6 ++-
 2 files changed, 51 insertions(+), 1 deletion(-)

New commits:
commit d05c176cc022f1b771f7c064f6ce74e9f8c27a1b
Author:     Hossein <hoss...@libreoffice.org>
AuthorDate: Wed Aug 24 23:03:09 2022 +0200
Commit:     Hossein <hoss...@libreoffice.org>
CommitDate: Sat Aug 27 00:53:55 2022 +0200

    tdf#150457 Fix crash on hovering removed footnote reference
    
    The regression was caused by 402f36efb215338ad545caa65d39fb8a39685ea1.
    Before that, 0aa0fda64057647219954480ac1bab86b0f0e433 changed the cursor
    jumping behavior to fix tdf#81226. The goal was to make LibreOffice
    behave as described in the description of the issue:
    
    "When your cursor is on the last line but not at the end of it, simply
    press the down arrow to go at the end of the file (end of that line)."
    
    The same behavior was achieved for pressing down on the last line.
    
    The above patches allowed removing the footnotes and their numbers
    (except the first number) while the reference were still present. Then,
    on hovering a removed footnote reference, a crash was happening. It
    should be noted that even with this patch, removing the first reference
    number was not possible.
    
    This fix limits this behavior to anywhere other than inside a footnote.
    In this way, it prevents crashing.
    
    With this fix, the behavior of the cursor goes back to what it was
    before 0aa0fda64057647219954480ac1bab86b0f0e433. The user will not be
    able to select all the footnotes at once. Also, removing footnote number
    will not be possible.
    
    It is worth noting that not being able to select all the footnotes at
    once prevents the user from changing the characteristics of the
    footnotes all at the same time. Also, not being able to remove the
    footnote numbers, prevents the user from having footnotes with custom
    numbers written manually. Both of these actions are possible in MS Word.
    The other difference is that by going up, one can go out of the footnote
    section in MS Word, but this is not the case for LibreOffice.
    
    A UI test is added to make sure the crash will not happen again. The
    test can be run by:
    
     cd sw && make -srj1 UITest_writer_tests2 \
      UITEST_TEST_NAME="deleteFootnotes.tdf150457.test_delete_footnotes" \
      SAL_USE_VCLPLUGIN=gen
    
    Change-Id: I1ce7d2189355f6763b6f31219e00516ff7a8164e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138562
    Tested-by: Jenkins
    Reviewed-by: Hossein <hoss...@libreoffice.org>

diff --git a/sw/qa/uitest/writer_tests2/deleteFootnotes.py 
b/sw/qa/uitest/writer_tests2/deleteFootnotes.py
new file mode 100644
index 000000000000..162cc7d3e1b2
--- /dev/null
+++ b/sw/qa/uitest/writer_tests2/deleteFootnotes.py
@@ -0,0 +1,46 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import type_text
+from libreoffice.uno.propertyvalue import mkPropertyValues
+import time
+
+
+class tdf150457(UITestCase):
+
+   def test_delete_footnotes(self):
+        with self.ui_test.create_doc_in_start_center("writer") as document:
+            xWriterDoc = self.xUITest.getTopFocusWindow()
+            xWriterEdit = xWriterDoc.getChild("writer_edit")
+
+            type_text(xWriterEdit, "a")
+            self.xUITest.executeCommand(".uno:InsertFootnote")
+            type_text(xWriterEdit, "abc")
+            self.assertEqual(document.Footnotes[0].String, "abc")
+            self.assertEqual(document.Footnotes.getCount(), 1)
+
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"PAGEUP"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"RETURN"}))
+            type_text(xWriterEdit, "d")
+
+            self.xUITest.executeCommand(".uno:InsertFootnote")
+            type_text(xWriterEdit, "def")
+            self.assertEqual(document.Footnotes[1].String, "def")
+            self.assertEqual(document.Footnotes.getCount(), 2)
+
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"UP"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"HOME"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"SHIFT+DOWN"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"DELETE"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"PAGEUP"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"CTRL+A"}))
+            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"DELETE"}))
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sw/source/core/crsr/swcrsr.cxx b/sw/source/core/crsr/swcrsr.cxx
index b379fe689766..06c73af06b23 100644
--- a/sw/source/core/crsr/swcrsr.cxx
+++ b/sw/source/core/crsr/swcrsr.cxx
@@ -2088,7 +2088,9 @@ bool SwCursor::UpDown( bool bUp, sal_uInt16 nCnt,
             }
             bRet = !IsSelOvr( SwCursorSelOverFlags::Toggle | 
SwCursorSelOverFlags::ChangePos );
         }
-        else
+        else if (!pFrame->IsInFootnote()) // tdf#150457 Jump to the begin/end
+                                          // of the first/last line only if the
+                                          // cursor is not inside a footenote
         {
             sal_Int32 nOffset = 0;
 
@@ -2114,6 +2116,8 @@ bool SwCursor::UpDown( bool bUp, sal_uInt16 nCnt,
             }
 
         }
+        else
+            *GetPoint() = aOldPos;
 
         DoSetBidiLevelUpDown(); // calculate cursor bidi level
     }

Reply via email to