summaryrefslogtreecommitdiffstats
path: root/chrome/browser/external_tab_container_win.h
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-15 20:39:07 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-15 20:39:07 +0000
commit1f71d58803aa64d574369a85d5b16c1cf8e12b1e (patch)
tree3fb4e95cce604633ec319447eda7cf436570cf89 /chrome/browser/external_tab_container_win.h
parent731b4677ab26acf1f6813f5320ef0bec38d325b6 (diff)
downloadchromium_src-1f71d58803aa64d574369a85d5b16c1cf8e12b1e.zip
chromium_src-1f71d58803aa64d574369a85d5b16c1cf8e12b1e.tar.gz
chromium_src-1f71d58803aa64d574369a85d5b16c1cf8e12b1e.tar.bz2
ChromeFrame tabs would hang at times while closing. This would randomly occur if the page had an unload handler.
We execute unload handlers in the WM_DESTROY message in the external tab and spin a nested loop waiting for the unload handlers to finish. This causes a deadlock at times if a windows message is dispatched to IE which is blocked in DestroyWindow. The fix is to remove the nested loop mess from the external tab and instead send over a special automation message to Chrome in which context we execute the unload handlers. The message contains the notification window and the actual window message to be posted back when the unload handlers finish executing. The active document/activex spin a GetMessage loop waiting for this message to arrive. To ensure that we don't wait indefinitely we have a 1 second timer and exit the loop if this timer is received. Fixes bug http://code.google.com/p/chromium/issues/detail?id=49132 Bug=49132 Test=Covered by existing unload event test. Review URL: http://codereview.chromium.org/3014001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52523 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/external_tab_container_win.h')
-rw-r--r--chrome/browser/external_tab_container_win.h11
1 files changed, 6 insertions, 5 deletions
diff --git a/chrome/browser/external_tab_container_win.h b/chrome/browser/external_tab_container_win.h
index f9a51d0..1d92f49 100644
--- a/chrome/browser/external_tab_container_win.h
+++ b/chrome/browser/external_tab_container_win.h
@@ -206,6 +206,9 @@ class ExternalTabContainer : public TabContentsDelegate,
virtual bool infobars_enabled();
+ void RunUnloadHandlers(gfx::NativeWindow notification_window,
+ int notification_message);
+
protected:
// Overridden from views::WidgetWin:
virtual LRESULT OnCreate(LPCREATESTRUCT create_struct);
@@ -313,11 +316,6 @@ class ExternalTabContainer : public TabContentsDelegate,
// Set to true if the tab is waiting for the unload event to complete.
bool waiting_for_unload_event_;
- // Pointer to the innermost ExternalTabContainer instance which is waiting
- // for the unload event listeners to finish.
- // Used to maintain a local global stack of containers.
- static ExternalTabContainer* innermost_tab_for_unload_event_;
-
// Contains the list of URL requests which are pending waiting for an ack
// from the external host.
std::vector<PendingTopLevelNavigation> pending_open_url_requests_;
@@ -333,6 +331,9 @@ class ExternalTabContainer : public TabContentsDelegate,
views::View* external_tab_view_;
+ gfx::NativeWindow notification_window_;
+ int notification_message_;
+
DISALLOW_COPY_AND_ASSIGN(ExternalTabContainer);
};