1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "testing/gtest/include/gtest/gtest.h"
6
7#include "base/message_loop.h"
8#include "base/string_util.h"
9#include "base/utf_string_conversions.h"
10#include "chrome/browser/bookmarks/bookmark_model.h"
11#include "chrome/browser/bookmarks/bookmark_utils.h"
12#include "chrome/test/testing_browser_process_test.h"
13#include "ui/base/clipboard/scoped_clipboard_writer.h"
14
15#if !defined(OS_MACOSX)
16#include "chrome/browser/browser_process.h"
17#endif
18
19typedef TestingBrowserProcessTest BookmarkUtilsTest;
20
21TEST_F(BookmarkUtilsTest, GetBookmarksContainingText) {
22  BookmarkModel model(NULL);
23  const BookmarkNode* n1 =
24      model.AddURL(model.other_node(), 0, ASCIIToUTF16("foo bar"),
25                   GURL("http://www.google.com"));
26  const BookmarkNode* n2 =
27      model.AddURL(model.other_node(), 0, ASCIIToUTF16("baz buz"),
28                   GURL("http://www.cnn.com"));
29
30  model.AddFolder(model.other_node(), 0, ASCIIToUTF16("foo"));
31
32  std::vector<const BookmarkNode*> nodes;
33  bookmark_utils::GetBookmarksContainingText(
34      &model, ASCIIToUTF16("foo"), 100, std::string(), &nodes);
35  ASSERT_EQ(1U, nodes.size());
36  EXPECT_TRUE(nodes[0] == n1);
37  EXPECT_TRUE(bookmark_utils::DoesBookmarkContainText(
38      n1, ASCIIToUTF16("foo"), std::string()));
39  nodes.clear();
40
41  bookmark_utils::GetBookmarksContainingText(
42      &model, ASCIIToUTF16("cnn"), 100, std::string(), &nodes);
43  ASSERT_EQ(1U, nodes.size());
44  EXPECT_TRUE(nodes[0] == n2);
45  EXPECT_TRUE(bookmark_utils::DoesBookmarkContainText(
46      n2, ASCIIToUTF16("cnn"), std::string()));
47  nodes.clear();
48
49  bookmark_utils::GetBookmarksContainingText(
50      &model, ASCIIToUTF16("foo bar"), 100, std::string(), &nodes);
51  ASSERT_EQ(1U, nodes.size());
52  EXPECT_TRUE(nodes[0] == n1);
53  EXPECT_TRUE(bookmark_utils::DoesBookmarkContainText(
54      n1, ASCIIToUTF16("foo bar"), std::string()));
55  nodes.clear();
56}
57
58TEST_F(BookmarkUtilsTest, DoesBookmarkContainText) {
59  BookmarkModel model(NULL);
60  const BookmarkNode* node = model.AddURL(model.other_node(), 0,
61                                          ASCIIToUTF16("foo bar"),
62                                          GURL("http://www.google.com"));
63  // Matches to the title.
64  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
65      node, ASCIIToUTF16("ar"), std::string()));
66  // Matches to the URL
67  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
68      node, ASCIIToUTF16("www"), std::string()));
69  // No match.
70  ASSERT_FALSE(bookmark_utils::DoesBookmarkContainText(
71      node, ASCIIToUTF16("cnn"), std::string()));
72
73  // Tests for a Japanese IDN.
74  const string16 kDecodedIdn = WideToUTF16(L"\x30B0\x30FC\x30B0\x30EB");
75  node = model.AddURL(model.other_node(), 0, ASCIIToUTF16("foo bar"),
76                      GURL("http://xn--qcka1pmc.jp"));
77  // Unicode query doesn't match if languages have no "ja".
78  ASSERT_FALSE(bookmark_utils::DoesBookmarkContainText(
79      node, kDecodedIdn, "en"));
80  // Unicode query matches if languages have "ja".
81  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
82      node, kDecodedIdn, "ja"));
83  // Punycode query also matches as ever.
84  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
85      node, ASCIIToUTF16("qcka1pmc"), "ja"));
86
87  // Tests with various lower/upper case characters.
88  node = model.AddURL(model.other_node(), 0, ASCIIToUTF16("FOO bar"),
89                      GURL("http://www.google.com/search?q=ABC"));
90  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
91      node, ASCIIToUTF16("foo"), std::string()));
92  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
93      node, ASCIIToUTF16("Foo"), std::string()));
94  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
95      node, ASCIIToUTF16("FOO"), std::string()));
96  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
97      node, ASCIIToUTF16("google abc"), std::string()));
98  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
99      node, ASCIIToUTF16("google ABC"), std::string()));
100  ASSERT_TRUE(bookmark_utils::DoesBookmarkContainText(
101      node, ASCIIToUTF16("http://www.google.com/search?q=A"), std::string()));
102}
103
104#if !defined(OS_MACOSX)
105TEST_F(BookmarkUtilsTest, CopyPaste) {
106  // Clipboard requires a message loop.
107  MessageLoopForUI loop;
108
109  BookmarkModel model(NULL);
110  const BookmarkNode* node = model.AddURL(model.other_node(), 0,
111                                          ASCIIToUTF16("foo bar"),
112                                          GURL("http://www.google.com"));
113
114  // Copy a node to the clipboard.
115  std::vector<const BookmarkNode*> nodes;
116  nodes.push_back(node);
117  bookmark_utils::CopyToClipboard(&model, nodes, false);
118
119  // And make sure we can paste a bookmark from the clipboard.
120  EXPECT_TRUE(
121      bookmark_utils::CanPasteFromClipboard(model.GetBookmarkBarNode()));
122
123  // Write some text to the clipboard.
124  {
125    ui::ScopedClipboardWriter clipboard_writer(g_browser_process->clipboard());
126    clipboard_writer.WriteText(ASCIIToUTF16("foo"));
127  }
128
129  // Now we shouldn't be able to paste from the clipboard.
130  EXPECT_FALSE(
131      bookmark_utils::CanPasteFromClipboard(model.GetBookmarkBarNode()));
132}
133#endif
134