183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch/* 283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * Copyright (C) 2013 Google Inc. All rights reserved. 383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * Redistribution and use in source and binary forms, with or without 583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * modification, are permitted provided that the following conditions 683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * are met: 783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 1. Redistributions of source code must retain the above copyright 983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * notice, this list of conditions and the following disclaimer. 1083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * notice, this list of conditions and the following disclaimer 1283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * in the documentation and/or other materials provided with the 1383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * distribution. 1483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 3. Neither the name of Google Inc. nor the names of its contributors 1583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * may be used to endorse or promote products derived from this 1683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * software without specific prior written permission. 1783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 1883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch */ 3083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 3183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "config.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/custom/CustomElement.h" 3383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/MathMLNames.h" 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h" 375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Document.h" 3883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "core/dom/Element.h" 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/custom/CustomElementMicrotaskRunQueue.h" 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/custom/CustomElementObserver.h" 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/custom/CustomElementScheduler.h" 4283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 4483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)CustomElementMicrotaskImportStep* CustomElement::didCreateImport(HTMLImportChild* import) 4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return CustomElementScheduler::scheduleImport(import); 4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 50197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid CustomElement::didFinishLoadingImport(Document& master) 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch master.customElementMicrotaskRunQueue()->requestDispatchIfNeeded(); 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 55e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)Vector<AtomicString>& CustomElement::embedderCustomElementNames() 561fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch{ 57e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) DEFINE_STATIC_LOCAL(Vector<AtomicString>, names, ()); 58e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return names; 591fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch} 601fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch 61e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void CustomElement::addEmbedderCustomElementName(const AtomicString& name) 621fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch{ 63e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) AtomicString lower = name.lower(); 64e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (isValidName(lower, EmbedderNames)) 651fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch return; 66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) embedderCustomElementNames().append(lower); 671fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch} 681fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch 69e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool CustomElement::isValidName(const AtomicString& name, NameSet validNames) 701fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch{ 7106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if ((validNames & EmbedderNames) && kNotFound != embedderCustomElementNames().find(name)) 72e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return Document::isValidName(name); 73e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 7406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if ((validNames & StandardNames) && kNotFound != name.find('-')) { 75e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) DEFINE_STATIC_LOCAL(Vector<AtomicString>, reservedNames, ()); 76e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (reservedNames.isEmpty()) { 77e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(MathMLNames::annotation_xmlTag.localName()); 785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ENABLE(SVG_FONTS) 79e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(SVGNames::font_faceTag.localName()); 80e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(SVGNames::font_face_srcTag.localName()); 81e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(SVGNames::font_face_uriTag.localName()); 82e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(SVGNames::font_face_formatTag.localName()); 83e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(SVGNames::font_face_nameTag.localName()); 84e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) reservedNames.append(SVGNames::missing_glyphTag.localName()); 855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif 86e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 87e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 8806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (kNotFound == reservedNames.find(name)) 89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return Document::isValidName(name.string()); 90e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 91e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 92e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return false; 931fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch} 941fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch 9583750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid CustomElement::define(Element* element, PassRefPtr<CustomElementDefinition> passDefinition) 9683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 9783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch RefPtr<CustomElementDefinition> definition(passDefinition); 98e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 99e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) switch (element->customElementState()) { 100e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case Element::NotCustomElement: 101e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case Element::Upgraded: 102e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) ASSERT_NOT_REACHED(); 103e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) break; 104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case Element::WaitingForUpgrade: 10643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) element->setCustomElementDefinition(definition); 1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CustomElementScheduler::scheduleCallback(definition->callbacks(), element, CustomElementLifecycleCallbacks::CreatedCallback); 108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) break; 109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 11083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 11183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 11283750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid CustomElement::attributeDidChange(Element* element, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue) 11383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 11483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ASSERT(element->customElementState() == Element::Upgraded); 11543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) CustomElementScheduler::scheduleAttributeChangedCallback(element->customElementDefinition()->callbacks(), element, name, oldValue, newValue); 11683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 11783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid CustomElement::didAttach(Element* element, const Document& document) 11983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 12083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ASSERT(element->customElementState() == Element::Upgraded); 121bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!document.domWindow()) 122fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return; 1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CustomElementScheduler::scheduleCallback(element->customElementDefinition()->callbacks(), element, CustomElementLifecycleCallbacks::AttachedCallback); 12483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 12583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid CustomElement::didDetach(Element* element, const Document& document) 12783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 12883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ASSERT(element->customElementState() == Element::Upgraded); 129bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!document.domWindow()) 130fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return; 1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CustomElementScheduler::scheduleCallback(element->customElementDefinition()->callbacks(), element, CustomElementLifecycleCallbacks::DetachedCallback); 13283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 13383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 13483750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid CustomElement::wasDestroyed(Element* element) 13583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 13602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch switch (element->customElementState()) { 13702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch case Element::NotCustomElement: 13802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch ASSERT_NOT_REACHED(); 13902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch break; 14002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 141e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case Element::WaitingForUpgrade: 14202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch case Element::Upgraded: 143e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) CustomElementObserver::notifyElementWasDestroyed(element); 14402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch break; 14502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 14683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 14783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 149