📄 htmlformelement.cpp
字号:
RefPtr<FormData> data = createFormData(CString()); if (isMailtoForm()) { String body = data->flattenToString(); if (equalIgnoringCase(m_formDataBuilder.encodingType(), "text/plain")) { // Convention seems to be to decode, and s/&/\r\n/. Also, spaces are encoded as %20. body = decodeURLEscapeSequences(body.replace('&', "\r\n").replace('+', ' ') + "\r\n"); } Vector<char> bodyData; bodyData.append("body=", 5); FormDataBuilder::encodeStringAsFormData(bodyData, body.utf8()); data = FormData::create(String(bodyData.data(), bodyData.size()).replace('+', "%20").latin1()); } frame->loader()->submitForm("POST", m_url, data, m_target, m_formDataBuilder.encodingType(), String(), event, lockHistory, lockBackForwardList); } else { Vector<char> boundary = m_formDataBuilder.generateUniqueBoundaryString(); frame->loader()->submitForm("POST", m_url, createFormData(boundary.data()), m_target, m_formDataBuilder.encodingType(), boundary.data(), event, lockHistory, lockBackForwardList); } } else { m_formDataBuilder.setIsMultiPartForm(false); frame->loader()->submitForm("GET", m_url, createFormData(CString()), m_target, String(), String(), event, lockHistory, lockBackForwardList); } if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(false); m_doingsubmit = m_insubmit = false;}void HTMLFormElement::reset(){ Frame* frame = document()->frame(); if (m_inreset || !frame) return; m_inreset = true; // ### DOM2 labels this event as not cancelable, however // common browsers( sick! ) allow it be cancelled. if ( !dispatchEventForType(eventNames().resetEvent,true, true) ) { m_inreset = false; return; } for (unsigned i = 0; i < formElements.size(); ++i) formElements[i]->reset(); m_inreset = false;}void HTMLFormElement::parseMappedAttribute(MappedAttribute* attr){ if (attr->name() == actionAttr) m_url = parseURL(attr->value()); else if (attr->name() == targetAttr) m_target = attr->value(); else if (attr->name() == methodAttr) m_formDataBuilder.parseMethodType(attr->value()); else if (attr->name() == enctypeAttr) m_formDataBuilder.parseEncodingType(attr->value()); else if (attr->name() == accept_charsetAttr) // space separated list of charsets the server // accepts - see rfc2045 m_formDataBuilder.setAcceptCharset(attr->value()); else if (attr->name() == acceptAttr) { // ignore this one for the moment... } else if (attr->name() == autocompleteAttr) { m_autocomplete = !equalIgnoringCase(attr->value(), "off"); if (!m_autocomplete) document()->registerForDocumentActivationCallbacks(this); else document()->unregisterForDocumentActivationCallbacks(this); } else if (attr->name() == onsubmitAttr) setInlineEventListenerForTypeAndAttribute(eventNames().submitEvent, attr); else if (attr->name() == onresetAttr) setInlineEventListenerForTypeAndAttribute(eventNames().resetEvent, attr); else if (attr->name() == nameAttr) { const AtomicString& newName = attr->value(); if (inDocument() && document()->isHTMLDocument()) { HTMLDocument* document = static_cast<HTMLDocument*>(this->document()); document->removeNamedItem(m_name); document->addNamedItem(newName); } m_name = newName; } else HTMLElement::parseMappedAttribute(attr);}template<class T, size_t n> static void removeFromVector(Vector<T*, n> & vec, T* item){ size_t size = vec.size(); for (size_t i = 0; i != size; ++i) if (vec[i] == item) { vec.remove(i); break; }}unsigned HTMLFormElement::formElementIndex(HTMLFormControlElement* e){ // Check for the special case where this element is the very last thing in // the form's tree of children; we don't want to walk the entire tree in that // common case that occurs during parsing; instead we'll just return a value // that says "add this form element to the end of the array". if (e->traverseNextNode(this)) { unsigned i = 0; for (Node* node = this; node; node = node->traverseNextNode(this)) { if (node == e) return i; if (node->isHTMLElement() && static_cast<Element*>(node)->isFormControlElement() && static_cast<HTMLFormControlElement*>(node)->form() == this) ++i; } } return formElements.size();}void HTMLFormElement::registerFormElement(HTMLFormControlElement* e){ document()->checkedRadioButtons().removeButton(e); m_checkedRadioButtons.addButton(e); formElements.insert(formElementIndex(e), e);}void HTMLFormElement::removeFormElement(HTMLFormControlElement* e){ m_checkedRadioButtons.removeButton(e); removeFromVector(formElements, e);}bool HTMLFormElement::isURLAttribute(Attribute* attr) const{ return attr->name() == actionAttr;}void HTMLFormElement::registerImgElement(HTMLImageElement* e){ imgElements.append(e);}void HTMLFormElement::removeImgElement(HTMLImageElement* e){ removeFromVector(imgElements, e);}PassRefPtr<HTMLCollection> HTMLFormElement::elements(){ return HTMLFormCollection::create(this);}String HTMLFormElement::name() const{ return getAttribute(nameAttr);}void HTMLFormElement::setName(const String &value){ setAttribute(nameAttr, value);}void HTMLFormElement::setAcceptCharset(const String &value){ setAttribute(accept_charsetAttr, value);}String HTMLFormElement::action() const{ return getAttribute(actionAttr);}void HTMLFormElement::setAction(const String &value){ setAttribute(actionAttr, value);}void HTMLFormElement::setEnctype(const String &value){ setAttribute(enctypeAttr, value);}String HTMLFormElement::method() const{ return getAttribute(methodAttr);}void HTMLFormElement::setMethod(const String &value){ setAttribute(methodAttr, value);}String HTMLFormElement::target() const{ return getAttribute(targetAttr);}void HTMLFormElement::setTarget(const String &value){ setAttribute(targetAttr, value);}PassRefPtr<HTMLFormControlElement> HTMLFormElement::elementForAlias(const AtomicString& alias){ if (alias.isEmpty() || !m_elementAliases) return 0; return m_elementAliases->get(alias.impl());}void HTMLFormElement::addElementAlias(HTMLFormControlElement* element, const AtomicString& alias){ if (alias.isEmpty()) return; if (!m_elementAliases) m_elementAliases = new AliasMap; m_elementAliases->set(alias.impl(), element);}void HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<Node> >& namedItems){ elements()->namedItems(name, namedItems); // see if we have seen something with this name before RefPtr<HTMLFormControlElement> aliasElem; if (aliasElem = elementForAlias(name)) { bool found = false; for (unsigned n = 0; n < namedItems.size(); n++) { if (namedItems[n] == aliasElem.get()) { found = true; break; } } if (!found) // we have seen it before but it is gone now. still, we need to return it. namedItems.append(aliasElem.get()); } // name has been accessed, remember it if (namedItems.size() && aliasElem != namedItems.first()) addElementAlias(static_cast<HTMLFormControlElement*>(namedItems.first().get()), name); }void HTMLFormElement::documentDidBecomeActive(){ ASSERT(!m_autocomplete); for (unsigned i = 0; i < formElements.size(); ++i) formElements[i]->reset();}void HTMLFormElement::willMoveToNewOwnerDocument(){ if (!m_autocomplete) document()->unregisterForDocumentActivationCallbacks(this);}void HTMLFormElement::didMoveToNewOwnerDocument(){ if(m_autocomplete) document()->registerForDocumentActivationCallbacks(this);}void HTMLFormElement::CheckedRadioButtons::addButton(HTMLFormControlElement* element){ // We only want to add radio buttons. if (!element->isRadioButton()) return; // Without a name, there is no group. if (element->name().isEmpty()) return; HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element); // We only track checked buttons. if (!inputElement->checked()) return; if (!m_nameToCheckedRadioButtonMap) m_nameToCheckedRadioButtonMap.set(new NameToInputMap); pair<NameToInputMap::iterator, bool> result = m_nameToCheckedRadioButtonMap->add(element->name().impl(), inputElement); if (result.second) return; HTMLInputElement* oldCheckedButton = result.first->second; if (oldCheckedButton == inputElement) return; result.first->second = inputElement; oldCheckedButton->setChecked(false);}HTMLInputElement* HTMLFormElement::CheckedRadioButtons::checkedButtonForGroup(const AtomicString& name) const{ if (!m_nameToCheckedRadioButtonMap) return 0; return m_nameToCheckedRadioButtonMap->get(name.impl());}void HTMLFormElement::CheckedRadioButtons::removeButton(HTMLFormControlElement* element){ if (element->name().isEmpty() || !m_nameToCheckedRadioButtonMap) return; NameToInputMap::iterator it = m_nameToCheckedRadioButtonMap->find(element->name().impl()); if (it == m_nameToCheckedRadioButtonMap->end() || it->second != element) return; InputElement* inputElement = toInputElement(element); ASSERT_UNUSED(inputElement, inputElement); ASSERT(inputElement->isChecked()); ASSERT(element->isRadioButton()); m_nameToCheckedRadioButtonMap->remove(it); if (m_nameToCheckedRadioButtonMap->isEmpty()) m_nameToCheckedRadioButtonMap.clear();}} // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -