[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

hyatt hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:04:06 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 9055e44f1c77a5a457f60ef03acc3d30d14b7423
Author: hyatt <hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Oct 21 22:14:37 2003 +0000

    	Change pseudo-element style resolution to be lazy and to not occur until the style is actually asked
    	for by the front end render objects.  Also fix first-letter to inherit properly from first-line styles.
    
            Reviewed by mjs
    
            * khtml/css/cssstyleselector.cpp:
            (khtml::CSSStyleSelector::initForStyleResolve):
            (khtml::CSSStyleSelector::styleForElement):
            (khtml::CSSStyleSelector::pseudoStyleForElement):
            (khtml::CSSStyleSelector::checkSelector):
            (khtml::CSSStyleSelector::checkOneSelector):
            * khtml/css/cssstyleselector.h:
            * khtml/rendering/render_block.cpp:
            (khtml::RenderBlock::addChildToFlow):
            * khtml/rendering/render_container.cpp:
            (RenderContainer::updatePseudoChild):
            * khtml/rendering/render_object.cpp:
            (RenderObject::setStyle):
            (RenderObject::createInlineBox):
            (RenderObject::style):
            (RenderObject::getPseudoStyle):
            * khtml/rendering/render_object.h:
            * khtml/rendering/render_style.cpp:
            (pseudoBit):
            (RenderStyle::hasPseudoStyle):
            (RenderStyle::setHasPseudoStyle):
            (RenderStyle::getPseudoStyle):
            (RenderStyle::addPseudoStyle):
            * khtml/rendering/render_style.h:
            (khtml::RenderStyle::NonInheritedFlags::operator==):
            (khtml::RenderStyle::setBitDefaults):
            * khtml/rendering/render_text.cpp:
            (InlineTextBox::paintSelection):
            (RenderText::paintObject):
            (RenderText::htmlFont):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@5234 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index a0512ba..459cfca 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,41 @@
+2003-10-21  David Hyatt  <hyatt at apple.com>
+
+	Change pseudo-element style resolution to be lazy and to not occur until the style is actually asked
+	for by the front end render objects.  Also fix first-letter to inherit properly from first-line styles.
+	
+        Reviewed by mjs
+
+        * khtml/css/cssstyleselector.cpp:
+        (khtml::CSSStyleSelector::initForStyleResolve):
+        (khtml::CSSStyleSelector::styleForElement):
+        (khtml::CSSStyleSelector::pseudoStyleForElement):
+        (khtml::CSSStyleSelector::checkSelector):
+        (khtml::CSSStyleSelector::checkOneSelector):
+        * khtml/css/cssstyleselector.h:
+        * khtml/rendering/render_block.cpp:
+        (khtml::RenderBlock::addChildToFlow):
+        * khtml/rendering/render_container.cpp:
+        (RenderContainer::updatePseudoChild):
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::setStyle):
+        (RenderObject::createInlineBox):
+        (RenderObject::style):
+        (RenderObject::getPseudoStyle):
+        * khtml/rendering/render_object.h:
+        * khtml/rendering/render_style.cpp:
+        (pseudoBit):
+        (RenderStyle::hasPseudoStyle):
+        (RenderStyle::setHasPseudoStyle):
+        (RenderStyle::getPseudoStyle):
+        (RenderStyle::addPseudoStyle):
+        * khtml/rendering/render_style.h:
+        (khtml::RenderStyle::NonInheritedFlags::operator==):
+        (khtml::RenderStyle::setBitDefaults):
+        * khtml/rendering/render_text.cpp:
+        (InlineTextBox::paintSelection):
+        (RenderText::paintObject):
+        (RenderText::htmlFont):
+
 2003-10-21  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Dave.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index a0512ba..459cfca 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,41 @@
+2003-10-21  David Hyatt  <hyatt at apple.com>
+
+	Change pseudo-element style resolution to be lazy and to not occur until the style is actually asked
+	for by the front end render objects.  Also fix first-letter to inherit properly from first-line styles.
+	
+        Reviewed by mjs
+
+        * khtml/css/cssstyleselector.cpp:
+        (khtml::CSSStyleSelector::initForStyleResolve):
+        (khtml::CSSStyleSelector::styleForElement):
+        (khtml::CSSStyleSelector::pseudoStyleForElement):
+        (khtml::CSSStyleSelector::checkSelector):
+        (khtml::CSSStyleSelector::checkOneSelector):
+        * khtml/css/cssstyleselector.h:
+        * khtml/rendering/render_block.cpp:
+        (khtml::RenderBlock::addChildToFlow):
+        * khtml/rendering/render_container.cpp:
+        (RenderContainer::updatePseudoChild):
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::setStyle):
+        (RenderObject::createInlineBox):
+        (RenderObject::style):
+        (RenderObject::getPseudoStyle):
+        * khtml/rendering/render_object.h:
+        * khtml/rendering/render_style.cpp:
+        (pseudoBit):
+        (RenderStyle::hasPseudoStyle):
+        (RenderStyle::setHasPseudoStyle):
+        (RenderStyle::getPseudoStyle):
+        (RenderStyle::addPseudoStyle):
+        * khtml/rendering/render_style.h:
+        (khtml::RenderStyle::NonInheritedFlags::operator==):
+        (khtml::RenderStyle::setBitDefaults):
+        * khtml/rendering/render_text.cpp:
+        (InlineTextBox::paintSelection):
+        (RenderText::paintObject):
+        (RenderText::htmlFont):
+
 2003-10-21  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Dave.
diff --git a/WebCore/khtml/css/cssstyleselector.cpp b/WebCore/khtml/css/cssstyleselector.cpp
index 85e4819..26691d3 100644
--- a/WebCore/khtml/css/cssstyleselector.cpp
+++ b/WebCore/khtml/css/cssstyleselector.cpp
@@ -308,29 +308,39 @@ static inline void bubbleSort( CSSOrderedProperty **b, CSSOrderedProperty **e )
     }
 }
 
-RenderStyle *CSSStyleSelector::styleForElement(ElementImpl *e)
+void CSSStyleSelector::initForStyleResolve(ElementImpl* e, RenderStyle* defaultParent)
 {
-    if (!e->getDocument()->haveStylesheetsLoaded()) {
-        if (!styleNotYetAvailable) {
-            styleNotYetAvailable = new RenderStyle();
-            styleNotYetAvailable->setDisplay(NONE);
-            styleNotYetAvailable->ref();
-        }
-        return styleNotYetAvailable;
-    }
-  
     // set some variables we will need
     ::encodedurl = &encodedurl;
     pseudoState = PseudoUnknown;
-
+    
     element = e;
     parentNode = e->parentNode();
-    parentStyle = ( parentNode && parentNode->renderer()) ? parentNode->renderer()->style() : 0;
+    if (defaultParent)
+        parentStyle = defaultParent;
+    else
+        parentStyle = (parentNode && parentNode->renderer()) ? parentNode->renderer()->style() : 0;
     view = element->getDocument()->view();
     isXMLDoc = !element->getDocument()->isHTMLDocument();
     part = view->part();
     settings = part->settings();
     paintDeviceMetrics = element->getDocument()->paintDeviceMetrics();
+    
+    style = 0;
+}
+
+RenderStyle* CSSStyleSelector::styleForElement(ElementImpl* e, RenderStyle* defaultParent)
+{
+    if (!e->getDocument()->haveStylesheetsLoaded()) {
+        if (!styleNotYetAvailable) {
+            styleNotYetAvailable = new RenderStyle();
+            styleNotYetAvailable->setDisplay(NONE);
+            styleNotYetAvailable->ref();
+        }
+        return styleNotYetAvailable;
+    }
+    
+    initForStyleResolve(e, defaultParent);
 
     style = new RenderStyle();
     if( parentStyle )
@@ -339,8 +349,7 @@ RenderStyle *CSSStyleSelector::styleForElement(ElementImpl *e)
         parentStyle = style;
     
     unsigned int numPropsToApply = 0;
-    unsigned int numPseudoProps = 0;
-
+    
     // try to sort out most style rules as early as possible.
     // ### implement CSS3 namespace support
     int cssTagId = (e->id() & NodeImpl::IdLocalMask);
@@ -366,17 +375,9 @@ RenderStyle *CSSStyleSelector::styleForElement(ElementImpl *e)
 			}
 			propsToApply[numPropsToApply++] = properties[selectorCache[i].props[p]+j];
 		    }
-	    } else if ( selectorCache[i].state == AppliesPseudo ) {
-		for ( unsigned int p = 0; p < selectorCache[i].props_size; p += 2 )
-		    for ( unsigned int j = 0; j < (unsigned int) selectorCache[i].props[p+1]; ++j ) {
-                        if (numPseudoProps >= pseudoPropsSize ) {
-                            pseudoPropsSize *= 2;
-			    pseudoProps = (CSSOrderedProperty **)realloc( pseudoProps, pseudoPropsSize*sizeof( CSSOrderedProperty * ) );
-			}
-			pseudoProps[numPseudoProps++] = properties[selectorCache[i].props[p]+j];
-			properties[selectorCache[i].props[p]+j]->pseudoId = (RenderStyle::PseudoId) selectors[i]->pseudoId;
-		    }
 	    }
+            else if (selectorCache[i].state == AppliesPseudo)
+                style->setHasPseudoStyle((RenderStyle::PseudoId)selectors[i]->pseudoId);
 	}
 	else
 	    selectorCache[i].state = Invalid;
@@ -392,8 +393,7 @@ RenderStyle *CSSStyleSelector::styleForElement(ElementImpl *e)
     numPropsToApply = addInlineDeclarations( e, e->m_styleDecls, numPropsToApply );
             
     bubbleSort( propsToApply, propsToApply+numPropsToApply-1 );
-    bubbleSort( pseudoProps, pseudoProps+numPseudoProps-1 );
-
+    
     //qDebug("applying properties, count=%d", propsToApply->count() );
 
     // we can't apply style rules without a view() and a part. This
@@ -422,63 +422,100 @@ RenderStyle *CSSStyleSelector::styleForElement(ElementImpl *e)
 
         // Clean up our style object's display and text decorations (among other fixups).
         adjustRenderStyle(style, e);
+    }
+
+    // Now return the style.
+    return style;
+}
+
+RenderStyle* CSSStyleSelector::pseudoStyleForElement(RenderStyle::PseudoId pseudoStyle, 
+                                                     ElementImpl* e, RenderStyle* parentStyle)
+{
+    if (!e)
+        return 0;
+    
+    if (!e->getDocument()->haveStylesheetsLoaded()) {
+        if (!styleNotYetAvailable) {
+            styleNotYetAvailable = new RenderStyle();
+            styleNotYetAvailable->setDisplay(NONE);
+            styleNotYetAvailable->ref();
+        }
+        return styleNotYetAvailable;
+    }
+    
+    initForStyleResolve(e, parentStyle);
+    
+    unsigned int numPseudoProps = 0;
+    
+    // try to sort out most style rules as early as possible.
+    // ### implement CSS3 namespace support
+    int cssTagId = (e->id() & NodeImpl::IdLocalMask);
+    int schecked = 0;
+    
+    for ( unsigned int i = 0; i < selectors_size; i++ ) {
+        int tag = selectors[i]->tag;
+        if ( cssTagId == tag || tag == -1 ) {
+            ++schecked;
+            
+            checkSelector( i, e, pseudoStyle );
+            
+            if ( selectorCache[i].state == AppliesPseudo ) {
+                for ( unsigned int p = 0; p < selectorCache[i].props_size; p += 2 )
+                    for ( unsigned int j = 0; j < (unsigned int) selectorCache[i].props[p+1]; ++j ) {
+                        if (numPseudoProps >= pseudoPropsSize ) {
+                            pseudoPropsSize *= 2;
+                            pseudoProps = (CSSOrderedProperty **)realloc( pseudoProps, pseudoPropsSize*sizeof( CSSOrderedProperty * ) );
+                        }
+                        pseudoProps[numPseudoProps++] = properties[selectorCache[i].props[p]+j];
+                        properties[selectorCache[i].props[p]+j]->pseudoId = (RenderStyle::PseudoId) selectors[i]->pseudoId;
+                    }
+            }
+        }
+        else
+            selectorCache[i].state = Invalid;
+    }
+    
+    if (numPseudoProps == 0)
+        return 0;
+    
+    style = new RenderStyle();
+    if( parentStyle )
+        style->inheritFrom( parentStyle );
+    else
+        parentStyle = style;
+    style->noninherited_flags._styleType = pseudoStyle;
+        
+    bubbleSort( pseudoProps, pseudoProps+numPseudoProps-1 );
         
+    // we can't apply style rules without a view() and a part. This
+    // tends to happen on delayed destruction of widget Renderobjects
+    if ( part ) {
+        fontDirty = false;
         if ( numPseudoProps ) {
-	    fontDirty = false;
+            fontDirty = false;
             //qDebug("%d applying %d pseudo props", e->cssTagId(), pseudoProps->count() );
             for (unsigned int i = 0; i < numPseudoProps; ++i) {
-		if ( fontDirty && pseudoProps[i]->priority >= (1 << 30) ) {
-		    // we are past the font properties, time to update to the
-		    // correct font
-		    //We have to do this for all pseudo styles
-		    RenderStyle *pseudoStyle = style->pseudoStyle;
-		    while ( pseudoStyle ) {
-                        checkForGenericFamilyChange(pseudoStyle, style);
-			pseudoStyle->htmlFont().update( paintDeviceMetrics );
-			pseudoStyle = pseudoStyle->pseudoStyle;
-		    }
-		    fontDirty = false;
-		}
-
-                RenderStyle *pseudoStyle;
-                pseudoStyle = style->getPseudoStyle(pseudoProps[i]->pseudoId);
-                if (!pseudoStyle)
-                {
-                    pseudoStyle = style->addPseudoStyle(pseudoProps[i]->pseudoId);
-                    if (pseudoStyle)
-                        pseudoStyle->inheritFrom( style );
-                }
-
-                RenderStyle* oldStyle = style;
-                RenderStyle* oldParentStyle = parentStyle;
-                parentStyle = style;
-                style = pseudoStyle;
-                if ( pseudoStyle ) {
-                    DOM::CSSProperty *prop = pseudoProps[i]->prop;
-                    applyRule( prop->m_id, prop->value() );
+                if ( fontDirty && pseudoProps[i]->priority >= (1 << 30) ) {
+                    // we are past the font properties, time to update to the
+                    // correct font
+                    style->htmlFont().update( paintDeviceMetrics );
+                    fontDirty = false;
                 }
-                style = oldStyle;
-                parentStyle = oldParentStyle;
+                
+               DOM::CSSProperty *prop = pseudoProps[i]->prop;
+               applyRule( prop->m_id, prop->value() );
+            }
+            
+            if ( fontDirty ) {
+                checkForGenericFamilyChange(style, parentStyle);
+                style->htmlFont().update( paintDeviceMetrics );
             }
-
-	    if ( fontDirty ) {
-		RenderStyle *pseudoStyle = style->pseudoStyle;
-		while ( pseudoStyle ) {
-                    checkForGenericFamilyChange(pseudoStyle, style);
-		    pseudoStyle->htmlFont().update( paintDeviceMetrics );
-		    pseudoStyle = pseudoStyle->pseudoStyle;
-		}
-	    }
         }
     }
-
-    // Now adjust all our pseudo-styles.
-    RenderStyle *pseudoStyle = style->pseudoStyle;
-    while (pseudoStyle) {
-        adjustRenderStyle(pseudoStyle, 0);
-        pseudoStyle = pseudoStyle->pseudoStyle;
-    }
-
+    
+    // Do the post-resolve fixups on the style.
+    adjustRenderStyle(style, 0);
+        
     // Now return the style.
     return style;
 }
@@ -685,7 +722,7 @@ static void checkPseudoState( DOM::ElementImpl *e )
     pseudoState = KHTMLFactory::vLinks()->contains( u ) ? PseudoVisited : PseudoLink;
 }
 
-void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
+void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e, RenderStyle::PseudoId pseudo)
 {
     dynamicPseudo = RenderStyle::NOPSEUDO;
     
@@ -704,8 +741,9 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
                             (sel->match == CSSSelector::Pseudo &&
                               (sel->pseudoType() == CSSSelector::PseudoHover ||
                                sel->pseudoType() == CSSSelector::PseudoActive)));
-    bool affectedByHover = style->affectedByHoverRules();
-    bool affectedByActive = style->affectedByActiveRules();
+    bool affectedByHover = style ? style->affectedByHoverRules() : false;
+    bool affectedByActive = style ? style->affectedByActiveRules() : false;
+    bool havePseudo = pseudo != RenderStyle::NOPSEUDO;
     
     // first selector has to match
     if(!checkOneSelector(sel, e)) return;
@@ -715,6 +753,12 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
     while((sel = sel->tagHistory))
     {
         if (!n->isElementNode()) return;
+        if (relation != CSSSelector::SubSelector) {
+            subject = false;
+            if (havePseudo && dynamicPseudo != pseudo)
+                return;
+        }
+        
         switch(relation)
         {
         case CSSSelector::Descendant:
@@ -722,8 +766,7 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
             bool found = false;
             while(!found)
             {
-		subject = false;
-                n = n->parentNode();
+		n = n->parentNode();
                 if(!n || !n->isElementNode()) return;
                 ElementImpl *elem = static_cast<ElementImpl *>(n);
                 if(checkOneSelector(sel, elem)) found = true;
@@ -732,7 +775,6 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
         }
         case CSSSelector::Child:
         {
-            subject = false;
             n = n->parentNode();
             if (!strictParsing)
                 while (n && n->implicitNode()) n = n->parentNode();
@@ -743,7 +785,6 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
         }
         case CSSSelector::Sibling:
         {
-            subject = false;
             n = n->previousSibling();
 	    while( n && !n->isElementNode() )
 		n = n->previousSibling();
@@ -773,6 +814,9 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
         relation = sel->relation;
     }
 
+    if (subject && havePseudo && dynamicPseudo != pseudo)
+        return;
+    
     // disallow *:hover, *:active, and *:hover:active except for links
     if (onlyHoverActive && subject) {
         if (pseudoState == PseudoUnknown)
@@ -799,7 +843,6 @@ void CSSStyleSelector::checkSelector(int selIndex, DOM::ElementImpl *e)
 
 bool CSSStyleSelector::checkOneSelector(DOM::CSSSelector *sel, DOM::ElementImpl *e)
 {
-
     if(!e)
         return false;
 
@@ -985,7 +1028,7 @@ bool CSSStyleSelector::checkOneSelector(DOM::CSSSelector *sel, DOM::ElementImpl
                 // If we're in quirks mode, then hover should never match anchors with no
                 // href.  This is important for sites like wsj.com.
                 if (strictParsing || e->id() != ID_A || e->hasAnchor()) {
-                    if (element == e)
+                    if (element == e && style)
                         style->setAffectedByHoverRules(true);
                     if (e->renderer()) {
                         if (element != e)
@@ -1005,7 +1048,7 @@ bool CSSStyleSelector::checkOneSelector(DOM::CSSSelector *sel, DOM::ElementImpl
                 // If we're in quirks mode, then :active should never match anchors with no
                 // href. 
                 if (strictParsing || e->id() != ID_A || e->hasAnchor()) {
-                    if (element == e)
+                    if (element == e && style)
                         style->setAffectedByActiveRules(true);
                     else if (e->renderer())
                         e->renderer()->style()->setAffectedByActiveRules(true);
diff --git a/WebCore/khtml/css/cssstyleselector.h b/WebCore/khtml/css/cssstyleselector.h
index 54a3f34..c61061c 100644
--- a/WebCore/khtml/css/cssstyleselector.h
+++ b/WebCore/khtml/css/cssstyleselector.h
@@ -125,8 +125,11 @@ namespace khtml
 	static void loadDefaultStyle(const KHTMLSettings *s = 0);
 	static void clear();
 
-	RenderStyle *styleForElement(DOM::ElementImpl *e);
-
+        void initForStyleResolve(DOM::ElementImpl* e, RenderStyle* parentStyle);
+	RenderStyle *styleForElement(DOM::ElementImpl* e, RenderStyle* parentStyle=0);
+        RenderStyle* pseudoStyleForElement(RenderStyle::PseudoId pseudoStyle, 
+                                           DOM::ElementImpl* e, RenderStyle* parentStyle=0);
+        
         QValueList<int> fontSizes() const { return m_fontSizes; }
 	
 	bool strictParsing;
@@ -144,7 +147,8 @@ namespace khtml
 
 	/* checks if the complete selector (which can be build up from a few CSSSelector's
 	    with given relationships matches the given Element */
-	void checkSelector(int selector, DOM::ElementImpl *e);
+        void checkSelector(int selector, DOM::ElementImpl *e, 
+                           RenderStyle::PseudoId pseudo = RenderStyle::NOPSEUDO);
 	/* checks if the selector matches the given Element */
 	bool checkOneSelector(DOM::CSSSelector *selector, DOM::ElementImpl *e);
 
diff --git a/WebCore/khtml/rendering/render_block.cpp b/WebCore/khtml/rendering/render_block.cpp
index 3132596..70c1988 100644
--- a/WebCore/khtml/rendering/render_block.cpp
+++ b/WebCore/khtml/rendering/render_block.cpp
@@ -103,8 +103,8 @@ void RenderBlock::addChildToFlow(RenderObject* newChild, RenderObject* beforeChi
 
     RenderStyle* pseudoStyle=0;
     if ((!firstChild() || firstChild() == beforeChild) &&
-         (newChild->isInline() || newChild->isText()) &&
-         (pseudoStyle=style()->getPseudoStyle(RenderStyle::FIRST_LETTER)))
+         (newChild->isInline() || (newChild->isText() && !newChild->isBR())) &&
+         (pseudoStyle=getPseudoStyle(RenderStyle::FIRST_LETTER, style(true))))
     {
         // Drill into inlines looking for our first text child.
         RenderObject* textChild = newChild;
diff --git a/WebCore/khtml/rendering/render_container.cpp b/WebCore/khtml/rendering/render_container.cpp
index 8684ca9..0076e64 100644
--- a/WebCore/khtml/rendering/render_container.cpp
+++ b/WebCore/khtml/rendering/render_container.cpp
@@ -215,7 +215,7 @@ void RenderContainer::updatePseudoChild(RenderStyle::PseudoId type, RenderObject
     if (style()->styleType() == RenderStyle::BEFORE || style()->styleType() == RenderStyle::AFTER)
         return;
     
-    RenderStyle* pseudo = style()->getPseudoStyle(type);
+    RenderStyle* pseudo = getPseudoStyle(type);
 
     // Whether or not we currently have generated content attached.
     bool oldContentPresent = child && (child->style()->styleType() == type);
diff --git a/WebCore/khtml/rendering/render_object.cpp b/WebCore/khtml/rendering/render_object.cpp
index 2cbf297..2858235 100644
--- a/WebCore/khtml/rendering/render_object.cpp
+++ b/WebCore/khtml/rendering/render_object.cpp
@@ -29,6 +29,7 @@
 #include "rendering/render_canvas.h"
 #include "xml/dom_elementimpl.h"
 #include "xml/dom_docimpl.h"
+#include "css/cssstyleselector.h"
 #include "misc/htmlhashes.h"
 #include <kdebug.h>
 #include <qpainter.h>
@@ -1209,7 +1210,7 @@ void RenderObject::setStyle(RenderStyle *style)
 
     setShouldPaintBackgroundOrBorder(m_style->backgroundColor().isValid() || 
                                      m_style->hasBorder() || nb );
-    m_hasFirstLine = (style->getPseudoStyle(RenderStyle::FIRST_LINE) != 0);
+    m_hasFirstLine = getPseudoStyle(RenderStyle::FIRST_LINE);
 
     if (affectsParentBlock)
         handleDynamicFloatPositionChange();
@@ -1746,6 +1747,32 @@ InlineBox* RenderObject::createInlineBox(bool,bool isRootLineBox)
     return new (renderArena()) InlineBox(this);
 }
 
+RenderStyle* RenderObject::style(bool firstLine) const {
+    RenderStyle *s = m_style;
+    if (firstLine && hasFirstLine()) {
+        RenderStyle *pseudoStyle  = getPseudoStyle(RenderStyle::FIRST_LINE);
+        if (pseudoStyle)
+            s = pseudoStyle;
+    }
+    return s;
+}
+
+RenderStyle* RenderObject::getPseudoStyle(RenderStyle::PseudoId pseudo, RenderStyle* parentStyle) const
+{
+    if (!style()->hasPseudoStyle(pseudo))
+        return 0;
+    
+    DOM::NodeImpl* node = element();
+    if (isText())
+        node = element()->parentNode();
+    if (!node) return 0;
+    
+    if (!parentStyle)
+        parentStyle = style();
+    
+    return document()->styleSelector()->pseudoStyleForElement(pseudo, static_cast<DOM::ElementImpl*>(node), parentStyle);
+}
+
 void RenderObject::getTextDecorationColors(int decorations, QColor& underline, QColor& overline,
                                            QColor& linethrough, bool quirksMode)
 {
diff --git a/WebCore/khtml/rendering/render_object.h b/WebCore/khtml/rendering/render_object.h
index 8d4f55c..5ca4a57 100644
--- a/WebCore/khtml/rendering/render_object.h
+++ b/WebCore/khtml/rendering/render_object.h
@@ -253,6 +253,8 @@ public:
     bool isSelectionBorder() const { return m_isSelectionBorder; }
     bool recalcMinMax() const { return m_recalcMinMax; }
 
+    RenderStyle* getPseudoStyle(RenderStyle::PseudoId pseudo, RenderStyle* parentStyle = 0) const;
+    
     RenderCanvas* canvas() const;
 
     // don't even think about making this method virtual!
@@ -558,15 +560,7 @@ public:
     virtual short maxWidth() const { return 0; }
 
     RenderStyle* style() const { return m_style; }
-    RenderStyle* style( bool firstLine ) const {
-	RenderStyle *s = m_style;
-	if( firstLine && hasFirstLine() ) {
-	    RenderStyle *pseudoStyle  = style()->getPseudoStyle(RenderStyle::FIRST_LINE);
-	    if ( pseudoStyle )
-		s = pseudoStyle;
-	}
-	return s;
-    }
+    RenderStyle* style( bool firstLine ) const;
 
     void getTextDecorationColors(int decorations, QColor& underline, QColor& overline,
                                  QColor& linethrough, bool quirksMode=false);
diff --git a/WebCore/khtml/rendering/render_style.cpp b/WebCore/khtml/rendering/render_style.cpp
index 9f55d77..67039a7 100644
--- a/WebCore/khtml/rendering/render_style.cpp
+++ b/WebCore/khtml/rendering/render_style.cpp
@@ -332,36 +332,59 @@ bool RenderStyle::isStyleAvailable() const
     return this != CSSStyleSelector::styleNotYetAvailable;
 }
 
+enum EPseudoBit { NO_BIT = 0x0, BEFORE_BIT = 0x1, AFTER_BIT = 0x2, FIRST_LINE_BIT = 0x4,
+                  FIRST_LETTER_BIT = 0x8, SELECTION_BIT = 0x10 };
+
+static int pseudoBit(RenderStyle::PseudoId pseudo)
+{
+    switch (pseudo) {
+        case RenderStyle::BEFORE:
+            return BEFORE_BIT;
+        case RenderStyle::AFTER:
+            return AFTER_BIT;
+        case RenderStyle::FIRST_LINE:
+            return FIRST_LINE_BIT;
+        case RenderStyle::FIRST_LETTER:
+            return FIRST_LETTER_BIT;
+        case RenderStyle::SELECTION:
+            return SELECTION_BIT;
+        default:
+            return NO_BIT;
+    }
+}
+
+bool RenderStyle::hasPseudoStyle(PseudoId pseudo) const
+{
+    return (pseudoBit(pseudo) & noninherited_flags._pseudoBits) != 0;
+}
+
+void RenderStyle::setHasPseudoStyle(PseudoId pseudo)
+{
+    noninherited_flags._pseudoBits |= pseudoBit(pseudo);
+}
+
 RenderStyle* RenderStyle::getPseudoStyle(PseudoId pid)
 {
     RenderStyle *ps = 0;
     if (noninherited_flags._styleType==NOPSEUDO) {
 	ps = pseudoStyle;
-    while (ps) {
-        if (ps->noninherited_flags._styleType==pid)
-		break;
-
-        ps = ps->pseudoStyle;
-    }
+        while (ps) {
+            if (ps->noninherited_flags._styleType==pid)
+                    break;
+    
+            ps = ps->pseudoStyle;
+        }
     }
     return ps;
 }
 
-RenderStyle* RenderStyle::addPseudoStyle(PseudoId pid)
+void RenderStyle::addPseudoStyle(RenderStyle* pseudo)
 {
-    RenderStyle *ps = getPseudoStyle(pid);
-
-    if (!ps)
-    {
-        ps = new RenderStyle(); // So that noninherited flags are reset.
-        ps->ref();
-        ps->noninherited_flags._styleType = pid;
-        ps->pseudoStyle = pseudoStyle;
-
-        pseudoStyle = ps;
-    }
-
-    return ps;
+    if (!pseudo) return;
+    
+    pseudo->ref();
+    pseudo->pseudoStyle = pseudoStyle;
+    pseudoStyle = pseudo;
 }
 
 void RenderStyle::removePseudoStyle(PseudoId pid)
diff --git a/WebCore/khtml/rendering/render_style.h b/WebCore/khtml/rendering/render_style.h
index 41ebb6a..a5235e5 100644
--- a/WebCore/khtml/rendering/render_style.h
+++ b/WebCore/khtml/rendering/render_style.h
@@ -685,6 +685,7 @@ protected:
             (_styleType == other._styleType) &&
             (_affectedByHover == other._affectedByHover) &&
             (_affectedByActive == other._affectedByActive) &&
+            (_pseudoBits == other._pseudoBits) &&
             (_unicodeBidi == other._unicodeBidi);
 	}
 
@@ -707,6 +708,7 @@ protected:
         PseudoId _styleType : 3;
         bool _affectedByHover : 1;
         bool _affectedByActive : 1;
+        int _pseudoBits : 5;
         EUnicodeBidi _unicodeBidi : 2;
     } noninherited_flags;
 
@@ -723,7 +725,7 @@ protected:
     
 // list of associated pseudo styles
     RenderStyle* pseudoStyle;
-
+    
     // added this here, so we can get rid of the vptr in this class.
     // makes up for the same size.
     ContentData *content;
@@ -766,6 +768,7 @@ protected:
 	noninherited_flags._styleType = NOPSEUDO;
         noninherited_flags._affectedByHover = false;
         noninherited_flags._affectedByActive = false;
+        noninherited_flags._pseudoBits = 0;
 	noninherited_flags._unicodeBidi = UBNormal;
     }
 
@@ -783,8 +786,7 @@ public:
     PseudoId styleType() { return  noninherited_flags._styleType; }
 
     RenderStyle* getPseudoStyle(PseudoId pi);
-    RenderStyle* addPseudoStyle(PseudoId pi);
-    bool hasPseudoStyle() const { return pseudoStyle; }
+    void addPseudoStyle(RenderStyle* pseudo);
     void removePseudoStyle(PseudoId pi);
 
     bool affectedByHoverRules() const { return  noninherited_flags._affectedByHover; }
@@ -804,6 +806,9 @@ public:
 
     bool isStyleAvailable() const;
     
+    bool hasPseudoStyle(PseudoId pseudo) const;
+    void setHasPseudoStyle(PseudoId pseudo);
+    
 // attribute getter methods
 
     EDisplay 	display() const { return noninherited_flags._effectiveDisplay; }
diff --git a/WebCore/khtml/rendering/render_text.cpp b/WebCore/khtml/rendering/render_text.cpp
index b922a9b..0da5ee0 100644
--- a/WebCore/khtml/rendering/render_text.cpp
+++ b/WebCore/khtml/rendering/render_text.cpp
@@ -86,7 +86,7 @@ void InlineTextBox::paintSelection(const Font *f, RenderText *text, QPainter *p,
     if (textColor == c)
         c = QColor(0xff - c.red(), 0xff - c.green(), 0xff - c.blue());
 
-    RenderStyle* pseudoStyle = object()->style()->getPseudoStyle(RenderStyle::SELECTION);
+    RenderStyle* pseudoStyle = object()->getPseudoStyle(RenderStyle::SELECTION);
     if (pseudoStyle && pseudoStyle->backgroundColor().isValid())
         c = pseudoStyle->backgroundColor();
     p->setPen(c); // Don't draw text at all!
@@ -577,7 +577,7 @@ void RenderText::paintObject(QPainter *p, int /*x*/, int y, int /*w*/, int h,
                              int tx, int ty, PaintAction paintAction)
 {
     int ow = style()->outlineWidth();
-    RenderStyle* pseudoStyle = style()->getPseudoStyle(RenderStyle::FIRST_LINE);
+    RenderStyle* pseudoStyle = hasFirstLine() ? getPseudoStyle(RenderStyle::FIRST_LINE) : 0;
     int d = style()->textDecorationsInEffect();
     InlineTextBox f(0, y-ty);
     int si = m_lines.findFirstMatching(&f);
@@ -701,7 +701,7 @@ void RenderText::paintObject(QPainter *p, int /*x*/, int y, int /*w*/, int h,
                 QColor selectionColor = p->pen().color();
                 ShadowData* selectionTextShadow = 0;
                 if (haveSelection) {
-                    RenderStyle* pseudoStyle = style()->getPseudoStyle(RenderStyle::SELECTION);
+                    RenderStyle* pseudoStyle = getPseudoStyle(RenderStyle::SELECTION);
                     if (pseudoStyle) {
                         if (pseudoStyle->color() != selectionColor || pseudoStyle->textShadow()) {
                             if (!paintSelectedTextOnly)
@@ -1338,7 +1338,7 @@ const Font *RenderText::htmlFont(bool firstLine) const
 {
     const Font *f = 0;
     if( firstLine && hasFirstLine() ) {
-	RenderStyle *pseudoStyle  = style()->getPseudoStyle(RenderStyle::FIRST_LINE);
+        RenderStyle* pseudoStyle = getPseudoStyle(RenderStyle::FIRST_LINE);
 	if ( pseudoStyle )
 	    f = &pseudoStyle->htmlFont();
     } else {

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list