diff options
-rw-r--r-- | chrome/browser/bookmarks/bookmark_table_model.cc | 9 | ||||
-rw-r--r-- | chrome/browser/bookmarks/bookmark_utils.cc | 64 | ||||
-rw-r--r-- | chrome/browser/bookmarks/bookmark_utils.h | 14 | ||||
-rw-r--r-- | chrome/browser/bookmarks/bookmark_utils_unittest.cc | 41 | ||||
-rw-r--r-- | chrome/test/unit/unit_tests.scons | 1 | ||||
-rw-r--r-- | chrome/test/unit/unittests.vcproj | 8 |
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
|