summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJun Mukai <mukai@chromium.org>2014-10-03 18:25:57 -0700
committerJun Mukai <mukai@chromium.org>2014-10-04 01:27:35 +0000
commitd29ce06a1354e06e41596cf575af98aed9f6b8a7 (patch)
treeafa58a38ded6c4d7153dc063d229b293038b15ab
parentd366f72f171dd176aa89f8e0baaca34ef70545c6 (diff)
downloadchromium_src-d29ce06a1354e06e41596cf575af98aed9f6b8a7.zip
chromium_src-d29ce06a1354e06e41596cf575af98aed9f6b8a7.tar.gz
chromium_src-d29ce06a1354e06e41596cf575af98aed9f6b8a7.tar.bz2
Simplifies the structure of app_list search a bit.
This is the first CL to simplify app list search. The final goal is making SearchResult copyable and remove SearchResultObserver but it would need the several steps. As the first step, it simply keeps the copying method Duplicate but removes the unnecessary class hierarchy of ChromeSearchResult. BUG=415500 R=oshima@chromium.org, tapted@chromium.org, xiyuan@chromium.org TEST=build passes, no functional changes Review URL: https://codereview.chromium.org/621823004 Cr-Commit-Position: refs/heads/master@{#298154}
-rw-r--r--ash/shell/app_list.cc5
-rw-r--r--athena/home/app_list_view_delegate.cc12
-rw-r--r--athena/main/url_search_provider.cc6
-rw-r--r--chrome/browser/ui/app_list/search/app_result.cc13
-rw-r--r--chrome/browser/ui/app_list/search/app_result.h10
-rw-r--r--chrome/browser/ui/app_list/search/app_search_provider_unittest.cc2
-rw-r--r--chrome/browser/ui/app_list/search/chrome_search_result.h55
-rw-r--r--chrome/browser/ui/app_list/search/mixer.cc19
-rw-r--r--chrome/browser/ui/app_list/search/mixer.h6
-rw-r--r--chrome/browser/ui/app_list/search/mixer_unittest.cc26
-rw-r--r--chrome/browser/ui/app_list/search/omnibox_provider.cc20
-rw-r--r--chrome/browser/ui/app_list/search/people/people_provider.cc4
-rw-r--r--chrome/browser/ui/app_list/search/people/people_provider.h5
-rw-r--r--chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc2
-rw-r--r--chrome/browser/ui/app_list/search/people/people_result.cc13
-rw-r--r--chrome/browser/ui/app_list/search/people/people_result.h9
-rw-r--r--chrome/browser/ui/app_list/search/search_controller.cc21
-rw-r--r--chrome/browser/ui/app_list/search/search_util.cc21
-rw-r--r--chrome/browser/ui/app_list/search/search_util.h31
-rw-r--r--chrome/browser/ui/app_list/search/search_webstore_result.cc14
-rw-r--r--chrome/browser/ui/app_list/search/search_webstore_result.h10
-rw-r--r--chrome/browser/ui/app_list/search/webstore/webstore_provider.cc4
-rw-r--r--chrome/browser/ui/app_list/search/webstore/webstore_provider.h5
-rw-r--r--chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc2
-rw-r--r--chrome/browser/ui/app_list/search/webstore/webstore_result.cc22
-rw-r--r--chrome/browser/ui/app_list/search/webstore/webstore_result.h9
-rw-r--r--chrome/chrome_browser_ui.gypi3
-rw-r--r--ui/app_list/BUILD.gn2
-rw-r--r--ui/app_list/app_list.gyp2
-rw-r--r--ui/app_list/cocoa/apps_search_results_controller_unittest.mm4
-rw-r--r--ui/app_list/search_provider.cc4
-rw-r--r--ui/app_list/search_provider.h3
-rw-r--r--ui/app_list/search_result.h6
-rw-r--r--ui/app_list/test/test_search_result.cc20
-rw-r--r--ui/app_list/test/test_search_result.h27
-rw-r--r--ui/app_list/views/app_list_view_unittest.cc3
-rw-r--r--ui/app_list/views/search_result_list_view_unittest.cc6
37 files changed, 218 insertions, 208 deletions
diff --git a/ash/shell/app_list.cc b/ash/shell/app_list.cc
index 2f725e2..77d65ef 100644
--- a/ash/shell/app_list.cc
+++ b/ash/shell/app_list.cc
@@ -188,6 +188,11 @@ class ExampleSearchResult : public app_list::SearchResult {
WindowTypeShelfItem::Type type() const { return type_; }
+ // app_list::SearchResult:
+ virtual scoped_ptr<SearchResult> Duplicate() override {
+ return scoped_ptr<SearchResult>();
+ }
+
private:
WindowTypeShelfItem::Type type_;
diff --git a/athena/home/app_list_view_delegate.cc b/athena/home/app_list_view_delegate.cc
index 99b1041..29ecb05 100644
--- a/athena/home/app_list_view_delegate.cc
+++ b/athena/home/app_list_view_delegate.cc
@@ -53,14 +53,10 @@ void AppListViewDelegate::RegisterSearchProvider(
void AppListViewDelegate::SearchResultChanged() {
// TODO(mukai): port app-list's Mixer to reorder the results properly.
app_list::SearchProvider* search_provider = search_providers_[0];
- std::vector<app_list::SearchResult*> results;
- search_provider->ReleaseResult(&results);
- if (results.empty()) {
- model_->results()->DeleteAll();
- } else {
- for (size_t i = 0; i < results.size(); ++i)
- model_->results()->Add(results[i]);
- }
+ const app_list::SearchProvider::Results& results = search_provider->results();
+ model_->results()->DeleteAll();
+ for (size_t i = 0; i < results.size(); ++i)
+ model_->results()->Add(results[i]->Duplicate().release());
}
bool AppListViewDelegate::ForceNativeDesktop() const {
diff --git a/athena/main/url_search_provider.cc b/athena/main/url_search_provider.cc
index 190b95c..b8c43ad 100644
--- a/athena/main/url_search_provider.cc
+++ b/athena/main/url_search_provider.cc
@@ -170,7 +170,11 @@ class UrlSearchResult : public app_list::SearchResult {
virtual ~UrlSearchResult() {}
private:
- // Overriddenn from app_list::SearchResult:
+ // Overridden from app_list::SearchResult:
+ virtual scoped_ptr<app_list::SearchResult> Duplicate() override {
+ return make_scoped_ptr(new UrlSearchResult(browser_context_, match_));
+ }
+
virtual void Open(int event_flags) override {
Activity* activity = ActivityFactory::Get()->CreateWebActivity(
browser_context_, base::string16(), match_.destination_url);
diff --git a/chrome/browser/ui/app_list/search/app_result.cc b/chrome/browser/ui/app_list/search/app_result.cc
index 92c68fd..4f628b3 100644
--- a/chrome/browser/ui/app_list/search/app_result.cc
+++ b/chrome/browser/ui/app_list/search/app_result.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/app_context_menu.h"
#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
+#include "chrome/browser/ui/app_list/search/search_util.h"
#include "chrome/browser/ui/extensions/extension_enable_flow.h"
#include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h"
#include "content/public/browser/user_metrics.h"
@@ -89,6 +90,7 @@ void AppResult::UpdateFromLastLaunched(const base::Time& current_time,
}
void AppResult::Open(int event_flags) {
+ RecordHistogram(APP_SEARCH_RESULT);
const extensions::Extension* extension =
extensions::ExtensionSystem::Get(profile_)->extension_service()
->GetInstalledExtension(app_id_);
@@ -114,21 +116,14 @@ void AppResult::Open(int event_flags) {
event_flags);
}
-void AppResult::InvokeAction(int action_index, int event_flags) {}
-
-scoped_ptr<ChromeSearchResult> AppResult::Duplicate() {
- scoped_ptr<ChromeSearchResult> copy(
- new AppResult(profile_, app_id_, controller_));
+scoped_ptr<SearchResult> AppResult::Duplicate() {
+ scoped_ptr<SearchResult> copy(new AppResult(profile_, app_id_, controller_));
copy->set_title(title());
copy->set_title_tags(title_tags());
return copy.Pass();
}
-ChromeSearchResultType AppResult::GetType() {
- return APP_SEARCH_RESULT;
-}
-
ui::MenuModel* AppResult::GetContextMenuModel() {
if (!context_menu_) {
context_menu_.reset(new AppContextMenu(
diff --git a/chrome/browser/ui/app_list/search/app_result.h b/chrome/browser/ui/app_list/search/app_result.h
index c92b2dc..dcbe8ed 100644
--- a/chrome/browser/ui/app_list/search/app_result.h
+++ b/chrome/browser/ui/app_list/search/app_result.h
@@ -9,10 +9,10 @@
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/ui/app_list/app_context_menu_delegate.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
#include "extensions/browser/extension_icon_image.h"
#include "extensions/browser/extension_registry_observer.h"
+#include "ui/app_list/search_result.h"
class AppListControllerDelegate;
class ExtensionEnableFlow;
@@ -32,7 +32,7 @@ class AppContextMenu;
class TokenizedString;
class TokenizedStringMatch;
-class AppResult : public ChromeSearchResult,
+class AppResult : public SearchResult,
public extensions::IconImage::Observer,
public AppContextMenuDelegate,
public ExtensionEnableFlowDelegate,
@@ -49,12 +49,10 @@ class AppResult : public ChromeSearchResult,
void UpdateFromLastLaunched(const base::Time& current_time,
const base::Time& last_launched);
- // ChromeSearchResult overides:
+ // SearchResult overrides:
virtual void Open(int event_flags) override;
- virtual void InvokeAction(int action_index, int event_flags) override;
- virtual scoped_ptr<ChromeSearchResult> Duplicate() override;
+ virtual scoped_ptr<SearchResult> Duplicate() override;
virtual ui::MenuModel* GetContextMenuModel() override;
- virtual ChromeSearchResultType GetType() override;
private:
void StartObservingExtensionRegistry();
diff --git a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
index d9ae5c2..123eea4 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
@@ -11,13 +11,13 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/ui/app_list/app_list_test_util.h"
#include "chrome/browser/ui/app_list/search/app_search_provider.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/test/base/testing_profile.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/uninstall_reason.h"
#include "extensions/common/extension_set.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/app_list/search_result.h"
namespace app_list {
namespace test {
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.h b/chrome/browser/ui/app_list/search/chrome_search_result.h
deleted file mode 100644
index 2663e13..0000000
--- a/chrome/browser/ui/app_list/search/chrome_search_result.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2013 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.
-
-#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_CHROME_SEARCH_RESULT_H_
-#define CHROME_BROWSER_UI_APP_LIST_SEARCH_CHROME_SEARCH_RESULT_H_
-
-#include <string>
-
-#include "base/memory/scoped_ptr.h"
-#include "ui/app_list/search_result.h"
-
-namespace app_list {
-
-// The type of the search result. This is used for logging so do not change the
-// order of this enum.
-enum ChromeSearchResultType {
- // A result that forwards an omnibox search result.
- OMNIBOX_SEARCH_RESULT,
- // An app result.
- APP_SEARCH_RESULT,
- // A search result from the webstore.
- WEBSTORE_SEARCH_RESULT,
- // A result that opens a webstore search.
- SEARCH_WEBSTORE_SEARCH_RESULT,
- // A result that opens a people search.
- SEARCH_PEOPLE_SEARCH_RESULT,
- SEARCH_RESULT_TYPE_BOUNDARY
-};
-
-// Base class of all search results. It provides an additional interface
-// for SearchController to mix the results, duplicate a result from a
-// SearchProvider and pass it to UI and invoke actions on the results when
-// underlying UI is activated.
-class ChromeSearchResult : public SearchResult {
- public:
- ChromeSearchResult() {}
- virtual ~ChromeSearchResult() {}
-
- // Creates a copy of the result.
- virtual scoped_ptr<ChromeSearchResult> Duplicate() = 0;
-
- virtual ChromeSearchResultType GetType() = 0;
-
- // Overridden from SearchResult:
- virtual void Open(int event_flags) = 0;
- virtual void InvokeAction(int action_index, int event_flags) = 0;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ChromeSearchResult);
-};
-
-} // namespace app_list
-
-#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_CHROME_SEARCH_RESULT_H_
diff --git a/chrome/browser/ui/app_list/search/mixer.cc b/chrome/browser/ui/app_list/search/mixer.cc
index b5145f7..eb91fcf 100644
--- a/chrome/browser/ui/app_list/search/mixer.cc
+++ b/chrome/browser/ui/app_list/search/mixer.cc
@@ -10,8 +10,8 @@
#include <string>
#include <vector>
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "ui/app_list/search_provider.h"
+#include "ui/app_list/search_result.h"
namespace app_list {
@@ -26,8 +26,7 @@ const size_t kMaxPeopleResults = 2;
// A value to indicate no max number of results limit.
const size_t kNoMaxResultsLimit = 0;
-void UpdateResult(const ChromeSearchResult& source,
- ChromeSearchResult* target) {
+void UpdateResult(const SearchResult& source, SearchResult* target) {
target->set_title(source.title());
target->set_title_tags(source.title_tags());
target->set_details(source.details());
@@ -39,7 +38,7 @@ void UpdateResult(const ChromeSearchResult& source,
Mixer::SortData::SortData() : result(NULL), score(0.0) {
}
-Mixer::SortData::SortData(ChromeSearchResult* result, double score)
+Mixer::SortData::SortData(SearchResult* result, double score)
: result(result), score(score) {
}
@@ -99,8 +98,7 @@ class Mixer::Group {
}
results_.push_back(
- SortData(static_cast<ChromeSearchResult*>(*result_it),
- (*result_it)->relevance() + boost));
+ SortData(*result_it, (*result_it)->relevance() + boost));
}
}
@@ -182,7 +180,7 @@ void Mixer::MixAndPublish(const KnownResults& known_results) {
void Mixer::Publish(const SortedResults& new_results,
AppListModel::SearchResults* ui_results) {
- typedef std::map<std::string, ChromeSearchResult*> IdToResultMap;
+ typedef std::map<std::string, SearchResult*> IdToResultMap;
// The following algorithm is used:
// 1. Transform the |ui_results| list into an unordered map from result ID
@@ -195,8 +193,7 @@ void Mixer::Publish(const SortedResults& new_results,
// A map of the items in |ui_results| that takes ownership of the items.
IdToResultMap ui_results_map;
for (size_t i = 0; i < ui_results->item_count(); ++i) {
- ChromeSearchResult* ui_result =
- static_cast<ChromeSearchResult*>(ui_results->GetItemAt(i));
+ SearchResult* ui_result = ui_results->GetItemAt(i);
ui_results_map[ui_result->id()] = ui_result;
}
// We have to erase all results at once so that observers are notified with
@@ -205,12 +202,12 @@ void Mixer::Publish(const SortedResults& new_results,
// Add items back to |ui_results| in the order of |new_results|.
for (size_t i = 0; i < new_results.size(); ++i) {
- ChromeSearchResult* new_result = new_results[i].result;
+ SearchResult* new_result = new_results[i].result;
IdToResultMap::const_iterator ui_result_it =
ui_results_map.find(new_result->id());
if (ui_result_it != ui_results_map.end()) {
// Update and use the old result if it exists.
- ChromeSearchResult* ui_result = ui_result_it->second;
+ SearchResult* ui_result = ui_result_it->second;
UpdateResult(*new_result, ui_result);
// |ui_results| takes back ownership from |ui_results_map| here.
diff --git a/chrome/browser/ui/app_list/search/mixer.h b/chrome/browser/ui/app_list/search/mixer.h
index c555145..1e2f2fa 100644
--- a/chrome/browser/ui/app_list/search/mixer.h
+++ b/chrome/browser/ui/app_list/search/mixer.h
@@ -17,8 +17,8 @@ namespace test {
FORWARD_DECLARE_TEST(MixerTest, Publish);
}
-class ChromeSearchResult;
class SearchProvider;
+class SearchResult;
// Mixer collects results from providers, sorts them and publishes them to the
// SearchResults UI model. The targeted results have 6 slots to hold the
@@ -55,11 +55,11 @@ class Mixer {
// Used for sorting and mixing results.
struct SortData {
SortData();
- SortData(ChromeSearchResult* result, double score);
+ SortData(SearchResult* result, double score);
bool operator<(const SortData& other) const;
- ChromeSearchResult* result; // Not owned.
+ SearchResult* result; // Not owned.
double score;
};
typedef std::vector<Mixer::SortData> SortedResults;
diff --git a/chrome/browser/ui/app_list/search/mixer_unittest.cc b/chrome/browser/ui/app_list/search/mixer_unittest.cc
index 38ca5db..12fdc18 100644
--- a/chrome/browser/ui/app_list/search/mixer_unittest.cc
+++ b/chrome/browser/ui/app_list/search/mixer_unittest.cc
@@ -8,17 +8,17 @@
#include "base/strings/string16.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/browser/ui/app_list/search/history_types.h"
#include "chrome/browser/ui/app_list/search/mixer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/app_list/app_list_model.h"
#include "ui/app_list/search_provider.h"
+#include "ui/app_list/search_result.h"
namespace app_list {
namespace test {
-class TestSearchResult : public ChromeSearchResult {
+class TestSearchResult : public SearchResult {
public:
TestSearchResult(const std::string& id, double relevance)
: instance_id_(instantiation_count++) {
@@ -28,15 +28,11 @@ class TestSearchResult : public ChromeSearchResult {
}
virtual ~TestSearchResult() {}
- // ChromeSearchResult overides:
+ // SearchResult overrides:
virtual void Open(int event_flags) override {}
virtual void InvokeAction(int action_index, int event_flags) override {}
- virtual scoped_ptr<ChromeSearchResult> Duplicate() override {
- return scoped_ptr<ChromeSearchResult>(
- new TestSearchResult(id(), relevance())).Pass();
- }
- virtual ChromeSearchResultType GetType() override {
- return SEARCH_RESULT_TYPE_BOUNDARY;
+ virtual scoped_ptr<SearchResult> Duplicate() override {
+ return scoped_ptr<SearchResult>(new TestSearchResult(id(), relevance()));
}
// For reference equality testing. (Addresses cannot be used to test reference
@@ -196,12 +192,12 @@ TEST_F(MixerTest, RemoveDuplicates) {
}
TEST_F(MixerTest, Publish) {
- scoped_ptr<ChromeSearchResult> result1(new TestSearchResult("app1", 0));
- scoped_ptr<ChromeSearchResult> result2(new TestSearchResult("app2", 0));
- scoped_ptr<ChromeSearchResult> result3(new TestSearchResult("app3", 0));
- scoped_ptr<ChromeSearchResult> result3_copy = result3->Duplicate();
- scoped_ptr<ChromeSearchResult> result4(new TestSearchResult("app4", 0));
- scoped_ptr<ChromeSearchResult> result5(new TestSearchResult("app5", 0));
+ scoped_ptr<SearchResult> result1(new TestSearchResult("app1", 0));
+ scoped_ptr<SearchResult> result2(new TestSearchResult("app2", 0));
+ scoped_ptr<SearchResult> result3(new TestSearchResult("app3", 0));
+ scoped_ptr<SearchResult> result3_copy = result3->Duplicate();
+ scoped_ptr<SearchResult> result4(new TestSearchResult("app4", 0));
+ scoped_ptr<SearchResult> result5(new TestSearchResult("app5", 0));
AppListModel::SearchResults ui_results;
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc
index 5e4f5d8..5ba59ad 100644
--- a/chrome/browser/ui/app_list/search/omnibox_provider.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc
@@ -9,13 +9,14 @@
#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
+#include "chrome/browser/ui/app_list/search/search_util.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/metrics/proto/omnibox_event.pb.h"
#include "components/omnibox/autocomplete_input.h"
#include "components/omnibox/autocomplete_match.h"
#include "grit/theme_resources.h"
+#include "ui/app_list/search_result.h"
#include "ui/base/resource/resource_bundle.h"
namespace app_list {
@@ -65,7 +66,7 @@ void ACMatchClassificationsToTags(
}
}
-class OmniboxResult : public ChromeSearchResult {
+class OmniboxResult : public SearchResult {
public:
OmniboxResult(Profile* profile,
AutocompleteController* autocomplete_controller,
@@ -90,8 +91,9 @@ class OmniboxResult : public ChromeSearchResult {
}
virtual ~OmniboxResult() {}
- // ChromeSearchResult overides:
+ // SearchResult overrides:
virtual void Open(int event_flags) override {
+ RecordHistogram(OMNIBOX_SEARCH_RESULT);
chrome::NavigateParams params(profile_,
match_.destination_url,
match_.transition);
@@ -99,15 +101,9 @@ class OmniboxResult : public ChromeSearchResult {
chrome::Navigate(&params);
}
- virtual void InvokeAction(int action_index, int event_flags) override {}
-
- virtual scoped_ptr<ChromeSearchResult> Duplicate() override {
- return scoped_ptr<ChromeSearchResult>(
- new OmniboxResult(profile_, autocomplete_controller_, match_)).Pass();
- }
-
- virtual ChromeSearchResultType GetType() override {
- return OMNIBOX_SEARCH_RESULT;
+ virtual scoped_ptr<SearchResult> Duplicate() override {
+ return scoped_ptr<SearchResult>(
+ new OmniboxResult(profile_, autocomplete_controller_, match_));
}
private:
diff --git a/chrome/browser/ui/app_list/search/people/people_provider.cc b/chrome/browser/ui/app_list/search/people/people_provider.cc
index 176ba81..97419ae 100644
--- a/chrome/browser/ui/app_list/search/people/people_provider.cc
+++ b/chrome/browser/ui/app_list/search/people/people_provider.cc
@@ -182,9 +182,9 @@ void PeopleProvider::ProcessPeopleSearchResults(
}
}
-scoped_ptr<ChromeSearchResult> PeopleProvider::CreateResult(
+scoped_ptr<SearchResult> PeopleProvider::CreateResult(
const base::DictionaryValue& dict) {
- scoped_ptr<ChromeSearchResult> result;
+ scoped_ptr<SearchResult> result;
scoped_ptr<Person> person = Person::Create(dict);
if (!person)
diff --git a/chrome/browser/ui/app_list/search/people/people_provider.h b/chrome/browser/ui/app_list/search/people/people_provider.h
index 141fce5..7830dba 100644
--- a/chrome/browser/ui/app_list/search/people/people_provider.h
+++ b/chrome/browser/ui/app_list/search/people/people_provider.h
@@ -24,8 +24,8 @@ namespace test {
class PeopleProviderTest;
}
-class ChromeSearchResult;
class JSONResponseFetcher;
+class SearchResult;
// PeopleProvider fetches search results from the web store server.
// A "Search in web store" result will be returned if the server does not
@@ -67,8 +67,7 @@ class PeopleProvider : public WebserviceSearchProvider,
// Callback for people search results being fetched.
void OnPeopleSearchFetched(scoped_ptr<base::DictionaryValue> json);
void ProcessPeopleSearchResults(const base::DictionaryValue* json);
- scoped_ptr<ChromeSearchResult> CreateResult(
- const base::DictionaryValue& dict);
+ scoped_ptr<SearchResult> CreateResult(const base::DictionaryValue& dict);
// Setup the various variables that we override for testing.
void SetupForTest(const base::Closure& people_search_fetched_callback,
diff --git a/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc b/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc
index 7c0a892..07f3381 100644
--- a/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc
+++ b/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc
@@ -11,7 +11,6 @@
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/browser/ui/app_list/search/people/people_provider.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
@@ -19,6 +18,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
+#include "ui/app_list/search_result.h"
using content::BrowserThread;
using net::test_server::BasicHttpResponse;
diff --git a/chrome/browser/ui/app_list/search/people/people_result.cc b/chrome/browser/ui/app_list/search/people/people_result.cc
index 57ae19f..6278313 100644
--- a/chrome/browser/ui/app_list/search/people/people_result.cc
+++ b/chrome/browser/ui/app_list/search/people/people_result.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/browser/ui/app_list/search/common/url_icon_source.h"
#include "chrome/browser/ui/app_list/search/people/person.h"
+#include "chrome/browser/ui/app_list/search/search_util.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/common/extensions/api/hangouts_private.h"
#include "chrome/grit/generated_resources.h"
@@ -86,6 +87,8 @@ PeopleResult::~PeopleResult() {
}
void PeopleResult::Open(int event_flags) {
+ RecordHistogram(SEARCH_PEOPLE_SEARCH_RESULT);
+
// Action 0 will always be our default action.
InvokeAction(0, event_flags);
}
@@ -109,9 +112,9 @@ void PeopleResult::InvokeAction(int action_index, int event_flags) {
}
}
-scoped_ptr<ChromeSearchResult> PeopleResult::Duplicate() {
- return scoped_ptr<ChromeSearchResult>(
- new PeopleResult(profile_, person_->Duplicate().Pass())).Pass();
+scoped_ptr<SearchResult> PeopleResult::Duplicate() {
+ return scoped_ptr<SearchResult>(
+ new PeopleResult(profile_, person_->Duplicate().Pass()));
}
void PeopleResult::OnIconLoaded() {
@@ -194,8 +197,4 @@ void PeopleResult::RefreshHangoutsExtensionId() {
hangouts_extension_id_.clear();
}
-ChromeSearchResultType PeopleResult::GetType() {
- return SEARCH_PEOPLE_SEARCH_RESULT;
-}
-
} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/people/people_result.h b/chrome/browser/ui/app_list/search/people/people_result.h
index 87f18d2..69ffabe 100644
--- a/chrome/browser/ui/app_list/search/people/people_result.h
+++ b/chrome/browser/ui/app_list/search/people/people_result.h
@@ -9,7 +9,7 @@
#include "base/basictypes.h"
#include "base/memory/weak_ptr.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
+#include "ui/app_list/search_result.h"
#include "url/gurl.h"
class Profile;
@@ -18,16 +18,15 @@ namespace app_list {
struct Person;
-class PeopleResult : public ChromeSearchResult {
+class PeopleResult : public SearchResult {
public:
PeopleResult(Profile* profile, scoped_ptr<Person> person);
virtual ~PeopleResult();
- // ChromeSearchResult overides:
+ // SearchResult overrides:
virtual void Open(int event_flags) override;
virtual void InvokeAction(int action_index, int event_flags) override;
- virtual scoped_ptr<ChromeSearchResult> Duplicate() override;
- virtual ChromeSearchResultType GetType() override;
+ virtual scoped_ptr<SearchResult> Duplicate() override;
private:
void OnIconLoaded();
diff --git a/chrome/browser/ui/app_list/search/search_controller.cc b/chrome/browser/ui/app_list/search/search_controller.cc
index 6a3fb4e..7030e5a 100644
--- a/chrome/browser/ui/app_list/search/search_controller.cc
+++ b/chrome/browser/ui/app_list/search/search_controller.cc
@@ -10,13 +10,11 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/memory/scoped_ptr.h"
-#include "base/metrics/histogram.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
#include "chrome/browser/ui/app_list/search/app_search_provider.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/browser/ui/app_list/search/history.h"
#include "chrome/browser/ui/app_list/search/history_factory.h"
#include "chrome/browser/ui/app_list/search/omnibox_provider.h"
@@ -29,16 +27,15 @@
#include "grit/components_scaled_resources.h"
#include "grit/theme_resources.h"
#include "ui/app_list/search_box_model.h"
+#include "ui/app_list/search_result.h"
#include "ui/app_list/speech_ui_model.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
namespace {
- const char kAppListSearchResultOpenTypeHistogram[] =
- "Apps.AppListSearchResultOpenType";
- // Maximum time (in milliseconds) to wait to the search providers to finish.
- const int kStopTimeMS = 1500;
+// Maximum time (in milliseconds) to wait to the search providers to finish.
+const int kStopTimeMS = 1500;
}
namespace app_list {
@@ -133,16 +130,11 @@ void SearchController::OpenResult(SearchResult* result, int event_flags) {
// Count AppList.Search here because it is composed of search + action.
content::RecordAction(base::UserMetricsAction("AppList_Search"));
- ChromeSearchResult* chrome_result =
- static_cast<app_list::ChromeSearchResult*>(result);
- UMA_HISTOGRAM_ENUMERATION(kAppListSearchResultOpenTypeHistogram,
- chrome_result->GetType(),
- SEARCH_RESULT_TYPE_BOUNDARY);
- chrome_result->Open(event_flags);
+ result->Open(event_flags);
if (history_ && history_->IsReady()) {
history_->AddLaunchEvent(base::UTF16ToUTF8(search_box_->text()),
- chrome_result->id());
+ result->id());
}
}
@@ -150,8 +142,7 @@ void SearchController::InvokeResultAction(SearchResult* result,
int action_index,
int event_flags) {
// TODO(xiyuan): Hook up with user learning.
- static_cast<app_list::ChromeSearchResult*>(result)->InvokeAction(
- action_index, event_flags);
+ result->InvokeAction(action_index, event_flags);
}
void SearchController::AddProvider(Mixer::GroupId group,
diff --git a/chrome/browser/ui/app_list/search/search_util.cc b/chrome/browser/ui/app_list/search/search_util.cc
new file mode 100644
index 0000000..de72de7
--- /dev/null
+++ b/chrome/browser/ui/app_list/search/search_util.cc
@@ -0,0 +1,21 @@
+// Copyright 2014 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 "chrome/browser/ui/app_list/search/search_util.h"
+
+#include "base/metrics/histogram.h"
+
+namespace {
+const char kAppListSearchResultOpenTypeHistogram[] =
+ "Apps.AppListSearchResultOpenType";
+}
+
+namespace app_list {
+
+void RecordHistogram(SearchResultType type) {
+ UMA_HISTOGRAM_ENUMERATION(
+ kAppListSearchResultOpenTypeHistogram, type, SEARCH_RESULT_TYPE_BOUNDARY);
+}
+
+} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_util.h b/chrome/browser/ui/app_list/search/search_util.h
new file mode 100644
index 0000000..3e58795
--- /dev/null
+++ b/chrome/browser/ui/app_list/search/search_util.h
@@ -0,0 +1,31 @@
+// Copyright 2014 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.
+
+#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_UTIL_H_
+#define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_UTIL_H_
+
+namespace app_list {
+
+// The type of the chrome search result. This is used for logging so do not
+// change the order of this enum.
+enum SearchResultType {
+ // A result that forwards an omnibox search result.
+ OMNIBOX_SEARCH_RESULT,
+ // An app result.
+ APP_SEARCH_RESULT,
+ // A search result from the webstore.
+ WEBSTORE_SEARCH_RESULT,
+ // A result that opens a webstore search.
+ SEARCH_WEBSTORE_SEARCH_RESULT,
+ // A result that opens a people search.
+ SEARCH_PEOPLE_SEARCH_RESULT,
+ SEARCH_RESULT_TYPE_BOUNDARY
+};
+
+// Record a UMA histogram.
+void RecordHistogram(SearchResultType type);
+
+} // namespace app_list
+
+#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_UTIL_H_
diff --git a/chrome/browser/ui/app_list/search/search_webstore_result.cc b/chrome/browser/ui/app_list/search/search_webstore_result.cc
index fa5f1b5..03a1766 100644
--- a/chrome/browser/ui/app_list/search/search_webstore_result.cc
+++ b/chrome/browser/ui/app_list/search/search_webstore_result.cc
@@ -6,6 +6,7 @@
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/app_list/search/search_util.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/grit/generated_resources.h"
@@ -42,6 +43,7 @@ SearchWebstoreResult::SearchWebstoreResult(Profile* profile,
SearchWebstoreResult::~SearchWebstoreResult() {}
void SearchWebstoreResult::Open(int event_flags) {
+ RecordHistogram(WEBSTORE_SEARCH_RESULT);
const GURL store_url = net::AppendQueryParameter(
launch_url_,
extension_urls::kWebstoreSourceField,
@@ -54,16 +56,8 @@ void SearchWebstoreResult::Open(int event_flags) {
chrome::Navigate(&params);
}
-void SearchWebstoreResult::InvokeAction(int action_index, int event_flags) {
-}
-
-scoped_ptr<ChromeSearchResult> SearchWebstoreResult::Duplicate() {
- return scoped_ptr<ChromeSearchResult>(
- new SearchWebstoreResult(profile_, query_)).Pass();
-}
-
-ChromeSearchResultType SearchWebstoreResult::GetType() {
- return WEBSTORE_SEARCH_RESULT;
+scoped_ptr<SearchResult> SearchWebstoreResult::Duplicate() {
+ return scoped_ptr<SearchResult>(new SearchWebstoreResult(profile_, query_));
}
} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_webstore_result.h b/chrome/browser/ui/app_list/search/search_webstore_result.h
index bd7fadf..36feace 100644
--- a/chrome/browser/ui/app_list/search/search_webstore_result.h
+++ b/chrome/browser/ui/app_list/search/search_webstore_result.h
@@ -8,7 +8,7 @@
#include <string>
#include "base/basictypes.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
+#include "ui/app_list/search_result.h"
#include "url/gurl.h"
class Profile;
@@ -16,16 +16,14 @@ class Profile;
namespace app_list {
// A "search in webstore" result.
-class SearchWebstoreResult : public ChromeSearchResult {
+class SearchWebstoreResult : public SearchResult {
public:
SearchWebstoreResult(Profile* profile, const std::string& query);
virtual ~SearchWebstoreResult();
- // ChromeSearchResult overides:
+ // SearchResult overrides:
virtual void Open(int event_flags) override;
- virtual void InvokeAction(int action_index, int event_flags) override;
- virtual scoped_ptr<ChromeSearchResult> Duplicate() override;
- virtual ChromeSearchResultType GetType() override;
+ virtual scoped_ptr<SearchResult> Duplicate() override;
private:
Profile* profile_;
diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc b/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc
index 81ad199..8009fae 100644
--- a/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc
+++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider.cc
@@ -146,9 +146,9 @@ void WebstoreProvider::ProcessWebstoreSearchResults(
}
}
-scoped_ptr<ChromeSearchResult> WebstoreProvider::CreateResult(
+scoped_ptr<SearchResult> WebstoreProvider::CreateResult(
const base::DictionaryValue& dict) {
- scoped_ptr<ChromeSearchResult> result;
+ scoped_ptr<SearchResult> result;
std::string app_id;
std::string localized_name;
diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider.h b/chrome/browser/ui/app_list/search/webstore/webstore_provider.h
index 1526512..eb697d4 100644
--- a/chrome/browser/ui/app_list/search/webstore/webstore_provider.h
+++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider.h
@@ -22,8 +22,8 @@ namespace test {
class WebstoreProviderTest;
}
-class ChromeSearchResult;
class JSONResponseFetcher;
+class SearchResult;
// WebstoreProvider fetches search results from the web store server.
// A "Search in web store" result will be returned if the server does not
@@ -45,8 +45,7 @@ class WebstoreProvider : public WebserviceSearchProvider{
void OnWebstoreSearchFetched(scoped_ptr<base::DictionaryValue> json);
void ProcessWebstoreSearchResults(const base::DictionaryValue* json);
- scoped_ptr<ChromeSearchResult> CreateResult(
- const base::DictionaryValue& dict);
+ scoped_ptr<SearchResult> CreateResult(const base::DictionaryValue& dict);
void set_webstore_search_fetched_callback(const base::Closure& callback) {
webstore_search_fetched_callback_ = callback;
diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc b/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
index 426880d..60f6c46 100644
--- a/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
+++ b/chrome/browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc
@@ -11,7 +11,6 @@
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/browser/ui/app_list/search/webstore/webstore_provider.h"
#include "chrome/browser/ui/app_list/search/webstore/webstore_result.h"
#include "chrome/common/chrome_switches.h"
@@ -21,6 +20,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
+#include "ui/app_list/search_result.h"
using content::BrowserThread;
using extensions::Manifest;
diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_result.cc b/chrome/browser/ui/app_list/search/webstore/webstore_result.cc
index 919dd50..cb543e7 100644
--- a/chrome/browser/ui/app_list/search/webstore/webstore_result.cc
+++ b/chrome/browser/ui/app_list/search/webstore/webstore_result.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
#include "chrome/browser/ui/app_list/search/common/url_icon_source.h"
+#include "chrome/browser/ui/app_list/search/search_util.h"
#include "chrome/browser/ui/app_list/search/webstore/webstore_installer.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/extensions/application_launch.h"
@@ -105,6 +106,7 @@ WebstoreResult::~WebstoreResult() {
}
void WebstoreResult::Open(int event_flags) {
+ RecordHistogram(SEARCH_WEBSTORE_SEARCH_RESULT);
const GURL store_url = net::AppendQueryParameter(
GURL(extension_urls::GetWebstoreItemDetailURLPrefix() + app_id_),
extension_urls::kWebstoreSourceField,
@@ -128,14 +130,14 @@ void WebstoreResult::InvokeAction(int action_index, int event_flags) {
StartInstall(action_index == kLaunchEphemeralAppAction);
}
-scoped_ptr<ChromeSearchResult> WebstoreResult::Duplicate() {
- return scoped_ptr<ChromeSearchResult>(new WebstoreResult(profile_,
- app_id_,
- localized_name_,
- icon_url_,
- is_paid_,
- item_type_,
- controller_)).Pass();
+scoped_ptr<SearchResult> WebstoreResult::Duplicate() {
+ return scoped_ptr<SearchResult>(new WebstoreResult(profile_,
+ app_id_,
+ localized_name_,
+ icon_url_,
+ is_paid_,
+ item_type_,
+ controller_));
}
void WebstoreResult::InitAndStartObserving() {
@@ -301,8 +303,4 @@ void WebstoreResult::OnShutdown(extensions::ExtensionRegistry* registry) {
StopObservingRegistry();
}
-ChromeSearchResultType WebstoreResult::GetType() {
- return SEARCH_WEBSTORE_SEARCH_RESULT;
-}
-
} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/webstore/webstore_result.h b/chrome/browser/ui/app_list/search/webstore/webstore_result.h
index a918922..3a6c1eb 100644
--- a/chrome/browser/ui/app_list/search/webstore/webstore_result.h
+++ b/chrome/browser/ui/app_list/search/webstore/webstore_result.h
@@ -10,10 +10,10 @@
#include "base/basictypes.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/extensions/install_observer.h"
-#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
#include "chrome/common/extensions/webstore_install_result.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/manifest.h"
+#include "ui/app_list/search_result.h"
#include "url/gurl.h"
class AppListControllerDelegate;
@@ -26,7 +26,7 @@ class InstallTracker;
namespace app_list {
-class WebstoreResult : public ChromeSearchResult,
+class WebstoreResult : public SearchResult,
public extensions::InstallObserver,
public extensions::ExtensionRegistryObserver {
public:
@@ -44,11 +44,10 @@ class WebstoreResult : public ChromeSearchResult,
extensions::Manifest::Type item_type() const { return item_type_; }
bool is_paid() const { return is_paid_; }
- // ChromeSearchResult overides:
+ // SearchResult overrides:
virtual void Open(int event_flags) override;
virtual void InvokeAction(int action_index, int event_flags) override;
- virtual scoped_ptr<ChromeSearchResult> Duplicate() override;
- virtual ChromeSearchResultType GetType() override;
+ virtual scoped_ptr<SearchResult> Duplicate() override;
private:
// Set the initial state and start observing both InstallObserver and
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index d48fb4d..dec4bcb 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -1190,7 +1190,6 @@
'browser/ui/app_list/search/app_result.h',
'browser/ui/app_list/search/app_search_provider.cc',
'browser/ui/app_list/search/app_search_provider.h',
- 'browser/ui/app_list/search/chrome_search_result.h',
'browser/ui/app_list/search/common/dictionary_data_store.cc',
'browser/ui/app_list/search/common/dictionary_data_store.h',
'browser/ui/app_list/search/common/json_response_fetcher.cc',
@@ -1224,6 +1223,8 @@
'browser/ui/app_list/search/people/person.h',
'browser/ui/app_list/search/search_controller.cc',
'browser/ui/app_list/search/search_controller.h',
+ 'browser/ui/app_list/search/search_util.cc',
+ 'browser/ui/app_list/search/search_util.h',
'browser/ui/app_list/search/search_webstore_result.cc',
'browser/ui/app_list/search/search_webstore_result.h',
'browser/ui/app_list/search/webstore/webstore_installer.cc',
diff --git a/ui/app_list/BUILD.gn b/ui/app_list/BUILD.gn
index c4ed603..4f97f80 100644
--- a/ui/app_list/BUILD.gn
+++ b/ui/app_list/BUILD.gn
@@ -180,6 +180,8 @@ static_library("test_support") {
"test/app_list_test_model.h",
"test/app_list_test_view_delegate.cc",
"test/app_list_test_view_delegate.h",
+ "test/test_search_result.cc",
+ "test/test_search_result.h",
]
deps = [
diff --git a/ui/app_list/app_list.gyp b/ui/app_list/app_list.gyp
index 39675a8f..c15be36 100644
--- a/ui/app_list/app_list.gyp
+++ b/ui/app_list/app_list.gyp
@@ -204,6 +204,8 @@
'test/app_list_test_model.h',
'test/app_list_test_view_delegate.cc',
'test/app_list_test_view_delegate.h',
+ 'test/test_search_result.cc',
+ 'test/test_search_result.h',
],
},
{
diff --git a/ui/app_list/cocoa/apps_search_results_controller_unittest.mm b/ui/app_list/cocoa/apps_search_results_controller_unittest.mm
index 0b3ae52..b6f2f95 100644
--- a/ui/app_list/cocoa/apps_search_results_controller_unittest.mm
+++ b/ui/app_list/cocoa/apps_search_results_controller_unittest.mm
@@ -10,8 +10,8 @@
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#import "testing/gtest_mac.h"
-#include "ui/app_list/search_result.h"
#include "ui/app_list/test/app_list_test_model.h"
+#include "ui/app_list/test/test_search_result.h"
#include "ui/base/models/simple_menu_model.h"
#import "ui/events/test/cocoa_test_event_utils.h"
#include "ui/gfx/image/image_skia_util_mac.h"
@@ -60,7 +60,7 @@ namespace {
const int kDefaultResultsCount = 3;
-class SearchResultWithMenu : public SearchResult {
+class SearchResultWithMenu : public TestSearchResult {
public:
SearchResultWithMenu(const std::string& title, const std::string& details)
: menu_model_(NULL),
diff --git a/ui/app_list/search_provider.cc b/ui/app_list/search_provider.cc
index 916825f..0a652f5 100644
--- a/ui/app_list/search_provider.cc
+++ b/ui/app_list/search_provider.cc
@@ -13,10 +13,6 @@ SearchProvider::SearchProvider() {
SearchProvider::~SearchProvider() {
}
-void SearchProvider::ReleaseResult(std::vector<SearchResult*>* results) {
- results_.release(results);
-}
-
void SearchProvider::Add(scoped_ptr<SearchResult> result) {
results_.push_back(result.release());
FireResultChanged();
diff --git a/ui/app_list/search_provider.h b/ui/app_list/search_provider.h
index f8ebfd0..d092c7e 100644
--- a/ui/app_list/search_provider.h
+++ b/ui/app_list/search_provider.h
@@ -34,9 +34,6 @@ class APP_LIST_EXPORT SearchProvider {
result_changed_callback_ = callback;
}
- // TODO(mukai): Fix the ownership and copying of the results.
- void ReleaseResult(std::vector<SearchResult*>* results);
-
const Results& results() const { return results_; }
protected:
diff --git a/ui/app_list/search_result.h b/ui/app_list/search_result.h
index 7e7524f..9db0f63 100644
--- a/ui/app_list/search_result.h
+++ b/ui/app_list/search_result.h
@@ -118,10 +118,14 @@ class APP_LIST_EXPORT SearchResult {
void AddObserver(SearchResultObserver* observer);
void RemoveObserver(SearchResultObserver* observer);
+ // TODO(mukai): Remove this method and really simplify the ownership of
+ // SearchResult. Ideally, SearchResult will be copyable.
+ virtual scoped_ptr<SearchResult> Duplicate() = 0;
+
// Opens the result.
virtual void Open(int event_flags);
- // Invokes a custom action on the result.
+ // Invokes a custom action on the result. It does nothing by default.
virtual void InvokeAction(int action_index, int event_flags);
// Returns the context menu model for this item, or NULL if there is currently
diff --git a/ui/app_list/test/test_search_result.cc b/ui/app_list/test/test_search_result.cc
new file mode 100644
index 0000000..361d670
--- /dev/null
+++ b/ui/app_list/test/test_search_result.cc
@@ -0,0 +1,20 @@
+// Copyright 2014 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 "ui/app_list/test/test_search_result.h"
+
+namespace app_list {
+
+TestSearchResult::TestSearchResult() {
+}
+
+TestSearchResult::~TestSearchResult() {
+}
+
+scoped_ptr<SearchResult> TestSearchResult::Duplicate() {
+ NOTREACHED();
+ return scoped_ptr<SearchResult>();
+}
+
+} // namespace app_list
diff --git a/ui/app_list/test/test_search_result.h b/ui/app_list/test/test_search_result.h
new file mode 100644
index 0000000..b54908d
--- /dev/null
+++ b/ui/app_list/test/test_search_result.h
@@ -0,0 +1,27 @@
+// Copyright 2014 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.
+
+#ifndef UI_APP_LIST_TEST_TEST_SEARCH_RESULT_H_
+#define UI_APP_LIST_TEST_TEST_SEARCH_RESULT_H_
+
+#include "ui/app_list/search_result.h"
+
+namespace app_list {
+
+// A test search result which does nothing.
+class TestSearchResult : public SearchResult {
+ public:
+ TestSearchResult();
+ virtual ~TestSearchResult();
+
+ // SearchResult:
+ virtual scoped_ptr<SearchResult> Duplicate() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestSearchResult);
+};
+
+} // namespace app_list
+
+#endif // UI_APP_LIST_TEST_TEST_SEARCH_RESULT_H_
diff --git a/ui/app_list/views/app_list_view_unittest.cc b/ui/app_list/views/app_list_view_unittest.cc
index 1238e25..29428ea 100644
--- a/ui/app_list/views/app_list_view_unittest.cc
+++ b/ui/app_list/views/app_list_view_unittest.cc
@@ -14,6 +14,7 @@
#include "ui/app_list/search_box_model.h"
#include "ui/app_list/test/app_list_test_model.h"
#include "ui/app_list/test/app_list_test_view_delegate.h"
+#include "ui/app_list/test/test_search_result.h"
#include "ui/app_list/views/app_list_folder_view.h"
#include "ui/app_list/views/app_list_main_view.h"
#include "ui/app_list/views/apps_container_view.h"
@@ -61,7 +62,7 @@ size_t GetVisibleTileItemViews(const std::vector<TileItemView*>& tiles) {
// Choose a set that is 3 regular app list pages and 2 landscape app list pages.
const int kInitialItems = 34;
-class TestTileSearchResult : public SearchResult {
+class TestTileSearchResult : public TestSearchResult {
public:
TestTileSearchResult() { set_display_type(DISPLAY_TILE); }
virtual ~TestTileSearchResult() {}
diff --git a/ui/app_list/views/search_result_list_view_unittest.cc b/ui/app_list/views/search_result_list_view_unittest.cc
index 19ba7f7..e48a760 100644
--- a/ui/app_list/views/search_result_list_view_unittest.cc
+++ b/ui/app_list/views/search_result_list_view_unittest.cc
@@ -8,8 +8,8 @@
#include "base/strings/utf_string_conversions.h"
#include "ui/app_list/app_list_model.h"
-#include "ui/app_list/search_result.h"
#include "ui/app_list/test/app_list_test_view_delegate.h"
+#include "ui/app_list/test/test_search_result.h"
#include "ui/app_list/views/progress_bar_view.h"
#include "ui/app_list/views/search_result_list_view_delegate.h"
#include "ui/app_list/views/search_result_view.h"
@@ -55,7 +55,7 @@ class SearchResultListViewTest : public views::ViewsTestBase,
void SetUpSearchResults() {
AppListModel::SearchResults* results = GetResults();
for (int i = 0; i < kDefaultSearchItems; ++i)
- results->Add(new SearchResult());
+ results->Add(new TestSearchResult());
// Adding results will schedule Update().
RunPendingMessages();
@@ -78,7 +78,7 @@ class SearchResultListViewTest : public views::ViewsTestBase,
}
void AddTestResultAtIndex(int index) {
- GetResults()->Add(new SearchResult());
+ GetResults()->Add(new TestSearchResult());
}
void DeleteResultAt(int index) { GetResults()->DeleteAt(index); }