| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 | 138 |
| 139 if (HTMLNames::xhtmlNamespaceURI == tagName.namespaceURI()) { | 139 if (HTMLNames::xhtmlNamespaceURI == tagName.namespaceURI()) { |
| 140 element = HTMLElement::create(tagName, document); | 140 element = HTMLElement::create(tagName, document); |
| 141 } else if (SVGNames::svgNamespaceURI == tagName.namespaceURI()) { | 141 } else if (SVGNames::svgNamespaceURI == tagName.namespaceURI()) { |
| 142 element = SVGElement::create(tagName, document); | 142 element = SVGElement::create(tagName, document); |
| 143 } else { | 143 } else { |
| 144 // XML elements are not custom elements, so return early. | 144 // XML elements are not custom elements, so return early. |
| 145 return Element::create(tagName, document); | 145 return Element::create(tagName, document); |
| 146 } | 146 } |
| 147 | 147 |
| 148 element->setIsCustomElement(); | |
| 149 resolve(element.get()); | 148 resolve(element.get()); |
| 150 return element.release(); | 149 return element.release(); |
| 151 } | 150 } |
| 152 | 151 |
| 153 void ActiveRegistrationContext::didGiveTypeExtension(Element* element) | 152 void ActiveRegistrationContext::didGiveTypeExtension(Element* element) |
| 154 { | 153 { |
| 155 resolve(element); | 154 resolve(element); |
| 156 } | 155 } |
| 157 | 156 |
| 158 void ActiveRegistrationContext::resolve(Element* element) | 157 void ActiveRegistrationContext::resolve(Element* element) |
| 159 { | 158 { |
| 160 ASSERT(element->isCustomElement()); | |
| 161 ASSERT(!element->isUpgradedCustomElement()); | |
| 162 const CustomElementDescriptor& descriptor = describe(element); | 159 const CustomElementDescriptor& descriptor = describe(element); |
| 163 CustomElementDefinition* definition = m_registry.find(descriptor); | 160 CustomElementDefinition* definition = m_registry.find(descriptor); |
| 164 if (definition) | 161 if (definition) |
| 165 didResolveElement(definition, element); | 162 didResolveElement(definition, element); |
| 166 else | 163 else |
| 167 didCreateUnresolvedElement(descriptor, element); | 164 didCreateUnresolvedElement(descriptor, element); |
| 168 } | 165 } |
| 169 | 166 |
| 170 void ActiveRegistrationContext::didResolveElement(CustomElementDefinition* defin
ition, Element* element) | 167 void ActiveRegistrationContext::didResolveElement(CustomElementDefinition* defin
ition, Element* element) |
| 171 { | 168 { |
| 169 element->setCustomElementState(Element::Defined); |
| 172 CustomElementCallbackScheduler::scheduleCreatedCallback(definition->callback
s(), element); | 170 CustomElementCallbackScheduler::scheduleCreatedCallback(definition->callback
s(), element); |
| 173 } | 171 } |
| 174 | 172 |
| 175 void ActiveRegistrationContext::didCreateUnresolvedElement(const CustomElementDe
scriptor& descriptor, Element* element) | 173 void ActiveRegistrationContext::didCreateUnresolvedElement(const CustomElementDe
scriptor& descriptor, Element* element) |
| 176 { | 174 { |
| 175 element->setCustomElementState(Element::UpgradeCandidate); |
| 177 m_candidates.add(descriptor, element); | 176 m_candidates.add(descriptor, element); |
| 178 } | 177 } |
| 179 | 178 |
| 180 CustomElementDefinition* ActiveRegistrationContext::definitionFor(Element* eleme
nt) const | 179 CustomElementDefinition* ActiveRegistrationContext::definitionFor(Element* eleme
nt) const |
| 181 { | 180 { |
| 181 ASSERT(element->customElementState() == Element::Defined || element->customE
lementState() == Element::Upgraded); |
| 182 ASSERT(element->document()->registrationContext() == this); | 182 ASSERT(element->document()->registrationContext() == this); |
| 183 const CustomElementDescriptor& descriptor = describe(element); | 183 const CustomElementDescriptor& descriptor = describe(element); |
| 184 return m_registry.find(descriptor); | 184 return m_registry.find(descriptor); |
| 185 } | 185 } |
| 186 | 186 |
| 187 void ActiveRegistrationContext::customElementAttributeDidChange(Element* element
, const AtomicString& name, const AtomicString& oldValue, const AtomicString& ne
wValue) | 187 void ActiveRegistrationContext::customElementAttributeDidChange(Element* element
, const AtomicString& name, const AtomicString& oldValue, const AtomicString& ne
wValue) |
| 188 { | 188 { |
| 189 ASSERT(element->isUpgradedCustomElement()); | 189 ASSERT(element->customElementState() == Element::Upgraded); |
| 190 CustomElementDefinition* definition = definitionFor(element); | 190 CustomElementDefinition* definition = definitionFor(element); |
| 191 CustomElementCallbackScheduler::scheduleAttributeChangedCallback(definition-
>callbacks(), element, name, oldValue, newValue); | 191 CustomElementCallbackScheduler::scheduleAttributeChangedCallback(definition-
>callbacks(), element, name, oldValue, newValue); |
| 192 } | 192 } |
| 193 | 193 |
| 194 void ActiveRegistrationContext::customElementDidEnterDocument(Element* element) | 194 void ActiveRegistrationContext::customElementDidEnterDocument(Element* element) |
| 195 { | 195 { |
| 196 ASSERT(element->isUpgradedCustomElement()); | 196 ASSERT(element->customElementState() == Element::Upgraded); |
| 197 CustomElementDefinition* definition = definitionFor(element); | 197 CustomElementDefinition* definition = definitionFor(element); |
| 198 CustomElementCallbackScheduler::scheduleEnteredDocumentCallback(definition->
callbacks(), element); | 198 CustomElementCallbackScheduler::scheduleEnteredDocumentCallback(definition->
callbacks(), element); |
| 199 } | 199 } |
| 200 | 200 |
| 201 void ActiveRegistrationContext::customElementDidLeaveDocument(Element* element) | 201 void ActiveRegistrationContext::customElementDidLeaveDocument(Element* element) |
| 202 { | 202 { |
| 203 ASSERT(element->isUpgradedCustomElement()); | 203 ASSERT(element->customElementState() == Element::Upgraded); |
| 204 CustomElementDefinition* definition = definitionFor(element); | 204 CustomElementDefinition* definition = definitionFor(element); |
| 205 CustomElementCallbackScheduler::scheduleLeftDocumentCallback(definition->cal
lbacks(), element); | 205 CustomElementCallbackScheduler::scheduleLeftDocumentCallback(definition->cal
lbacks(), element); |
| 206 } | 206 } |
| 207 | 207 |
| 208 void ActiveRegistrationContext::customElementIsBeingDestroyed(Element* element) | 208 void ActiveRegistrationContext::customElementIsBeingDestroyed(Element* element) |
| 209 { | 209 { |
| 210 m_candidates.remove(element); | 210 m_candidates.remove(element); |
| 211 CustomElementRegistrationContext::customElementIsBeingDestroyed(element); | 211 CustomElementRegistrationContext::customElementIsBeingDestroyed(element); |
| 212 } | 212 } |
| 213 | 213 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 239 return Document::isValidName(name.string()); | 239 return Document::isValidName(name.string()); |
| 240 } | 240 } |
| 241 | 241 |
| 242 bool CustomElementRegistrationContext::isCustomTagName(const AtomicString& local
Name) | 242 bool CustomElementRegistrationContext::isCustomTagName(const AtomicString& local
Name) |
| 243 { | 243 { |
| 244 return isValidTypeName(localName); | 244 return isValidTypeName(localName); |
| 245 } | 245 } |
| 246 | 246 |
| 247 CustomElementDescriptor CustomElementRegistrationContext::describe(Element* elem
ent) | 247 CustomElementDescriptor CustomElementRegistrationContext::describe(Element* elem
ent) |
| 248 { | 248 { |
| 249 ASSERT(element->isCustomElement()); | |
| 250 | |
| 251 // If an element has a custom tag name it takes precedence over | 249 // If an element has a custom tag name it takes precedence over |
| 252 // the "is" attribute (if any). | 250 // the "is" attribute (if any). |
| 253 const AtomicString& type = isCustomTagName(element->localName()) | 251 const AtomicString& type = isCustomTagName(element->localName()) |
| 254 ? element->localName() | 252 ? element->localName() |
| 255 : typeExtension(element); | 253 : typeExtension(element); |
| 256 | 254 |
| 257 return CustomElementDescriptor(type, element->namespaceURI(), element->local
Name()); | 255 return CustomElementDescriptor(type, element->namespaceURI(), element->local
Name()); |
| 258 } | 256 } |
| 259 | 257 |
| 260 void CustomElementRegistrationContext::setIsAttributeAndTypeExtension(Element* e
lement, const AtomicString& type) | 258 void CustomElementRegistrationContext::setIsAttributeAndTypeExtension(Element* e
lement, const AtomicString& type) |
| 261 { | 259 { |
| 262 ASSERT(element); | 260 ASSERT(element); |
| 263 ASSERT(!type.isEmpty()); | 261 ASSERT(!type.isEmpty()); |
| 264 element->setAttribute(HTMLNames::isAttr, type); | 262 element->setAttribute(HTMLNames::isAttr, type); |
| 265 setTypeExtension(element, type); | 263 setTypeExtension(element, type); |
| 266 } | 264 } |
| 267 | 265 |
| 268 void CustomElementRegistrationContext::setTypeExtension(Element* element, const
AtomicString& type) | 266 void CustomElementRegistrationContext::setTypeExtension(Element* element, const
AtomicString& type) |
| 269 { | 267 { |
| 270 if (!element->isHTMLElement() && !element->isSVGElement()) | 268 if (!element->isHTMLElement() && !element->isSVGElement()) |
| 271 return; | 269 return; |
| 272 | 270 |
| 273 if (isCustomTagName(element->localName())) | 271 if (isCustomTagName(element->localName())) |
| 274 return; // custom tags take precedence over type extensions | 272 return; // custom tags take precedence over type extensions |
| 275 | 273 |
| 276 TypeExtensionMap::AddResult result = typeExtensionMap()->add(element, type); | 274 TypeExtensionMap::AddResult result = typeExtensionMap()->add(element, type); |
| 277 ASSERT(result.isNewEntry); // Type extensions should only be set once | 275 ASSERT(result.isNewEntry); // Type extensions should only be set once |
| 278 element->setIsCustomElement(); | |
| 279 element->document()->registrationContext()->didGiveTypeExtension(element); | 276 element->document()->registrationContext()->didGiveTypeExtension(element); |
| 280 } | 277 } |
| 281 | 278 |
| 282 void CustomElementRegistrationContext::customElementIsBeingDestroyed(Element* el
ement) | 279 void CustomElementRegistrationContext::customElementIsBeingDestroyed(Element* el
ement) |
| 283 { | 280 { |
| 284 ASSERT(element->isCustomElement()); | 281 ASSERT(element->isCustomElement()); |
| 285 typeExtensionMap()->remove(element); | 282 typeExtensionMap()->remove(element); |
| 286 } | 283 } |
| 287 | 284 |
| 288 const AtomicString& CustomElementRegistrationContext::typeExtension(Element* ele
ment) | 285 const AtomicString& CustomElementRegistrationContext::typeExtension(Element* ele
ment) |
| 289 { | 286 { |
| 290 TypeExtensionMap::const_iterator it = typeExtensionMap()->find(element); | 287 TypeExtensionMap::const_iterator it = typeExtensionMap()->find(element); |
| 291 ASSERT(it != typeExtensionMap()->end()); | 288 ASSERT(it != typeExtensionMap()->end()); |
| 292 return it->value; | 289 return it->value; |
| 293 } | 290 } |
| 294 | 291 |
| 295 CustomElementRegistrationContext::TypeExtensionMap* CustomElementRegistrationCon
text::typeExtensionMap() | 292 CustomElementRegistrationContext::TypeExtensionMap* CustomElementRegistrationCon
text::typeExtensionMap() |
| 296 { | 293 { |
| 297 DEFINE_STATIC_LOCAL(TypeExtensionMap, typeExtensionMap, ()); | 294 DEFINE_STATIC_LOCAL(TypeExtensionMap, typeExtensionMap, ()); |
| 298 return &typeExtensionMap; | 295 return &typeExtensionMap; |
| 299 } | 296 } |
| 300 | 297 |
| 301 } // namespace WebCore | 298 } // namespace WebCore |
| OLD | NEW |