WebSearchableFormData::WebSearchableFormData(const WebFormElement& form, const WebInputElement& selectedInputElement) { RefPtr<HTMLFormElement> formElement = form.operator PassRefPtr<HTMLFormElement>(); HTMLInputElement* inputElement = selectedInputElement.operator PassRefPtr<HTMLInputElement>().get(); // Only consider forms that GET data. // Allow HTTPS only when an input element is provided. if (equalIgnoringCase(formElement->getAttribute(methodAttr), "post") || (!IsHTTPFormSubmit(formElement.get()) && !inputElement)) return; Vector<char> encodedString; WTF::TextEncoding encoding; GetFormEncoding(formElement.get(), &encoding); if (!encoding.isValid()) { // Need a valid encoding to encode the form elements. // If the encoding isn't found webkit ends up replacing the params with // empty strings. So, we don't try to do anything here. return; } // Look for a suitable search text field in the form when a // selectedInputElement is not provided. if (!inputElement) { inputElement = findSuitableSearchInputElement(formElement.get()); // Return if no suitable text element has been found. if (!inputElement) return; } HTMLFormControlElement* firstSubmitButton = GetButtonToActivate(formElement.get()); if (firstSubmitButton) { // The form does not have an active submit button, make the first button // active. We need to do this, otherwise the URL will not contain the // name of the submit button. firstSubmitButton->setActivatedSubmit(true); } bool isValidSearchString = buildSearchString(formElement.get(), &encodedString, &encoding, inputElement); if (firstSubmitButton) firstSubmitButton->setActivatedSubmit(false); // Return if the search string is not valid. if (!isValidSearchString) return; String action(formElement->action()); KURL url(formElement->document()->completeURL(action.isNull() ? "" : action)); RefPtr<FormData> formData = FormData::create(encodedString); url.setQuery(formData->flattenToString()); m_url = url; m_encoding = String(encoding.name()); }
void TextResourceDecoder::setEncoding(const WTF::TextEncoding& encoding, EncodingSource source) { // In case the encoding didn't exist, we keep the old one (helps some sites specifying invalid encodings). if (!encoding.isValid()) return; // When encoding comes from meta tag (i.e. it cannot be XML files sent via XHR), // treat x-user-defined as windows-1252 (bug 18270) if (source == EncodingFromMetaTag && !strcasecmp(encoding.name(), "x-user-defined")) m_encoding = "windows-1252"; else if (source == EncodingFromMetaTag || source == EncodingFromXMLHeader || source == EncodingFromCSSCharset) m_encoding = encoding.closestByteBasedEquivalent(); else m_encoding = encoding; m_codec.clear(); m_source = source; }
inline std::unique_ptr<TextResourceDecoder> TextResourceDecoderBuilder::createDecoderInstance(Document* document) { const WTF::TextEncoding encodingFromDomain = getEncodingFromDomain(document->url()); if (LocalFrame* frame = document->frame()) { if (Settings* settings = frame->settings()) { // Disable autodetection for XML to honor the default encoding (UTF-8) for // unlabelled documents. return TextResourceDecoder::create( m_mimeType, encodingFromDomain.isValid() ? encodingFromDomain : settings->defaultTextEncodingName(), !DOMImplementation::isXMLMIMEType(m_mimeType)); } } return TextResourceDecoder::create(m_mimeType, encodingFromDomain); }
static bool isCharsetSpecifyingNode(Node* node) { if (!node->isHTMLElement()) return false; HTMLElement* element = toHTMLElement(node); if (!element->hasTagName(HTMLNames::metaTag)) return false; HTMLMetaCharsetParser::AttributeList attributes; if (element->hasAttributes()) { for (unsigned i = 0; i < element->attributeCount(); ++i) { const Attribute* attribute = element->attributeItem(i); // FIXME: We should deal appropriately with the attribute if they have a namespace. attributes.append(std::make_pair(attribute->name().toString(), attribute->value().string())); } } WTF::TextEncoding textEncoding = HTMLMetaCharsetParser::encodingFromMetaAttributes(attributes); return textEncoding.isValid(); }
// Constructs a new URL given a base URL and a possibly relative input URL. // Any query portion of the relative URL will be encoded in the given encoding. KURL::KURL(const KURL& base, const String& relative, const WTF::TextEncoding& encoding) { init(base, relative, &encoding.encodingForFormSubmission()); }
PassRefPtrWillBeRawPtr<FormSubmission> FormSubmission::create(HTMLFormElement* form, const Attributes& attributes, PassRefPtrWillBeRawPtr<Event> event) { ASSERT(form); HTMLFormControlElement* submitButton = 0; if (event && event->target()) { for (Node* node = event->target()->toNode(); node; node = node->parentOrShadowHostNode()) { if (node->isElementNode() && toElement(node)->isFormControlElement()) { submitButton = toHTMLFormControlElement(node); break; } } } FormSubmission::Attributes copiedAttributes; copiedAttributes.copyFrom(attributes); if (submitButton) { AtomicString attributeValue; if (!(attributeValue = submitButton->fastGetAttribute(formactionAttr)).isNull()) copiedAttributes.parseAction(attributeValue); if (!(attributeValue = submitButton->fastGetAttribute(formenctypeAttr)).isNull()) copiedAttributes.updateEncodingType(attributeValue); if (!(attributeValue = submitButton->fastGetAttribute(formmethodAttr)).isNull()) copiedAttributes.updateMethodType(attributeValue); if (!(attributeValue = submitButton->fastGetAttribute(formtargetAttr)).isNull()) copiedAttributes.setTarget(attributeValue); } if (copiedAttributes.method() == DialogMethod) { if (submitButton) return adoptRefWillBeNoop(new FormSubmission(submitButton->resultForDialogSubmit())); return adoptRefWillBeNoop(new FormSubmission("")); } Document& document = form->document(); KURL actionURL = document.completeURL(copiedAttributes.action().isEmpty() ? document.url().string() : copiedAttributes.action()); bool isMailtoForm = actionURL.protocolIs("mailto"); bool isMultiPartForm = false; AtomicString encodingType = copiedAttributes.encodingType(); if (copiedAttributes.method() == PostMethod) { isMultiPartForm = copiedAttributes.isMultiPartForm(); if (isMultiPartForm && isMailtoForm) { encodingType = AtomicString("application/x-www-form-urlencoded", AtomicString::ConstructFromLiteral); isMultiPartForm = false; } } WTF::TextEncoding dataEncoding = isMailtoForm ? UTF8Encoding() : FormDataEncoder::encodingFromAcceptCharset(copiedAttributes.acceptCharset(), document.encoding()); FormData* domFormData = FormData::create(dataEncoding.encodingForFormSubmission()); bool containsPasswordData = false; for (unsigned i = 0; i < form->associatedElements().size(); ++i) { FormAssociatedElement* control = form->associatedElements()[i]; ASSERT(control); HTMLElement& element = toHTMLElement(*control); if (!element.isDisabledFormControl()) control->appendToFormData(*domFormData); if (isHTMLInputElement(element)) { HTMLInputElement& input = toHTMLInputElement(element); if (input.type() == InputTypeNames::password && !input.value().isEmpty()) containsPasswordData = true; } } RefPtr<EncodedFormData> formData; String boundary; if (isMultiPartForm) { formData = domFormData->encodeMultiPartFormData(); boundary = formData->boundary().data(); } else { formData = domFormData->encodeFormData(attributes.method() == GetMethod ? EncodedFormData::FormURLEncoded : EncodedFormData::parseEncodingType(encodingType)); if (copiedAttributes.method() == PostMethod && isMailtoForm) { // Convert the form data into a string that we put into the URL. appendMailtoPostFormDataToURL(actionURL, *formData, encodingType); formData = EncodedFormData::create(); } } formData->setIdentifier(generateFormDataIdentifier()); formData->setContainsPasswordData(containsPasswordData); AtomicString targetOrBaseTarget = copiedAttributes.target().isEmpty() ? document.baseTarget() : copiedAttributes.target(); return adoptRefWillBeNoop(new FormSubmission(copiedAttributes.method(), actionURL, targetOrBaseTarget, encodingType, form, formData.release(), boundary, event)); }