summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2006-07-03 21:41:25 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2006-07-03 21:41:25 +0000
commit5e2567370d9be341a18203a5df9206ebe32e1fb9 (patch)
tree859cb4d4fc737d97110d1b0a2ca860d3638c7750
parentde0c4e2c32c1ecbef75293653adff4e4ceffeffe (diff)
downloadnetsurf-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.c33
-rw-r--r--render/box_construct.c24
-rw-r--r--render/form.h2
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 */