Reviewed by Maciej.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 Feb 2005 06:31:18 +0000 (06:31 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 Feb 2005 06:31:18 +0000 (06:31 +0000)
        - fixed <rdar://problem/3425232> textarea won't trigger onchange action when clicking to new field

        * khtml/rendering/render_form.h: Added new m_dirty data member.
        * khtml/rendering/render_form.cpp:
        (RenderTextArea::RenderTextArea): Initialize m_dirty to false.
        (RenderTextArea::detach): Call value() on the DOM element to cause it to fetch the value from this object.
        (RenderTextArea::handleFocusOut): Ditto. Also send the onchange event based only on the m_dirty flag.
        (RenderTextArea::updateFromElement): Clear the m_dirty flag if the edited value is blown away by a value
        that comes from the DOM element. Remove code to clear the element's m_dirtyvalue flag; that's an unnecessary
        optimization, and ideally we'll stop having code in the render object that knows about that flag later.
        (RenderTextArea::slotTextChanged): Set the m_dirty flag.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/render_form.cpp
WebCore/khtml/rendering/render_form.h

index 6c2f9bb..fcb8323 100644 (file)
@@ -2,6 +2,22 @@
 
         Reviewed by Maciej.
 
+        - fixed <rdar://problem/3425232> textarea won't trigger onchange action when clicking to new field
+
+        * khtml/rendering/render_form.h: Added new m_dirty data member.
+        * khtml/rendering/render_form.cpp:
+        (RenderTextArea::RenderTextArea): Initialize m_dirty to false.
+        (RenderTextArea::detach): Call value() on the DOM element to cause it to fetch the value from this object.
+        (RenderTextArea::handleFocusOut): Ditto. Also send the onchange event based only on the m_dirty flag.
+        (RenderTextArea::updateFromElement): Clear the m_dirty flag if the edited value is blown away by a value
+        that comes from the DOM element. Remove code to clear the element's m_dirtyvalue flag; that's an unnecessary
+        optimization, and ideally we'll stop having code in the render object that knows about that flag later.
+        (RenderTextArea::slotTextChanged): Set the m_dirty flag.
+
+2005-02-06  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
         - re-fixed <rdar://problem/3760910> please add support for custom tag names in HTML
 
         * khtml/xml/dom_docimpl.cpp:
index bfaf47b..ad3fc66 100644 (file)
@@ -1472,7 +1472,7 @@ bool TextAreaWidget::event( QEvent *e )
 // -------------------------------------------------------------------------
 
 RenderTextArea::RenderTextArea(HTMLTextAreaElementImpl *element)
-    : RenderFormElement(element)
+    : RenderFormElement(element), m_dirty(false)
 {
 #if APPLE_CHANGES
     QTextEdit *edit = new KTextEdit(view());
@@ -1500,20 +1500,17 @@ RenderTextArea::RenderTextArea(HTMLTextAreaElementImpl *element)
 
 void RenderTextArea::detach()
 {
-    if ( element()->m_dirtyvalue ) {
-        element()->m_value = text();
-        element()->m_dirtyvalue = false;
-    }
+    element()->value(); // call this for the side effect of copying the value from render to DOM
     RenderFormElement::detach();
 }
 
 void RenderTextArea::handleFocusOut()
 {
-    if ( m_widget && element() && element()->m_dirtyvalue ) {
-        element()->m_value = text();
-        element()->m_dirtyvalue = false;
+    if ( m_dirty && element() ) {
+        element()->value(); // call this for the side effect of copying the value from render to DOM
         element()->onChange();
     }
+    m_dirty = false;
 }
 
 void RenderTextArea::calcMinMaxWidth()
@@ -1586,7 +1583,7 @@ void RenderTextArea::updateFromElement()
     
     // Call text() before calling element()->value(), because in the case of inline
     // input such as Hiragana, w->text() has a side effect of sending the notification
-    // that we use in slotTextChanged to update element()->m_value
+    // that we use in slotTextChanged to update element()->m_value.
     QString widgetText = text();
     QString text = element()->value().string();
     text.replace(QChar('\\'), backslashAsCurrencySymbol());
@@ -1597,8 +1594,8 @@ void RenderTextArea::updateFromElement()
         w->setText(text);
         w->setCursorPosition( line, col );
         w->blockSignals(false);
+        m_dirty = false;
     }
-    element()->m_dirtyvalue = false;
 
     RenderFormElement::updateFromElement();
 }
@@ -1640,6 +1637,7 @@ QString RenderTextArea::text()
 void RenderTextArea::slotTextChanged()
 {
     element()->m_dirtyvalue = true;
+    m_dirty = true;
 }
 
 void RenderTextArea::select()
index bf9508e..d40a49f 100644 (file)
@@ -482,6 +482,8 @@ protected:
     virtual void handleFocusOut();
 
     virtual bool isEditable() const { return true; }
+
+    bool m_dirty;
 };
 
 // -------------------------------------------------------------------------