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