| // Copyright (c) 2012 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. |
| |
| #include "base/bind.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/timer/timer.h" |
| #include "chrome/app/chrome_command_ids.h" |
| #include "chrome/browser/bookmarks/bookmark_model.h" |
| #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| #include "chrome/browser/bookmarks/bookmark_test_helpers.h" |
| #include "chrome/browser/bookmarks/bookmark_utils.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/browser/ui/host_desktop.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/test/browser_test_utils.h" |
| |
| namespace { |
| const char kPersistBookmarkURL[] = "http://www.cnn.com/"; |
| const char kPersistBookmarkTitle[] = "CNN"; |
| } |
| |
| class BookmarkBrowsertest : public InProcessBrowserTest { |
| public: |
| BookmarkBrowsertest() {} |
| |
| bool IsVisible() { |
| return browser()->bookmark_bar_state() == BookmarkBar::SHOW; |
| } |
| |
| static void CheckAnimation(Browser* browser, const base::Closure& quit_task) { |
| if (!browser->window()->IsBookmarkBarAnimating()) |
| quit_task.Run(); |
| } |
| |
| base::TimeDelta WaitForBookmarkBarAnimationToFinish() { |
| base::Time start(base::Time::Now()); |
| scoped_refptr<content::MessageLoopRunner> runner = |
| new content::MessageLoopRunner; |
| |
| base::Timer timer(false, true); |
| timer.Start( |
| FROM_HERE, |
| base::TimeDelta::FromMilliseconds(15), |
| base::Bind(&CheckAnimation, browser(), runner->QuitClosure())); |
| runner->Run(); |
| return base::Time::Now() - start; |
| } |
| |
| BookmarkModel* WaitForBookmarkModel(Profile* profile) { |
| BookmarkModel* bookmark_model = |
| BookmarkModelFactory::GetForProfile(profile); |
| test::WaitForBookmarkModelToLoad(bookmark_model); |
| return bookmark_model; |
| } |
| }; |
| |
| // Test of bookmark bar toggling, visibility, and animation. |
| IN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, BookmarkBarVisibleWait) { |
| ASSERT_FALSE(IsVisible()); |
| chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); |
| base::TimeDelta delay = WaitForBookmarkBarAnimationToFinish(); |
| LOG(INFO) << "Took " << delay.InMilliseconds() << " ms to show bookmark bar"; |
| ASSERT_TRUE(IsVisible()); |
| chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); |
| delay = WaitForBookmarkBarAnimationToFinish(); |
| LOG(INFO) << "Took " << delay.InMilliseconds() << " ms to hide bookmark bar"; |
| ASSERT_FALSE(IsVisible()); |
| } |
| |
| // Verify that bookmarks persist browser restart. |
| IN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, PRE_Persist) { |
| BookmarkModel* bookmark_model = WaitForBookmarkModel(browser()->profile()); |
| |
| bookmark_utils::AddIfNotBookmarked( |
| bookmark_model, GURL(kPersistBookmarkURL), |
| ASCIIToUTF16(kPersistBookmarkTitle)); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, Persist) { |
| BookmarkModel* bookmark_model = WaitForBookmarkModel(browser()->profile()); |
| |
| std::vector<BookmarkService::URLAndTitle> urls; |
| bookmark_model->GetBookmarks(&urls); |
| |
| ASSERT_EQ(1u, urls.size()); |
| ASSERT_EQ(GURL(kPersistBookmarkURL), urls[0].url); |
| ASSERT_EQ(ASCIIToUTF16(kPersistBookmarkTitle), urls[0].title); |
| } |
| |
| #if !defined(OS_CHROMEOS) // No multi-profile on ChromeOS. |
| |
| // Sanity check that bookmarks from different profiles are separate. |
| // DISABLED_ because it regularly times out: http://crbug.com/159002. |
| IN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, DISABLED_MultiProfile) { |
| base::ScopedTempDir temp_dir; |
| ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| |
| BookmarkModel* bookmark_model1 = WaitForBookmarkModel(browser()->profile()); |
| |
| ui_test_utils::BrowserAddedObserver observer; |
| g_browser_process->profile_manager()->CreateMultiProfileAsync( |
| base::string16(), base::string16(), ProfileManager::CreateCallback(), |
| std::string()); |
| Browser* browser2 = observer.WaitForSingleNewBrowser(); |
| BookmarkModel* bookmark_model2 = WaitForBookmarkModel(browser2->profile()); |
| |
| bookmark_utils::AddIfNotBookmarked( |
| bookmark_model1, GURL(kPersistBookmarkURL), |
| ASCIIToUTF16(kPersistBookmarkTitle)); |
| std::vector<BookmarkService::URLAndTitle> urls1, urls2; |
| bookmark_model1->GetBookmarks(&urls1); |
| bookmark_model2->GetBookmarks(&urls2); |
| ASSERT_EQ(1u, urls1.size()); |
| ASSERT_TRUE(urls2.empty()); |
| } |
| |
| #endif |