Index: chrome/browser/ui/views/ash/tab_scrubber_browsertest.cc |
diff --git a/chrome/browser/ui/views/ash/tab_scrubber_browsertest.cc b/chrome/browser/ui/views/ash/tab_scrubber_browsertest.cc |
index 069af32cdc0335559311c4a2274378a8786588a0..59315a73e2259130fa83326de7f00f8122d5944e 100644 |
--- a/chrome/browser/ui/views/ash/tab_scrubber_browsertest.cc |
+++ b/chrome/browser/ui/views/ash/tab_scrubber_browsertest.cc |
@@ -8,10 +8,12 @@ |
#include "ash/display/event_transformation_handler.h" |
#include "ash/shell.h" |
+#include "base/callback_helpers.h" |
#include "base/command_line.h" |
#include "base/macros.h" |
#include "base/run_loop.h" |
#include "build/build_config.h" |
+#include "chrome/browser/ui/browser_commands.h" |
#include "chrome/browser/ui/browser_tabstrip.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" |
@@ -33,6 +35,51 @@ |
namespace { |
+// Waits until the immersive mode reveal ends, and therefore the top view of |
+// the browser is no longer visible. |
+class ImmersiveRevealEndedWaiter : public ImmersiveModeController::Observer { |
+ public: |
+ explicit ImmersiveRevealEndedWaiter( |
+ ImmersiveModeController* immersive_controller) |
+ : immersive_controller_(immersive_controller) { |
+ immersive_controller_->AddObserver(this); |
+ } |
+ |
+ ~ImmersiveRevealEndedWaiter() override { |
+ if (immersive_controller_) |
+ immersive_controller_->RemoveObserver(this); |
+ } |
+ |
+ void Wait() { |
+ if (!immersive_controller_ || !immersive_controller_->IsRevealed()) |
+ return; |
+ |
+ base::RunLoop run_loop; |
+ quit_closure_ = run_loop.QuitClosure(); |
+ run_loop.Run(); |
+ } |
+ |
+ private: |
+ void MaybeQuitRunLoop() { |
+ if (!quit_closure_.is_null()) |
+ base::ResetAndReturn(&quit_closure_).Run(); |
+ } |
+ |
+ // ImmersiveModeController::Observer: |
+ void OnImmersiveRevealEnded() override { MaybeQuitRunLoop(); } |
+ |
+ void OnImmersiveModeControllerDestroyed() override { |
+ MaybeQuitRunLoop(); |
+ immersive_controller_->RemoveObserver(this); |
+ immersive_controller_ = nullptr; |
+ } |
+ |
+ ImmersiveModeController* immersive_controller_; |
+ base::Closure quit_closure_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ImmersiveRevealEndedWaiter); |
+}; |
+ |
class TabScrubberTest : public InProcessBrowserTest, |
public TabStripModelObserver { |
public: |
@@ -281,6 +328,33 @@ IN_PROC_BROWSER_TEST_F(TabScrubberTest, MultiBrowser) { |
EXPECT_EQ(0, browser2->tab_strip_model()->active_index()); |
} |
+// Tests that tab scrubbing works correctly for a full-screen browser. |
+IN_PROC_BROWSER_TEST_F(TabScrubberTest, FullScreenBrowser) { |
+ AddTabs(browser(), 6); |
+ browser()->tab_strip_model()->ActivateTabAt(4, false); |
+ |
+ chrome::ToggleFullscreenMode(browser()); |
+ BrowserView* browser_view = BrowserView::GetBrowserViewForNativeWindow( |
+ browser()->window()->GetNativeWindow()); |
+ ImmersiveModeController* immersive_controller = |
+ browser_view->immersive_mode_controller(); |
+ EXPECT_TRUE(immersive_controller->IsEnabled()); |
+ |
+ ImmersiveRevealEndedWaiter waiter(immersive_controller); |
+ waiter.Wait(); |
+ |
+ EXPECT_FALSE(immersive_controller->IsRevealed()); |
+ |
+ EXPECT_EQ(4, browser()->tab_strip_model()->active_index()); |
+ Scrub(browser(), 0, EACH_TAB); |
+ EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); |
+ EXPECT_EQ(4U, activation_order_.size()); |
+ EXPECT_EQ(3, activation_order_[0]); |
+ EXPECT_EQ(2, activation_order_[1]); |
+ EXPECT_EQ(1, activation_order_[2]); |
+ EXPECT_EQ(0, activation_order_[3]); |
+} |
+ |
// Swipe 4 tabs in each direction with an extra swipe within each. The same |
// 4 tabs should become active. |
IN_PROC_BROWSER_TEST_F(TabScrubberTest, Repeated) { |