summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authordroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-10 17:59:52 +0000
committerdroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-10 17:59:52 +0000
commit232ef3f7184d842f2362b06336118a79e2145789 (patch)
treee099620dc6a6d46e372f42d112222f040a130036 /components
parenta0af3b5a1839c292e507e791f6c7ee40df5dfdbe (diff)
downloadchromium_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.gypi3
-rw-r--r--components/translate/DEPS1
-rw-r--r--components/translate/core/browser/translate_delegate.h21
-rw-r--r--components/translate/core/browser/translate_url_fetcher.cc83
-rw-r--r--components/translate/core/browser/translate_url_fetcher.h90
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_