Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2732)

Unified Diff: chrome/browser/ui/app_list/search/webstore_provider.cc

Issue 15342003: app_list: Add web store search. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase and address nits in #3 Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/app_list/search/webstore_provider.cc
diff --git a/chrome/browser/ui/app_list/search/webstore_provider.cc b/chrome/browser/ui/app_list/search/webstore_provider.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2abc732f8a09c4626395262370c927ebf79a6222
--- /dev/null
+++ b/chrome/browser/ui/app_list/search/webstore_provider.cc
@@ -0,0 +1,120 @@
+// 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.
+
+#include "chrome/browser/ui/app_list/search/webstore_provider.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/search/search_webstore_result.h"
+#include "chrome/browser/ui/app_list/search/webstore_result.h"
+#include "chrome/browser/ui/app_list/search/webstore_search_fetcher.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "googleurl/src/gurl.h"
+
+namespace app_list {
+
+namespace {
+
+const char kKeyResults[] = "results";
+const char kKeyId[] = "id";
+const char kKeyLocalizedName[] = "localized_name";
+const char kKeyIconUrl[] = "icon_url";
+
+} // namespace
+
+WebstoreProvider::WebstoreProvider(Profile* profile) : profile_(profile) {}
+
+WebstoreProvider::~WebstoreProvider() {}
+
+void WebstoreProvider::Start(const base::string16& query) {
+ if (!webstore_search_) {
+ webstore_search_.reset(new WebstoreSearchFetcher(
+ base::Bind(&WebstoreProvider::OnWebstoreSearchFetched,
+ base::Unretained(this)),
+ profile_->GetRequestContext()));
+ }
+
+ const std::string query_utf8 = UTF16ToUTF8(query);
+ webstore_search_->Start(query_utf8,
+ g_browser_process->GetApplicationLocale());
+
+ // Add a placeholder result which when clicked will run the user's query in a
+ // browser. This placeholder is removed when the search results arrive.
+ ClearResults();
+ Add(scoped_ptr<ChromeSearchResult>(
+ new SearchWebstoreResult(profile_, query_utf8)).Pass());
+}
+
+void WebstoreProvider::Stop() {
+ if (webstore_search_)
+ webstore_search_->Stop();
+}
+
+void WebstoreProvider::OnWebstoreSearchFetched(
+ scoped_ptr<base::DictionaryValue> json) {
+ ProcessWebstoreSearchResults(json.get());
+
+ if (!webstore_search_fetched_callback_.is_null())
+ webstore_search_fetched_callback_.Run();
+}
+
+void WebstoreProvider::ProcessWebstoreSearchResults(
+ base::DictionaryValue* json) {
+ base::ListValue* result_list = NULL;
+ if (!json ||
+ !json->GetList(kKeyResults, &result_list) ||
+ !result_list ||
+ result_list->empty()) {
+ return;
+ }
+
+ bool first_result = true;
+ for (ListValue::const_iterator it = result_list->begin();
+ it != result_list->end();
+ ++it) {
+ base::DictionaryValue* dict;
+ if (!(*it)->GetAsDictionary(&dict))
+ continue;
+
+ scoped_ptr<ChromeSearchResult> result(CreateResult(*dict));
+ if (!result)
+ continue;
+
+ if (first_result) {
+ // Clears "search in webstore" place holder results.
+ ClearResults();
+ first_result = false;
+ }
+
+ Add(result.Pass());
+ }
+}
+
+scoped_ptr<ChromeSearchResult> WebstoreProvider::CreateResult(
+ const base::DictionaryValue& dict) {
+ scoped_ptr<ChromeSearchResult> result;
+
+ std::string app_id;
+ std::string localized_name;
+ std::string icon_url_string;
+ if (!dict.GetString(kKeyId, &app_id) ||
+ !dict.GetString(kKeyLocalizedName, &localized_name) ||
+ !dict.GetString(kKeyIconUrl, &icon_url_string)) {
+ return result.Pass();
+ }
+
+ GURL icon_url(icon_url_string);
+ if (!icon_url.is_valid())
+ return result.Pass();
+
+ result.reset(new WebstoreResult(profile_, app_id, localized_name, icon_url));
+ return result.Pass();
+}
+
+} // namespace app_list

Powered by Google App Engine
This is Rietveld 408576698