From ac6946ef83f7fc58e85b976d4e07a721e8d1f72b Mon Sep 17 00:00:00 2001 From: Adrian Lees Date: Sun, 4 Nov 2007 01:16:50 +0000 Subject: Fix frame-related crash (images.google) caused by destruction of current window when clicking URL/submitting form svn path=/trunk/netsurf/; revision=3644 --- desktop/browser.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/desktop/browser.c b/desktop/browser.c index f6ca1aa75..d30c8aaf8 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -1256,6 +1256,7 @@ void browser_window_mouse_click(struct browser_window *bw, void browser_window_mouse_action_html(struct browser_window *bw, browser_mouse_state mouse, int x, int y) { + enum { ACTION_NONE, ACTION_SUBMIT, ACTION_GO } action = ACTION_NONE; char *base_url = 0; char *title = 0; const char *url = 0; @@ -1393,12 +1394,8 @@ void browser_window_mouse_action_html(struct browser_window *bw, gadget->form->action); status = status_buffer; pointer = GUI_POINTER_POINT; - if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) { - browser_form_submit(bw, - browser_window_find_target(bw, target, - (mouse & BROWSER_MOUSE_CLICK_2)), - gadget->form, gadget); - } + if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) + action = ACTION_SUBMIT; } else { status = messages_get("FormBadSubmit"); } @@ -1523,11 +1520,8 @@ void browser_window_mouse_action_html(struct browser_window *bw, gui_window_save_as_link(bw->window, &browser_window_href_content); - } else if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) { - browser_window_go(browser_window_find_target(bw, target, - (mouse & BROWSER_MOUSE_CLICK_2)), - url, c->url, true); - } + } else if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) + action = ACTION_GO; } else { bool done = false; @@ -1609,6 +1603,23 @@ void browser_window_mouse_action_html(struct browser_window *bw, browser_window_set_status(bw, status); browser_window_set_pointer(bw->window, pointer); + + /* deferred actions that can cause this browser_window to be destroyed + and must therefore be done after set_status/pointer + */ + switch (action) { + case ACTION_SUBMIT: + browser_form_submit(bw, + browser_window_find_target(bw, target, + (mouse & BROWSER_MOUSE_CLICK_2)), + gadget->form, gadget); + + case ACTION_GO: + browser_window_go(browser_window_find_target(bw, target, + (mouse & BROWSER_MOUSE_CLICK_2)), + url, c->url, true); + break; + } } -- cgit v1.2.3