Changeset 158537 in webkit


Ignore:
Timestamp:
Nov 3, 2013 12:19:52 PM (10 years ago)
Author:
Antti Koivisto
Message:

Switch createContextualFragment to element iterator
https://bugs.webkit.org/show_bug.cgi?id=123704

Reviewed by Andreas Kling.

  • editing/FrameSelection.cpp:

(WebCore::scanForForm):

Use type helpers instead of hasTagName

  • editing/markup.cpp:

(WebCore::collectElementsToRemoveFromFragment):
(WebCore::removeElementFromFragmentPreservingChildren):
(WebCore::createContextualFragment):

  • html/HTMLFormElement.cpp:

(WebCore::HTMLFormElement::formElementIndex):

Use type helpers instead of hasTagName

  • html/HTMLTagNames.in:


Generate type helpers for <html>.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r158536 r158537  
     12013-11-03  Antti Koivisto  <antti@apple.com>
     2
     3        Switch createContextualFragment to element iterator
     4        https://bugs.webkit.org/show_bug.cgi?id=123704
     5
     6        Reviewed by Andreas Kling.
     7
     8        * editing/FrameSelection.cpp:
     9        (WebCore::scanForForm):
     10       
     11            Use type helpers instead of hasTagName
     12
     13        * editing/markup.cpp:
     14        (WebCore::collectElementsToRemoveFromFragment):
     15        (WebCore::removeElementFromFragmentPreservingChildren):
     16        (WebCore::createContextualFragment):
     17        * html/HTMLFormElement.cpp:
     18        (WebCore::HTMLFormElement::formElementIndex):
     19       
     20            Use type helpers instead of hasTagName
     21
     22        * html/HTMLTagNames.in:
     23       
     24            Generate type helpers for <html>.
     25
    1262013-11-03  Antti Koivisto  <antti@apple.com>
    227
  • trunk/Source/WebCore/editing/FrameSelection.cpp

    r158530 r158537  
    19601960        if (isHTMLFormElement(&element))
    19611961            return toHTMLFormElement(&element);
    1962         if (element.isFormControlElement())
    1963             return static_cast<HTMLFormControlElement&>(element).form();
    1964         if (element.hasTagName(frameTag) || element.hasTagName(iframeTag)) {
    1965             if (HTMLFormElement* frameResult = scanForForm(toHTMLFrameElementBase(element).contentDocument()->documentElement()))
     1962        if (isHTMLFormControlElement(element))
     1963            return toHTMLFormControlElement(element).form();
     1964        if (isHTMLFrameElementBase(element)) {
     1965            Document* contentDocument = toHTMLFrameElementBase(element).contentDocument();
     1966            if (!contentDocument)
     1967                continue;
     1968            if (HTMLFormElement* frameResult = scanForForm(contentDocument->documentElement()))
    19661969                return frameResult;
    19671970        }
  • trunk/Source/WebCore/editing/markup.cpp

    r158163 r158537  
    903903}
    904904
    905 static inline void removeElementPreservingChildren(PassRefPtr<DocumentFragment> fragment, HTMLElement* element)
     905static Vector<Ref<HTMLElement>> collectElementsToRemoveFromFragment(ContainerNode& container)
     906{
     907    Vector<Ref<HTMLElement>> toRemove;
     908    auto children = childrenOfType<HTMLElement>(container);
     909    for (auto it = children.begin(), end = children.end(); it != end; ++it) {
     910        HTMLElement& element = *it;
     911        if (isHTMLHtmlElement(element)) {
     912            toRemove.append(element);
     913            collectElementsToRemoveFromFragment(element);
     914            continue;
     915        }
     916        if (isHTMLHeadElement(element) || isHTMLBodyElement(element))
     917            toRemove.append(element);
     918    }
     919    return toRemove;
     920}
     921
     922static void removeElementFromFragmentPreservingChildren(DocumentFragment& fragment, HTMLElement& element)
    906923{
    907924    RefPtr<Node> nextChild;
    908     for (RefPtr<Node> child = element->firstChild(); child; child = nextChild) {
     925    for (RefPtr<Node> child = element.firstChild(); child; child = nextChild) {
    909926        nextChild = child->nextSibling();
    910         element->removeChild(child.get(), ASSERT_NO_EXCEPTION);
    911         fragment->insertBefore(child, element, ASSERT_NO_EXCEPTION);
    912     }
    913     fragment->removeChild(element, ASSERT_NO_EXCEPTION);
     927        element.removeChild(child.get(), ASSERT_NO_EXCEPTION);
     928        fragment.insertBefore(child, &element, ASSERT_NO_EXCEPTION);
     929    }
     930    fragment.removeChild(&element, ASSERT_NO_EXCEPTION);
    914931}
    915932
     
    935952    // accommodate folks passing complete HTML documents to make the
    936953    // child of an element.
    937 
    938     RefPtr<HTMLElement> nextElement;
    939     for (RefPtr<HTMLElement> element = Traversal<HTMLElement>::firstWithin(fragment.get()); element; element = nextElement) {
    940         nextElement = Traversal<HTMLElement>::nextSibling(element.get());
    941         if (element->hasTagName(htmlTag) || element->hasTagName(headTag) || element->hasTagName(bodyTag)) {
    942             if (HTMLElement* firstChild = Traversal<HTMLElement>::firstChild(element.get()))
    943                 nextElement = firstChild;
    944             removeElementPreservingChildren(fragment, element.get());
    945         }
    946     }
     954    auto toRemove = collectElementsToRemoveFromFragment(*fragment);
     955    for (unsigned i = 0; i < toRemove.size(); ++i)
     956        removeElementFromFragmentPreservingChildren(*fragment, toRemove[i].get());
     957
    947958    return fragment.release();
    948959}
  • trunk/Source/WebCore/html/HTMLFormElement.cpp

    r158530 r158537  
    481481        if (&element == &associatedHTMLElement)
    482482            return i;
    483         if (!element.isFormControlElement() && !element.hasTagName(objectTag))
     483        if (!isHTMLFormControlElement(element) && !isHTMLObjectElement(element))
    484484            continue;
    485485        if (element.form() != this)
  • trunk/Source/WebCore/html/HTMLTagNames.in

    r157405 r158537  
    6262hgroup interfaceName=HTMLElement
    6363hr interfaceName=HTMLHRElement
    64 html
     64html generateTypeHelpers
    6565i interfaceName=HTMLElement
    6666iframe interfaceName=HTMLIFrameElement, generateTypeHelpers
Note: See TracChangeset for help on using the changeset viewer.