You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2012/08/02 13:35:24 UTC

svn commit: r1368423 - /incubator/ooo/trunk/main/svgio/source/svgreader/svgnode.cxx

Author: alg
Date: Thu Aug  2 11:35:23 2012
New Revision: 1368423

URL: http://svn.apache.org/viewvc?rev=1368423&view=rev
Log:
#120435# Corrected CSS style detection to be executed only once per node

Modified:
    incubator/ooo/trunk/main/svgio/source/svgreader/svgnode.cxx

Modified: incubator/ooo/trunk/main/svgio/source/svgreader/svgnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svgio/source/svgreader/svgnode.cxx?rev=1368423&r1=1368422&r2=1368423&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svgio/source/svgreader/svgnode.cxx (original)
+++ incubator/ooo/trunk/main/svgio/source/svgreader/svgnode.cxx Thu Aug  2 11:35:23 2012
@@ -43,68 +43,71 @@ namespace svgio
 
         const SvgStyleAttributes* SvgNode::checkForCssStyle(const rtl::OUString& rClassStr, const SvgStyleAttributes& rOriginal) const
         {
-            const SvgDocument& rDocument = getDocument();
-
-            if(rDocument.hasSvgStyleAttributesById())
+            if(maCssStyleVector.empty()) // #120435# Evaluate for CSS styles only once, this cannot change
             {
-                if(getClass())
+                const SvgDocument& rDocument = getDocument();
+
+                if(rDocument.hasSvgStyleAttributesById())
                 {
-                    // find all referenced CSS styles, a list of entries is allowed
-                    const rtl::OUString* pClassList = getClass();
-                    const sal_Int32 nLen(pClassList->getLength());
-                    sal_Int32 nPos(0);
-                    const SvgStyleAttributes* pNew = 0;
+                    if(getClass())
+                    {
+                        // find all referenced CSS styles, a list of entries is allowed
+                        const rtl::OUString* pClassList = getClass();
+                        const sal_Int32 nLen(pClassList->getLength());
+                        sal_Int32 nPos(0);
+                        const SvgStyleAttributes* pNew = 0;
 
-                    skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
+                        skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
     
-                    while(nPos < nLen)
-                    {
-                        rtl::OUStringBuffer aTokenValue;
+                        while(nPos < nLen)
+                        {
+                            rtl::OUStringBuffer aTokenValue;
                         
-                        copyToLimiter(*pClassList, sal_Unicode(' '), nPos, aTokenValue, nLen);
-                        skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
+                            copyToLimiter(*pClassList, sal_Unicode(' '), nPos, aTokenValue, nLen);
+                            skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
 
-                        rtl::OUString aId(rtl::OUString::createFromAscii("."));
-                        const rtl::OUString aOUTokenValue(aTokenValue.makeStringAndClear());
+                            rtl::OUString aId(rtl::OUString::createFromAscii("."));
+                            const rtl::OUString aOUTokenValue(aTokenValue.makeStringAndClear());
                         
-                        // look for CSS style common to token
-                        aId = aId + aOUTokenValue;
-                        pNew = rDocument.findSvgStyleAttributesById(aId);
+                            // look for CSS style common to token
+                            aId = aId + aOUTokenValue;
+                            pNew = rDocument.findSvgStyleAttributesById(aId);
     
-                        if(!pNew && rClassStr.getLength())
-                        {
-                            // look for CSS style common to class.token
-                            aId = rClassStr + aId;
+                            if(!pNew && rClassStr.getLength())
+                            {
+                                // look for CSS style common to class.token
+                                aId = rClassStr + aId;
                     
-                            pNew = rDocument.findSvgStyleAttributesById(aId);
-                        }
+                                pNew = rDocument.findSvgStyleAttributesById(aId);
+                            }
                         
+                            if(pNew)
+                            {
+                                const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
+                            }
+                        }
+                    }
+                
+                    if(maCssStyleVector.empty() && getId())
+                    {
+                        // if none found, search for CSS style equal to Id
+                        const SvgStyleAttributes* pNew = rDocument.findSvgStyleAttributesById(*getId());
+
                         if(pNew)
                         {
                             const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
                         }
                     }
-                }
-                
-                if(maCssStyleVector.empty() && getId())
-                {
-                    // if none found, search for CSS style equal to Id
-                    const SvgStyleAttributes* pNew = rDocument.findSvgStyleAttributesById(*getId());
 
-                    if(pNew)
+                    if(maCssStyleVector.empty() && rClassStr.getLength())
                     {
-                        const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
-                    }
-                }
-
-                if(maCssStyleVector.empty() && rClassStr.getLength())
-                {
-                    // if none found, search for CSS style equal to class type
-                    const SvgStyleAttributes* pNew = rDocument.findSvgStyleAttributesById(rClassStr);
+                        // if none found, search for CSS style equal to class type
+                        const SvgStyleAttributes* pNew = rDocument.findSvgStyleAttributesById(rClassStr);
                     
-                    if(pNew)
-                    {
-                        const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
+                        if(pNew)
+                        {
+                            const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
+                        }
                     }
                 }
             }
@@ -116,8 +119,12 @@ namespace svgio
             else
             {
                 // set CssStyleParent at maCssStyleVector members to hang them in front of
-                // the existing style
+                // the existing style. Build a style chain, reset parent of original for security.
+                // Repeated style requests should only be issued from sub-Text nodes and I'm not 
+                // sure if in-between text nodes may build other chains (should not happen). But
+                // it's only a re-chaining with pointers (cheap), so allow to do it every time.
                 SvgStyleAttributes* pCurrent = const_cast< SvgStyleAttributes* >(&rOriginal);
+                pCurrent->setCssStyleParent(0);
 
                 for(sal_uInt32 a(0); a < maCssStyleVector.size(); a++)
                 {