Fix for 3558334.
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Aug 2004 03:22:52 +0000 (03:22 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Aug 2004 03:22:52 +0000 (03:22 +0000)
Init the encodedURL explicitly for CSSStyleSelectors.  Construction time was too early to be passing in the
document m_url, since it doesn't get set during construction.

Fix for 3769643, crash on vancouverblast.org.

        Reviewed by darin

        * khtml/css/cssstyleselector.cpp:
        (khtml::CSSStyleSelector::CSSStyleSelector):
        (khtml::CSSStyleSelector::init):
        (khtml::CSSStyleSelector::setEncodedURL):
        * khtml/css/cssstyleselector.h:
        * khtml/xml/dom_docimpl.cpp:
        (DocumentImpl::DocumentImpl):
        (DocumentImpl::setURL):
        (DocumentImpl::recalcStyleSelector):
        * khtml/xml/dom_docimpl.h:
        (DOM::DocumentImpl::URL):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7332 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/cssstyleselector.cpp
WebCore/khtml/css/cssstyleselector.h
WebCore/khtml/rendering/render_canvas.h
WebCore/khtml/rendering/render_object.cpp
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h

index 2c1b6b6cb2897f216309ec0457448f35fa273e9e..144639b80e27bed41617b24a903395913b408e9e 100644 (file)
@@ -1,3 +1,26 @@
+2004-08-23  David Hyatt  <hyatt@apple.com>
+
+       Fix for 3558334. 
+
+       Init the encodedURL explicitly for CSSStyleSelectors.  Construction time was too early to be passing in the
+       document m_url, since it doesn't get set during construction.
+
+       Fix for 3769643, crash on vancouverblast.org.
+       
+        Reviewed by darin
+
+        * khtml/css/cssstyleselector.cpp:
+        (khtml::CSSStyleSelector::CSSStyleSelector):
+        (khtml::CSSStyleSelector::init):
+        (khtml::CSSStyleSelector::setEncodedURL):
+        * khtml/css/cssstyleselector.h:
+        * khtml/xml/dom_docimpl.cpp:
+        (DocumentImpl::DocumentImpl):
+        (DocumentImpl::setURL):
+        (DocumentImpl::recalcStyleSelector):
+        * khtml/xml/dom_docimpl.h:
+        (DOM::DocumentImpl::URL):
+
 2004-08-23  Kevin Decker  <kdecker@apple.com>
 
         Reviewed by Maciej.
index 14a88251d471b7da5ae1f8e02cb71666cba7375f..53a02aa5135f8724205281e678c7a932747e1a12 100644 (file)
@@ -126,7 +126,7 @@ static CSSStyleSelector::Encodedurl *encodedurl = 0;
 static PseudoState pseudoState;
 
 CSSStyleSelector::CSSStyleSelector( DocumentImpl* doc, QString userStyleSheet, StyleSheetListImpl *styleSheets,
-                                    const KURL &url, bool _strictParsing )
+                                    bool _strictParsing )
 {
     init();
 
@@ -159,22 +159,6 @@ CSSStyleSelector::CSSStyleSelector( DocumentImpl* doc, QString userStyleSheet, S
 
     //kdDebug( 6080 ) << "number of style sheets in document " << authorStyleSheets.count() << endl;
     //kdDebug( 6080 ) << "CSSStyleSelector: author style has " << authorStyle->count() << " elements"<< endl;
-
-    KURL u = url;
-
-    u.setQuery( QString::null );
-    u.setRef( QString::null );
-    encodedurl.file = u.url();
-    int pos = encodedurl.file.findRev('/');
-    encodedurl.path = encodedurl.file;
-    if ( pos > 0 ) {
-       encodedurl.path.truncate( pos );
-       encodedurl.path += '/';
-    }
-    u.setPath( QString::null );
-    encodedurl.host = u.url();
-
-    //kdDebug() << "CSSStyleSelector::CSSStyleSelector encoded url " << encodedurl.path << endl;
 }
 
 CSSStyleSelector::CSSStyleSelector( CSSStyleSheetImpl *sheet )
@@ -197,6 +181,25 @@ void CSSStyleSelector::init()
     m_matchedRuleCount = m_matchedDeclCount = m_tmpRuleCount = 0;
 }
 
+void CSSStyleSelector::setEncodedURL(const KURL& url)
+{
+    KURL u = url;
+
+    u.setQuery( QString::null );
+    u.setRef( QString::null );
+    encodedurl.file = u.url();
+    int pos = encodedurl.file.findRev('/');
+    encodedurl.path = encodedurl.file;
+    if ( pos > 0 ) {
+       encodedurl.path.truncate( pos );
+       encodedurl.path += '/';
+    }
+    u.setPath( QString::null );
+    encodedurl.host = u.url();
+
+    //kdDebug() << "CSSStyleSelector::CSSStyleSelector encoded url " << encodedurl.path << endl;
+}
+
 CSSStyleSelector::~CSSStyleSelector()
 {
     delete m_authorStyle;
index 6145c26a95138a443c79bf47cdf5a527d0ee460b..90245f77b2521a4861cfc21c5fc06c92de7b7e25 100644 (file)
@@ -94,7 +94,7 @@ namespace khtml
         * creates a list of rules it needs to apply to objects
         */
        CSSStyleSelector(DOM::DocumentImpl* doc, QString userStyleSheet, 
-                         DOM::StyleSheetListImpl *styleSheets, const KURL &url,
+                         DOM::StyleSheetListImpl *styleSheets,
                          bool _strictParsing);
        /**
         * same as above but for a single stylesheet.
@@ -115,12 +115,14 @@ namespace khtml
         bool canShareStyleWithElement(DOM::NodeImpl* e);
         
        bool strictParsing;
-       struct Encodedurl {
+       
+        struct Encodedurl {
            QString host; //also contains protocol
            QString path;
            QString file;
        } encodedurl;
-
+        void setEncodedURL(const KURL& url);
+        
         // Given a CSS keyword in the range (xx-small to -khtml-xxx-large), this function will return
         // the correct font size scaled relative to the user's default (medium).
         float fontSizeForKeyword(int keyword, bool quirksMode) const;
index 6f942e7ac60d62645b3373eb872d744bb4b01b20..5e33f8789d4270779b2ad7c1056356225b15d173 100644 (file)
@@ -94,13 +94,13 @@ public:
     
     void setMaximalOutlineSize(int o) { m_maximalOutlineSize = o; }
     int maximalOutlineSize() const { return m_maximalOutlineSize; }
+
+    virtual QRect viewRect() const;
     
 protected:
 
     virtual void selectionStartEnd(int& spos, int& epos);
 
-    virtual QRect viewRect() const;
-
     KHTMLView *m_view;
 
     RenderObject* m_selectionStart;
index 5396d490295dafd71f36c0a852de4917f05394f2..579a4620680f3fdc06de61dca9c8a30ea879b293 100644 (file)
@@ -1571,7 +1571,7 @@ void RenderObject::setStyle(RenderStyle *style)
 
 QRect RenderObject::viewRect() const
 {
-    return containingBlock()->viewRect();
+    return canvas()->viewRect();
 }
 
 bool RenderObject::absolutePosition(int &xPos, int &yPos, bool f)
index 7d56c88ccc9f3d187a485a7e2a68ddb6e7191d3c..f9b762123635ee9a77a5f187bb4c6b944a75523b 100644 (file)
@@ -323,8 +323,7 @@ DocumentImpl::DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v)
     m_usesDescendantRules = false;
     m_usesSiblingRules = false;
 
-    m_styleSelector = new CSSStyleSelector( this, m_usersheet, m_styleSheets, m_url,
-                                            !inCompatMode() );
+    m_styleSelector = new CSSStyleSelector(this, m_usersheet, m_styleSheets, !inCompatMode());
     m_windowEventListeners.setAutoDelete(true);
     m_pendingStylesheets = 0;
     m_ignorePendingStylesheets = false;
@@ -1490,6 +1489,13 @@ void DocumentImpl::clear()
         m_windowEventListeners.removeRef(it.current());
 }
 
+void DocumentImpl::setURL(const QString& url)
+{
+    m_url = url;
+    if (m_styleSelector)
+        m_styleSelector->setEncodedURL(m_url);
+}
+
 void DocumentImpl::setStyleSheet(const DOM::DOMString &url, const DOM::DOMString &sheet)
 {
 //    kdDebug( 6030 ) << "HTMLDocument::setStyleSheet()" << endl;
@@ -2286,9 +2292,8 @@ void DocumentImpl::recalcStyleSelector()
     QString usersheet = m_usersheet;
     if ( m_view && m_view->mediaType() == "print" )
        usersheet += m_printSheet;
-    m_styleSelector = new CSSStyleSelector( this, usersheet, m_styleSheets, m_url,
-                                            !inCompatMode() );
-
+    m_styleSelector = new CSSStyleSelector(this, usersheet, m_styleSheets, !inCompatMode());
+    m_styleSelector->setEncodedURL(m_url);
     m_styleSelectorDirty = false;
 }
 
index a444b7716824e6a6d0a8a818e9edf5dbcca0d64f..a7c9d1781760b4e3ff016545a99d5fe4757a6dff 100644 (file)
@@ -317,7 +317,7 @@ public:
     void clear();
 
     QString URL() const { return m_url; }
-    void setURL(QString url) { m_url = url; }
+    void setURL(const QString& url);
 
     QString baseURL() const { return m_baseURL.isEmpty() ? m_url : m_baseURL; }
     void setBaseURL(const QString& baseURL) { m_baseURL = baseURL; }