summaryrefslogtreecommitdiffstats
path: root/chrome/browser/external_tab_container.h
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-03 21:38:08 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-03 21:38:08 +0000
commite56e96f80ce491b23454a039ae5eba1a1c6ee3f9 (patch)
tree0cd3a2bb9352b35a7caff1287b310686776e2751 /chrome/browser/external_tab_container.h
parent8c07fdb39d54c0bddcadc563a1d380ce56b3c9a5 (diff)
downloadchromium_src-e56e96f80ce491b23454a039ae5eba1a1c6ee3f9.zip
chromium_src-e56e96f80ce491b23454a039ae5eba1a1c6ee3f9.tar.gz
chromium_src-e56e96f80ce491b23454a039ae5eba1a1c6ee3f9.tar.bz2
The ExternalTabContainer enters a modal loop while waiting for the unload events on the tab to complete.
If multiple ChromeFrame tabs were closed together then we end up in a nested loop hierarchy. In this case the innermost message loop ends up dispatching the TabContents::Close method which then calls its delegate which is the ExternalTabContainer for the other ExternalTabs as well. As a result the outer loops never exit, which causes IE tabs to hang. Fix is to use a local global stack of ExternalTabContainers. If we receive a CloseContents call for any other container but the innermost one, we post it back to the loop. Bug=31853 Review URL: http://codereview.chromium.org/560034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38022 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/external_tab_container.h')
-rw-r--r--chrome/browser/external_tab_container.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/chrome/browser/external_tab_container.h b/chrome/browser/external_tab_container.h
index 36bbeda..f875e66 100644
--- a/chrome/browser/external_tab_container.h
+++ b/chrome/browser/external_tab_container.h
@@ -285,6 +285,11 @@ 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_;