| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright (C) 2010 Google, Inc. All Rights Reserved. |    2  * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 
|    3  * Copyright (C) 2011 Apple Inc. All rights reserved. |    3  * Copyright (C) 2011 Apple Inc. All rights reserved. | 
|    4  * |    4  * | 
|    5  * Redistribution and use in source and binary forms, with or without |    5  * Redistribution and use in source and binary forms, with or without | 
|    6  * modification, are permitted provided that the following conditions |    6  * modification, are permitted provided that the following conditions | 
|    7  * are met: |    7  * are met: | 
|    8  * 1. Redistributions of source code must retain the above copyright |    8  * 1. Redistributions of source code must retain the above copyright | 
|    9  *    notice, this list of conditions and the following disclaimer. |    9  *    notice, this list of conditions and the following disclaimer. | 
|   10  * 2. Redistributions in binary form must reproduce the above copyright |   10  * 2. Redistributions in binary form must reproduce the above copyright | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   93  |   93  | 
|   94 inline bool isSelectScopeMarker(HTMLStackItem* item) { |   94 inline bool isSelectScopeMarker(HTMLStackItem* item) { | 
|   95   return !item->hasTagName(optgroupTag) && !item->hasTagName(optionTag); |   95   return !item->hasTagName(optgroupTag) && !item->hasTagName(optionTag); | 
|   96 } |   96 } | 
|   97  |   97  | 
|   98 }  // namespace |   98 }  // namespace | 
|   99  |   99  | 
|  100 HTMLElementStack::ElementRecord::ElementRecord(HTMLStackItem* item, |  100 HTMLElementStack::ElementRecord::ElementRecord(HTMLStackItem* item, | 
|  101                                                ElementRecord* next) |  101                                                ElementRecord* next) | 
|  102     : m_item(item), m_next(next) { |  102     : m_item(item), m_next(next) { | 
|  103   ASSERT(m_item); |  103   DCHECK(m_item); | 
|  104 } |  104 } | 
|  105  |  105  | 
|  106 void HTMLElementStack::ElementRecord::replaceElement(HTMLStackItem* item) { |  106 void HTMLElementStack::ElementRecord::replaceElement(HTMLStackItem* item) { | 
|  107   ASSERT(item); |  107   DCHECK(item); | 
|  108   ASSERT(!m_item || m_item->isElementNode()); |  108   DCHECK(!m_item || m_item->isElementNode()); | 
|  109   // FIXME: Should this call finishParsingChildren? |  109   // FIXME: Should this call finishParsingChildren? | 
|  110   m_item = item; |  110   m_item = item; | 
|  111 } |  111 } | 
|  112  |  112  | 
|  113 bool HTMLElementStack::ElementRecord::isAbove(ElementRecord* other) const { |  113 bool HTMLElementStack::ElementRecord::isAbove(ElementRecord* other) const { | 
|  114   for (ElementRecord* below = next(); below; below = below->next()) { |  114   for (ElementRecord* below = next(); below; below = below->next()) { | 
|  115     if (below == other) |  115     if (below == other) | 
|  116       return true; |  116       return true; | 
|  117   } |  117   } | 
|  118   return false; |  118   return false; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|  132 HTMLElementStack::~HTMLElementStack() {} |  132 HTMLElementStack::~HTMLElementStack() {} | 
|  133  |  133  | 
|  134 bool HTMLElementStack::hasOnlyOneElement() const { |  134 bool HTMLElementStack::hasOnlyOneElement() const { | 
|  135   return !topRecord()->next(); |  135   return !topRecord()->next(); | 
|  136 } |  136 } | 
|  137  |  137  | 
|  138 bool HTMLElementStack::secondElementIsHTMLBodyElement() const { |  138 bool HTMLElementStack::secondElementIsHTMLBodyElement() const { | 
|  139   // This is used the fragment case of <body> and <frameset> in the "in body" |  139   // This is used the fragment case of <body> and <frameset> in the "in body" | 
|  140   // insertion mode. |  140   // insertion mode. | 
|  141   // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.ht
     ml#parsing-main-inbody |  141   // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.ht
     ml#parsing-main-inbody | 
|  142   ASSERT(m_rootNode); |  142   DCHECK(m_rootNode); | 
|  143   // If we have a body element, it must always be the second element on the |  143   // If we have a body element, it must always be the second element on the | 
|  144   // stack, as we always start with an html element, and any other element |  144   // stack, as we always start with an html element, and any other element | 
|  145   // would cause the implicit creation of a body element. |  145   // would cause the implicit creation of a body element. | 
|  146   return !!m_bodyElement; |  146   return !!m_bodyElement; | 
|  147 } |  147 } | 
|  148  |  148  | 
|  149 void HTMLElementStack::popHTMLHeadElement() { |  149 void HTMLElementStack::popHTMLHeadElement() { | 
|  150   ASSERT(top() == m_headElement); |  150   DCHECK_EQ(top(), m_headElement); | 
|  151   m_headElement = nullptr; |  151   m_headElement = nullptr; | 
|  152   popCommon(); |  152   popCommon(); | 
|  153 } |  153 } | 
|  154  |  154  | 
|  155 void HTMLElementStack::popHTMLBodyElement() { |  155 void HTMLElementStack::popHTMLBodyElement() { | 
|  156   ASSERT(top() == m_bodyElement); |  156   DCHECK_EQ(top(), m_bodyElement); | 
|  157   m_bodyElement = nullptr; |  157   m_bodyElement = nullptr; | 
|  158   popCommon(); |  158   popCommon(); | 
|  159 } |  159 } | 
|  160  |  160  | 
|  161 void HTMLElementStack::popAll() { |  161 void HTMLElementStack::popAll() { | 
|  162   m_rootNode = nullptr; |  162   m_rootNode = nullptr; | 
|  163   m_headElement = nullptr; |  163   m_headElement = nullptr; | 
|  164   m_bodyElement = nullptr; |  164   m_bodyElement = nullptr; | 
|  165   m_stackDepth = 0; |  165   m_stackDepth = 0; | 
|  166   while (m_top) { |  166   while (m_top) { | 
|  167     Node& node = *topNode(); |  167     Node& node = *topNode(); | 
|  168     if (node.isElementNode()) { |  168     if (node.isElementNode()) { | 
|  169       toElement(node).finishParsingChildren(); |  169       toElement(node).finishParsingChildren(); | 
|  170       if (isHTMLSelectElement(node)) |  170       if (isHTMLSelectElement(node)) | 
|  171         toHTMLFormControlElement(node).setBlocksFormSubmission(true); |  171         toHTMLFormControlElement(node).setBlocksFormSubmission(true); | 
|  172     } |  172     } | 
|  173     m_top = m_top->releaseNext(); |  173     m_top = m_top->releaseNext(); | 
|  174   } |  174   } | 
|  175 } |  175 } | 
|  176  |  176  | 
|  177 void HTMLElementStack::pop() { |  177 void HTMLElementStack::pop() { | 
|  178   ASSERT(!topStackItem()->hasTagName(HTMLNames::headTag)); |  178   DCHECK(!topStackItem()->hasTagName(HTMLNames::headTag)); | 
|  179   popCommon(); |  179   popCommon(); | 
|  180 } |  180 } | 
|  181  |  181  | 
|  182 void HTMLElementStack::popUntil(const AtomicString& tagName) { |  182 void HTMLElementStack::popUntil(const AtomicString& tagName) { | 
|  183   while (!topStackItem()->matchesHTMLTag(tagName)) { |  183   while (!topStackItem()->matchesHTMLTag(tagName)) { | 
|  184     // pop() will ASSERT if a <body>, <head> or <html> will be popped. |  184     // pop() will ASSERT if a <body>, <head> or <html> will be popped. | 
|  185     pop(); |  185     pop(); | 
|  186   } |  186   } | 
|  187 } |  187 } | 
|  188  |  188  | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  253          item->hasTagName(SVGNames::descTag) || |  253          item->hasTagName(SVGNames::descTag) || | 
|  254          item->hasTagName(SVGNames::titleTag); |  254          item->hasTagName(SVGNames::titleTag); | 
|  255 } |  255 } | 
|  256  |  256  | 
|  257 void HTMLElementStack::popUntilForeignContentScopeMarker() { |  257 void HTMLElementStack::popUntilForeignContentScopeMarker() { | 
|  258   while (!isForeignContentScopeMarker(topStackItem())) |  258   while (!isForeignContentScopeMarker(topStackItem())) | 
|  259     pop(); |  259     pop(); | 
|  260 } |  260 } | 
|  261  |  261  | 
|  262 void HTMLElementStack::pushRootNode(HTMLStackItem* rootItem) { |  262 void HTMLElementStack::pushRootNode(HTMLStackItem* rootItem) { | 
|  263   ASSERT(rootItem->isDocumentFragmentNode()); |  263   DCHECK(rootItem->isDocumentFragmentNode()); | 
|  264   pushRootNodeCommon(rootItem); |  264   pushRootNodeCommon(rootItem); | 
|  265 } |  265 } | 
|  266  |  266  | 
|  267 void HTMLElementStack::pushHTMLHtmlElement(HTMLStackItem* item) { |  267 void HTMLElementStack::pushHTMLHtmlElement(HTMLStackItem* item) { | 
|  268   ASSERT(item->hasTagName(htmlTag)); |  268   DCHECK(item->hasTagName(htmlTag)); | 
|  269   pushRootNodeCommon(item); |  269   pushRootNodeCommon(item); | 
|  270 } |  270 } | 
|  271  |  271  | 
|  272 void HTMLElementStack::pushRootNodeCommon(HTMLStackItem* rootItem) { |  272 void HTMLElementStack::pushRootNodeCommon(HTMLStackItem* rootItem) { | 
|  273   ASSERT(!m_top); |  273   DCHECK(!m_top); | 
|  274   ASSERT(!m_rootNode); |  274   DCHECK(!m_rootNode); | 
|  275   m_rootNode = rootItem->node(); |  275   m_rootNode = rootItem->node(); | 
|  276   pushCommon(rootItem); |  276   pushCommon(rootItem); | 
|  277 } |  277 } | 
|  278  |  278  | 
|  279 void HTMLElementStack::pushHTMLHeadElement(HTMLStackItem* item) { |  279 void HTMLElementStack::pushHTMLHeadElement(HTMLStackItem* item) { | 
|  280   ASSERT(item->hasTagName(HTMLNames::headTag)); |  280   DCHECK(item->hasTagName(HTMLNames::headTag)); | 
|  281   ASSERT(!m_headElement); |  281   DCHECK(!m_headElement); | 
|  282   m_headElement = item->element(); |  282   m_headElement = item->element(); | 
|  283   pushCommon(item); |  283   pushCommon(item); | 
|  284 } |  284 } | 
|  285  |  285  | 
|  286 void HTMLElementStack::pushHTMLBodyElement(HTMLStackItem* item) { |  286 void HTMLElementStack::pushHTMLBodyElement(HTMLStackItem* item) { | 
|  287   ASSERT(item->hasTagName(HTMLNames::bodyTag)); |  287   DCHECK(item->hasTagName(HTMLNames::bodyTag)); | 
|  288   ASSERT(!m_bodyElement); |  288   DCHECK(!m_bodyElement); | 
|  289   m_bodyElement = item->element(); |  289   m_bodyElement = item->element(); | 
|  290   pushCommon(item); |  290   pushCommon(item); | 
|  291 } |  291 } | 
|  292  |  292  | 
|  293 void HTMLElementStack::push(HTMLStackItem* item) { |  293 void HTMLElementStack::push(HTMLStackItem* item) { | 
|  294   ASSERT(!item->hasTagName(htmlTag)); |  294   DCHECK(!item->hasTagName(htmlTag)); | 
|  295   ASSERT(!item->hasTagName(headTag)); |  295   DCHECK(!item->hasTagName(headTag)); | 
|  296   ASSERT(!item->hasTagName(bodyTag)); |  296   DCHECK(!item->hasTagName(bodyTag)); | 
|  297   ASSERT(m_rootNode); |  297   DCHECK(m_rootNode); | 
|  298   pushCommon(item); |  298   pushCommon(item); | 
|  299 } |  299 } | 
|  300  |  300  | 
|  301 void HTMLElementStack::insertAbove(HTMLStackItem* item, |  301 void HTMLElementStack::insertAbove(HTMLStackItem* item, | 
|  302                                    ElementRecord* recordBelow) { |  302                                    ElementRecord* recordBelow) { | 
|  303   ASSERT(item); |  303   DCHECK(item); | 
|  304   ASSERT(recordBelow); |  304   DCHECK(recordBelow); | 
|  305   ASSERT(m_top); |  305   DCHECK(m_top); | 
|  306   ASSERT(!item->hasTagName(htmlTag)); |  306   DCHECK(!item->hasTagName(htmlTag)); | 
|  307   ASSERT(!item->hasTagName(headTag)); |  307   DCHECK(!item->hasTagName(headTag)); | 
|  308   ASSERT(!item->hasTagName(bodyTag)); |  308   DCHECK(!item->hasTagName(bodyTag)); | 
|  309   ASSERT(m_rootNode); |  309   DCHECK(m_rootNode); | 
|  310   if (recordBelow == m_top) { |  310   if (recordBelow == m_top) { | 
|  311     push(item); |  311     push(item); | 
|  312     return; |  312     return; | 
|  313   } |  313   } | 
|  314  |  314  | 
|  315   for (ElementRecord* recordAbove = m_top.get(); recordAbove; |  315   for (ElementRecord* recordAbove = m_top.get(); recordAbove; | 
|  316        recordAbove = recordAbove->next()) { |  316        recordAbove = recordAbove->next()) { | 
|  317     if (recordAbove->next() != recordBelow) |  317     if (recordAbove->next() != recordBelow) | 
|  318       continue; |  318       continue; | 
|  319  |  319  | 
|  320     m_stackDepth++; |  320     m_stackDepth++; | 
|  321     recordAbove->setNext(new ElementRecord(item, recordAbove->releaseNext())); |  321     recordAbove->setNext(new ElementRecord(item, recordAbove->releaseNext())); | 
|  322     recordAbove->next()->element()->beginParsingChildren(); |  322     recordAbove->next()->element()->beginParsingChildren(); | 
|  323     return; |  323     return; | 
|  324   } |  324   } | 
|  325   ASSERT_NOT_REACHED(); |  325   NOTREACHED(); | 
|  326 } |  326 } | 
|  327  |  327  | 
|  328 HTMLElementStack::ElementRecord* HTMLElementStack::topRecord() const { |  328 HTMLElementStack::ElementRecord* HTMLElementStack::topRecord() const { | 
|  329   ASSERT(m_top); |  329   DCHECK(m_top); | 
|  330   return m_top.get(); |  330   return m_top.get(); | 
|  331 } |  331 } | 
|  332  |  332  | 
|  333 HTMLStackItem* HTMLElementStack::oneBelowTop() const { |  333 HTMLStackItem* HTMLElementStack::oneBelowTop() const { | 
|  334   // We should never call this if there are fewer than 2 elements on the stack. |  334   // We should never call this if there are fewer than 2 elements on the stack. | 
|  335   ASSERT(m_top); |  335   DCHECK(m_top); | 
|  336   ASSERT(m_top->next()); |  336   DCHECK(m_top->next()); | 
|  337   if (m_top->next()->stackItem()->isElementNode()) |  337   if (m_top->next()->stackItem()->isElementNode()) | 
|  338     return m_top->next()->stackItem(); |  338     return m_top->next()->stackItem(); | 
|  339   return nullptr; |  339   return nullptr; | 
|  340 } |  340 } | 
|  341  |  341  | 
|  342 void HTMLElementStack::removeHTMLHeadElement(Element* element) { |  342 void HTMLElementStack::removeHTMLHeadElement(Element* element) { | 
|  343   ASSERT(m_headElement == element); |  343   DCHECK_EQ(m_headElement, element); | 
|  344   if (m_top->element() == element) { |  344   if (m_top->element() == element) { | 
|  345     popHTMLHeadElement(); |  345     popHTMLHeadElement(); | 
|  346     return; |  346     return; | 
|  347   } |  347   } | 
|  348   m_headElement = nullptr; |  348   m_headElement = nullptr; | 
|  349   removeNonTopCommon(element); |  349   removeNonTopCommon(element); | 
|  350 } |  350 } | 
|  351  |  351  | 
|  352 void HTMLElementStack::remove(Element* element) { |  352 void HTMLElementStack::remove(Element* element) { | 
|  353   ASSERT(!isHTMLHeadElement(element)); |  353   DCHECK(!isHTMLHeadElement(element)); | 
|  354   if (m_top->element() == element) { |  354   if (m_top->element() == element) { | 
|  355     pop(); |  355     pop(); | 
|  356     return; |  356     return; | 
|  357   } |  357   } | 
|  358   removeNonTopCommon(element); |  358   removeNonTopCommon(element); | 
|  359 } |  359 } | 
|  360  |  360  | 
|  361 HTMLElementStack::ElementRecord* HTMLElementStack::find( |  361 HTMLElementStack::ElementRecord* HTMLElementStack::find( | 
|  362     Element* element) const { |  362     Element* element) const { | 
|  363   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { |  363   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
|  387 template <bool isMarker(HTMLStackItem*)> |  387 template <bool isMarker(HTMLStackItem*)> | 
|  388 bool inScopeCommon(HTMLElementStack::ElementRecord* top, |  388 bool inScopeCommon(HTMLElementStack::ElementRecord* top, | 
|  389                    const AtomicString& targetTag) { |  389                    const AtomicString& targetTag) { | 
|  390   for (HTMLElementStack::ElementRecord* pos = top; pos; pos = pos->next()) { |  390   for (HTMLElementStack::ElementRecord* pos = top; pos; pos = pos->next()) { | 
|  391     HTMLStackItem* item = pos->stackItem(); |  391     HTMLStackItem* item = pos->stackItem(); | 
|  392     if (item->matchesHTMLTag(targetTag)) |  392     if (item->matchesHTMLTag(targetTag)) | 
|  393       return true; |  393       return true; | 
|  394     if (isMarker(item)) |  394     if (isMarker(item)) | 
|  395       return false; |  395       return false; | 
|  396   } |  396   } | 
|  397   ASSERT_NOT_REACHED();  // <html> is always on the stack and is a scope marker. |  397   NOTREACHED();  // <html> is always on the stack and is a scope marker. | 
|  398   return false; |  398   return false; | 
|  399 } |  399 } | 
|  400  |  400  | 
|  401 bool HTMLElementStack::hasNumberedHeaderElementInScope() const { |  401 bool HTMLElementStack::hasNumberedHeaderElementInScope() const { | 
|  402   for (ElementRecord* record = m_top.get(); record; record = record->next()) { |  402   for (ElementRecord* record = m_top.get(); record; record = record->next()) { | 
|  403     HTMLStackItem* item = record->stackItem(); |  403     HTMLStackItem* item = record->stackItem(); | 
|  404     if (item->isNumberedHeaderElement()) |  404     if (item->isNumberedHeaderElement()) | 
|  405       return true; |  405       return true; | 
|  406     if (isScopeMarker(item)) |  406     if (isScopeMarker(item)) | 
|  407       return false; |  407       return false; | 
|  408   } |  408   } | 
|  409   ASSERT_NOT_REACHED();  // <html> is always on the stack and is a scope marker. |  409   NOTREACHED();  // <html> is always on the stack and is a scope marker. | 
|  410   return false; |  410   return false; | 
|  411 } |  411 } | 
|  412  |  412  | 
|  413 bool HTMLElementStack::inScope(Element* targetElement) const { |  413 bool HTMLElementStack::inScope(Element* targetElement) const { | 
|  414   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { |  414   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { | 
|  415     HTMLStackItem* item = pos->stackItem(); |  415     HTMLStackItem* item = pos->stackItem(); | 
|  416     if (item->node() == targetElement) |  416     if (item->node() == targetElement) | 
|  417       return true; |  417       return true; | 
|  418     if (isScopeMarker(item)) |  418     if (isScopeMarker(item)) | 
|  419       return false; |  419       return false; | 
|  420   } |  420   } | 
|  421   ASSERT_NOT_REACHED();  // <html> is always on the stack and is a scope marker. |  421   NOTREACHED();  // <html> is always on the stack and is a scope marker. | 
|  422   return false; |  422   return false; | 
|  423 } |  423 } | 
|  424  |  424  | 
|  425 bool HTMLElementStack::inScope(const AtomicString& targetTag) const { |  425 bool HTMLElementStack::inScope(const AtomicString& targetTag) const { | 
|  426   return inScopeCommon<isScopeMarker>(m_top.get(), targetTag); |  426   return inScopeCommon<isScopeMarker>(m_top.get(), targetTag); | 
|  427 } |  427 } | 
|  428  |  428  | 
|  429 bool HTMLElementStack::inScope(const QualifiedName& tagName) const { |  429 bool HTMLElementStack::inScope(const QualifiedName& tagName) const { | 
|  430   return inScope(tagName.localName()); |  430   return inScope(tagName.localName()); | 
|  431 } |  431 } | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|  460  |  460  | 
|  461 bool HTMLElementStack::inSelectScope(const QualifiedName& tagName) const { |  461 bool HTMLElementStack::inSelectScope(const QualifiedName& tagName) const { | 
|  462   return inSelectScope(tagName.localName()); |  462   return inSelectScope(tagName.localName()); | 
|  463 } |  463 } | 
|  464  |  464  | 
|  465 bool HTMLElementStack::hasTemplateInHTMLScope() const { |  465 bool HTMLElementStack::hasTemplateInHTMLScope() const { | 
|  466   return inScopeCommon<isRootNode>(m_top.get(), templateTag.localName()); |  466   return inScopeCommon<isRootNode>(m_top.get(), templateTag.localName()); | 
|  467 } |  467 } | 
|  468  |  468  | 
|  469 Element* HTMLElementStack::htmlElement() const { |  469 Element* HTMLElementStack::htmlElement() const { | 
|  470   ASSERT(m_rootNode); |  470   DCHECK(m_rootNode); | 
|  471   return toElement(m_rootNode); |  471   return toElement(m_rootNode); | 
|  472 } |  472 } | 
|  473  |  473  | 
|  474 Element* HTMLElementStack::headElement() const { |  474 Element* HTMLElementStack::headElement() const { | 
|  475   ASSERT(m_headElement); |  475   DCHECK(m_headElement); | 
|  476   return m_headElement; |  476   return m_headElement; | 
|  477 } |  477 } | 
|  478  |  478  | 
|  479 Element* HTMLElementStack::bodyElement() const { |  479 Element* HTMLElementStack::bodyElement() const { | 
|  480   ASSERT(m_bodyElement); |  480   DCHECK(m_bodyElement); | 
|  481   return m_bodyElement; |  481   return m_bodyElement; | 
|  482 } |  482 } | 
|  483  |  483  | 
|  484 ContainerNode* HTMLElementStack::rootNode() const { |  484 ContainerNode* HTMLElementStack::rootNode() const { | 
|  485   ASSERT(m_rootNode); |  485   DCHECK(m_rootNode); | 
|  486   return m_rootNode; |  486   return m_rootNode; | 
|  487 } |  487 } | 
|  488  |  488  | 
|  489 void HTMLElementStack::pushCommon(HTMLStackItem* item) { |  489 void HTMLElementStack::pushCommon(HTMLStackItem* item) { | 
|  490   ASSERT(m_rootNode); |  490   DCHECK(m_rootNode); | 
|  491  |  491  | 
|  492   m_stackDepth++; |  492   m_stackDepth++; | 
|  493   m_top = new ElementRecord(item, m_top.release()); |  493   m_top = new ElementRecord(item, m_top.release()); | 
|  494 } |  494 } | 
|  495  |  495  | 
|  496 void HTMLElementStack::popCommon() { |  496 void HTMLElementStack::popCommon() { | 
|  497   ASSERT(!topStackItem()->hasTagName(htmlTag)); |  497   DCHECK(!topStackItem()->hasTagName(htmlTag)); | 
|  498   ASSERT(!topStackItem()->hasTagName(headTag) || !m_headElement); |  498   DCHECK(!topStackItem()->hasTagName(headTag) || !m_headElement); | 
|  499   ASSERT(!topStackItem()->hasTagName(bodyTag) || !m_bodyElement); |  499   DCHECK(!topStackItem()->hasTagName(bodyTag) || !m_bodyElement); | 
|  500   top()->finishParsingChildren(); |  500   top()->finishParsingChildren(); | 
|  501   m_top = m_top->releaseNext(); |  501   m_top = m_top->releaseNext(); | 
|  502  |  502  | 
|  503   m_stackDepth--; |  503   m_stackDepth--; | 
|  504 } |  504 } | 
|  505  |  505  | 
|  506 void HTMLElementStack::removeNonTopCommon(Element* element) { |  506 void HTMLElementStack::removeNonTopCommon(Element* element) { | 
|  507   ASSERT(!isHTMLHtmlElement(element)); |  507   DCHECK(!isHTMLHtmlElement(element)); | 
|  508   ASSERT(!isHTMLBodyElement(element)); |  508   DCHECK(!isHTMLBodyElement(element)); | 
|  509   ASSERT(top() != element); |  509   DCHECK_NE(top(), element); | 
|  510   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { |  510   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { | 
|  511     if (pos->next()->element() == element) { |  511     if (pos->next()->element() == element) { | 
|  512       // FIXME: Is it OK to call finishParsingChildren() |  512       // FIXME: Is it OK to call finishParsingChildren() | 
|  513       // when the children aren't actually finished? |  513       // when the children aren't actually finished? | 
|  514       element->finishParsingChildren(); |  514       element->finishParsingChildren(); | 
|  515       pos->setNext(pos->next()->releaseNext()); |  515       pos->setNext(pos->next()->releaseNext()); | 
|  516       m_stackDepth--; |  516       m_stackDepth--; | 
|  517       return; |  517       return; | 
|  518     } |  518     } | 
|  519   } |  519   } | 
|  520   ASSERT_NOT_REACHED(); |  520   NOTREACHED(); | 
|  521 } |  521 } | 
|  522  |  522  | 
|  523 HTMLElementStack::ElementRecord* |  523 HTMLElementStack::ElementRecord* | 
|  524 HTMLElementStack::furthestBlockForFormattingElement( |  524 HTMLElementStack::furthestBlockForFormattingElement( | 
|  525     Element* formattingElement) const { |  525     Element* formattingElement) const { | 
|  526   ElementRecord* furthestBlock = 0; |  526   ElementRecord* furthestBlock = 0; | 
|  527   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { |  527   for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { | 
|  528     if (pos->element() == formattingElement) |  528     if (pos->element() == formattingElement) | 
|  529       return furthestBlock; |  529       return furthestBlock; | 
|  530     if (pos->stackItem()->isSpecialNode()) |  530     if (pos->stackItem()->isSpecialNode()) | 
|  531       furthestBlock = pos; |  531       furthestBlock = pos; | 
|  532   } |  532   } | 
|  533   ASSERT_NOT_REACHED(); |  533   NOTREACHED(); | 
|  534   return nullptr; |  534   return nullptr; | 
|  535 } |  535 } | 
|  536  |  536  | 
|  537 DEFINE_TRACE(HTMLElementStack) { |  537 DEFINE_TRACE(HTMLElementStack) { | 
|  538   visitor->trace(m_top); |  538   visitor->trace(m_top); | 
|  539   visitor->trace(m_rootNode); |  539   visitor->trace(m_rootNode); | 
|  540   visitor->trace(m_headElement); |  540   visitor->trace(m_headElement); | 
|  541   visitor->trace(m_bodyElement); |  541   visitor->trace(m_bodyElement); | 
|  542 } |  542 } | 
|  543  |  543  | 
|  544 #ifndef NDEBUG |  544 #ifndef NDEBUG | 
|  545  |  545  | 
|  546 void HTMLElementStack::show() { |  546 void HTMLElementStack::show() { | 
|  547   for (ElementRecord* record = m_top.get(); record; record = record->next()) |  547   for (ElementRecord* record = m_top.get(); record; record = record->next()) | 
|  548     LOG(INFO) << *record->element(); |  548     LOG(INFO) << *record->element(); | 
|  549 } |  549 } | 
|  550  |  550  | 
|  551 #endif |  551 #endif | 
|  552  |  552  | 
|  553 }  // namespace blink |  553 }  // namespace blink | 
| OLD | NEW |