editeng/source/editeng/textconv.cxx | 2 sw/inc/hhcwrp.hxx | 2 sw/qa/extras/uiwriter/uiwriter.cxx | 122 ++++++++++++++++++++++++++++++++++++ sw/source/uibase/lingu/hhcwrp.cxx | 4 - 4 files changed, 126 insertions(+), 4 deletions(-)
New commits: commit c369013edb76cd47ef7e8c193a18a57ff165ddfb Author: Matthew J. Francis <mjay.fran...@gmail.com> Date: Fri Aug 29 18:18:40 2014 +0800 fdo#83178 fix Chinese Conversion crash Reviewed on: https://gerrit.libreoffice.org/11187 Change-Id: Ifa9c7c1a29d7076903e038d3132c635b1143e2d8 diff --git a/editeng/source/editeng/textconv.cxx b/editeng/source/editeng/textconv.cxx index 307d0e8..f843f83 100644 --- a/editeng/source/editeng/textconv.cxx +++ b/editeng/source/editeng/textconv.cxx @@ -478,7 +478,7 @@ void TextConvWrapper::ChangeText( const OUString &rNewText, } // end of string also terminates non-matching char sequence - if (rOrigText[nIndex] == rNewText[nPos] || nPos == nConvTextLen) + if (nPos == nConvTextLen || rOrigText[nIndex] == rNewText[nPos]) { // substring that needs to be replaced found? if (nChgPos>=0 && nConvChgPos>=0) diff --git a/sw/inc/hhcwrp.hxx b/sw/inc/hhcwrp.hxx index df973d0..9ff03b6 100644 --- a/sw/inc/hhcwrp.hxx +++ b/sw/inc/hhcwrp.hxx @@ -27,7 +27,7 @@ class SwWrtShell; struct SwConversionArgs; class SwPaM; -class SwHHCWrapper : public editeng::HangulHanjaConversion +class SW_DLLPUBLIC SwHHCWrapper : public editeng::HangulHanjaConversion { SwView * m_pView; Window* m_pWin; diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 0665f49..6cb67f7 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -6,6 +6,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include <com/sun/star/i18n/TextConversionOption.hpp> #include <swmodeltestbase.hxx> #include <ndtxt.hxx> #include <wrtsh.hxx> @@ -19,6 +20,8 @@ #include <fmtclds.hxx> #include <dcontact.hxx> #include <textboxhelper.hxx> +#include <view.hxx> +#include <hhcwrp.hxx> #include <svx/svdpage.hxx> #include <svx/svdview.hxx> @@ -48,6 +51,10 @@ public: void testShapeTextboxVertadjust(); void testShapeTextboxAutosize(); void testFdo82191(); + void testChineseConversionBlank(); + void testChineseConversionNonChineseText(); + void testChineseConversionTraditionalToSimplified(); + void testChineseConversionSimplifiedToTraditional(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); @@ -65,6 +72,11 @@ public: CPPUNIT_TEST(testShapeTextboxVertadjust); CPPUNIT_TEST(testShapeTextboxAutosize); CPPUNIT_TEST(testFdo82191); + CPPUNIT_TEST(testChineseConversionBlank); + CPPUNIT_TEST(testChineseConversionNonChineseText); + CPPUNIT_TEST(testChineseConversionTraditionalToSimplified); + CPPUNIT_TEST(testChineseConversionSimplifiedToTraditional); + CPPUNIT_TEST_SUITE_END(); private: @@ -414,6 +426,116 @@ void SwUiWriterTest::testFdo82191() CPPUNIT_ASSERT_EQUAL(size_t(2), aTextBoxes.size()); } + +// Chinese conversion tests + +static const OUString CHINESE_TRADITIONAL_CONTENT(sal_Unicode(0x9F8D)); +static const OUString CHINESE_SIMPLIFIED_CONTENT(sal_Unicode(0x9F99)); +static const OUString NON_CHINESE_CONTENT ("Hippopotamus"); + +// Tests that a blank document is still blank after conversion +void SwUiWriterTest::testChineseConversionBlank() +{ + + // Given + SwDoc* pDoc = createDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() ); + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + + // When + SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, NULL, + i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false, + true, false, false ); + aWrap.Convert(); + + + // Then + SwTxtNode* pTxtNode = aPaM.GetNode().GetTxtNode(); + CPPUNIT_ASSERT_EQUAL(OUString(), pTxtNode->GetTxt()); + +} + +// Tests that non Chinese text is unchanged after conversion +void SwUiWriterTest::testChineseConversionNonChineseText() +{ + + // Given + SwDoc* pDoc = createDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() ); + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, NON_CHINESE_CONTENT); + + + // When + SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, NULL, + i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false, + true, false, false ); + aWrap.Convert(); + + + // Then + SwTxtNode* pTxtNode = aPaM.GetNode().GetTxtNode(); + CPPUNIT_ASSERT_EQUAL(NON_CHINESE_CONTENT, pTxtNode->GetTxt()); + +} + +// Tests conversion of traditional Chinese characters to simplified Chinese +void SwUiWriterTest::testChineseConversionTraditionalToSimplified() +{ + + // Given + SwDoc* pDoc = createDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() ); + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, CHINESE_TRADITIONAL_CONTENT); + + + // When + SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_TRADITIONAL, LANGUAGE_CHINESE_SIMPLIFIED, NULL, + i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false, + true, false, false ); + aWrap.Convert(); + + + // Then + SwTxtNode* pTxtNode = aPaM.GetNode().GetTxtNode(); + CPPUNIT_ASSERT_EQUAL(CHINESE_SIMPLIFIED_CONTENT, pTxtNode->GetTxt()); + +} + +// Tests conversion of simplified Chinese characters to traditional Chinese +void SwUiWriterTest::testChineseConversionSimplifiedToTraditional() +{ + + // Given + SwDoc* pDoc = createDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + const uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() ); + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, CHINESE_SIMPLIFIED_CONTENT); + + + // When + SwHHCWrapper aWrap( pView, xContext, LANGUAGE_CHINESE_SIMPLIFIED, LANGUAGE_CHINESE_TRADITIONAL, NULL, + i18n::TextConversionOption::CHARACTER_BY_CHARACTER, false, + true, false, false ); + aWrap.Convert(); + + + // Then + SwTxtNode* pTxtNode = aPaM.GetNode().GetTxtNode(); + CPPUNIT_ASSERT_EQUAL(CHINESE_TRADITIONAL_CONTENT, pTxtNode->GetTxt()); + +} + + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/uibase/lingu/hhcwrp.cxx b/sw/source/uibase/lingu/hhcwrp.cxx index b83dd99..7bc3084 100644 --- a/sw/source/uibase/lingu/hhcwrp.cxx +++ b/sw/source/uibase/lingu/hhcwrp.cxx @@ -262,8 +262,8 @@ void SwHHCWrapper::ChangeText( const OUString &rNewText, nIndex = rOrigText.getLength(); } - if (rOrigText[nIndex] == rNewText[nPos] || - nPos == nConvTextLen /* end of string also terminates non-matching char sequence */) + if (nPos == nConvTextLen || /* end of string also terminates non-matching char sequence */ + rOrigText[nIndex] == rNewText[nPos]) { // substring that needs to be replaced found? if (nChgPos != -1 && nConvChgPos != -1) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits