summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'desktop')
-rw-r--r--desktop/browser.c80
-rw-r--r--desktop/browser.h26
-rw-r--r--desktop/history_core.c7
-rw-r--r--desktop/searchweb.c30
-rw-r--r--desktop/tree_url_node.c54
5 files changed, 126 insertions, 71 deletions
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))