summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-26 21:16:35 +0000
committerjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-26 21:16:35 +0000
commit2d843e6d7063bb3cd743b0924a95ddf429bff19f (patch)
tree7ea9bfe853b4970923f7d508cd78b66292d061c4 /chrome
parent649ef5b3ccbdfc08cb2386f3bdb313e81e6f9d84 (diff)
downloadchromium_src-2d843e6d7063bb3cd743b0924a95ddf429bff19f.zip
chromium_src-2d843e6d7063bb3cd743b0924a95ddf429bff19f.tar.gz
chromium_src-2d843e6d7063bb3cd743b0924a95ddf429bff19f.tar.bz2
Relanding docus manager crasher work-around.
TBR=ben Review URL: http://codereview.chromium.org/12685 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6050 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/tab_contents.cc8
-rw-r--r--chrome/browser/tab_contents.h8
-rw-r--r--chrome/browser/views/frame/browser_view.cc9
3 files changed, 22 insertions, 3 deletions
diff --git a/chrome/browser/tab_contents.cc b/chrome/browser/tab_contents.cc
index 9bdca3c..faabb54 100644
--- a/chrome/browser/tab_contents.cc
+++ b/chrome/browser/tab_contents.cc
@@ -46,7 +46,8 @@ TabContents::TabContents(TabContentsType type)
shelf_visible_(false),
max_page_id_(-1),
blocked_popups_(NULL),
- capturing_contents_(false) {
+ capturing_contents_(false),
+ is_being_destroyed_(false) {
last_focused_view_storage_id_ =
views::ViewStorage::GetSharedInstance()->CreateStorageID();
}
@@ -75,6 +76,11 @@ void TabContents::CloseContents() {
}
void TabContents::Destroy() {
+ // TODO(jcampan): reenable that DCHECK. It seems to cause the RendererCrash
+ // ui tests to hang for some unclear reason.
+ // DCHECK(!is_being_destroyed_);
+ is_being_destroyed_ = true;
+
// First cleanly close all child windows.
// TODO(mpcomplete): handle case if MaybeCloseChildWindows() already asked
// some of these to close. CloseWindows is async, so it might get called
diff --git a/chrome/browser/tab_contents.h b/chrome/browser/tab_contents.h
index 2f78a79..dad5f63 100644
--- a/chrome/browser/tab_contents.h
+++ b/chrome/browser/tab_contents.h
@@ -246,6 +246,11 @@ class TabContents : public PageNavigator,
bool is_active() const { return is_active_; }
void set_is_active(bool active) { is_active_ = active; }
+ // Whether the tab is in the process of being destroyed.
+ // Added as a tentative work-around for focus related bug #4633. This allows
+ // us not to store focus when a tab is being closed.
+ bool is_being_destroyed() const { return is_being_destroyed_; }
+
// Convenience method for notifying the delegate of a navigation state
// change. See TabContentsDelegate.
void NotifyNavigationStateChanged(unsigned changed_flags);
@@ -542,6 +547,9 @@ class TabContents : public PageNavigator,
// Delegates for InfoBars associated with this TabContents.
std::vector<InfoBarDelegate*> infobar_delegates_;
+ // See getter above.
+ bool is_being_destroyed_;
+
DISALLOW_COPY_AND_ASSIGN(TabContents);
};
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc
index 91b148c..019fdc8 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -647,7 +647,10 @@ void BrowserView::TabSelectedAt(TabContents* old_contents,
bool user_gesture) {
DCHECK(old_contents != new_contents);
- if (old_contents)
+ // We do not store the focus when closing the tab to work-around bug 4633.
+ // Some reports seem to show that the focus manager and/or focused view can
+ // be garbage at that point, it is not clear why.
+ if (old_contents && !old_contents->is_being_destroyed())
old_contents->StoreFocus();
// Update various elements that are interested in knowing the current
@@ -659,8 +662,10 @@ void BrowserView::TabSelectedAt(TabContents* old_contents,
// required to make features like Duplicate Tab, Undo Close Tab,
// etc not result in sad tab.
new_contents->DidBecomeSelected();
- if (BrowserList::GetLastActive() == browser_)
+ if (BrowserList::GetLastActive() == browser_ &&
+ !browser_->tabstrip_model()->closing_all()) {
new_contents->RestoreFocus();
+ }
// Update all the UI bits.
UpdateTitleBar();