[prev in list] [next in list] [prev in thread] [next in thread] 

List:       konq-bugs
Subject:    [Bug 170095] [testcase] Absolutely positioned boxes in inlines:
From:       Germain Garand <germain () ebooksfrance ! org>
Date:       2008-08-31 15:12:34
Message-ID: 20080831151234.12FF9D940 () immanuel ! kde ! org
[Download RAW message or body]

http://bugs.kde.org/show_bug.cgi?id=170095


Germain Garand germain ebooksfrance org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |germain@ebooksfrance.org
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |FIXED




--- Comment #2 from Germain Garand <germain ebooksfrance org>  2008-08-31 17:12:32 ---
SVN commit 855323 by ggarand:

properly compute width of containing block of inline elements
as per CSS 2.1 - 10.1.4.1

BUG: 170095


 M  +30 -12    render_box.cpp  
 M  +1 -1      render_box.h  
 M  +2 -2      render_object.cpp  
 M  +2 -2      render_object.h  


--- trunk/KDE/kdelibs/khtml/rendering/render_box.cpp #855322:855323
@@ -789,7 +789,7 @@
     setNeedsLayoutAndMinMaxRecalc();
 }

-short RenderBox::containingBlockWidth() const
+short RenderBox::containingBlockWidth(RenderObject* providedCB) const
 {
     if (isCanvas() && canvas()->view())
     {
@@ -799,18 +799,36 @@
             return canvas()->view()->visibleWidth();
     }

-    RenderBlock* cb = containingBlock();
+    RenderObject* cb = providedCB ? providedCB : containingBlock();
     if (isRenderBlock() && cb->isTable() &&
static_cast<RenderTable*>(cb)->caption() == this) {
         //captions are not affected by table border or padding
         return cb->width();
     }
-    if (isPositioned())
-        // cf. 10.1.4.2 - use padding edge
-        // ### FIXME: still wrong for inline CBs - 10.1.4.1
+    if (isPositioned()) {
+        // cf. 10.1.4 - use padding edge
+        if (cb->isInlineFlow()) {
+            // 10.1.4.1
+            int l, r;
+            InlineFlowBox* firstLineBox = static_cast<const
RenderFlow*>(cb)->firstLineBox();
+            InlineFlowBox* lastLineBox = static_cast<const
RenderFlow*>(cb)->lastLineBox();
+            if (!lastLineBox)
+                return 0;
+            if (cb->style()->direction() == RTL) {
+                l = lastLineBox->xPos() + lastLineBox->borderLeft();
+                r = firstLineBox->xPos() + firstLineBox->width() -
firstLineBox->borderRight();
+            } else {
+                l = firstLineBox->xPos() + firstLineBox->borderLeft();
+                r = lastLineBox->xPos() + lastLineBox->width() -
lastLineBox->borderRight();
+            }
+            return qMax(0, r-l);
+        }    
+        // 10.1.4.2
         return cb->contentWidth() + cb->paddingLeft() + cb->paddingRight();
-    else if (usesLineWidth())
-        return cb->lineWidth(m_y);
-    else
+    }
+    else if (usesLineWidth()) {
+        assert( cb->isRenderBlock() );
+        return static_cast<RenderBlock*>(cb)->lineWidth(m_y);
+    } else
         return cb->contentWidth();
 }

@@ -1466,9 +1484,9 @@

     // We don't use containingBlock(), since we may be positioned by an
enclosing
     // relative positioned inline.
-    const RenderObject* containerBlock = container();
+    RenderObject* containerBlock = container();

-    const int containerWidth = containingBlockWidth();
+    const int containerWidth = containingBlockWidth(containerBlock);

     // To match WinIE, in quirks mode use the parent's 'direction' property
     // instead of the the container block's.
@@ -1982,9 +2000,9 @@
     // the numbers correspond to numbers in spec)

     // We don't use containingBlock(), since we may be positioned by an
enclosing relpositioned inline.
-    const RenderObject* containerBlock = container();
+    RenderObject* containerBlock = container();

-    const int containerWidth = containingBlockWidth();
+    const int containerWidth = containingBlockWidth(containerBlock);

     // To match WinIE, in quirks mode use the parent's 'direction' property
     // instead of the the container block's.
--- trunk/KDE/kdelibs/khtml/rendering/render_box.h #855322:855323
@@ -96,7 +96,7 @@

     virtual void repaintRectangle(int x, int y, int w, int h, Priority
p=NormalPriority, bool f=false);

-    virtual short containingBlockWidth() const;
+    virtual short containingBlockWidth(RenderObject* providedCB=0) const;
     void relativePositionOffset(int &tx, int &ty) const;

     virtual void calcWidth();
--- trunk/KDE/kdelibs/khtml/rendering/render_object.cpp #855322:855323
@@ -788,13 +788,13 @@
     return static_cast<RenderBlock*>( o );
 }

-short RenderObject::containingBlockWidth() const
+short RenderObject::containingBlockWidth(RenderObject*) const
 {
     // ###
     return containingBlock()->contentWidth();
 }

-int RenderObject::containingBlockHeight() const
+int RenderObject::containingBlockHeight(RenderObject*) const
 {
     // ###
     return containingBlock()->contentHeight();
--- trunk/KDE/kdelibs/khtml/rendering/render_object.h #855322:855323
@@ -567,9 +567,9 @@
     RenderBlock *containingBlock() const;

     // return just the width of the containing block
-    virtual short containingBlockWidth() const;
+    virtual short containingBlockWidth(RenderObject* providedCB=0) const;
     // return just the height of the containing block
-    virtual int containingBlockHeight() const;
+    virtual int containingBlockHeight(RenderObject* providedCB=0) const;

     // size of the content area (box size minus padding/border)
     virtual short contentWidth() const { return 0; }


-- 
Configure bugmail: http://bugs.kde.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
_______________________________________________
Konq-bugs mailing list
Konq-bugs@mail.kde.org
https://mail.kde.org/mailman/listinfo/konq-bugs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic