summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-18 07:43:56 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-18 07:43:56 +0000
commit10807a7da2e42e09f5bd20068a916b6220bd88d7 (patch)
treeabc3d09b16e3541b565da174ea571616b922e402 /ash
parent77ad20e3e4473c7f7ce4a94c3269b389d2e8b648 (diff)
downloadchromium_src-10807a7da2e42e09f5bd20068a916b6220bd88d7.zip
chromium_src-10807a7da2e42e09f5bd20068a916b6220bd88d7.tar.gz
chromium_src-10807a7da2e42e09f5bd20068a916b6220bd88d7.tar.bz2
ash: Fix launcher overflow bubble crash.
LauncherView needs a valid ShelfLayoutManager now so passing the outer launcher's shelf layout manager to the one hosted by the bubble. And add a LauncherTest.ShowOverflowBubble for sanity test. BUG=166457 TEST=Verify no crash on showing launcher overflow bubble and LauncherTest.ShowOverflowBubble should pass. R=jamescook@chromium.org Review URL: https://chromiumcodereview.appspot.com/11623002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173683 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r--ash/launcher/launcher_unittest.cc27
-rw-r--r--ash/launcher/launcher_view_unittest.cc6
-rw-r--r--ash/launcher/overflow_bubble.cc20
-rw-r--r--ash/launcher/overflow_bubble.h2
-rw-r--r--ash/test/launcher_view_test_api.cc4
-rw-r--r--ash/test/launcher_view_test_api.h3
6 files changed, 51 insertions, 11 deletions
diff --git a/ash/launcher/launcher_unittest.cc b/ash/launcher/launcher_unittest.cc
index 2c3f8a8..528e302 100644
--- a/ash/launcher/launcher_unittest.cc
+++ b/ash/launcher/launcher_unittest.cc
@@ -77,4 +77,31 @@ TEST_F(LauncherTest, OpenBrowser) {
ASSERT_EQ(--button_count, test.GetButtonCount());
}
+TEST_F(LauncherTest, ShowOverflowBubble) {
+ Launcher* launcher = Launcher::ForPrimaryDisplay();
+ ASSERT_TRUE(launcher);
+
+ LauncherView* launcher_view = launcher->GetLauncherViewForTest();
+ test::LauncherViewTestAPI test(launcher_view);
+ test.SetAnimationDuration(1); // Speeds up animation for test.
+
+ LauncherModel* model = launcher_view->model();
+
+ // Add tabbed browser until overflow.
+ int items_added = 0;
+ while (!test.IsOverflowButtonVisible()) {
+ LauncherItem item;
+ item.type = TYPE_TABBED;
+ item.status = STATUS_RUNNING;
+ model->Add(item);
+
+ ++items_added;
+ ASSERT_LT(items_added, 10000);
+ }
+
+ // Shows overflow bubble.
+ test.ShowOverflowBubble();
+ EXPECT_TRUE(launcher->IsShowingOverflowBubble());
+}
+
} // namespace ash
diff --git a/ash/launcher/launcher_view_unittest.cc b/ash/launcher/launcher_view_unittest.cc
index 8fb6529..9be81d8 100644
--- a/ash/launcher/launcher_view_unittest.cc
+++ b/ash/launcher/launcher_view_unittest.cc
@@ -90,7 +90,7 @@ class LauncherViewIconObserverTest : public ash::test::AshTestBase {
TestLauncherIconObserver* observer() { return observer_.get(); }
- LauncherViewTestAPI* launcher_vew_test() {
+ LauncherViewTestAPI* launcher_view_test() {
return launcher_view_test_.get();
}
@@ -113,13 +113,13 @@ TEST_F(LauncherViewIconObserverTest, AddRemove) {
scoped_ptr<views::Widget> widget(new views::Widget());
widget->Init(params);
launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
- launcher_vew_test()->RunMessageLoopUntilAnimationsDone();
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
EXPECT_TRUE(observer()->change_notified());
observer()->Reset();
widget->Show();
widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
- launcher_vew_test()->RunMessageLoopUntilAnimationsDone();
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
EXPECT_TRUE(observer()->change_notified());
observer()->Reset();
}
diff --git a/ash/launcher/overflow_bubble.cc b/ash/launcher/overflow_bubble.cc
index 06a0f52..58201e5 100644
--- a/ash/launcher/overflow_bubble.cc
+++ b/ash/launcher/overflow_bubble.cc
@@ -101,23 +101,29 @@ void OverflowBubbleView::InitOverflowBubble(LauncherDelegate* delegate,
LauncherModel* model,
views::View* anchor,
int overflow_start_index) {
+ // set_anchor_view needs to be called before GetShelfLayoutManagerForLauncher
+ // can be called.
+ set_anchor_view(anchor);
+ set_arrow_location(GetBubbleArrowLocation());
+ set_background(NULL);
+ set_color(SkColorSetARGB(kLauncherBackgroundAlpha, 0, 0, 0));
+ set_margins(gfx::Insets(kPadding, kPadding, kPadding, kPadding));
+ set_move_with_anchor(true);
+
// Makes bubble view has a layer and clip its children layers.
SetPaintToLayer(true);
SetFillsBoundsOpaquely(false);
layer()->SetMasksToBounds(true);
- launcher_view_ = new LauncherView(model, delegate, NULL);
+
+ launcher_view_ = new LauncherView(model,
+ delegate,
+ GetShelfLayoutManagerForLauncher());
launcher_view_->set_first_visible_index(overflow_start_index);
launcher_view_->set_leading_inset(kLauncherViewLeadingInset);
launcher_view_->Init();
launcher_view_->OnShelfAlignmentChanged();
AddChildView(launcher_view_);
- set_anchor_view(anchor);
- set_arrow_location(GetBubbleArrowLocation());
- set_background(NULL);
- set_color(SkColorSetARGB(kLauncherBackgroundAlpha, 0, 0, 0));
- set_margins(gfx::Insets(kPadding, kPadding, kPadding, kPadding));
- set_move_with_anchor(true);
views::BubbleDelegateView::CreateBubble(this);
}
diff --git a/ash/launcher/overflow_bubble.h b/ash/launcher/overflow_bubble.h
index b1ea42e..dd70f4f 100644
--- a/ash/launcher/overflow_bubble.h
+++ b/ash/launcher/overflow_bubble.h
@@ -22,7 +22,7 @@ namespace internal {
class LauncherView;
-// OverflowBubble displays an overflow bubble.
+// OverflowBubble displays the overflown launcher items in a bubble.
class OverflowBubble : public views::WidgetObserver {
public:
OverflowBubble();
diff --git a/ash/test/launcher_view_test_api.cc b/ash/test/launcher_view_test_api.cc
index 8d2885b..8853ca4 100644
--- a/ash/test/launcher_view_test_api.cc
+++ b/ash/test/launcher_view_test_api.cc
@@ -64,6 +64,10 @@ bool LauncherViewTestAPI::IsOverflowButtonVisible() {
return launcher_view_->overflow_button_->visible();
}
+void LauncherViewTestAPI::ShowOverflowBubble() {
+ launcher_view_->ShowOverflowBubble();
+}
+
const gfx::Rect& LauncherViewTestAPI::GetBoundsByIndex(int index) {
return launcher_view_->view_model_->view_at(index)->bounds();
}
diff --git a/ash/test/launcher_view_test_api.h b/ash/test/launcher_view_test_api.h
index ee56607..f44f617 100644
--- a/ash/test/launcher_view_test_api.h
+++ b/ash/test/launcher_view_test_api.h
@@ -42,6 +42,9 @@ class LauncherViewTestAPI {
// Returns true if overflow button is visible.
bool IsOverflowButtonVisible();
+ // Makes launcher view show its overflow bubble.
+ void ShowOverflowBubble();
+
// Sets animation duration in milliseconds for test.
void SetAnimationDuration(int duration_ms);