From a836591435736b1d72eced1e6f643341422a7d82 Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Thu, 13 Jul 2006 12:46:02 +0000 Subject: Add basic cookie viewer, make trees use textarea components for UTF8 editing, trim headers, fix tree redraw issues. svn path=/trunk/netsurf/; revision=2739 --- content/urldb.c | 117 ++++++++++++++++------------ content/urldb.h | 26 +++++++ desktop/cookies.h | 21 +++++ desktop/options.h | 2 +- desktop/tree.c | 145 ++++++++++++++++++++++++++++++++-- desktop/tree.h | 19 ++++- gtk/gtk_gui.c | 4 + makefile | 2 +- riscos/cookies.c | 201 ++++++++++++++++++++++++++++++++++++++++++++++++ riscos/cookies.h | 19 +++++ riscos/debugwin.c | 1 + riscos/dialog.c | 4 + riscos/download.c | 1 + riscos/global_history.c | 2 +- riscos/gui.c | 6 +- riscos/gui.h | 14 ++-- riscos/help.c | 26 +++++-- riscos/history.c | 4 +- riscos/menus.c | 79 ++++++++++++++++--- riscos/menus.h | 5 +- riscos/options.h | 3 + riscos/save.c | 1 + riscos/theme.c | 39 +++++++++- riscos/theme.h | 22 +++--- riscos/treeview.c | 88 +++++++++++---------- riscos/url_complete.h | 4 +- riscos/window.c | 1 + 27 files changed, 716 insertions(+), 140 deletions(-) create mode 100644 desktop/cookies.h create mode 100644 riscos/cookies.c create mode 100644 riscos/cookies.h diff --git a/content/urldb.c b/content/urldb.c index 35baecd2a..5cc56d26c 100644 --- a/content/urldb.c +++ b/content/urldb.c @@ -82,6 +82,7 @@ #include "netsurf/image/bitmap.h" #include "netsurf/content/urldb.h" +#include "netsurf/desktop/cookies.h" #include "netsurf/desktop/options.h" #ifdef riscos /** \todo lose this */ @@ -91,7 +92,7 @@ #include "netsurf/utils/url.h" #include "netsurf/utils/utils.h" -struct cookie { +struct cookie_internal_data { char *name; /**< Cookie name */ char *value; /**< Cookie value */ char *comment; /**< Cookie comment */ @@ -102,15 +103,12 @@ struct cookie { time_t expires; /**< Expiry timestamp, or 1 for session */ time_t last_used; /**< Last used time */ bool secure; /**< Only send for HTTPS requests */ - enum { COOKIE_NETSCAPE = 0, - COOKIE_RFC2109 = 1, - COOKIE_RFC2965 = 2 - } version; /**< Specification compliance */ + cookie_version version; /**< Specification compliance */ bool no_destroy; /**< Never destroy this cookie, * unless it's expired */ - struct cookie *prev; /**< Previous in list */ - struct cookie *next; /**< Next in list */ + struct cookie_internal_data *prev; /**< Previous in list */ + struct cookie_internal_data *next; /**< Next in list */ }; struct auth_data { @@ -138,7 +136,7 @@ struct path_data { struct bitmap *thumb; /**< Thumbnail image of resource */ struct url_internal_data urld; /**< URL data for resource */ struct auth_data auth; /**< Authentication data for resource */ - struct cookie *cookies; /**< Cookies associated with resource */ + struct cookie_internal_data *cookies; /**< Cookies associated with resource */ struct path_data *next; /**< Next sibling */ struct path_data *prev; /**< Previous sibling */ @@ -189,11 +187,11 @@ static bool urldb_iterate_partial_path(const struct path_data *parent, const char *prefix, bool (*callback)(const char *url, const struct url_data *data)); static bool urldb_iterate_entries_host(struct search_node *parent, - bool (*callback)(const char *url, - const struct url_data *data)); + bool (*url_callback)(const char *url, const struct url_data *data), + bool (*cookie_callback)(const struct cookie_data *data)); static bool urldb_iterate_entries_path(const struct path_data *parent, - bool (*callback)(const char *url, - const struct url_data *data)); + bool (*url_callback)(const char *url, const struct url_data *data), + bool (*cookie_callback)(const struct cookie_data *data)); /* Insertion */ static struct host_part *urldb_add_host_node(const char *part, @@ -239,13 +237,13 @@ static int urldb_search_match_prefix(const struct host_part *a, const char *b); /* Cookies */ -static struct cookie *urldb_parse_cookie(const char *url, +static struct cookie_internal_data *urldb_parse_cookie(const char *url, const char **cookie); -static bool urldb_parse_avpair(struct cookie *c, char *n, char *v); -static bool urldb_insert_cookie(struct cookie *c, const char *scheme, +static bool urldb_parse_avpair(struct cookie_internal_data *c, char *n, char *v); +static bool urldb_insert_cookie(struct cookie_internal_data *c, const char *scheme, const char *url); -static void urldb_free_cookie(struct cookie *c); -static bool urldb_concat_cookie(struct cookie *c, int *used, +static void urldb_free_cookie(struct cookie_internal_data *c); +static bool urldb_concat_cookie(struct cookie_internal_data *c, int *used, int *alloc, char **buf); static void urldb_save_cookie_hosts(FILE *fp, struct host_part *parent); static void urldb_save_cookie_paths(FILE *fp, struct path_data *parent); @@ -1225,7 +1223,7 @@ bool urldb_iterate_partial_host(struct search_node *root, const char *prefix, if (root->data->paths.children) { /* and extract all paths attached to this host */ if (!urldb_iterate_entries_path(&root->data->paths, - callback)) { + callback, NULL)) { return false; } } @@ -1274,7 +1272,7 @@ bool urldb_iterate_partial_path(const struct path_data *parent, if (slash == end) { /* we've run out of prefix, so all * paths below this one match */ - if (!urldb_iterate_entries_path(p, callback)) + if (!urldb_iterate_entries_path(p, callback, NULL)) return false; } else { /* more prefix to go => recurse */ @@ -1301,7 +1299,25 @@ void urldb_iterate_entries(bool (*callback)(const char *url, for (i = 0; i < NUM_SEARCH_TREES; i++) { if (!urldb_iterate_entries_host(search_trees[i], - callback)) + callback, NULL)) + break; + } +} + +/** + * Iterate over all cookies in database + * + * \param callback Function to callback for each entry + */ +void urldb_iterate_cookies(bool (*callback)(const struct cookie_data *data)) +{ + int i; + + assert(callback); + + for (i = 0; i < NUM_SEARCH_TREES; i++) { + if (!urldb_iterate_entries_host(search_trees[i], + NULL, callback)) break; } } @@ -1310,28 +1326,29 @@ void urldb_iterate_entries(bool (*callback)(const char *url, * Host data iterator (internal) * * \param parent Root of subtree to iterate over - * \param callback Callback function + * \param url_callback Callback function + * \param cookie_callback Callback function * \return true to continue, false otherwise */ bool urldb_iterate_entries_host(struct search_node *parent, - bool (*callback)(const char *url, - const struct url_data *data)) + bool (*url_callback)(const char *url, const struct url_data *data), + bool (*cookie_callback)(const struct cookie_data *data)) { if (parent == &empty) return true; - if (!urldb_iterate_entries_host(parent->left, callback)) + if (!urldb_iterate_entries_host(parent->left, url_callback, cookie_callback)) return false; - if (parent->data->paths.children) { - /* We have paths, so iterate them */ + if ((parent->data->paths.children) || ((cookie_callback) && (parent->data->paths.cookies))) { + /* We have paths (or domain cookies), so iterate them */ if (!urldb_iterate_entries_path(&parent->data->paths, - callback)) { + url_callback, cookie_callback)) { return false; } } - if (!urldb_iterate_entries_host(parent->right, callback)) + if (!urldb_iterate_entries_host(parent->right, url_callback, cookie_callback)) return false; return true; @@ -1341,33 +1358,36 @@ bool urldb_iterate_entries_host(struct search_node *parent, * Path data iterator (internal) * * \param parent Root of subtree to iterate over - * \param callback Callback function to call + * \param url_callback Callback function + * \param cookie_callback Callback function * \return true to continue, false otherwise */ bool urldb_iterate_entries_path(const struct path_data *parent, - bool (*callback)(const char *url, - const struct url_data *data)) + bool (*url_callback)(const char *url, const struct url_data *data), + bool (*cookie_callback)(const struct cookie_data *data)) { const struct path_data *p; if (!parent->children) { /* leaf node */ - /* All leaf nodes in the path tree should have an URL + /* All leaf nodes in the path tree should have an URL or cookies * attached to them. If this is not the case, it indicates * that there's a bug in the file loader/URL insertion code. * Therefore, assert this here. */ - assert(parent->url); + assert(parent->url || parent->cookies); /** \todo handle fragments? */ - - if (!callback(parent->url, + if (url_callback && parent->url && !url_callback(parent->url, (const struct url_data *) &parent->urld)) return false; + if (cookie_callback && parent->cookies && !cookie_callback( + (const struct cookie_data *) parent->cookies)) + return false; } for (p = parent->children; p; p = p->next) { - if (!urldb_iterate_entries_path(p, callback)) + if (!urldb_iterate_entries_path(p, url_callback, cookie_callback)) return false; } @@ -2278,7 +2298,7 @@ char *urldb_get_cookie(const char *url, const char *referer) { const struct path_data *p, *q; const struct host_part *h; - struct cookie *c; + struct cookie_internal_data *c; int count = 0, version = COOKIE_RFC2965; int ret_alloc = 4096, ret_used = 1; char *path; @@ -2519,7 +2539,7 @@ bool urldb_set_cookie(const char *header, const char *url) end = cur + strlen(cur) - 2 /* Trailing CRLF */; do { - struct cookie *c; + struct cookie_internal_data *c; char *dot; c = urldb_parse_cookie(url, &cur); @@ -2595,6 +2615,7 @@ bool urldb_set_cookie(const char *header, const char *url) /* Now insert into database */ if (!urldb_insert_cookie(c, scheme, urlt)) goto error; + cookies_update((struct cookie_data *)c); } while (cur < end); free(host); @@ -2620,9 +2641,9 @@ error: * \param cookie Pointer to cookie string (updated on exit) * \return Pointer to cookie structure (on heap, caller frees) or NULL */ -struct cookie *urldb_parse_cookie(const char *url, const char **cookie) +struct cookie_internal_data *urldb_parse_cookie(const char *url, const char **cookie) { - struct cookie *c; + struct cookie_internal_data *c; const char *cur; char name[1024], value[4096]; char *n = name, *v = value; @@ -2632,7 +2653,7 @@ struct cookie *urldb_parse_cookie(const char *url, const char **cookie) assert(url && cookie && *cookie); - c = calloc(1, sizeof(struct cookie)); + c = calloc(1, sizeof(struct cookie_internal_data)); if (!c) return NULL; @@ -2779,7 +2800,7 @@ struct cookie *urldb_parse_cookie(const char *url, const char **cookie) * \param v Value component * \return true on success, false on memory exhaustion */ -bool urldb_parse_avpair(struct cookie *c, char *n, char *v) +bool urldb_parse_avpair(struct cookie_internal_data *c, char *n, char *v) { int vlen; @@ -2881,10 +2902,10 @@ bool urldb_parse_avpair(struct cookie *c, char *n, char *v) * \param url URL (sans fragment) associated with cookie * \return true on success, false on memory exhaustion (c will be freed) */ -bool urldb_insert_cookie(struct cookie *c, const char *scheme, +bool urldb_insert_cookie(struct cookie_internal_data *c, const char *scheme, const char *url) { - struct cookie *d; + struct cookie_internal_data *d; const struct host_part *h; struct path_data *p; @@ -2977,7 +2998,7 @@ bool urldb_insert_cookie(struct cookie *c, const char *scheme, * * \param c The cookie to free */ -void urldb_free_cookie(struct cookie *c) +void urldb_free_cookie(struct cookie_internal_data *c) { assert(c); @@ -2998,7 +3019,7 @@ void urldb_free_cookie(struct cookie *c) * \param buf Pointer to Pointer to buffer (updated) * \return true on success, false on memory exhaustion */ -bool urldb_concat_cookie(struct cookie *c, int *used, int *alloc, char **buf) +bool urldb_concat_cookie(struct cookie_internal_data *c, int *used, int *alloc, char **buf) { int clen; @@ -3128,7 +3149,7 @@ void urldb_load_cookies(const char *filename) assert(p <= end); /* Now create cookie */ - struct cookie *c = malloc(sizeof(struct cookie)); + struct cookie_internal_data *c = malloc(sizeof(struct cookie_internal_data)); if (!c) break; @@ -3228,7 +3249,7 @@ void urldb_save_cookie_paths(FILE *fp, struct path_data *parent) assert(fp && parent); if (parent->cookies) { - for (struct cookie *c = parent->cookies; c; c = c->next) { + for (struct cookie_internal_data *c = parent->cookies; c; c = c->next) { if (c->expires < now) /* Skip expired cookies */ diff --git a/content/urldb.h b/content/urldb.h index 04a8b5d2f..ec08bb2b1 100644 --- a/content/urldb.h +++ b/content/urldb.h @@ -16,6 +16,12 @@ #include #include "netsurf/content/content_type.h" +typedef enum { + COOKIE_NETSCAPE = 0, + COOKIE_RFC2109 = 1, + COOKIE_RFC2965 = 2 +} cookie_version; + struct url_data { const char *title; /**< Resource title */ unsigned int visits; /**< Visit count */ @@ -23,6 +29,25 @@ struct url_data { content_type type; /**< Type of resource */ }; +struct cookie_data { + const char *name; /**< Cookie name */ + const char *value; /**< Cookie value */ + const char *comment; /**< Cookie comment */ + const bool domain_from_set; /**< Domain came from Set-Cookie: header */ + const char *domain; /**< Domain */ + const bool path_from_set; /**< Path came from Set-Cookie: header */ + const char *path; /**< Path */ + const time_t expires; /**< Expiry timestamp, or 1 for session */ + const time_t last_used; /**< Last used time */ + const bool secure; /**< Only send for HTTPS requests */ + cookie_version version; /**< Specification compliance */ + const bool no_destroy; /**< Never destroy this cookie, + * unless it's expired */ + + const struct cookie_data *prev; /**< Previous in list */ + const struct cookie_data *next; /**< Next in list */ +}; + struct bitmap; /* Persistence support */ @@ -62,6 +87,7 @@ void urldb_iterate_partial(const char *prefix, /* Iteration */ void urldb_iterate_entries(bool (*callback)(const char *url, const struct url_data *data)); +void urldb_iterate_cookies(bool (*callback)(const struct cookie_data *cookie)); /* Debug */ void urldb_dump(void); diff --git a/desktop/cookies.h b/desktop/cookies.h new file mode 100644 index 000000000..94d74dd50 --- /dev/null +++ b/desktop/cookies.h @@ -0,0 +1,21 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2006 Richard Wilson + */ + +/** \file + * Cookies (interface). + */ + +#ifndef _NETSURF_DESKTOP_COOKIES_H_ +#define _NETSURF_DESKTOP_COOKIES_H_ + +#include + +struct cookie_data; + +bool cookies_update(const struct cookie_data *data); + +#endif diff --git a/desktop/options.h b/desktop/options.h index 35e1d62a9..fdfeb89d0 100644 --- a/desktop/options.h +++ b/desktop/options.h @@ -24,7 +24,7 @@ #ifndef _NETSURF_DESKTOP_OPTIONS_H_ #define _NETSURF_DESKTOP_OPTIONS_H_ -#include "netsurf/desktop/tree.h" +struct tree; enum { OPTION_HTTP_PROXY_AUTH_NONE = 0, OPTION_HTTP_PROXY_AUTH_BASIC = 1, OPTION_HTTP_PROXY_AUTH_NTLM = 2 }; diff --git a/desktop/tree.c b/desktop/tree.c index b278be8df..7d3625945 100644 --- a/desktop/tree.c +++ b/desktop/tree.c @@ -18,6 +18,7 @@ #include "netsurf/desktop/tree.h" #include "netsurf/desktop/options.h" #include "netsurf/utils/log.h" +#include "netsurf/utils/messages.h" #include "netsurf/utils/utils.h" static void tree_draw_node(struct tree *tree, struct node *node, int clip_x, @@ -33,6 +34,8 @@ static void tree_selected_to_processing(struct node *node); void tree_clear_processing(struct node *node); struct node *tree_move_processing_node(struct node *node, struct node *link, bool before, bool first); +struct node *tree_create_leaf_node(struct node *parent, const char *title); +struct node *tree_create_leaf_node_shared(struct node *parent, const char *title); static int tree_initialising = 0; @@ -726,6 +729,12 @@ void tree_draw_node(struct tree *tree, struct node *node, int clip_x, int clip_y tree_draw_line(node->box.x + (NODE_INSTEP / 2), node->data.box.y + node->data.box.height, 0, (40 / 2)); + if ((node->parent) && (node->parent != tree->root) && + (node->parent->child == node)) + tree_draw_line(node->parent->box.x + (NODE_INSTEP / 2), + node->parent->data.box.y + + node->parent->data.box.height, 0, + (40 / 2)); tree_draw_line(node->box.x - (NODE_INSTEP / 2), node->data.box.y + node->data.box.height - (40 / 2), @@ -895,13 +904,18 @@ void tree_delete_node(struct tree *tree, struct node *node, bool siblings) { if (e->text) { /* we don't free non-editable titles or URLs */ - if (node->editable) + if ((node->editable) || (node->folder)) free(e->text); else { if (e->data == TREE_ELEMENT_URL) { /* reset URL characteristics */ urldb_reset_url_visit_data(e->text); } + + /* if not already 'deleted' then delete cookie */ + if (!node->deleted) { + /* todo: delete cookie data */ + } if (e->data != TREE_ELEMENT_TITLE && e->data != TREE_ELEMENT_URL) @@ -974,6 +988,33 @@ struct node *tree_create_leaf_node(struct node *parent, const char *title) { node->data.type = NODE_ELEMENT_TEXT; node->data.text = squash_whitespace(title); node->data.data = TREE_ELEMENT_TITLE; + node->editable = true; + if (parent) + tree_link_node(parent, node, false); + return node; +} + + +/** + * Creates a leaf node with the specified title, and links it into the tree. + * + * \param parent the parent node, or NULL not to link + * \param title the node title + * \return the newly created node. + */ +struct node *tree_create_leaf_node_shared(struct node *parent, const char *title) { + struct node *node; + + assert(title); + + node = calloc(sizeof(struct node), 1); + if (!node) return NULL; + node->folder = false; + node->data.parent = node; + node->data.type = NODE_ELEMENT_TEXT; + node->data.text = title; + node->data.data = TREE_ELEMENT_TITLE; + node->editable = false; if (parent) tree_link_node(parent, node, false); return node; @@ -1009,7 +1050,6 @@ struct node *tree_create_URL_node(struct node *parent, node = tree_create_leaf_node(parent, title); if (!node) return NULL; - node->editable = true; element = tree_create_node_element(node, TREE_ELEMENT_THUMBNAIL); if (element) @@ -1050,12 +1090,9 @@ struct node *tree_create_URL_node_shared(struct node *parent, title = data->title; else title = url; - node = tree_create_leaf_node(parent, title); + node = tree_create_leaf_node_shared(parent, title); if (!node) return NULL; - free(node->data.text); - node->data.text = title; - node->editable = false; element = tree_create_node_element(node, TREE_ELEMENT_THUMBNAIL); if (element) @@ -1073,6 +1110,102 @@ struct node *tree_create_URL_node_shared(struct node *parent, } +/** + * Creates a tree entry for a cookie, and links it into the tree. + * + * All information is used directly from the url_data, and as such cannot be + * edited and should never be freed. + * + * \param parent the node to link to + * \param url the URL + * \param data the cookie data to use + * \return the node created, or NULL for failure + */ +struct node *tree_create_cookie_node(struct node *parent, + const struct cookie_data *data) { + struct node *node; + struct node_element *element; + char buffer[256]; + char buffer2[16]; + + node = tree_create_leaf_node(parent, data->name); + if (!node) + return NULL; + node->data.data = TREE_ELEMENT_NAME; + node->editable = false; + + + element = tree_create_node_element(node, TREE_ELEMENT_PERSISTENT); + if (element) { + snprintf(buffer, 256, messages_get("TreePersistent"), + data->no_destroy ? messages_get("Yes") : messages_get("No")); + element->text = strdup(buffer); + } + element = tree_create_node_element(node, TREE_ELEMENT_VERSION); + if (element) { + snprintf(buffer2, 16, "TreeVersion%i", data->version); + snprintf(buffer, 256, messages_get("TreeVersion"), messages_get(buffer2)); + element->text = strdup(buffer); + } + element = tree_create_node_element(node, TREE_ELEMENT_SECURE); + if (element) { + snprintf(buffer, 256, messages_get("TreeSecure"), + data->secure ? messages_get("Yes") : messages_get("No")); + element->text = strdup(buffer); + } + element = tree_create_node_element(node, TREE_ELEMENT_LAST_USED); + if (element) { + snprintf(buffer, 256, messages_get("TreeLastUsed"), + (data->last_used > 0) ? + ctime(&data->last_used) : messages_get("TreeUnknown")); + if (data->last_used > 0) + buffer[strlen(buffer) - 1] = '\0'; + element->text = strdup(buffer); + } + element = tree_create_node_element(node, TREE_ELEMENT_EXPIRES); + if (element) { + snprintf(buffer, 256, messages_get("TreeExpires"), + (data->expires > 0) ? + ctime(&data->expires) : messages_get("TreeUnknown")); + if (data->expires > 0) + buffer[strlen(buffer) - 1] = '\0'; + element->text = strdup(buffer); + } + element = tree_create_node_element(node, TREE_ELEMENT_PATH); + if (element) { + snprintf(buffer, 256, messages_get("TreePath"), data->path, + data->path_from_set ? messages_get("TreeHeaders") : ""); + element->text = strdup(buffer); + } + element = tree_create_node_element(node, TREE_ELEMENT_DOMAIN); + if (element) { + snprintf(buffer, 256, messages_get("TreeDomain"), data->domain, + data->domain_from_set ? messages_get("TreeHeaders") : ""); + element->text = strdup(buffer); + } + if ((data->comment) && (strcmp(data->comment, ""))) { + LOG(("Comment: '%s'", data->comment)); + element = tree_create_node_element(node, TREE_ELEMENT_COMMENT); + if (element) { + snprintf(buffer, 256, messages_get("TreeComment"), data->comment); + element->text = strdup(buffer); + } + } + element = tree_create_node_element(node, TREE_ELEMENT_VALUE); + if (element) { + snprintf(buffer, 256, messages_get("TreeValue"), + data->value ? data->value : messages_get("TreeUnused")); + element->text = strdup(buffer); + } + + /* add version, last_used, expires, + * path, domain, comment, value */ + tree_set_node_sprite(node, "small_xxx", "small_xxx"); + tree_recalculate_node(node, false); + return node; +} + + /** * Creates an empty text node element and links it to a node. * diff --git a/desktop/tree.h b/desktop/tree.h index 0e9bf96ad..8990119d0 100644 --- a/desktop/tree.h +++ b/desktop/tree.h @@ -13,8 +13,10 @@ #define _NETSURF_DESKTOP_TREE_H_ #include +#include struct url_data; +struct cookie_data; typedef enum { TREE_ELEMENT_URL, @@ -23,7 +25,17 @@ typedef enum { TREE_ELEMENT_VISITS, TREE_ELEMENT_VISITED, TREE_ELEMENT_THUMBNAIL, - TREE_ELEMENT_TITLE + TREE_ELEMENT_TITLE, + TREE_ELEMENT_NAME, + TREE_ELEMENT_VALUE, + TREE_ELEMENT_COMMENT, + TREE_ELEMENT_DOMAIN, + TREE_ELEMENT_PATH, + TREE_ELEMENT_EXPIRES, + TREE_ELEMENT_LAST_USED, + TREE_ELEMENT_SECURE, + TREE_ELEMENT_VERSION, + TREE_ELEMENT_PERSISTENT } node_element_data; #define NODE_INSTEP 40 @@ -85,9 +97,9 @@ struct tree { int window_width; /* <-- Tree window width */ int window_height; /* <-- Tree window height */ int edit_handle; /* <-- Handle for editing information */ + uintptr_t textarea_handle; /* <-- Handle for UTF-8 textarea */ bool movable; /* <-- Whether nodes can be moved */ struct node_element *editing; /* <-- Node element being edited */ - char edit_buffer[256]; /* <-- Editing buffer */ struct node *temp_selection; /* <-- Temporarily selected node */ struct toolbar *toolbar; /* <-- Tree toolbar */ }; @@ -114,7 +126,6 @@ void tree_draw(struct tree *tree, int clip_x, int clip_y, int clip_width, void tree_link_node(struct node *link, struct node *node, bool before); void tree_delink_node(struct node *node); struct node *tree_create_folder_node(struct node *parent, const char *title); -struct node *tree_create_leaf_node(struct node *parent, const char *title); void tree_set_node_sprite(struct node *node, const char *sprite, const char *expanded); struct node *tree_create_URL_node(struct node *parent, @@ -122,6 +133,8 @@ struct node *tree_create_URL_node(struct node *parent, const char *title); struct node *tree_create_URL_node_shared(struct node *parent, const char *url, const struct url_data *data); +struct node *tree_create_cookie_node(struct node *parent, + const struct cookie_data *data); void tree_set_node_expanded(struct node *node, bool expanded); void tree_set_node_selected(struct tree *tree, struct node *node, bool selected); diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c index 43f18c6db..aed363159 100644 --- a/gtk/gtk_gui.c +++ b/gtk/gtk_gui.c @@ -326,3 +326,7 @@ char *url_to_path(const char *url) return strdup(url + 5); } +bool cookies_update(const char *domain, const struct cookie_data *data) +{ + retutn true; +} diff --git a/makefile b/makefile index de781540b..7cfae6e37 100644 --- a/makefile +++ b/makefile @@ -33,7 +33,7 @@ OBJECTS_RISCOS = $(OBJECTS_COMMON) $(OBJECTS_IMAGE) OBJECTS_RISCOS += browser.o history_core.o netsurf.o selection.o \ textinput.o version.o gesture_core.o # desktop/ OBJECTS_RISCOS += 401login.o artworks.o assert.o awrender.o bitmap.o \ - buffer.o configure.o debugwin.o \ + buffer.o cookies.o configure.o debugwin.o \ dialog.o download.o draw.o filetype.o font.o \ global_history.o gui.o help.o history.o hotlist.o image.o \ menus.o message.o palettes.o plotters.o plugin.o print.o \ diff --git a/riscos/cookies.c b/riscos/cookies.c new file mode 100644 index 000000000..b1cf8873f --- /dev/null +++ b/riscos/cookies.c @@ -0,0 +1,201 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2006 Richard Wilson + */ + +/** \file + * Cookies (implementation). + */ + +#include +#include +#include +#include +#include +#include +#include "oslib/wimp.h" +#include "oslib/wimpspriteop.h" +#include "netsurf/content/urldb.h" +#include "netsurf/desktop/cookies.h" +#include "netsurf/desktop/tree.h" +#include "netsurf/riscos/cookies.h" +#include "netsurf/riscos/dialog.h" +#include "netsurf/riscos/menus.h" +#include "netsurf/riscos/options.h" +#include "netsurf/riscos/theme.h" +#include "netsurf/riscos/treeview.h" +#include "netsurf/riscos/wimp.h" +#include "netsurf/riscos/wimp_event.h" +#include "netsurf/utils/messages.h" +#include "netsurf/utils/log.h" +#include "netsurf/utils/url.h" +#include "netsurf/utils/utils.h" + +static bool ro_gui_cookies_click(wimp_pointer *pointer); +static struct node *ro_gui_cookies_find(const char *url); + +/* The history window, toolbar and plot origins */ +static wimp_w cookies_window; +struct tree *cookies_tree; +static bool cookies_init; + +/** + * Initialise cookies tree + */ +void ro_gui_cookies_initialise(void) +{ + /* create our window */ + cookies_window = ro_gui_dialog_create("tree"); + ro_gui_set_window_title(cookies_window, + messages_get("Cookies")); + ro_gui_wimp_event_register_redraw_window(cookies_window, + ro_gui_tree_redraw); + ro_gui_wimp_event_register_open_window(cookies_window, + ro_gui_tree_open); + ro_gui_wimp_event_register_mouse_click(cookies_window, + ro_gui_cookies_click); + + /* Create an empty tree */ + cookies_tree = calloc(sizeof(struct tree), 1); + if (!cookies_tree) { + warn_user("NoMemory", 0); + return; + } + cookies_tree->root = tree_create_folder_node(NULL, "Root"); + if (!cookies_tree->root) { + warn_user("NoMemory", 0); + free(cookies_tree); + cookies_tree = NULL; + } + cookies_tree->root->expanded = true; + cookies_tree->handle = (int)cookies_window; + cookies_tree->movable = false; + ro_gui_wimp_event_set_user_data(cookies_window, + cookies_tree); + ro_gui_wimp_event_register_keypress(cookies_window, + ro_gui_tree_keypress); + + /* Create our toolbar */ + cookies_tree->toolbar = ro_gui_theme_create_toolbar(NULL, + THEME_COOKIES_TOOLBAR); + if (cookies_tree->toolbar) + ro_gui_theme_attach_toolbar(cookies_tree->toolbar, + cookies_window); + + cookies_init = true; + urldb_iterate_cookies(cookies_update); + cookies_init = false; + tree_initialise(cookies_tree); +} + + +/** + * Respond to a mouse click + * + * \param pointer the pointer state + * \return true to indicate click handled + */ +bool ro_gui_cookies_click(wimp_pointer *pointer) +{ + ro_gui_tree_click(pointer, cookies_tree); + if (pointer->buttons == wimp_CLICK_MENU) + ro_gui_menu_create(cookies_menu, pointer->pos.x, + pointer->pos.y, pointer->w); + else + ro_gui_menu_prepare_action(pointer->w, TREE_SELECTION, false); + return true; +} + + +/** + * Attempts to process an interactive help message request + * + * \param x the x co-ordinate to give help for + * \param y the x co-ordinate to give help for + * \return the message code index + */ +int ro_gui_cookies_help(int x, int y) +{ + return -1; +} + + +/** + * Perform cookie addition + * + * \param data Cookie data for a domain + * \return true (for urldb_iterate_entries) + */ +bool cookies_update(const struct cookie_data *data) +{ + struct node *parent; + struct node *node = NULL; + struct node *child; + const struct cookie_data *cookie; + + assert(data); + + /* check if we're a domain, and add get the first cookie */ + for (cookie = data; cookie->prev; cookie = cookie->prev); + + if (!cookies_init) { + node = ro_gui_cookies_find(data->domain); + if (node) { + /* mark as deleted so we don't remove the cookies */ + for (child = node->child; child; child = child->next) + child->deleted = true; + if (node->child) + tree_delete_node(cookies_tree, node->child, + true); + } + } + + if (!node) { + for (parent = cookies_tree->root->child; parent; + parent = parent->next) { + if (strcmp(cookie->domain, parent->data.text) < 0) + break; + } + if (!parent) { + node = tree_create_folder_node(cookies_tree->root, + cookie->domain); + } else { + node = tree_create_folder_node(NULL, data->domain); + if (node) + tree_link_node(parent, node, true); + } + } + if (!node) + return true; + node->editable = false; + + for (; cookie; cookie = cookie->next) + tree_create_cookie_node(node, cookie); + if (!cookies_init) { + tree_handle_node_changed(cookies_tree, node, + true, false); + tree_redraw_area(cookies_tree, + node->box.x - NODE_INSTEP, + 0, NODE_INSTEP, 16384); + } + return true; +} + +/** + * Find an entry in the cookie tree + * + * \param url The URL to find + * \return Pointer to node, or NULL if not found + */ +struct node *ro_gui_cookies_find(const char *url) +{ + struct node *node; + + for (node = cookies_tree->root->child; node; node = node->next) { + if (!strcmp(url, node->data.text)) + return node; + } + return NULL; +} diff --git a/riscos/cookies.h b/riscos/cookies.h new file mode 100644 index 000000000..283a91ca8 --- /dev/null +++ b/riscos/cookies.h @@ -0,0 +1,19 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2006 Richard Wilson + */ + +/** \file + * Cookies (interface). + */ + +#ifndef _NETSURF_RISCOS_COOKIES_H_ +#define _NETSURF_RISCOS_COOKIES_H_ + +void ro_gui_cookies_initialise(void); +int ro_gui_cookies_help(int x, int y); + + +#endif diff --git a/riscos/debugwin.c b/riscos/debugwin.c index d271eb890..a38f2e442 100644 --- a/riscos/debugwin.c +++ b/riscos/debugwin.c @@ -12,6 +12,7 @@ #include #include #include "oslib/wimp.h" +#include "netsurf/content/content.h" #include "netsurf/riscos/dialog.h" #include "netsurf/riscos/wimp_event.h" #include "netsurf/utils/log.h" diff --git a/riscos/dialog.c b/riscos/dialog.c index aa46f19b2..706ee5701 100644 --- a/riscos/dialog.c +++ b/riscos/dialog.c @@ -24,6 +24,7 @@ #include "netsurf/desktop/netsurf.h" #include "netsurf/render/font.h" #include "netsurf/riscos/configure.h" +#include "netsurf/riscos/cookies.h" #include "netsurf/riscos/dialog.h" #include "netsurf/riscos/global_history.h" #include "netsurf/riscos/gui.h" @@ -102,6 +103,9 @@ void ro_gui_dialog_init(void) /* global history window */ ro_gui_global_history_initialise(); + /* cookies window */ + ro_gui_cookies_initialise(); + /* theme installation */ dialog_theme_install = ro_gui_dialog_create("theme_inst"); ro_gui_wimp_event_register_cancel(dialog_theme_install, diff --git a/riscos/download.c b/riscos/download.c index 171b7ffcc..fb4ddc045 100644 --- a/riscos/download.c +++ b/riscos/download.c @@ -32,6 +32,7 @@ #include "oslib/wimpspriteop.h" #include "netsurf/content/fetch.h" #include "netsurf/desktop/gui.h" +#include "netsurf/desktop/netsurf.h" #include "netsurf/riscos/dialog.h" #include "netsurf/riscos/options.h" #include "netsurf/riscos/save.h" diff --git a/riscos/global_history.c b/riscos/global_history.c index 93cb34be7..c16eea498 100644 --- a/riscos/global_history.c +++ b/riscos/global_history.c @@ -90,7 +90,6 @@ void ro_gui_global_history_initialise(void) } global_history_tree->root->expanded = true; ro_gui_global_history_initialise_nodes(); - tree_initialise(global_history_tree); global_history_tree->handle = (int)global_history_window; global_history_tree->movable = false; ro_gui_wimp_event_set_user_data(global_history_window, @@ -122,6 +121,7 @@ void ro_gui_global_history_initialise(void) global_history_init = true; urldb_iterate_entries(global_history_add_internal); global_history_init = false; + tree_initialise(global_history_tree); } /** diff --git a/riscos/gui.c b/riscos/gui.c index 3e8efca12..a2206d759 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -321,9 +321,11 @@ void gui_init(int argc, char** argv) if (!option_toolbar_browser) option_toolbar_browser = strdup("0123|58|9"); if (!option_toolbar_hotlist) - option_toolbar_hotlist = strdup("401|23"); + option_toolbar_hotlist = strdup("40|12|3"); if (!option_toolbar_history) - option_toolbar_history = strdup("01|23"); + option_toolbar_history = strdup("0|12|3"); + if (!option_toolbar_cookies) + option_toolbar_cookies = strdup("0|12"); if (!option_ca_bundle) option_ca_bundle = strdup("NetSurf:Resources.ca-bundle"); if (!option_cookie_file) diff --git a/riscos/gui.h b/riscos/gui.h index b5665dcda..743e701ea 100644 --- a/riscos/gui.h +++ b/riscos/gui.h @@ -15,12 +15,9 @@ #include #include #include -#include "netsurf/utils/config.h" #include "netsurf/desktop/browser.h" -#include "netsurf/desktop/netsurf.h" -#include "netsurf/desktop/gui.h" -#include "netsurf/desktop/options.h" -#include "netsurf/desktop/tree.h" +#include "netsurf/content/content_type.h" +#include "netsurf/utils/config.h" #define RISCOS5 0xAA @@ -33,6 +30,11 @@ extern const char * NETSURF_DIR; struct toolbar; struct plotter_table; +struct gui_window; +struct tree; +struct node; +struct history; +struct css_style; extern wimp_t task_handle; /**< RISC OS wimp task handle. */ @@ -51,7 +53,7 @@ extern bool gui_redraw_debug; extern osspriteop_area *gui_sprites; extern bool dialog_folder_add, dialog_entry_add, hotlist_insert; extern bool print_active, print_text_black; -extern struct tree *hotlist_tree, *global_history_tree; +extern struct tree *hotlist_tree, *global_history_tree, *cookies_tree; typedef enum { GUI_DRAG_NONE, GUI_DRAG_SELECTION, GUI_DRAG_DOWNLOAD_SAVE, GUI_DRAG_SAVE, GUI_DRAG_SCROLL, GUI_DRAG_STATUS_RESIZE, diff --git a/riscos/help.c b/riscos/help.c index de42f8f30..f189ce48a 100644 --- a/riscos/help.c +++ b/riscos/help.c @@ -17,6 +17,7 @@ #include "oslib/taskmanager.h" #include "oslib/wimp.h" #include "netsurf/desktop/tree.h" +#include "netsurf/riscos/cookies.h" #include "netsurf/riscos/global_history.h" #include "netsurf/riscos/gui.h" #include "netsurf/riscos/help.h" @@ -35,15 +36,17 @@ Help keys should be registered using the wimp_event system to be recognised. The only special case help values are: - HelpIconbar Iconbar (no icon suffix is used) - HelpHotlist Hotlist window [*] - HelpGHistory Global history window [*] - HelpBrowser Browser window [*] + HelpIconbar Iconbar (no icon suffix is used) + HelpBrowser Browser window [*] + HelpHotlist Hotlist window [*] + HelpGHistory Global history window [*] + HelpCookies Cookies window [*] - HelpIconMenu Iconbar menu - HelpBrowserMenu Browser window menu - HelpHotlistMenu Hotlist window menu - HelpGHistoryMenu Global history window menu + HelpIconMenu Iconbar menu + HelpBrowserMenu Browser window menu + HelpHotlistMenu Hotlist window menu + HelpGHistoryMenu Global history window menu + HelpCookiesMenu Cookie window menu The prefixes are followed by either the icon number (eg 'HelpToolbar7'), or a series of numbers representing the menu structure (eg @@ -114,6 +117,11 @@ void ro_gui_interactive_help_request(wimp_message *message) { sprintf(message_token, "HelpGHistory%i", ro_gui_global_history_help(message_data->pos.x, message_data->pos.y)); + else if ((cookies_tree) && + (window == (wimp_w)cookies_tree->handle)) + sprintf(message_token, "HelpGHistory%i", + ro_gui_cookies_help(message_data->pos.x, + message_data->pos.y)); else if ((g = ro_gui_window_lookup(window)) != NULL) sprintf(message_token, "HelpBrowser%i", (int)icon); @@ -153,6 +161,8 @@ void ro_gui_interactive_help_request(wimp_message *message) { sprintf(message_token, "HelpHotlistMenu"); else if (current_menu == global_history_menu) sprintf(message_token, "HelpGHistoryMenu"); + else if (current_menu == cookies_menu) + sprintf(message_token, "HelpCookiesMenu"); else return; diff --git a/riscos/history.c b/riscos/history.c index ce8d5a75d..89d7d4bfc 100644 --- a/riscos/history.c +++ b/riscos/history.c @@ -71,6 +71,8 @@ void ro_gui_history_open(struct browser_window *bw, os_box box = {0, 0, 0, 0}; wimp_window_state state; os_error *error; + + assert(history); history_current = history; history_bw = bw; @@ -164,7 +166,7 @@ void ro_gui_history_mouse_at(wimp_pointer *pointer) wimp_icon_state ic; os_box box = {0, 0, 0, 0}; os_error *error; - + /* If the mouse hasn't moved, or if we don't want tooltips, exit */ if ((mouse_x == pointer->pos.x && mouse_y == pointer->pos.y) || !option_history_tooltip) diff --git a/riscos/menus.c b/riscos/menus.c index bef46b201..0d71b6f3b 100644 --- a/riscos/menus.c +++ b/riscos/menus.c @@ -23,10 +23,12 @@ #include "netsurf/content/urldb.h" #include "netsurf/desktop/gui.h" #include "netsurf/desktop/history_core.h" +#include "netsurf/desktop/netsurf.h" #include "netsurf/render/box.h" #include "netsurf/riscos/dialog.h" #include "netsurf/render/form.h" #include "netsurf/riscos/configure.h" +#include "netsurf/riscos/cookies.h" #include "netsurf/riscos/gui.h" #include "netsurf/riscos/global_history.h" #include "netsurf/riscos/help.h" @@ -129,7 +131,7 @@ static wimp_i current_menu_icon; /** The height of the iconbar menu */ int iconbar_menu_height = 5 * 44; /** The available menus */ -wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, *global_history_menu, +wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, *global_history_menu, *cookies_menu, *image_quality_menu, *browser_toolbar_menu, *tree_toolbar_menu, *proxy_type_menu, *languages_menu; /** URL suggestion menu */ @@ -148,7 +150,7 @@ wimp_menu *url_suggest_menu = (wimp_menu *)&url_suggest; void ro_gui_menu_init(void) { /* iconbar menu */ - NS_MENU(9) iconbar_definition = { + NS_MENU(10) iconbar_definition = { "NetSurf", { { "Info", NO_ACTION, dialog_info }, { "AppHelp", HELP_OPEN_CONTENTS, 0 }, @@ -156,6 +158,7 @@ void ro_gui_menu_init(void) { "Open.OpenURL", BROWSER_NAVIGATE_URL, dialog_openurl }, { "Open.HotlistShow", HOTLIST_SHOW, 0 }, { "Open.HistGlobal", HISTORY_SHOW_GLOBAL, 0 }, + { "Open.ShowCookies", COOKIES_SHOW, 0 }, { "Choices", CHOICES_SHOW, 0 }, { "Quit", APPLICATION_QUIT, 0 }, {NULL, 0, 0} @@ -165,7 +168,7 @@ void ro_gui_menu_init(void) (struct ns_menu *)&iconbar_definition); /* browser menu */ - NS_MENU(66) browser_definition = { + NS_MENU(68) browser_definition = { "NetSurf", { { "Page", BROWSER_PAGE, 0 }, { "Page.PageInfo",BROWSER_PAGE_INFO, dialog_pageinfo }, @@ -220,6 +223,8 @@ void ro_gui_menu_init(void) { "Utilities.History", HISTORY_SHOW_GLOBAL, 0 }, { "Utilities.History.HistLocal", HISTORY_SHOW_LOCAL, 0 }, { "Utilities.History.HistGlobal", HISTORY_SHOW_GLOBAL, 0 }, + { "Utilities.Cookies", COOKIES_SHOW, 0 }, + { "Utilities.Cookies.ShowCookies", COOKIES_SHOW, 0 }, { "Utilities.FindText", BROWSER_FIND_TEXT, dialog_search }, { "Utilities.Window", NO_ACTION, 0 }, { "Utilities.Window.WindowSave", BROWSER_WINDOW_DEFAULT, 0 }, @@ -296,6 +301,30 @@ void ro_gui_menu_init(void) global_history_menu = ro_gui_menu_define_menu( (struct ns_menu *)&global_history_definition); + /* history menu */ + NS_MENU(17) cookies_definition = { + "Cookies", { + { "Cookies", NO_ACTION, 0 }, + { "Cookies.Expand", TREE_EXPAND_ALL, 0 }, + { "Cookies.Expand.All", TREE_EXPAND_ALL, 0 }, + { "Cookies.Expand.Folders", TREE_EXPAND_FOLDERS, 0 }, + { "Cookies.Expand.Links", TREE_EXPAND_LINKS, 0 }, + { "Cookies.Collapse", TREE_COLLAPSE_ALL, 0 }, + { "Cookies.Collapse.All", TREE_COLLAPSE_ALL, 0 }, + { "Cookies.Collapse.Folders", TREE_COLLAPSE_FOLDERS, 0 }, + { "Cookies.Collapse.Links", TREE_COLLAPSE_LINKS, 0 }, + { "Cookies.Toolbars", NO_ACTION, 0 }, + { "_Cookies.Toolbars.ToolButtons", TOOLBAR_BUTTONS, 0 }, + { "Cookies.Toolbars.EditToolbar",TOOLBAR_EDIT, 0 }, + { "Selection", TREE_SELECTION, 0 }, + { "Selection.Delete", TREE_SELECTION_DELETE, 0 }, + { "SelectAll", TREE_SELECT_ALL, 0 }, + { "Clear", TREE_CLEAR_SELECTION, 0 }, + {NULL, 0, 0} + } + }; + cookies_menu = ro_gui_menu_define_menu( + (struct ns_menu *)&cookies_definition); /* image quality menu */ NS_MENU(5) images_definition = { "Display", { @@ -1321,14 +1350,20 @@ menu_action ro_gui_menu_find_action(wimp_menu *menu, wimp_menu_entry *menu_entry */ void ro_gui_menu_set_entry_shaded(wimp_menu *menu, menu_action action, bool shaded) { - struct menu_definition_entry *entry = - ro_gui_menu_find_entry(menu, action); - if (entry) { - if (shaded) - entry->menu_entry->icon_flags |= wimp_ICON_SHADED; - else - entry->menu_entry->icon_flags &= ~wimp_ICON_SHADED; - } + struct menu_definition_entry *entry; + struct menu_definition *definition = ro_gui_menu_find_menu(menu); + + if (!definition) + return; + + /* we can't use find_entry as multiple actions may appear in one menu */ + for (entry = definition->entries; entry; entry = entry->next) + if (entry->action == action) { + if (shaded) + entry->menu_entry->icon_flags |= wimp_ICON_SHADED; + else + entry->menu_entry->icon_flags &= ~wimp_ICON_SHADED; + } } @@ -1430,6 +1465,11 @@ bool ro_gui_menu_handle_action(wimp_w owner, menu_action action, ro_gui_tree_show(hotlist_tree); return true; + /* cookies actions */ + case COOKIES_SHOW: + ro_gui_tree_show(cookies_tree); + return true; + /* page actions */ case BROWSER_PAGE_INFO: if (!c) @@ -1787,6 +1827,12 @@ void ro_gui_menu_prepare_action(wimp_w owner, menu_action action, !hotlist_tree); break; + /* cookies actions */ + case COOKIES_SHOW: + ro_gui_menu_set_entry_shaded(current_menu, action, + !cookies_tree); + break; + /* page actions */ case BROWSER_PAGE_INFO: ro_gui_menu_set_entry_shaded(current_menu, @@ -2072,6 +2118,15 @@ void ro_gui_menu_prepare_action(wimp_w owner, menu_action action, if ((tree) && (tree->root)) ro_gui_menu_set_entry_shaded(current_menu, action, !tree->root->child); + if ((t) && (!t->editor) && + (t->type != THEME_BROWSER_TOOLBAR)) { + ro_gui_set_icon_shaded_state( + t->toolbar_handle, + ICON_TOOLBAR_EXPAND, !tree->root->child); + ro_gui_set_icon_shaded_state( + t->toolbar_handle, + ICON_TOOLBAR_OPEN, !tree->root->child); + } break; case TREE_SELECTION: if ((!tree) || (!tree->root)) @@ -2196,6 +2251,8 @@ void ro_gui_menu_get_window_details(wimp_w w, struct gui_window **g, else if ((global_history_tree) && (w == (wimp_w)global_history_tree->handle)) *tree = global_history_tree; + else if ((cookies_tree) && (w == (wimp_w)cookies_tree->handle)) + *tree = cookies_tree; else *tree = NULL; if (*tree) diff --git a/riscos/menus.h b/riscos/menus.h index 9ac7fcaf4..9b68fcf8a 100644 --- a/riscos/menus.h +++ b/riscos/menus.h @@ -12,7 +12,7 @@ #include "oslib/wimp.h" #include "netsurf/riscos/gui.h" -extern wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, +extern wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, *cookies_menu, *global_history_menu, *image_quality_menu, *browser_toolbar_menu, *tree_toolbar_menu, *proxy_type_menu; extern wimp_menu *languages_menu, *url_suggest_menu; @@ -40,6 +40,9 @@ typedef enum { HOTLIST_ADD_URL, HOTLIST_SHOW, + /* cookie actions */ + COOKIES_SHOW, + /* page actions */ BROWSER_PAGE, BROWSER_PAGE_INFO, diff --git a/riscos/options.h b/riscos/options.h index 176924b8f..6f6dec4b5 100644 --- a/riscos/options.h +++ b/riscos/options.h @@ -32,6 +32,7 @@ extern bool option_toolbar_show_throbber; extern char *option_toolbar_browser; extern char *option_toolbar_hotlist; extern char *option_toolbar_history; +extern char *option_toolbar_cookies; extern int option_window_x; extern int option_window_y; extern int option_window_width; @@ -78,6 +79,7 @@ bool option_toolbar_show_throbber = true; \ char *option_toolbar_browser = 0; \ char *option_toolbar_hotlist = 0; \ char *option_toolbar_history = 0; \ +char *option_toolbar_cookies = 0; \ int option_window_x = 0; \ int option_window_y = 0; \ int option_window_width = 0; \ @@ -124,6 +126,7 @@ bool option_thumbnail_iconise = true; { "toolbar_browser", OPTION_STRING, &option_toolbar_browser }, \ { "toolbar_hotlist", OPTION_STRING, &option_toolbar_hotlist }, \ { "toolbar_history", OPTION_STRING, &option_toolbar_history }, \ +{ "toolbar_cookies", OPTION_STRING, &option_toolbar_cookies }, \ { "window_x", OPTION_INTEGER, &option_window_x }, \ { "window_y", OPTION_INTEGER, &option_window_y }, \ { "window_width", OPTION_INTEGER, &option_window_width }, \ diff --git a/riscos/save.c b/riscos/save.c index 1039f0440..3ca898c29 100644 --- a/riscos/save.c +++ b/riscos/save.c @@ -24,6 +24,7 @@ #include "oslib/osspriteop.h" #include "oslib/wimp.h" #include "oslib/wimpspriteop.h" +#include "netsurf/desktop/netsurf.h" #include "netsurf/desktop/save_text.h" #include "netsurf/desktop/selection.h" #include "netsurf/image/bitmap.h" diff --git a/riscos/theme.c b/riscos/theme.c index 5016e7e75..2c7f44f2b 100644 --- a/riscos/theme.c +++ b/riscos/theme.c @@ -25,6 +25,7 @@ #include "oslib/wimp.h" #include "oslib/wimpextend.h" #include "oslib/wimpspriteop.h" +#include "netsurf/desktop/gui.h" #include "netsurf/riscos/dialog.h" #include "netsurf/riscos/gui.h" #include "netsurf/riscos/menus.h" @@ -54,6 +55,8 @@ static const char * theme_hotlist_icons[] = {"delete", "expand", "open", "launch", "create", NULL}; static const char * theme_history_icons[] = {"delete", "expand", "open", "launch", NULL}; +static const char * theme_cookies_icons[] = {"delete", "expand", "open", + NULL}; static bool ro_gui_theme_add_descriptor(const char *folder, const char *leafname); static void ro_gui_theme_redraw(wimp_draw *redraw); @@ -779,6 +782,11 @@ struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor, theme_history_icons, option_toolbar_history); break; + case THEME_COOKIES_TOOLBAR: + ro_gui_theme_add_toolbar_icons(toolbar, + theme_cookies_icons, + option_toolbar_cookies); + break; case THEME_BROWSER_EDIT_TOOLBAR: ro_gui_theme_add_toolbar_icons(toolbar, theme_browser_icons, @@ -794,6 +802,11 @@ struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor, theme_history_icons, "0123|"); break; + case THEME_COOKIES_EDIT_TOOLBAR: + ro_gui_theme_add_toolbar_icons(toolbar, + theme_cookies_icons, + "012|"); + break; } /* Claim the memory for our Wimp indirection @@ -877,7 +890,8 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, if ((toolbar->editor) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) || (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) || - (toolbar->type == THEME_BROWSER_EDIT_TOOLBAR)) + (toolbar->type == THEME_BROWSER_EDIT_TOOLBAR) || + (toolbar->type == THEME_COOKIES_EDIT_TOOLBAR)) theme_toolbar_window.work_flags |= (wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT); theme_toolbar_window.flags &= ~wimp_WINDOW_AUTO_REDRAW; @@ -916,6 +930,8 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, case THEME_HOTLIST_EDIT_TOOLBAR: case THEME_HISTORY_TOOLBAR: case THEME_HISTORY_EDIT_TOOLBAR: + case THEME_COOKIES_TOOLBAR: + case THEME_COOKIES_EDIT_TOOLBAR: ro_gui_wimp_event_register_mouse_click(toolbar->toolbar_handle, ro_gui_tree_toolbar_click); break; @@ -929,6 +945,9 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, else if ((toolbar->type == THEME_HISTORY_TOOLBAR) || (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR)) max_icon = ICON_TOOLBAR_HISTORY_LAST; + else if ((toolbar->type == THEME_COOKIES_TOOLBAR) || + (toolbar->type == THEME_COOKIES_EDIT_TOOLBAR)) + max_icon = ICON_TOOLBAR_COOKIES_LAST; else max_icon = ICON_TOOLBAR_LAST; new_icon.w = toolbar->toolbar_handle; @@ -939,6 +958,7 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, if ((toolbar->editor) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) || (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) || + (toolbar->type == THEME_COOKIES_EDIT_TOOLBAR) || (toolbar->type == THEME_BROWSER_EDIT_TOOLBAR)) new_icon.icon.flags |= (wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT); @@ -1174,8 +1194,11 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, break; case THEME_HOTLIST_TOOLBAR: case THEME_HISTORY_TOOLBAR: + case THEME_COOKIES_TOOLBAR: ro_gui_menu_prepare_action(toolbar->parent_handle, TREE_SELECTION, false); + ro_gui_menu_prepare_action(toolbar->parent_handle, + TREE_EXPAND_ALL, false); break; default: break; @@ -1822,6 +1845,10 @@ void ro_gui_theme_toggle_edit(struct toolbar *toolbar) { free(option_toolbar_history); option_toolbar_history = option; break; + case THEME_COOKIES_TOOLBAR: + free(option_toolbar_cookies); + option_toolbar_cookies = option; + break; default: break; } @@ -1862,6 +1889,11 @@ void ro_gui_theme_toggle_edit(struct toolbar *toolbar) { toolbar->descriptor, THEME_HISTORY_EDIT_TOOLBAR); break; + case THEME_COOKIES_TOOLBAR: + toolbar->editor = ro_gui_theme_create_toolbar( + toolbar->descriptor, + THEME_COOKIES_EDIT_TOOLBAR); + break; default: return; } @@ -2385,9 +2417,14 @@ void ro_gui_theme_set_help_prefix(struct toolbar *toolbar) { ro_gui_wimp_event_set_help_prefix(toolbar->toolbar_handle, "HelpGHistToolbar"); break; + case THEME_COOKIES_TOOLBAR: + ro_gui_wimp_event_set_help_prefix(toolbar->toolbar_handle, + "HelpCookiesToolbar"); + break; case THEME_BROWSER_EDIT_TOOLBAR: case THEME_HOTLIST_EDIT_TOOLBAR: case THEME_HISTORY_EDIT_TOOLBAR: + case THEME_COOKIES_EDIT_TOOLBAR: ro_gui_wimp_event_set_help_prefix(toolbar->toolbar_handle, "HelpEditToolbar"); break; diff --git a/riscos/theme.h b/riscos/theme.h index d5ba81956..7b7d209b7 100644 --- a/riscos/theme.h +++ b/riscos/theme.h @@ -1,7 +1,7 @@ /* * This file is part of NetSurf, http://netsurf.sourceforge.net/ * Licensed under the GNU General Public License, - * http://www.opensource.org/licenses/gpl-license + * http://www.opensource.org/licenses/gpl-license * Copyright 2005 Richard Wilson */ @@ -38,6 +38,7 @@ #define ICON_TOOLBAR_DELETE 0 #define ICON_TOOLBAR_EXPAND 1 #define ICON_TOOLBAR_OPEN 2 +#define ICON_TOOLBAR_COOKIES_LAST 4 #define ICON_TOOLBAR_LAUNCH 3 #define ICON_TOOLBAR_HISTORY_LAST 4 #define ICON_TOOLBAR_CREATE 4 // must be after last history icon @@ -47,14 +48,17 @@ #define ICON_TOOLBAR_SEPARATOR_BROWSER 11 #define ICON_TOOLBAR_SEPARATOR_HOTLIST 5 #define ICON_TOOLBAR_SEPARATOR_HISTORY 4 +#define ICON_TOOLBAR_SEPARATOR_COOKIES 3 typedef enum { - THEME_BROWSER_TOOLBAR, - THEME_HOTLIST_TOOLBAR, - THEME_HISTORY_TOOLBAR, - THEME_BROWSER_EDIT_TOOLBAR, - THEME_HOTLIST_EDIT_TOOLBAR, - THEME_HISTORY_EDIT_TOOLBAR + THEME_BROWSER_TOOLBAR, + THEME_HOTLIST_TOOLBAR, + THEME_HISTORY_TOOLBAR, + THEME_COOKIES_TOOLBAR, + THEME_BROWSER_EDIT_TOOLBAR, + THEME_HOTLIST_EDIT_TOOLBAR, + THEME_HISTORY_EDIT_TOOLBAR, + THEME_COOKIES_EDIT_TOOLBAR } toolbar_type; struct theme_file_header { @@ -113,13 +117,13 @@ struct toolbar { char *status_buffer; /**< buffer for status text (read only) */ struct toolbar_icon *icon; /**< first toolbar icon (read only) */ struct toolbar_icon *suggest; /**< suggestion toolbar icon (read only) */ - struct theme_descriptor *descriptor; /**< theme descriptor (read only) */ + struct theme_descriptor *descriptor; /**< theme descriptor (read only) */ toolbar_type type; /**< toolbar type (read only) */ struct toolbar *editor; /**< toolbar editor */ }; struct theme_descriptor { - char *leafname; /**< theme leafname */ + char *leafname; /**< theme leafname */ char *filename; /**< theme filename */ char name[32]; /**< theme name */ char author[64]; /**< theme author */ diff --git a/riscos/treeview.c b/riscos/treeview.c index 7a8b9788f..f6f7903d3 100644 --- a/riscos/treeview.c +++ b/riscos/treeview.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -31,6 +32,7 @@ #include "netsurf/riscos/menus.h" #include "netsurf/riscos/theme.h" #include "netsurf/riscos/tinct.h" +#include "netsurf/riscos/textarea.h" #include "netsurf/riscos/treeview.h" #include "netsurf/riscos/wimp.h" #include "netsurf/riscos/wimp_event.h" @@ -561,14 +563,12 @@ void tree_update_URL_node(struct node *node, element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT); if (element) { - if (data->last_visit > 0) { - snprintf(buffer, 256, messages_get("TreeLast"), - ctime((time_t *)&data->last_visit)); - buffer[strlen(buffer) - 1] = '\0'; - } else { - snprintf(buffer, 256, messages_get("TreeLast"), + snprintf(buffer, 256, messages_get("TreeLast"), + (data->last_visit > 0) ? + ctime((time_t *)&data->last_visit) : messages_get("TreeUnknown")); - } + if (data->last_visit > 0) + buffer[strlen(buffer) - 1] = '\0'; free(element->text); element->text = strdup(buffer); } @@ -916,6 +916,7 @@ void ro_gui_tree_menu_closed(struct tree *tree) { tree_handle_node_element_changed(tree, &tree->temp_selection->data); tree->temp_selection = NULL; ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_SELECTION, false); + ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_EXPAND_ALL, false); } } @@ -990,10 +991,8 @@ bool ro_gui_tree_toolbar_click(wimp_pointer* pointer) { void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element, wimp_pointer *pointer) { os_error *error; - wimp_window_state state; struct node *parent; int toolbar_height = 0; - int caret_x, caret_height, caret_index; assert(tree); assert(element); @@ -1014,8 +1013,6 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element, } tree->editing = element; - snprintf(tree->edit_buffer, 256, element->text); - tree->edit_buffer[255] = '\0'; ro_gui_tree_edit_icon.w = (wimp_w)tree->handle; ro_gui_tree_edit_icon.icon.extent.x0 = tree->offset_x + element->box.x - 2; ro_gui_tree_edit_icon.icon.extent.x1 = tree->offset_x + @@ -1026,32 +1023,26 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element, element->box.y - element->box.height; if (element->type == NODE_ELEMENT_TEXT_PLUS_SPRITE) ro_gui_tree_edit_icon.icon.extent.x0 += NODE_INSTEP; - ro_gui_tree_edit_icon.icon.data.indirected_text.text = tree->edit_buffer; + ro_gui_tree_edit_icon.icon.data.indirected_text.text = element->text; error = xwimp_create_icon(&ro_gui_tree_edit_icon, (wimp_i *)&tree->edit_handle); if (error) LOG(("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess)); - if (pointer) { - state.w = (wimp_w)tree->handle; - error = xwimp_get_window_state(&state); - if (error) - LOG(("xwimp_get_window_state: 0x%x: %s", - error->errnum, error->errmess)); - caret_x = pointer->pos.x - state.visible.x0; - caret_height = element->box.height; - caret_index = -1; - } else { - caret_x = 0; - caret_height = -1; - caret_index = strlen(tree->edit_buffer); + + tree->textarea_handle = textarea_create((wimp_w)tree->handle, + (wimp_i)tree->edit_handle, 0, "Homerton", 192); + if (!tree->textarea_handle) { + ro_gui_tree_stop_edit(tree); + return; } - error = xwimp_set_caret_position((wimp_w)tree->handle, - (wimp_i)tree->edit_handle, - caret_x, 0, caret_height, caret_index); - if (error) - LOG(("xwimp_set_caret_position: 0x%x: %s", - error->errnum, error->errmess)); + textarea_set_text(tree->textarea_handle, element->text); + if (pointer) + textarea_set_caret_xy(tree->textarea_handle, + pointer->pos.x, pointer->pos.y); + else + textarea_set_caret(tree->textarea_handle, strlen(element->text)); + tree_handle_node_element_changed(tree, element); ro_gui_tree_scroll_visible(tree, element); } @@ -1069,6 +1060,10 @@ void ro_gui_tree_stop_edit(struct tree *tree) { if (!tree->editing) return; + if (tree->textarea_handle) { + textarea_destroy(tree->textarea_handle); + tree->textarea_handle = 0; + } error = xwimp_delete_icon((wimp_w)tree->handle, (wimp_i)tree->edit_handle); if (error) LOG(("xwimp_delete_icon: 0x%x: %s", @@ -1200,6 +1195,7 @@ void ro_gui_tree_open(wimp_open *open) { if (tree->toolbar) ro_gui_theme_process_toolbar(tree->toolbar, -1); ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_SELECTION, false); + ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_EXPAND_ALL, false); } @@ -1213,6 +1209,7 @@ void ro_gui_tree_open(wimp_open *open) { bool ro_gui_tree_keypress(wimp_key *key) { char *new_string; struct tree *tree; + int strlen; tree = (struct tree *)ro_gui_wimp_event_get_user_data(key->w); if (!tree) @@ -1234,15 +1231,24 @@ bool ro_gui_tree_keypress(wimp_key *key) { TREE_CLEAR_SELECTION, false); return true; case wimp_KEY_RETURN: - if (tree->editing) { - new_string = strdup(tree->edit_buffer); - if (new_string) { - if (tree->editing->text) { - free(tree->editing->text); - tree->editing->text = NULL; - } - tree->editing->text = new_string; - } + if ((tree->editing) && (tree->textarea_handle)) { + strlen = textarea_get_text(tree->textarea_handle, + NULL, 0); + if (strlen == -1) { + ro_gui_tree_stop_edit(tree); + return true; + } + new_string = malloc(strlen); + if (!new_string) { + ro_gui_tree_stop_edit(tree); + LOG(("No memory for malloc()")); + warn_user("NoMemory", 0); + return true; + } + textarea_get_text(tree->textarea_handle, + new_string, strlen); + free(tree->editing->text); + tree->editing->text = new_string; ro_gui_tree_stop_edit(tree); tree_recalculate_size(tree); } else { @@ -1304,6 +1310,8 @@ void ro_gui_tree_selection_drag_end(wimp_dragged *drag) { (ro_gui_tree_current_drag_buttons == (wimp_CLICK_ADJUST << 4))); ro_gui_menu_prepare_action((wimp_w)ro_gui_tree_current_drag_tree->handle, TREE_SELECTION, false); + ro_gui_menu_prepare_action((wimp_w)ro_gui_tree_current_drag_tree->handle, + TREE_EXPAND_ALL, false); } diff --git a/riscos/url_complete.h b/riscos/url_complete.h index 8c5233919..03d101bca 100644 --- a/riscos/url_complete.h +++ b/riscos/url_complete.h @@ -13,7 +13,9 @@ #define _NETSURF_RISCOS_URLCOMPLETE_H_ #include -#include "netsurf/riscos/gui.h" +#include "oslib/wimp.h" + +struct gui_window; void ro_gui_url_complete_start(struct gui_window *g); bool ro_gui_url_complete_keypress(struct gui_window *g, int key); diff --git a/riscos/window.c b/riscos/window.c index 121c43766..78532da91 100644 --- a/riscos/window.c +++ b/riscos/window.c @@ -36,6 +36,7 @@ #include "netsurf/desktop/knockout.h" #include "netsurf/desktop/plotters.h" #include "netsurf/desktop/textinput.h" +#include "netsurf/desktop/tree.h" #include "netsurf/desktop/gui.h" #include "netsurf/render/box.h" #include "netsurf/render/form.h" -- cgit v1.2.3