void HTMLTextAreaElement::setDefaultValue(const String& defaultValue) { RefPtr<Node> protectFromMutationEvents(this); // To preserve comments, remove only the text nodes, then add a single text node. Vector<RefPtr<Node> > textNodes; for (Node* n = firstChild(); n; n = n->nextSibling()) { if (n->isTextNode()) textNodes.append(n); } ExceptionCode ec; size_t size = textNodes.size(); for (size_t i = 0; i < size; ++i) removeChild(textNodes[i].get(), ec); // Normalize line endings. String value = defaultValue; value.replace("\r\n", "\n"); value.replace('\r', '\n'); insertBefore(document()->createTextNode(value), firstChild(), ec); if (!m_isDirty) setNonDirtyValue(value); }
void HTMLTitleElement::setText(const String &value) { RefPtr<Node> protectFromMutationEvents(this); ChildListMutationScope mutation(*this); // Avoid calling Document::setTitleElement() during intermediate steps. m_ignoreTitleUpdatesWhenChildrenChange = !value.isEmpty(); removeChildren(); m_ignoreTitleUpdatesWhenChildrenChange = false; if (!value.isEmpty()) appendChild(document().createTextNode(value.impl()), IGNORE_EXCEPTION); }
PassRefPtrWillBeRawPtr<HTMLElement> HTMLTableElement::insertRow(int index, ExceptionState& exceptionState) { if (index < -1) { exceptionState.throwDOMException(IndexSizeError, "The index provided (" + String::number(index) + ") is less than -1."); return nullptr; } RefPtrWillBeRawPtr<Node> protectFromMutationEvents(this); RefPtrWillBeRawPtr<HTMLTableRowElement> lastRow = nullptr; RefPtrWillBeRawPtr<HTMLTableRowElement> row = nullptr; if (index == -1) lastRow = HTMLTableRowsCollection::lastRow(*this); else { for (int i = 0; i <= index; ++i) { row = HTMLTableRowsCollection::rowAfter(*this, lastRow.get()); if (!row) { if (i != index) { exceptionState.throwDOMException(IndexSizeError, "The index provided (" + String::number(index) + ") is greater than the number of rows in the table (" + String::number(i) + ")."); return nullptr; } break; } lastRow = row; } } RefPtrWillBeRawPtr<ContainerNode> parent; if (lastRow) parent = row ? row->parentNode() : lastRow->parentNode(); else { parent = lastBody(); if (!parent) { RefPtrWillBeRawPtr<HTMLTableSectionElement> newBody = HTMLTableSectionElement::create(tbodyTag, document()); RefPtrWillBeRawPtr<HTMLTableRowElement> newRow = HTMLTableRowElement::create(document()); newBody->appendChild(newRow, exceptionState); appendChild(newBody.release(), exceptionState); return newRow.release(); } } RefPtrWillBeRawPtr<HTMLTableRowElement> newRow = HTMLTableRowElement::create(document()); parent->insertBefore(newRow, row.get(), exceptionState); return newRow.release(); }
void HTMLTextAreaElement::setDefaultValue(const String& defaultValue) { Ref<HTMLTextAreaElement> protectFromMutationEvents(*this); // To preserve comments, remove only the text nodes, then add a single text node. Vector<RefPtr<Text>> textNodes; for (Text* textNode = TextNodeTraversal::firstChild(this); textNode; textNode = TextNodeTraversal::nextSibling(textNode)) textNodes.append(textNode); size_t size = textNodes.size(); for (size_t i = 0; i < size; ++i) removeChild(textNodes[i].get(), IGNORE_EXCEPTION); // Normalize line endings. String value = defaultValue; value.replace("\r\n", "\n"); value.replace('\r', '\n'); insertBefore(document().createTextNode(value), firstChild(), IGNORE_EXCEPTION); if (!m_isDirty) setNonDirtyValue(value); }
void HTMLOptionElement::setText(const String &text, ExceptionCode& ec) { RefPtr<Node> protectFromMutationEvents(this); // Changing the text causes a recalc of a select's items, which will reset the selected // index to the first item if the select is single selection with a menu list. We attempt to // preserve the selected item. RefPtr<HTMLSelectElement> select = ownerSelectElement(); bool selectIsMenuList = select && select->usesMenuList(); int oldSelectedIndex = selectIsMenuList ? select->selectedIndex() : -1; // Handle the common special case where there's exactly 1 child node, and it's a text node. Node* child = firstChild(); if (child && child->isTextNode() && !child->nextSibling()) static_cast<Text *>(child)->setData(text, ec); else { removeChildren(); appendChild(Text::create(document(), text), ec); } if (selectIsMenuList && select->selectedIndex() != oldSelectedIndex) select->setSelectedIndex(oldSelectedIndex); }