| Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
|
| diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
|
| index 746da2df43b7e7fe310334f2509ee8d4e74a3fe4..97056cdfdf7c9a3a423fffe78d21d50ff28c84ce 100644
|
| --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
|
| +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
|
| @@ -313,8 +313,14 @@
|
| }
|
|
|
| void InstallAndToggleBar(BookmarkBarController* bar) {
|
| - // Loads the view.
|
| - [[bar controlledView] setResizeDelegate:resizeDelegate_];
|
| + // In OSX 10.10, the owner of a nib file is retain/autoreleased during the
|
| + // initialization of the nib. Wrapping the nib loading in an
|
| + // autoreleasepool ensures that tests can control the destruction timing of
|
| + // the controller.
|
| + @autoreleasepool {
|
| + // Forces loading of the nib.
|
| + [[bar controlledView] setResizeDelegate:resizeDelegate_];
|
| + }
|
| // Awkwardness to look like we've been installed.
|
| for (NSView* subView in [parent_view_ subviews])
|
| [subView removeFromSuperview];
|
| @@ -361,49 +367,6 @@
|
|
|
| BookmarkBarControllerNoOpen* noOpenBar() {
|
| return (BookmarkBarControllerNoOpen*)bar_.get();
|
| - }
|
| -
|
| - // Verifies that the i-th button has the title of the i-th child node of
|
| - // |node|.
|
| - void VerifyButtonTitles(const BookmarkNode* node) {
|
| - ASSERT_LE((int)[[bar_ buttons] count], node->child_count());
|
| - int numButtons = [[bar_ buttons] count];
|
| - for (int i = 0; i < numButtons; i++) {
|
| - EXPECT_NSEQ([[[bar_ buttons] objectAtIndex:i] title],
|
| - base::SysUTF16ToNSString(node->GetChild(i)->GetTitle()));
|
| - }
|
| - }
|
| -
|
| - // Verifies that |view|
|
| - // * With a blank layout applied:
|
| - // - Is hidden
|
| - //
|
| - // * With |layout| applied:
|
| - // - Is visible
|
| - // - Has x origin |expected_x_origin|
|
| - // If |check_exact_width| is true:
|
| - // - has width |expected_width|
|
| - // Otherwise:
|
| - // - has width > 0 (|expected_width| is ignored in this case)
|
| - void VerifyViewLayout(NSView* view,
|
| - bookmarks::BookmarkBarLayout& layout,
|
| - CGFloat expected_x_origin,
|
| - CGFloat expected_width,
|
| - bool check_exact_width) {
|
| - ASSERT_TRUE(view);
|
| -
|
| - bookmarks::BookmarkBarLayout empty_layout = {};
|
| - [bar_ applyLayout:empty_layout animated:NO];
|
| - EXPECT_TRUE([view isHidden]);
|
| -
|
| - [bar_ applyLayout:layout animated:NO];
|
| - EXPECT_CGFLOAT_EQ(NSMinX([view frame]), expected_x_origin);
|
| - CGFloat actual_width = NSWidth([view frame]);
|
| - if (check_exact_width) {
|
| - EXPECT_CGFLOAT_EQ(actual_width, expected_width);
|
| - } else {
|
| - EXPECT_GT(actual_width, 0);
|
| - }
|
| }
|
| };
|
|
|
| @@ -454,6 +417,38 @@
|
| EXPECT_FALSE([[bar_ view] isHidden]);
|
| EXPECT_GT([resizeDelegate_ height], 0);
|
| EXPECT_GT([[bar_ view] frame].size.height, 0);
|
| +
|
| + // Make sure no buttons fall off the bar, either now or when resized
|
| + // bigger or smaller.
|
| + CGFloat sizes[] = { 300.0, -100.0, 200.0, -420.0 };
|
| + CGFloat previousX = 0.0;
|
| + for (unsigned x = 0; x < arraysize(sizes); x++) {
|
| + // Confirm the buttons moved from the last check (which may be
|
| + // init but that's fine).
|
| + CGFloat newX = [[bar_ offTheSideButton] frame].origin.x;
|
| + EXPECT_NE(previousX, newX);
|
| + previousX = newX;
|
| +
|
| + // Confirm the buttons have a reasonable bounds. Recall that |-frame|
|
| + // returns rectangles in the superview's coordinates.
|
| + NSRect buttonViewFrame =
|
| + [[bar_ buttonView] convertRect:[[bar_ buttonView] frame]
|
| + fromView:[[bar_ buttonView] superview]];
|
| + EXPECT_EQ([bar_ buttonView], [[bar_ offTheSideButton] superview]);
|
| + EXPECT_TRUE(NSContainsRect(buttonViewFrame,
|
| + [[bar_ offTheSideButton] frame]));
|
| + EXPECT_EQ([bar_ buttonView], [[bar_ otherBookmarksButton] superview]);
|
| + EXPECT_TRUE(NSContainsRect(buttonViewFrame,
|
| + [[bar_ otherBookmarksButton] frame]));
|
| +
|
| + // Now move them implicitly.
|
| + // We confirm FrameChangeNotification works in the next unit test;
|
| + // we simply assume it works here to resize or reposition the
|
| + // buttons above.
|
| + NSRect frame = [[bar_ view] frame];
|
| + frame.size.width += sizes[x];
|
| + [[bar_ view] setFrame:frame];
|
| + }
|
| }
|
|
|
| // Test whether |-updateState:...| sets currentState as expected. Make
|
| @@ -526,393 +521,38 @@
|
| EXPECT_GT([bar toggles], 0);
|
| }
|
|
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutNoItemTextField) {
|
| - NSTextField* text_field = [[bar_ buttonView] noItemTextField];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - layout.visible_elements |= bookmarks::kVisibleElementsMaskNoItemTextField;
|
| - layout.no_item_textfield_offset = 10;
|
| - layout.no_item_textfield_width = 20;
|
| -
|
| - VerifyViewLayout(text_field, layout, 10, 20, true);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutImportBookmarksButton) {
|
| - NSButton* button = [[bar_ buttonView] importBookmarksButton];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - // This button never appears without the no item text field appearing, so
|
| - // show that too.
|
| - layout.visible_elements |= bookmarks::kVisibleElementsMaskNoItemTextField;
|
| - layout.no_item_textfield_offset = 10;
|
| - layout.no_item_textfield_width = 20;
|
| - layout.visible_elements |=
|
| - bookmarks::kVisibleElementsMaskImportBookmarksButton;
|
| - layout.import_bookmarks_button_offset = 30;
|
| - layout.import_bookmarks_button_width = 40;
|
| -
|
| - VerifyViewLayout(button, layout, 30, 40, true);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutSupervisedButton) {
|
| - NSButton* button = [bar_ supervisedBookmarksButton];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - layout.visible_elements |=
|
| - bookmarks::kVisibleElementsMaskSupervisedBookmarksButton;
|
| - layout.supervised_bookmarks_button_offset = 40;
|
| -
|
| - VerifyViewLayout(button, layout, 40, CGFLOAT_MAX, false);
|
| -}
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutManagedButton) {
|
| - NSButton* button = [bar_ managedBookmarksButton];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - layout.visible_elements |=
|
| - bookmarks::kVisibleElementsMaskManagedBookmarksButton;
|
| - layout.managed_bookmarks_button_offset = 50;
|
| -
|
| - VerifyViewLayout(button, layout, 50, CGFLOAT_MAX, false);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutOffTheSideButton) {
|
| - NSButton* button = [bar_ offTheSideButton];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - layout.visible_elements |= bookmarks::kVisibleElementsMaskOffTheSideButton;
|
| - layout.off_the_side_button_offset = 100;
|
| -
|
| - VerifyViewLayout(button, layout, 100, CGFLOAT_MAX, false);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutOtherBookmarksButton) {
|
| - NSButton* button = [bar_ otherBookmarksButton];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - layout.visible_elements |=
|
| - bookmarks::kVisibleElementsMaskOtherBookmarksButton;
|
| - layout.other_bookmarks_button_offset = 110;
|
| -
|
| - VerifyViewLayout(button, layout, 110, CGFLOAT_MAX, false);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutAppsButton) {
|
| - NSButton* button = [bar_ appsPageShortcutButton];
|
| -
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - layout.visible_elements |= bookmarks::kVisibleElementsMaskAppsButton;
|
| - layout.apps_button_offset = 5;
|
| -
|
| - VerifyViewLayout(button, layout, 5, CGFLOAT_MAX, false);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, ApplyLayoutBookmarkButtons) {
|
| - // Add some bookmarks
|
| - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| - GURL gurls[] = {
|
| - GURL("http://www.google.com/a"), GURL("http://www.google.com/b"),
|
| - GURL("http://www.google.com/c"), GURL("http://www.google.com/d")};
|
| -
|
| - base::string16 titles[] = {ASCIIToUTF16("a"), ASCIIToUTF16("b"),
|
| - ASCIIToUTF16("c"), ASCIIToUTF16("d")};
|
| - for (size_t i = 0; i < arraysize(titles); i++)
|
| - bookmarks::AddIfNotBookmarked(model, gurls[i], titles[i]);
|
| -
|
| - // Apply an empty layout. This should clear the buttons.
|
| - bookmarks::BookmarkBarLayout layout = {};
|
| - [bar_ applyLayout:layout animated:NO];
|
| - EXPECT_EQ([[bar_ buttons] count], 0U);
|
| -
|
| - const BookmarkNode* parentNode = model->bookmark_bar_node();
|
| - EXPECT_EQ(parentNode->child_count(), 4);
|
| - // Ask the layout to show the first 2 nodes
|
| - for (int i = 0; i < 3; i++) {
|
| - const BookmarkNode* node = parentNode->GetChild(i);
|
| - layout.button_offsets[node->id()] =
|
| - bookmarks::kDefaultBookmarkWidth * (i + 1);
|
| - }
|
| - [bar_ applyLayout:layout animated:NO];
|
| - EXPECT_EQ([[bar_ buttons] count], 3U);
|
| - CGFloat lastMax = 0;
|
| - for (int i = 0; i < 3; i++) {
|
| - const BookmarkNode* node = parentNode->GetChild(i);
|
| - BookmarkButton* button = [[bar_ buttons] objectAtIndex:i];
|
| - EXPECT_EQ([button bookmarkNode], node);
|
| - EXPECT_CGFLOAT_EQ(NSMinX([button frame]),
|
| - bookmarks::kDefaultBookmarkWidth * (i + 1));
|
| - EXPECT_GT(NSWidth([button frame]), 0);
|
| - EXPECT_EQ([button superview], [bar_ buttonView]);
|
| - // Ensure buttons don't overlap.
|
| - EXPECT_GT(NSMinX([button frame]), lastMax);
|
| - lastMax = NSMaxX([button frame]);
|
| - }
|
| - VerifyButtonTitles(parentNode);
|
| -}
|
| -// TODO(lgrey): Add tests for RTL in a follow-up.
|
| -// crbug.com/648554
|
| -
|
| -TEST_F(BookmarkBarControllerTest, LayoutNoBookmarks) {
|
| - // With no apps button, or managed/supervised buttons:
|
| - profile()->GetPrefs()->SetBoolean(
|
| - bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - // Only the no item text field and import bookmarks button are showing.
|
| - EXPECT_EQ(
|
| - layout.visible_elements,
|
| - (unsigned int)(bookmarks::kVisibleElementsMaskImportBookmarksButton |
|
| - bookmarks::kVisibleElementsMaskNoItemTextField));
|
| -
|
| - EXPECT_EQ(layout.VisibleButtonCount(), 0U);
|
| -
|
| - // The import bookmarks button is after the no item text field and they don't
|
| - // overlap
|
| - EXPECT_GT(layout.import_bookmarks_button_offset,
|
| - layout.no_item_textfield_offset + layout.no_item_textfield_width);
|
| - // And they both have a width
|
| - EXPECT_GT(layout.no_item_textfield_width, 0);
|
| - EXPECT_GT(layout.import_bookmarks_button_width, 0);
|
| - // And start at the correct offset
|
| - EXPECT_EQ(layout.no_item_textfield_offset,
|
| - bookmarks::kBookmarkLeftMargin +
|
| - bookmarks::kInitialNoItemTextFieldXOrigin);
|
| - // With apps button:
|
| - profile()->GetPrefs()->SetBoolean(
|
| - bookmarks::prefs::kShowAppsShortcutInBookmarkBar, true);
|
| - layout = [bar_ layoutFromCurrentState];
|
| -
|
| - // Only the apps button, no item text field and import bookmarks button are
|
| - // showing.
|
| - EXPECT_EQ(
|
| - layout.visible_elements,
|
| - (unsigned int)(bookmarks::kVisibleElementsMaskImportBookmarksButton |
|
| - bookmarks::kVisibleElementsMaskNoItemTextField |
|
| - bookmarks::kVisibleElementsMaskAppsButton));
|
| - EXPECT_EQ(layout.VisibleButtonCount(), 0U);
|
| - // The no item text field is after the apps button
|
| - EXPECT_GT(layout.no_item_textfield_offset, layout.apps_button_offset);
|
| -
|
| - // And the apps button is at the correct offset
|
| - EXPECT_EQ(layout.apps_button_offset, bookmarks::kBookmarkLeftMargin);
|
| -
|
| - // TODO(lgrey): It seems prohibitively difficult/maybe impossible
|
| - // to test the managed/supervised buttons at this time.
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, LayoutManagedAppsButton) {
|
| - // By default the pref is not managed and the apps shortcut is shown.
|
| - sync_preferences::TestingPrefServiceSyncable* prefs =
|
| - profile()->GetTestingPrefService();
|
| - EXPECT_FALSE(prefs->IsManagedPreference(
|
| - bookmarks::prefs::kShowAppsShortcutInBookmarkBar));
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsAppsButtonVisible());
|
| -
|
| - // Hide the apps shortcut by policy, via the managed pref.
|
| - prefs->SetManagedPref(bookmarks::prefs::kShowAppsShortcutInBookmarkBar,
|
| - base::MakeUnique<base::Value>(false));
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_FALSE(layout.IsAppsButtonVisible());
|
| -
|
| - // And try showing it via policy too.
|
| - prefs->SetManagedPref(bookmarks::prefs::kShowAppsShortcutInBookmarkBar,
|
| - base::MakeUnique<base::Value>(true));
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsAppsButtonVisible());
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, NoItemsResizing) {
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible() &&
|
| - layout.IsImportBookmarksButtonVisible());
|
| - CGFloat oldOffset = layout.import_bookmarks_button_offset;
|
| - CGFloat oldWidth = layout.import_bookmarks_button_width;
|
| - CGRect viewFrame = [[bar_ view] frame];
|
| - CGFloat originalViewWidth = NSWidth(viewFrame);
|
| - // Assert that the import bookmarks button fits.
|
| - EXPECT_GT(originalViewWidth, oldOffset + oldWidth);
|
| - // Resize the view to cut the import bookmarks button in half.
|
| - viewFrame.size.width = oldOffset + oldWidth * 0.5;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible() &&
|
| - layout.IsImportBookmarksButtonVisible());
|
| - EXPECT_CGFLOAT_EQ(layout.import_bookmarks_button_offset, oldOffset);
|
| - EXPECT_LT(layout.import_bookmarks_button_width, oldWidth);
|
| - // Resize the view to cut off the import bookmarks button entirely.
|
| - viewFrame.size.width = layout.import_bookmarks_button_offset - 1;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_FALSE(layout.IsImportBookmarksButtonVisible());
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible());
|
| - // Now, cut the text field in half
|
| - oldOffset = layout.no_item_textfield_offset;
|
| - oldWidth = layout.no_item_textfield_width;
|
| - viewFrame.size.width = oldOffset + oldWidth * 0.5;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible());
|
| - EXPECT_CGFLOAT_EQ(layout.no_item_textfield_offset, oldOffset);
|
| - EXPECT_LT(layout.no_item_textfield_width, oldWidth);
|
| - // Make the view too small to fit either.
|
| - viewFrame.size.width = bookmarks::kBookmarkLeftMargin;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_FALSE(layout.IsNoItemTextFieldVisible() ||
|
| - layout.IsImportBookmarksButtonVisible());
|
| - // Sanity check
|
| - viewFrame.size.width = originalViewWidth;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible() &&
|
| - layout.IsImportBookmarksButtonVisible());
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, LayoutOtherBookmarks) {
|
| - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| +// Confirm our "no items" container goes away when we add the 1st
|
| +// bookmark, and comes back when we delete the bookmark.
|
| +TEST_F(BookmarkBarControllerTest, NoItemContainerGoesAway) {
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + const BookmarkNode* bar = model->bookmark_bar_node();
|
| +
|
| + [bar_ loaded:model];
|
| + BookmarkBarView* view = [bar_ buttonView];
|
| + DCHECK(view);
|
| + NSView* noItemContainer = [view noItemContainer];
|
| + DCHECK(noItemContainer);
|
| +
|
| + EXPECT_FALSE([noItemContainer isHidden]);
|
| + const BookmarkNode* node = model->AddURL(bar, bar->child_count(),
|
| + ASCIIToUTF16("title"),
|
| + GURL("http://www.google.com"));
|
| + EXPECT_TRUE([noItemContainer isHidden]);
|
| + model->Remove(node);
|
| + EXPECT_FALSE([noItemContainer isHidden]);
|
| +
|
| + // Now try it using a bookmark from the Other Bookmarks.
|
| const BookmarkNode* otherBookmarks = model->other_node();
|
| - model->AddURL(otherBookmarks, otherBookmarks->child_count(),
|
| - ASCIIToUTF16("TheOther"), GURL("http://www.other.com"));
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsOtherBookmarksButtonVisible());
|
| - EXPECT_EQ(layout.VisibleButtonCount(), 0U);
|
| - EXPECT_GT(layout.other_bookmarks_button_offset, 0);
|
| - CGFloat offsetFromMaxX =
|
| - NSWidth([[bar_ view] frame]) - layout.other_bookmarks_button_offset;
|
| - // Resize the view and ensure the button stays pinned to the right edge.
|
| - CGRect viewFrame = [[bar_ view] frame];
|
| - // Half of the original size
|
| - viewFrame.size.width = std::ceil(NSWidth(viewFrame) * 0.5);
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsOtherBookmarksButtonVisible());
|
| - EXPECT_GT(layout.other_bookmarks_button_offset, 0);
|
| - EXPECT_CGFLOAT_EQ(NSWidth(viewFrame) - layout.other_bookmarks_button_offset,
|
| - offsetFromMaxX);
|
| - // 150% of the original size
|
| - viewFrame.size.width = NSWidth(viewFrame) * 3;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsOtherBookmarksButtonVisible());
|
| - EXPECT_CGFLOAT_EQ(NSWidth(viewFrame) - layout.other_bookmarks_button_offset,
|
| - offsetFromMaxX);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, LayoutBookmarks) {
|
| - // Apps button shows up by default, first test without it.
|
| - profile()->GetPrefs()->SetBoolean(
|
| - bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| -
|
| - // Add some bookmarks.
|
| - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| - const BookmarkNode* barNode = model->bookmark_bar_node();
|
| - GURL gurls[] = {GURL("http://www.google.com/a"),
|
| - GURL("http://www.google.com/b"),
|
| - GURL("http://www.google.com/c")};
|
| - base::string16 titles[] = {ASCIIToUTF16("a"), ASCIIToUTF16("b"),
|
| - ASCIIToUTF16("c")};
|
| - for (size_t i = 0; i < arraysize(titles); i++)
|
| - bookmarks::AddIfNotBookmarked(model, gurls[i], titles[i]);
|
| -
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_EQ(layout.VisibleButtonCount(), (size_t)barNode->child_count());
|
| - EXPECT_FALSE(layout.IsOffTheSideButtonVisible());
|
| - EXPECT_EQ(layout.button_offsets.size(), (size_t)barNode->child_count());
|
| - EXPECT_EQ(layout.button_offsets[barNode->GetChild(0)->id()],
|
| - bookmarks::kBookmarkLeftMargin);
|
| - // Assert that the buttons are in order.
|
| - CGFloat lastOffset = 0;
|
| - for (int i = 0; i < barNode->child_count(); i++) {
|
| - CGFloat offset = layout.button_offsets[barNode->GetChild(i)->id()];
|
| - EXPECT_GT(offset, lastOffset);
|
| - lastOffset = offset;
|
| - }
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, NoItemUIHiddenWithBookmarks) {
|
| - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| - const BookmarkNode* barNode = model->bookmark_bar_node();
|
| -
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible() &&
|
| - layout.IsImportBookmarksButtonVisible());
|
| -
|
| - const BookmarkNode* node =
|
| - model->AddURL(barNode, barNode->child_count(), ASCIIToUTF16("title"),
|
| - GURL("http://www.google.com"));
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_FALSE(layout.IsNoItemTextFieldVisible() ||
|
| - layout.IsImportBookmarksButtonVisible());
|
| -
|
| - model->Remove(node);
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsNoItemTextFieldVisible() &&
|
| - layout.IsImportBookmarksButtonVisible());
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, LayoutBookmarksResize) {
|
| - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| - const BookmarkNode* barNode = model->bookmark_bar_node();
|
| - for (int i = 0; i < 20; i++) {
|
| - model->AddURL(barNode, barNode->child_count(), ASCIIToUTF16("title"),
|
| - GURL("http://www.google.com"));
|
| - }
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_LT(layout.VisibleButtonCount(), 20U);
|
| - size_t originalButtonCount = layout.VisibleButtonCount();
|
| - EXPECT_TRUE(layout.IsOffTheSideButtonVisible());
|
| -
|
| - CGRect viewFrame = [[bar_ view] frame];
|
| - // Increase the width of the view. More buttons should be visible.
|
| - viewFrame.size.width += 200;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_GT(layout.VisibleButtonCount(), originalButtonCount);
|
| -
|
| - // Decrease the width of the view to below what it was originally.
|
| - // Less buttons should be visible.
|
| - viewFrame.size.width -= 400;
|
| - [[bar_ view] setFrame:viewFrame];
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_LT(layout.VisibleButtonCount(), originalButtonCount);
|
| -
|
| - // NB: This part overlaps a little with |OffTheSideButtonHidden|
|
| - // but we just want to check the layout here, whereas that test
|
| - // ensures the folder is closed when the button goes away.
|
| - //
|
| - // Find the number of buttons at which the off-the-side button disappears.
|
| - EXPECT_TRUE(layout.IsOffTheSideButtonVisible());
|
| - bool crossoverPointFound = false;
|
| -
|
| - // Bound the number of iterations in case the button never
|
| - // disappears.
|
| - const int maxToRemove = 20;
|
| - for (int i = 0; i < maxToRemove; i++) {
|
| - if (!layout.IsOffTheSideButtonVisible()) {
|
| - crossoverPointFound = true;
|
| - break;
|
| - }
|
| - model->Remove(barNode->GetChild(barNode->child_count() - 1));
|
| - layout = [bar_ layoutFromCurrentState];
|
| - }
|
| -
|
| - // Either something is broken, or the test needs to be redone.
|
| - ASSERT_TRUE(crossoverPointFound);
|
| - EXPECT_FALSE(layout.IsOffTheSideButtonVisible());
|
| -
|
| - // Add a button and ensure the off the side button appears again.
|
| - model->AddURL(barNode, barNode->child_count(), ASCIIToUTF16("title"),
|
| - GURL("http://www.google.com"));
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_TRUE(layout.IsOffTheSideButtonVisible());
|
| -
|
| - // If the off-the-side button is visible, this means we have more
|
| - // buttons than we can show, so adding another shouldn't increase
|
| - // the button count.
|
| - size_t buttonCountBeforeAdding = layout.VisibleButtonCount();
|
| - model->AddURL(barNode, barNode->child_count(), ASCIIToUTF16("title"),
|
| - GURL("http://www.google.com"));
|
| - layout = [bar_ layoutFromCurrentState];
|
| - EXPECT_EQ(layout.VisibleButtonCount(), buttonCountBeforeAdding);
|
| + node = model->AddURL(otherBookmarks, otherBookmarks->child_count(),
|
| + ASCIIToUTF16("TheOther"),
|
| + GURL("http://www.other.com"));
|
| + EXPECT_FALSE([noItemContainer isHidden]);
|
| + // Move it from Other Bookmarks to the bar.
|
| + model->Move(node, bar, 0);
|
| + EXPECT_TRUE([noItemContainer isHidden]);
|
| + // Move it back to Other Bookmarks from the bar.
|
| + model->Move(node, otherBookmarks, 0);
|
| + EXPECT_FALSE([noItemContainer isHidden]);
|
| }
|
|
|
| // Confirm off the side button only enabled when reasonable.
|
| @@ -920,12 +560,12 @@
|
| BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
|
|
| [bar_ loaded:model];
|
| - EXPECT_TRUE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_TRUE([bar_ offTheSideButtonIsHidden]);
|
|
|
| for (int i = 0; i < 2; i++) {
|
| bookmarks::AddIfNotBookmarked(
|
| model, GURL("http://www.foo.com"), ASCIIToUTF16("small"));
|
| - EXPECT_TRUE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_TRUE([bar_ offTheSideButtonIsHidden]);
|
| }
|
|
|
| const BookmarkNode* parent = model->bookmark_bar_node();
|
| @@ -934,12 +574,12 @@
|
| ASCIIToUTF16("super duper wide title"),
|
| GURL("http://superfriends.hall-of-justice.edu"));
|
| }
|
| - EXPECT_FALSE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_FALSE([bar_ offTheSideButtonIsHidden]);
|
|
|
| // Open the "off the side" and start deleting nodes. Make sure
|
| // deletion of the last node in "off the side" causes the folder to
|
| // close.
|
| - EXPECT_FALSE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_FALSE([bar_ offTheSideButtonIsHidden]);
|
| NSButton* offTheSideButton = [bar_ offTheSideButton];
|
| // Open "off the side" menu.
|
| [bar_ openOffTheSideFolderFromButton:offTheSideButton];
|
| @@ -948,13 +588,13 @@
|
| [bbfc setIgnoreAnimations:YES];
|
| while (!parent->empty()) {
|
| // We've completed the job so we're done.
|
| - if ([[bar_ offTheSideButton] isHidden])
|
| + if ([bar_ offTheSideButtonIsHidden])
|
| break;
|
| // Delete the last button.
|
| model->Remove(parent->GetChild(parent->child_count() - 1));
|
| // If last one make sure the menu is closed and the button is hidden.
|
| // Else make sure menu stays open.
|
| - if ([[bar_ offTheSideButton] isHidden]) {
|
| + if ([bar_ offTheSideButtonIsHidden]) {
|
| EXPECT_FALSE([bar_ folderController]);
|
| } else {
|
| EXPECT_TRUE([bar_ folderController]);
|
| @@ -977,7 +617,7 @@
|
| model->AddURL(parent, parent->child_count(), ASCIIToUTF16(title.str()),
|
| GURL("http://superfriends.hall-of-justice.edu"));
|
| }
|
| - EXPECT_FALSE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_FALSE([bar_ offTheSideButtonIsHidden]);
|
|
|
| // Open "off the side" menu.
|
| NSButton* offTheSideButton = [bar_ offTheSideButton];
|
| @@ -1045,7 +685,14 @@
|
|
|
| TEST_F(BookmarkBarControllerTest, TestAddRemoveAndClear) {
|
| BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + NSView* buttonView = [bar_ buttonView];
|
| EXPECT_EQ(0U, [[bar_ buttons] count]);
|
| + unsigned int initial_subview_count = [[buttonView subviews] count];
|
| +
|
| + // Make sure a redundant call doesn't choke
|
| + [bar_ clearBookmarkBar];
|
| + EXPECT_EQ(0U, [[bar_ buttons] count]);
|
| + EXPECT_EQ(initial_subview_count, [[buttonView subviews] count]);
|
|
|
| GURL gurl1("http://superfriends.hall-of-justice.edu");
|
| // Short titles increase the chances of this test succeeding if the view is
|
| @@ -1055,24 +702,33 @@
|
| base::string16 title1(ASCIIToUTF16("x"));
|
| bookmarks::AddIfNotBookmarked(model, gurl1, title1);
|
| EXPECT_EQ(1U, [[bar_ buttons] count]);
|
| + EXPECT_EQ(1+initial_subview_count, [[buttonView subviews] count]);
|
|
|
| GURL gurl2("http://legion-of-doom.gov");
|
| base::string16 title2(ASCIIToUTF16("y"));
|
| bookmarks::AddIfNotBookmarked(model, gurl2, title2);
|
| EXPECT_EQ(2U, [[bar_ buttons] count]);
|
| + EXPECT_EQ(2+initial_subview_count, [[buttonView subviews] count]);
|
|
|
| for (int i = 0; i < 3; i++) {
|
| bookmarks::RemoveAllBookmarks(model, gurl2);
|
| EXPECT_EQ(1U, [[bar_ buttons] count]);
|
| + EXPECT_EQ(1+initial_subview_count, [[buttonView subviews] count]);
|
|
|
| // and bring it back
|
| bookmarks::AddIfNotBookmarked(model, gurl2, title2);
|
| EXPECT_EQ(2U, [[bar_ buttons] count]);
|
| - }
|
| + EXPECT_EQ(2+initial_subview_count, [[buttonView subviews] count]);
|
| + }
|
| +
|
| + [bar_ clearBookmarkBar];
|
| + EXPECT_EQ(0U, [[bar_ buttons] count]);
|
| + EXPECT_EQ(initial_subview_count, [[buttonView subviews] count]);
|
|
|
| // Explicit test of loaded: since this is a convenient spot
|
| [bar_ loaded:model];
|
| EXPECT_EQ(2U, [[bar_ buttons] count]);
|
| + EXPECT_EQ(2+initial_subview_count, [[buttonView subviews] count]);
|
| }
|
|
|
| // Make sure we don't create too many buttons; we only really need
|
| @@ -1100,7 +756,7 @@
|
| // Add 10 more (to the front of the list so the on-screen buttons
|
| // would change) and make sure the count stays the same.
|
| for (int i=0; i<10; i++) {
|
| - model->AddURL(parent, 0, // index is 0, so front, not end
|
| + model->AddURL(parent, 0, /* index is 0, so front, not end */
|
| ASCIIToUTF16("title"), GURL("http://www.google.com"));
|
| }
|
|
|
| @@ -1110,6 +766,107 @@
|
| [[bar_ view] setFrame:frame];
|
| int finalcount = [[bar_ buttons] count];
|
| EXPECT_GT(finalcount, count);
|
| +}
|
| +
|
| +// Make sure that each button we add marches to the right and does not
|
| +// overlap with the previous one.
|
| +TEST_F(BookmarkBarControllerTest, TestButtonMarch) {
|
| + base::scoped_nsobject<NSMutableArray> cells([[NSMutableArray alloc] init]);
|
| +
|
| + CGFloat widths[] = { 10, 10, 100, 10, 500, 500, 80000, 60000, 1, 345 };
|
| + for (unsigned int i = 0; i < arraysize(widths); i++) {
|
| + NSCell* cell = [[CellWithDesiredSize alloc]
|
| + initTextCell:@"foo"
|
| + desiredSize:NSMakeSize(widths[i], 30)];
|
| + [cells addObject:cell];
|
| + [cell release];
|
| + }
|
| +
|
| + int x_offset = 0;
|
| + CGFloat x_end = x_offset; // end of the previous button
|
| + for (unsigned int i = 0; i < arraysize(widths); i++) {
|
| + NSRect r = [bar_ frameForBookmarkButtonFromCell:[cells objectAtIndex:i]
|
| + xOffset:&x_offset];
|
| + EXPECT_GE(r.origin.x, x_end);
|
| + x_end = NSMaxX(r);
|
| + }
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, CheckForGrowth) {
|
| + WithNoAnimation at_all; // Turn off Cocoa auto animation in this scope.
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + GURL gurl1("http://www.google.com");
|
| + base::string16 title1(ASCIIToUTF16("x"));
|
| + bookmarks::AddIfNotBookmarked(model, gurl1, title1);
|
| +
|
| + GURL gurl2("http://www.google.com/blah");
|
| + base::string16 title2(ASCIIToUTF16("y"));
|
| + bookmarks::AddIfNotBookmarked(model, gurl2, title2);
|
| +
|
| + EXPECT_EQ(2U, [[bar_ buttons] count]);
|
| + CGFloat width_1 = [[[bar_ buttons] objectAtIndex:0] frame].size.width;
|
| + CGFloat x_2 = [[[bar_ buttons] objectAtIndex:1] frame].origin.x;
|
| +
|
| + NSButton* first = [[bar_ buttons] objectAtIndex:0];
|
| + [[first cell] setTitle:@"This is a really big title; watch out mom!"];
|
| + [bar_ checkForBookmarkButtonGrowth:first];
|
| +
|
| + // Make sure the 1st button is now wider, the 2nd one is moved over,
|
| + // and they don't overlap.
|
| + NSRect frame_1 = [[[bar_ buttons] objectAtIndex:0] frame];
|
| + NSRect frame_2 = [[[bar_ buttons] objectAtIndex:1] frame];
|
| + EXPECT_GT(frame_1.size.width, width_1);
|
| + EXPECT_GT(frame_2.origin.x, x_2);
|
| + EXPECT_GE(frame_2.origin.x, frame_1.origin.x + frame_1.size.width);
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, DeleteBookmark) {
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| +
|
| + const char* urls[] = { "https://secret.url.com",
|
| + "http://super.duper.web.site.for.doodz.gov",
|
| + "http://www.foo-bar-baz.com/" };
|
| + const BookmarkNode* parent = model->bookmark_bar_node();
|
| + for (unsigned int i = 0; i < arraysize(urls); i++) {
|
| + model->AddURL(parent, parent->child_count(),
|
| + ASCIIToUTF16("title"), GURL(urls[i]));
|
| + }
|
| + EXPECT_EQ(3, parent->child_count());
|
| + const BookmarkNode* middle_node = parent->GetChild(1);
|
| + model->Remove(middle_node);
|
| +
|
| + EXPECT_EQ(2, parent->child_count());
|
| + EXPECT_EQ(parent->GetChild(0)->url(), GURL(urls[0]));
|
| + // node 2 moved into spot 1
|
| + EXPECT_EQ(parent->GetChild(1)->url(), GURL(urls[2]));
|
| +}
|
| +
|
| +// TODO(jrg): write a test to confirm that nodeFaviconLoaded calls
|
| +// checkForBookmarkButtonGrowth:.
|
| +
|
| +TEST_F(BookmarkBarControllerTest, Cell) {
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + [bar_ loaded:model];
|
| +
|
| + const BookmarkNode* parent = model->bookmark_bar_node();
|
| + model->AddURL(parent, parent->child_count(),
|
| + ASCIIToUTF16("supertitle"),
|
| + GURL("http://superfriends.hall-of-justice.edu"));
|
| + const BookmarkNode* node = parent->GetChild(0);
|
| +
|
| + NSCell* cell = [bar_ cellForBookmarkNode:node];
|
| + EXPECT_TRUE(cell);
|
| + EXPECT_NSEQ(@"supertitle", [cell title]);
|
| + EXPECT_EQ(node, [[cell representedObject] pointerValue]);
|
| + EXPECT_TRUE([cell menu]);
|
| +
|
| + // Empty cells still have a menu.
|
| + cell = [bar_ cellForBookmarkNode:nil];
|
| + EXPECT_TRUE([cell menu]);
|
| + // Even empty cells have a title (of "(empty)")
|
| + EXPECT_TRUE([cell title]);
|
| +
|
| + // cell is autoreleased; no need to release here
|
| }
|
|
|
| // Test drawing, mostly to ensure nothing leaks or crashes.
|
| @@ -1141,10 +898,10 @@
|
| ASCIIToUTF16("super duper wide title"),
|
| GURL("http://superfriends.hall-of-justice.edu"));
|
| }
|
| + EXPECT_FALSE([bar_ offTheSideButtonIsHidden]);
|
|
|
| NSButton* offTheSideButton = [bar_ offTheSideButton];
|
| EXPECT_TRUE(offTheSideButton);
|
| - EXPECT_FALSE([offTheSideButton isHidden]);
|
| [offTheSideButton otherMouseUp:
|
| cocoa_test_event_utils::MouseEventWithType(NSOtherMouseUp, 0)];
|
|
|
| @@ -1168,13 +925,18 @@
|
| TEST_F(BookmarkBarControllerTest, DisplaysHelpMessageOnEmpty) {
|
| BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| [bar_ loaded:model];
|
| - EXPECT_FALSE([[[bar_ buttonView] noItemTextField] isHidden]);
|
| -}
|
| -
|
| -TEST_F(BookmarkBarControllerTest, DisplaysImportBookmarksButtonOnEmpty) {
|
| - BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + EXPECT_FALSE([[[bar_ buttonView] noItemContainer] isHidden]);
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, HidesHelpMessageWithBookmark) {
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| +
|
| + const BookmarkNode* parent = model->bookmark_bar_node();
|
| + model->AddURL(parent, parent->child_count(),
|
| + ASCIIToUTF16("title"), GURL("http://one.com"));
|
| +
|
| [bar_ loaded:model];
|
| - EXPECT_FALSE([[[bar_ buttonView] importBookmarksButton] isHidden]);
|
| + EXPECT_TRUE([[[bar_ buttonView] noItemContainer] isHidden]);
|
| }
|
|
|
| TEST_F(BookmarkBarControllerTest, BookmarkButtonSizing) {
|
| @@ -1509,7 +1271,7 @@
|
| TEST_F(BookmarkBarControllerTest, OffTheSideFolder) {
|
|
|
| // It starts hidden.
|
| - EXPECT_TRUE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_TRUE([bar_ offTheSideButtonIsHidden]);
|
|
|
| // Create some buttons.
|
| BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| @@ -1527,7 +1289,7 @@
|
| GURL("http://framma-lamma.com"));
|
|
|
| // Should no longer be hidden.
|
| - EXPECT_FALSE([[bar_ offTheSideButton] isHidden]);
|
| + EXPECT_FALSE([bar_ offTheSideButtonIsHidden]);
|
|
|
| // Open it; make sure we have a folder controller.
|
| EXPECT_FALSE([bar_ folderController]);
|
| @@ -1666,6 +1428,258 @@
|
| EXPECT_FALSE([bar_ isAnimationRunning]);
|
| }
|
|
|
| +TEST_F(BookmarkBarControllerTest, MoveRemoveAddButtons) {
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + const BookmarkNode* root = model->bookmark_bar_node();
|
| + const std::string model_string("1b 2f:[ 2f1b 2f2b ] 3b ");
|
| + bookmarks::test::AddNodesFromModelString(model, root, model_string);
|
| +
|
| + // Validate initial model.
|
| + std::string actualModelString = bookmarks::test::ModelStringFromNode(root);
|
| + EXPECT_EQ(model_string, actualModelString);
|
| +
|
| + // Remember how many buttons are showing.
|
| + int oldDisplayedButtons = [bar_ displayedButtonCount];
|
| + NSArray* buttons = [bar_ buttons];
|
| +
|
| + // Move a button around a bit.
|
| + [bar_ moveButtonFromIndex:0 toIndex:2];
|
| + EXPECT_NSEQ(@"2f", [[buttons objectAtIndex:0] title]);
|
| + EXPECT_NSEQ(@"3b", [[buttons objectAtIndex:1] title]);
|
| + EXPECT_NSEQ(@"1b", [[buttons objectAtIndex:2] title]);
|
| + EXPECT_EQ(oldDisplayedButtons, [bar_ displayedButtonCount]);
|
| + [bar_ moveButtonFromIndex:2 toIndex:0];
|
| + EXPECT_NSEQ(@"1b", [[buttons objectAtIndex:0] title]);
|
| + EXPECT_NSEQ(@"2f", [[buttons objectAtIndex:1] title]);
|
| + EXPECT_NSEQ(@"3b", [[buttons objectAtIndex:2] title]);
|
| + EXPECT_EQ(oldDisplayedButtons, [bar_ displayedButtonCount]);
|
| +
|
| + // Add a couple of buttons.
|
| + const BookmarkNode* parent = root->GetChild(1); // Purloin an existing node.
|
| + const BookmarkNode* node = parent->GetChild(0);
|
| + [bar_ addButtonForNode:node atIndex:0];
|
| + EXPECT_NSEQ(@"2f1b", [[buttons objectAtIndex:0] title]);
|
| + EXPECT_NSEQ(@"1b", [[buttons objectAtIndex:1] title]);
|
| + EXPECT_NSEQ(@"2f", [[buttons objectAtIndex:2] title]);
|
| + EXPECT_NSEQ(@"3b", [[buttons objectAtIndex:3] title]);
|
| + EXPECT_EQ(oldDisplayedButtons + 1, [bar_ displayedButtonCount]);
|
| + node = parent->GetChild(1);
|
| + [bar_ addButtonForNode:node atIndex:-1];
|
| + EXPECT_NSEQ(@"2f1b", [[buttons objectAtIndex:0] title]);
|
| + EXPECT_NSEQ(@"1b", [[buttons objectAtIndex:1] title]);
|
| + EXPECT_NSEQ(@"2f", [[buttons objectAtIndex:2] title]);
|
| + EXPECT_NSEQ(@"3b", [[buttons objectAtIndex:3] title]);
|
| + EXPECT_NSEQ(@"2f2b", [[buttons objectAtIndex:4] title]);
|
| + EXPECT_EQ(oldDisplayedButtons + 2, [bar_ displayedButtonCount]);
|
| +
|
| + // Remove a couple of buttons.
|
| + [bar_ removeButton:4 animate:NO];
|
| + [bar_ removeButton:1 animate:NO];
|
| + EXPECT_NSEQ(@"2f1b", [[buttons objectAtIndex:0] title]);
|
| + EXPECT_NSEQ(@"2f", [[buttons objectAtIndex:1] title]);
|
| + EXPECT_NSEQ(@"3b", [[buttons objectAtIndex:2] title]);
|
| + EXPECT_EQ(oldDisplayedButtons, [bar_ displayedButtonCount]);
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, ShrinkOrHideView) {
|
| + NSRect viewFrame = NSMakeRect(0.0, 0.0, 500.0, 50.0);
|
| + NSView* view = [[[NSView alloc] initWithFrame:viewFrame] autorelease];
|
| + EXPECT_FALSE([view isHidden]);
|
| + [bar_ shrinkOrHideView:view forMaxX:500.0];
|
| + EXPECT_EQ(500.0, NSWidth([view frame]));
|
| + EXPECT_FALSE([view isHidden]);
|
| + [bar_ shrinkOrHideView:view forMaxX:450.0];
|
| + EXPECT_EQ(450.0, NSWidth([view frame]));
|
| + EXPECT_FALSE([view isHidden]);
|
| + [bar_ shrinkOrHideView:view forMaxX:40.0];
|
| + EXPECT_EQ(40.0, NSWidth([view frame]));
|
| + EXPECT_FALSE([view isHidden]);
|
| + [bar_ shrinkOrHideView:view forMaxX:31.0];
|
| + EXPECT_EQ(31.0, NSWidth([view frame]));
|
| + EXPECT_FALSE([view isHidden]);
|
| + [bar_ shrinkOrHideView:view forMaxX:29.0];
|
| + EXPECT_TRUE([view isHidden]);
|
| +}
|
| +
|
| +// Simulate coarse browser window width change and ensure that the bookmark
|
| +// buttons that should be visible are visible.
|
| +TEST_F(BookmarkBarControllerTest, RedistributeButtonsOnBarAsNeeded) {
|
| + // Hide the apps shortcut.
|
| + profile()->GetPrefs()->SetBoolean(
|
| + bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| + ASSERT_TRUE([bar_ appsPageShortcutButtonIsHidden]);
|
| +
|
| + // Add three buttons to the bookmark bar.
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + const BookmarkNode* root = model->bookmark_bar_node();
|
| + // Make long labels to test coarse resizes. After 16 digits, text eliding
|
| + // starts.
|
| + const std::string model_string(
|
| + "0000000000000000 1111111111111111 2222222222222222 ");
|
| + bookmarks::test::AddNodesFromModelString(model, root, model_string);
|
| + NSRect frame = [[bar_ view] frame];
|
| + frame.size.width = 400; // Typical minimum browser size.
|
| + [[bar_ view] setFrame:frame];
|
| + EXPECT_EQ(2, [bar_ displayedButtonCount]);
|
| +
|
| + {
|
| + base::mac::ScopedNSAutoreleasePool pool;
|
| + frame.size.width = 800;
|
| + [[bar_ view] setFrame:frame];
|
| + EXPECT_EQ(3, [bar_ displayedButtonCount]);
|
| +
|
| + const BookmarkNode* last = model->bookmark_bar_node()->GetChild(2);
|
| + EXPECT_TRUE(last);
|
| + [bar_ startPulsingBookmarkNode:last];
|
| +
|
| + frame.size.width = 400;
|
| + [[bar_ view] setFrame:frame];
|
| + EXPECT_EQ(2, [bar_ displayedButtonCount]);
|
| + }
|
| +
|
| + // Regression test for http://crbug.com/616051.
|
| + [bar_ stopPulsingBookmarkNode];
|
| +}
|
| +
|
| +// Simiulate browser window width change and ensure that the bookmark buttons
|
| +// that should be visible are visible.
|
| +// Appears to fail on Mac 10.11 bot on the waterfall; http://crbug.com/612640.
|
| +TEST_F(BookmarkBarControllerTest, DISABLED_LastBookmarkResizeBehavior) {
|
| + // Hide the apps shortcut.
|
| + profile()->GetPrefs()->SetBoolean(
|
| + bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| + ASSERT_TRUE([bar_ appsPageShortcutButtonIsHidden]);
|
| +
|
| + // Add three buttons to the bookmark bar.
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + const BookmarkNode* root = model->bookmark_bar_node();
|
| + const std::string model_string("1b 2f:[ 2f1b 2f2b ] 3b ");
|
| + bookmarks::test::AddNodesFromModelString(model, root, model_string);
|
| + [bar_ frameDidChange];
|
| +
|
| + // Step through simulated window resizings. In resizing from the first width
|
| + // to the second, the bookmark bar should transition from displaying one
|
| + // button to two. Of the next 5 widths, the third transitions the bar from
|
| + // displaying two buttons to three. The next width (200.0) resizes the bar to
|
| + // a large width that does not change the number of visible buttons, and the
|
| + // remaining widths step through all the previous resizings in reverse, which
|
| + // should correspond to the previous number of visible buttons.
|
| + //
|
| + // To recalibrate this test for new OS releases, etc., determine values for
|
| + // |view_widths[1]| and |view_widths[4]| which will cause a visible button
|
| + // transition from 1 -> 2 and 2 -> 3, respectively. With those two widths you
|
| + // can easily compute all widths from 0 through 6. |view_widths[7]| is always
|
| + // 200.0, and the remainder are the reverse of widths 0 through 6. When all
|
| + // three buttons are visible, be sure to sanity check with frames (i.e. under
|
| + // MD the first button should start at x=10, and there should be 16pt of space
|
| + // between the buttons).
|
| + //
|
| + // The default font changed between OSX Mavericks, OSX Yosemite, and
|
| + // OSX El Capitan, so this test requires different widths to trigger the
|
| + // appropriate results.
|
| + CGFloat view_widths_el_capitan[] =
|
| + { 139.0, 140.0, 150.0, 151.0, 152.0, 153.0,
|
| + 154.0, 200.0, 154.0, 153.0, 152.0, 151.0,
|
| + 150.0, 140.0, 139.0 };
|
| + CGFloat view_widths_yosemite[] =
|
| + { 140.0, 141.0, 150.0, 151.0, 152.0, 153.0,
|
| + 154.0, 200.0, 154.0, 153.0, 152.0, 151.0,
|
| + 150.0, 141.0, 140.0 };
|
| + CGFloat view_widths_rest[] =
|
| + { 142.0, 143.0, 153.0, 154.0, 155.0, 156.0,
|
| + 157.0, 200.0, 157.0, 156.0, 155.0, 154.0,
|
| + 153.0, 143.0, 142.0 };
|
| + CGFloat* view_widths = NULL;
|
| + if (base::mac::IsOS10_11()) {
|
| + view_widths = view_widths_el_capitan;
|
| + } else if (base::mac::IsOS10_10()) {
|
| + view_widths = view_widths_yosemite;
|
| + } else {
|
| + view_widths = view_widths_rest;
|
| + }
|
| +
|
| + BOOL off_the_side_button_is_hidden_results[] =
|
| + { NO, NO, NO, NO, YES, YES, YES, YES, YES, YES, YES, NO, NO, NO, NO};
|
| + int displayed_button_count_results[] =
|
| + { 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1 };
|
| + for (unsigned int i = 0; i < arraysize(view_widths_yosemite); ++i) {
|
| + NSRect frame = [[bar_ view] frame];
|
| + frame.size.width = view_widths[i] + bookmarks::kBookmarkRightMargin;
|
| + [[bar_ view] setFrame:frame];
|
| + EXPECT_EQ(off_the_side_button_is_hidden_results[i],
|
| + [bar_ offTheSideButtonIsHidden]);
|
| + EXPECT_EQ(displayed_button_count_results[i], [bar_ displayedButtonCount]);
|
| + }
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, BookmarksWithAppsPageShortcut) {
|
| + BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
|
| + const BookmarkNode* root = model->bookmark_bar_node();
|
| + const std::string model_string("1b 2f:[ 2f1b 2f2b ] 3b ");
|
| + bookmarks::test::AddNodesFromModelString(model, root, model_string);
|
| + [bar_ frameDidChange];
|
| +
|
| + // Apps page shortcut button should be visible.
|
| + ASSERT_FALSE([bar_ appsPageShortcutButtonIsHidden]);
|
| +
|
| + // Bookmarks should be to the right of the Apps page shortcut button.
|
| + CGFloat apps_button_right = NSMaxX([[bar_ appsPageShortcutButton] frame]);
|
| + CGFloat right = apps_button_right;
|
| + NSArray* buttons = [bar_ buttons];
|
| + for (size_t i = 0; i < [buttons count]; ++i) {
|
| + EXPECT_LE(right, NSMinX([[buttons objectAtIndex:i] frame]));
|
| + right = NSMaxX([[buttons objectAtIndex:i] frame]);
|
| + }
|
| +
|
| + // Removing the Apps button should move every bookmark to the left.
|
| + profile()->GetPrefs()->SetBoolean(
|
| + bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| + ASSERT_TRUE([bar_ appsPageShortcutButtonIsHidden]);
|
| + EXPECT_GT(apps_button_right, NSMinX([[buttons objectAtIndex:0] frame]));
|
| + for (size_t i = 1; i < [buttons count]; ++i) {
|
| + EXPECT_LE(NSMaxX([[buttons objectAtIndex:i - 1] frame]),
|
| + NSMinX([[buttons objectAtIndex:i] frame]));
|
| + }
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, BookmarksWithoutAppsPageShortcut) {
|
| + // The no item containers should be to the right of the Apps button.
|
| + ASSERT_FALSE([bar_ appsPageShortcutButtonIsHidden]);
|
| + CGFloat apps_button_right = NSMaxX([[bar_ appsPageShortcutButton] frame]);
|
| + EXPECT_LE(apps_button_right,
|
| + NSMinX([[[bar_ buttonView] noItemTextfield] frame]));
|
| + EXPECT_LE(NSMaxX([[[bar_ buttonView] noItemTextfield] frame]),
|
| + NSMinX([[[bar_ buttonView] importBookmarksButton] frame]));
|
| +
|
| + // Removing the Apps button should move the no item containers to the left.
|
| + profile()->GetPrefs()->SetBoolean(
|
| + bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| + ASSERT_TRUE([bar_ appsPageShortcutButtonIsHidden]);
|
| + EXPECT_GT(apps_button_right,
|
| + NSMinX([[[bar_ buttonView] noItemTextfield] frame]));
|
| + EXPECT_LE(NSMaxX([[[bar_ buttonView] noItemTextfield] frame]),
|
| + NSMinX([[[bar_ buttonView] importBookmarksButton] frame]));
|
| +}
|
| +
|
| +TEST_F(BookmarkBarControllerTest, ManagedShowAppsShortcutInBookmarksBar) {
|
| + // By default the pref is not managed and the apps shortcut is shown.
|
| + sync_preferences::TestingPrefServiceSyncable* prefs =
|
| + profile()->GetTestingPrefService();
|
| + EXPECT_FALSE(prefs->IsManagedPreference(
|
| + bookmarks::prefs::kShowAppsShortcutInBookmarkBar));
|
| + EXPECT_FALSE([bar_ appsPageShortcutButtonIsHidden]);
|
| +
|
| + // Hide the apps shortcut by policy, via the managed pref.
|
| + prefs->SetManagedPref(bookmarks::prefs::kShowAppsShortcutInBookmarkBar,
|
| + base::MakeUnique<base::Value>(false));
|
| + EXPECT_TRUE([bar_ appsPageShortcutButtonIsHidden]);
|
| +
|
| + // And try showing it via policy too.
|
| + prefs->SetManagedPref(bookmarks::prefs::kShowAppsShortcutInBookmarkBar,
|
| + base::MakeUnique<base::Value>(true));
|
| + EXPECT_FALSE([bar_ appsPageShortcutButtonIsHidden]);
|
| +}
|
| +
|
| class BookmarkBarControllerOpenAllTest : public BookmarkBarControllerTest {
|
| public:
|
| void SetUp() override {
|
| @@ -1749,7 +1763,7 @@
|
| initialWidth:NSWidth(parent_frame)
|
| delegate:nil]);
|
|
|
| - // Loads the view
|
| + // Forces loading of the nib.
|
| [[bar_ controlledView] setResizeDelegate:resizeDelegate_];
|
| // Awkwardness to look like we've been installed.
|
| [parent_view_ addSubview:[bar_ view]];
|
| @@ -1827,13 +1841,13 @@
|
| std::string actualModelString = bookmarks::test::ModelStringFromNode(root);
|
| EXPECT_EQ(model_string, actualModelString);
|
|
|
| - // Ensure that the off-the-side button is showing.
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - ASSERT_TRUE(layout.IsOffTheSideButtonVisible());
|
| + // Insure that the off-the-side is not showing.
|
| + ASSERT_FALSE([bar_ offTheSideButtonIsHidden]);
|
|
|
| // Remember how many buttons are showing and are available.
|
| - int oldDisplayedButtons = layout.VisibleButtonCount();
|
| + int oldDisplayedButtons = [bar_ displayedButtonCount];
|
| int oldChildCount = root->child_count();
|
| +
|
| // Pop up the off-the-side menu.
|
| BookmarkButton* otsButton = (BookmarkButton*)[bar_ offTheSideButton];
|
| ASSERT_TRUE(otsButton);
|
| @@ -1853,19 +1867,11 @@
|
| [otsController dragButton:draggedButton
|
| to:[targetButton center]
|
| copy:YES];
|
| - // Close
|
| - [[otsButton target] performSelector:@selector(openOffTheSideFolderFromButton:)
|
| - withObject:otsButton];
|
| - // Open
|
| - [[otsButton target] performSelector:@selector(openOffTheSideFolderFromButton:)
|
| - withObject:otsButton];
|
| -
|
| // There should still be the same number of buttons in the bar
|
| // and off-the-side should have one more.
|
| - layout = [bar_ layoutFromCurrentState];
|
| - int newDisplayedButtons = layout.VisibleButtonCount();
|
| + int newDisplayedButtons = [bar_ displayedButtonCount];
|
| int newChildCount = root->child_count();
|
| - int newOTSCount = (int)[[[bar_ folderController] buttons] count];
|
| + int newOTSCount = (int)[[otsController buttons] count];
|
| EXPECT_EQ(oldDisplayedButtons, newDisplayedButtons);
|
| EXPECT_EQ(oldChildCount + 1, newChildCount);
|
| EXPECT_EQ(oldOTSCount + 1, newOTSCount);
|
| @@ -1893,12 +1899,11 @@
|
| std::string actualOtherString = bookmarks::test::ModelStringFromNode(other);
|
| EXPECT_EQ(other_string, actualOtherString);
|
|
|
| - // Ensure that the off-the-side button is showing.
|
| - bookmarks::BookmarkBarLayout layout = [bar_ layoutFromCurrentState];
|
| - ASSERT_TRUE(layout.IsOffTheSideButtonVisible());
|
| + // Insure that the off-the-side is showing.
|
| + ASSERT_FALSE([bar_ offTheSideButtonIsHidden]);
|
|
|
| // Remember how many buttons are showing and are available.
|
| - int oldDisplayedButtons = layout.VisibleButtonCount();
|
| + int oldDisplayedButtons = [bar_ displayedButtonCount];
|
| int oldRootCount = root->child_count();
|
| int oldOtherCount = other->child_count();
|
|
|
| @@ -2047,7 +2052,7 @@
|
| // Hide the apps shortcut.
|
| profile()->GetPrefs()->SetBoolean(
|
| bookmarks::prefs::kShowAppsShortcutInBookmarkBar, false);
|
| - ASSERT_TRUE([[bar_ appsPageShortcutButton] isHidden]);
|
| + ASSERT_TRUE([bar_ appsPageShortcutButtonIsHidden]);
|
|
|
| // Validate initial model.
|
| std::string actualModel = bookmarks::test::ModelStringFromNode(root);
|
|
|