blob: ff860913d2da183a092b84fb909f60594c674c64 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "content/public/browser/site_instance.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/web_contents_tester.h"
using content::SiteInstance;
using content::WebContents;
using content::WebContentsTester;
class BrowserUnitTest : public BrowserWithTestWindowTest {
public:
BrowserUnitTest() {}
virtual ~BrowserUnitTest() {}
// Caller owns the memory.
WebContents* CreateTestWebContents() {
return WebContentsTester::CreateTestWebContents(
profile(), SiteInstance::Create(profile()));
}
private:
DISALLOW_COPY_AND_ASSIGN(BrowserUnitTest);
};
// Don't build on platforms without a tab strip.
#if !defined(OS_ANDROID) && !defined(OS_IOS)
// Ensure crashed tabs are not reloaded when selected. crbug.com/232323
TEST_F(BrowserUnitTest, ReloadCrashedTab) {
TabStripModel* tab_strip_model = browser()->tab_strip_model();
// Start with a single foreground tab. |tab_strip_model| owns the memory.
WebContents* contents1 = CreateTestWebContents();
tab_strip_model->AppendWebContents(contents1, true);
WebContentsTester::For(contents1)->NavigateAndCommit(GURL("about:blank"));
WebContentsTester::For(contents1)->TestSetIsLoading(false);
EXPECT_TRUE(tab_strip_model->IsTabSelected(0));
EXPECT_FALSE(contents1->IsLoading());
// Add a second tab in the background.
WebContents* contents2 = CreateTestWebContents();
tab_strip_model->AppendWebContents(contents2, false);
WebContentsTester::For(contents2)->NavigateAndCommit(GURL("about:blank"));
WebContentsTester::For(contents2)->TestSetIsLoading(false);
EXPECT_EQ(2, browser()->tab_strip_model()->count());
EXPECT_TRUE(tab_strip_model->IsTabSelected(0));
EXPECT_FALSE(contents2->IsLoading());
// Simulate the second tab crashing.
contents2->SetIsCrashed(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
EXPECT_TRUE(contents2->IsCrashed());
// Selecting the second tab does not cause a load or clear the crash.
tab_strip_model->ActivateTabAt(1, true);
EXPECT_TRUE(tab_strip_model->IsTabSelected(1));
EXPECT_FALSE(contents2->IsLoading());
EXPECT_TRUE(contents2->IsCrashed());
}
#endif // !defined(OS_ANDROID) && !defined(OS_IOS)