Open window targets with a new name in a new window. Fix handling of Adjust-click on a form submit when new window opening is disabled.

svn path=/trunk/netsurf/; revision=3248
This commit is contained in:
Richard Wilson 2007-04-07 23:08:31 +00:00
parent 9e3c519c2e
commit 00af899230
4 changed files with 68 additions and 46 deletions

View File

@ -83,7 +83,7 @@ static void browser_window_destroy_internal(struct browser_window *bw);
static void browser_window_set_scale_internal(struct browser_window *bw, static void browser_window_set_scale_internal(struct browser_window *bw,
float scale); float scale);
static struct browser_window *browser_window_find_target( static struct browser_window *browser_window_find_target(
struct browser_window *bw, const char *target); struct browser_window *bw, const char *target, bool new_window);
static void browser_window_find_target_internal(struct browser_window *bw, static void browser_window_find_target_internal(struct browser_window *bw,
const char *target, int depth, struct browser_window *page, const char *target, int depth, struct browser_window *page,
int *rdepth, struct browser_window **bw_target); int *rdepth, struct browser_window **bw_target);
@ -1001,9 +1001,11 @@ void browser_window_set_scale_internal(struct browser_window *bw, float scale)
* *
* \param bw the browser_window to search all relatives of * \param bw the browser_window to search all relatives of
* \param target the target to locate * \param target the target to locate
* \param new_window always return a new window (ie 'Open Link in New Window')
*/ */
struct browser_window *browser_window_find_target(struct browser_window *bw, const char *target) struct browser_window *browser_window_find_target(struct browser_window *bw, const char *target,
bool new_window)
{ {
struct browser_window *bw_target; struct browser_window *bw_target;
struct browser_window *top; struct browser_window *top;
@ -1014,19 +1016,21 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, con
c = bw->current_content; c = bw->current_content;
if (!target && c && c->data.html.base_target) if (!target && c && c->data.html.base_target)
target = c->data.html.base_target; target = c->data.html.base_target;
if (!target)
target = TARGET_SELF;
/* allow target="_blank" to be ignored so zamez, tlsa and jmb don't lynch me */ /* allow the simple case of target="_blank" to be ignored if requested */
if (!option_target_blank) { if ((!option_target_blank) && ((target == TARGET_BLANK) || (!strcasecmp(target, "_blank")))) return bw;
if ((target == TARGET_BLANK) || (!strcasecmp(target, "_blank")))
target = TARGET_SELF;
}
/* todo: correctly follow B.8 /* handle reserved keywords */
* http://www.w3.org/TR/REC-html40/appendix/notes.html#notes-frames if ((new_window) || ((target == TARGET_BLANK) || (!strcasecmp(target, "_blank")))) {
*/ bw_target = browser_window_create(NULL, bw, NULL, false);
if ((!target) || (target == TARGET_SELF) || (!strcasecmp(target, "_self"))) if (!bw_target)
return bw;
return bw_target;
} else if ((target == TARGET_SELF) || (!strcasecmp(target, "_self"))) {
return bw; return bw;
else if ((target == TARGET_PARENT) || (!strcasecmp(target, "_parent"))) { } else if ((target == TARGET_PARENT) || (!strcasecmp(target, "_parent"))) {
if (bw->parent) if (bw->parent)
return bw->parent; return bw->parent;
return bw; return bw;
@ -1034,11 +1038,6 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, con
while (bw->parent) while (bw->parent)
bw = bw->parent; bw = bw->parent;
return bw; return bw;
} else if ((target == TARGET_BLANK) || (!strcasecmp(target, "_blank"))) {
bw_target = browser_window_create(NULL, bw, NULL, false);
if (!bw_target)
return bw;
return bw_target;
} }
/* find frame according to B.8, ie using the following priorities: /* find frame according to B.8, ie using the following priorities:
@ -1046,11 +1045,31 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, con
* 1) current frame * 1) current frame
* 2) closest to front * 2) closest to front
*/ */
rdepth = -1; rdepth = -1;
bw_target = bw; bw_target = NULL;
for (top = bw; top->parent; top = top->parent); for (top = bw; top->parent; top = top->parent);
browser_window_find_target_internal(top, target, 0, bw, &rdepth, &bw_target); browser_window_find_target_internal(top, target, 0, bw, &rdepth, &bw_target);
if (bw_target)
return bw_target;
/* we require a new window using the target name */
if (!option_target_blank)
return bw;
bw_target = browser_window_create(NULL, bw, NULL, false);
if (!bw_target)
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 only real effect this
* has is when giving out names as it can be assumed that an author intended '_new'
* to create a new nameless window (ie '_blank') whereas in the case of '2left' the
* intention was for a new named window. As such we merely special case windows that
* begin with an underscore. */
if (target[0] != '_') {
bw_target->name = strdup(target);
if (!bw_target->name)
warn_user("NoMemory", 0);
}
return bw_target; return bw_target;
} }
@ -1328,12 +1347,12 @@ void browser_window_mouse_action_html(struct browser_window *bw,
gadget->form->action); gadget->form->action);
status = status_buffer; status = status_buffer;
pointer = GUI_POINTER_POINT; pointer = GUI_POINTER_POINT;
if (mouse & BROWSER_MOUSE_CLICK_1) if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) {
browser_form_submit(bw, target, gadget->form, browser_form_submit(bw,
gadget); browser_window_find_target(bw, target,
else if (mouse & BROWSER_MOUSE_CLICK_2) (mouse & BROWSER_MOUSE_CLICK_2)),
browser_form_submit(bw, "_blank", gadget->form, gadget->form, gadget);
gadget); }
} else { } else {
status = messages_get("FormBadSubmit"); status = messages_get("FormBadSubmit");
} }
@ -1343,7 +1362,6 @@ void browser_window_mouse_action_html(struct browser_window *bw,
pointer = GUI_POINTER_CARET; pointer = GUI_POINTER_CARET;
if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) { if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) {
if (text_box && selection_root(bw->sel) != gadget_box) if (text_box && selection_root(bw->sel) != gadget_box)
selection_init(bw->sel, gadget_box); selection_init(bw->sel, gadget_box);
@ -1449,10 +1467,10 @@ void browser_window_mouse_action_html(struct browser_window *bw,
browser_window_go_post(bw, url, 0, 0, false, browser_window_go_post(bw, url, 0, 0, false,
c->url, true, true, 0); c->url, true, true, 0);
} else if (mouse & BROWSER_MOUSE_CLICK_1) { } else if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) {
bw = browser_window_find_target(bw, target); browser_window_go(browser_window_find_target(bw, target,
assert(bw); (mouse & BROWSER_MOUSE_CLICK_2)),
browser_window_go(bw, url, c->url, true); url, c->url, true);
} else if (mouse & BROWSER_MOUSE_CLICK_2 && } else if (mouse & BROWSER_MOUSE_CLICK_2 &&
mouse & BROWSER_MOUSE_MOD_1) { mouse & BROWSER_MOUSE_MOD_1) {
free(browser_window_href_content.url); free(browser_window_href_content.url);
@ -1462,9 +1480,6 @@ void browser_window_mouse_action_html(struct browser_window *bw,
else else
gui_window_save_as_link(bw->window, gui_window_save_as_link(bw->window,
&browser_window_href_content); &browser_window_href_content);
} else if (mouse & BROWSER_MOUSE_CLICK_2) {
/* open link in new window */
browser_window_create(url, bw, c->url, true);
} }
} else { } else {
@ -2255,12 +2270,11 @@ gui_pointer_shape get_pointer_shape(css_cursor cursor)
* Collect controls and submit a form. * Collect controls and submit a form.
*/ */
void browser_form_submit(struct browser_window *bw, const char *target, void browser_form_submit(struct browser_window *bw, struct browser_window *target,
struct form *form, struct form_control *submit_button) struct form *form, struct form_control *submit_button)
{ {
char *data = 0, *url = 0; char *data = 0, *url = 0;
struct form_successful_control *success; struct form_successful_control *success;
struct browser_window *bw_form;
assert(form); assert(form);
assert(bw->current_content->type == CONTENT_HTML); assert(bw->current_content->type == CONTENT_HTML);
@ -2270,9 +2284,6 @@ void browser_form_submit(struct browser_window *bw, const char *target,
return; return;
} }
bw_form = browser_window_find_target(bw, target);
assert(bw);
switch (form->method) { switch (form->method) {
case method_GET: case method_GET:
data = form_url_encode(form, success); data = form_url_encode(form, success);
@ -2295,7 +2306,7 @@ void browser_form_submit(struct browser_window *bw, const char *target,
else { else {
sprintf(url, "%s?%s", form->action, data); sprintf(url, "%s?%s", form->action, data);
} }
browser_window_go(bw_form, url, browser_window_go(target, url,
bw->current_content->url, true); bw->current_content->url, true);
break; break;
@ -2306,13 +2317,13 @@ void browser_form_submit(struct browser_window *bw, const char *target,
warn_user("NoMemory", 0); warn_user("NoMemory", 0);
return; return;
} }
browser_window_go_post(bw_form, form->action, data, 0, browser_window_go_post(target, form->action, data, 0,
true, bw->current_content->url, true, bw->current_content->url,
false, true, 0); false, true, 0);
break; break;
case method_POST_MULTIPART: case method_POST_MULTIPART:
browser_window_go_post(bw_form, form->action, 0, browser_window_go_post(target, form->action, 0,
success, true, success, true,
bw->current_content->url, bw->current_content->url,
false, true, 0); false, true, 0);

View File

@ -206,7 +206,7 @@ bool browser_window_paste_text(struct browser_window *bw, const char *utf8,
void browser_window_form_select(struct browser_window *bw, void browser_window_form_select(struct browser_window *bw,
struct form_control *control, int item); struct form_control *control, int item);
void browser_redraw_box(struct content *c, struct box *box); void browser_redraw_box(struct content *c, struct box *box);
void browser_form_submit(struct browser_window *bw, const char *target, void browser_form_submit(struct browser_window *bw, struct browser_window *target,
struct form *form, struct form_control *submit_button); struct form *form, struct form_control *submit_button);
void browser_window_redraw_rect(struct browser_window *bw, int x, int y, void browser_window_redraw_rect(struct browser_window *bw, int x, int y,

View File

@ -80,9 +80,12 @@ void browser_window_create_iframes(struct browser_window *bw,
window->no_resize = true; window->no_resize = true;
window->margin_width = cur->margin_width; window->margin_width = cur->margin_width;
window->margin_height = cur->margin_height; window->margin_height = cur->margin_height;
if (cur->name) if (cur->name) {
window->name = strdup(cur->name); window->name = strdup(cur->name);
if (!cur->name)
warn_user("NoMemory", 0);
}
/* linking */ /* linking */
window->box = cur->box; window->box = cur->box;
window->parent = bw; window->parent = bw;
@ -189,14 +192,22 @@ void browser_window_create_frameset(struct browser_window *bw,
window->frame_height = frame->height; window->frame_height = frame->height;
window->margin_width = frame->margin_width; window->margin_width = frame->margin_width;
window->margin_height = frame->margin_height; window->margin_height = frame->margin_height;
if (frame->name) if (frame->name) {
window->name = strdup(frame->name); window->name = strdup(frame->name);
if (!window->name)
warn_user("NoMemory", 0);
}
/* linking */ /* linking */
window->parent = bw; window->parent = bw;
/* gui window */ /* gui window */
window->window = gui_create_browser_window(window, bw); window->window = gui_create_browser_window(window, bw);
if (window->name)
LOG(("Created frame '%s'", window->name));
else
LOG(("Created frame (unnamed)"));
} }
} }

View File

@ -934,7 +934,7 @@ bool browser_window_input_callback(struct browser_window *bw,
case 10: case 10:
case 13: /* Return/Enter hit */ case 13: /* Return/Enter hit */
if (form) if (form)
browser_form_submit(bw, 0, form, 0); browser_form_submit(bw, bw, form, 0);
return true; return true;
case 11: { /* Shift + Tab */ case 11: { /* Shift + Tab */