summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/bookmarks/bookmark_table_model.cc9
-rw-r--r--chrome/browser/bookmarks/bookmark_utils.cc64
-rw-r--r--chrome/browser/bookmarks/bookmark_utils.h14
-rw-r--r--chrome/browser/bookmarks/bookmark_utils_unittest.cc41
-rw-r--r--chrome/test/unit/unit_tests.scons1
-rw-r--r--chrome/test/unit/unittests.vcproj8
6 files changed, 112 insertions, 25 deletions
diff --git a/chrome/browser/bookmarks/bookmark_table_model.cc b/chrome/browser/bookmarks/bookmark_table_model.cc
index 234628d..2b31c72 100644
--- a/chrome/browser/bookmarks/bookmark_table_model.cc
+++ b/chrome/browser/bookmarks/bookmark_table_model.cc
@@ -204,18 +204,15 @@ class BookmarkSearchTableModel : public VectorBackedBookmarkTableModel {
const std::wstring& search_text)
: VectorBackedBookmarkTableModel(model),
search_text_(search_text) {
- std::vector<bookmark_utils::TitleMatch> matches;
- bookmark_utils::GetBookmarksMatchingText(
- model, search_text, std::numeric_limits<int>::max(), &matches);
- for (size_t i = 0; i < matches.size(); ++i)
- nodes().push_back(matches[i].node);
+ bookmark_utils::GetBookmarksContainingText(
+ model, search_text, std::numeric_limits<int>::max(), &nodes());
}
virtual void BookmarkNodeAdded(BookmarkModel* model,
BookmarkNode* parent,
int index) {
BookmarkNode* node = parent->GetChild(index);
- if (bookmark_utils::DoesBookmarkMatchText(search_text_, node)) {
+ if (bookmark_utils::DoesBookmarkContainText(node, search_text_)) {
nodes().push_back(node);
if (observer())
observer()->OnItemsAdded(static_cast<int>(nodes().size() - 1), 1);
diff --git a/chrome/browser/bookmarks/bookmark_utils.cc b/chrome/browser/bookmarks/bookmark_utils.cc
index 1a25556..b24b9b7 100644
--- a/chrome/browser/bookmarks/bookmark_utils.cc
+++ b/chrome/browser/bookmarks/bookmark_utils.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/bookmarks/bookmark_utils.h"
+#include "base/string_util.h"
#include "base/time.h"
#include "chrome/browser/bookmarks/bookmark_drag_data.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
@@ -146,6 +147,26 @@ bool MoreRecentlyModified(BookmarkNode* n1, BookmarkNode* n2) {
return n1->date_group_modified() > n2->date_group_modified();
}
+// Returns true if |text| contains each string in |words|. This is used when
+// searching for bookmarks.
+bool DoesBookmarkTextContainWords(const std::wstring& text,
+ const std::vector<std::wstring>& words) {
+ for (size_t i = 0; i < words.size(); ++i) {
+ if (text.find(words[i]) == std::wstring::npos)
+ return false;
+ }
+ return true;
+}
+
+// Returns true if |node|s title or url contains the strings in |words|.
+bool DoesBookmarkContainWords(BookmarkNode* node,
+ const std::vector<std::wstring>& words) {
+ return
+ DoesBookmarkTextContainWords(
+ l10n_util::ToLower(node->GetTitle()), words) ||
+ DoesBookmarkTextContainWords(UTF8ToWide(node->GetURL().spec()), words);
+}
+
} // namespace
namespace bookmark_utils {
@@ -369,9 +390,6 @@ void GetBookmarksMatchingText(BookmarkModel* model,
Snippet::MatchPositions match_position;
while (iterator.has_next()) {
BookmarkNode* node = iterator.Next();
- if (node->GetURL().spec() == "http://www.google.com/") {
- DLOG(INFO) << "BLAH";
- }
if (node->is_url() &&
parser.DoesQueryMatch(node->GetTitle(), query_nodes.get(),
&match_position)) {
@@ -384,23 +402,39 @@ void GetBookmarksMatchingText(BookmarkModel* model,
}
}
-bool DoesBookmarkMatchText(const std::wstring& text, BookmarkNode* node) {
- if (!node->is_url())
- return false;
+bool MoreRecentlyAdded(BookmarkNode* n1, BookmarkNode* n2) {
+ return n1->date_added() > n2->date_added();
+}
+void GetBookmarksContainingText(BookmarkModel* model,
+ const std::wstring& text,
+ size_t max_count,
+ std::vector<BookmarkNode*>* nodes) {
+ std::vector<std::wstring> words;
QueryParser parser;
- ScopedVector<QueryNode> query_nodes;
- parser.ParseQuery(text, &query_nodes.get());
- if (query_nodes.empty())
- return false;
+ parser.ExtractQueryWords(l10n_util::ToLower(text), &words);
+ if (words.empty())
+ return;
- Snippet::MatchPositions match_position;
- return parser.DoesQueryMatch(node->GetTitle(), query_nodes.get(),
- &match_position);
+ views::TreeNodeIterator<BookmarkNode> iterator(model->root_node());
+ while (iterator.has_next()) {
+ BookmarkNode* node = iterator.Next();
+ if (node->is_url() && DoesBookmarkContainWords(node, words)) {
+ nodes->push_back(node);
+ if (nodes->size() == max_count)
+ return;
+ }
+ }
}
-bool MoreRecentlyAdded(BookmarkNode* n1, BookmarkNode* n2) {
- return n1->date_added() > n2->date_added();
+bool DoesBookmarkContainText(BookmarkNode* node, const std::wstring& text) {
+ std::vector<std::wstring> words;
+ QueryParser parser;
+ parser.ExtractQueryWords(l10n_util::ToLower(text), &words);
+ if (words.empty())
+ return false;
+
+ return (node->is_url() && DoesBookmarkContainWords(node, words));
}
} // namespace bookmark_utils
diff --git a/chrome/browser/bookmarks/bookmark_utils.h b/chrome/browser/bookmarks/bookmark_utils.h
index 9405919..7a83caa 100644
--- a/chrome/browser/bookmarks/bookmark_utils.h
+++ b/chrome/browser/bookmarks/bookmark_utils.h
@@ -104,13 +104,19 @@ void GetBookmarksMatchingText(BookmarkModel* model,
size_t max_count,
std::vector<TitleMatch>* matches);
-// Returns true if the specified bookmark's title matches the specified
-// text.
-bool DoesBookmarkMatchText(const std::wstring& text, BookmarkNode* node);
-
// Returns true if |n1| was added more recently than |n2|.
bool MoreRecentlyAdded(BookmarkNode* n1, BookmarkNode* n2);
+// Returns up to |max_count| bookmarks from |model| whose url or title contains
+// the text |text|.
+void GetBookmarksContainingText(BookmarkModel* model,
+ const std::wstring& text,
+ size_t max_count,
+ std::vector<BookmarkNode*>* nodes);
+
+// Returns true if |node|'s url or title contains the string |text|.
+bool DoesBookmarkContainText(BookmarkNode* node, const std::wstring& text);
+
// Number of bookmarks we'll open before prompting the user to see if they
// really want to open all.
//
diff --git a/chrome/browser/bookmarks/bookmark_utils_unittest.cc b/chrome/browser/bookmarks/bookmark_utils_unittest.cc
new file mode 100644
index 0000000..bbd49cc
--- /dev/null
+++ b/chrome/browser/bookmarks/bookmark_utils_unittest.cc
@@ -0,0 +1,41 @@
+// Copyright (c) 2006-2008 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 "testing/gtest/include/gtest/gtest.h"
+
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/bookmarks/bookmark_utils.h"
+
+typedef testing::Test BookmarkUtilsTest;
+
+TEST_F(BookmarkUtilsTest, GetBookmarksContainingText) {
+ BookmarkModel model(NULL);
+ BookmarkNode* n1 =
+ model.AddURL(model.other_node(), 0, L"foo bar",
+ GURL("http://www.google.com"));
+ BookmarkNode* n2 =
+ model.AddURL(model.other_node(), 0, L"baz buz",
+ GURL("http://www.cnn.com"));
+
+ model.AddGroup(model.other_node(), 0, L"foo");
+
+ std::vector<BookmarkNode*> nodes;
+ bookmark_utils::GetBookmarksContainingText(&model, L"foo", 100, &nodes);
+ ASSERT_EQ(1, nodes.size());
+ EXPECT_TRUE(nodes[0] == n1);
+ EXPECT_TRUE(bookmark_utils::DoesBookmarkContainText(n1, L"foo"));
+ nodes.clear();
+
+ bookmark_utils::GetBookmarksContainingText(&model, L"cnn", 100, &nodes);
+ ASSERT_EQ(1, nodes.size());
+ EXPECT_TRUE(nodes[0] == n2);
+ EXPECT_TRUE(bookmark_utils::DoesBookmarkContainText(n2, L"cnn"));
+ nodes.clear();
+
+ bookmark_utils::GetBookmarksContainingText(&model, L"foo bar", 100, &nodes);
+ ASSERT_EQ(1, nodes.size());
+ EXPECT_TRUE(nodes[0] == n1);
+ EXPECT_TRUE(bookmark_utils::DoesBookmarkContainText(n1, L"foo bar"));
+ nodes.clear();
+}
diff --git a/chrome/test/unit/unit_tests.scons b/chrome/test/unit/unit_tests.scons
index be7ec3f..b2f7616 100644
--- a/chrome/test/unit/unit_tests.scons
+++ b/chrome/test/unit/unit_tests.scons
@@ -151,6 +151,7 @@ if env['PLATFORM'] == 'win32':
'$CHROME_DIR/browser/bookmarks/bookmark_html_writer_unittest.cc',
'$CHROME_DIR/browser/bookmarks/bookmark_model_unittest.cc',
'$CHROME_DIR/browser/bookmarks/bookmark_table_model_unittest.cc',
+ '$CHROME_DIR/browser/bookmarks/bookmark_utils_unittest.cc',
'$CHROME_DIR/browser/cache_manager_host_unittest.cc',
'$CHROME_DIR/browser/controller_unittest.cc',
'$CHROME_DIR/browser/download/download_manager_unittest.cc',
diff --git a/chrome/test/unit/unittests.vcproj b/chrome/test/unit/unittests.vcproj
index 7bd9106..ad85a65 100644
--- a/chrome/test/unit/unittests.vcproj
+++ b/chrome/test/unit/unittests.vcproj
@@ -239,6 +239,14 @@
</File>
</Filter>
<Filter
+ Name="TestBookmarkUtils"
+ >
+ <File
+ RelativePath="..\..\browser\bookmarks\bookmark_utils_unittest.cc"
+ >
+ </File>
+ </Filter>
+ <Filter
Name="TestGoogleURLTracker"
>
<File