OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/frame/browser_view.h" | 5 #include "chrome/browser/ui/views/frame/browser_view.h" |
6 | 6 |
7 #include "base/run_loop.h" | |
7 #include "chrome/browser/ui/browser.h" | 8 #include "chrome/browser/ui/browser.h" |
8 #include "chrome/browser/ui/browser_tabstrip.h" | 9 #include "chrome/browser/ui/browser_tabstrip.h" |
9 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 10 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
10 #include "chrome/test/base/in_process_browser_test.h" | 11 #include "chrome/test/base/in_process_browser_test.h" |
11 #include "content/public/browser/invalidate_type.h" | 12 #include "content/public/browser/invalidate_type.h" |
12 #include "content/public/browser/web_contents.h" | 13 #include "content/public/browser/web_contents.h" |
13 #include "content/public/browser/web_contents_observer.h" | 14 #include "content/public/browser/web_contents_observer.h" |
15 #include "ui/base/ui_base_types.h" | |
14 | 16 |
15 typedef InProcessBrowserTest BrowserViewTest; | 17 typedef InProcessBrowserTest BrowserViewTest; |
16 | 18 |
17 namespace { | 19 namespace { |
18 | 20 |
19 // Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked | 21 // Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked |
20 // updates the navigation state of another tab. | 22 // updates the navigation state of another tab. |
21 class TestWebContentsObserver : public content::WebContentsObserver { | 23 class TestWebContentsObserver : public content::WebContentsObserver { |
22 public: | 24 public: |
23 TestWebContentsObserver(content::WebContents* source, | 25 TestWebContentsObserver(content::WebContents* source, |
24 content::WebContents* other) | 26 content::WebContents* other) |
25 : content::WebContentsObserver(source), | 27 : content::WebContentsObserver(source), |
26 other_(other) {} | 28 other_(other) {} |
27 virtual ~TestWebContentsObserver() {} | 29 virtual ~TestWebContentsObserver() {} |
28 | 30 |
29 virtual void WebContentsDestroyed() OVERRIDE { | 31 virtual void WebContentsDestroyed() OVERRIDE { |
30 other_->NotifyNavigationStateChanged( | 32 other_->NotifyNavigationStateChanged( |
31 content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD); | 33 content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD); |
32 } | 34 } |
33 | 35 |
34 private: | 36 private: |
35 content::WebContents* other_; | 37 content::WebContents* other_; |
36 | 38 |
37 DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver); | 39 DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver); |
38 }; | 40 }; |
39 | 41 |
42 class WebContentsShowHideObserver : public content::WebContentsObserver { | |
43 public: | |
44 WebContentsShowHideObserver(content::WebContents* web_contents, | |
45 const base::Closure& callback) | |
46 : WebContentsObserver(web_contents), | |
47 callback_(callback), | |
48 show_state_(ui::SHOW_STATE_DEFAULT) {} | |
49 | |
50 // WebContentsObserver. | |
51 virtual void WasHidden() OVERRIDE { | |
52 show_state_ = ui::SHOW_STATE_INACTIVE; | |
53 callback_.Run(); | |
54 } | |
55 | |
56 virtual void WasShown() OVERRIDE { | |
57 show_state_ = ui::SHOW_STATE_NORMAL; | |
58 callback_.Run(); | |
59 } | |
60 | |
61 bool shown() { return show_state_ == ui::SHOW_STATE_NORMAL; } | |
62 bool hidden() { return show_state_ == ui::SHOW_STATE_INACTIVE; } | |
63 | |
64 private: | |
65 base::Closure callback_; | |
66 ui::WindowShowState show_state_; | |
67 | |
68 DISALLOW_COPY_AND_ASSIGN(WebContentsShowHideObserver); | |
69 }; | |
70 | |
40 } // namespace | 71 } // namespace |
41 | 72 |
42 // Verifies don't crash when CloseNow() is invoked with two tabs in a browser. | 73 // Verifies don't crash when CloseNow() is invoked with two tabs in a browser. |
43 // Additionally when one of the tabs is destroyed NotifyNavigationStateChanged() | 74 // Additionally when one of the tabs is destroyed NotifyNavigationStateChanged() |
44 // is invoked on the other. | 75 // is invoked on the other. |
45 IN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) { | 76 IN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) { |
46 Browser* browser2 = | 77 Browser* browser2 = |
47 new Browser(Browser::CreateParams(browser()->profile(), | 78 new Browser(Browser::CreateParams(browser()->profile(), |
48 browser()->host_desktop_type())); | 79 browser()->host_desktop_type())); |
49 chrome::AddTabAt(browser2, GURL(), -1, true); | 80 chrome::AddTabAt(browser2, GURL(), -1, true); |
(...skipping 11 matching lines...) Expand all Loading... | |
61 new Browser(Browser::CreateParams(browser()->profile(), | 92 new Browser(Browser::CreateParams(browser()->profile(), |
62 browser()->host_desktop_type())); | 93 browser()->host_desktop_type())); |
63 chrome::AddTabAt(browser2, GURL(), -1, true); | 94 chrome::AddTabAt(browser2, GURL(), -1, true); |
64 chrome::AddTabAt(browser2, GURL(), -1, true); | 95 chrome::AddTabAt(browser2, GURL(), -1, true); |
65 browser2->tab_strip_model()->ActivateTabAt(0, true); | 96 browser2->tab_strip_model()->ActivateTabAt(0, true); |
66 TestWebContentsObserver observer( | 97 TestWebContentsObserver observer( |
67 browser2->tab_strip_model()->GetWebContentsAt(0), | 98 browser2->tab_strip_model()->GetWebContentsAt(0), |
68 browser2->tab_strip_model()->GetWebContentsAt(1)); | 99 browser2->tab_strip_model()->GetWebContentsAt(1)); |
69 BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow(); | 100 BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow(); |
70 } | 101 } |
102 | |
103 // Test that hiding a window by minimization will cause the web content to be | |
104 // hidden as well (to save CPU cycles for rendering). | |
105 IN_PROC_BROWSER_TEST_F(BrowserViewTest, MinimizeHidesWebContents) { | |
sky
2014/05/20 19:46:27
Test coverage should be in content. The test here
Mr4D (OOO till 08-26)
2014/05/20 21:26:56
I prefer 1:1 tests and not tests which imply that
ncarter (slow)
2014/05/20 21:40:01
Fwiw, I think this test can move to a content_brow
| |
106 // Minimizing the window should cause the active WebContents to be hidden. | |
107 { | |
108 base::RunLoop run_loop; | |
109 WebContentsShowHideObserver observed( | |
110 browser()->tab_strip_model()->GetActiveWebContents(), | |
111 run_loop.QuitClosure()); | |
112 | |
113 ASSERT_FALSE(observed.hidden()); | |
114 ASSERT_FALSE(observed.shown()); | |
115 browser()->window()->Minimize(); | |
116 if (!observed.hidden()) | |
117 run_loop.RunUntilIdle(); | |
118 ASSERT_TRUE(observed.hidden()); | |
119 ASSERT_FALSE(observed.shown()); | |
120 } | |
121 | |
122 // Restoring the window should cause the active WebContents to be shown. | |
123 { | |
124 base::RunLoop run_loop; | |
125 WebContentsShowHideObserver observed( | |
126 browser()->tab_strip_model()->GetActiveWebContents(), | |
127 run_loop.QuitClosure()); | |
128 | |
129 ASSERT_FALSE(observed.hidden()); | |
130 ASSERT_FALSE(observed.shown()); | |
131 browser()->window()->Restore(); | |
132 if (!observed.shown()) | |
133 run_loop.RunUntilIdle(); | |
134 ASSERT_TRUE(observed.shown()); | |
135 ASSERT_FALSE(observed.hidden()); | |
136 } | |
137 } | |
OLD | NEW |