Beginning of work to support the Acid2 CSS test put forward by the Web Standards...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Apr 2005 22:11:45 +0000 (22:11 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Apr 2005 22:11:45 +0000 (22:11 +0000)
our handling of the rel attribute on <link> elements to do a proper tokenization so that stylesheets
can be recognized even when other keywords are present in the rel attribute.

        * khtml/html/html_headimpl.cpp:
        (HTMLLinkElementImpl::HTMLLinkElementImpl):
        (HTMLLinkElementImpl::parseHTMLAttribute):
        (HTMLLinkElementImpl::tokenizeRelAttribute):
        (HTMLLinkElementImpl::process):
        * khtml/html/html_headimpl.h:

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/html/html_headimpl.cpp
WebCore/khtml/html/html_headimpl.h

index 390fe9186063f67c42330a111879a997bfecd88f..f4b67fd7168760d5682b1c830a5a1b22aee0a43a 100644 (file)
@@ -1,3 +1,16 @@
+2005-04-12  David Hyatt  <hyatt@apple.com>
+
+       Beginning of work to support the Acid2 CSS test put forward by the Web Standards Project.  Fix
+       our handling of the rel attribute on <link> elements to do a proper tokenization so that stylesheets
+       can be recognized even when other keywords are present in the rel attribute.
+
+        * khtml/html/html_headimpl.cpp:
+        (HTMLLinkElementImpl::HTMLLinkElementImpl):
+        (HTMLLinkElementImpl::parseHTMLAttribute):
+        (HTMLLinkElementImpl::tokenizeRelAttribute):
+        (HTMLLinkElementImpl::process):
+        * khtml/html/html_headimpl.h:
+
 2005-04-12  John Sullivan  <sullivan@apple.com>
 
         - fixed these two bugs (I also fixed these on the experimental-ui-branch)
index d9ea334899c23f1d61ace4739e02ac2bcfb92ce0..87cbf7c51023919d5813b4f7caeb472106e4d867 100644 (file)
@@ -113,7 +113,7 @@ HTMLLinkElementImpl::HTMLLinkElementImpl(DocumentPtr *doc)
     m_sheet = 0;
     m_loading = false;
     m_cachedSheet = 0;
-    m_alternate = false;
+    m_isStyleSheet = m_isIcon = m_alternate = false;
     m_disabledState = 0;
 }
 
@@ -171,7 +171,7 @@ void HTMLLinkElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
     switch (attr->id())
     {
     case ATTR_REL:
-        m_rel = attr->value();
+        tokenizeRelAttribute(attr->value());
         process();
         break;
     case ATTR_HREF:
@@ -194,43 +194,59 @@ void HTMLLinkElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
     }
 }
 
+void HTMLLinkElementImpl::tokenizeRelAttribute(const AtomicString& relStr)
+{
+    m_isStyleSheet = m_isIcon = m_alternate = false;
+    QString rel = relStr.string().lower();
+    if (rel == "stylesheet")
+        m_isStyleSheet = true;
+    else if (rel == "icon" || rel == "shortcut icon")
+        m_isIcon = true;
+    else if (rel == "alternate stylesheet" || rel == "stylesheet alternate")
+        m_isStyleSheet = m_alternate = true;
+    else {
+        // Tokenize the rel attribute and set bits based on specific keywords that we find.
+        rel.replace('\n', ' ');
+        QStringList list = QStringList::split(' ', rel);        
+        for (QStringList::Iterator i = list.begin(); i != list.end(); ++i) {
+            if (*i == "stylesheet")
+                m_isStyleSheet = true;
+            else if (*i == "alternate")
+                m_alternate = true;
+            else if (*i == "icon")
+                m_isIcon = true;
+        }
+    }
+}
+
 void HTMLLinkElementImpl::process()
 {
     if (!inDocument())
         return;
 
     QString type = m_type.string().lower();
-    QString rel = m_rel.string().lower();
-
+    
     KHTMLPart* part = getDocument()->part();
 
     // IE extension: location of small icon for locationbar / bookmarks
-#if APPLE_CHANGES
-    if ( part && rel == "shortcut icon" && !m_url.isEmpty() && !part->parentPart())
-       part->browserExtension()->setIconURL( KURL(m_url.string()) );
-
-    // Mozilla extension to IE extension: icon specified with type
-    if ( part && rel == "icon" && !m_url.isEmpty() && !part->parentPart())
-       part->browserExtension()->setTypedIconURL( KURL(m_url.string()), type );
-#else
-    // Uses both "shortcut icon" and "icon"
-   
-    if ( part && rel.contains("icon") && !m_url.isEmpty() && !part->parentPart())
-        part->browserExtension()->setIconURL( KURL(m_url.string()) );
-#endif
+    if (part && m_isIcon && !m_url.isEmpty() && !part->parentPart()) {
+        if (!type.isEmpty()) // Mozilla extension to IE extension: icon specified with type
+            part->browserExtension()->setTypedIconURL(KURL(m_url.string()), type);
+        else 
+            part->browserExtension()->setIconURL(KURL(m_url.string()));
+    }
 
     // Stylesheet
     // This was buggy and would incorrectly match <link rel="alternate">, which has a different specified meaning. -dwh
-    if(m_disabledState != 2 && (type.contains("text/css") || rel == "stylesheet" || (rel.contains("alternate") && rel.contains("stylesheet"))) && getDocument()->part()) {
+    if (m_disabledState != 2 && (type.contains("text/css") || m_isStyleSheet) && getDocument()->part()) {
         // no need to load style sheets which aren't for the screen output
         // ### there may be in some situations e.g. for an editor or script to manipulate
        // also, don't load style sheets for standalone documents
-        if( m_media.isNull() || m_media.contains("screen") || m_media.contains("all") || m_media.contains("print") ) {
+        if (m_media.isNull() || m_media.contains("screen") || m_media.contains("all") || m_media.contains("print")) {
             m_loading = true;
 
             // Add ourselves as a pending sheet, but only if we aren't an alternate 
             // stylesheet.  Alternate stylesheets don't hold up render tree construction.
-            m_alternate = rel.contains("alternate");
             if (!isAlternate())
                 getDocument()->addPendingSheet();
             
index b0499e3945089c4dabb4478cf020a5a10c84b879..193662b1826bcc8522ae59cf8f556720e460b273 100644 (file)
@@ -99,16 +99,19 @@ public:
 
     virtual bool isURLAttribute(AttributeImpl *attr) const;
     
+    void tokenizeRelAttribute(const AtomicString& rel);
+
 protected:
     khtml::CachedCSSStyleSheet *m_cachedSheet;
     CSSStyleSheetImpl *m_sheet;
     DOMString m_url;
     DOMString m_type;
     QString m_media;
-    DOMString m_rel;
     int m_disabledState; // 0=unset(default), 1=enabled via script, 2=disabled
-    bool m_loading;
-    bool m_alternate;
+    bool m_loading : 1;
+    bool m_alternate : 1;
+    bool m_isStyleSheet : 1;
+    bool m_isIcon : 1;
     QString m_data; // needed for temporarily storing the loaded style sheet data
 };