[Libreoffice-commits] .: Branch 'libreoffice-4-0' - 2 commits - sw/qa sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Jan 9 07:04:30 PST 2013


 sw/qa/complex/writer/CheckTable.java     |   32 +++++++++++++++++++++++++
 sw/source/core/unocore/unocrsrhelper.cxx |   39 +++++++++++++++++++++----------
 sw/source/core/unocore/unoobj.cxx        |    4 +++
 sw/source/core/unocore/unoobj2.cxx       |    7 +++--
 4 files changed, 67 insertions(+), 15 deletions(-)

New commits:
commit 23e5bce572ebb65b302c139e89890e23a27a994d
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Jan 9 15:45:32 2013 +0100

    fdo#58242: sw: fix more crashes when not on SwTxtNode
    
    In getCrsrPropertyValue etc.; also add a unit test for the problem.
    
    Change-Id: Ibd459a43393c39b4fed9fb89aae4a5f7bacff007
    (cherry picked from commit 68d40d2cae3700f4134375fcaf9649ac626ada7d)
    
    Signed-off-by: Michael Stahl <mstahl at redhat.com>

diff --git a/sw/qa/complex/writer/CheckTable.java b/sw/qa/complex/writer/CheckTable.java
index 449dc1a..6fe9b28 100644
--- a/sw/qa/complex/writer/CheckTable.java
+++ b/sw/qa/complex/writer/CheckTable.java
@@ -10,12 +10,16 @@
 package complex.writer;
 
 import com.sun.star.uno.UnoRuntime;
+import com.sun.star.uno.RuntimeException;
 import com.sun.star.uno.XComponentContext;
 import com.sun.star.lang.XMultiServiceFactory;
 import com.sun.star.beans.XPropertySet;
+import com.sun.star.beans.XPropertySetInfo;
+import com.sun.star.beans.Property;
 import com.sun.star.text.XText;
 import com.sun.star.text.XTextDocument;
 import com.sun.star.text.XTextCursor;
+import com.sun.star.text.XTextRange;
 import com.sun.star.text.XTextTable;
 import com.sun.star.table.TableBorder;
 import com.sun.star.table.TableBorder2;
@@ -258,6 +262,34 @@ public class CheckTable
         assertTrue(border2.IsDistanceValid);
         assertEquals(97, border2.Distance);
     }
+
+    @Test
+    public void test_fdo58242() throws Exception
+    {
+        // insert table
+        XMultiServiceFactory xDocF =
+            UnoRuntime.queryInterface(XMultiServiceFactory.class, m_xDoc);
+        XTextTable xTable = UnoRuntime.queryInterface(XTextTable.class,
+            xDocF.createInstance("com.sun.star.text.TextTable"));
+        xTable.initialize(3, 3);
+        XText xText = m_xDoc.getText();
+        XTextCursor xCursor = xText.createTextCursor();
+        xText.insertTextContent(xCursor, xTable, false);
+        // get anchor
+        XTextRange xAnchor = xTable.getAnchor();
+        // check all properties on the anchor - shouldn't crash despite
+        // pointing to a non-SwTxtNode
+        XPropertySet xProps = (XPropertySet)
+            UnoRuntime.queryInterface(XPropertySet.class, xAnchor);
+        XPropertySetInfo xPropsInfo = xProps.getPropertySetInfo();
+        Property[] props = xPropsInfo.getProperties();
+        for (int i = 0; i < props.length; ++i)
+        {
+            try {
+                xProps.getPropertyValue(props[i].Name);
+            } catch (RuntimeException e) { }
+        }
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx
index fbe46b9..4f13e25 100644
--- a/sw/source/core/unocore/unocrsrhelper.cxx
+++ b/sw/source/core/unocore/unocrsrhelper.cxx
@@ -487,9 +487,9 @@ sal_Bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry
         case FN_UNO_CHARFMT_SEQUENCE:
         {
 
-            SwTxtNode* pTxtNode;
-            if((pTxtNode = (SwTxtNode*)rPam.GetNode( sal_True )) == rPam.GetNode(sal_False) &&
-                    pTxtNode->GetpSwpHints())
+            SwTxtNode *const pTxtNode = rPam.GetNode()->GetTxtNode();
+            if (rPam.GetNode(sal_True) == rPam.GetNode(sal_False)
+                && pTxtNode && pTxtNode->GetpSwpHints())
             {
                 sal_uInt16 nPaMStart = rPam.GetPoint()->nContent.GetIndex();
                 sal_uInt16 nPaMEnd = rPam.GetMark() ? rPam.GetMark()->nContent.GetIndex() : nPaMStart;
@@ -940,6 +940,11 @@ sal_Bool DocInsertStringSplitCR(
     xub_StrLen nStartIdx = 0;
     SwTxtNode* const pTxtNd =
         rNewCursor.GetPoint()->nNode.GetNode().GetTxtNode();
+    if (!pTxtNd)
+    {
+        SAL_INFO("sw.uno", "DocInsertStringSplitCR: need a text node");
+        return false;
+    }
     const xub_StrLen nMaxLength = ( pTxtNd )
         ? STRING_LEN - pTxtNd->GetTxt().Len()
         : STRING_LEN;
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index a91286a..62fca05 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -529,6 +529,10 @@ throw (lang::IllegalArgumentException)
         {
             // multi selection is not considered
             SwTxtNode *const pTxtNd = rPam.GetNode()->GetTxtNode();
+            if (!pTxtNd)
+            {
+                throw lang::IllegalArgumentException();
+            }
             if (FN_UNO_NUM_LEVEL == rEntry.nWID)
             {
                 sal_Int16 nLevel = 0;
diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index efa650e..956a676 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -1839,9 +1839,10 @@ lcl_FillFrame(SwClient & rEnum, SwUnoCrsr& rUnoCrsr,
         FrameDependList_t & rFrames)
 {
     // search for objects at the cursor - anchored at/as char
-    SwTxtAttr const*const pTxtAttr =
-        rUnoCrsr.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
-            rUnoCrsr.GetPoint()->nContent.GetIndex(), RES_TXTATR_FLYCNT);
+    SwTxtAttr const*const pTxtAttr = (rUnoCrsr.GetNode()->IsTxtNode())
+        ? rUnoCrsr.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
+            rUnoCrsr.GetPoint()->nContent.GetIndex(), RES_TXTATR_FLYCNT)
+        : 0;
     if (pTxtAttr)
     {
         const SwFmtFlyCnt& rFlyCnt = pTxtAttr->GetFlyCnt();
commit 9d1cdb4f42c3fee9f24020404ce8e3d378cb34f4
Author: Noel Power <noel.power at suse.com>
Date:   Wed Jan 9 14:40:10 2013 +0100

    fdo#58242: getCrsrPropertyValue: fix crashes when PaM not on SwTxtNode
    
    Change-Id: I67042b5d689457921a928454c9051f0402be17e6
    (cherry picked from commit 11b380874a36869452246cc77c392d1767e60e95)
    
    Signed-off-by: Michael Stahl <mstahl at redhat.com>

diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx
index d165d4b..fbe46b9 100644
--- a/sw/source/core/unocore/unocrsrhelper.cxx
+++ b/sw/source/core/unocore/unocrsrhelper.cxx
@@ -292,9 +292,12 @@ sal_Bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry
             break;
         case FN_UNO_DOCUMENT_INDEX_MARK:
         {
-            ::std::vector<SwTxtAttr *> const marks(
-                rPam.GetNode()->GetTxtNode()->GetTxtAttrsAt(
-                    rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK));
+            ::std::vector<SwTxtAttr *> marks;
+            if (rPam.GetNode()->IsTxtNode())
+            {
+                marks = rPam.GetNode()->GetTxtNode()->GetTxtAttrsAt(
+                    rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK);
+            }
             if (marks.size())
             {
                 if( pAny )
@@ -418,9 +421,9 @@ sal_Bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry
         case FN_UNO_ENDNOTE:
         case FN_UNO_FOOTNOTE:
         {
-            SwTxtAttr *const pTxtAttr =
+            SwTxtAttr *const pTxtAttr = rPam.GetNode()->IsTxtNode() ?
                 rPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
-                    rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN);
+                    rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN) : 0;
             if(pTxtAttr)
             {
                 const SwFmtFtn& rFtn = pTxtAttr->GetFtn();
@@ -442,9 +445,13 @@ sal_Bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry
         break;
         case FN_UNO_REFERENCE_MARK:
         {
-            ::std::vector<SwTxtAttr *> const marks(
+            ::std::vector<SwTxtAttr *> marks;
+            if (rPam.GetNode()->IsTxtNode())
+            {
+                marks = (
                 rPam.GetNode()->GetTxtNode()->GetTxtAttrsAt(
                     rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_REFMARK));
+            }
             if (marks.size())
             {
                 if( pAny )
@@ -460,9 +467,10 @@ sal_Bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry
         break;
         case FN_UNO_NESTED_TEXT_CONTENT:
         {
-            uno::Reference<XTextContent> const xRet(
-                GetNestedTextContent(*rPam.GetNode()->GetTxtNode(),
-                    rPam.GetPoint()->nContent.GetIndex(), false));
+            uno::Reference<XTextContent> const xRet(rPam.GetNode()->IsTxtNode()
+                ? GetNestedTextContent(*rPam.GetNode()->GetTxtNode(),
+                    rPam.GetPoint()->nContent.GetIndex(), false)
+                : 0);
             if (xRet.is())
             {
                 if (pAny)
@@ -711,6 +719,8 @@ void  getNumberingProperty(SwPaM& rPam, PropertyState& eState, Any * pAny )
 
 void GetCurPageStyle(SwPaM& rPaM, String &rString)
 {
+    if (!rPaM.GetCntntNode())
+        return; // TODO: is there an easy way to get it for tables/sections?
     const SwPageFrm* pPage = rPaM.GetCntntNode()->getLayoutFrm(rPaM.GetDoc()->GetCurrentLayout())->FindPageFrm();
     if(pPage)
         SwStyleNameMapper::FillProgName( pPage->GetPageDesc()->GetName(), rString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, true );


More information about the Libreoffice-commits mailing list