Add XSL Stylesheets to the WebCore cache.
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Aug 2004 20:25:16 +0000 (20:25 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Aug 2004 20:25:16 +0000 (20:25 +0000)
        Reviewed by kocienda

        * khtml/misc/loader.cpp:
        (CachedXSLStyleSheet::CachedXSLStyleSheet):
        (CachedXSLStyleSheet::ref):
        (CachedXSLStyleSheet::deref):
        (CachedXSLStyleSheet::data):
        (CachedXSLStyleSheet::checkNotify):
        (CachedXSLStyleSheet::error):
        (DocLoader::requestXSLStyleSheet):
        (Cache::requestXSLStyleSheet):
        (Cache::getStatistics):
        * khtml/misc/loader.h:
        (khtml::CachedObject::):
        (khtml::CachedXSLStyleSheet::sheet):
        (khtml::CachedXSLStyleSheet::schedule):

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/misc/loader.cpp
WebCore/khtml/misc/loader.h

index 219c7ae..cd6b618 100644 (file)
@@ -1,3 +1,24 @@
+2004-08-04  David Hyatt  <hyatt@apple.com>
+
+       Add XSL Stylesheets to the WebCore cache.
+       
+        Reviewed by kocienda
+
+        * khtml/misc/loader.cpp:
+        (CachedXSLStyleSheet::CachedXSLStyleSheet):
+        (CachedXSLStyleSheet::ref):
+        (CachedXSLStyleSheet::deref):
+        (CachedXSLStyleSheet::data):
+        (CachedXSLStyleSheet::checkNotify):
+        (CachedXSLStyleSheet::error):
+        (DocLoader::requestXSLStyleSheet):
+        (Cache::requestXSLStyleSheet):
+        (Cache::getStatistics):
+        * khtml/misc/loader.h:
+        (khtml::CachedObject::):
+        (khtml::CachedXSLStyleSheet::sheet):
+        (khtml::CachedXSLStyleSheet::schedule):
+
 2004-08-03  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Hyatt
index 8bdd794..3c03dab 100644 (file)
@@ -985,6 +985,71 @@ void CachedImage::checkNotify()
 
 // -------------------------------------------------------------------------------------------
 
+#ifdef KHTML_XSLT
+
+CachedXSLStyleSheet::CachedXSLStyleSheet(DocLoader* dl, const DOMString &url, KIO::CacheControl _cachePolicy, time_t _expireDate)
+: CachedObject(url, XSLStyleSheet, _cachePolicy, _expireDate)
+{
+    // It's XML we want.
+    setAccept(QString::fromLatin1("text/xml, application/xml, application/xml+xhtml, text/xsl"));
+    
+    // load the file
+    Cache::loader()->load(dl, this, false);
+    m_loading = true;
+    m_codec = QTextCodec::codecForName("iso8859-1");
+}
+
+void CachedXSLStyleSheet::ref(CachedObjectClient *c)
+{
+    CachedObject::ref(c);
+    
+    if (!m_loading)
+        c->setStyleSheet(m_url, m_sheet);
+}
+
+void CachedXSLStyleSheet::deref(CachedObjectClient *c)
+{
+    Cache::flush();
+    CachedObject::deref(c);
+    if (canDelete() && m_free)
+        delete this;
+}
+
+void CachedXSLStyleSheet::data(QBuffer &buffer, bool eof)
+{
+    if(!eof) return;
+    buffer.close();
+    setSize(buffer.buffer().size());
+    QString data = m_codec->toUnicode( buffer.buffer().data(), size() );
+    m_sheet = DOMString(data);
+    m_loading = false;
+    
+    checkNotify();
+}
+
+void CachedXSLStyleSheet::checkNotify()
+{
+    if (m_loading)
+        return;
+    
+#ifdef CACHE_DEBUG
+    kdDebug( 6060 ) << "CachedCSSStyleSheet:: finishedLoading " << m_url.string() << endl;
+#endif
+    
+    CachedObjectClientWalker w(m_clients);
+    while (CachedObjectClient *c = w.next())
+        c->setStyleSheet(m_url, m_sheet);
+}
+
+
+void CachedXSLStyleSheet::error( int /*err*/, const char */*text*/ )
+{
+    m_loading = false;
+    checkNotify();
+}
+
+#endif
+
 #ifndef KHTML_NO_XBL
 CachedXBLDocument::CachedXBLDocument(DocLoader* dl, const DOMString &url, KIO::CacheControl _cachePolicy, time_t _expireDate)
 : CachedObject(url, XBL, _cachePolicy, _expireDate), m_document(0)
@@ -1202,6 +1267,30 @@ CachedScript *DocLoader::requestScript( const DOM::DOMString &url, const QString
 }
 
 #ifndef KHTML_NO_XBL
+CachedXSLStyleSheet* DocLoader::requestXSLStyleSheet(const DOM::DOMString &url)
+{
+    KURL fullURL = m_doc->completeURL(url.string());
+    
+    if (m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;
+    
+#if APPLE_CHANGES
+    if (KWQCheckIfReloading(this))
+        setCachePolicy(KIO::CC_Reload);
+#endif
+    
+    bool reload = needReload(fullURL);
+    
+#if APPLE_CHANGES
+    CachedXSLStyleSheet *cachedObject = Cache::requestXSLStyleSheet(this, url, reload, m_expireDate);
+    KWQCheckCacheObjectStatus(this, cachedObject);
+    return cachedObject;
+#else
+    return Cache::requestXSLStyleSheet(this, url, reload, m_expireDate);
+#endif
+}
+#endif
+
+#ifndef KHTML_NO_XBL
 CachedXBLDocument* DocLoader::requestXBLDocument(const DOM::DOMString &url)
 {
     KURL fullURL = m_doc->completeURL(url.string());
@@ -1824,6 +1913,80 @@ void Cache::preloadScript( const QString &url, const QString &script_data)
     cache->insert( url, script );
 }
 
+#ifdef KHTML_XSLT
+CachedXSLStyleSheet* Cache::requestXSLStyleSheet(DocLoader* dl, const DOMString & url, bool reload, 
+                                                 time_t _expireDate)
+{
+    // this brings the _url to a standard form...
+    KURL kurl;
+    KIO::CacheControl cachePolicy;
+    if (dl) {
+        kurl = dl->m_doc->completeURL(url.string());
+        cachePolicy = dl->cachePolicy();
+    }
+    else {
+        kurl = url.string();
+        cachePolicy = KIO::CC_Verify;
+    }
+    
+#if APPLE_CHANGES
+    // Checking if the URL is malformed is lots of extra work for little benefit.
+#else
+    if(kurl.isMalformed()) {
+        kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;
+        return 0;
+    }
+#endif
+    
+    CachedObject *o = cache->find(kurl.url());
+    if (!o) {
+#ifdef CACHE_DEBUG
+        kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
+#endif
+        CachedXSLStyleSheet* doc = new CachedXSLStyleSheet(dl, kurl.url(), cachePolicy, _expireDate);
+#if APPLE_CHANGES
+        if (cacheDisabled)
+            doc->setFree(true);
+        else {
+#endif
+            cache->insert(kurl.url(), doc);
+            moveToHeadOfLRUList(doc);
+#if APPLE_CHANGES
+        }
+#endif
+        o = doc;
+    }
+    
+#if !APPLE_CHANGES
+    o->setExpireDate(_expireDate, true);
+#endif
+    
+    if (o->type() != CachedObject::XSLStyleSheet) {
+#ifdef CACHE_DEBUG
+        kdDebug( 6060 ) << "Cache::Internal Error in requestXSLStyleSheet url=" << kurl.url() << "!" << endl;
+#endif
+        return 0;
+    }
+    
+#ifdef CACHE_DEBUG
+    if (o->status() == CachedObject::Pending)
+        kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl;
+    else
+        kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << endl;
+#endif
+    
+    moveToHeadOfLRUList(o);
+    if (dl) {
+        dl->m_docObjects.remove( o );
+#if APPLE_CHANGES
+        if (!cacheDisabled)
+#endif
+            dl->m_docObjects.append( o );
+    }
+    return static_cast<CachedXSLStyleSheet*>(o);
+}
+#endif
+
 #ifndef KHTML_NO_XBL
 CachedXBLDocument* Cache::requestXBLDocument(DocLoader* dl, const DOMString & url, bool reload, 
                                              time_t _expireDate)
@@ -2217,6 +2380,12 @@ Cache::Statistics Cache::getStatistics()
                 stats.scripts.count++;
                 stats.scripts.size += o->size();
                 break;
+#ifdef KHTML_XSLT
+            case CachedObject::XSLStyleSheet:
+                stats.xslStyleSheets.count++;
+                stats.xslStyleSheets.size += o->size();
+                break;
+#endif
 #ifndef KHTML_NO_XBL
             case CachedObject::XBL:
                 stats.xblDocs.count++;
index 85e7f2f..a49177e 100644 (file)
@@ -101,9 +101,12 @@ namespace khtml
        enum Type {
            Image,
            CSSStyleSheet,
-           Script,
+           Script
+#ifdef KHTML_XSLT
+            , XSLStyleSheet
+#endif
 #ifndef KHTML_NO_XBL
-            XBL
+            XBL
 #endif
        };
 
@@ -362,6 +365,30 @@ namespace khtml
 #endif
     };
 
+#ifdef KHTML_XSLT
+    class CachedXSLStyleSheet : public CachedObject
+    {
+public:
+        CachedXSLStyleSheet(DocLoader* dl, const DOM::DOMString &url, KIO::CacheControl cachePolicy, time_t _expireDate);
+
+        const DOM::DOMString& sheet() const { return m_sheet; }
+        
+        virtual void ref(CachedObjectClient *consumer);
+        virtual void deref(CachedObjectClient *consumer);
+        
+        virtual void data(QBuffer &buffer, bool eof);
+        virtual void error(int err, const char *text);
+        
+        virtual bool schedule() const { return true; }
+        
+        void checkNotify();
+        
+protected:
+        DOM::DOMString m_sheet;
+        QTextCodec* m_codec;
+    };
+#endif
+    
 #ifndef KHTML_NO_XBL
     class CachedXBLDocument : public CachedObject
     {
@@ -402,6 +429,9 @@ protected:
        CachedCSSStyleSheet *requestStyleSheet( const DOM::DOMString &url, const QString& charset);
         CachedScript *requestScript( const DOM::DOMString &url, const QString& charset);
 
+#ifdef KHTML_XSLT
+        CachedXSLStyleSheet* requestXSLStyleSheet(const DOM::DOMString& url);
+#endif
 #ifndef KHTML_NO_XBL
         CachedXBLDocument* requestXBLDocument(const DOM::DOMString &url);
 #endif
@@ -527,6 +557,11 @@ protected:
         */
        static CachedCSSStyleSheet *requestStyleSheet( DocLoader* l, const DOM::DOMString &url, bool reload=false, time_t _expireDate=0, const QString& charset = QString::null);
 
+#ifdef KHTML_XSLT
+        // Ask the cache for an XSL stylesheet.
+        static CachedXSLStyleSheet* requestXSLStyleSheet(DocLoader* l, const DOM::DOMString &url, 
+                                                         bool reload=false, time_t _expireDate=0);
+#endif
 #ifndef KHTML_NO_XBL
         // Ask the cache for an XBL document.
         static CachedXBLDocument* requestXBLDocument(DocLoader* l, const DOM::DOMString &url, 
@@ -595,6 +630,9 @@ protected:
             TypeStatistic movies;
             TypeStatistic styleSheets;
             TypeStatistic scripts;
+#ifdef KHTML_XSLT
+            TypeStatistic xslStyleSheets;
+#endif
 #ifndef KHTML_NO_XBL
             TypeStatistic xblDocs;
 #endif