blob: 4588e4ef20c92d6498b3a7dc94a52bb67d0fe93e [file] [log] [blame]
// 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/common/json_response_fetcher.h"
#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/safe_json_parser.h"
#include "net/base/load_flags.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_status.h"
#include "url/gurl.h"
namespace app_list {
const char kBadResponse[] = "Bad Web Service search response";
JSONResponseFetcher::JSONResponseFetcher(
const Callback& callback,
net::URLRequestContextGetter* context_getter)
: callback_(callback),
context_getter_(context_getter),
weak_factory_(this) {
DCHECK(!callback_.is_null());
}
JSONResponseFetcher::~JSONResponseFetcher() {}
void JSONResponseFetcher::Start(const GURL& query_url) {
Stop();
fetcher_.reset(net::URLFetcher::Create(
query_url,
net::URLFetcher::GET,
this));
fetcher_->SetRequestContext(context_getter_);
fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
net::LOAD_DISABLE_CACHE);
fetcher_->Start();
}
void JSONResponseFetcher::Stop() {
fetcher_.reset();
weak_factory_.InvalidateWeakPtrs();
}
void JSONResponseFetcher::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 JSONResponseFetcher::OnJsonParseError(const std::string& error) {
callback_.Run(scoped_ptr<base::DictionaryValue>());
}
void JSONResponseFetcher::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(
&JSONResponseFetcher::OnJsonParseSuccess,
weak_factory_.GetWeakPtr()),
base::Bind(
&JSONResponseFetcher::OnJsonParseError,
weak_factory_.GetWeakPtr()));
// The parser will call us back via one of the callbacks.
parser->Start();
}
} // namespace app_list