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

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: Rebase on master 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
« no previous file with comments | « Source/core/html/parser/HTMLIdentifier.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 if (item->isSpecialNode() && !item->hasTagName(addressTag) && !item->has TagName(divTag) && !item->hasTagName(pTag)) 546 if (item->isSpecialNode() && !item->hasTagName(addressTag) && !item->has TagName(divTag) && !item->hasTagName(pTag))
547 break; 547 break;
548 nodeRecord = nodeRecord->next(); 548 nodeRecord = nodeRecord->next();
549 } 549 }
550 processFakePEndTagIfPInButtonScope(); 550 processFakePEndTagIfPInButtonScope();
551 m_tree.insertHTMLElement(token); 551 m_tree.insertHTMLElement(token);
552 } 552 }
553 553
554 typedef HashMap<AtomicString, QualifiedName> PrefixedNameToQualifiedNameMap; 554 typedef HashMap<AtomicString, QualifiedName> PrefixedNameToQualifiedNameMap;
555 555
556 static void mapLoweredLocalNameToName(PrefixedNameToQualifiedNameMap* map, const QualifiedName* const* names, size_t length) 556 static void mapLoweredLocalNameToName(PrefixedNameToQualifiedNameMap* map, const Vector<const QualifiedName*>& names)
557 { 557 {
558 size_t length = names.size();
558 for (size_t i = 0; i < length; ++i) { 559 for (size_t i = 0; i < length; ++i) {
559 const QualifiedName& name = *names[i]; 560 const QualifiedName& name = *names[i];
560 const AtomicString& localName = name.localName(); 561 const AtomicString& localName = name.localName();
561 AtomicString loweredLocalName = localName.lower(); 562 AtomicString loweredLocalName = localName.lower();
562 if (loweredLocalName != localName) 563 if (loweredLocalName != localName)
563 map->add(loweredLocalName, name); 564 map->add(loweredLocalName, name);
564 } 565 }
565 } 566 }
566 567
567 static void adjustSVGTagNameCase(AtomicHTMLToken* token) 568 static void adjustSVGTagNameCase(AtomicHTMLToken* token)
568 { 569 {
569 static PrefixedNameToQualifiedNameMap* caseMap = 0; 570 static PrefixedNameToQualifiedNameMap* caseMap = 0;
570 if (!caseMap) { 571 if (!caseMap) {
571 caseMap = new PrefixedNameToQualifiedNameMap; 572 caseMap = new PrefixedNameToQualifiedNameMap;
572 const QualifiedName* const* svgTags = SVGNames::getSVGTags(); 573 Vector<const QualifiedName*> svgTags;
573 mapLoweredLocalNameToName(caseMap, svgTags, SVGNames::SVGTagsCount); 574 SVGNames::getSVGTags(svgTags);
575 mapLoweredLocalNameToName(caseMap, svgTags);
574 } 576 }
575 577
576 const QualifiedName& casedName = caseMap->get(token->name()); 578 const QualifiedName& casedName = caseMap->get(token->name());
577 if (casedName.localName().isNull()) 579 if (casedName.localName().isNull())
578 return; 580 return;
579 token->setName(casedName.localName()); 581 token->setName(casedName.localName());
580 } 582 }
581 583
582 template<const QualifiedName* const* getAttrs(), unsigned length> 584 template<void getAttrs(Vector<const QualifiedName*>&)>
583 static void adjustAttributes(AtomicHTMLToken* token) 585 static void adjustAttributes(AtomicHTMLToken* token)
584 { 586 {
585 static PrefixedNameToQualifiedNameMap* caseMap = 0; 587 static PrefixedNameToQualifiedNameMap* caseMap = 0;
586 if (!caseMap) { 588 if (!caseMap) {
587 caseMap = new PrefixedNameToQualifiedNameMap; 589 caseMap = new PrefixedNameToQualifiedNameMap;
588 const QualifiedName* const* attrs = getAttrs(); 590 Vector<const QualifiedName*> attrs;
589 mapLoweredLocalNameToName(caseMap, attrs, length); 591 getAttrs(attrs);
592 mapLoweredLocalNameToName(caseMap, attrs);
590 } 593 }
591 594
592 for (unsigned i = 0; i < token->attributes().size(); ++i) { 595 for (unsigned i = 0; i < token->attributes().size(); ++i) {
593 Attribute& tokenAttribute = token->attributes().at(i); 596 Attribute& tokenAttribute = token->attributes().at(i);
594 const QualifiedName& casedName = caseMap->get(tokenAttribute.localName() ); 597 const QualifiedName& casedName = caseMap->get(tokenAttribute.localName() );
595 if (!casedName.localName().isNull()) 598 if (!casedName.localName().isNull())
596 tokenAttribute.parserSetName(casedName); 599 tokenAttribute.parserSetName(casedName);
597 } 600 }
598 } 601 }
599 602
600 static void adjustSVGAttributes(AtomicHTMLToken* token) 603 static void adjustSVGAttributes(AtomicHTMLToken* token)
601 { 604 {
602 adjustAttributes<SVGNames::getSVGAttrs, SVGNames::SVGAttrsCount>(token); 605 adjustAttributes<SVGNames::getSVGAttrs>(token);
603 } 606 }
604 607
605 static void adjustMathMLAttributes(AtomicHTMLToken* token) 608 static void adjustMathMLAttributes(AtomicHTMLToken* token)
606 { 609 {
607 adjustAttributes<MathMLNames::getMathMLAttrs, MathMLNames::MathMLAttrsCount> (token); 610 adjustAttributes<MathMLNames::getMathMLAttrs>(token);
608 } 611 }
609 612
610 static void addNamesWithPrefix(PrefixedNameToQualifiedNameMap* map, const Atomic String& prefix, const QualifiedName* const* names, size_t length) 613 static void addNamesWithPrefix(PrefixedNameToQualifiedNameMap* map, const Atomic String& prefix, const Vector<const QualifiedName*>& names)
611 { 614 {
615 size_t length = names.size();
612 for (size_t i = 0; i < length; ++i) { 616 for (size_t i = 0; i < length; ++i) {
613 const QualifiedName* name = names[i]; 617 const QualifiedName* name = names[i];
614 const AtomicString& localName = name->localName(); 618 const AtomicString& localName = name->localName();
615 AtomicString prefixColonLocalName = prefix + ':' + localName; 619 AtomicString prefixColonLocalName = prefix + ':' + localName;
616 QualifiedName nameWithPrefix(prefix, localName, name->namespaceURI()); 620 QualifiedName nameWithPrefix(prefix, localName, name->namespaceURI());
617 map->add(prefixColonLocalName, nameWithPrefix); 621 map->add(prefixColonLocalName, nameWithPrefix);
618 } 622 }
619 } 623 }
620 624
621 static void adjustForeignAttributes(AtomicHTMLToken* token) 625 static void adjustForeignAttributes(AtomicHTMLToken* token)
622 { 626 {
623 static PrefixedNameToQualifiedNameMap* map = 0; 627 static PrefixedNameToQualifiedNameMap* map = 0;
624 if (!map) { 628 if (!map) {
625 map = new PrefixedNameToQualifiedNameMap; 629 map = new PrefixedNameToQualifiedNameMap;
626 630
627 const QualifiedName* const* attrs = XLinkNames::getXLinkAttrs(); 631 Vector<const QualifiedName*> attrs;
628 addNamesWithPrefix(map, xlinkAtom, attrs, XLinkNames::XLinkAttrsCount); 632 XLinkNames::getXLinkAttrs(attrs);
633 addNamesWithPrefix(map, xlinkAtom, attrs);
629 634
630 attrs = XMLNames::getXMLAttrs(); 635 XMLNames::getXMLAttrs(attrs);
631 addNamesWithPrefix(map, xmlAtom, attrs, XMLNames::XMLAttrsCount); 636 addNamesWithPrefix(map, xmlAtom, attrs);
632 637
633 map->add(WTF::xmlnsAtom, XMLNSNames::xmlnsAttr); 638 map->add(WTF::xmlnsAtom, XMLNSNames::xmlnsAttr);
634 map->add("xmlns:xlink", QualifiedName(xmlnsAtom, xlinkAtom, XMLNSNames:: xmlnsNamespaceURI)); 639 map->add("xmlns:xlink", QualifiedName(xmlnsAtom, xlinkAtom, XMLNSNames:: xmlnsNamespaceURI));
635 } 640 }
636 641
637 for (unsigned i = 0; i < token->attributes().size(); ++i) { 642 for (unsigned i = 0; i < token->attributes().size(); ++i) {
638 Attribute& tokenAttribute = token->attributes().at(i); 643 Attribute& tokenAttribute = token->attributes().at(i);
639 const QualifiedName& name = map->get(tokenAttribute.localName()); 644 const QualifiedName& name = map->get(tokenAttribute.localName());
640 if (!name.localName().isNull()) 645 if (!name.localName().isNull())
641 tokenAttribute.parserSetName(name); 646 tokenAttribute.parserSetName(name);
(...skipping 2203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2845 ASSERT(m_isAttached); 2850 ASSERT(m_isAttached);
2846 // Warning, this may detach the parser. Do not do anything else after this. 2851 // Warning, this may detach the parser. Do not do anything else after this.
2847 m_tree.finishedParsing(); 2852 m_tree.finishedParsing();
2848 } 2853 }
2849 2854
2850 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) 2855 void HTMLTreeBuilder::parseError(AtomicHTMLToken*)
2851 { 2856 {
2852 } 2857 }
2853 2858
2854 } // namespace WebCore 2859 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/html/parser/HTMLIdentifier.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698