Home | History | Annotate | Download | only in extensions
      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/extensions/webstore_data_fetcher.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/values.h"
      9 #include "chrome/browser/extensions/webstore_data_fetcher_delegate.h"
     10 #include "chrome/browser/safe_json_parser.h"
     11 #include "extensions/common/extension_urls.h"
     12 #include "net/base/load_flags.h"
     13 #include "net/url_request/url_fetcher.h"
     14 #include "net/url_request/url_request_status.h"
     15 
     16 namespace {
     17 
     18 const char kInvalidWebstoreResponseError[] = "Invalid Chrome Web Store reponse";
     19 
     20 }  // namespace
     21 
     22 namespace extensions {
     23 
     24 WebstoreDataFetcher::WebstoreDataFetcher(
     25     WebstoreDataFetcherDelegate* delegate,
     26     net::URLRequestContextGetter* request_context,
     27     const GURL& referrer_url,
     28     const std::string webstore_item_id)
     29     : delegate_(delegate),
     30       request_context_(request_context),
     31       referrer_url_(referrer_url),
     32       id_(webstore_item_id),
     33       max_auto_retries_(0) {
     34 }
     35 
     36 WebstoreDataFetcher::~WebstoreDataFetcher() {}
     37 
     38 void WebstoreDataFetcher::Start() {
     39   GURL webstore_data_url(extension_urls::GetWebstoreItemJsonDataURL(id_));
     40 
     41   webstore_data_url_fetcher_.reset(net::URLFetcher::Create(
     42       webstore_data_url, net::URLFetcher::GET, this));
     43   webstore_data_url_fetcher_->SetRequestContext(request_context_);
     44   webstore_data_url_fetcher_->SetReferrer(referrer_url_.spec());
     45   webstore_data_url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
     46                                            net::LOAD_DISABLE_CACHE);
     47   if (max_auto_retries_ > 0) {
     48     webstore_data_url_fetcher_->SetMaxRetriesOn5xx(max_auto_retries_);
     49     webstore_data_url_fetcher_->SetAutomaticallyRetryOnNetworkChanges(
     50         max_auto_retries_);
     51   }
     52   webstore_data_url_fetcher_->Start();
     53 }
     54 
     55 void WebstoreDataFetcher::OnJsonParseSuccess(
     56     scoped_ptr<base::Value> parsed_json) {
     57   if (!parsed_json->IsType(base::Value::TYPE_DICTIONARY)) {
     58     OnJsonParseFailure(kInvalidWebstoreResponseError);
     59     return;
     60   }
     61 
     62   delegate_->OnWebstoreResponseParseSuccess(scoped_ptr<base::DictionaryValue>(
     63       static_cast<base::DictionaryValue*>(parsed_json.release())));
     64 }
     65 
     66 void WebstoreDataFetcher::OnJsonParseFailure(
     67     const std::string& error) {
     68   delegate_->OnWebstoreResponseParseFailure(error);
     69 }
     70 
     71 void WebstoreDataFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
     72   CHECK_EQ(webstore_data_url_fetcher_.get(), source);
     73 
     74   scoped_ptr<net::URLFetcher> fetcher(webstore_data_url_fetcher_.Pass());
     75 
     76   if (!fetcher->GetStatus().is_success() ||
     77       fetcher->GetResponseCode() != 200) {
     78     delegate_->OnWebstoreRequestFailure();
     79     return;
     80   }
     81 
     82   std::string webstore_json_data;
     83   fetcher->GetResponseAsString(&webstore_json_data);
     84 
     85   scoped_refptr<SafeJsonParser> parser =
     86       new SafeJsonParser(webstore_json_data,
     87                          base::Bind(&WebstoreDataFetcher::OnJsonParseSuccess,
     88                                     AsWeakPtr()),
     89                          base::Bind(&WebstoreDataFetcher::OnJsonParseFailure,
     90                                     AsWeakPtr()));
     91   // The parser will call us back via one of the callbacks.
     92   parser->Start();
     93 }
     94 
     95 }  // namespace extensions
     96