LayoutTests:
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Mar 2007 09:05:42 +0000 (09:05 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Mar 2007 09:05:42 +0000 (09:05 +0000)
        Reviewed by Maciej.

        <rdar://problem/5035045>
        REGRESSION: WebKit browser doesn't display image at http://www.metoffice.gov.uk/weather/satellite/index.html

        Add some tests where image elements have id _and_ name elements.

        * fast/dom/HTMLDocument/document-special-properties-expected.txt:
        * fast/dom/HTMLDocument/document-special-properties.html:

WebCore:

        Reviewed by Maciej.

        <rdar://problem/5035045>
        REGRESSION: WebKit browser doesn't display image at http://www.metoffice.gov.uk/weather/satellite/index.html

        It turns out WinIE does allow you to access images by their id as special document properties. However, this is only
        allowed when the element also has a name attribute. The value of the name attribute is ignored and can even be empty!

        * bindings/js/kjs_html.cpp:
        (KJS::JSHTMLDocument::namedItemGetter):
        Return jsUndefined() if the collection is empty.

        * html/HTMLImageElement.cpp:
        (WebCore::HTMLImageElement::parseMappedAttribute):
        (WebCore::HTMLImageElement::insertedIntoDocument):
        (WebCore::HTMLImageElement::removedFromDocument):
        * html/HTMLImageElement.h:
        Add the id attribute value to the extra named item map.

        * html/HTMLNameCollection.cpp:
        (WebCore::HTMLNameCollection::traverseNextItem):
        Check for images with name attributes that match, as well as elements with id attributes that match where
        the element also has a name attribute.

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

LayoutTests/ChangeLog
LayoutTests/fast/dom/HTMLDocument/document-special-properties-expected.txt
LayoutTests/fast/dom/HTMLDocument/document-special-properties.html
WebCore/ChangeLog
WebCore/bindings/js/kjs_html.cpp
WebCore/html/HTMLImageElement.cpp
WebCore/html/HTMLImageElement.h
WebCore/html/HTMLNameCollection.cpp

index 7511ff3..0c2af6e 100644 (file)
@@ -1,3 +1,15 @@
+2007-03-06  Anders Carlsson  <acarlsson@apple.com>
+
+        Reviewed by Maciej.
+
+        <rdar://problem/5035045>
+        REGRESSION: WebKit browser doesn't display image at http://www.metoffice.gov.uk/weather/satellite/index.html
+        
+        Add some tests where image elements have id _and_ name elements.
+        
+        * fast/dom/HTMLDocument/document-special-properties-expected.txt:
+        * fast/dom/HTMLDocument/document-special-properties.html:
+
 2007-03-05  Kevin McCullough  <kmccullough@apple.com>
 
         Reviewed by Mark and Dave H.
index f84485f..239924c 100644 (file)
@@ -10,6 +10,10 @@ Image by name (multiple): collection(2) IMG(name) IMG(name)
 Image by id (unique): undefined
 Image by id (multiple): undefined
 Image by id/name mixed: collection(2) IMG(name) IMG(name)
+Image by id, name present (unique): single IMG(id,name)
+Image by id, empty name present (unique): single IMG(id)
+Image by id, name present (multiple): collection(2) IMG(id,name) IMG(id,name)
+Image by name, id present (unique): single IMG(id,name)
 
 Nonexistent form name: undefined
 Form by name (unique): single FORM(name)
index 06dea87..cad4569 100644 (file)
@@ -32,6 +32,12 @@ if (window.layoutTestController)
 <img name="image5" width="0" height="0">
 <img name="image5" width="0" height="0">
 <img id="image5" width="0" height="0">
+<img id="image6" name="image6name" width="0" height="0">
+<img id="image7" name="" width="0" height="0">
+<img id="image8" name="image8name" width="0" height="0">
+<img id="image8" width="0" height="0">
+<img id="image8" name="image7name" width="0" height="0">
+<img id="image9" name="image9name" width="0" height="0">
 
 <form name="form1" width="0" height="0"></form>
 <form name="form2" width="0" height="0"></form>
@@ -150,13 +156,13 @@ function printElement(e)
     if (e.tagName) {
         print(" " + e.tagName);
 
-       if (e.name && e.id) {
-           print("(id,name)");
-       } else if (e.name) {
-           print("(name)");
+    if (e.name && e.id) {
+        print("(id,name)");
+    } else if (e.name) {
+        print("(name)");
         } else if (e.id) {
-           print("(id)");
-       }
+        print("(id)");
+    }
     } else if (e.navigator) {
         print(" WINDOW");
     } else {
@@ -173,12 +179,12 @@ function testProperty(description, propName) {
         print(" undefined");
     } else if (propVal.length) {
         print(" collection(" + propVal.length + ")");
-       for (var i = 0; i < propVal.length; i++) {
-           printElement(propVal[i]);
-       }
+    for (var i = 0; i < propVal.length; i++) {
+        printElement(propVal[i]);
+    }
     } else {
         print(" single");
-       printElement(propVal);
+    printElement(propVal);
     }
     
     print("<br>");
@@ -190,6 +196,11 @@ testProperty("Image by name (multiple)", "image2");
 testProperty("Image by id (unique)", "image3");
 testProperty("Image by id (multiple)", "image4");
 testProperty("Image by id/name mixed", "image5");
+testProperty("Image by id, name present (unique)", "image6");
+testProperty("Image by id, empty name present (unique)", "image7");
+testProperty("Image by id, name present (multiple)", "image8");
+testProperty("Image by name, id present (unique)", "image9name");
+
 print("<br>");
 
 testProperty("Nonexistent form name", "form0");
index 5d29c0e..901b392 100644 (file)
@@ -1,5 +1,31 @@
 2007-03-06  Anders Carlsson  <acarlsson@apple.com>
 
+        Reviewed by Maciej.
+
+        <rdar://problem/5035045>
+        REGRESSION: WebKit browser doesn't display image at http://www.metoffice.gov.uk/weather/satellite/index.html
+        
+        It turns out WinIE does allow you to access images by their id as special document properties. However, this is only
+        allowed when the element also has a name attribute. The value of the name attribute is ignored and can even be empty!
+        
+        * bindings/js/kjs_html.cpp:
+        (KJS::JSHTMLDocument::namedItemGetter):
+        Return jsUndefined() if the collection is empty.
+        
+        * html/HTMLImageElement.cpp:
+        (WebCore::HTMLImageElement::parseMappedAttribute):
+        (WebCore::HTMLImageElement::insertedIntoDocument):
+        (WebCore::HTMLImageElement::removedFromDocument):
+        * html/HTMLImageElement.h:
+        Add the id attribute value to the extra named item map.
+        
+        * html/HTMLNameCollection.cpp:
+        (WebCore::HTMLNameCollection::traverseNextItem):
+        Check for images with name attributes that match, as well as elements with id attributes that match where
+        the element also has a name attribute.
+
+2007-03-06  Anders Carlsson  <acarlsson@apple.com>
+
         Reviewed by Adam.
 
         WebCore part of patch to make it possible to have different user agents for different URLs.
index e6e7f26..c0bcac8 100644 (file)
@@ -207,7 +207,8 @@ JSValue *JSHTMLDocument::namedItemGetter(ExecState* exec, JSObject* originalObje
     if (node->hasTagName(iframeTag) && (frame = static_cast<HTMLIFrameElement*>(node)->contentFrame()))
       return Window::retrieve(frame);
     return toJS(exec, node);
-  }
+  } else if (collection->length() == 0)
+      return jsUndefined();
 
   return getHTMLCollection(exec, collection.get());
 }
index bed3162..50858bb 100644 (file)
@@ -139,6 +139,16 @@ void HTMLImageElement::parseMappedAttribute(MappedAttribute* attr)
             doc->addNamedItem(newNameAttr);
         }
         oldNameAttr = newNameAttr;
+    } else if (attr->name() == idAttr) {
+        String newIdAttr = attr->value();
+        if (inDocument() && document()->isHTMLDocument()) {
+            HTMLDocument *doc = static_cast<HTMLDocument *>(document());
+            doc->removeDocExtraNamedItem(oldIdAttr);
+            doc->addDocExtraNamedItem(newIdAttr);
+        }
+        oldIdAttr = newIdAttr;
+        // also call superclass
+        HTMLElement::parseMappedAttribute(attr);
     } else
         HTMLElement::parseMappedAttribute(attr);
 }
@@ -180,18 +190,24 @@ void HTMLImageElement::attach()
 
 void HTMLImageElement::insertedIntoDocument()
 {
-    Document* doc = document();
-    if (doc->isHTMLDocument())
-        static_cast<HTMLDocument*>(doc)->addNamedItem(oldNameAttr);
+    if (document()->isHTMLDocument()) {
+        HTMLDocument* doc = static_cast<HTMLDocument*>(document());
+
+        doc->addNamedItem(oldNameAttr);
+        doc->addDocExtraNamedItem(oldIdAttr);
+    }
 
     HTMLElement::insertedIntoDocument();
 }
 
 void HTMLImageElement::removedFromDocument()
 {
-    Document* doc = document();
-    if (doc->isHTMLDocument())
-        static_cast<HTMLDocument*>(doc)->removeNamedItem(oldNameAttr);
+    if (document()->isHTMLDocument()) {
+        HTMLDocument* doc = static_cast<HTMLDocument*>(document());
+
+        doc->removeNamedItem(oldNameAttr);
+        doc->removeDocExtraNamedItem(oldIdAttr);
+    }
 
     HTMLElement::removedFromDocument();
 }
index 253c390..7608fd9 100644 (file)
@@ -116,6 +116,7 @@ protected:
     bool ismap;
     HTMLFormElement* m_form;
     String oldNameAttr;
+    String oldIdAttr;
     CompositeOperator m_compositeOperator;
 };
 
index e55789f..a4f3c87 100644 (file)
@@ -66,9 +66,9 @@ Node* HTMLNameCollection::traverseNextItem(Node* current) const
                 break;
             case DocumentNamedItems:
                 // find images, forms, applets, embeds, objects and iframes by name, 
-                // but only applets and object by id (this strange rule matches IE)
-                if (e->hasTagName(imgTag) ||
-                    e->hasTagName(formTag) ||
+                // applets and object by id, and images by id but only if they have
+                // a name attribute (this very strange rule matches IE)
+                if (e->hasTagName(formTag) ||
                     e->hasTagName(embedTag) ||
                     e->hasTagName(iframeTag))
                     found = e->getAttribute(nameAttr) == m_name;
@@ -78,6 +78,8 @@ Node* HTMLNameCollection::traverseNextItem(Node* current) const
                 else if (e->hasTagName(objectTag))
                     found = (e->getAttribute(nameAttr) == m_name || e->getAttribute(idAttr) == m_name) &&
                         static_cast<HTMLObjectElement*>(e)->isDocNamedItem();
+                else if (e->hasTagName(imgTag))
+                    found = e->getAttribute(nameAttr) == m_name || (e->getAttribute(idAttr) == m_name && e->hasAttribute(nameAttr));
                 break;
             default:
                 ASSERT(0);