158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/invalidate_type.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)typedef InProcessBrowserTest BrowserViewTest; 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// updates the navigation state of another tab. 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class TestWebContentsObserver : public content::WebContentsObserver { 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestWebContentsObserver(content::WebContents* source, 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::WebContents* other) 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : content::WebContentsObserver(source), 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) other_(other) {} 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~TestWebContentsObserver() {} 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void WebContentsDestroyed( 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::WebContents* web_contents) OVERRIDE { 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) other_->NotifyNavigationStateChanged( 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD); 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::WebContents* other_; 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver); 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Verifies don't crash when CloseNow() is invoked with two tabs in a browser. 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged() 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// is invoked on the other. 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) { 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Browser* browser2 = 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new Browser(Browser::CreateParams(browser()->profile(), 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser()->host_desktop_type())); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::AddTabAt(browser2, GURL(), -1, true); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::AddTabAt(browser2, GURL(), -1, true); 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestWebContentsObserver observer( 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser2->tab_strip_model()->GetWebContentsAt(0), 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser2->tab_strip_model()->GetWebContentsAt(1)); 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow(); 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 57