bookmark_browsertest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org// Use of this source code is governed by a BSD-style license that can be
3f6d65a99233197a7b2e194d19be63ec85ff635d2mark@chromium.org// found in the LICENSE file.
4f6d65a99233197a7b2e194d19be63ec85ff635d2mark@chromium.org
5a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org#include "base/bind.h"
6a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org#include "base/timer.h"
7a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org#include "base/utf_string_conversions.h"
8a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org#include "chrome/app/chrome_command_ids.h"
91d4bf03af656e8f45c6ff3edd85af569acf710aamark@chromium.org#include "chrome/browser/bookmarks/bookmark_model.h"
105ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/bookmarks/bookmark_model_factory.h"
115ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/bookmarks/bookmark_utils.h"
125ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/browser_process.h"
135ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/profiles/profile.h"
145ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/profiles/profile_manager.h"
155ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/ui/browser.h"
165ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/ui/browser_commands.h"
175ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/ui/browser_window.h"
185ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/browser/ui/host_desktop.h"
195ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/common/chrome_notification_types.h"
205ca0052c48077a11341c00a09bf37a0276416af9mark@chromium.org#include "chrome/test/base/in_process_browser_test.h"
211d4bf03af656e8f45c6ff3edd85af569acf710aamark@chromium.org#include "chrome/test/base/ui_test_utils.h"
221d4bf03af656e8f45c6ff3edd85af569acf710aamark@chromium.org#include "content/public/browser/notification_service.h"
2381f836d22e87477721a659f6edb72ff6113594c9mark@chromium.org#include "content/public/test/browser_test_utils.h"
2481f836d22e87477721a659f6edb72ff6113594c9mark@chromium.org
25a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.orgnamespace {
26475089d4d1a7ea54e6f25312d665da1e982d96d0mark@chromium.orgconst char kPersistBookmarkURL[] = "http://www.cnn.com/";
27475089d4d1a7ea54e6f25312d665da1e982d96d0mark@chromium.orgconst char kPersistBookmarkTitle[] = "CNN";
28f6d65a99233197a7b2e194d19be63ec85ff635d2mark@chromium.org}
29f6d65a99233197a7b2e194d19be63ec85ff635d2mark@chromium.org
30f6d65a99233197a7b2e194d19be63ec85ff635d2mark@chromium.orgclass BookmarkBrowsertest : public InProcessBrowserTest {
31a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org public:
3235d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  BookmarkBrowsertest() {}
33d94ee482c8742cc70d1506cd57abadbf25509ebbmark@chromium.org
34d94ee482c8742cc70d1506cd57abadbf25509ebbmark@chromium.org  bool IsVisible() {
35d94ee482c8742cc70d1506cd57abadbf25509ebbmark@chromium.org    return browser()->bookmark_bar_state() == BookmarkBar::SHOW;
36d94ee482c8742cc70d1506cd57abadbf25509ebbmark@chromium.org  }
37d94ee482c8742cc70d1506cd57abadbf25509ebbmark@chromium.org
3835d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  static void CheckAnimation(Browser* browser, const base::Closure& quit_task) {
3935d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org    if (!browser->window()->IsBookmarkBarAnimating())
4035d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org      quit_task.Run();
4135d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  }
4235d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org
4335d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  base::TimeDelta WaitForBookmarkBarAnimationToFinish() {
4435d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org    base::Time start(base::Time::Now());
4535d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org    scoped_refptr<content::MessageLoopRunner> runner =
4635d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org        new content::MessageLoopRunner;
4737964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
4837964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org    base::Timer timer(false, true);
4937964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org    timer.Start(
5037964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org        FROM_HERE,
5137964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org        base::TimeDelta::FromMilliseconds(15),
5237964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org        base::Bind(&CheckAnimation, browser(), runner->QuitClosure()));
5337964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org    runner->Run();
5437964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org    return base::Time::Now() - start;
5537964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  }
5637964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
5737964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  BookmarkModel* WaitForBookmarkModel(Profile* profile) {
5837964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org    BookmarkModel* bookmark_model =
5937964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org        BookmarkModelFactory::GetForProfile(profile);
6037964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org    if (!bookmark_model->IsLoaded()) {
6137964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org      content::WindowedNotificationObserver observer(
6222bf54785eb1fec2a100fb79177ed34497e74292mark@chromium.org          chrome::NOTIFICATION_BOOKMARK_MODEL_LOADED,
63a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org          content::NotificationService::AllSources());
64a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org      observer.Wait();
65475089d4d1a7ea54e6f25312d665da1e982d96d0mark@chromium.org    }
6635d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org    return bookmark_model;
6735d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  }
6835d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org};
6935d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org
7035d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org// Test of bookmark bar toggling, visibility, and animation.
7135d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.orgIN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, BookmarkBarVisibleWait) {
7235d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  ASSERT_FALSE(IsVisible());
7335d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR);
7435d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  base::TimeDelta delay = WaitForBookmarkBarAnimationToFinish();
7535d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  LOG(INFO) << "Took " << delay.InMilliseconds() << " ms to show bookmark bar";
7635d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  ASSERT_TRUE(IsVisible());
7735d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR);
7835d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  delay = WaitForBookmarkBarAnimationToFinish();
7935d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  LOG(INFO) << "Took " << delay.InMilliseconds() << " ms to hide bookmark bar";
8035d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  ASSERT_FALSE(IsVisible());
8135d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org}
8235d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org
8335d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org// Verify that bookmarks persist browser restart.
8435d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.orgIN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, PRE_Persist) {
8535d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  BookmarkModel* bookmark_model = WaitForBookmarkModel(browser()->profile());
8635d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org
8735d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  bookmark_utils::AddIfNotBookmarked(
8835d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org      bookmark_model, GURL(kPersistBookmarkURL),
89dbd5170901cfeb753bd7cee93b5b7c40dcc76337mark@chromium.org      ASCIIToUTF16(kPersistBookmarkTitle));
90dbd5170901cfeb753bd7cee93b5b7c40dcc76337mark@chromium.org}
91dbd5170901cfeb753bd7cee93b5b7c40dcc76337mark@chromium.org
92dbd5170901cfeb753bd7cee93b5b7c40dcc76337mark@chromium.orgIN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, Persist) {
93dbd5170901cfeb753bd7cee93b5b7c40dcc76337mark@chromium.org  BookmarkModel* bookmark_model = WaitForBookmarkModel(browser()->profile());
9437964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
9537964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  std::vector<BookmarkService::URLAndTitle> urls;
9637964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  bookmark_model->GetBookmarks(&urls);
9737964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
9837964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  ASSERT_EQ(1u, urls.size());
9937964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  ASSERT_EQ(GURL(kPersistBookmarkURL), urls[0].url);
10037964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  ASSERT_EQ(ASCIIToUTF16(kPersistBookmarkTitle), urls[0].title);
10137964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org}
10237964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
10337964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org#if !defined(OS_CHROMEOS)  // No multi-profile on ChromeOS.
10437964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
10537964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org// Sanity check that bookmarks from different profiles are separate.
10637964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org// DISABLED_ because it regularly times out: http://crbug.com/159002.
10737964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.orgIN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, DISABLED_MultiProfile) {
10837964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  ScopedTempDir temp_dir;
10937964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
11037964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
11137964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  BookmarkModel* bookmark_model1 = WaitForBookmarkModel(browser()->profile());
11237964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
11337964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  ui_test_utils::BrowserAddedObserver observer;
11437964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  g_browser_process->profile_manager()->CreateMultiProfileAsync(
11537964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org      string16(), string16(), ProfileManager::CreateCallback(),
11637964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org      chrome::HOST_DESKTOP_TYPE_NATIVE);
11737964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  Browser* browser2 = observer.WaitForSingleNewBrowser();
11837964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  BookmarkModel* bookmark_model2 = WaitForBookmarkModel(browser2->profile());
11937964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org
12037964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  bookmark_utils::AddIfNotBookmarked(
12137964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org      bookmark_model1, GURL(kPersistBookmarkURL),
12237964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org      ASCIIToUTF16(kPersistBookmarkTitle));
12337964e1e03b108dd29cba4d9b87e05684b8bc504mark@chromium.org  std::vector<BookmarkService::URLAndTitle> urls1, urls2;
12435d23def8cd397d452a491a0ac7aa8bc1720c7d9mark@chromium.org  bookmark_model1->GetBookmarks(&urls1);
125a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org  bookmark_model2->GetBookmarks(&urls2);
126475089d4d1a7ea54e6f25312d665da1e982d96d0mark@chromium.org  ASSERT_EQ(1u, urls1.size());
127475089d4d1a7ea54e6f25312d665da1e982d96d0mark@chromium.org  ASSERT_TRUE(urls2.empty());
12822bf54785eb1fec2a100fb79177ed34497e74292mark@chromium.org}
129a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org
130a85d7de5129e37e558dc6e9c70ded4d300a71c5emark@chromium.org#endif
131475089d4d1a7ea54e6f25312d665da1e982d96d0mark@chromium.org