<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>80381</bug_id>
          
          <creation_ts>2012-03-05 22:26:05 -0800</creation_ts>
          <short_desc>[Forms] Re-factor HTMLFormControlElement class</short_desc>
          <delta_ts>2022-12-19 14:27:51 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Forms</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>CONFIGURATION CHANGED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>79764</dependson>
    
    <dependson>80088</dependson>
    
    <dependson>80234</dependson>
    
    <dependson>80239</dependson>
    
    <dependson>80392</dependson>
    
    <dependson>86058</dependson>
    
    <dependson>87694</dependson>
    
    <dependson>87719</dependson>
          <blocked>188643</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter>yosin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ahmad.saleem792</cc>
    
    <cc>akeerthi</cc>
    
    <cc>bdakin</cc>
    
    <cc>jonlee</cc>
    
    <cc>rniwa</cc>
    
    <cc>smoley</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>571488</commentid>
    <comment_count>0</comment_count>
    <who name="">yosin</who>
    <bug_when>2012-03-05 22:26:05 -0800</bug_when>
    <thetext>The form team would like to re-factor HTMLFormControlElement class, because class hierarchy isn&apos;t match the specification and some use of isFormControlControl isn&apos;t clear.

We&apos;ll make HTMLFormControlElement is base class of HTML*Element which is in HTMLFormControlCollection[1], which is &quot;listed element&quot; of form and fieldset[2], 
1. button
2. fieldset
3. input
4. keygen
5. object
6. output
7. select
8. textarea.

As of this change following classes won&apos;t be derived from HTMLFormControlElement
1. legend (bug 80239)
2. meter (bug 80380)
3. option (bug 79764)
4. optgroup (bug 80234)
5. progress (bug 80239)

Also, we&apos;ll introduce new predicate method into HTMLElement to replace isFormControl predicate with clear intention:

# Frame::searchForLabelsBeforeElement
#* NOW: backward walker stops when hits isFormControl.
#* SHOULD: backward walker stops when hits label-able element.

# ValidityState::validationMessage
#* NOW: bool isTextAreaElement = element-&gt;isFormControlElement() &amp;&amp; element-&gt;hasTagName(textareaTag);
#* SHOULD: bool isTextAreaElement = element-&gt;isFormAssociateElement() &amp;&amp; element-&gt;hasTagName(textareaTag); 

# ValidityState::setCustomErrorMessage
#* NOW 
  if (m_control-&gt;isFormControlElement()) 
    static_cast&lt;HTMLFormControlElement*&gt;(m_control)-&gt;setNeedsValidityCheck();
#* SHOULD
  if (m_control-&gt;canValidate()) 
    static_cast&lt;ValidatableElement*&gt;(m_control)-&gt;setNeedsValidityCheck();

# allowsAuthorShadowRoot in ShadowRoot.cpp
#* NOW: 
// FIXME: ValidationMessage recreates shadow root dynamically.
if (eleemnt-&gt;isFormControl()) return false;
#* SHOULD
if (element-&gt;canValidate()) return false;

# SelectorChecker::checkOneSelector
#* NOW:
   case CSSSelector::PseudoAutofill:
       if (!element || !element-&gt;isFormControlElement())
           break;
       if (HTMLInputElement* inputElement = element-&gt;toInputElement())
           return inputElement-&gt;isAutofilled();
#* SHOULD: // We don&apos;t need to check isFormControlElement
       if (HTMLInputElement* inputElement = element ? element-&gt;toInputElement() : 0)
           return inputElement-&gt;isAutofilled();

#* NOW:
  case CSSSelector::PseudoEnabled:
      if (element &amp;&amp; element-&gt;isFormControlElement())
        return element-&gt;isEnabledFormControl();
      break;

#* SHOULD:
  case CSSSelector::PseudoEnabled:
    if (element &amp;&amp; element-&gt;hasCSSPseudoClassEnabled())
       return !element-&gt;disabled();

# toHTMLElement in FormAssociateElement.cpp
#* NOW:
   if (associatedElement-&gt;isFormControlElement()) {
       // This is reinterpret_cast rather than static_cast.
       return static_cast&lt;const HTMLFormControlElement*&gt;(associatedElement);
   }

#* SHOULD: TBD

# RenderLayer::resize
#* NOW:
if (resize != RESIZE_VERTICAL &amp;&amp; difference.width()) {
    if (element-&gt;isFormControlElement()) {
        // Make implicit margins from the theme explicit (see &lt;http://bugs.webkit.org/show_bug.cgi?id=9547&gt;).

#* SHOULD: TBD

# CSSStyleSelector::canShareStyleWithElement
#* NOW:
if (m_element-&gt;isFormControlElement() &amp;&amp; !canShareStyleWithControl(element))
        return false;
#* SHOULD
if (!canShareStyleWithControl(element))
        return false;

# ContextMenuController::populate
#* NOW
if (!m_hitTestResult.isContentEditable() &amp;&amp; (node-&gt;isElementNode() &amp;&amp; static_cast&lt;Element*&gt;(node)-&gt;isFormControlElement()))
#* SHOULD TBD

# FormSubmission::create
#* NOW:  if (node &amp;&amp; node-&gt;isElementNode() &amp;&amp; toElement(node)-&gt;isFormControlElement())
#* SHOULD: if (node &amp;&amp; node-&gt;isElementNode() &amp;&amp; toElement(node)-&gt;isSubmittableElement())

# isClickableControl in HTMLSummaryElement
#* NOW: if (element-&gt;isFormControlElement()) return true;
#* SHOULDE: if (element-&gt;isClickable()) return true;

# scanForForm in FrameSelection.cpp
#* NOW: 
if (node-&gt;isHTMLElement() &amp;&amp; toHTMLElement(node)-&gt;isFormControlElement())
  return static_cast&lt;HTMLFormControlElement*&gt;(node)-&gt;form();
#* SHOULD:
if (node-&gt;isHTMLElement() &amp;&amp; toHTMLElement(node)-&gt;isFormAssociatedElement()) {
  // Note: static_cast to HTMLFormAssocaitedElement may not work.
  return static_cast&lt;HTMLFormAssociatedElement*&gt;(node)-&gt;form();
}

# HTMLFormElement::submitImplicitly
#* NOW: if (!formAssociatedElement-&gt;isFormControlElement()) continue;
#* SHOULD: if (!formAssociatedElement-&gt;isSubmittableElement()) continue;

# HTMLFormElement::validateInteractively
#* NOW: if (m_associatedElements[i]-&gt;isFormControlElement()) static_cast&lt;HTMLFormControlElement*&gt;(m_associatedElements[i])-&gt;hideVisibleValidationMessage();
#* SHOULD: if (m_associatedElements[i]-&gt;canValidate())

# TextIterator::advance
#* NOW: 
if (...  static_cast&lt;Element*&gt;(renderer-&gt;node())-&gt;isFormControlElement()))) {
   // Why form control handled as replaced element?
   m_handledNode = handleReplacedElement();
}
#* SHOULD: TBD

# nodeAsLabelableFormControl in HTMLLabelElement.cpp
#* NOW:  if (... || !static_cast&lt;Element*&gt;(node)-&gt;isFormControlElement())
#* SHOULD:  if (... !static_cast&lt;Element*&gt;(node)-&gt;isLabelable())

# AccessibilityRenderObject::isControl
#* NOW: return node &amp;&amp; ((node-&gt;isElementNode() &amp;&amp; static_cast&lt;Element*&gt;(node)-&gt;isFormControlElement())
#* SHOULD: TBD

# AccessibilityRenderObject::isRequired
#* NOW:
if (n &amp;&amp; (n-&gt;isElementNode() &amp;&amp; static_cast&lt;Element*&gt;(n)-&gt;isFormControlElement()))
  return static_cast&lt;HTMLFormControlElement*&gt;(n)-&gt;required();

#* SHOULD:
if (n &amp;&amp; (n-&gt;isElementNode() &amp;&amp; static_cast&lt;Element*&gt;(n)-&gt;canValidate()))
  return static_cast&lt;ValidatableElement*&gt;(n)-&gt;required();

# toTextControlElement in WebKit/blackberry/WebKitSupport/DOMSupport.cpp
#* NOW:
  if (!element-&gt;isFormControlElement())
     return 0;
  HTMLFormControlElement* formElement = static_cast&lt;HTMLFormControlElement*&gt;(element);
  if (!formElement-&gt;isTextFormControl())
     return 0;
#* SHOULD: TBD

# findPasswordFormFields in WebKit/chromium/src/WebPasswordFormUtils.cpp
#* NOW:
if (!formElements[i]-&gt;isFormControlElement())
   continue;
HTMLFormControlElement* formElement = static_cast&lt;HTMLFormControlElement*&gt;(formElements[i]);
if (formElement-&gt;isActivatedSubmit())
    fields-&gt;submit = formElement;
#* SHOULD: TBD

#  WebElement::isFormControlElement
#* NOW: return constUnwrap&lt;Element&gt;()-&gt;isFormControlElement();
#* SHOULD: This is OK.

== References ==
[1] HTMLFormControlCollection
http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection-0

[2] Listed Element
http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#category-listed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1712541</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-12-07 12:21:01 -0800</bug_when>
    <thetext>&lt;rdar://problem/72058636&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1920347</commentid>
    <comment_count>2</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2022-12-18 06:32:38 -0800</bug_when>
    <thetext>All dependent bugs are now fixed. Should we need to track this 2012 bug further? Thanks!</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>