diff options
Diffstat (limited to 'chrome/browser/cocoa/history_menu_bridge_unittest.mm')
-rw-r--r-- | chrome/browser/cocoa/history_menu_bridge_unittest.mm | 386 |
1 files changed, 0 insertions, 386 deletions
diff --git a/chrome/browser/cocoa/history_menu_bridge_unittest.mm b/chrome/browser/cocoa/history_menu_bridge_unittest.mm deleted file mode 100644 index c0d109b..0000000 --- a/chrome/browser/cocoa/history_menu_bridge_unittest.mm +++ /dev/null @@ -1,386 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <Cocoa/Cocoa.h> -#include <vector> - -#include "base/ref_counted_memory.h" -#include "base/string_util.h" -#include "base/sys_string_conversions.h" -#include "base/utf_string_conversions.h" -#include "chrome/app/chrome_command_ids.h" -#include "chrome/browser/cancelable_request.h" -#include "chrome/browser/cocoa/browser_test_helper.h" -#include "chrome/browser/cocoa/cocoa_test_helper.h" -#include "chrome/browser/cocoa/history_menu_bridge.h" -#include "chrome/browser/sessions/tab_restore_service.h" -#include "chrome/browser/ui/browser.h" -#include "gfx/codec/png_codec.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" - -namespace { - -class MockTRS : public TabRestoreService { - public: - MockTRS(Profile* profile) : TabRestoreService(profile, NULL) {} - MOCK_CONST_METHOD0(entries, const TabRestoreService::Entries&()); -}; - -class MockBridge : public HistoryMenuBridge { - public: - MockBridge(Profile* profile) - : HistoryMenuBridge(profile), - menu_([[NSMenu alloc] initWithTitle:@"History"]) {} - - virtual NSMenu* HistoryMenu() { - return menu_.get(); - } - - private: - scoped_nsobject<NSMenu> menu_; -}; - -class HistoryMenuBridgeTest : public CocoaTest { - public: - - virtual void SetUp() { - CocoaTest::SetUp(); - browser_test_helper_.profile()->CreateFaviconService(); - bridge_.reset(new MockBridge(browser_test_helper_.profile())); - } - - // We are a friend of HistoryMenuBridge (and have access to - // protected methods), but none of the classes generated by TEST_F() - // are. Wraps common commands. - void ClearMenuSection(NSMenu* menu, - NSInteger tag) { - bridge_->ClearMenuSection(menu, tag); - } - - void AddItemToBridgeMenu(HistoryMenuBridge::HistoryItem* item, - NSMenu* menu, - NSInteger tag, - NSInteger index) { - bridge_->AddItemToMenu(item, menu, tag, index); - } - - NSMenuItem* AddItemToMenu(NSMenu* menu, - NSString* title, - SEL selector, - int tag) { - NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:title action:NULL - keyEquivalent:@""] autorelease]; - [item setTag:tag]; - if (selector) { - [item setAction:selector]; - [item setTarget:bridge_->controller_.get()]; - } - [menu addItem:item]; - return item; - } - - HistoryMenuBridge::HistoryItem* CreateItem(const string16& title) { - HistoryMenuBridge::HistoryItem* item = - new HistoryMenuBridge::HistoryItem(); - item->title = title; - item->url = GURL(title); - return item; - } - - MockTRS::Tab CreateSessionTab(const GURL& url, const string16& title) { - MockTRS::Tab tab; - tab.current_navigation_index = 0; - tab.navigations.push_back( - TabNavigation(0, url, GURL(), title, std::string(), - PageTransition::LINK)); - return tab; - } - - void GetFaviconForHistoryItem(HistoryMenuBridge::HistoryItem* item) { - bridge_->GetFaviconForHistoryItem(item); - } - - void GotFaviconData(FaviconService::Handle handle, - bool know_favicon, - scoped_refptr<RefCountedBytes> data, - bool expired, - GURL url) { - bridge_->GotFaviconData(handle, know_favicon, data, expired, url); - } - - CancelableRequestConsumerTSimple<HistoryMenuBridge::HistoryItem*>& - favicon_consumer() { - return bridge_->favicon_consumer_; - } - - BrowserTestHelper browser_test_helper_; - scoped_ptr<MockBridge> bridge_; -}; - -// Edge case test for clearing until the end of a menu. -TEST_F(HistoryMenuBridgeTest, ClearHistoryMenuUntilEnd) { - NSMenu* menu = [[[NSMenu alloc] initWithTitle:@"history foo"] autorelease]; - AddItemToMenu(menu, @"HEADER", NULL, HistoryMenuBridge::kMostVisitedTitle); - - NSInteger tag = HistoryMenuBridge::kMostVisited; - AddItemToMenu(menu, @"alpha", @selector(openHistoryMenuItem:), tag); - AddItemToMenu(menu, @"bravo", @selector(openHistoryMenuItem:), tag); - AddItemToMenu(menu, @"charlie", @selector(openHistoryMenuItem:), tag); - AddItemToMenu(menu, @"delta", @selector(openHistoryMenuItem:), tag); - - ClearMenuSection(menu, HistoryMenuBridge::kMostVisited); - - EXPECT_EQ(1, [menu numberOfItems]); - EXPECT_NSEQ(@"HEADER", - [[menu itemWithTag:HistoryMenuBridge::kMostVisitedTitle] title]); -} - -// Skip menu items that are not hooked up to |-openHistoryMenuItem:|. -TEST_F(HistoryMenuBridgeTest, ClearHistoryMenuSkipping) { - NSMenu* menu = [[[NSMenu alloc] initWithTitle:@"history foo"] autorelease]; - AddItemToMenu(menu, @"HEADER", NULL, HistoryMenuBridge::kMostVisitedTitle); - - NSInteger tag = HistoryMenuBridge::kMostVisited; - AddItemToMenu(menu, @"alpha", @selector(openHistoryMenuItem:), tag); - AddItemToMenu(menu, @"bravo", @selector(openHistoryMenuItem:), tag); - AddItemToMenu(menu, @"TITLE", NULL, HistoryMenuBridge::kRecentlyClosedTitle); - AddItemToMenu(menu, @"charlie", @selector(openHistoryMenuItem:), tag); - - ClearMenuSection(menu, tag); - - EXPECT_EQ(2, [menu numberOfItems]); - EXPECT_NSEQ(@"HEADER", - [[menu itemWithTag:HistoryMenuBridge::kMostVisitedTitle] title]); - EXPECT_NSEQ(@"TITLE", - [[menu itemAtIndex:1] title]); -} - -// Edge case test for clearing an empty menu. -TEST_F(HistoryMenuBridgeTest, ClearHistoryMenuEmpty) { - NSMenu* menu = [[[NSMenu alloc] initWithTitle:@"history foo"] autorelease]; - AddItemToMenu(menu, @"HEADER", NULL, HistoryMenuBridge::kMostVisited); - - ClearMenuSection(menu, HistoryMenuBridge::kMostVisited); - - EXPECT_EQ(1, [menu numberOfItems]); - EXPECT_NSEQ(@"HEADER", - [[menu itemWithTag:HistoryMenuBridge::kMostVisited] title]); -} - -// Test that AddItemToMenu() properly adds HistoryItem objects as menus. -TEST_F(HistoryMenuBridgeTest, AddItemToMenu) { - NSMenu* menu = [[[NSMenu alloc] initWithTitle:@"history foo"] autorelease]; - - const string16 short_url = ASCIIToUTF16("http://foo/"); - const string16 long_url = ASCIIToUTF16("http://super-duper-long-url--." - "that.cannot.possibly.fit.even-in-80-columns" - "or.be.reasonably-displayed-in-a-menu" - "without.looking-ridiculous.com/"); // 140 chars total - - // HistoryItems are owned by the HistoryMenuBridge when AddItemToBridgeMenu() - // is called, which places them into the |menu_item_map_|, which owns them. - HistoryMenuBridge::HistoryItem* item1 = CreateItem(short_url); - AddItemToBridgeMenu(item1, menu, 100, 0); - - HistoryMenuBridge::HistoryItem* item2 = CreateItem(long_url); - AddItemToBridgeMenu(item2, menu, 101, 1); - - EXPECT_EQ(2, [menu numberOfItems]); - - EXPECT_EQ(@selector(openHistoryMenuItem:), [[menu itemAtIndex:0] action]); - EXPECT_EQ(@selector(openHistoryMenuItem:), [[menu itemAtIndex:1] action]); - - EXPECT_EQ(100, [[menu itemAtIndex:0] tag]); - EXPECT_EQ(101, [[menu itemAtIndex:1] tag]); - - // Make sure a short title looks fine - NSString* s = [[menu itemAtIndex:0] title]; - EXPECT_EQ(base::SysNSStringToUTF16(s), short_url); - - // Make sure a super-long title gets trimmed - s = [[menu itemAtIndex:0] title]; - EXPECT_TRUE([s length] < long_url.length()); - - // Confirm tooltips and confirm they are not trimmed (like the item - // name might be). Add tolerance for URL fixer-upping; - // e.g. http://foo becomes http://foo/) - EXPECT_GE([[[menu itemAtIndex:0] toolTip] length], (2*short_url.length()-5)); - EXPECT_GE([[[menu itemAtIndex:1] toolTip] length], (2*long_url.length()-5)); -} - -// Test that the menu is created for a set of simple tabs. -TEST_F(HistoryMenuBridgeTest, RecentlyClosedTabs) { - scoped_refptr<MockTRS> trs(new MockTRS(browser_test_helper_.profile())); - MockTRS::Entries entries; - - MockTRS::Tab tab1 = CreateSessionTab(GURL("http://google.com"), - ASCIIToUTF16("Google")); - tab1.id = 24; - entries.push_back(&tab1); - - MockTRS::Tab tab2 = CreateSessionTab(GURL("http://apple.com"), - ASCIIToUTF16("Apple")); - tab2.id = 42; - entries.push_back(&tab2); - - using ::testing::ReturnRef; - EXPECT_CALL(*trs.get(), entries()).WillOnce(ReturnRef(entries)); - - bridge_->TabRestoreServiceChanged(trs.get()); - - NSMenu* menu = bridge_->HistoryMenu(); - ASSERT_EQ(2U, [[menu itemArray] count]); - - NSMenuItem* item1 = [menu itemAtIndex:0]; - MockBridge::HistoryItem* hist1 = bridge_->HistoryItemForMenuItem(item1); - EXPECT_TRUE(hist1); - EXPECT_EQ(24, hist1->session_id); - EXPECT_NSEQ(@"Google", [item1 title]); - - NSMenuItem* item2 = [menu itemAtIndex:1]; - MockBridge::HistoryItem* hist2 = bridge_->HistoryItemForMenuItem(item2); - EXPECT_TRUE(hist2); - EXPECT_EQ(42, hist2->session_id); - EXPECT_NSEQ(@"Apple", [item2 title]); -} - -// Test that the menu is created for a mix of windows and tabs. -TEST_F(HistoryMenuBridgeTest, RecentlyClosedTabsAndWindows) { - scoped_refptr<MockTRS> trs(new MockTRS(browser_test_helper_.profile())); - MockTRS::Entries entries; - - MockTRS::Tab tab1 = CreateSessionTab(GURL("http://google.com"), - ASCIIToUTF16("Google")); - tab1.id = 24; - entries.push_back(&tab1); - - MockTRS::Window win1; - win1.id = 30; - win1.tabs.push_back( - CreateSessionTab(GURL("http://foo.com"), ASCIIToUTF16("foo"))); - win1.tabs[0].id = 31; - win1.tabs.push_back( - CreateSessionTab(GURL("http://bar.com"), ASCIIToUTF16("bar"))); - win1.tabs[1].id = 32; - entries.push_back(&win1); - - MockTRS::Tab tab2 = CreateSessionTab(GURL("http://apple.com"), - ASCIIToUTF16("Apple")); - tab2.id = 42; - entries.push_back(&tab2); - - MockTRS::Window win2; - win2.id = 50; - win2.tabs.push_back( - CreateSessionTab(GURL("http://magic.com"), ASCIIToUTF16("magic"))); - win2.tabs[0].id = 51; - win2.tabs.push_back( - CreateSessionTab(GURL("http://goats.com"), ASCIIToUTF16("goats"))); - win2.tabs[1].id = 52; - win2.tabs.push_back( - CreateSessionTab(GURL("http://teleporter.com"), - ASCIIToUTF16("teleporter"))); - win2.tabs[1].id = 53; - entries.push_back(&win2); - - using ::testing::ReturnRef; - EXPECT_CALL(*trs.get(), entries()).WillOnce(ReturnRef(entries)); - - bridge_->TabRestoreServiceChanged(trs.get()); - - NSMenu* menu = bridge_->HistoryMenu(); - ASSERT_EQ(4U, [[menu itemArray] count]); - - NSMenuItem* item1 = [menu itemAtIndex:0]; - MockBridge::HistoryItem* hist1 = bridge_->HistoryItemForMenuItem(item1); - EXPECT_TRUE(hist1); - EXPECT_EQ(24, hist1->session_id); - EXPECT_NSEQ(@"Google", [item1 title]); - - NSMenuItem* item2 = [menu itemAtIndex:1]; - MockBridge::HistoryItem* hist2 = bridge_->HistoryItemForMenuItem(item2); - EXPECT_TRUE(hist2); - EXPECT_EQ(30, hist2->session_id); - EXPECT_EQ(2U, hist2->tabs.size()); - // Do not test menu item title because it is localized. - NSMenu* submenu1 = [item2 submenu]; - EXPECT_EQ(4U, [[submenu1 itemArray] count]); - // Do not test Restore All Tabs because it is localiced. - EXPECT_TRUE([[submenu1 itemAtIndex:1] isSeparatorItem]); - EXPECT_NSEQ(@"foo", [[submenu1 itemAtIndex:2] title]); - EXPECT_NSEQ(@"bar", [[submenu1 itemAtIndex:3] title]); - - NSMenuItem* item3 = [menu itemAtIndex:2]; - MockBridge::HistoryItem* hist3 = bridge_->HistoryItemForMenuItem(item3); - EXPECT_TRUE(hist3); - EXPECT_EQ(42, hist3->session_id); - EXPECT_NSEQ(@"Apple", [item3 title]); - - NSMenuItem* item4 = [menu itemAtIndex:3]; - MockBridge::HistoryItem* hist4 = bridge_->HistoryItemForMenuItem(item4); - EXPECT_TRUE(hist4); - EXPECT_EQ(50, hist4->session_id); - EXPECT_EQ(3U, hist4->tabs.size()); - // Do not test menu item title because it is localized. - NSMenu* submenu2 = [item4 submenu]; - EXPECT_EQ(5U, [[submenu2 itemArray] count]); - // Do not test Restore All Tabs because it is localiced. - EXPECT_TRUE([[submenu2 itemAtIndex:1] isSeparatorItem]); - EXPECT_NSEQ(@"magic", [[submenu2 itemAtIndex:2] title]); - EXPECT_NSEQ(@"goats", [[submenu2 itemAtIndex:3] title]); - EXPECT_NSEQ(@"teleporter", [[submenu2 itemAtIndex:4] title]); -} - -// Tests that we properly request an icon from the FaviconService. -TEST_F(HistoryMenuBridgeTest, GetFaviconForHistoryItem) { - // Create a fake item. - HistoryMenuBridge::HistoryItem item; - item.title = ASCIIToUTF16("Title"); - item.url = GURL("http://google.com"); - - // Request the icon. - GetFaviconForHistoryItem(&item); - - // Make sure that there is ClientData for the request. - std::vector<HistoryMenuBridge::HistoryItem*> data; - favicon_consumer().GetAllClientData(&data); - ASSERT_EQ(data.size(), 1U); - EXPECT_EQ(&item, data[0]); - - // Make sure the item was modified properly. - EXPECT_TRUE(item.icon_requested); - EXPECT_GT(item.icon_handle, 0); -} - -TEST_F(HistoryMenuBridgeTest, GotFaviconData) { - // Create a dummy bitmap. - SkBitmap bitmap; - bitmap.setConfig(SkBitmap::kARGB_8888_Config, 25, 25); - bitmap.allocPixels(); - bitmap.eraseRGB(255, 0, 0); - - // Convert it to raw PNG bytes. We totally ignore color order here because - // we just want to test the roundtrip through the Bridge, not that we can - // make icons look pretty. - std::vector<unsigned char> raw; - gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &raw); - scoped_refptr<RefCountedBytes> bytes(new RefCountedBytes(raw)); - - // Set up the HistoryItem. - HistoryMenuBridge::HistoryItem item; - item.menu_item.reset([[NSMenuItem alloc] init]); - GetFaviconForHistoryItem(&item); - - // Pretend to be called back. - GotFaviconData(item.icon_handle, true, bytes, false, GURL()); - - // Make sure the callback works. - EXPECT_FALSE(item.icon_requested); - EXPECT_TRUE(item.icon.get()); - EXPECT_TRUE([item.menu_item image]); -} - -} // namespace |