diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2006-07-03 21:41:25 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2006-07-03 21:41:25 +0000 |
commit | 5e2567370d9be341a18203a5df9206ebe32e1fb9 (patch) | |
tree | 859cb4d4fc737d97110d1b0a2ca860d3638c7750 | |
parent | de0c4e2c32c1ecbef75293653adff4e4ceffeffe (diff) | |
download | netsurf-5e2567370d9be341a18203a5df9206ebe32e1fb9.tar.gz netsurf-5e2567370d9be341a18203a5df9206ebe32e1fb9.tar.bz2 |
Fix submission of forms in embedded objects; resolve submission URL at
form creation time rather than at submit.
svn path=/trunk/netsurf/; revision=2707
-rw-r--r-- | desktop/browser.c | 33 | ||||
-rw-r--r-- | render/box_construct.c | 24 | ||||
-rw-r--r-- | render/form.h | 2 |
3 files changed, 28 insertions, 31 deletions
diff --git a/desktop/browser.c b/desktop/browser.c index 0d6282ae0..f0cb0559e 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -846,7 +846,6 @@ void browser_window_mouse_action_html(struct browser_window *bw, struct content *url_content = c; struct form_control *gadget = 0; struct content *object = NULL; - url_func_result res; struct box *next_box; bw->drag_type = DRAGGING_NONE; @@ -956,11 +955,8 @@ void browser_window_mouse_action_html(struct browser_window *bw, /* drop through */ case GADGET_SUBMIT: if (gadget->form) { - res = url_join(gadget->form->action, base_url, - &url); snprintf(status_buffer, sizeof status_buffer, messages_get("FormSubmit"), - (res == URL_FUNC_OK) ? url : gadget->form->action); status = status_buffer; pointer = GUI_POINTER_POINT; @@ -1886,9 +1882,8 @@ gui_pointer_shape get_pointer_shape(css_cursor cursor) void browser_form_submit(struct browser_window *bw, struct form *form, struct form_control *submit_button) { - char *data = 0, *url = 0, *url1 = 0, *base; + char *data = 0, *url = 0; struct form_successful_control *success; - url_func_result res; assert(form); assert(bw->current_content->type == CONTENT_HTML); @@ -1897,7 +1892,6 @@ void browser_form_submit(struct browser_window *bw, struct form *form, warn_user("NoMemory", 0); return; } - base = bw->current_content->data.html.base_url; switch (form->method) { case method_GET: @@ -1913,16 +1907,14 @@ void browser_form_submit(struct browser_window *bw, struct form *form, warn_user("NoMemory", 0); return; } - if(form->action[strlen(form->action)-1] == '?') { + if (form->action[strlen(form->action)-1] == '?') { sprintf(url, "%s%s", form->action, data); } else { sprintf(url, "%s?%s", form->action, data); } - res = url_join(url, base, &url1); - if (res != URL_FUNC_OK) - break; - browser_window_go(bw, url1, bw->current_content->url, true); + browser_window_go(bw, url, bw->current_content->url, + true); break; case method_POST_URLENC: @@ -1932,19 +1924,15 @@ void browser_form_submit(struct browser_window *bw, struct form *form, warn_user("NoMemory", 0); return; } - res = url_join(form->action, base, &url); - if (res != URL_FUNC_OK) - break; - browser_window_go_post(bw, url, data, 0, true, - bw->current_content->url, false); + browser_window_go_post(bw, form->action, data, 0, + true, bw->current_content->url, + false); break; case method_POST_MULTIPART: - res = url_join(form->action, base, &url); - if (res != URL_FUNC_OK) - break; - browser_window_go_post(bw, url, 0, success, true, - bw->current_content->url, false); + browser_window_go_post(bw, form->action, 0, success, + true, bw->current_content->url, + false); break; default: @@ -1954,7 +1942,6 @@ void browser_form_submit(struct browser_window *bw, struct form *form, form_free_successful(success); free(data); free(url); - free(url1); } diff --git a/render/box_construct.c b/render/box_construct.c index a5f654926..252af0d19 100644 --- a/render/box_construct.c +++ b/render/box_construct.c @@ -306,13 +306,13 @@ bool box_construct_element(xmlNode *n, struct content *content, assert(inline_container); gui_multitask(); - + /* In case the parent is a pre block, we clear the * strip_leading_newline flag since it is not used if we * follow the pre with a tag */ parent->strip_leading_newline = 0; - + style = box_get_style(content, parent_style, n); if (!style) return false; @@ -663,7 +663,7 @@ bool box_construct_text(xmlNode *n, struct content *content, box_text_transform(text, strlen(text), parent_style->text_transform); current = text; - + /* swallow a single leading new line */ if (parent->strip_leading_newline) { switch (*current) { @@ -676,7 +676,7 @@ bool box_construct_text(xmlNode *n, struct content *content, } parent->strip_leading_newline = 0; } - + do { size_t len = strcspn(current, "\r\n"); char old = current[len]; @@ -1781,9 +1781,10 @@ bool box_iframe(BOX_SPECIAL_PARAMS) bool box_form(BOX_SPECIAL_PARAMS) { - char *xmlaction, *action, *method, *enctype, *charset; + char *xmlaction, *action, *faction, *method, *enctype, *charset; form_method fmethod; struct form *form; + url_func_result result; if (!(xmlaction = (char *) xmlGetProp(n, (const xmlChar *) "action"))) { @@ -1800,6 +1801,15 @@ bool box_form(BOX_SPECIAL_PARAMS) if (!action) return false; + result = url_join(action, content->data.html.base_url, &faction); + if (result != URL_FUNC_OK) { + free(action); + return false; + } + + /* No longer needed */ + free(action); + fmethod = method_GET; if ((method = (char *) xmlGetProp(n, (const xmlChar *) "method"))) { if (strcasecmp(method, "post") == 0) { @@ -1818,10 +1828,10 @@ bool box_form(BOX_SPECIAL_PARAMS) /* acceptable encoding(s) for form data */ charset = (char *) xmlGetProp(n, (const xmlChar *) "accept-charset"); - form = form_new(action, fmethod, charset, + form = form_new(faction, fmethod, charset, content->data.html.encoding); if (!form) { - free(action); + free(faction); xmlFree(charset); return false; } diff --git a/render/form.h b/render/form.h index 48630dea2..cf9a0e746 100644 --- a/render/form.h +++ b/render/form.h @@ -29,7 +29,7 @@ typedef enum { /** HTML form. */ struct form { - char *action; /**< URL to submit to. */ + char *action; /**< Absolute URL to submit to. */ form_method method; /**< Method and enctype. */ char *accept_charsets; /**< Charset to submit form in */ char *document_charset; /**< Charset of document containing form */ |