summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'desktop')
-rw-r--r--desktop/browser.c142
-rw-r--r--desktop/browser.h55
-rw-r--r--desktop/browser_private.h4
-rw-r--r--desktop/frames.c10
-rw-r--r--desktop/global_history.c17
-rw-r--r--desktop/hotlist.c17
-rw-r--r--desktop/local_history.c6
-rw-r--r--desktop/searchweb.c5
8 files changed, 144 insertions, 112 deletions
diff --git a/desktop/browser.c b/desktop/browser.c
index 5a6cfc727..9bff58b5a 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -690,66 +690,81 @@ static bool slow_script(void *ctx)
}
/* exported interface, documented in desktop/browser.h */
-
-nserror
-browser_window_create(enum browser_window_nav_flags flags,
- nsurl *url,
- nsurl *referrer,
- struct browser_window *clone,
- struct browser_window **ret_bw)
-{
- struct browser_window *bw;
-
- /* caller must provide window to clone or be adding to history */
- assert(clone ||
- ((flags & BROWSER_WINDOW_HISTORY) != 0));
+nserror browser_window_create(enum browser_window_create_flags flags,
+ nsurl *url, nsurl *referrer,
+ struct browser_window *existing,
+ struct browser_window **bw)
+{
+ gui_window_create_flags gw_flags = GW_CREATE_NONE;
+ struct browser_window *ret;
+
+ /* Check parameters */
+ if (flags & (BW_CREATE_TAB | BW_CREATE_CLONE)) {
+ if (existing == NULL) {
+ assert(0 && "Failed: No existing window provided.");
+ return NSERROR_BAD_PARAMETER;
+ }
+ }
+ if (!(flags & BW_CREATE_HISTORY)) {
+ if (!(flags & BW_CREATE_CLONE) || existing == NULL) {
+ assert(0 && "Failed: Must have existing for history.");
+ return NSERROR_BAD_PARAMETER;
+ }
+ }
- if ((bw = calloc(1, sizeof(struct browser_window))) == NULL) {
+ if ((ret = calloc(1, sizeof(struct browser_window))) == NULL) {
warn_user("NoMemory", 0);
return NSERROR_NOMEM;
}
/* new javascript context for window */
- bw->jsctx = js_newcontext(nsoption_int(script_timeout),
+ ret->jsctx = js_newcontext(nsoption_int(script_timeout),
slow_script,
NULL);
/* Initialise common parts */
- browser_window_initialise_common(bw, clone);
+ browser_window_initialise_common(flags, ret, existing);
/* window characteristics */
- bw->browser_window_type = BROWSER_WINDOW_NORMAL;
- bw->scrolling = SCROLLING_YES;
- bw->border = true;
- bw->no_resize = true;
- bw->last_action = wallclock();
- bw->focus = bw;
-
- /* gui window */
- /* from the front end's pov, it clones the top level browser window,
- * so find that. */
- clone = browser_window_get_root(clone);
-
- bw->window = guit->window->create(bw,
- (clone != NULL) ? clone->window : NULL,
- ((flags & BROWSER_WINDOW_TAB) ?
- GW_CREATE_TAB : GW_CREATE_NONE) |
- ((clone != NULL) ?
- GW_CREATE_CLONE : GW_CREATE_NONE));
-
- if (bw->window == NULL) {
- browser_window_destroy(bw);
+ ret->browser_window_type = BROWSER_WINDOW_NORMAL;
+ ret->scrolling = SCROLLING_YES;
+ ret->border = true;
+ ret->no_resize = true;
+ ret->last_action = wallclock();
+ ret->focus = ret;
+
+ /* The existing gui_window is on the top-level existing
+ * browser_window. */
+ existing = browser_window_get_root(existing);
+
+ /* Set up gui_window creation flags */
+ if (flags & BW_CREATE_TAB)
+ gw_flags |= GW_CREATE_TAB;
+ if (flags & BW_CREATE_CLONE)
+ gw_flags |= GW_CREATE_CLONE;
+
+ ret->window = guit->window->create(ret,
+ (existing != NULL) ? existing->window : NULL,
+ gw_flags);
+
+ if (ret->window == NULL) {
+ browser_window_destroy(ret);
return NSERROR_BAD_PARAMETER;
}
if (url != NULL) {
- flags |= BROWSER_WINDOW_VERIFIABLE;
- browser_window_navigate(bw, url, referrer, flags, NULL, NULL, NULL);
+ enum browser_window_nav_flags nav_flags = BW_NAVIGATE_NONE;
+ if (!(flags & BW_CREATE_UNVERIFIABLE))
+ nav_flags |= BW_NAVIGATE_VERIFIABLE;
+ if (flags & BW_CREATE_HISTORY)
+ nav_flags |= BW_NAVIGATE_HISTORY;
+ browser_window_navigate(ret, url, referrer, nav_flags, NULL,
+ NULL, NULL);
}
- if (ret_bw != NULL) {
- *ret_bw = bw;
+ if (bw != NULL) {
+ *bw = ret;
}
return NSERROR_OK;
@@ -759,18 +774,21 @@ browser_window_create(enum browser_window_nav_flags flags,
/**
* Initialise common parts of a browser window
*
- * \param bw The window to initialise
- * \param clone The window to clone, or NULL if none
+ * \param flags Flags to control operation
+ * \param bw The window to initialise
+ * \param existing The existing window if cloning, else NULL
*/
-void browser_window_initialise_common(struct browser_window *bw,
- struct browser_window *clone)
+void browser_window_initialise_common(enum browser_window_create_flags flags,
+ struct browser_window *bw, struct browser_window *existing)
{
assert(bw);
- if (!clone)
+ if (flags & BW_CREATE_CLONE) {
+ assert(existing != NULL);
+ bw->history = history_clone(existing->history, bw);
+ } else {
bw->history = history_create(bw);
- else
- bw->history = history_clone(clone->history, bw);
+ }
/* window characteristics */
bw->refresh_interval = -1;
@@ -1091,7 +1109,7 @@ static void browser_window_refresh(void *p)
nsurl *url;
nsurl *refresh;
hlcache_handle *parent = NULL;
- enum browser_window_nav_flags flags = BROWSER_WINDOW_NONE;
+ enum browser_window_nav_flags flags = BW_NAVIGATE_NONE;
assert(bw->current_content != NULL &&
(content_get_status(bw->current_content) ==
@@ -1110,7 +1128,7 @@ static void browser_window_refresh(void *p)
url = hlcache_handle_get_url(bw->current_content);
if ((url == NULL) || (nsurl_compare(url, refresh, NSURL_COMPLETE))) {
- flags |= BROWSER_WINDOW_HISTORY;
+ flags |= BW_NAVIGATE_HISTORY;
}
/* Treat an (almost) immediate refresh in a top-level browser window as
@@ -1121,7 +1139,7 @@ static void browser_window_refresh(void *p)
* all.
*/
if (bw->refresh_interval <= 100 && bw->parent == NULL) {
- flags |= BROWSER_WINDOW_VERIFIABLE;
+ flags |= BW_NAVIGATE_VERIFIABLE;
} else {
parent = bw->current_content;
}
@@ -1794,7 +1812,7 @@ nserror browser_window_navigate(struct browser_window *bw,
}
/* Set up retrieval parameters */
- if ((flags & BROWSER_WINDOW_VERIFIABLE) != 0) {
+ if ((flags & BW_NAVIGATE_VERIFIABLE) != 0) {
fetch_flags |= LLCACHE_RETRIEVE_VERIFIABLE;
}
@@ -1818,7 +1836,7 @@ nserror browser_window_navigate(struct browser_window *bw,
}
/* Get download out of the way */
- if ((flags & BROWSER_WINDOW_DOWNLOAD) != 0) {
+ if ((flags & BW_NAVIGATE_DOWNLOAD) != 0) {
error = browser_window_download(bw,
url,
referrer,
@@ -1863,7 +1881,7 @@ nserror browser_window_navigate(struct browser_window *bw,
nsurl_unref(referrer);
}
- if ((flags & BROWSER_WINDOW_HISTORY) != 0) {
+ if ((flags & BW_NAVIGATE_HISTORY) != 0) {
history_add(bw->history,
bw->current_content, bw->frag_id);
}
@@ -1884,10 +1902,10 @@ nserror browser_window_navigate(struct browser_window *bw,
LOG(("Loading '%s'", nsurl_access(url)));
browser_window_set_status(bw, messages_get("Loading"));
- bw->history_add = (flags & BROWSER_WINDOW_HISTORY);
+ bw->history_add = (flags & BW_NAVIGATE_HISTORY);
/* Verifiable fetches may trigger a download */
- if ((flags & BROWSER_WINDOW_VERIFIABLE) != 0) {
+ if ((flags & BW_NAVIGATE_VERIFIABLE) != 0) {
fetch_flags |= HLCACHE_RETRIEVE_MAY_DOWNLOAD;
}
@@ -2250,7 +2268,7 @@ void browser_window_reload(struct browser_window *bw, bool all)
browser_window_navigate(bw,
hlcache_handle_get_url(bw->current_content),
NULL,
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_VERIFIABLE,
NULL,
NULL,
NULL);
@@ -2536,8 +2554,9 @@ struct browser_window *browser_window_find_target(struct browser_window *bw,
* OR
* - button_2 opens in new tab and the link target is "_blank"
*/
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_TAB |
+ BW_CREATE_HISTORY |
+ BW_CREATE_CLONE,
NULL,
NULL,
bw,
@@ -2563,7 +2582,8 @@ 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"
*/
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_CLONE,
NULL,
NULL,
bw,
@@ -2602,7 +2622,7 @@ struct browser_window *browser_window_find_target(struct browser_window *bw,
if (!nsoption_bool(target_blank))
return bw;
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
NULL,
NULL,
bw,
diff --git a/desktop/browser.h b/desktop/browser.h
index 39f8b8901..4cb8e012a 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -62,42 +62,53 @@ typedef enum {
extern bool browser_reformat_pending;
-/** flags to browser window go */
+/** flags to browser_window_create */
+enum browser_window_create_flags {
+ /** No flags set */
+ BW_CREATE_NONE = 0,
+
+ /** this will form a new history node (don't set for back/reload/etc) */
+ BW_CREATE_HISTORY = (1 << 0),
+
+ /** New gui_window to be tab in same window as "existing" gui_window */
+ BW_CREATE_TAB = (1 << 1),
+
+ /** New gui_window to be clone of "existing" gui_window */
+ BW_CREATE_CLONE = (1 << 2),
+
+ /** Window not opened by user interaction (e.g. JS popup) */
+ BW_CREATE_UNVERIFIABLE = (1 << 3),
+};
+
+/** flags to browser_window_navigate */
enum browser_window_nav_flags {
/** No flags set */
- BROWSER_WINDOW_NONE = 0,
+ BW_NAVIGATE_NONE = 0,
/** this will form a new history node (don't set for back/reload/etc) */
- BROWSER_WINDOW_HISTORY = (1 << 0),
+ BW_NAVIGATE_HISTORY = (1 << 0),
/** download rather than render the uri */
- BROWSER_WINDOW_DOWNLOAD = (1 << 1),
+ BW_NAVIGATE_DOWNLOAD = (1 << 1),
/** this transaction is verifiable */
- BROWSER_WINDOW_VERIFIABLE = (1 << 2),
-
- /** New gui_window to be tab in same window as "existing" gui_window */
- BROWSER_WINDOW_TAB = (1 << 3),
-
- /** New gui_window to be clone of "existing" gui_window */
- BROWSER_WINDOW_CLONE = (1 << 4)
+ BW_NAVIGATE_VERIFIABLE = (1 << 2)
};
/**
* Create and open a new root browser window with the given page.
*
- * \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
+ * \param flags Flags to control operation
+ * \param url URL to fetch in the new window or NULL for blank
+ * \param referer The referring uri or NULL if none
+ * \param existing The an existing bw or NULL, required for some flags.
+ * \param bw Updated to created browser window or untouched on error.
+ * \return NSERROR_OK, or appropriate error otherwise.
*/
-nserror browser_window_create(enum browser_window_nav_flags flags,
- nsurl *url,
- nsurl *referrer,
- struct browser_window *clone,
- struct browser_window **bw);
+nserror browser_window_create(enum browser_window_create_flags flags,
+ nsurl *url, nsurl *referrer,
+ struct browser_window *existing,
+ struct browser_window **bw);
/**
* Start fetching a page in a browser window.
diff --git a/desktop/browser_private.h b/desktop/browser_private.h
index 34891f3bd..9007007a8 100644
--- a/desktop/browser_private.h
+++ b/desktop/browser_private.h
@@ -165,8 +165,8 @@ struct browser_window {
-void browser_window_initialise_common(struct browser_window *bw,
- struct browser_window *clone);
+void browser_window_initialise_common(enum browser_window_create_flags flags,
+ struct browser_window *bw, struct browser_window *existing);
/**
* Update the extent of the inside of a browser window to that of the current
diff --git a/desktop/frames.c b/desktop/frames.c
index 354c70da4..153c78e34 100644
--- a/desktop/frames.c
+++ b/desktop/frames.c
@@ -209,7 +209,8 @@ void browser_window_create_iframes(struct browser_window *bw,
window = &(bw->iframes[index++]);
/* Initialise common parts */
- browser_window_initialise_common(window, NULL);
+ browser_window_initialise_common(BW_CREATE_NONE,
+ window, NULL);
/* window characteristics */
window->browser_window_type = BROWSER_WINDOW_IFRAME;
@@ -251,7 +252,7 @@ void browser_window_create_iframes(struct browser_window *bw,
browser_window_navigate(window,
cur->url,
hlcache_handle_get_url(bw->current_content),
- BROWSER_WINDOW_NONE,
+ BW_NAVIGATE_NONE,
NULL,
NULL,
bw->current_content);
@@ -314,7 +315,8 @@ void browser_window_create_frameset(struct browser_window *bw,
window = &bw->children[index];
/* Initialise common parts */
- browser_window_initialise_common(window, NULL);
+ browser_window_initialise_common(BW_CREATE_NONE,
+ window, NULL);
/* window characteristics */
if (frame->children)
@@ -387,7 +389,7 @@ void browser_window_create_frameset(struct browser_window *bw,
browser_window_navigate(window,
frame->url,
hlcache_handle_get_url(parent),
- BROWSER_WINDOW_HISTORY,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
parent);
diff --git a/desktop/global_history.c b/desktop/global_history.c
index 9d0e47e34..c29b05145 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -676,23 +676,22 @@ static nserror global_history_tree_node_entry_cb(
case TREE_MSG_NODE_LAUNCH:
{
nserror error;
- struct browser_window *clone = NULL;
- enum browser_window_nav_flags flags =
- BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB;
+ struct browser_window *existing = NULL;
+ enum browser_window_create_flags flags =
+ BW_CREATE_HISTORY;
- /* TODO: Set clone window, to window that new tab appears in */
+ /* TODO: Set existing to window that new tab appears in */
if (msg.data.node_launch.mouse &
(BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2) ||
- clone == NULL) {
+ existing == NULL) {
/* Shift or Ctrl launch, open in new window rather
* than tab. */
- flags ^= BROWSER_WINDOW_TAB;
+ /* TODO: flags ^= BW_CREATE_TAB; */
}
- error = browser_window_create(flags, e->url, NULL, clone, NULL);
+ error = browser_window_create(flags, e->url, NULL,
+ existing, NULL);
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
diff --git a/desktop/hotlist.c b/desktop/hotlist.c
index 219a348ef..6814f8d2e 100644
--- a/desktop/hotlist.c
+++ b/desktop/hotlist.c
@@ -472,23 +472,22 @@ static nserror hotlist_tree_node_entry_cb(
case TREE_MSG_NODE_LAUNCH:
{
nserror error;
- struct browser_window *clone = NULL;
- enum browser_window_nav_flags flags =
- BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB;
+ struct browser_window *existing = NULL;
+ enum browser_window_create_flags flags =
+ BW_CREATE_HISTORY;
- /* TODO: Set clone window, to window that new tab appears in */
+ /* TODO: Set existing to window that new tab appears in */
if (msg.data.node_launch.mouse &
(BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2) ||
- clone == NULL) {
+ existing == NULL) {
/* Shift or Ctrl launch, open in new window rather
* than tab. */
- flags ^= BROWSER_WINDOW_TAB;
+ /* TODO: flags ^= BW_CREATE_TAB; */
}
- error = browser_window_create(flags, e->url, NULL, clone, NULL);
+ error = browser_window_create(flags, e->url, NULL,
+ existing, NULL);
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
diff --git a/desktop/local_history.c b/desktop/local_history.c
index b26f266d6..569fa44e4 100644
--- a/desktop/local_history.c
+++ b/desktop/local_history.c
@@ -150,6 +150,8 @@ struct history *history_clone(struct history *history,
return 0;
}
+ new_history->bw = bw;
+
return new_history;
}
@@ -455,13 +457,13 @@ void history_go(struct history *history, struct history_entry *entry,
current = history->current;
history->current = entry;
- browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ browser_window_create(BW_CREATE_CLONE,
url, NULL, history->bw, NULL);
history->current = current;
} else {
history->current = entry;
browser_window_navigate(history->bw, url, NULL,
- BROWSER_WINDOW_VERIFIABLE, NULL, NULL, NULL);
+ BW_NAVIGATE_VERIFIABLE, NULL, NULL, NULL);
}
nsurl_unref(url);
diff --git a/desktop/searchweb.c b/desktop/searchweb.c
index bdcb2ba8a..368ad051a 100644
--- a/desktop/searchweb.c
+++ b/desktop/searchweb.c
@@ -71,9 +71,8 @@ bool search_web_new_window(struct browser_window *bw, const char *searchterm)
error = nsurl_create(urltxt, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
url,
NULL,
bw,