json_response_fetcher.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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. 4 5#include "chrome/browser/ui/app_list/search/common/json_response_fetcher.h" 6 7#include "base/bind.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" 13#include "url/gurl.h" 14 15namespace app_list { 16 17const char kBadResponse[] = "Bad Web Service search response"; 18 19JSONResponseFetcher::JSONResponseFetcher( 20 const Callback& callback, 21 net::URLRequestContextGetter* context_getter) 22 : callback_(callback), 23 context_getter_(context_getter), 24 weak_factory_(this) { 25 DCHECK(!callback_.is_null()); 26} 27 28JSONResponseFetcher::~JSONResponseFetcher() {} 29 30void JSONResponseFetcher::Start(const GURL& query_url) { 31 Stop(); 32 33 fetcher_.reset(net::URLFetcher::Create( 34 query_url, 35 net::URLFetcher::GET, 36 this)); 37 fetcher_->SetRequestContext(context_getter_); 38 fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | 39 net::LOAD_DISABLE_CACHE); 40 fetcher_->Start(); 41} 42 43void JSONResponseFetcher::Stop() { 44 fetcher_.reset(); 45 weak_factory_.InvalidateWeakPtrs(); 46} 47 48void JSONResponseFetcher::OnJsonParseSuccess( 49 scoped_ptr<base::Value> parsed_json) { 50 if (!parsed_json->IsType(base::Value::TYPE_DICTIONARY)) { 51 OnJsonParseError(kBadResponse); 52 return; 53 } 54 55 callback_.Run(make_scoped_ptr( 56 static_cast<base::DictionaryValue*>(parsed_json.release()))); 57} 58 59void JSONResponseFetcher::OnJsonParseError(const std::string& error) { 60 callback_.Run(scoped_ptr<base::DictionaryValue>()); 61} 62 63void JSONResponseFetcher::OnURLFetchComplete( 64 const net::URLFetcher* source) { 65 CHECK_EQ(fetcher_.get(), source); 66 67 scoped_ptr<net::URLFetcher> fetcher(fetcher_.Pass()); 68 69 if (!fetcher->GetStatus().is_success() || 70 fetcher->GetResponseCode() != 200) { 71 OnJsonParseError(kBadResponse); 72 return; 73 } 74 75 std::string webstore_json_data; 76 fetcher->GetResponseAsString(&webstore_json_data); 77 78 scoped_refptr<SafeJsonParser> parser = 79 new SafeJsonParser(webstore_json_data, 80 base::Bind( 81 &JSONResponseFetcher::OnJsonParseSuccess, 82 weak_factory_.GetWeakPtr()), 83 base::Bind( 84 &JSONResponseFetcher::OnJsonParseError, 85 weak_factory_.GetWeakPtr())); 86 // The parser will call us back via one of the callbacks. 87 parser->Start(); 88} 89 90} // namespace app_list 91