diff options
author | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-10 17:59:52 +0000 |
---|---|---|
committer | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-10 17:59:52 +0000 |
commit | 232ef3f7184d842f2362b06336118a79e2145789 (patch) | |
tree | e099620dc6a6d46e372f42d112222f040a130036 /components | |
parent | a0af3b5a1839c292e507e791f6c7ee40df5dfdbe (diff) | |
download | chromium_src-232ef3f7184d842f2362b06336118a79e2145789.zip chromium_src-232ef3f7184d842f2362b06336118a79e2145789.tar.gz chromium_src-232ef3f7184d842f2362b06336118a79e2145789.tar.bz2 |
Move TranslateURLFetcher to the translate component
This CL introduces the TranslateDelegate to inject the required
dependencies in the translate component.
TranslateDelegate is a singleton for now, but this will need to be
revisited once the ownership model of TranslateManager is improved.
BUG=331509
Review URL: https://codereview.chromium.org/131463002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@244199 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components')
-rw-r--r-- | components/translate.gypi | 3 | ||||
-rw-r--r-- | components/translate/DEPS | 1 | ||||
-rw-r--r-- | components/translate/core/browser/translate_delegate.h | 21 | ||||
-rw-r--r-- | components/translate/core/browser/translate_url_fetcher.cc | 83 | ||||
-rw-r--r-- | components/translate/core/browser/translate_url_fetcher.h | 90 |
5 files changed, 198 insertions, 0 deletions
diff --git a/components/translate.gypi b/components/translate.gypi index 474b529..f07beae 100644 --- a/components/translate.gypi +++ b/components/translate.gypi @@ -20,9 +20,12 @@ 'translate/core/browser/page_translated_details.h', 'translate/core/browser/translate_browser_metrics.cc', 'translate/core/browser/translate_browser_metrics.h', + 'translate/core/browser/translate_delegate.h', 'translate/core/browser/translate_error_details.h', 'translate/core/browser/translate_event_details.cc', 'translate/core/browser/translate_event_details.h', + 'translate/core/browser/translate_url_fetcher.cc', + 'translate/core/browser/translate_url_fetcher.h', ], }, { diff --git a/components/translate/DEPS b/components/translate/DEPS index c2106de..fe13494 100644 --- a/components/translate/DEPS +++ b/components/translate/DEPS @@ -1,5 +1,6 @@ include_rules = [ "+components/language_usage_metrics", + "+net", # Translate is a layered component; subdirectories must explicitly introduce # the ability to use the content layer as appropriate. diff --git a/components/translate/core/browser/translate_delegate.h b/components/translate/core/browser/translate_delegate.h new file mode 100644 index 0000000..2e5735c --- /dev/null +++ b/components/translate/core/browser/translate_delegate.h @@ -0,0 +1,21 @@ +// Copyright 2014 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. + +#ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_DELEGATE_H_ +#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_DELEGATE_H_ + +namespace net { +class URLRequestContextGetter; +} + +// A concrete instance of TranslateDelegate has to be provided by the embedder +// of the Translate component. +class TranslateDelegate { + public: + //Returns the URL request context in which the Translate component should make + //requests. + virtual net::URLRequestContextGetter* GetURLRequestContext() = 0; +}; + +#endif // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_DELEGATE_H_ diff --git a/components/translate/core/browser/translate_url_fetcher.cc b/components/translate/core/browser/translate_url_fetcher.cc new file mode 100644 index 0000000..a029369 --- /dev/null +++ b/components/translate/core/browser/translate_url_fetcher.cc @@ -0,0 +1,83 @@ +// Copyright 2014 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 "components/translate/core/browser/translate_url_fetcher.h" + +#include "components/translate/core/browser/translate_delegate.h" +#include "net/base/load_flags.h" +#include "net/http/http_status_code.h" +#include "net/url_request/url_fetcher.h" +#include "net/url_request/url_request_status.h" + +namespace { + +// Retry parameter for fetching. +const int kMaxRetry = 16; + +} // namespace + +TranslateURLFetcher::TranslateURLFetcher(int id, TranslateDelegate* delegate) + : id_(id), + translate_delegate_(delegate), + state_(IDLE), + retry_count_(0) { +} + +TranslateURLFetcher::~TranslateURLFetcher() { +} + +bool TranslateURLFetcher::Request( + const GURL& url, + const TranslateURLFetcher::Callback& callback) { + // This function is not supposed to be called before previous operaion is not + // finished. + if (state_ == REQUESTING) { + NOTREACHED(); + return false; + } + + if (retry_count_ >= kMaxRetry) + return false; + retry_count_++; + + state_ = REQUESTING; + url_ = url; + callback_ = callback; + + fetcher_.reset(net::URLFetcher::Create( + id_, + url_, + net::URLFetcher::GET, + this)); + fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | + net::LOAD_DO_NOT_SAVE_COOKIES); + fetcher_->SetRequestContext(translate_delegate_->GetURLRequestContext()); + // Set retry parameter for HTTP status code 5xx. This doesn't work against + // 106 (net::ERR_INTERNET_DISCONNECTED) and so on. + // TranslateLanguageList handles network status, and implements retry. + fetcher_->SetMaxRetriesOn5xx(max_retry_on_5xx_); + if (!extra_request_header_.empty()) + fetcher_->SetExtraRequestHeaders(extra_request_header_); + + fetcher_->Start(); + + return true; +} + +void TranslateURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) { + DCHECK(fetcher_.get() == source); + + std::string data; + if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS && + source->GetResponseCode() == net::HTTP_OK) { + state_ = COMPLETED; + source->GetResponseAsString(&data); + } else { + state_ = FAILED; + } + + // Transfer URLFetcher's ownership before invoking a callback. + scoped_ptr<const net::URLFetcher> delete_ptr(fetcher_.release()); + callback_.Run(id_, state_ == COMPLETED, data); +} diff --git a/components/translate/core/browser/translate_url_fetcher.h b/components/translate/core/browser/translate_url_fetcher.h new file mode 100644 index 0000000..a702e33 --- /dev/null +++ b/components/translate/core/browser/translate_url_fetcher.h @@ -0,0 +1,90 @@ +// Copyright 2014 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. + +#ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_URL_FETCHER_H_ +#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_URL_FETCHER_H_ + +#include "base/callback.h" +#include "base/memory/scoped_ptr.h" +#include "net/url_request/url_fetcher_delegate.h" +#include "url/gurl.h" + +class TranslateDelegate; + +class TranslateURLFetcher : public net::URLFetcherDelegate { + public: + // Callback type for Request(). + typedef base::Callback<void(int, bool, const std::string&)> Callback; + + // Represents internal state if the fetch is completed successfully. + enum State { + IDLE, // No fetch request was issued. + REQUESTING, // A fetch request was issued, but not finished yet. + COMPLETED, // The last fetch request was finished successfully. + FAILED, // The last fetch request was finished with a failure. + }; + + // |delegate| is expected to outlive the TranslateURLFetcher. + explicit TranslateURLFetcher(int id, TranslateDelegate* delegate); + virtual ~TranslateURLFetcher(); + + int max_retry_on_5xx() { + return max_retry_on_5xx_; + } + void set_max_retry_on_5xx(int count) { + max_retry_on_5xx_ = count; + } + + const std::string& extra_request_header() { + return extra_request_header_; + } + void set_extra_request_header(const std::string& header) { + extra_request_header_ = header; + } + + // Requests to |url|. |callback| will be invoked when the function returns + // true, and the request is finished asynchronously. + // Returns false if the previous request is not finished, or the request + // is omitted due to retry limitation. + bool Request(const GURL& url, const Callback& callback); + + // Gets internal state. + State state() { return state_; } + + // net::URLFetcherDelegate implementation: + virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; + + private: + // URL to send the request. + GURL url_; + + // ID which is assigned to the URLFetcher. + const int id_; + + // Used to get information from the embedder of Translate. + TranslateDelegate* translate_delegate_; + + // Internal state. + enum State state_; + + // URLFetcher instance. + scoped_ptr<net::URLFetcher> fetcher_; + + // Callback passed at Request(). It will be invoked when an asynchronous + // fetch operation is finished. + Callback callback_; + + // Counts how many times did it try to fetch the language list. + int retry_count_; + + // Max number how many times to retry on the server error + int max_retry_on_5xx_; + + // An extra HTTP request header + std::string extra_request_header_; + + DISALLOW_COPY_AND_ASSIGN(TranslateURLFetcher); +}; + +#endif // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_URL_FETCHER_H_ |