Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: Source/core/html/parser/HTMLTreeBuilder.cpp

Issue 51983003: Stop using static arrays for *Tags / *Attrs (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Improve generated code Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 if (item->isSpecialNode() && !item->hasTagName(addressTag) && !item->has TagName(divTag) && !item->hasTagName(pTag)) 539 if (item->isSpecialNode() && !item->hasTagName(addressTag) && !item->has TagName(divTag) && !item->hasTagName(pTag))
540 break; 540 break;
541 nodeRecord = nodeRecord->next(); 541 nodeRecord = nodeRecord->next();
542 } 542 }
543 processFakePEndTagIfPInButtonScope(); 543 processFakePEndTagIfPInButtonScope();
544 m_tree.insertHTMLElement(token); 544 m_tree.insertHTMLElement(token);
545 } 545 }
546 546
547 typedef HashMap<AtomicString, QualifiedName> PrefixedNameToQualifiedNameMap; 547 typedef HashMap<AtomicString, QualifiedName> PrefixedNameToQualifiedNameMap;
548 548
549 static void mapLoweredLocalNameToName(PrefixedNameToQualifiedNameMap* map, const QualifiedName* const* names, size_t length) 549 static void mapLoweredLocalNameToName(PrefixedNameToQualifiedNameMap* map, const Vector<const QualifiedName*>& names)
550 { 550 {
551 size_t length = names.size();
551 for (size_t i = 0; i < length; ++i) { 552 for (size_t i = 0; i < length; ++i) {
552 const QualifiedName& name = *names[i]; 553 const QualifiedName& name = *names[i];
553 const AtomicString& localName = name.localName(); 554 const AtomicString& localName = name.localName();
554 AtomicString loweredLocalName = localName.lower(); 555 AtomicString loweredLocalName = localName.lower();
555 if (loweredLocalName != localName) 556 if (loweredLocalName != localName)
556 map->add(loweredLocalName, name); 557 map->add(loweredLocalName, name);
557 } 558 }
558 } 559 }
559 560
560 static void adjustSVGTagNameCase(AtomicHTMLToken* token) 561 static void adjustSVGTagNameCase(AtomicHTMLToken* token)
561 { 562 {
562 static PrefixedNameToQualifiedNameMap* caseMap = 0; 563 static PrefixedNameToQualifiedNameMap* caseMap = 0;
563 if (!caseMap) { 564 if (!caseMap) {
564 caseMap = new PrefixedNameToQualifiedNameMap; 565 caseMap = new PrefixedNameToQualifiedNameMap;
565 const QualifiedName* const* svgTags = SVGNames::getSVGTags(); 566 Vector<const QualifiedName*> svgTags;
566 mapLoweredLocalNameToName(caseMap, svgTags, SVGNames::SVGTagsCount); 567 SVGNames::getSVGTags(svgTags);
568 mapLoweredLocalNameToName(caseMap, svgTags);
567 } 569 }
568 570
569 const QualifiedName& casedName = caseMap->get(token->name()); 571 const QualifiedName& casedName = caseMap->get(token->name());
570 if (casedName.localName().isNull()) 572 if (casedName.localName().isNull())
571 return; 573 return;
572 token->setName(casedName.localName()); 574 token->setName(casedName.localName());
573 } 575 }
574 576
575 template<const QualifiedName* const* getAttrs(), unsigned length> 577 template<void getAttrs(Vector<const QualifiedName*>&)>
576 static void adjustAttributes(AtomicHTMLToken* token) 578 static void adjustAttributes(AtomicHTMLToken* token)
577 { 579 {
578 static PrefixedNameToQualifiedNameMap* caseMap = 0; 580 static PrefixedNameToQualifiedNameMap* caseMap = 0;
579 if (!caseMap) { 581 if (!caseMap) {
580 caseMap = new PrefixedNameToQualifiedNameMap; 582 caseMap = new PrefixedNameToQualifiedNameMap;
581 const QualifiedName* const* attrs = getAttrs(); 583 Vector<const QualifiedName*> attrs;
582 mapLoweredLocalNameToName(caseMap, attrs, length); 584 getAttrs(attrs);
585 mapLoweredLocalNameToName(caseMap, attrs);
583 } 586 }
584 587
585 for (unsigned i = 0; i < token->attributes().size(); ++i) { 588 for (unsigned i = 0; i < token->attributes().size(); ++i) {
586 Attribute& tokenAttribute = token->attributes().at(i); 589 Attribute& tokenAttribute = token->attributes().at(i);
587 const QualifiedName& casedName = caseMap->get(tokenAttribute.localName() ); 590 const QualifiedName& casedName = caseMap->get(tokenAttribute.localName() );
588 if (!casedName.localName().isNull()) 591 if (!casedName.localName().isNull())
589 tokenAttribute.parserSetName(casedName); 592 tokenAttribute.parserSetName(casedName);
590 } 593 }
591 } 594 }
592 595
593 static void adjustSVGAttributes(AtomicHTMLToken* token) 596 static void adjustSVGAttributes(AtomicHTMLToken* token)
594 { 597 {
595 adjustAttributes<SVGNames::getSVGAttrs, SVGNames::SVGAttrsCount>(token); 598 adjustAttributes<SVGNames::getSVGAttrs>(token);
596 } 599 }
597 600
598 static void adjustMathMLAttributes(AtomicHTMLToken* token) 601 static void adjustMathMLAttributes(AtomicHTMLToken* token)
599 { 602 {
600 adjustAttributes<MathMLNames::getMathMLAttrs, MathMLNames::MathMLAttrsCount> (token); 603 adjustAttributes<MathMLNames::getMathMLAttrs>(token);
601 } 604 }
602 605
603 static void addNamesWithPrefix(PrefixedNameToQualifiedNameMap* map, const Atomic String& prefix, const QualifiedName* const* names, size_t length) 606 static void addNamesWithPrefix(PrefixedNameToQualifiedNameMap* map, const Atomic String& prefix, const Vector<const QualifiedName*>& names)
604 { 607 {
608 size_t length = names.size();
605 for (size_t i = 0; i < length; ++i) { 609 for (size_t i = 0; i < length; ++i) {
606 const QualifiedName* name = names[i]; 610 const QualifiedName* name = names[i];
607 const AtomicString& localName = name->localName(); 611 const AtomicString& localName = name->localName();
608 AtomicString prefixColonLocalName = prefix + ':' + localName; 612 AtomicString prefixColonLocalName = prefix + ':' + localName;
609 QualifiedName nameWithPrefix(prefix, localName, name->namespaceURI()); 613 QualifiedName nameWithPrefix(prefix, localName, name->namespaceURI());
610 map->add(prefixColonLocalName, nameWithPrefix); 614 map->add(prefixColonLocalName, nameWithPrefix);
611 } 615 }
612 } 616 }
613 617
614 static void adjustForeignAttributes(AtomicHTMLToken* token) 618 static void adjustForeignAttributes(AtomicHTMLToken* token)
615 { 619 {
616 static PrefixedNameToQualifiedNameMap* map = 0; 620 static PrefixedNameToQualifiedNameMap* map = 0;
617 if (!map) { 621 if (!map) {
618 map = new PrefixedNameToQualifiedNameMap; 622 map = new PrefixedNameToQualifiedNameMap;
619 623
620 const QualifiedName* const* attrs = XLinkNames::getXLinkAttrs(); 624 Vector<const QualifiedName*> attrs;
621 addNamesWithPrefix(map, xlinkAtom, attrs, XLinkNames::XLinkAttrsCount); 625 XLinkNames::getXLinkAttrs(attrs);
626 addNamesWithPrefix(map, xlinkAtom, attrs);
622 627
623 attrs = XMLNames::getXMLAttrs(); 628 XMLNames::getXMLAttrs(attrs);
624 addNamesWithPrefix(map, xmlAtom, attrs, XMLNames::XMLAttrsCount); 629 addNamesWithPrefix(map, xmlAtom, attrs);
625 630
626 map->add(WTF::xmlnsAtom, XMLNSNames::xmlnsAttr); 631 map->add(WTF::xmlnsAtom, XMLNSNames::xmlnsAttr);
627 map->add("xmlns:xlink", QualifiedName(xmlnsAtom, xlinkAtom, XMLNSNames:: xmlnsNamespaceURI)); 632 map->add("xmlns:xlink", QualifiedName(xmlnsAtom, xlinkAtom, XMLNSNames:: xmlnsNamespaceURI));
628 } 633 }
629 634
630 for (unsigned i = 0; i < token->attributes().size(); ++i) { 635 for (unsigned i = 0; i < token->attributes().size(); ++i) {
631 Attribute& tokenAttribute = token->attributes().at(i); 636 Attribute& tokenAttribute = token->attributes().at(i);
632 const QualifiedName& name = map->get(tokenAttribute.localName()); 637 const QualifiedName& name = map->get(tokenAttribute.localName());
633 if (!name.localName().isNull()) 638 if (!name.localName().isNull())
634 tokenAttribute.parserSetName(name); 639 tokenAttribute.parserSetName(name);
(...skipping 2187 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 ASSERT(m_isAttached); 2827 ASSERT(m_isAttached);
2823 // Warning, this may detach the parser. Do not do anything else after this. 2828 // Warning, this may detach the parser. Do not do anything else after this.
2824 m_tree.finishedParsing(); 2829 m_tree.finishedParsing();
2825 } 2830 }
2826 2831
2827 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) 2832 void HTMLTreeBuilder::parseError(AtomicHTMLToken*)
2828 { 2833 {
2829 } 2834 }
2830 2835
2831 } // namespace WebCore 2836 } // namespace WebCore
OLDNEW
« Source/core/html/parser/HTMLIdentifier.cpp ('K') | « Source/core/html/parser/HTMLIdentifier.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698