582
583 // Add namespaces based on the parent node
584 Vector<Element*> elemStack;
585 while (parentElement) {
586 elemStack.append(parentElement);
587
588 ContainerNode* node = parentElement->parentNode();
589 if (!is<Element>(node))
590 break;
591 parentElement = downcast<Element>(node);
592 }
593
594 if (elemStack.isEmpty())
595 return;
596
597 // FIXME: Share code with isDefaultNamespace() per http://www.whatwg.org/specs/web-apps/current-work/multipage/the-xhtml-syntax.html#parsing-xhtml-fragments
598 for (; !elemStack.isEmpty(); elemStack.removeLast()) {
599 Element* element = elemStack.last();
600 if (element->hasAttributes()) {
601 for (const Attribute& attribute : element->attributesIterator()) {
602 if (attribute.localName() == xmlnsAtom())
603 m_defaultNamespaceURI = attribute.value();
604 else if (attribute.prefix() == xmlnsAtom())
605 m_prefixToNamespaceMap.set(attribute.localName(), attribute.value());
606 }
607 }
608 }
609
610 if (m_defaultNamespaceURI.isNull())
611 m_defaultNamespaceURI = parentElement->namespaceURI();