SVN commit 634796 by porten: fixed bug #120582 ("cloneNode does not clone `checked' attribute in form inputs"). Had my own patch ready but then discovered Webcore changeset 4457 and applied the relevant part of it to harmonize the code. M +5 -0 ChangeLog M +11 -5 html/html_formimpl.cpp M +3 -1 html/html_formimpl.h --- branches/KDE/3.5/kdelibs/khtml/ChangeLog #634795:634796 @@ -1,3 +1,8 @@ +2007-02-18 Harri Porten + + * html/html_formimpl.cpp: fixed bug #120582 ("cloneNode does not + clone `checked' attribute in form inputs") + 2007-02-11 Harri Porten * ecma/kjs_window.cpp (executeOpenWindow): fixed location href --- branches/KDE/3.5/kdelibs/khtml/html/html_formimpl.cpp #634795:634796 @@ -1222,6 +1222,8 @@ m_size = 20; m_clicked = false; m_checked = false; + m_defaultChecked = false; + m_useDefaultChecked = true; m_indeterminate = false; m_haveType = false; @@ -1327,7 +1329,7 @@ return QString::fromLatin1("."); // empty string, avoid restoring case CHECKBOX: case RADIO: - return QString::fromLatin1(m_checked ? "on" : "off"); + return QString::fromLatin1(checked() ? "on" : "off"); case TEXT: if (autoComplete() && value() != getAttribute(ATTR_VALUE) && getDocument()->view()) getDocument()->view()->addFormCompletionItem(name().string(), value().string()); @@ -1390,7 +1392,9 @@ } break; case ATTR_CHECKED: - // WebCore has m_defaultChecked and m_useDefaultChecked code here.... + m_defaultChecked = attr->val(); + if (m_useDefaultChecked) // We only need to setChanged if the form is looking + setChanged(); // at the default checked state right now. break; case ATTR_MAXLENGTH: { @@ -1462,7 +1466,7 @@ nvalue += value[i]; m_value = nvalue; } - m_checked = (getAttribute(ATTR_CHECKED) != 0); + m_defaultChecked = (getAttribute(ATTR_CHECKED) != 0); if ( m_type == IMAGE ) addHTMLAlignment( getAttribute( ATTR_ALIGN ) ); m_inited = true; @@ -1657,7 +1661,8 @@ void HTMLInputElementImpl::reset() { setValue(getAttribute(ATTR_VALUE)); - setChecked(getAttribute(ATTR_CHECKED) != 0); + m_useDefaultChecked = true; + m_checked = m_defaultChecked; setIndeterminate(true); } @@ -1666,7 +1671,8 @@ if (m_form && m_type == RADIO && _checked && !name().isEmpty()) m_form->radioClicked(this); - if (m_checked == _checked) return; + if (checked() == _checked) return; + m_useDefaultChecked = false; m_checked = _checked; // setIndeterminate(false); --- branches/KDE/3.5/kdelibs/khtml/html/html_formimpl.h #634795:634796 @@ -270,7 +270,7 @@ bool autoComplete() const { return m_autocomplete; } - bool checked() const { return m_checked; } + bool checked() const { return m_useDefaultChecked ? m_defaultChecked : m_checked; } void setChecked(bool); bool indeterminate() const { return m_indeterminate; } void setIndeterminate(bool); @@ -332,6 +332,8 @@ typeEnum m_type : 4; bool m_clicked : 1 ; bool m_checked : 1; + bool m_defaultChecked : 1; // could do without by checking ATTR_CHECKED + bool m_useDefaultChecked : 1; bool m_indeterminate : 1; bool m_haveType : 1; bool m_activeSubmit : 1;