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 13 matching lines...) Expand all Loading... |
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 */ | 25 */ |
26 | 26 |
27 #include "config.h" | 27 #include "config.h" |
28 #include "core/html/parser/HTMLElementStack.h" | 28 #include "core/html/parser/HTMLElementStack.h" |
29 | 29 |
30 #include "HTMLNames.h" | 30 #include "HTMLNames.h" |
31 #include "MathMLNames.h" | 31 #include "MathMLNames.h" |
32 #include "SVGNames.h" | 32 #include "SVGNames.h" |
33 #include "core/dom/Element.h" | 33 #include "core/dom/Element.h" |
| 34 #include "core/html/HTMLHtmlElement.h" |
34 #include "core/html/HTMLOptGroupElement.h" | 35 #include "core/html/HTMLOptGroupElement.h" |
35 #include "core/html/HTMLTableElement.h" | 36 #include "core/html/HTMLTableElement.h" |
36 #include <wtf/PassOwnPtr.h> | 37 #include <wtf/PassOwnPtr.h> |
37 | 38 |
38 namespace WebCore { | 39 namespace WebCore { |
39 | 40 |
40 using namespace HTMLNames; | 41 using namespace HTMLNames; |
41 | 42 |
42 | 43 |
43 namespace { | 44 namespace { |
44 | 45 |
45 inline bool isRootNode(HTMLStackItem* item) | 46 inline bool isRootNode(HTMLStackItem* item) |
46 { | 47 { |
47 return item->isDocumentFragmentNode() | 48 return item->isDocumentFragmentNode() |
48 || item->hasTagName(htmlTag); | 49 || isHTMLHtmlElement(item->node()); |
49 } | 50 } |
50 | 51 |
51 inline bool isScopeMarker(HTMLStackItem* item) | 52 inline bool isScopeMarker(HTMLStackItem* item) |
52 { | 53 { |
53 return item->hasTagName(appletTag) | 54 return item->hasTagName(appletTag) |
54 || item->hasTagName(captionTag) | 55 || item->hasTagName(captionTag) |
55 || item->hasTagName(marqueeTag) | 56 || item->hasTagName(marqueeTag) |
56 || item->hasTagName(objectTag) | 57 || item->hasTagName(objectTag) |
57 || isHTMLTableElement(item->node()) | 58 || isHTMLTableElement(item->node()) |
58 || item->hasTagName(tdTag) | 59 || item->hasTagName(tdTag) |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 } | 303 } |
303 | 304 |
304 void HTMLElementStack::pushRootNode(PassRefPtr<HTMLStackItem> rootItem) | 305 void HTMLElementStack::pushRootNode(PassRefPtr<HTMLStackItem> rootItem) |
305 { | 306 { |
306 ASSERT(rootItem->isDocumentFragmentNode()); | 307 ASSERT(rootItem->isDocumentFragmentNode()); |
307 pushRootNodeCommon(rootItem); | 308 pushRootNodeCommon(rootItem); |
308 } | 309 } |
309 | 310 |
310 void HTMLElementStack::pushHTMLHtmlElement(PassRefPtr<HTMLStackItem> item) | 311 void HTMLElementStack::pushHTMLHtmlElement(PassRefPtr<HTMLStackItem> item) |
311 { | 312 { |
312 ASSERT(item->hasTagName(HTMLNames::htmlTag)); | 313 ASSERT(isHTMLHtmlElement(item->node())); |
313 pushRootNodeCommon(item); | 314 pushRootNodeCommon(item); |
314 } | 315 } |
315 | 316 |
316 void HTMLElementStack::pushRootNodeCommon(PassRefPtr<HTMLStackItem> rootItem) | 317 void HTMLElementStack::pushRootNodeCommon(PassRefPtr<HTMLStackItem> rootItem) |
317 { | 318 { |
318 ASSERT(!m_top); | 319 ASSERT(!m_top); |
319 ASSERT(!m_rootNode); | 320 ASSERT(!m_rootNode); |
320 m_rootNode = rootItem->node(); | 321 m_rootNode = rootItem->node(); |
321 pushCommon(rootItem); | 322 pushCommon(rootItem); |
322 } | 323 } |
323 | 324 |
324 void HTMLElementStack::pushHTMLHeadElement(PassRefPtr<HTMLStackItem> item) | 325 void HTMLElementStack::pushHTMLHeadElement(PassRefPtr<HTMLStackItem> item) |
325 { | 326 { |
326 ASSERT(item->hasTagName(HTMLNames::headTag)); | 327 ASSERT(item->hasTagName(HTMLNames::headTag)); |
327 ASSERT(!m_headElement); | 328 ASSERT(!m_headElement); |
328 m_headElement = item->element(); | 329 m_headElement = item->element(); |
329 pushCommon(item); | 330 pushCommon(item); |
330 } | 331 } |
331 | 332 |
332 void HTMLElementStack::pushHTMLBodyElement(PassRefPtr<HTMLStackItem> item) | 333 void HTMLElementStack::pushHTMLBodyElement(PassRefPtr<HTMLStackItem> item) |
333 { | 334 { |
334 ASSERT(item->hasTagName(HTMLNames::bodyTag)); | 335 ASSERT(item->hasTagName(HTMLNames::bodyTag)); |
335 ASSERT(!m_bodyElement); | 336 ASSERT(!m_bodyElement); |
336 m_bodyElement = item->element(); | 337 m_bodyElement = item->element(); |
337 pushCommon(item); | 338 pushCommon(item); |
338 } | 339 } |
339 | 340 |
340 void HTMLElementStack::push(PassRefPtr<HTMLStackItem> item) | 341 void HTMLElementStack::push(PassRefPtr<HTMLStackItem> item) |
341 { | 342 { |
342 ASSERT(!item->hasTagName(HTMLNames::htmlTag)); | 343 ASSERT(!isHTMLHtmlElement(item->node())); |
343 ASSERT(!item->hasTagName(HTMLNames::headTag)); | 344 ASSERT(!item->hasTagName(HTMLNames::headTag)); |
344 ASSERT(!item->hasTagName(HTMLNames::bodyTag)); | 345 ASSERT(!item->hasTagName(HTMLNames::bodyTag)); |
345 ASSERT(m_rootNode); | 346 ASSERT(m_rootNode); |
346 pushCommon(item); | 347 pushCommon(item); |
347 } | 348 } |
348 | 349 |
349 void HTMLElementStack::insertAbove(PassRefPtr<HTMLStackItem> item, ElementRecord
* recordBelow) | 350 void HTMLElementStack::insertAbove(PassRefPtr<HTMLStackItem> item, ElementRecord
* recordBelow) |
350 { | 351 { |
351 ASSERT(item); | 352 ASSERT(item); |
352 ASSERT(recordBelow); | 353 ASSERT(recordBelow); |
353 ASSERT(m_top); | 354 ASSERT(m_top); |
354 ASSERT(!item->hasTagName(HTMLNames::htmlTag)); | 355 ASSERT(!isHTMLHtmlElement(item->node())); |
355 ASSERT(!item->hasTagName(HTMLNames::headTag)); | 356 ASSERT(!item->hasTagName(HTMLNames::headTag)); |
356 ASSERT(!item->hasTagName(HTMLNames::bodyTag)); | 357 ASSERT(!item->hasTagName(HTMLNames::bodyTag)); |
357 ASSERT(m_rootNode); | 358 ASSERT(m_rootNode); |
358 if (recordBelow == m_top) { | 359 if (recordBelow == m_top) { |
359 push(item); | 360 push(item); |
360 return; | 361 return; |
361 } | 362 } |
362 | 363 |
363 for (ElementRecord* recordAbove = m_top.get(); recordAbove; recordAbove = re
cordAbove->next()) { | 364 for (ElementRecord* recordAbove = m_top.get(); recordAbove; recordAbove = re
cordAbove->next()) { |
364 if (recordAbove->next() != recordBelow) | 365 if (recordAbove->next() != recordBelow) |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 void HTMLElementStack::pushCommon(PassRefPtr<HTMLStackItem> item) | 560 void HTMLElementStack::pushCommon(PassRefPtr<HTMLStackItem> item) |
560 { | 561 { |
561 ASSERT(m_rootNode); | 562 ASSERT(m_rootNode); |
562 | 563 |
563 m_stackDepth++; | 564 m_stackDepth++; |
564 m_top = adoptPtr(new ElementRecord(item, m_top.release())); | 565 m_top = adoptPtr(new ElementRecord(item, m_top.release())); |
565 } | 566 } |
566 | 567 |
567 void HTMLElementStack::popCommon() | 568 void HTMLElementStack::popCommon() |
568 { | 569 { |
569 ASSERT(!topStackItem()->hasTagName(HTMLNames::htmlTag)); | 570 ASSERT(!isHTMLHtmlElement(topStackItem()->node())); |
570 ASSERT(!topStackItem()->hasTagName(HTMLNames::headTag) || !m_headElement); | 571 ASSERT(!topStackItem()->hasTagName(HTMLNames::headTag) || !m_headElement); |
571 ASSERT(!topStackItem()->hasTagName(HTMLNames::bodyTag) || !m_bodyElement); | 572 ASSERT(!topStackItem()->hasTagName(HTMLNames::bodyTag) || !m_bodyElement); |
572 top()->finishParsingChildren(); | 573 top()->finishParsingChildren(); |
573 m_top = m_top->releaseNext(); | 574 m_top = m_top->releaseNext(); |
574 | 575 |
575 m_stackDepth--; | 576 m_stackDepth--; |
576 } | 577 } |
577 | 578 |
578 void HTMLElementStack::removeNonTopCommon(Element* element) | 579 void HTMLElementStack::removeNonTopCommon(Element* element) |
579 { | 580 { |
580 ASSERT(!element->hasTagName(HTMLNames::htmlTag)); | 581 ASSERT(!isHTMLHtmlElement(element)); |
581 ASSERT(!element->hasTagName(HTMLNames::bodyTag)); | 582 ASSERT(!element->hasTagName(HTMLNames::bodyTag)); |
582 ASSERT(top() != element); | 583 ASSERT(top() != element); |
583 for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { | 584 for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { |
584 if (pos->next()->element() == element) { | 585 if (pos->next()->element() == element) { |
585 // FIXME: Is it OK to call finishParsingChildren() | 586 // FIXME: Is it OK to call finishParsingChildren() |
586 // when the children aren't actually finished? | 587 // when the children aren't actually finished? |
587 element->finishParsingChildren(); | 588 element->finishParsingChildren(); |
588 pos->setNext(pos->next()->releaseNext()); | 589 pos->setNext(pos->next()->releaseNext()); |
589 m_stackDepth--; | 590 m_stackDepth--; |
590 return; | 591 return; |
(...skipping 19 matching lines...) Expand all Loading... |
610 | 611 |
611 void HTMLElementStack::show() | 612 void HTMLElementStack::show() |
612 { | 613 { |
613 for (ElementRecord* record = m_top.get(); record; record = record->next()) | 614 for (ElementRecord* record = m_top.get(); record; record = record->next()) |
614 record->element()->showNode(); | 615 record->element()->showNode(); |
615 } | 616 } |
616 | 617 |
617 #endif | 618 #endif |
618 | 619 |
619 } | 620 } |
OLD | NEW |