summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2004-03-21 20:07:14 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2004-03-21 20:07:14 +0000
commit3aeafecd7b547e3f535fb5a700fc20e590dab967 (patch)
tree3a903ee55002a0d5553bfae7d31adbc028b24897 /render
parent423f0f1e7068ba4874435c02e31b054e62ae7966 (diff)
downloadnetsurf-3aeafecd7b547e3f535fb5a700fc20e590dab967.tar.gz
netsurf-3aeafecd7b547e3f535fb5a700fc20e590dab967.tar.bz2
[project @ 2004-03-21 20:07:14 by jmb]
<input type="file" support> Broken in places. svn path=/import/netsurf/; revision=645
Diffstat (limited to 'render')
-rw-r--r--render/box.c17
-rw-r--r--render/form.c19
-rw-r--r--render/form.h4
3 files changed, 35 insertions, 5 deletions
diff --git a/render/box.c b/render/box.c
index 94419c4f8..d694481a1 100644
--- a/render/box.c
+++ b/render/box.c
@@ -74,7 +74,7 @@ static struct result box_select(xmlNode *n, struct status *status,
static struct result box_input(xmlNode *n, struct status *status,
struct css_style *style);
static struct box *box_input_text(xmlNode *n, struct status *status,
- struct css_style *style, bool password);
+ struct css_style *style, bool password, bool file);
static struct result box_button(xmlNode *n, struct status *status,
struct css_style *style);
static void add_option(xmlNode* n, struct form_control* current_select, char *text);
@@ -1036,16 +1036,22 @@ struct result box_input(xmlNode *n, struct status *status,
/* the default type is "text" */
if (type == 0 || stricmp(type, "text") == 0)
{
- box = box_input_text(n, status, style, false);
+ box = box_input_text(n, status, style, false, false);
gadget = box->gadget;
gadget->box = box;
}
else if (stricmp(type, "password") == 0)
{
- box = box_input_text(n, status, style, true);
+ box = box_input_text(n, status, style, true, false);
gadget = box->gadget;
gadget->box = box;
}
+ else if (stricmp(type, "file") == 0)
+ {
+ box = box_input_text(n, status, style, false, true);
+ gadget = box->gadget;
+ gadget->box = box;
+ }
else if (stricmp(type, "hidden") == 0)
{
/* no box for hidden inputs */
@@ -1154,7 +1160,7 @@ struct result box_input(xmlNode *n, struct status *status,
}
struct box *box_input_text(xmlNode *n, struct status *status,
- struct css_style *style, bool password)
+ struct css_style *style, bool password, bool file)
{
char *s;
unsigned int i;
@@ -1191,6 +1197,9 @@ struct box *box_input_text(xmlNode *n, struct status *status,
inline_box->text = xcalloc(inline_box->length + 1, 1);
for (i = 0; i != inline_box->length; i++)
inline_box->text[i] = '*';
+ } else if (file) {
+ box->gadget->type = GADGET_FILE;
+ inline_box->text = xcalloc(inline_box->length + 1, 1);
} else {
box->gadget->type = GADGET_TEXTBOX;
inline_box->text = xstrdup(box->gadget->value);
diff --git a/render/form.c b/render/form.c
index 6eee708b2..145ef68bd 100644
--- a/render/form.c
+++ b/render/form.c
@@ -11,10 +11,12 @@
*/
#include <assert.h>
+#include <stdio.h>
#include <string.h>
#include "curl/curl.h"
#include "netsurf/render/box.h"
#include "netsurf/render/form.h"
+#include "netsurf/utils/log.h"
#include "netsurf/utils/utils.h"
@@ -79,6 +81,7 @@ struct form_successful_control *form_successful_controls(struct form *form,
option = option->next) {
if (option->selected) {
success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
success_new->name = xstrdup(control->name);
success_new->value = xstrdup(option->value);
success_new->next = 0;
@@ -92,6 +95,7 @@ struct form_successful_control *form_successful_controls(struct form *form,
/* textarea */
if (control->type == GADGET_TEXTAREA) {
success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
success_new->name = xstrdup(control->name);
success_new->value = form_textarea_value(control);
success_new->next = 0;
@@ -105,6 +109,7 @@ struct form_successful_control *form_successful_controls(struct form *form,
unsigned int len = strlen(control->name) + 3;
/* x */
success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
success_new->name = xcalloc(1, len);
sprintf(success_new->name, "%s.x", control->name);
success_new->value = xcalloc(1, 20);
@@ -114,6 +119,7 @@ struct form_successful_control *form_successful_controls(struct form *form,
last_success = success_new;
/* y */
success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
success_new->name = xcalloc(1, len);
sprintf(success_new->name, "%s.y", control->name);
success_new->value = xcalloc(1, 20);
@@ -127,9 +133,22 @@ struct form_successful_control *form_successful_controls(struct form *form,
if (control->type == GADGET_RESET)
continue;
+ /* file */
+ if (control->type == GADGET_FILE) {
+ success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = true;
+ success_new->name = xstrdup(control->name);
+ success_new->value = xstrdup(control->value);
+ success_new->next = 0;
+ last_success->next = success_new;
+ last_success = success_new;
+ continue;
+ }
+
/* all others added if they have a value */
if (control->value) {
success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
success_new->name = xstrdup(control->name);
success_new->value = xstrdup(control->value);
success_new->next = 0;
diff --git a/render/form.h b/render/form.h
index 53f933720..0063df790 100644
--- a/render/form.h
+++ b/render/form.h
@@ -36,7 +36,8 @@ struct form {
struct form_control {
enum { GADGET_HIDDEN, GADGET_TEXTBOX, GADGET_RADIO, GADGET_CHECKBOX,
GADGET_SELECT, GADGET_TEXTAREA, GADGET_IMAGE,
- GADGET_PASSWORD, GADGET_SUBMIT, GADGET_RESET } type;
+ GADGET_PASSWORD, GADGET_SUBMIT, GADGET_RESET,
+ GADGET_FILE } type;
char *name;
char *value;
char *initial_value;
@@ -80,6 +81,7 @@ struct form_option {
/** Successful control, as defined by HTML 4.01 17.13. */
struct form_successful_control {
+ bool file; /**< It's a file */
char *name; /**< Control name. */
char *value; /**< Current value. */
struct form_successful_control *next; /**< Next in linked list. */