File: src/main/java/org/jsoup/nodes/FormElement.java
Issue: <input type="image"> is not special cased in formData method
The following code:
import org.jsoup.Jsoup;
import org.jsoup.nodes.FormElement;

class Scratch {
    public static void main(String[] args) {
        System.out.println(((FormElement) Jsoup.parse("<form id=f><input type=image name=x></form>").getElementById("f")).formData());
    }
}
Returns the following output:
[x=]

When either [] or [x.x=0, x.y=0] is expected (not sure which, but [x=] is definitely wrong).

Buggy code:
public List<Connection.KeyVal> formData() {
    ArrayList<Connection.KeyVal> data = new ArrayList<>();

    // iterate the form control elements and accumulate their values
    for (Element el: elements) {
        if (!el.tag().isFormSubmittable()) continue; // contents are form listable, superset of submitable
        if (el.hasAttr("disabled")) continue; // skip disabled form inputs
        String name = el.attr("name");
        if (name.length() == 0) continue;
        String type = el.attr("type");


        if ("select".equals(el.normalName())) {
            Elements options = el.select("option[selected]");
            boolean set = false;
            for (Element option: options) {
                data.add(HttpConnection.KeyVal.create(name, option.val()));
                set = true;
            }
            if (!set) {
                Element option = el.select("option").first();
                if (option != null)
                    data.add(HttpConnection.KeyVal.create(name, option.val()));
            }
        } else if ("checkbox".equalsIgnoreCase(type) || "radio".equalsIgnoreCase(type)) {
            // only add checkbox or radio if they have the checked attribute
            if (el.hasAttr("checked")) {
                final String val = el.val().length() >  0 ? el.val() : "on";
                data.add(HttpConnection.KeyVal.create(name, val));
            }
        } else {
            data.add(HttpConnection.KeyVal.create(name, el.val()));
        }
    }
    return data;
}

Fixed code:
public List<Connection.KeyVal> formData() {
    ArrayList<Connection.KeyVal> data = new ArrayList<>();

    // iterate the form control elements and accumulate their values
    for (Element el: elements) {
        if (!el.tag().isFormSubmittable()) continue; // contents are form listable, superset of submitable
        if (el.hasAttr("disabled")) continue; // skip disabled form inputs
        String name = el.attr("name");
        if (name.length() == 0) continue;
        String type = el.attr("type");

        if (type.equalsIgnoreCase("button")) continue; // browsers don't submit these

        if ("select".equals(el.normalName())) {
            Elements options = el.select("option[selected]");
            boolean set = false;
            for (Element option: options) {
                data.add(HttpConnection.KeyVal.create(name, option.val()));
                set = true;
            }
            if (!set) {
                Element option = el.select("option").first();
                if (option != null)
                    data.add(HttpConnection.KeyVal.create(name, option.val()));
            }
        } else if ("checkbox".equalsIgnoreCase(type) || "radio".equalsIgnoreCase(type)) {
            // only add checkbox or radio if they have the checked attribute
            if (el.hasAttr("checked")) {
                final String val = el.val().length() >  0 ? el.val() : "on";
                data.add(HttpConnection.KeyVal.create(name, val));
            }
        } else {
            data.add(HttpConnection.KeyVal.create(name, el.val()));
        }
    }
    return data;
}