mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-25 21:46:57 +03:00
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:
parent
9e3c519c2e
commit
00af899230
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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)"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user