| Index: Source/core/dom/custom/CustomElementUpgradeCandidateMap.cpp | 
| diff --git a/Source/core/dom/custom/CustomElementUpgradeCandidateMap.cpp b/Source/core/dom/custom/CustomElementUpgradeCandidateMap.cpp | 
| index ccbbed39b8fba00d16423aee900933929ea26b33..998a6d5823b2a5fe07022e36d8516cf899ae385a 100644 | 
| --- a/Source/core/dom/custom/CustomElementUpgradeCandidateMap.cpp | 
| +++ b/Source/core/dom/custom/CustomElementUpgradeCandidateMap.cpp | 
| @@ -35,11 +35,20 @@ | 
|  | 
| namespace WebCore { | 
|  | 
| +PassOwnPtrWillBeRawPtr<CustomElementUpgradeCandidateMap> CustomElementUpgradeCandidateMap::create() | 
| +{ | 
| +    return adoptPtrWillBeNoop(new CustomElementUpgradeCandidateMap()); | 
| +} | 
| + | 
| CustomElementUpgradeCandidateMap::~CustomElementUpgradeCandidateMap() | 
| { | 
| +#if !ENABLE(OILPAN) | 
| +    // With Oilpan enabled, the observer table keeps a weak reference to the | 
| +    // element; no need for explicit removal. | 
| UpgradeCandidateMap::const_iterator::Keys end = m_upgradeCandidates.end().keys(); | 
| for (UpgradeCandidateMap::const_iterator::Keys it = m_upgradeCandidates.begin().keys(); it != end; ++it) | 
| unobserve(*it); | 
| +#endif | 
| } | 
|  | 
| void CustomElementUpgradeCandidateMap::add(const CustomElementDescriptor& descriptor, Element* element) | 
| @@ -52,32 +61,21 @@ void CustomElementUpgradeCandidateMap::add(const CustomElementDescriptor& descri | 
| UnresolvedDefinitionMap::iterator it = m_unresolvedDefinitions.find(descriptor); | 
| ElementSet* elements; | 
| if (it == m_unresolvedDefinitions.end()) | 
| -        elements = &m_unresolvedDefinitions.add(descriptor, ElementSet()).storedValue->value; | 
| +        elements = m_unresolvedDefinitions.add(descriptor, adoptPtrWillBeNoop(new ElementSet())).storedValue->value.get(); | 
| else | 
| -        elements = &it->value; | 
| +        elements = it->value.get(); | 
| elements->add(element); | 
| } | 
|  | 
| -void CustomElementUpgradeCandidateMap::remove(Element* element) | 
| -{ | 
| -    unobserve(element); | 
| -    removeCommon(element); | 
| -} | 
| - | 
| void CustomElementUpgradeCandidateMap::elementWasDestroyed(Element* element) | 
| { | 
| CustomElementObserver::elementWasDestroyed(element); | 
| -    removeCommon(element); | 
| -} | 
| - | 
| -void CustomElementUpgradeCandidateMap::removeCommon(Element* element) | 
| -{ | 
| UpgradeCandidateMap::iterator candidate = m_upgradeCandidates.find(element); | 
| ASSERT_WITH_SECURITY_IMPLICATION(candidate != m_upgradeCandidates.end()); | 
|  | 
| UnresolvedDefinitionMap::iterator elements = m_unresolvedDefinitions.find(candidate->value); | 
| ASSERT_WITH_SECURITY_IMPLICATION(elements != m_unresolvedDefinitions.end()); | 
| -    elements->value.remove(element); | 
| +    elements->value->remove(element); | 
| m_upgradeCandidates.remove(candidate); | 
| } | 
|  | 
| @@ -95,19 +93,28 @@ void CustomElementUpgradeCandidateMap::moveToEnd(Element* element) | 
|  | 
| UnresolvedDefinitionMap::iterator elements = m_unresolvedDefinitions.find(candidate->value); | 
| ASSERT_WITH_SECURITY_IMPLICATION(elements != m_unresolvedDefinitions.end()); | 
| -    elements->value.appendOrMoveToLast(element); | 
| +    elements->value->appendOrMoveToLast(element); | 
| } | 
|  | 
| -ListHashSet<Element*> CustomElementUpgradeCandidateMap::takeUpgradeCandidatesFor(const CustomElementDescriptor& descriptor) | 
| +PassOwnPtrWillBeRawPtr<CustomElementUpgradeCandidateMap::ElementSet> CustomElementUpgradeCandidateMap::takeUpgradeCandidatesFor(const CustomElementDescriptor& descriptor) | 
| { | 
| -    const ListHashSet<Element*>& candidates = m_unresolvedDefinitions.take(descriptor); | 
| +    OwnPtrWillBeRawPtr<ElementSet> candidates = m_unresolvedDefinitions.take(descriptor); | 
|  | 
| -    for (ElementSet::const_iterator candidate = candidates.begin(); candidate != candidates.end(); ++candidate) { | 
| +    if (!candidates) | 
| +        return nullptr; | 
| + | 
| +    for (ElementSet::const_iterator candidate = candidates->begin(); candidate != candidates->end(); ++candidate) { | 
| unobserve(*candidate); | 
| m_upgradeCandidates.remove(*candidate); | 
| } | 
| +    return candidates.release(); | 
| +} | 
|  | 
| -    return candidates; | 
| +void CustomElementUpgradeCandidateMap::trace(Visitor* visitor) | 
| +{ | 
| +    visitor->trace(m_upgradeCandidates); | 
| +    visitor->trace(m_unresolvedDefinitions); | 
| +    CustomElementObserver::trace(visitor); | 
| } | 
|  | 
| } | 
|  |