summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'desktop')
-rw-r--r--desktop/browser.c159
-rw-r--r--desktop/browser.h4
-rw-r--r--desktop/gui.h2
3 files changed, 31 insertions, 134 deletions
diff --git a/desktop/browser.c b/desktop/browser.c
index 1eb881f1c..67a4670dc 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -21,6 +21,7 @@
#include "netsurf/desktop/browser.h"
#include "netsurf/render/box.h"
#include "netsurf/render/font.h"
+#include "netsurf/render/form.h"
#include "netsurf/render/layout.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
@@ -41,14 +42,13 @@ static void browser_window_callback(content_msg msg, struct content *c,
void *p1, void *p2, const char *error);
static void download_window_callback(content_msg msg, struct content *c,
void *p1, void *p2, const char *error);
-static void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct gui_gadget* group);
-static void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct gui_gadget* g,
+static void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct form_control* group);
+static void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct form_control* g,
unsigned long x, unsigned long y);
-static void browser_window_gadget_select(struct browser_window* bw, struct gui_gadget* g, int item);
+static void browser_window_gadget_select(struct browser_window* bw, struct form_control* g, int item);
static int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x, unsigned long click_y);
-static void browser_form_submit(struct browser_window *bw, struct form *form);
-static char* browser_form_construct_get(struct page_elements *elements, struct formsubmit* fs);
-static void browser_form_get_append(char **s, int *length, char sep, char *name, char *value);
+static void browser_form_submit(struct browser_window *bw, struct form *form,
+ struct form_control *submit_button);
static void browser_window_textarea_click(struct browser_window* bw,
unsigned long actual_x, unsigned long actual_y,
long x, long y,
@@ -370,8 +370,7 @@ void browser_window_callback(content_msg msg, struct content *c,
break;
case CONTENT_MSG_REFORMAT:
- if (bw->current_content->status == CONTENT_STATUS_DONE)
- browser_window_reformat(bw, 0);
+ browser_window_reformat(bw, 0);
break;
default:
@@ -413,7 +412,7 @@ void download_window_callback(content_msg msg, struct content *c,
}
}
-void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct gui_gadget* group)
+void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct form_control* group)
{
struct box* c;
if (box == NULL)
@@ -440,7 +439,7 @@ void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct gui_
clear_radio_gadgets(bw, c, group);
}
-void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct gui_gadget* g,
+void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct form_control* g,
unsigned long x, unsigned long y)
{
struct box* c;
@@ -458,15 +457,15 @@ void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct gui_g
gui_redraw_gadget2(bw, c, g, box->x + x, box->y + y);
}
-void gui_redraw_gadget(struct browser_window* bw, struct gui_gadget* g)
+void gui_redraw_gadget(struct browser_window* bw, struct form_control* g)
{
assert(bw->current_content->type == CONTENT_HTML);
gui_redraw_gadget2(bw, bw->current_content->data.html.layout->children, g, 0, 0);
}
-void browser_window_gadget_select(struct browser_window* bw, struct gui_gadget* g, int item)
+void browser_window_gadget_select(struct browser_window* bw, struct form_control* g, int item)
{
- struct formoption* o;
+ struct form_option* o;
int count;
struct box *inline_box = g->box->children->children;
int x, y;
@@ -533,7 +532,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x
if (click_boxes[i].box->gadget)
{
- struct gui_gadget* g = click_boxes[i].box->gadget;
+ struct form_control* g = click_boxes[i].box->gadget;
/* gadget clicked */
switch (g->type)
@@ -551,7 +550,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x
gui_redraw_gadget(bw, g);
break;
case GADGET_SUBMIT:
- browser_form_submit(bw, g->form);
+ browser_form_submit(bw, g->form, g);
break;
case GADGET_TEXTAREA:
browser_window_textarea_click(bw,
@@ -576,7 +575,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x
box_coords(click_boxes[i].box, &x, &y);
g->data.image.mx = click_x - x;
g->data.image.my = click_y - y;
- browser_form_submit(bw, g->form);
+ browser_form_submit(bw, g->form, g);
break;
}
@@ -1068,7 +1067,7 @@ void browser_window_input_callback(struct browser_window *bw, char key, void *p)
char_offset--;
} else if (key == 10 || key == 13) {
/* Return/Enter hit */
- browser_form_submit(bw, form);
+ browser_form_submit(bw, form, 0);
/*TODO: remove caret from new page */
} else if (key == 9) {
/* Tab */
@@ -1570,31 +1569,28 @@ void browser_window_redraw_boxes(struct browser_window* bw, struct box_position*
}
-void browser_form_submit(struct browser_window *bw, struct form *form)
+void browser_form_submit(struct browser_window *bw, struct form *form,
+ struct form_control *submit_button)
{
- /*create submission request*/
- struct formsubmit* fs = (struct formsubmit*) xcalloc(1, sizeof(struct formsubmit));
- fs->form = form;
- /*fs->items = g;*/
- LOG(("Submission request created"));
+ struct form_successful_control *success;
- if (fs->form->method == method_GET) {
+ success = form_successful_controls(form, submit_button);
+
+ if (form->method == method_GET) {
/*GET request*/
/*GET basically munges the entire form data
into one URL. */
- char *url = browser_form_construct_get(&bw->current_content->data.html.elements,
- fs);
-
- LOG(("GET request"));
-
- /*send request*/
+ char *data = form_url_encode(success);
+ char *url = xcalloc(1, strlen(form->action) + strlen(data) + 2);
+ sprintf(url, "%s?%s", form->action, data);
+ free(data);
browser_window_open_location(bw, url);
xfree(url);
} else {
/*POST request*/
- assert(fs->form->method == method_POST);
+ assert(form->method == method_POST);
LOG(("POST request - not implemented yet"));
@@ -1604,104 +1600,5 @@ void browser_form_submit(struct browser_window *bw, struct form *form)
body.*/
}
- xfree(fs);
-}
-
-
-char* browser_form_construct_get(struct page_elements *elements, struct formsubmit* fs)
-{
- char *ret;
- int i,j, length;
- struct formoption* opt;
-
- ret = xstrdup(fs->form->action);
- length = strlen(ret);
-
- j=0;
- for (i=0;i<elements->numGadgets;i++){
- if(elements->gadgets[i]->form == fs->form){
-
- if(elements->gadgets[i]->name != 0){
- char *value = 0;
-
- switch(elements->gadgets[i]->type){
-
- case GADGET_HIDDEN: value = elements->gadgets[i]->data.hidden.value;
- break;
- case GADGET_TEXTBOX: value = elements->gadgets[i]->value;
- break;
- case GADGET_PASSWORD: value = elements->gadgets[i]->value;
- break;
- case GADGET_RADIO: if(elements->gadgets[i]->data.radio.selected == -1)
- value = elements->gadgets[i]->data.radio.value;
- break;
- case GADGET_CHECKBOX: if(elements->gadgets[i]->data.checkbox.selected == 1)
- value = elements->gadgets[i]->data.checkbox.value;
- break;
- case GADGET_SELECT: opt = elements->gadgets[i]->data.select.items;
- while(opt != NULL){
- if(opt->selected == -1 || opt->selected == 1) {
- browser_form_get_append(&ret, &length, j == 0 ? '?' : '&',
- elements->gadgets[i]->name, opt->value);
- j++;
- }
- opt = opt->next;
- }
- break;
- case GADGET_TEXTAREA: /* TODO */
- break;
- case GADGET_IMAGE: sprintf(elements->gadgets[i]->data.image.name,
- "%s.x",
- elements->gadgets[i]->data.image.n);
- sprintf(elements->gadgets[i]->data.image.value,
- "%d",
- elements->gadgets[i]->data.image.mx);
- browser_form_get_append(&ret, &length,
- j == 0 ? '?' : '&',
- elements->gadgets[i]->data.image.name,
- elements->gadgets[i]->data.image.value);
- sprintf(elements->gadgets[i]->data.image.name,
- "%s.y",
- elements->gadgets[i]->data.image.n);
- sprintf(elements->gadgets[i]->data.image.value,
- "%d",
- elements->gadgets[i]->data.image.my);
- browser_form_get_append(&ret, &length,
- j == 0 ? '?' : '&',
- elements->gadgets[i]->data.image.name,
- elements->gadgets[i]->data.image.value);
- j++;
- break;
- default: break;
- }
-
- if (value != 0) {
- browser_form_get_append(&ret, &length, j == 0 ? '?' : '&',
- elements->gadgets[i]->name, value);
- j++;
- }
- }
-
- }
- }
- return ret;
-}
-
-
-void browser_form_get_append(char **s, int *length, char sep, char *name, char *value)
-{
- unsigned int length1;
-
- name = curl_escape(name, 0);
- value = curl_escape(value, 0);
- length1 = 2 + strlen(name) + strlen(value);
-
- LOG(("append %c%s=%s, length1 %i, *s %p", sep, name, value, length1, *s));
- *s = xrealloc(*s, *length + length1 + 1);
-
- sprintf(*s + *length, "%c%s=%s", sep, name, value);
- *length += length1;
-
- curl_free(name);
- curl_free(value);
+ form_free_successful(success);
}
diff --git a/desktop/browser.h b/desktop/browser.h
index 8bd4f437b..38dc3628b 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -80,7 +80,7 @@ struct browser_action
action_buttons buttons;
} mouse;
struct {
- struct gui_gadget* g;
+ struct form_control* g;
int item;
} gadget_select;
} data;
@@ -114,7 +114,7 @@ int box_position_gt(struct box_position* x, struct box_position* y);
int box_position_eq(struct box_position* x, struct box_position* y);
int box_position_distance(struct box_position* x, struct box_position* y);
-void gui_redraw_gadget(struct browser_window* bw, struct gui_gadget* g);
+void gui_redraw_gadget(struct browser_window* bw, struct form_control* g);
void browser_window_stop_throbber(struct browser_window* bw);
void browser_window_reformat(struct browser_window* bw, int scroll_to_top);
diff --git a/desktop/gui.h b/desktop/gui.h
index 619ded567..bb52979c2 100644
--- a/desktop/gui.h
+++ b/desktop/gui.h
@@ -58,7 +58,7 @@ gui_safety gui_window_set_redraw_safety(gui_window* g, gui_safety s);
void gui_window_start_throbber(gui_window* g);
void gui_window_stop_throbber(gui_window* g);
-void gui_gadget_combo(struct browser_window* bw, struct gui_gadget* g, unsigned long mx, unsigned long my);
+void gui_gadget_combo(struct browser_window* bw, struct form_control* g, unsigned long mx, unsigned long my);
void gui_window_place_caret(gui_window *g, int x, int y, int height);