| Index: chrome/browser/ui/app_list/search/webstore_search_fetcher.cc
|
| diff --git a/chrome/browser/ui/app_list/search/webstore_search_fetcher.cc b/chrome/browser/ui/app_list/search/webstore_search_fetcher.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..27dff35be1a7f4327d656667b6cc5bdb30ed401a
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/app_list/search/webstore_search_fetcher.cc
|
| @@ -0,0 +1,88 @@
|
| +// 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_search_fetcher.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/safe_json_parser.h"
|
| +#include "chrome/common/extensions/extension_constants.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "net/url_request/url_fetcher.h"
|
| +#include "net/url_request/url_request_status.h"
|
| +
|
| +namespace app_list {
|
| +
|
| +const char kBadResponse[] = "Bad Web Store search response";
|
| +
|
| +WebstoreSearchFetcher::WebstoreSearchFetcher(
|
| + const Callback& callback,
|
| + net::URLRequestContextGetter* context_getter)
|
| + : callback_(callback),
|
| + context_getter_(context_getter),
|
| + weak_factory_(this) {
|
| + DCHECK(!callback_.is_null());
|
| +}
|
| +
|
| +WebstoreSearchFetcher::~WebstoreSearchFetcher() {}
|
| +
|
| +void WebstoreSearchFetcher::Start(const std::string& query,
|
| + const std::string& hl) {
|
| + Stop();
|
| +
|
| + fetcher_.reset(net::URLFetcher::Create(
|
| + extension_urls::GetWebstoreJsonSearchUrl(query, hl),
|
| + net::URLFetcher::GET,
|
| + this));
|
| + fetcher_->SetRequestContext(context_getter_);
|
| + fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
|
| + net::LOAD_DISABLE_CACHE);
|
| + fetcher_->Start();
|
| +}
|
| +
|
| +void WebstoreSearchFetcher::Stop() {
|
| + fetcher_.reset();
|
| + weak_factory_.InvalidateWeakPtrs();
|
| +}
|
| +
|
| +void WebstoreSearchFetcher::OnJsonParseSuccess(
|
| + scoped_ptr<base::Value> parsed_json) {
|
| + if (!parsed_json->IsType(base::Value::TYPE_DICTIONARY)) {
|
| + OnJsonParseError(kBadResponse);
|
| + return;
|
| + }
|
| +
|
| + callback_.Run(make_scoped_ptr(
|
| + static_cast<base::DictionaryValue*>(parsed_json.release())));
|
| +}
|
| +
|
| +void WebstoreSearchFetcher::OnJsonParseError(const std::string& error) {
|
| + callback_.Run(scoped_ptr<base::DictionaryValue>());
|
| +}
|
| +
|
| +void WebstoreSearchFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
|
| + CHECK_EQ(fetcher_.get(), source);
|
| +
|
| + scoped_ptr<net::URLFetcher> fetcher(fetcher_.Pass());
|
| +
|
| + if (!fetcher->GetStatus().is_success() ||
|
| + fetcher->GetResponseCode() != 200) {
|
| + OnJsonParseError(kBadResponse);
|
| + return;
|
| + }
|
| +
|
| + std::string webstore_json_data;
|
| + fetcher->GetResponseAsString(&webstore_json_data);
|
| +
|
| + scoped_refptr<SafeJsonParser> parser =
|
| + new SafeJsonParser(webstore_json_data,
|
| + base::Bind(&WebstoreSearchFetcher::OnJsonParseSuccess,
|
| + weak_factory_.GetWeakPtr()),
|
| + base::Bind(&WebstoreSearchFetcher::OnJsonParseError,
|
| + weak_factory_.GetWeakPtr()));
|
| + // The parser will call us back via one of the callbacks.
|
| + parser->Start();
|
| +}
|
| +
|
| +} // namespace app_list
|
|
|