Fix for bug 3244, implement html4 label support.
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Sep 2006 06:23:56 +0000 (06:23 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Sep 2006 06:23:56 +0000 (06:23 +0000)
        Reviewed by mjs, aroben

        Added fast/events/label-focus.html

        * css/html4.css:
        * html/HTMLLabelElement.cpp:
        (WebCore::HTMLLabelElement::formElement):
        (WebCore::HTMLLabelElement::setActive):
        (WebCore::HTMLLabelElement::setHovered):
        (WebCore::HTMLLabelElement::defaultEventHandler):
        * html/HTMLLabelElement.h:

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

WebCore/ChangeLog
WebCore/css/html4.css
WebCore/html/HTMLLabelElement.cpp
WebCore/html/HTMLLabelElement.h

index ec621a59b096d637f2bce02c4067b2dfa6c8fb5d..4b2729ff1929d03e801fb210ecee2434dace97c9 100644 (file)
@@ -1,3 +1,19 @@
+2006-09-12  David Hyatt  <hyatt@apple.com>
+
+        Fix for bug 3244, implement html4 label support.
+
+        Reviewed by mjs, aroben
+
+        Added fast/events/label-focus.html
+
+        * css/html4.css:
+        * html/HTMLLabelElement.cpp:
+        (WebCore::HTMLLabelElement::formElement):
+        (WebCore::HTMLLabelElement::setActive):
+        (WebCore::HTMLLabelElement::setHovered):
+        (WebCore::HTMLLabelElement::defaultEventHandler):
+        * html/HTMLLabelElement.h:
+
 2006-09-12  Julien Palmas  <julien.palmas@gmail.com>
 
         Reviewed by darin.  Landed by eseidel.
index 788775df1994f289e23f1813eef72863c6a93ea8..828831636f8ade85345322e79a55ceff4a2d1bf9 100644 (file)
@@ -275,6 +275,11 @@ form {
     margin: 0__qem 0 1em 0
 }
 
+label {
+    cursor: default;
+    -webkit-user-select: none;
+}
+
 legend {
     display: block;
     padding-left: 2px;
index b1c6be9dcd9cde2aa9be98eb198c77f12ef86458..3241c93d92f08994613e87f422637ec040138967 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "HTMLNames.h"
 #include "EventNames.h"
+#include "Event.h"
 #include "Document.h"
 
 namespace WebCore {
@@ -51,17 +52,7 @@ bool HTMLLabelElement::isFocusable() const
     return false;
 }
 
-void HTMLLabelElement::parseMappedAttribute(MappedAttribute *attr)
-{
-    if (attr->name() == onfocusAttr) {
-        setHTMLEventListener(focusEvent, attr);
-    } else if (attr->name() == onblurAttr) {
-        setHTMLEventListener(blurEvent, attr);
-    } else
-        HTMLElement::parseMappedAttribute(attr);
-}
-
-Element *HTMLLabelElement::formElement()
+HTMLElement* HTMLLabelElement::formElement()
 {
     const AtomicString& formElementId = getAttribute(forAttr);
     if (formElementId.isNull()) {
@@ -78,7 +69,62 @@ Element *HTMLLabelElement::formElement()
     }
     if (formElementId.isEmpty())
         return 0;
-    return document()->getElementById(formElementId);
+        
+    // Only return HTML elements.
+    Element* elt = document()->getElementById(formElementId);
+    if (elt && elt->isHTMLElement())
+        return static_cast<HTMLElement*>(elt);
+    return 0;
+}
+
+void HTMLLabelElement::setActive(bool down, bool pause)
+{
+    if (down == active())
+        return;
+
+    // Update our status first.
+    HTMLElement::setActive(down, pause);
+
+    // Also update our corresponding control.
+    if (Element* element = formElement())
+        element->setActive(down, pause);
+}
+
+void HTMLLabelElement::setHovered(bool over)
+{
+    if (over == hovered())
+        return;
+        
+    // Update our status first.
+    HTMLElement::setHovered(over);
+
+    // Also update our corresponding control.
+    if (Element* element = formElement())
+        element->setHovered(over);
+}
+
+void HTMLLabelElement::defaultEventHandler(Event* evt)
+{
+    static bool processingClick = false;
+
+    if (evt->type() == clickEvent && !processingClick) {
+        HTMLElement* element = formElement();
+        if (!element)
+            return;
+        
+        processingClick = true;
+
+        // Click the corresponding control.
+        element->click(false);
+            
+        // If the control can be focused via the mouse, then do that too.
+        if (element->isMouseFocusable())
+            element->focus();
+            
+        processingClick = false;
+    }
+    
+    return HTMLElement::defaultEventHandler(evt);
 }
 
 void HTMLLabelElement::focus()
index 79d1f3ef4d752f5e8a13ce2743ec13e71ca0c11b..1f137df3206736906c68108ef955fa19094c1c62 100644 (file)
@@ -42,14 +42,19 @@ public:
 
     virtual bool isFocusable() const;
 
-    virtual void parseMappedAttribute(MappedAttribute *attr);
-
     virtual void accessKeyAction(bool sendToAnyElement);
 
+    // Overridden to update the hover/active state of the corresponding control.
+    virtual void setActive(bool b = true, bool pause = false);
+    virtual void setHovered(bool b = true);
+
+    // Overridden to either click() or focus() the corresponding control.
+    virtual void defaultEventHandler(Event*);
+
     /**
      * the form element this label is associated to.
      */
-    Element *formElement();
+    HTMLElement *formElement();
 
     HTMLFormElement *form();