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

Miklos Vajna vmiklos at collabora.co.uk
Thu Jan 26 09:30:50 UTC 2017


 sw/qa/extras/uiwriter/data/tdf105417.odt |binary
 sw/qa/extras/uiwriter/uiwriter.cxx       |   27 +++++++++++++++++++++++++++
 sw/source/core/text/txthyph.cxx          |    5 +++++
 sw/source/uibase/inc/hyp.hxx             |    3 ++-
 sw/source/uibase/lingu/hyp.cxx           |    2 +-
 5 files changed, 35 insertions(+), 2 deletions(-)

New commits:
commit d3fe36ac90c3186f14405305e07b700de6f01581
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Jan 19 11:11:43 2017 +0100

    bnc#1014896 tdf#105417 sw hyphenation: avoid infinite loop on ...
    
    ... zero-length last line
    
    This hang happened when the user executed Tools -> Language ->
    Hyphenation -> Hyphenate All.
    
    This problem is visible only if all of these conditions are met:
    - a line in a paragraph has a word that already contains a soft-hyphen,
      but not at the position where the automatic hyphenation would insert
      it
    - the last line ends with a word that can be hyphenated
    - there is a fly frame in the document
    
    In this case it happens during hyphenation that the layout has an
    additional empty line at the end (which is removed by the time the
    layout finishes), so we hit the case when SwTextFormatter::Hyphenate()
    skips the "if( m_pCurr->PrtWidth() && m_pCurr->GetLen() )" block.
    
    Normally hyphenation terminates when it iterates over the portions of the
    line and no overrun nor any existing hyphen portion are seen, but in
    this case that never happened. Fix the problem by terminating not only
    when we reach the end of the portion iteration, but also when the
    portion list is non-existing (has zero length).
    
    (cherry picked from commit 1b6fa616087e7415be9dc7113bbd8bf381aadd70)
    
    Conflicts:
    	sw/qa/extras/uiwriter/uiwriter.cxx
    	sw/source/uibase/lingu/hyp.cxx
    
    Change-Id: I71d4b040a2d4692ae6eb92807dbbbb42b077a0f8
    Reviewed-on: https://gerrit.libreoffice.org/33310
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/sw/qa/extras/uiwriter/data/tdf105417.odt b/sw/qa/extras/uiwriter/data/tdf105417.odt
new file mode 100644
index 0000000..d594d2a
Binary files /dev/null and b/sw/qa/extras/uiwriter/data/tdf105417.odt differ
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index b3f4d63..d68e957 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -85,6 +85,7 @@
 #include <paratr.hxx>
 #include <drawfont.hxx>
 #include <txtfrm.hxx>
+#include <hyp.hxx>
 #include <editeng/svxenum.hxx>
 #include <comphelper/propertysequence.hxx>
 #include <sfx2/classificationhelper.hxx>
@@ -92,6 +93,7 @@
 #include <sfx2/viewfrm.hxx>
 #include <sfx2/dispatch.hxx>
 #include <comphelper/propertyvalue.hxx>
+#include <editeng/unolingu.hxx>
 
 static const char* DATA_DIRECTORY = "/sw/qa/extras/uiwriter/data/";
 
@@ -201,6 +203,7 @@ public:
     void testTdf95699();
     void testTdf104440();
     void testTdf104425();
+    void testTdf105417();
 
     CPPUNIT_TEST_SUITE(SwUiWriterTest);
     CPPUNIT_TEST(testReplaceForward);
@@ -303,6 +306,7 @@ public:
     CPPUNIT_TEST(testTdf95699);
     CPPUNIT_TEST(testTdf104440);
     CPPUNIT_TEST(testTdf104425);
+    CPPUNIT_TEST(testTdf105417);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -3516,6 +3520,29 @@ void SwUiWriterTest::testTdf104425()
     CPPUNIT_ASSERT_DOUBLES_EQUAL(700.0, fSumHeight_mm, 0.05);
 }
 
+void SwUiWriterTest::testTdf105417()
+{
+    SwDoc* pDoc = createDoc("tdf105417.odt");
+    CPPUNIT_ASSERT(pDoc);
+    SwView* pView = pDoc->GetDocShell()->GetView();
+    CPPUNIT_ASSERT(pView);
+    uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator();
+    CPPUNIT_ASSERT(xHyphenator.is());
+    // If there are no English hyphenation rules installed, we can't test
+    // hyphenation.
+    if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString())))
+        return;
+
+    uno::Reference<linguistic2::XLinguProperties> xLinguProperties(LinguMgr::GetLinguPropertySet());
+    // Automatic hyphenation means not opening a dialog, but going ahead
+    // non-interactively.
+    xLinguProperties->setIsHyphAuto(true);
+    SwHyphWrapper aWrap(pView, xHyphenator, /*bStart=*/false, /*bOther=*/true, /*bSelection=*/false);
+    // This never returned, it kept trying to hyphenate the last word
+    // (greenbacks) again and again.
+    aWrap.SpellDocument();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
 CPPUNIT_PLUGIN_IMPLEMENT();
 
diff --git a/sw/source/core/text/txthyph.cxx b/sw/source/core/text/txthyph.cxx
index 369a22a..6b5bd84 100644
--- a/sw/source/core/text/txthyph.cxx
+++ b/sw/source/core/text/txthyph.cxx
@@ -197,6 +197,11 @@ bool SwTextFormatter::Hyphenate( SwInterHyphInfo &rHyphInf )
         if( !pPos )
             nWrdStart = 0;
     }
+    else
+        // In case the whole line is zero-length, that's the same situation as
+        // above when the portion iteration ends without explicitly breaking
+        // from the loop.
+        nWrdStart = 0;
 
     // Das alte LineLayout wird wieder eingestellt ...
     delete m_pCurr;
diff --git a/sw/source/uibase/inc/hyp.hxx b/sw/source/uibase/inc/hyp.hxx
index 8a621ba..378729b 100644
--- a/sw/source/uibase/inc/hyp.hxx
+++ b/sw/source/uibase/inc/hyp.hxx
@@ -23,10 +23,11 @@
 #include <tools/link.hxx>
 #include <editeng/splwrap.hxx>
 #include <com/sun/star/linguistic2/XHyphenator.hpp>
+#include <swdllapi.h>
 
 class SwView;
 
-class SwHyphWrapper : public SvxSpellWrapper {
+class SW_DLLPUBLIC SwHyphWrapper : public SvxSpellWrapper {
 private:
     SwView* pView;
     css::uno::Reference< css::linguistic2::XHyphenator >  xHyph;
diff --git a/sw/source/uibase/lingu/hyp.cxx b/sw/source/uibase/lingu/hyp.cxx
index f5738f8..7150d27 100644
--- a/sw/source/uibase/lingu/hyp.cxx
+++ b/sw/source/uibase/lingu/hyp.cxx
@@ -120,7 +120,7 @@ SwHyphWrapper::~SwHyphWrapper()
 {
     if( nPageCount )
         ::EndProgress( pView->GetDocShell() );
-    if( bInfoBox )
+    if( bInfoBox && !Application::IsHeadlessModeEnabled() )
         ScopedVclPtr<InfoBox>::Create( &pView->GetEditWin(), SW_RESSTR(STR_HYP_OK) )->Execute();
 }
 


More information about the Libreoffice-commits mailing list