[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - sw/qa sw/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Wed Jan 13 16:09:45 UTC 2021


 sw/qa/extras/tiledrendering/tiledrendering.cxx |   33 +++++++++++++++++++++++++
 sw/source/uibase/docvw/edtwin.cxx              |   10 ++++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

New commits:
commit 69156936693d4e580bd986fc6dbd0026f4f4c2d0
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Tue Jan 12 17:10:49 2021 +0100
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Jan 13 17:09:11 2021 +0100

    sw edit win: fix read-only selections while handling ExtTextInput
    
    When typing into a protected section (or other read-only area), the code
    goes through SwEditWin::KeyInput(), which checks for HasReadonlySel(),
    and calls into sw::DocumentContentOperationsManager::InsertString() in
    the read-write case.
    
    When typing via ExtTextInput (e.g. Online), then SwEditWin::Command()
    called into sw::DocumentContentOperationsManager::InsertString() without
    such a check.
    
    The convention is to do a read-only check in the first Writer function
    called by vcl, so handle this in SwEditWin::Command(), to have exactly 1
    read-only popup on typing a character.
    
    (cherry picked from commit 0c03a97fb8844ad0de1abea79b5265617a509460)
    
    Conflicts:
            sw/qa/extras/tiledrendering/tiledrendering.cxx
    
    Change-Id: I7d002e7d76bffeb6f16750de735c5bbf13a7bba9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109232
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>

diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index ac481a9f7148..992972e9893a 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -14,6 +14,7 @@
 #include <com/sun/star/frame/XDispatchResultListener.hpp>
 #include <com/sun/star/frame/XStorable.hpp>
 #include <swmodeltestbase.hxx>
+#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
 #include <test/helper/transferable.hxx>
 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
 #include <comphelper/dispatchcommand.hxx>
@@ -129,6 +130,7 @@ public:
     void testDropDownFormFieldButtonNoSelection();
     void testDropDownFormFieldButtonNoItem();
     void testTablePaintInvalidate();
+    void testExtTextInputReadOnly();
 
     CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -198,6 +200,7 @@ public:
     CPPUNIT_TEST(testDropDownFormFieldButtonNoSelection);
     CPPUNIT_TEST(testDropDownFormFieldButtonNoItem);
     CPPUNIT_TEST(testTablePaintInvalidate);
+    CPPUNIT_TEST(testExtTextInputReadOnly);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -2770,6 +2773,36 @@ void SwTiledRenderingTest::testTablePaintInvalidate()
     CPPUNIT_ASSERT_EQUAL(0, m_nInvalidations);
 }
 
+void SwTiledRenderingTest::testExtTextInputReadOnly()
+{
+    // Create a document with a protected section + a normal paragraph after it.
+    SwXTextDocument* pXTextDocument = createDoc();
+    uno::Reference<text::XTextViewCursorSupplier> xController(
+        pXTextDocument->getCurrentController(), uno::UNO_QUERY);
+    uno::Reference<text::XTextViewCursor> xCursor = xController->getViewCursor();
+    uno::Reference<text::XText> xText = xCursor->getText();
+    uno::Reference<text::XTextContent> xSection(
+        pXTextDocument->createInstance("com.sun.star.text.TextSection"), uno::UNO_QUERY);
+    uno::Reference<beans::XPropertySet> xSectionProps(xSection, uno::UNO_QUERY);
+    xSectionProps->setPropertyValue("IsProtected", uno::Any(true));
+    xText->insertTextContent(xCursor, xSection, /*bAbsorb=*/true);
+
+    // First paragraph is the protected section, is it empty?
+    VclPtr<vcl::Window> pEditWin = pXTextDocument->getDocWindow();
+    CPPUNIT_ASSERT(pEditWin);
+    CPPUNIT_ASSERT(getParagraph(1)->getString().isEmpty());
+
+    // Try to type into the protected section, is it still empty?
+    SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell();
+    pWrtShell->SttEndDoc(/*bStt=*/true);
+    SfxLokHelper::postExtTextEventAsync(pEditWin, LOK_EXT_TEXTINPUT, "x");
+    SfxLokHelper::postExtTextEventAsync(pEditWin, LOK_EXT_TEXTINPUT_END, "x");
+    Scheduler::ProcessEventsToIdle();
+    // Without the accompanying fix in place, this test would have failed, as it was possible to
+    // type into the protected section.
+    CPPUNIT_ASSERT(getParagraph(1)->getString().isEmpty());
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx
index 687786b51bfa..dfb09bcaa23c 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -5354,7 +5354,7 @@ void SwEditWin::Command( const CommandEvent& rCEvt )
     {
         bool bIsDocReadOnly = m_rView.GetDocShell()->IsReadOnly() &&
                               rSh.IsCursorReadonly();
-        if(!bIsDocReadOnly)
+        if (!bIsDocReadOnly && !rSh.HasReadonlySel())
         {
             if( m_pQuickHlpData->m_bIsDisplayed )
                 m_pQuickHlpData->Stop( rSh );
@@ -5388,6 +5388,14 @@ void SwEditWin::Command( const CommandEvent& rCEvt )
                 }
             }
         }
+
+        if (rSh.HasReadonlySel())
+        {
+            // Inform the user that the request has been ignored.
+            auto xInfo = std::make_shared<weld::GenericDialogController>(
+                GetFrameWeld(), "modules/swriter/ui/inforeadonlydialog.ui", "InfoReadonlyDialog");
+            weld::DialogController::runAsync(xInfo, [](sal_Int32 /*nResult*/) {});
+        }
     }
     break;
     case CommandEventId::CursorPos:


More information about the Libreoffice-commits mailing list