From b112dec78d5e8289ded3f61db96e495690ae96b5 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 14 Feb 2013 18:21:11 +0000 Subject: change browser_window_create and refactor all callsites --- desktop/browser.c | 80 +++++++++++++++++++++++++++++-------------------- desktop/browser.h | 26 ++++++++-------- desktop/history_core.c | 7 ++++- desktop/searchweb.c | 30 +++++++++++++++---- desktop/tree_url_node.c | 54 +++++++++++++++++++++------------ 5 files changed, 126 insertions(+), 71 deletions(-) (limited to 'desktop') diff --git a/desktop/browser.c b/desktop/browser.c index c373e84e3..42b9a1398 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -659,34 +659,29 @@ void browser_window_debug_dump(struct browser_window *bw, FILE *f) } -/** - * Create and open a new root browser window with the given page. - * - * \param url URL to start fetching in the new window - * \param referer The referring uri or NULL if none - * \param clone The browser window to clone - * \param history_add add to history - * \param new_tab create a new tab - * \return new browser window or NULL on error - */ +/* exported interface, documented in desktop/browser.h */ -struct browser_window * -browser_window_create(nsurl *url, - nsurl *referer, +nserror +browser_window_create(enum browser_window_nav_flags flags, + nsurl *url, + nsurl *referrer, struct browser_window *clone, - bool history_add, - bool new_tab) + struct browser_window **ret_bw) { struct browser_window *bw; struct browser_window *top; - assert(clone || history_add); + /* caller must provide window to clone or be adding to history */ + assert(clone || + ((flags & BROWSER_WINDOW_GO_FLAG_HISTORY) != 0)); - if ((bw = calloc(1, sizeof *bw)) == NULL) { + + if ((bw = calloc(1, sizeof(struct browser_window))) == NULL) { warn_user("NoMemory", 0); - return NULL; + return NSERROR_NOMEM; } + /* new javascript context for window */ bw->jsctx = js_newcontext(); /* Initialise common parts */ @@ -705,23 +700,25 @@ browser_window_create(nsurl *url, * so find that. */ top = browser_window_get_root(clone); - bw->window = gui_create_browser_window(bw, top, new_tab); + bw->window = gui_create_browser_window(bw, + top, + ((flags & BROWSER_WINDOW_GO_FLAG_TAB) != 0)); if (bw->window == NULL) { browser_window_destroy(bw); - return NULL; + return NSERROR_BAD_PARAMETER; } if (url != NULL) { - enum browser_window_nav_flags flags; - flags = BROWSER_WINDOW_GO_FLAG_VERIFIABLE; - if (history_add) { - flags |= BROWSER_WINDOW_GO_FLAG_HISTORY; - } - browser_window_navigate(bw, url, referer, flags, NULL, NULL, NULL); + flags |= BROWSER_WINDOW_GO_FLAG_VERIFIABLE; + browser_window_navigate(bw, url, referrer, flags, NULL, NULL, NULL); } - return bw; + if (ret_bw != NULL) { + *ret_bw = bw; + } + + return NSERROR_OK; } @@ -2315,6 +2312,7 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, struct browser_window *top; hlcache_handle *c; int rdepth; + nserror error; /* use the base target if we don't have one */ c = bw->current_content; @@ -2353,9 +2351,15 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, * OR * - button_2 opens in new tab and the link target is "_blank" */ - bw_target = browser_window_create(NULL, NULL, bw, false, true); - if (!bw_target) + error = browser_window_create(BROWSER_WINDOW_GO_FLAG_VERIFIABLE | + BROWSER_WINDOW_GO_FLAG_TAB, + NULL, + NULL, + bw, + &bw_target); + if (error != NSERROR_OK) { return bw; + } return bw_target; } else if (((!nsoption_bool(button_2_tab)) && (mouse & BROWSER_MOUSE_CLICK_2)) || @@ -2374,9 +2378,14 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, * - button_2 doesn't open in new tabs and the link target is * "_blank" */ - bw_target = browser_window_create(NULL, NULL, bw, false, false); - if (!bw_target) + error = browser_window_create(BROWSER_WINDOW_GO_FLAG_VERIFIABLE, + NULL, + NULL, + bw, + &bw_target); + if (error != NSERROR_OK) { return bw; + } return bw_target; } else if ((target == TARGET_SELF) || (!strcasecmp(target, "_self"))) { return bw; @@ -2408,9 +2417,14 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, if (!nsoption_bool(target_blank)) return bw; - bw_target = browser_window_create(NULL, NULL, bw, false, false); - if (!bw_target) + error = browser_window_create(BROWSER_WINDOW_GO_FLAG_VERIFIABLE, + NULL, + NULL, + bw, + &bw_target); + if (error != NSERROR_OK) { return bw; + } /* frame names should begin with an alphabetic character (a-z,A-Z), * however in practice you get things such as '_new' and '2left'. The diff --git a/desktop/browser.h b/desktop/browser.h index 7e62eb613..bcba585e8 100644 --- a/desktop/browser.h +++ b/desktop/browser.h @@ -73,6 +73,8 @@ enum browser_window_nav_flags { BROWSER_WINDOW_GO_FLAG_DOWNLOAD = 2, /** this transaction is verifiable */ BROWSER_WINDOW_GO_FLAG_VERIFIABLE = 4, + /** open a new tab rather than a new window */ + BROWSER_WINDOW_GO_FLAG_TAB = 8, }; void browser_window_initialise_common(struct browser_window *bw, @@ -81,29 +83,29 @@ void browser_window_initialise_common(struct browser_window *bw, /** * Create and open a new root browser window with the given page. * - * \param url URL to start fetching in the new window - * \param referer The referring uri or NULL if none - * \param clone The browser window to clone - * \param history_add add to history - * \param new_tab create a new tab - * \return new browser window or NULL on error + * \param flags Flags to control operation + * \param url URL to start fetching in the new window or NULL for blank + * \param referer The referring uri or NULL if none + * \param clone The browser window to clone + * \param bw pointer to created browser window or untouched on error. + * \return error code */ -struct browser_window *browser_window_create(nsurl *url, - nsurl *referer, - struct browser_window *clone, - bool history_add, - bool new_tab); +nserror browser_window_create(enum browser_window_nav_flags flags, + nsurl *url, + nsurl *referrer, + struct browser_window *clone, + struct browser_window **bw); /** * Start fetching a page in a browser window. * * \param bw browser window * \param url URL to start fetching + * \param flags Flags to control operation * \param referrer The referring uri or NULL if none * \param post_urlenc url encoded post data or NULL if none * \param post_multipart multipart post data or NULL if none * \param parent Parent content or NULL if none - * \param flags Flags to control operation * * Any existing fetches in the window are aborted. * diff --git a/desktop/history_core.c b/desktop/history_core.c index dda4bcaec..48627fa7a 100644 --- a/desktop/history_core.c +++ b/desktop/history_core.c @@ -461,7 +461,12 @@ void history_go(struct browser_window *bw, if (new_window) { current = history->current; history->current = entry; - browser_window_create(url, NULL, bw, false, false); + + browser_window_create(BROWSER_WINDOW_GO_FLAG_VERIFIABLE, + url, + NULL, + bw, + NULL); history->current = current; } else { history->current = entry; diff --git a/desktop/searchweb.c b/desktop/searchweb.c index 93694058a..4b97ca82c 100644 --- a/desktop/searchweb.c +++ b/desktop/searchweb.c @@ -59,14 +59,32 @@ static nserror search_web_ico_callback(hlcache_handle *ico, bool search_web_new_window(struct browser_window *bw, const char *searchterm) { char *encsearchterm; - char *url; - if (url_escape(searchterm,0, true, NULL, &encsearchterm) != - URL_FUNC_OK) + char *urltxt; + nsurl *url; + nserror error; + + if (url_escape(searchterm,0, true, NULL, &encsearchterm) != URL_FUNC_OK) return false; - url = search_web_get_url(encsearchterm); + + urltxt = search_web_get_url(encsearchterm); free(encsearchterm); - browser_window_create(url, bw, NULL, true, true); - free(url); + + error = nsurl_create(urltxt, &url); + if (error == NSERROR_OK) { + error = browser_window_create(BROWSER_WINDOW_GO_FLAG_VERIFIABLE | + BROWSER_WINDOW_GO_FLAG_HISTORY | + BROWSER_WINDOW_GO_FLAG_TAB, + url, + NULL, + bw, + NULL); + nsurl_unref(url); + } + if (error != NSERROR_OK) { + warn_user(messages_get_errorcode(error), 0); + } + + free(urltxt); return true; } diff --git a/desktop/tree_url_node.c b/desktop/tree_url_node.c index 5305fa11d..3b84b4c08 100644 --- a/desktop/tree_url_node.c +++ b/desktop/tree_url_node.c @@ -356,7 +356,7 @@ node_callback_resp tree_url_node_callback(void *user_data, { struct tree *tree; struct node_element *element; - nsurl *nsurl; + nsurl *url; nserror error; const char *text; char *norm_text; @@ -372,13 +372,13 @@ node_callback_resp tree_url_node_callback(void *user_data, */ case TREE_ELEMENT_URL: /* reset URL characteristics */ - error = nsurl_create(msg_data->data.text, &nsurl); + error = nsurl_create(msg_data->data.text, &url); if (error != NSERROR_OK) { warn_user("NoMemory", 0); return NODE_CALLBACK_REJECT; } - urldb_reset_url_visit_data(nsurl); - nsurl_unref(nsurl); + urldb_reset_url_visit_data(url); + nsurl_unref(url); return NODE_CALLBACK_HANDLED; case TREE_ELEMENT_TITLE: return NODE_CALLBACK_HANDLED; @@ -393,29 +393,45 @@ node_callback_resp tree_url_node_callback(void *user_data, element = tree_node_find_element(msg_data->node, TREE_ELEMENT_URL, NULL); if (element != NULL) { + nserror error; + enum browser_window_nav_flags flags; + text = tree_node_element_get_text(element); - if (msg_data->flag == TREE_ELEMENT_LAUNCH_IN_TABS) { - msg_data->data.bw = browser_window_create(text, - msg_data->data.bw, 0, true, true); - } else { - browser_window_create(text, NULL, 0, - true, false); + + error = nsurl_create(text, &url); + if (error == NSERROR_OK) { + flags = BROWSER_WINDOW_GO_FLAG_VERIFIABLE | + BROWSER_WINDOW_GO_FLAG_HISTORY; + if (msg_data->flag == TREE_ELEMENT_LAUNCH_IN_TABS) { + flags |= BROWSER_WINDOW_GO_FLAG_TAB; + } + error = browser_window_create(flags, + url, + NULL, + msg_data->data.bw, + &msg_data->data.bw); + nsurl_unref(url); } + if (error != NSERROR_OK) { + warn_user(messages_get_errorcode(error), 0); + } + return NODE_CALLBACK_HANDLED; } break; + case NODE_ELEMENT_EDIT_FINISHING: text = msg_data->data.text; if (msg_data->flag == TREE_ELEMENT_URL) { size_t len; - error = nsurl_create(text, &nsurl); + error = nsurl_create(text, &url); if (error != NSERROR_OK) { warn_user("NoMemory", 0); return NODE_CALLBACK_REJECT; } - error = nsurl_get(nsurl, NSURL_WITH_FRAGMENT, + error = nsurl_get(url, NSURL_WITH_FRAGMENT, &norm_text, &len); if (error != NSERROR_OK) { warn_user("NoMemory", 0); @@ -424,20 +440,20 @@ node_callback_resp tree_url_node_callback(void *user_data, msg_data->data.text = norm_text; - data = urldb_get_url_data(nsurl); + data = urldb_get_url_data(url); if (data == NULL) { - urldb_add_url(nsurl); - urldb_set_url_persistence(nsurl, true); - data = urldb_get_url_data(nsurl); + urldb_add_url(url); + urldb_set_url_persistence(url, true); + data = urldb_get_url_data(url); if (data == NULL) { - nsurl_unref(nsurl); + nsurl_unref(url); return NODE_CALLBACK_REJECT; } } tree = user_data; tree_update_URL_node(tree, msg_data->node, - nsurl, NULL); - nsurl_unref(nsurl); + url, NULL); + nsurl_unref(url); } else if (msg_data->flag == TREE_ELEMENT_TITLE) { while (isspace(*text)) -- cgit v1.2.3