⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlformelement.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            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 + -