1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/app_list/search/common/json_response_fetcher.h"
8 #include "base/values.h"
9 #include "chrome/browser/safe_json_parser.h"
10 #include "net/base/load_flags.h"
11 #include "net/url_request/url_fetcher.h"
12 #include "net/url_request/url_request_status.h"
17 const char kBadResponse[] = "Bad Web Service search response";
19 JSONResponseFetcher::JSONResponseFetcher(
20 const Callback& callback,
21 net::URLRequestContextGetter* context_getter)
22 : callback_(callback),
23 context_getter_(context_getter),
25 DCHECK(!callback_.is_null());
28 JSONResponseFetcher::~JSONResponseFetcher() {}
30 void JSONResponseFetcher::Start(const GURL& query_url) {
33 fetcher_.reset(net::URLFetcher::Create(
37 fetcher_->SetRequestContext(context_getter_);
38 fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
39 net::LOAD_DISABLE_CACHE);
43 void JSONResponseFetcher::Stop() {
45 weak_factory_.InvalidateWeakPtrs();
48 void JSONResponseFetcher::OnJsonParseSuccess(
49 scoped_ptr<base::Value> parsed_json) {
50 if (!parsed_json->IsType(base::Value::TYPE_DICTIONARY)) {
51 OnJsonParseError(kBadResponse);
55 callback_.Run(make_scoped_ptr(
56 static_cast<base::DictionaryValue*>(parsed_json.release())));
59 void JSONResponseFetcher::OnJsonParseError(const std::string& error) {
60 callback_.Run(scoped_ptr<base::DictionaryValue>());
63 void JSONResponseFetcher::OnURLFetchComplete(
64 const net::URLFetcher* source) {
65 CHECK_EQ(fetcher_.get(), source);
67 scoped_ptr<net::URLFetcher> fetcher(fetcher_.Pass());
69 if (!fetcher->GetStatus().is_success() ||
70 fetcher->GetResponseCode() != 200) {
71 OnJsonParseError(kBadResponse);
75 std::string json_data;
76 fetcher->GetResponseAsString(&json_data);
78 scoped_refptr<SafeJsonParser> parser =
79 new SafeJsonParser(json_data,
81 &JSONResponseFetcher::OnJsonParseSuccess,
82 weak_factory_.GetWeakPtr()),
84 &JSONResponseFetcher::OnJsonParseError,
85 weak_factory_.GetWeakPtr()));
86 // The parser will call us back via one of the callbacks.
90 } // namespace app_list