Convert URLFetcher::Delegates to use an interface in content/public/common. Also remove the old URLFetcher delegate callback while I'm touching all of them.BUG=98716,83592
Review URL: http://codereview.chromium.org/8373021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106949 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/alternate_nav_url_fetcher.cc b/chrome/browser/alternate_nav_url_fetcher.cc
index 3f7153eb..0b4dc202 100644
--- a/chrome/browser/alternate_nav_url_fetcher.cc
+++ b/chrome/browser/alternate_nav_url_fetcher.cc
@@ -14,6 +14,7 @@
 #include "content/browser/tab_contents/navigation_controller.h"
 #include "content/browser/tab_contents/navigation_entry.h"
 #include "content/public/browser/notification_service.h"
+#include "content/common/net/url_fetcher.h"
 #include "grit/generated_resources.h"
 #include "grit/theme_resources_standard.h"
 #include "net/base/registry_controlled_domain.h"
@@ -161,15 +162,10 @@
   }
 }
 
-void AlternateNavURLFetcher::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void AlternateNavURLFetcher::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK_EQ(fetcher_.get(), source);
-  SetStatusFromURLFetch(url, status, response_code);
+  SetStatusFromURLFetch(
+      source->url(), source->status(), source->response_code());
   ShowInfobarIfPossible();
   // WARNING: |this| may be deleted!
 }
diff --git a/chrome/browser/alternate_nav_url_fetcher.h b/chrome/browser/alternate_nav_url_fetcher.h
index 1f71dd7..2bf5bbb 100644
--- a/chrome/browser/alternate_nav_url_fetcher.h
+++ b/chrome/browser/alternate_nav_url_fetcher.h
@@ -9,13 +9,17 @@
 #include <string>
 
 #include "base/memory/scoped_ptr.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "googleurl/src/gurl.h"
 
 class NavigationController;
 
+namespace net {
+class URLRequestStatus;
+}
+
 // Attempts to get the HEAD of a host name and displays an info bar if the
 // request was successful. This is used for single-word queries where we can't
 // tell if the entry was a search or an intranet hostname. The autocomplete bar
@@ -33,7 +37,7 @@
 //   * The intranet fetch fails
 //   * None of the above apply, so we successfully show an infobar
 class AlternateNavURLFetcher : public content::NotificationObserver,
-                               public URLFetcher::Delegate {
+                               public content::URLFetcherDelegate {
  public:
   enum State {
     NOT_STARTED,
@@ -53,13 +57,8 @@
                        const content::NotificationSource& source,
                        const content::NotificationDetails& details) OVERRIDE;
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Sets |controller_| to the supplied pointer and begins fetching
   // |alternate_nav_url_|.
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
index 240e969..6d0b188 100644
--- a/chrome/browser/autocomplete/search_provider.cc
+++ b/chrome/browser/autocomplete/search_provider.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
+#include "content/common/net/url_fetcher.h"
 #include "googleurl/src/url_util.h"
 #include "grit/generated_resources.h"
 #include "net/base/escape.h"
@@ -243,18 +244,14 @@
   default_provider_suggest_text_.clear();
 }
 
-void SearchProvider::OnURLFetchComplete(const URLFetcher* source,
-                                        const GURL& url,
-                                        const net::URLRequestStatus& status,
-                                        int response_code,
-                                        const net::ResponseCookies& cookie,
-                                        const std::string& data) {
+void SearchProvider::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(!done_);
   suggest_results_pending_--;
   DCHECK_GE(suggest_results_pending_, 0);  // Should never go negative.
   const net::HttpResponseHeaders* const response_headers =
       source->response_headers();
-  std::string json_data(data);
+  std::string json_data;
+  source->GetResponseAsString(&json_data);
   // JSON is supposed to be UTF-8, but some suggest service providers send JSON
   // files in non-UTF-8 encodings.  The actual encoding is usually specified in
   // the Content-Type header field.
@@ -263,7 +260,7 @@
     if (response_headers->GetCharset(&charset)) {
       string16 data_16;
       // TODO(jungshik): Switch to CodePageToUTF8 after it's added.
-      if (base::CodepageToUTF16(data, charset.c_str(),
+      if (base::CodepageToUTF16(json_data, charset.c_str(),
                                 base::OnStringConversionError::FAIL,
                                 &data_16))
         json_data = UTF16ToUTF8(data_16);
@@ -274,7 +271,7 @@
   SuggestResults* suggest_results = is_keyword_results ?
       &keyword_suggest_results_ : &default_suggest_results_;
 
-  if (status.is_success() && response_code == 200) {
+  if (source->status().is_success() && source->response_code() == 200) {
     JSONStringValueSerializer deserializer(json_data);
     deserializer.set_allow_trailing_comma(true);
     scoped_ptr<Value> root_val(deserializer.Deserialize(NULL, NULL));
diff --git a/chrome/browser/autocomplete/search_provider.h b/chrome/browser/autocomplete/search_provider.h
index acdc719b..e53be0b 100644
--- a/chrome/browser/autocomplete/search_provider.h
+++ b/chrome/browser/autocomplete/search_provider.h
@@ -26,7 +26,7 @@
 #include "chrome/browser/history/history_types.h"
 #include "chrome/browser/search_engines/template_url.h"
 #include "chrome/browser/search_engines/template_url_id.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class Profile;
 
@@ -45,7 +45,7 @@
 // comes back, the provider creates and returns matches for the best
 // suggestions.
 class SearchProvider : public AutocompleteProvider,
-                       public URLFetcher::Delegate {
+                       public content::URLFetcherDelegate {
  public:
   SearchProvider(ACProviderListener* listener, Profile* profile);
 
@@ -70,13 +70,8 @@
                      bool minimal_changes) OVERRIDE;
   virtual void Stop() OVERRIDE;
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // ID used in creating URLFetcher for default provider's suggest results.
   static const int kDefaultProviderURLFetcherID;
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index 1308b6a..ca9d3c0 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -239,9 +239,8 @@
   ASSERT_TRUE(default_fetcher);
 
   // Tell the SearchProvider the default suggest query is done.
-  default_fetcher->delegate()->OnURLFetchComplete(
-      default_fetcher, GURL(), net::URLRequestStatus(), 200,
-      net::ResponseCookies(), std::string());
+  default_fetcher->set_response_code(200);
+  default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
 }
 
 // Tests -----------------------------------------------------------------------
@@ -263,9 +262,8 @@
   ASSERT_TRUE(fetcher->original_url() == expected_url);
 
   // Tell the SearchProvider the suggest query is done.
-  fetcher->delegate()->OnURLFetchComplete(
-      fetcher, GURL(), net::URLRequestStatus(), 200, net::ResponseCookies(),
-      std::string());
+  fetcher->set_response_code(200);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
   fetcher = NULL;
 
   // Run till the history results complete.
@@ -309,9 +307,8 @@
   ASSERT_TRUE(default_fetcher);
 
   // Tell the SearchProvider the default suggest query is done.
-  default_fetcher->delegate()->OnURLFetchComplete(
-      default_fetcher, GURL(), net::URLRequestStatus(), 200,
-      net::ResponseCookies(), std::string());
+  default_fetcher->set_response_code(200);
+  default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
   default_fetcher = NULL;
 
   // Make sure the keyword providers suggest service was queried.
@@ -325,9 +322,8 @@
   ASSERT_TRUE(keyword_fetcher->original_url() == expected_url);
 
   // Tell the SearchProvider the keyword suggest query is done.
-  keyword_fetcher->delegate()->OnURLFetchComplete(
-      keyword_fetcher, GURL(), net::URLRequestStatus(), 200,
-      net::ResponseCookies(), std::string());
+  keyword_fetcher->set_response_code(200);
+  keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
   keyword_fetcher = NULL;
 
   // Run till the history results complete.
@@ -650,10 +646,11 @@
   ASSERT_TRUE(fetcher);
 
   // Tell the SearchProvider the suggest query is done.
-  fetcher->delegate()->OnURLFetchComplete(
-      fetcher, GURL(), net::URLRequestStatus(), 200, net::ResponseCookies(),
+  fetcher->set_response_code(200);
+  fetcher->SetResponseString(
       "[\"a.c\",[\"a.com\"],[\"\"],[],"
       "{\"google:suggesttype\":[\"NAVIGATION\"]}]");
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
   fetcher = NULL;
 
   // Run till the history results complete.
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc
index 6dda02b..dedaea45 100644
--- a/chrome/browser/autofill/autofill_browsertest.cc
+++ b/chrome/browser/autofill/autofill_browsertest.cc
@@ -135,11 +135,11 @@
         "  };"
         "})();";
 
-    fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                            fetcher->original_url(),
-                                            status, success ? 200 : 500,
-                                            net::ResponseCookies(),
-                                            script);
+    fetcher->set_url(fetcher->original_url());
+    fetcher->set_status(status);
+    fetcher->set_response_code(success ? 200 : 500);
+    fetcher->SetResponseString(script);
+    fetcher->delegate()->OnURLFetchComplete(fetcher);
   }
 
   void FocusFirstNameField() {
diff --git a/chrome/browser/autofill/autofill_download.cc b/chrome/browser/autofill/autofill_download.cc
index 5423752..b6922fd 100644
--- a/chrome/browser/autofill/autofill_download.cc
+++ b/chrome/browser/autofill/autofill_download.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
+#include "content/common/net/url_fetcher.h"
 #include "googleurl/src/gurl.h"
 #include "net/http/http_response_headers.h"
 #include "third_party/libjingle/source/talk/xmllite/xmlparser.h"
@@ -317,7 +318,8 @@
   } else {
     VLOG(1) << "AutofillDownloadManager: " << type_of_request
             << " request has succeeded";
-    const std::string& response_body = source->GetResponseStringRef();
+    std::string response_body;
+    source->GetResponseAsString(&response_body);
     if (it->second.request_type == AutofillDownloadManager::REQUEST_QUERY) {
       CacheQueryRequest(it->second.form_signatures, response_body);
       if (observer_)
diff --git a/chrome/browser/autofill/autofill_download.h b/chrome/browser/autofill/autofill_download.h
index 8d430ef..2e1310f 100644
--- a/chrome/browser/autofill/autofill_download.h
+++ b/chrome/browser/autofill/autofill_download.h
@@ -13,10 +13,11 @@
 #include <utility>
 #include <vector>
 
+#include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
 #include "base/time.h"
 #include "chrome/browser/autofill/autofill_type.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class AutofillMetrics;
 class FormStructure;
@@ -28,7 +29,7 @@
 }
 
 // Handles getting and updating Autofill heuristics.
-class AutofillDownloadManager : public URLFetcher::Delegate {
+class AutofillDownloadManager : public content::URLFetcherDelegate {
  public:
   enum AutofillRequestType {
     REQUEST_QUERY,
@@ -124,7 +125,7 @@
   std::string GetCombinedSignature(
       const std::vector<std::string>& forms_in_query) const;
 
-  // URLFetcher::Delegate implementation:
+  // content::URLFetcherDelegate implementation:
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Probability of the form upload. Between 0 (no upload) and 1 (upload all).
diff --git a/chrome/browser/bug_report_util.cc b/chrome/browser/bug_report_util.cc
index 389b082e..adf0f050 100644
--- a/chrome/browser/bug_report_util.cc
+++ b/chrome/browser/bug_report_util.cc
@@ -23,6 +23,7 @@
 #include "chrome/common/chrome_version_info.h"
 #include "content/browser/tab_contents/tab_contents.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "grit/generated_resources.h"
 #include "grit/locale_settings.h"
@@ -79,20 +80,15 @@
 }  // namespace
 
 
-// Simple URLFetcher::Delegate to clean up URLFetcher on completion.
-class BugReportUtil::PostCleanup : public URLFetcher::Delegate {
+// Simple content::URLFetcherDelegate to clean up URLFetcher on completion.
+class BugReportUtil::PostCleanup : public content::URLFetcherDelegate {
  public:
   PostCleanup(Profile* profile, std::string* post_body,
               int64 previous_delay) : profile_(profile),
                                       post_body_(post_body),
                                       previous_delay_(previous_delay) { }
-  // Overridden from URLFetcher::Delegate.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // Overridden from content::URLFetcherDelegate.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
  protected:
   virtual ~PostCleanup() {}
@@ -108,15 +104,10 @@
 // Don't use the data parameter, instead use the pointer we pass into every
 // post cleanup object - that pointer will be deleted and deleted only on a
 // successful post to the feedback server.
-void BugReportUtil::PostCleanup::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void BugReportUtil::PostCleanup::OnURLFetchComplete(const URLFetcher* source) {
 
   std::stringstream error_stream;
+  int response_code = source->response_code();
   if (response_code == kHttpPostSuccessNoContent) {
     // We've sent our report, delete the report data
     delete post_body_;
@@ -145,7 +136,7 @@
     }
   }
 
-  LOG(WARNING) << "FEEDBACK: Submission to feedback server (" << url
+  LOG(WARNING) << "FEEDBACK: Submission to feedback server (" << source->url()
                << ") status: " << error_stream.str();
 
   // Delete the URLFetcher.
diff --git a/chrome/browser/chromeos/customization_document.cc b/chrome/browser/chromeos/customization_document.cc
index a12198f3..f3edd9f 100644
--- a/chrome/browser/chromeos/customization_document.cc
+++ b/chrome/browser/chromeos/customization_document.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 
 // Manifest attributes names.
 
@@ -300,13 +301,10 @@
 }
 
 void ServicesCustomizationDocument::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
-  if (response_code == 200) {
+    const URLFetcher* source) {
+  if (source->response_code() == 200) {
+    std::string data;
+    source->GetResponseAsString(&data);
     LoadManifestFromString(data);
   } else {
     NetworkLibrary* network = CrosLibrary::Get()->GetNetworkLibrary();
@@ -318,8 +316,8 @@
       return;
     }
     LOG(ERROR) << "URL fetch for services customization failed:"
-               << " response code = " << response_code
-               << " URL = " << url.spec();
+               << " response code = " << source->response_code()
+               << " URL = " << source->url().spec();
   }
 }
 
diff --git a/chrome/browser/chromeos/customization_document.h b/chrome/browser/chromeos/customization_document.h
index 9be728d..40d57839 100644
--- a/chrome/browser/chromeos/customization_document.h
+++ b/chrome/browser/chromeos/customization_document.h
@@ -13,7 +13,7 @@
 #include "base/memory/singleton.h"
 #include "base/timer.h"
 #include "base/values.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 class FilePath;
@@ -111,7 +111,7 @@
 // the manifest should be initiated outside this class by calling
 // StartFetching() method. User of the file should check IsReady before use it.
 class ServicesCustomizationDocument : public CustomizationDocument,
-                                      private URLFetcher::Delegate {
+                                      private content::URLFetcherDelegate {
  public:
   static ServicesCustomizationDocument* GetInstance();
 
@@ -148,13 +148,8 @@
   // Save applied state in machine settings.
   static void SetApplied(bool val);
 
-  // Overriden from URLFetcher::Delegate:
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // Overriden from content::URLFetcherDelegate:
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // Initiate file fetching.
   void StartFileFetch();
diff --git a/chrome/browser/chromeos/login/auth_response_handler.h b/chrome/browser/chromeos/login/auth_response_handler.h
index f45c6582..68fde40 100644
--- a/chrome/browser/chromeos/login/auth_response_handler.h
+++ b/chrome/browser/chromeos/login/auth_response_handler.h
@@ -8,7 +8,7 @@
 
 #include <string>
 
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class GURL;
 
@@ -31,7 +31,7 @@
   // Starts the fetch and returns the fetcher, so the the caller can handle
   // the object lifetime.
   virtual URLFetcher* Handle(const std::string& to_process,
-                             URLFetcher::Delegate* catcher) = 0;
+                             content::URLFetcherDelegate* catcher) = 0;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/client_login_response_handler.cc b/chrome/browser/chromeos/login/client_login_response_handler.cc
index 61bc572..1b26c058 100644
--- a/chrome/browser/chromeos/login/client_login_response_handler.cc
+++ b/chrome/browser/chromeos/login/client_login_response_handler.cc
@@ -27,7 +27,7 @@
 // Overridden from AuthResponseHandler.
 URLFetcher* ClientLoginResponseHandler::Handle(
     const std::string& to_process,
-    URLFetcher::Delegate* catcher) {
+    content::URLFetcherDelegate* catcher) {
   VLOG(1) << "Handling ClientLogin response!";
   payload_.assign(to_process);
   std::replace(payload_.begin(), payload_.end(), '\n', '&');
diff --git a/chrome/browser/chromeos/login/client_login_response_handler.h b/chrome/browser/chromeos/login/client_login_response_handler.h
index 5ea0045..5600bf9 100644
--- a/chrome/browser/chromeos/login/client_login_response_handler.h
+++ b/chrome/browser/chromeos/login/client_login_response_handler.h
@@ -35,7 +35,7 @@
   // to sent to IssueAuthToken and issues said query.  |catcher| will receive
   // the response to the fetch.
   virtual URLFetcher* Handle(const std::string& to_process,
-                             URLFetcher::Delegate* catcher);
+                             content::URLFetcherDelegate* catcher);
 
   // exposed for tests.
   std::string payload() { return payload_; }
diff --git a/chrome/browser/chromeos/login/cookie_fetcher.cc b/chrome/browser/chromeos/login/cookie_fetcher.cc
index 7842776d..e8401d8 100644
--- a/chrome/browser/chromeos/login/cookie_fetcher.cc
+++ b/chrome/browser/chromeos/login/cookie_fetcher.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/chrome_paths.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/url_request/url_request_status.h"
 
 namespace chromeos {
@@ -40,15 +41,13 @@
   fetcher_.reset(client_login_handler_->Handle(credentials, this));
 }
 
-void CookieFetcher::OnURLFetchComplete(const URLFetcher* source,
-                                       const GURL& url,
-                                       const net::URLRequestStatus& status,
-                                       int response_code,
-                                       const net::ResponseCookies& cookies,
-                                       const std::string& data) {
-  if (status.is_success() && response_code == kHttpSuccess) {
-    if (issue_handler_->CanHandle(url)) {
+void CookieFetcher::OnURLFetchComplete(const URLFetcher* source) {
+  if (source->status().is_success() &&
+      source->response_code() == kHttpSuccess) {
+    if (issue_handler_->CanHandle(source->url())) {
       VLOG(1) << "Handling auth token";
+      std::string data;
+      source->GetResponseAsString(&data);
       fetcher_.reset(issue_handler_->Handle(data, this));
       return;
     }
diff --git a/chrome/browser/chromeos/login/cookie_fetcher.h b/chrome/browser/chromeos/login/cookie_fetcher.h
index fe7fc60..3c1cdef 100644
--- a/chrome/browser/chromeos/login/cookie_fetcher.h
+++ b/chrome/browser/chromeos/login/cookie_fetcher.h
@@ -12,7 +12,7 @@
 #include "chrome/browser/chromeos/login/auth_response_handler.h"
 #include "chrome/browser/chromeos/login/client_login_response_handler.h"
 #include "chrome/browser/chromeos/login/issue_response_handler.h"
-#include "content/common/net/url_fetcher.h"
+
 
 class Profile;
 
@@ -23,7 +23,7 @@
 //
 // A CookieFetcher manages its own lifecycle.  It deletes itself once it's
 // done attempting to fetch URLs.
-class CookieFetcher : public URLFetcher::Delegate {
+class CookieFetcher : public content::URLFetcherDelegate {
  public:
   // |profile| is the Profile whose cookie jar you want the cookies in.
   explicit CookieFetcher(Profile* profile);
@@ -41,13 +41,8 @@
   // Either way, we end up by calling launcher_->DoLaunch()
   void AttemptFetch(const std::string& credentials);
 
-  // Overloaded from URLFetcher::Delegate.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // Overloaded from content::URLFetcherDelegate.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
  private:
   virtual ~CookieFetcher();
diff --git a/chrome/browser/chromeos/login/image_downloader.cc b/chrome/browser/chromeos/login/image_downloader.cc
index c94f91d..52992fc 100644
--- a/chrome/browser/chromeos/login/image_downloader.cc
+++ b/chrome/browser/chromeos/login/image_downloader.cc
@@ -12,6 +12,7 @@
 #include "base/stringprintf.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 
 namespace chromeos {
 
@@ -39,16 +40,13 @@
 
 ImageDownloader::~ImageDownloader() {}
 
-void ImageDownloader::OnURLFetchComplete(const URLFetcher* source,
-                                         const GURL& url,
-                                         const net::URLRequestStatus& status,
-                                         int response_code,
-                                         const net::ResponseCookies& cookies,
-                                         const std::string& data) {
+void ImageDownloader::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  if (response_code != 200) {
-    LOG(ERROR) << "Response code is " << response_code;
-    LOG(ERROR) << "Url is " << url.spec();
+  std::string data;
+  source->GetResponseAsString(&data);
+  if (source->response_code() != 200) {
+    LOG(ERROR) << "Response code is " << source->response_code();
+    LOG(ERROR) << "Url is " << source->url().spec();
     LOG(ERROR) << "Data is " << data;
     MessageLoop::current()->DeleteSoon(FROM_HERE, this);
     return;
diff --git a/chrome/browser/chromeos/login/image_downloader.h b/chrome/browser/chromeos/login/image_downloader.h
index 48beeb51..b14fed4 100644
--- a/chrome/browser/chromeos/login/image_downloader.h
+++ b/chrome/browser/chromeos/login/image_downloader.h
@@ -11,14 +11,14 @@
 #include "base/basictypes.h"
 #include "base/memory/scoped_ptr.h"
 #include "chrome/browser/chromeos/login/image_decoder.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 namespace chromeos {
 
 // Downloads the image, decodes it in a sandboxed process.
 // This objects deletes itself after OnURLFetchComplete.
-class ImageDownloader : public URLFetcher::Delegate {
+class ImageDownloader : public content::URLFetcherDelegate {
  public:
   // Starts downloading the picture. Optional auth_token could be passed.
   // Object is deleted as reference counted object.
@@ -28,13 +28,8 @@
   virtual ~ImageDownloader();
 
  private:
-  // Overriden from URLFetcher::Delegate:
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // Overriden from content::URLFetcherDelegate:
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   ImageDecoder::Delegate* delegate_;
   scoped_ptr<URLFetcher> image_fetcher_;
diff --git a/chrome/browser/chromeos/login/issue_response_handler.cc b/chrome/browser/chromeos/login/issue_response_handler.cc
index 6ccb54a..acbcd8a 100644
--- a/chrome/browser/chromeos/login/issue_response_handler.cc
+++ b/chrome/browser/chromeos/login/issue_response_handler.cc
@@ -23,7 +23,7 @@
 // Overridden from AuthResponseHandler.
 URLFetcher* IssueResponseHandler::Handle(
     const std::string& to_process,
-    URLFetcher::Delegate* catcher) {
+    content::URLFetcherDelegate* catcher) {
   VLOG(1) << "Handling IssueAuthToken response";
   token_url_.assign(BuildTokenAuthUrlWithToken(to_process));
   URLFetcher* fetcher =
diff --git a/chrome/browser/chromeos/login/issue_response_handler.h b/chrome/browser/chromeos/login/issue_response_handler.h
index a79f9af8..1dfb71a 100644
--- a/chrome/browser/chromeos/login/issue_response_handler.h
+++ b/chrome/browser/chromeos/login/issue_response_handler.h
@@ -37,7 +37,7 @@
   // the response to the fetch.  This fetch will follow redirects, which is
   // necesary to support GAFYD and corp accounts.
   virtual URLFetcher* Handle(const std::string& to_process,
-                             URLFetcher::Delegate* catcher);
+                             content::URLFetcherDelegate* catcher);
 
   // exposed for testing
   std::string token_url() { return token_url_; }
diff --git a/chrome/browser/chromeos/login/mock_auth_response_handler.cc b/chrome/browser/chromeos/login/mock_auth_response_handler.cc
index 9947d83d..f3805a3 100644
--- a/chrome/browser/chromeos/login/mock_auth_response_handler.cc
+++ b/chrome/browser/chromeos/login/mock_auth_response_handler.cc
@@ -9,6 +9,8 @@
 #include "base/bind.h"
 #include "base/message_loop.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
+#include "content/test/test_url_fetcher_factory.h"
 #include "googleurl/src/gurl.h"
 #include "net/url_request/url_request_status.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -36,22 +38,23 @@
 
 MockAuthResponseHandler::~MockAuthResponseHandler() {}
 
-void MockAuthResponseHandler::CompleteFetch(URLFetcher::Delegate* delegate,
-                                            const GURL remote,
-                                            const net::URLRequestStatus status,
-                                            const int http_response_code,
-                                            const std::string data) {
-  delegate->OnURLFetchComplete(NULL,
-                               remote,
-                               status,
-                               http_response_code,
-                               net::ResponseCookies(),
-                               data);
+void MockAuthResponseHandler::CompleteFetch(
+    content::URLFetcherDelegate* delegate,
+    const GURL remote,
+    const net::URLRequestStatus status,
+    const int http_response_code,
+    const std::string data) {
+  TestURLFetcher fetcher(0, GURL(), URLFetcher::GET, delegate);
+  fetcher.set_url(remote);
+  fetcher.set_status(status);
+  fetcher.set_response_code(http_response_code);
+  fetcher.SetResponseString(data);
+  delegate->OnURLFetchComplete(&fetcher);
 }
 
 URLFetcher* MockAuthResponseHandler::MockNetwork(
     std::string data,
-    URLFetcher::Delegate* delegate) {
+    content::URLFetcherDelegate* delegate) {
   MessageLoop::current()->PostTask(
       FROM_HERE,
       base::Bind(MockAuthResponseHandler::CompleteFetch, delegate, remote_,
diff --git a/chrome/browser/chromeos/login/mock_auth_response_handler.h b/chrome/browser/chromeos/login/mock_auth_response_handler.h
index 5c37cc7..9f449be 100644
--- a/chrome/browser/chromeos/login/mock_auth_response_handler.h
+++ b/chrome/browser/chromeos/login/mock_auth_response_handler.h
@@ -35,9 +35,10 @@
 
   MOCK_METHOD1(CanHandle, bool(const GURL& url));
   MOCK_METHOD2(Handle, URLFetcher*(const std::string& to_process,
-                                   URLFetcher::Delegate* catcher));
+                                   content::URLFetcherDelegate* catcher));
 
-  URLFetcher* MockNetwork(std::string data, URLFetcher::Delegate* delegate);
+  URLFetcher* MockNetwork(std::string data,
+                          content::URLFetcherDelegate* delegate);
 
  private:
   const GURL remote_;
@@ -45,7 +46,7 @@
   const int http_response_code_;
   const std::string data_;
 
-  static void CompleteFetch(URLFetcher::Delegate* delegate,
+  static void CompleteFetch(content::URLFetcherDelegate* delegate,
                             const GURL remote,
                             const net::URLRequestStatus status,
                             const int http_response_code,
diff --git a/chrome/browser/chromeos/login/mock_url_fetchers.cc b/chrome/browser/chromeos/login/mock_url_fetchers.cc
index 70e2276..da43213 100644
--- a/chrome/browser/chromeos/login/mock_url_fetchers.cc
+++ b/chrome/browser/chromeos/login/mock_url_fetchers.cc
@@ -11,7 +11,7 @@
 #include "base/stringprintf.h"
 #include "chrome/common/net/http_return.h"
 #include "content/browser/browser_thread.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "net/url_request/url_request_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -23,7 +23,7 @@
     const GURL& url,
     const std::string& results,
     URLFetcher::RequestType request_type,
-    URLFetcher::Delegate* d)
+    content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
       ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
 }
@@ -48,64 +48,84 @@
                                        const GURL& url,
                                        const std::string& results,
                                        URLFetcher::RequestType request_type,
-                                       URLFetcher::Delegate* d)
+                                       content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
-      url_(url) {
+      url_(url),
+      status_(net::URLRequestStatus::CANCELED, 0) {
 }
 
 GotCanceledFetcher::~GotCanceledFetcher() {}
 
 void GotCanceledFetcher::Start() {
-  net::URLRequestStatus status;
-  status.set_status(net::URLRequestStatus::CANCELED);
-  delegate()->OnURLFetchComplete(this,
-                                 url_,
-                                 status,
-                                 RC_FORBIDDEN,
-                                 net::ResponseCookies(),
-                                 std::string());
+  delegate()->OnURLFetchComplete(this);
+}
+
+const GURL& GotCanceledFetcher::url() const {
+  return url_;
+}
+
+const net::URLRequestStatus& GotCanceledFetcher::status() const {
+  return status_;
+}
+
+int GotCanceledFetcher::response_code() const {
+  return RC_FORBIDDEN;
 }
 
 SuccessFetcher::SuccessFetcher(bool success,
                                const GURL& url,
                                const std::string& results,
                                URLFetcher::RequestType request_type,
-                               URLFetcher::Delegate* d)
+                               content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
-      url_(url) {
+      url_(url),
+      status_(net::URLRequestStatus::SUCCESS, 0) {
 }
 
 SuccessFetcher::~SuccessFetcher() {}
 
 void SuccessFetcher::Start() {
-  net::URLRequestStatus success(net::URLRequestStatus::SUCCESS, 0);
-  delegate()->OnURLFetchComplete(this,
-                                 url_,
-                                 success,
-                                 RC_REQUEST_OK,
-                                 net::ResponseCookies(),
-                                 std::string());
+  delegate()->OnURLFetchComplete(this);
+}
+
+const GURL& SuccessFetcher::url() const {
+  return url_;
+}
+
+const net::URLRequestStatus& SuccessFetcher::status() const {
+  return status_;
+}
+
+int SuccessFetcher::response_code() const {
+  return RC_REQUEST_OK;
 }
 
 FailFetcher::FailFetcher(bool success,
                          const GURL& url,
                          const std::string& results,
                          URLFetcher::RequestType request_type,
-                         URLFetcher::Delegate* d)
+                         content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
-      url_(url) {
+      url_(url),
+      status_(net::URLRequestStatus::FAILED, ECONNRESET) {
 }
 
 FailFetcher::~FailFetcher() {}
 
 void FailFetcher::Start() {
-  net::URLRequestStatus failed(net::URLRequestStatus::FAILED, ECONNRESET);
-  delegate()->OnURLFetchComplete(this,
-                                 url_,
-                                 failed,
-                                 RC_REQUEST_OK,
-                                 net::ResponseCookies(),
-                                 std::string());
+  delegate()->OnURLFetchComplete(this);
+}
+
+const GURL& FailFetcher::url() const {
+  return url_;
+}
+
+const net::URLRequestStatus& FailFetcher::status() const {
+  return status_;
+}
+
+int FailFetcher::response_code() const {
+  return RC_REQUEST_OK;
 }
 
 // static
@@ -122,9 +142,18 @@
                                const GURL& url,
                                const std::string& results,
                                URLFetcher::RequestType request_type,
-                               URLFetcher::Delegate* d)
+                               content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
-      url_(url) {
+      url_(url),
+      status_(net::URLRequestStatus::SUCCESS, 0) {
+  data_ = base::StringPrintf("Error=%s\n"
+                             "Url=%s\n"
+                             "CaptchaUrl=%s\n"
+                             "CaptchaToken=%s\n",
+                             "CaptchaRequired",
+                             kUnlockUrl,
+                             kCaptchaUrlFragment,
+                             kCaptchaToken);
 }
 
 CaptchaFetcher::~CaptchaFetcher() {}
@@ -145,50 +174,66 @@
 }
 
 void CaptchaFetcher::Start() {
-  net::URLRequestStatus success(net::URLRequestStatus::SUCCESS, 0);
-  std::string body = base::StringPrintf("Error=%s\n"
-                                        "Url=%s\n"
-                                        "CaptchaUrl=%s\n"
-                                        "CaptchaToken=%s\n",
-                                        "CaptchaRequired",
-                                        kUnlockUrl,
-                                        kCaptchaUrlFragment,
-                                        kCaptchaToken);
-  delegate()->OnURLFetchComplete(this,
-                                 url_,
-                                 success,
-                                 RC_FORBIDDEN,
-                                 net::ResponseCookies(),
-                                 body);
+  delegate()->OnURLFetchComplete(this);
+}
+
+const GURL& CaptchaFetcher::url() const {
+  return url_;
+}
+
+const net::URLRequestStatus& CaptchaFetcher::status() const {
+  return status_;
+}
+
+int CaptchaFetcher::response_code() const {
+  return RC_FORBIDDEN;
+}
+
+bool CaptchaFetcher::GetResponseAsString(
+    std::string* out_response_string) const {
+  *out_response_string = data_;
+  return true;
 }
 
 HostedFetcher::HostedFetcher(bool success,
                              const GURL& url,
                              const std::string& results,
                              URLFetcher::RequestType request_type,
-                             URLFetcher::Delegate* d)
+                             content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
-      url_(url) {
+      url_(url),
+      status_(net::URLRequestStatus::SUCCESS, 0),
+      response_code_(RC_REQUEST_OK) {
 }
 
 HostedFetcher::~HostedFetcher() {}
 
 void HostedFetcher::Start() {
-  net::URLRequestStatus success(net::URLRequestStatus::SUCCESS, 0);
-  int response_code = RC_REQUEST_OK;
-  std::string data;
   VLOG(1) << upload_data();
   if (upload_data().find("HOSTED") == std::string::npos) {
     VLOG(1) << "HostedFetcher failing request";
-    response_code = RC_FORBIDDEN;
-    data.assign("Error=BadAuthentication");
+    response_code_ = RC_FORBIDDEN;
+    data_.assign("Error=BadAuthentication");
   }
-  delegate()->OnURLFetchComplete(this,
-                                 url_,
-                                 success,
-                                 response_code,
-                                 net::ResponseCookies(),
-                                 data);
+  delegate()->OnURLFetchComplete(this);
+}
+
+const GURL& HostedFetcher::url() const {
+  return url_;
+}
+
+const net::URLRequestStatus& HostedFetcher::status() const {
+  return status_;
+}
+
+int HostedFetcher::response_code() const {
+  return response_code_;;
+}
+
+bool HostedFetcher::GetResponseAsString(
+    std::string* out_response_string) const {
+  *out_response_string = data_;
+  return true;
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/mock_url_fetchers.h b/chrome/browser/chromeos/login/mock_url_fetchers.h
index 2be8891..4fa18ef 100644
--- a/chrome/browser/chromeos/login/mock_url_fetchers.h
+++ b/chrome/browser/chromeos/login/mock_url_fetchers.h
@@ -15,6 +15,10 @@
 #include "googleurl/src/gurl.h"
 #include "net/url_request/url_request_status.h"
 
+namespace content {
+class URLFetcherDelegate;
+}
+
 namespace chromeos {
 
 // Simulates a URL fetch by posting a delayed task. This fetch expects to be
@@ -25,7 +29,7 @@
                         const GURL& url,
                         const std::string& results,
                         URLFetcher::RequestType request_type,
-                        URLFetcher::Delegate* d);
+                        content::URLFetcherDelegate* d);
   virtual ~ExpectCanceledFetcher();
 
   virtual void Start();
@@ -43,13 +47,18 @@
                      const GURL& url,
                      const std::string& results,
                      URLFetcher::RequestType request_type,
-                     URLFetcher::Delegate* d);
+                     content::URLFetcherDelegate* d);
   virtual ~GotCanceledFetcher();
 
   virtual void Start();
 
+  virtual const GURL& url() const;
+  virtual const net::URLRequestStatus& status() const;
+  virtual int response_code() const;
+
  private:
   GURL url_;
+  net::URLRequestStatus status_;
 
   DISALLOW_COPY_AND_ASSIGN(GotCanceledFetcher);
 };
@@ -60,13 +69,18 @@
                  const GURL& url,
                  const std::string& results,
                  URLFetcher::RequestType request_type,
-                 URLFetcher::Delegate* d);
+                 content::URLFetcherDelegate* d);
   virtual ~SuccessFetcher();
 
   virtual void Start();
 
+  virtual const GURL& url() const;
+  virtual const net::URLRequestStatus& status() const;
+  virtual int response_code() const;
+
  private:
   GURL url_;
+  net::URLRequestStatus status_;
 
   DISALLOW_COPY_AND_ASSIGN(SuccessFetcher);
 };
@@ -77,13 +91,18 @@
               const GURL& url,
               const std::string& results,
               URLFetcher::RequestType request_type,
-              URLFetcher::Delegate* d);
+              content::URLFetcherDelegate* d);
   virtual ~FailFetcher();
 
   virtual void Start();
 
+  virtual const GURL& url() const;
+  virtual const net::URLRequestStatus& status() const;
+  virtual int response_code() const;
+
  private:
   GURL url_;
+  net::URLRequestStatus status_;
 
   DISALLOW_COPY_AND_ASSIGN(FailFetcher);
 };
@@ -94,7 +113,7 @@
                  const GURL& url,
                  const std::string& results,
                  URLFetcher::RequestType request_type,
-                 URLFetcher::Delegate* d);
+                 content::URLFetcherDelegate* d);
   virtual ~CaptchaFetcher();
 
   static std::string GetCaptchaToken();
@@ -103,12 +122,19 @@
 
   virtual void Start();
 
+  virtual const GURL& url() const;
+  virtual const net::URLRequestStatus& status() const;
+  virtual int response_code() const;
+  virtual bool GetResponseAsString(std::string* out_response_string) const;
+
  private:
   static const char kCaptchaToken[];
   static const char kCaptchaUrlBase[];
   static const char kCaptchaUrlFragment[];
   static const char kUnlockUrl[];
   GURL url_;
+  net::URLRequestStatus status_;
+  std::string data_;
 
   DISALLOW_COPY_AND_ASSIGN(CaptchaFetcher);
 };
@@ -119,13 +145,21 @@
                 const GURL& url,
                 const std::string& results,
                 URLFetcher::RequestType request_type,
-                URLFetcher::Delegate* d);
+                content::URLFetcherDelegate* d);
   virtual ~HostedFetcher();
 
   virtual void Start();
 
+  virtual const GURL& url() const;
+  virtual const net::URLRequestStatus& status() const;
+  virtual int response_code() const;
+  virtual bool GetResponseAsString(std::string* out_response_string) const;
+
  private:
   GURL url_;
+  net::URLRequestStatus status_;
+  int response_code_;
+  std::string data_;
 
   DISALLOW_COPY_AND_ASSIGN(HostedFetcher);
 };
diff --git a/chrome/browser/chromeos/login/profile_image_downloader.cc b/chrome/browser/chromeos/login/profile_image_downloader.cc
index 1cc7e72..74999a3 100644
--- a/chrome/browser/chromeos/login/profile_image_downloader.cc
+++ b/chrome/browser/chromeos/login/profile_image_downloader.cc
@@ -18,6 +18,7 @@
 #include "chrome/common/chrome_notification_types.h"
 #include "chrome/common/net/gaia/gaia_constants.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
@@ -155,9 +156,8 @@
 
 void ProfileImageDownloader::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
-  const std::string& data = source->GetResponseStringRef();
-
+  std::string data;
+  source->GetResponseAsString(&data);
   if (source->response_code() != 200) {
     LOG(ERROR) << "Response code is " << source->response_code();
     LOG(ERROR) << "Url is " << source->url().spec();
@@ -186,7 +186,8 @@
     profile_image_fetcher_->Start();
   } else if (source == profile_image_fetcher_.get()) {
     VLOG(1) << "Decoding the image...";
-    scoped_refptr<ImageDecoder> image_decoder = new ImageDecoder(this, data);
+    scoped_refptr<ImageDecoder> image_decoder = new ImageDecoder(
+        this, data);
     image_decoder->Start();
   }
 }
diff --git a/chrome/browser/chromeos/login/profile_image_downloader.h b/chrome/browser/chromeos/login/profile_image_downloader.h
index d037666..50a7cb4 100644
--- a/chrome/browser/chromeos/login/profile_image_downloader.h
+++ b/chrome/browser/chromeos/login/profile_image_downloader.h
@@ -11,15 +11,15 @@
 #include "base/basictypes.h"
 #include "base/memory/scoped_ptr.h"
 #include "chrome/browser/chromeos/login/image_decoder.h"
-#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 namespace chromeos {
 
 // Downloads user profile image, decodes it in a sandboxed process.
-class ProfileImageDownloader : public URLFetcher::Delegate,
+class ProfileImageDownloader : public content::URLFetcherDelegate,
                                public ImageDecoder::Delegate,
                                public content::NotificationObserver {
  public:
@@ -44,7 +44,7 @@
   void Start();
 
  private:
-  // Overriden from URLFetcher::Delegate:
+  // Overriden from content::URLFetcherDelegate:
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Overriden from ImageDecoder::Delegate:
diff --git a/chrome/browser/component_updater/component_updater_service.cc b/chrome/browser/component_updater/component_updater_service.cc
index 43bc3c9..bde9ce75 100644
--- a/chrome/browser/component_updater/component_updater_service.cc
+++ b/chrome/browser/component_updater/component_updater_service.cc
@@ -26,6 +26,7 @@
 #include "content/browser/utility_process_host.h"
 #include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
@@ -96,7 +97,7 @@
 // OnURLFetchComplete() callbacks for diffent types of url requests
 // they are differentiated by the |Ctx| type.
 template <typename Del, typename Ctx>
-class DelegateWithContext : public URLFetcher::Delegate {
+class DelegateWithContext : public content::URLFetcherDelegate {
  public:
   DelegateWithContext(Del* delegate, Ctx* context)
     : delegate_(delegate), context_(context) {}
@@ -114,7 +115,7 @@
 };
 // This function creates the right DelegateWithContext using template inference.
 template <typename Del, typename Ctx>
-URLFetcher::Delegate* MakeContextDelegate(Del* delegate, Ctx* context) {
+content::URLFetcherDelegate* MakeContextDelegate(Del* delegate, Ctx* context) {
   return new DelegateWithContext<Del, Ctx>(delegate, context);
 }
 
diff --git a/chrome/browser/extensions/app_notify_channel_setup.cc b/chrome/browser/extensions/app_notify_channel_setup.cc
index 6ccb00e..c52e7b2 100644
--- a/chrome/browser/extensions/app_notify_channel_setup.cc
+++ b/chrome/browser/extensions/app_notify_channel_setup.cc
@@ -10,6 +10,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/url_request/url_request_status.h"
 
diff --git a/chrome/browser/extensions/app_notify_channel_setup.h b/chrome/browser/extensions/app_notify_channel_setup.h
index 21ffa3a..b489e91 100644
--- a/chrome/browser/extensions/app_notify_channel_setup.h
+++ b/chrome/browser/extensions/app_notify_channel_setup.h
@@ -8,7 +8,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 class Profile;
@@ -16,7 +16,7 @@
 // This class uses the browser login credentials to fetch a channel ID for an
 // app to use when sending server push notifications.
 class AppNotifyChannelSetup
-    : public URLFetcher::Delegate,
+    : public content::URLFetcherDelegate,
       public base::RefCountedThreadSafe<AppNotifyChannelSetup> {
  public:
   class Delegate {
@@ -43,7 +43,7 @@
   void Start();
 
  protected:
-  // URLFetcher::Delegate.
+  // content::URLFetcherDelegate.
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
  private:
diff --git a/chrome/browser/extensions/apps_promo.cc b/chrome/browser/extensions/apps_promo.cc
index 6fd273c..9f181dd39 100644
--- a/chrome/browser/extensions/apps_promo.cc
+++ b/chrome/browser/extensions/apps_promo.cc
@@ -17,6 +17,7 @@
 #include "chrome/common/pref_names.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/common/url_constants.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_status.h"
 
@@ -352,7 +353,7 @@
   std::string base64_data;
 
   CHECK(source == url_fetcher_.get());
-  CHECK(source->GetResponseAsString(&data));
+  source->GetResponseAsString(&data);
 
   if (source->status().is_success() &&
       source->response_code() == kHttpSuccess &&
diff --git a/chrome/browser/extensions/apps_promo.h b/chrome/browser/extensions/apps_promo.h
index 248865aa..bbbdb74 100644
--- a/chrome/browser/extensions/apps_promo.h
+++ b/chrome/browser/extensions/apps_promo.h
@@ -11,7 +11,7 @@
 
 #include "base/gtest_prod_util.h"
 #include "chrome/common/extensions/extension.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class PrefService;
 class Profile;
@@ -148,7 +148,7 @@
 
 // Fetches logos over HTTPS, making sure we don't send cookies and that we
 // cache the image until its source URL changes.
-class AppsPromoLogoFetcher : public URLFetcher::Delegate {
+class AppsPromoLogoFetcher : public content::URLFetcherDelegate {
  public:
   AppsPromoLogoFetcher(Profile* profile,
                        AppsPromo::PromoData promo_data);
diff --git a/chrome/browser/extensions/extension_management_browsertest.cc b/chrome/browser/extensions/extension_management_browsertest.cc
index feddcdc..460bcb4 100644
--- a/chrome/browser/extensions/extension_management_browsertest.cc
+++ b/chrome/browser/extensions/extension_management_browsertest.cc
@@ -21,6 +21,7 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/browser/renderer_host/render_view_host.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 
 class ExtensionManagementTest : public ExtensionBrowserTest {
diff --git a/chrome/browser/extensions/extension_updater.cc b/chrome/browser/extensions/extension_updater.cc
index 2294c1d..761ac06 100644
--- a/chrome/browser/extensions/extension_updater.cc
+++ b/chrome/browser/extensions/extension_updater.cc
@@ -37,6 +37,7 @@
 #include "chrome/common/extensions/extension_file_util.h"
 #include "chrome/common/pref_names.h"
 #include "content/browser/utility_process_host.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
 #include "crypto/sha2.h"
@@ -597,7 +598,7 @@
 
   if (source == manifest_fetcher_.get()) {
     std::string data;
-    CHECK(source->GetResponseAsString(&data));
+    source->GetResponseAsString(&data);
     OnManifestFetchComplete(source->url(),
                             source->status(),
                             source->response_code(),
@@ -843,7 +844,7 @@
       (response_code == 200 || url.SchemeIsFile())) {
     if (current_extension_fetch_.id == kBlacklistAppID) {
       std::string data;
-      CHECK(source->GetResponseAsString(&data));
+      source->GetResponseAsString(&data);
       ProcessBlacklist(data);
       in_progress_ids_.erase(current_extension_fetch_.id);
     } else {
diff --git a/chrome/browser/extensions/extension_updater.h b/chrome/browser/extensions/extension_updater.h
index f07d08d..d4f7b50 100644
--- a/chrome/browser/extensions/extension_updater.h
+++ b/chrome/browser/extensions/extension_updater.h
@@ -23,7 +23,7 @@
 #include "base/timer.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/common/extensions/update_manifest.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 class Extension;
@@ -33,6 +33,10 @@
 class Profile;
 class SafeManifestParser;
 
+namespace net {
+class URLRequestStatus;
+}
+
 // To save on server resources we can request updates for multiple extensions
 // in one manifest check. This class helps us keep track of the id's for a
 // given fetch, building up the actual URL, and what if anything to include
@@ -165,7 +169,7 @@
 // updater->Start();
 // ....
 // updater->Stop();
-class ExtensionUpdater : public URLFetcher::Delegate,
+class ExtensionUpdater : public content::URLFetcherDelegate,
                          public content::NotificationObserver {
  public:
   // Holds a pointer to the passed |service|, using it for querying installed
@@ -250,7 +254,7 @@
   // Computes when to schedule the first update check.
   base::TimeDelta DetermineFirstCheckDelay();
 
-  // URLFetcher::Delegate interface.
+  // content::URLFetcherDelegate interface.
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // These do the actual work when a URL fetch completes.
diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc
index 4a2ddfe7..6c938ec8 100644
--- a/chrome/browser/extensions/webstore_inline_installer.cc
+++ b/chrome/browser/extensions/webstore_inline_installer.cc
@@ -20,6 +20,7 @@
 #include "chrome/common/extensions/url_pattern.h"
 #include "content/browser/tab_contents/tab_contents.h"
 #include "content/browser/utility_process_host.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_status.h"
diff --git a/chrome/browser/extensions/webstore_inline_installer.h b/chrome/browser/extensions/webstore_inline_installer.h
index 2b2cf05..c66693b 100644
--- a/chrome/browser/extensions/webstore_inline_installer.h
+++ b/chrome/browser/extensions/webstore_inline_installer.h
@@ -15,7 +15,7 @@
 #include "chrome/browser/extensions/webstore_installer.h"
 #include "chrome/browser/extensions/webstore_install_helper.h"
 #include "content/browser/tab_contents/tab_contents_observer.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
@@ -32,7 +32,7 @@
     : public base::RefCountedThreadSafe<WebstoreInlineInstaller>,
       public ExtensionInstallUI::Delegate,
       public TabContentsObserver,
-      public URLFetcher::Delegate,
+      public content::URLFetcherDelegate,
       public WebstoreInstaller::Delegate,
       public WebstoreInstallHelper::Delegate {
  public:
@@ -69,7 +69,7 @@
   // All flows (whether successful or not) end up in CompleteInstall, which
   // informs our delegate of success/failure.
 
-  // UrlFetcher::Delegate interface implementation.
+  // content::URLFetcherDelegate interface implementation.
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Client callbacks for SafeWebstoreResponseParser when parsing is complete.
diff --git a/chrome/browser/extensions/webstore_install_helper.cc b/chrome/browser/extensions/webstore_install_helper.cc
index af530c554..5a54041 100644
--- a/chrome/browser/extensions/webstore_install_helper.cc
+++ b/chrome/browser/extensions/webstore_install_helper.cc
@@ -10,6 +10,7 @@
 #include "base/values.h"
 #include "chrome/common/chrome_utility_messages.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_status.h"
 
diff --git a/chrome/browser/extensions/webstore_install_helper.h b/chrome/browser/extensions/webstore_install_helper.h
index 70d122b..91605484 100644
--- a/chrome/browser/extensions/webstore_install_helper.h
+++ b/chrome/browser/extensions/webstore_install_helper.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include "content/browser/utility_process_host.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
@@ -19,12 +19,16 @@
 class ListValue;
 }
 
+namespace net {
+class URLRequestContextGetter;
+}
+
 // This is a class to help dealing with webstore-provided data. It manages
 // sending work to the utility process for parsing manifests and
 // fetching/decoding icon data. Clients must implement the
 // WebstoreInstallHelper::Delegate interface to receive the parsed data.
 class WebstoreInstallHelper : public UtilityProcessHost::Client,
-                              public URLFetcher::Delegate {
+                              public content::URLFetcherDelegate {
  public:
   class Delegate {
    public:
@@ -64,7 +68,7 @@
   void ReportResultsIfComplete();
   void ReportResultFromUIThread();
 
-  // Implementing the URLFetcher::Delegate interface.
+  // Implementing the content::URLFetcherDelegate interface.
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Implementing pieces of the UtilityProcessHost::Client interface.
diff --git a/chrome/browser/google/google_url_tracker.cc b/chrome/browser/google/google_url_tracker.cc
index 20e18b8..39ed011 100644
--- a/chrome/browser/google/google_url_tracker.cc
+++ b/chrome/browser/google/google_url_tracker.cc
@@ -22,6 +22,7 @@
 #include "chrome/common/pref_names.h"
 #include "content/browser/tab_contents/navigation_controller.h"
 #include "content/browser/tab_contents/tab_contents.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 #include "grit/generated_resources.h"
 #include "net/base/load_flags.h"
@@ -221,17 +222,12 @@
   fetcher_->Start();
 }
 
-void GoogleURLTracker::OnURLFetchComplete(const URLFetcher* source,
-                                          const GURL& url,
-                                          const net::URLRequestStatus& status,
-                                          int response_code,
-                                          const net::ResponseCookies& cookies,
-                                          const std::string& data) {
+void GoogleURLTracker::OnURLFetchComplete(const URLFetcher* source) {
   // Delete the fetcher on this function's exit.
   scoped_ptr<URLFetcher> clean_up_fetcher(fetcher_.release());
 
   // Don't update the URL if the request didn't succeed.
-  if (!status.is_success() || (response_code != 200)) {
+  if (!source->status().is_success() || (source->response_code() != 200)) {
     already_fetched_ = false;
     return;
   }
@@ -239,7 +235,8 @@
   // See if the response data was one we want to use, and if so, convert to the
   // appropriate Google base URL.
   std::string url_str;
-  TrimWhitespace(data, TRIM_ALL, &url_str);
+  source->GetResponseAsString(&url_str);
+  TrimWhitespace(url_str, TRIM_ALL, &url_str);
 
   if (!StartsWithASCII(url_str, ".google.", false))
     return;
diff --git a/chrome/browser/google/google_url_tracker.h b/chrome/browser/google/google_url_tracker.h
index 9f5c3f76..bdf22679 100644
--- a/chrome/browser/google/google_url_tracker.h
+++ b/chrome/browser/google/google_url_tracker.h
@@ -12,7 +12,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "googleurl/src/gurl.h"
@@ -36,7 +36,7 @@
 // To protect users' privacy and reduce server load, no updates will be
 // performed (ever) unless at least one consumer registers interest by calling
 // RequestServerCheck().
-class GoogleURLTracker : public URLFetcher::Delegate,
+class GoogleURLTracker : public content::URLFetcherDelegate,
                          public content::NotificationObserver,
                          public net::NetworkChangeNotifier::IPAddressObserver {
  public:
@@ -106,13 +106,8 @@
   // it and can currently do so.
   void StartFetchIfDesirable();
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher *source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher *source);
 
   // content::NotificationObserver
   virtual void Observe(int type,
diff --git a/chrome/browser/google/google_url_tracker_unittest.cc b/chrome/browser/google/google_url_tracker_unittest.cc
index d224c05..9655868 100644
--- a/chrome/browser/google/google_url_tracker_unittest.cc
+++ b/chrome/browser/google/google_url_tracker_unittest.cc
@@ -179,9 +179,10 @@
   TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(expected_id);
   if (!fetcher)
     return;
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-      GURL(GoogleURLTracker::kSearchDomainCheckURL), net::URLRequestStatus(),
-      200, net::ResponseCookies(), domain);
+  fetcher->set_url(GURL(GoogleURLTracker::kSearchDomainCheckURL));
+  fetcher->set_response_code(200);
+  fetcher->SetResponseString(domain);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
   // At this point, |fetcher| is deleted.
   MessageLoop::current()->RunAllPending();
 }
diff --git a/chrome/browser/importer/toolbar_importer.cc b/chrome/browser/importer/toolbar_importer.cc
index 3debf4c..c36d8a5d 100644
--- a/chrome/browser/importer/toolbar_importer.cc
+++ b/chrome/browser/importer/toolbar_importer.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/libxml_utils.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "grit/generated_resources.h"
 
 // Toolbar5Importer
@@ -96,25 +97,21 @@
   }
 }
 
-void Toolbar5Importer::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void Toolbar5Importer::OnURLFetchComplete(const URLFetcher* source) {
   if (cancelled()) {
     EndImport();
     return;
   }
 
-  if (200 != response_code) {  // HTTP/Ok
+  if (200 != source->response_code()) {  // HTTP/Ok
     // Cancelling here will update the UI and bypass the rest of bookmark
     // import.
     EndImportBookmarks();
     return;
   }
 
+  std::string data;
+  source->GetResponseAsString(&data);
   switch (state_) {
     case GET_AUTHORIZATION_TOKEN:
       GetBookmarkDataFromServer(data);
diff --git a/chrome/browser/importer/toolbar_importer.h b/chrome/browser/importer/toolbar_importer.h
index fd1fcf0..6e09c60 100644
--- a/chrome/browser/importer/toolbar_importer.h
+++ b/chrome/browser/importer/toolbar_importer.h
@@ -18,7 +18,7 @@
 #include "base/string16.h"
 #include "chrome/browser/importer/importer.h"
 #include "chrome/browser/importer/profile_writer.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class ImporterBridge;
 class XmlReader;
@@ -29,7 +29,7 @@
 // Toolbar5Importer should not have StartImport called more than once. Futher
 // if StartImport is called, then the class must not be destroyed until it has
 // either completed or Toolbar5Importer->Cancel() has been called.
-class Toolbar5Importer : public URLFetcher::Delegate, public Importer {
+class Toolbar5Importer : public content::URLFetcherDelegate, public Importer {
  public:
   Toolbar5Importer();
 
@@ -46,13 +46,8 @@
   // to cancel network retrieval.
   virtual void Cancel();
 
-  // URLFetcher::Delegate method called back from the URLFetcher object.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate method called back from the URLFetcher object.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(Toolbar5ImporterTest, BookmarkParse);
diff --git a/chrome/browser/intranet_redirect_detector.cc b/chrome/browser/intranet_redirect_detector.cc
index 253795c..5a57cb51 100644
--- a/chrome/browser/intranet_redirect_detector.cc
+++ b/chrome/browser/intranet_redirect_detector.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
 #include "net/base/registry_controlled_domain.h"
@@ -89,13 +90,7 @@
   }
 }
 
-void IntranetRedirectDetector::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void IntranetRedirectDetector::OnURLFetchComplete(const URLFetcher* source) {
   // Delete the fetcher on this function's exit.
   Fetchers::iterator fetcher = fetchers_.find(const_cast<URLFetcher*>(source));
   DCHECK(fetcher != fetchers_.end());
@@ -104,7 +99,7 @@
 
   // If any two fetches result in the same domain/host, we set the redirect
   // origin to that; otherwise we set it to nothing.
-  if (!status.is_success() || (response_code != 200)) {
+  if (!source->status().is_success() || (source->response_code() != 200)) {
     if ((resulting_origins_.empty()) ||
         ((resulting_origins_.size() == 1) &&
          resulting_origins_.front().is_valid())) {
@@ -113,8 +108,8 @@
     }
     redirect_origin_ = GURL();
   } else {
-    DCHECK(url.is_valid());
-    GURL origin(url.GetOrigin());
+    DCHECK(source->url().is_valid());
+    GURL origin(source->url().GetOrigin());
     if (resulting_origins_.empty()) {
       resulting_origins_.push_back(origin);
       return;
diff --git a/chrome/browser/intranet_redirect_detector.h b/chrome/browser/intranet_redirect_detector.h
index 108d521..19000e2 100644
--- a/chrome/browser/intranet_redirect_detector.h
+++ b/chrome/browser/intranet_redirect_detector.h
@@ -10,7 +10,7 @@
 #include <string>
 #include <vector>
 
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "googleurl/src/gurl.h"
@@ -36,7 +36,7 @@
 // return a value at all times (even during startup or in unittest mode).  If no
 // redirection is in place, the returned GURL will be empty.
 class IntranetRedirectDetector
-    : public URLFetcher::Delegate,
+    : public content::URLFetcherDelegate,
       public net::NetworkChangeNotifier::IPAddressObserver {
  public:
   // Only the main browser process loop should call this, when setting up
@@ -65,13 +65,8 @@
   // switch sleep has finished.  Runs any pending fetch.
   void FinishSleep();
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // NetworkChangeNotifier::IPAddressObserver
   virtual void OnIPAddressChanged();
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc
index 66a8eb6..d19f20d 100644
--- a/chrome/browser/metrics/metrics_service.cc
+++ b/chrome/browser/metrics/metrics_service.cc
@@ -179,6 +179,7 @@
 #include "content/browser/plugin_service.h"
 #include "content/browser/renderer_host/render_process_host.h"
 #include "content/common/child_process_info.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 #include "webkit/plugins/npapi/plugin_list.h"
 #include "webkit/plugins/webplugininfo.h"
@@ -1068,22 +1069,17 @@
   }
 }
 
-void MetricsService::OnURLFetchComplete(const URLFetcher* source,
-                                        const GURL& url,
-                                        const net::URLRequestStatus& status,
-                                        int response_code,
-                                        const net::ResponseCookies& cookies,
-                                        const std::string& data) {
+void MetricsService::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(waiting_for_asynchronus_reporting_step_);
   waiting_for_asynchronus_reporting_step_ = false;
   DCHECK(current_fetch_.get());
   current_fetch_.reset(NULL);  // We're not allowed to re-use it.
 
   // Confirm send so that we can move on.
-  VLOG(1) << "METRICS RESPONSE CODE: " << response_code
-          << " status=" << StatusToString(status);
+  VLOG(1) << "METRICS RESPONSE CODE: " << source->response_code()
+          << " status=" << StatusToString(source->status());
 
-  bool upload_succeeded = response_code == 200;
+  bool upload_succeeded = source->response_code() == 200;
 
   // Provide boolean for error recovery (allow us to ignore response_code).
   bool discard_log = false;
@@ -1095,7 +1091,7 @@
         "UMA.Large Rejected Log was Discarded",
         static_cast<int>(log_manager_.staged_log_text().length()));
     discard_log = true;
-  } else if (response_code == 400) {
+  } else if (source->response_code() == 400) {
     // Bad syntax.  Retransmission won't work.
     UMA_HISTOGRAM_COUNTS("UMA.Unacceptable_Log_Discarded", state_);
     discard_log = true;
@@ -1103,9 +1099,11 @@
 
   if (!upload_succeeded && !discard_log) {
     VLOG(1) << "METRICS: transmission attempt returned a failure code: "
-            << response_code << ". Verify network connectivity";
+            << source->response_code() << ". Verify network connectivity";
     LogBadResponseCode();
   } else {  // Successful receipt (or we are discarding log).
+    std::string data;
+    source->GetResponseAsString(&data);
     VLOG(1) << "METRICS RESPONSE DATA: " << data;
     switch (state_) {
       case INITIAL_LOG_READY:
@@ -1138,7 +1136,7 @@
 
   // Error 400 indicates a problem with the log, not with the server, so
   // don't consider that a sign that the server is in trouble.
-  bool server_is_healthy = upload_succeeded || response_code == 400;
+  bool server_is_healthy = upload_succeeded || source->response_code() == 400;
 
   scheduler_->UploadFinished(server_is_healthy,
                              log_manager_.has_unsent_logs());
diff --git a/chrome/browser/metrics/metrics_service.h b/chrome/browser/metrics/metrics_service.h
index fc91621..75bff65 100644
--- a/chrome/browser/metrics/metrics_service.h
+++ b/chrome/browser/metrics/metrics_service.h
@@ -19,7 +19,7 @@
 #include "base/process_util.h"
 #include "chrome/browser/io_thread.h"
 #include "chrome/common/metrics_helpers.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
@@ -52,7 +52,7 @@
 
 
 class MetricsService : public content::NotificationObserver,
-                       public URLFetcher::Delegate,
+                       public content::URLFetcherDelegate,
                        public MetricsServiceBase {
  public:
   MetricsService();
@@ -229,14 +229,9 @@
   // copy of the staged log.
   void PrepareFetchWithStagedLog();
 
-  // Implementation of URLFetcher::Delegate. Called after transmission
+  // Implementation of content::URLFetcherDelegate. Called after transmission
   // completes (either successfully or with failure).
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // Logs debugging details, for the case where the server returns a response
   // code other than 200.
diff --git a/chrome/browser/net/gaia/gaia_oauth_fetcher.cc b/chrome/browser/net/gaia/gaia_oauth_fetcher.cc
index 828ca7f0..9bcd987 100644
--- a/chrome/browser/net/gaia/gaia_oauth_fetcher.cc
+++ b/chrome/browser/net/gaia/gaia_oauth_fetcher.cc
@@ -24,6 +24,7 @@
 #include "chrome/common/net/http_return.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_source.h"
+#include "content/common/net/url_fetcher.h"
 #include "grit/chromium_strings.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -62,7 +63,7 @@
     const std::string& body,
     const std::string& headers,
     bool send_cookies,
-    URLFetcher::Delegate* delegate) {
+    content::URLFetcherDelegate* delegate) {
   bool empty_body = body.empty();
   URLFetcher* result =
       URLFetcher::Create(0,
@@ -654,18 +655,18 @@
   }
 }
 
-void GaiaOAuthFetcher::OnURLFetchComplete(const URLFetcher* source,
-                                          const GURL& url,
-                                          const net::URLRequestStatus& status,
-                                          int response_code,
-                                          const net::ResponseCookies& cookies,
-                                          const std::string& data) {
+void GaiaOAuthFetcher::OnURLFetchComplete(const URLFetcher* source) {
   // Keep |fetcher_| around to avoid invalidating its |status| (accessed below).
   scoped_ptr<URLFetcher> current_fetcher(fetcher_.release());
   fetch_pending_ = false;
   GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
+  GURL url = source->url();
+  std::string data;
+  source->GetResponseAsString(&data);
+  net::URLRequestStatus status = source->status();
+  int response_code = source->response_code();
   if (StartsWithASCII(url.spec(), gaia_urls->get_oauth_token_url(), true)) {
-    OnGetOAuthTokenUrlFetched(cookies, status, response_code);
+    OnGetOAuthTokenUrlFetched(source->cookies(), status, response_code);
   } else if (url.spec() == gaia_urls->oauth1_login_url()) {
     OnOAuthLoginFetched(data, status, response_code);
   } else if (url.spec() == gaia_urls->oauth_get_access_token_url()) {
diff --git a/chrome/browser/net/gaia/gaia_oauth_fetcher.h b/chrome/browser/net/gaia/gaia_oauth_fetcher.h
index 77830b2..329f560 100644
--- a/chrome/browser/net/gaia/gaia_oauth_fetcher.h
+++ b/chrome/browser/net/gaia/gaia_oauth_fetcher.h
@@ -7,11 +7,12 @@
 #pragma once
 
 #include <string>
+#include <vector>
 
 #include "base/memory/scoped_ptr.h"
 #include "chrome/browser/net/chrome_cookie_notification_details.h"
 #include "chrome/browser/net/gaia/gaia_oauth_consumer.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "googleurl/src/gurl.h"
@@ -21,6 +22,12 @@
 class Browser;
 class Profile;
 
+namespace net {
+class URLRequestContextGetter;
+class URLRequestStatus;
+typedef std::vector<std::string> ResponseCookies;
+}
+
 // Authenticate a user using Gaia's OAuth1 and OAuth2 support.
 //
 // Users of this class typically desire an OAuth2 Access token scoped for a
@@ -38,7 +45,7 @@
 //
 // This class can handle one request at a time, and all calls through an
 // instance should be serialized.
-class GaiaOAuthFetcher : public URLFetcher::Delegate,
+class GaiaOAuthFetcher : public content::URLFetcherDelegate,
                          public content::NotificationObserver {
  public:
   // Defines steps of OAuth process performed by this class.
@@ -128,13 +135,8 @@
   virtual void OnBrowserClosing(Browser* profile,
                                 bool detail);
 
-  // Implementation of URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // Implementation of content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // StartGetOAuthToken (or other Start* routine) been called, but results
   // are not back yet.
@@ -234,7 +236,7 @@
                                        const std::string& body,
                                        const std::string& headers,
                                        bool send_cookies,
-                                       URLFetcher::Delegate* delegate);
+                                       content::URLFetcherDelegate* delegate);
 
   bool ShouldAutoFetch(AutoFetchLimit fetch_step);
 
diff --git a/chrome/browser/net/gaia/gaia_oauth_fetcher_unittest.cc b/chrome/browser/net/gaia/gaia_oauth_fetcher_unittest.cc
index ec849cd..6a7a9ca 100644
--- a/chrome/browser/net/gaia/gaia_oauth_fetcher_unittest.cc
+++ b/chrome/browser/net/gaia/gaia_oauth_fetcher_unittest.cc
@@ -160,8 +160,14 @@
   net::ResponseCookies cookies;
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
   GURL url(GaiaUrls::GetInstance()->oauth_get_access_token_url());
-  oauth_fetcher.OnURLFetchComplete(NULL, url, status, RC_REQUEST_OK,
-                                   cookies, data);
+
+  TestURLFetcher test_fetcher(0, GURL(), URLFetcher::GET, &oauth_fetcher);
+  test_fetcher.set_url(url);
+  test_fetcher.set_status(status);
+  test_fetcher.set_response_code(RC_REQUEST_OK);
+  test_fetcher.set_cookies(cookies);
+  test_fetcher.SetResponseString(data);
+  oauth_fetcher.OnURLFetchComplete(&test_fetcher);
 }
 
 TEST_F(GaiaOAuthFetcherTest, OAuthWrapBridge) {
@@ -189,8 +195,14 @@
   net::ResponseCookies cookies;
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
   GURL url(GaiaUrls::GetInstance()->oauth_wrap_bridge_url());
-  oauth_fetcher.OnURLFetchComplete(NULL, url, status, RC_REQUEST_OK,
-                                   cookies, data);
+
+  TestURLFetcher test_fetcher(0, GURL(), URLFetcher::GET, &oauth_fetcher);
+  test_fetcher.set_url(url);
+  test_fetcher.set_status(status);
+  test_fetcher.set_response_code(RC_REQUEST_OK);
+  test_fetcher.set_cookies(cookies);
+  test_fetcher.SetResponseString(data);
+  oauth_fetcher.OnURLFetchComplete(&test_fetcher);
 }
 
 TEST_F(GaiaOAuthFetcherTest, UserInfo) {
@@ -213,8 +225,14 @@
   net::ResponseCookies cookies;
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
   GURL url(GaiaUrls::GetInstance()->oauth_user_info_url());
-  oauth_fetcher.OnURLFetchComplete(NULL, url, status,
-                                   RC_REQUEST_OK, cookies, data);
+
+  TestURLFetcher test_fetcher(0, GURL(), URLFetcher::GET, &oauth_fetcher);
+  test_fetcher.set_url(url);
+  test_fetcher.set_status(status);
+  test_fetcher.set_response_code(RC_REQUEST_OK);
+  test_fetcher.set_cookies(cookies);
+  test_fetcher.SetResponseString(data);
+  oauth_fetcher.OnURLFetchComplete(&test_fetcher);
 }
 
 TEST_F(GaiaOAuthFetcherTest, OAuthRevokeToken) {
@@ -232,6 +250,11 @@
   net::ResponseCookies cookies;
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
   GURL url(GaiaUrls::GetInstance()->oauth_revoke_token_url());
-  oauth_fetcher.OnURLFetchComplete(NULL, url, status,
-                                   RC_REQUEST_OK, cookies, std::string());
+
+  TestURLFetcher test_fetcher(0, GURL(), URLFetcher::GET, &oauth_fetcher);
+  test_fetcher.set_url(url);
+  test_fetcher.set_status(status);
+  test_fetcher.set_response_code(RC_REQUEST_OK);
+  test_fetcher.set_cookies(cookies);
+  oauth_fetcher.OnURLFetchComplete(&test_fetcher);
 }
diff --git a/chrome/browser/net/sdch_dictionary_fetcher.cc b/chrome/browser/net/sdch_dictionary_fetcher.cc
index 766b875..d6062da 100644
--- a/chrome/browser/net/sdch_dictionary_fetcher.cc
+++ b/chrome/browser/net/sdch_dictionary_fetcher.cc
@@ -6,6 +6,7 @@
 
 #include "base/compiler_specific.h"
 #include "chrome/browser/profiles/profile.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/url_request/url_request_status.h"
 
 SdchDictionaryFetcher::SdchDictionaryFetcher()
@@ -73,9 +74,9 @@
 void SdchDictionaryFetcher::OnURLFetchComplete(const URLFetcher* source) {
   if ((200 == source->response_code()) &&
       (source->status().status() == net::URLRequestStatus::SUCCESS)) {
-    net::SdchManager::Global()->AddSdchDictionary(
-        source->GetResponseStringRef(),
-        source->url());
+    std::string data;
+    source->GetResponseAsString(&data);
+    net::SdchManager::Global()->AddSdchDictionary(data, source->url());
   }
   current_fetch_.reset(NULL);
   ScheduleDelayedRun();
diff --git a/chrome/browser/net/sdch_dictionary_fetcher.h b/chrome/browser/net/sdch_dictionary_fetcher.h
index 1f00f91..7611e902 100644
--- a/chrome/browser/net/sdch_dictionary_fetcher.h
+++ b/chrome/browser/net/sdch_dictionary_fetcher.h
@@ -16,10 +16,10 @@
 
 #include "base/memory/scoped_ptr.h"
 #include "base/task.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "net/base/sdch_manager.h"
 
-class SdchDictionaryFetcher : public URLFetcher::Delegate,
+class SdchDictionaryFetcher : public content::URLFetcherDelegate,
                               public net::SdchFetcher {
  public:
   SdchDictionaryFetcher();
@@ -48,7 +48,7 @@
   // in the  |fetch_queue_|.
   void StartFetching();
 
-  // Implementation of URLFetcher::Delegate. Called after transmission
+  // Implementation of content::URLFetcherDelegate. Called after transmission
   // completes (either successfully or with failure).
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
diff --git a/chrome/browser/plugin_download_helper.cc b/chrome/browser/plugin_download_helper.cc
index 8a47ea4..35b4047 100644
--- a/chrome/browser/plugin_download_helper.cc
+++ b/chrome/browser/plugin_download_helper.cc
@@ -9,6 +9,7 @@
 
 #include "base/file_util.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/io_buffer.h"
 
 PluginDownloadUrlHelper::PluginDownloadUrlHelper(
diff --git a/chrome/browser/plugin_download_helper.h b/chrome/browser/plugin_download_helper.h
index dcddaa7..5d57f65 100644
--- a/chrome/browser/plugin_download_helper.h
+++ b/chrome/browser/plugin_download_helper.h
@@ -12,15 +12,19 @@
 #if defined(OS_WIN)
 #include "base/file_path.h"
 #include "base/message_loop_proxy.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "net/base/file_stream.h"
 #include "net/url_request/url_request.h"
 #include "ui/gfx/native_widget_types.h"
 
+namespace net {
+class URLRequestContextGetter;
+}
+
 // The PluginDownloadUrlHelper is used to handle one download URL request
 // from the plugin. Each download request is handled by a new instance
 // of this class.
-class PluginDownloadUrlHelper : public URLFetcher::Delegate {
+class PluginDownloadUrlHelper : public content::URLFetcherDelegate {
  public:
   // The delegate receives notification about the status of downloads
   // initiated.
@@ -40,13 +44,7 @@
   void InitiateDownload(net::URLRequestContextGetter* request_context,
                         base::MessageLoopProxy* file_thread_proxy);
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) {}
+  // content::URLFetcherDelegate
   virtual void OnURLFetchComplete(const URLFetcher* source);
 
   void OnDownloadCompleted(net::URLRequest* request);
diff --git a/chrome/browser/policy/device_management_backend_impl.cc b/chrome/browser/policy/device_management_backend_impl.cc
index 39889dc2..84b98615 100644
--- a/chrome/browser/policy/device_management_backend_impl.cc
+++ b/chrome/browser/policy/device_management_backend_impl.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/policy/device_management_service.h"
 #include "chrome/browser/policy/enterprise_metrics.h"
 #include "chrome/common/chrome_version_info.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/url_request/url_request_status.h"
 
diff --git a/chrome/browser/policy/device_management_service.cc b/chrome/browser/policy/device_management_service.cc
index 7d07b9d..02435a5 100644
--- a/chrome/browser/policy/device_management_service.cc
+++ b/chrome/browser/policy/device_management_service.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/policy/device_management_backend_impl.h"
 #include "content/browser/browser_thread.h"
 #include "content/public/common/content_client.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/cookie_monster.h"
 #include "net/base/host_resolver.h"
 #include "net/base/load_flags.h"
@@ -221,13 +222,7 @@
   fetcher->Start();
 }
 
-void DeviceManagementService::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void DeviceManagementService::OnURLFetchComplete(const URLFetcher* source) {
   JobFetcherMap::iterator entry(pending_jobs_.find(source));
   if (entry != pending_jobs_.end()) {
     DeviceManagementJob* job = entry->second;
@@ -238,10 +233,10 @@
     // the proxy.
     bool retry = false;
     if ((source->load_flags() & net::LOAD_BYPASS_PROXY) == 0) {
-      if (!status.is_success() && IsProxyError(status)) {
+      if (!source->status().is_success() && IsProxyError(source->status())) {
         LOG(WARNING) << "Proxy failed while contacting dmserver.";
         retry = true;
-      } else if (status.is_success() &&
+      } else if (source->status().is_success() &&
                  source->was_fetched_via_proxy() &&
                  !IsProtobufMimeType(source)) {
         // The proxy server can be misconfigured but pointing to an existing
@@ -257,7 +252,10 @@
       LOG(WARNING) << "Retrying dmserver request without using a proxy.";
       StartJob(job, true);
     } else {
-      job->HandleResponse(status, response_code, cookies, data);
+      std::string data;
+      source->GetResponseAsString(&data);
+      job->HandleResponse(source->status(), source->response_code(),
+                          source->cookies(), data);
     }
   } else {
     NOTREACHED() << "Callback from foreign URL fetcher";
diff --git a/chrome/browser/policy/device_management_service.h b/chrome/browser/policy/device_management_service.h
index 089bcf0..1e88be05 100644
--- a/chrome/browser/policy/device_management_service.h
+++ b/chrome/browser/policy/device_management_service.h
@@ -9,15 +9,19 @@
 #include <deque>
 #include <map>
 #include <string>
+#include <vector>
 
 #include "base/basictypes.h"
+#include "base/compiler_specific.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 namespace net {
 class URLRequestContextGetter;
+class URLRequestStatus;
+typedef std::vector<std::string> ResponseCookies;
 }
 
 namespace policy {
@@ -28,7 +32,7 @@
 // communication with the device management server. It creates the backends
 // objects that the device management policy provider and friends use to issue
 // requests.
-class DeviceManagementService : public URLFetcher::Delegate {
+class DeviceManagementService : public content::URLFetcherDelegate {
  public:
   // Describes a device management job handled by the service.
   class DeviceManagementJob {
@@ -79,13 +83,8 @@
   typedef std::map<const URLFetcher*, DeviceManagementJob*> JobFetcherMap;
   typedef std::deque<DeviceManagementJob*> JobQueue;
 
-  // URLFetcher::Delegate override.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // content::URLFetcherDelegate override.
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Does the actual initialization using the request context specified for
   // |PrepareInitialization|. This will also fire any pending network requests.
diff --git a/chrome/browser/policy/device_management_service_browsertest.cc b/chrome/browser/policy/device_management_service_browsertest.cc
index d22abec..2bec6b3 100644
--- a/chrome/browser/policy/device_management_service_browsertest.cc
+++ b/chrome/browser/policy/device_management_service_browsertest.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/test/test_server.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_test_job.h"
diff --git a/chrome/browser/policy/device_management_service_unittest.cc b/chrome/browser/policy/device_management_service_unittest.cc
index dd099743..5468d55 100644
--- a/chrome/browser/policy/device_management_service_unittest.cc
+++ b/chrome/browser/policy/device_management_service_unittest.cc
@@ -121,12 +121,11 @@
   TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
   ASSERT_TRUE(fetcher);
 
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          GetParam().request_status_,
-                                          GetParam().http_status_,
-                                          net::ResponseCookies(),
-                                          GetParam().response_);
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(GetParam().request_status_);
+  fetcher->set_response_code(GetParam().http_status_);
+  fetcher->SetResponseString(GetParam().response_);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 }
 
 TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) {
@@ -137,12 +136,11 @@
   TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
   ASSERT_TRUE(fetcher);
 
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          GetParam().request_status_,
-                                          GetParam().http_status_,
-                                          net::ResponseCookies(),
-                                          GetParam().response_);
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(GetParam().request_status_);
+  fetcher->set_response_code(GetParam().http_status_);
+  fetcher->SetResponseString(GetParam().response_);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 }
 
 TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) {
@@ -159,12 +157,11 @@
   TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
   ASSERT_TRUE(fetcher);
 
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          GetParam().request_status_,
-                                          GetParam().http_status_,
-                                          net::ResponseCookies(),
-                                          GetParam().response_);
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(GetParam().request_status_);
+  fetcher->set_response_code(GetParam().http_status_);
+  fetcher->SetResponseString(GetParam().response_);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 }
 
 INSTANTIATE_TEST_CASE_P(
@@ -349,12 +346,11 @@
   response_wrapper.mutable_register_response()->CopyFrom(expected_response);
   ASSERT_TRUE(response_wrapper.SerializeToString(&response_data));
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          status,
-                                          200,
-                                          net::ResponseCookies(),
-                                          response_data);
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(status);
+  fetcher->set_response_code(200);
+  fetcher->SetResponseString(response_data);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 }
 
 TEST_F(DeviceManagementServiceTest, UnregisterRequest) {
@@ -391,12 +387,11 @@
   response_wrapper.mutable_unregister_response()->CopyFrom(expected_response);
   ASSERT_TRUE(response_wrapper.SerializeToString(&response_data));
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          status,
-                                          200,
-                                          net::ResponseCookies(),
-                                          response_data);
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(status);
+  fetcher->set_response_code(200);
+  fetcher->SetResponseString(response_data);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 }
 
 TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) {
@@ -470,12 +465,11 @@
   response_wrapper.mutable_register_response()->CopyFrom(expected_response);
   ASSERT_TRUE(response_wrapper.SerializeToString(&response_data));
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          status,
-                                          200,
-                                          net::ResponseCookies(),
-                                          response_data);
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(status);
+  fetcher->set_response_code(200);
+  fetcher->SetResponseString(response_data);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 }
 
 TEST_F(DeviceManagementServiceTest, CancelRequestAfterShutdown) {
@@ -513,12 +507,10 @@
 
   // Generate a callback.
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          status,
-                                          500,
-                                          net::ResponseCookies(),
-                                          "");
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(status);
+  fetcher->set_response_code(500);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 
   // Backend should have been reset.
   EXPECT_FALSE(backend_.get());
@@ -542,12 +534,10 @@
   // Generate a callback with a proxy failure.
   net::URLRequestStatus status(net::URLRequestStatus::FAILED,
                                net::ERR_PROXY_CONNECTION_FAILED);
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          status,
-                                          0,
-                                          net::ResponseCookies(),
-                                          "");
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(status);
+  fetcher->set_response_code(200);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 
   // Verify that a new URLFetcher was started that bypasses the proxy.
   fetcher = factory_.GetFetcherByID(0);
@@ -580,12 +570,10 @@
   // Generate a callback with a valid http response, that was generated by
   // a bad/wrong proxy.
   net::URLRequestStatus status;
-  fetcher->delegate()->OnURLFetchComplete(fetcher,
-                                          GURL(kServiceUrl),
-                                          status,
-                                          200,
-                                          net::ResponseCookies(),
-                                          "");
+  fetcher->set_url(GURL(kServiceUrl));
+  fetcher->set_status(status);
+  fetcher->set_response_code(200);
+  fetcher->delegate()->OnURLFetchComplete(fetcher);
 
   // Verify that a new URLFetcher was started that bypasses the proxy.
   fetcher = factory_.GetFetcherByID(0);
diff --git a/chrome/browser/policy/testing_policy_url_fetcher_factory.cc b/chrome/browser/policy/testing_policy_url_fetcher_factory.cc
index 1a2bdff..d5bd948 100644
--- a/chrome/browser/policy/testing_policy_url_fetcher_factory.cc
+++ b/chrome/browser/policy/testing_policy_url_fetcher_factory.cc
@@ -40,13 +40,31 @@
       const base::WeakPtr<TestingPolicyURLFetcherFactory>& parent,
       const GURL& url,
       URLFetcher::RequestType request_type,
-      URLFetcher::Delegate* delegate);
+      content::URLFetcherDelegate* delegate);
 
   virtual void Start() OVERRIDE;
   void Respond();
 
+  virtual const GURL& url() const {
+    return url_;
+  }
+
+  virtual const net::URLRequestStatus& status() const {
+    return status_;
+  }
+
+  virtual int response_code() const {
+    return response_.response_code;
+  }
+
+  virtual bool GetResponseAsString(std::string* out_response_string) const {
+    *out_response_string = response_.response_data;
+    return true;
+  }
+
  private:
   GURL url_;
+  net::URLRequestStatus status_;
   TestURLResponse response_;
   base::WeakPtr<TestingPolicyURLFetcherFactory> parent_;
 
@@ -57,9 +75,10 @@
     const base::WeakPtr<TestingPolicyURLFetcherFactory>& parent,
     const GURL& url,
     URLFetcher::RequestType request_type,
-    URLFetcher::Delegate* delegate)
+    content::URLFetcherDelegate* delegate)
         : URLFetcher(url, request_type, delegate),
           url_(url),
+          status_(net::URLRequestStatus::SUCCESS, 0),
           parent_(parent) {
 }
 
@@ -82,13 +101,7 @@
 }
 
 void TestingPolicyURLFetcher::Respond() {
-  delegate()->OnURLFetchComplete(
-      this,
-      url_,
-      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      response_.response_code,
-      net::ResponseCookies(),
-      response_.response_data);
+  delegate()->OnURLFetchComplete(this);
 }
 
 TestingPolicyURLFetcherFactory::TestingPolicyURLFetcherFactory(
@@ -118,7 +131,7 @@
     int id,
     const GURL& url,
     URLFetcher::RequestType request_type,
-    URLFetcher::Delegate* delegate) {
+    content::URLFetcherDelegate* delegate) {
   return new TestingPolicyURLFetcher(
       weak_ptr_factory_.GetWeakPtr(), url, request_type, delegate);
 }
diff --git a/chrome/browser/policy/testing_policy_url_fetcher_factory.h b/chrome/browser/policy/testing_policy_url_fetcher_factory.h
index 68e1290..32f2aa2 100644
--- a/chrome/browser/policy/testing_policy_url_fetcher_factory.h
+++ b/chrome/browser/policy/testing_policy_url_fetcher_factory.h
@@ -10,7 +10,7 @@
 
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/test/test_url_fetcher_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
@@ -39,7 +39,7 @@
       int id,
       const GURL& url,
       URLFetcher::RequestType request_type,
-      URLFetcher::Delegate* delegate) OVERRIDE;
+      content::URLFetcherDelegate* delegate) OVERRIDE;
 
   LoggingWorkScheduler* scheduler();
 
diff --git a/chrome/browser/printing/cloud_print/cloud_print_proxy_service.h b/chrome/browser/printing/cloud_print/cloud_print_proxy_service.h
index c39b931..fac972e 100644
--- a/chrome/browser/printing/cloud_print/cloud_print_proxy_service.h
+++ b/chrome/browser/printing/cloud_print/cloud_print_proxy_service.h
@@ -11,6 +11,7 @@
 #include "base/basictypes.h"
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
+#include "base/task.h"
 #include "chrome/browser/printing/cloud_print/cloud_print_setup_handler.h"
 #include "chrome/browser/profiles/profile_keyed_service.h"
 
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc
index 322a004..af10d25 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
@@ -25,6 +25,7 @@
 #include "chrome/common/safe_browsing/safebrowsing_messages.h"
 #include "content/browser/browser_thread.h"
 #include "content/browser/renderer_host/render_process_host.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
 #include "crypto/sha2.h"
@@ -183,18 +184,18 @@
   return false;
 }
 
-void ClientSideDetectionService::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void ClientSideDetectionService::OnURLFetchComplete(const URLFetcher* source) {
+  std::string data;
+  source->GetResponseAsString(&data);
   if (source == model_fetcher_.get()) {
-    HandleModelResponse(source, url, status, response_code, cookies, data);
+    HandleModelResponse(
+        source, source->url(), source->status(), source->response_code(),
+        source->cookies(), data);
   } else if (client_phishing_reports_.find(source) !=
              client_phishing_reports_.end()) {
-    HandlePhishingVerdict(source, url, status, response_code, cookies, data);
+    HandlePhishingVerdict(
+        source, source->url(), source->status(), source->response_code(),
+        source->cookies(), data);
   } else {
     NOTREACHED();
   }
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.h b/chrome/browser/safe_browsing/client_side_detection_service.h
index fa40d08..a06244ff 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service.h
+++ b/chrome/browser/safe_browsing/client_side_detection_service.h
@@ -29,7 +29,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/task.h"
 #include "base/time.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "googleurl/src/gurl.h"
@@ -45,6 +45,7 @@
 namespace net {
 class URLRequestContextGetter;
 class URLRequestStatus;
+typedef std::vector<std::string> ResponseCookies;
 }  // namespace net
 
 namespace safe_browsing {
@@ -52,7 +53,7 @@
 class ClientPhishingResponse;
 class ClientSideModel;
 
-class ClientSideDetectionService : public URLFetcher::Delegate,
+class ClientSideDetectionService : public content::URLFetcherDelegate,
                                    public content::NotificationObserver {
  public:
   typedef Callback2<GURL /* phishing URL */, bool /* is phishing */>::Type
@@ -79,13 +80,8 @@
     return enabled_;
   }
 
-  // From the URLFetcher::Delegate interface.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // From the content::URLFetcherDelegate interface.
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // content::NotificationObserver overrides:
   virtual void Observe(int type,
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc
index c6475bc..c565d21f 100644
--- a/chrome/browser/safe_browsing/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -12,6 +12,7 @@
 #include "chrome/common/net/http_return.h"
 #include "chrome/common/safe_browsing/csd.pb.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_status.h"
@@ -66,13 +67,7 @@
   }
 }
 
-void DownloadProtectionService::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void DownloadProtectionService::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
   scoped_ptr<const URLFetcher> s(source);  // will delete the URLFetcher object.
   if (download_requests_.find(source) != download_requests_.end()) {
@@ -85,14 +80,17 @@
       return;
     }
     DownloadCheckResultReason reason = REASON_MAX;
-    if (status.is_success() &&
-        RC_REQUEST_OK == response_code &&
-        data.size() > 0) {
-      // For now no matter what we'll always say the download is safe.
-      // TODO(noelutz): Parse the response body to see exactly what's going on.
-      reason = REASON_INVALID_RESPONSE_PROTO;
-    } else {
-      reason = REASON_SERVER_PING_FAILED;
+    reason = REASON_SERVER_PING_FAILED;
+    if (source->status().is_success() &&
+        RC_REQUEST_OK == source->response_code()) {
+      std::string data;
+      source->GetResponseAsString(&data);
+      if (data.size() > 0) {
+        // For now no matter what we'll always say the download is safe.
+        // TODO(noelutz): Parse the response body to see exactly what's going
+        // on.
+        reason = REASON_INVALID_RESPONSE_PROTO;
+      }
     }
     BrowserThread::PostTask(
         BrowserThread::UI,
diff --git a/chrome/browser/safe_browsing/download_protection_service.h b/chrome/browser/safe_browsing/download_protection_service.h
index c81d5da..c6d4044 100644
--- a/chrome/browser/safe_browsing/download_protection_service.h
+++ b/chrome/browser/safe_browsing/download_protection_service.h
@@ -19,7 +19,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/time.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 namespace net {
@@ -34,7 +34,7 @@
 // client download is malicious or not.
 class DownloadProtectionService
     : public base::RefCountedThreadSafe<DownloadProtectionService>,
-      public URLFetcher::Delegate {
+      public content::URLFetcherDelegate {
  public:
   // TODO(noelutz): we're missing some fields here: filename to get
   // the signature, server IPs, tab URL redirect chain, ...
@@ -65,13 +65,8 @@
       SafeBrowsingService* sb_service,
       net::URLRequestContextGetter* request_context_getter);
 
-  // From the URLFetcher::Delegate interface.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // From the content::URLFetcherDelegate interface.
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // Checks whether the given client download is likely to be
   // malicious or not.  If this method returns true it means the
diff --git a/chrome/browser/safe_browsing/malware_details_cache.cc b/chrome/browser/safe_browsing/malware_details_cache.cc
index 6ceffe1..e833d90 100644
--- a/chrome/browser/safe_browsing/malware_details_cache.cc
+++ b/chrome/browser/safe_browsing/malware_details_cache.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/safe_browsing/report.pb.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_response_headers.h"
@@ -102,26 +103,21 @@
 }
 
 void MalwareDetailsCacheCollector::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+    const URLFetcher* source) {
   DVLOG(1) << "OnUrlFetchComplete";
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
   DCHECK(current_fetch_.get());
-  if (status.status() != net::URLRequestStatus::SUCCESS &&
-      status.error() == net::ERR_CACHE_MISS) {
+  if (source->status().status() != net::URLRequestStatus::SUCCESS &&
+      source->status().error() == net::ERR_CACHE_MISS) {
     // Cache miss, skip this resource.
-    DVLOG(1) << "Cache miss for url: " << url;
+    DVLOG(1) << "Cache miss for url: " << source->url();
     AdvanceEntry();
     return;
   }
 
-  if (status.status() != net::URLRequestStatus::SUCCESS) {
+  if (source->status().status() != net::URLRequestStatus::SUCCESS) {
     // Some other error occurred, e.g. the request could have been cancelled.
-    DVLOG(1) << "Unsuccessful fetch: " << url;
+    DVLOG(1) << "Unsuccessful fetch: " << source->url();
     AdvanceEntry();
     return;
   }
@@ -129,14 +125,16 @@
   // Set the response headers and body to the right resource, which
   // might not be the same as the one we asked for.
   // For redirects, resources_it_->first != url.spec().
-  ClientMalwareReportRequest::Resource* resource = GetResource(url);
+  ClientMalwareReportRequest::Resource* resource = GetResource(source->url());
   if (!resource) {
-    DVLOG(1) << "Cannot find resource for url:" << url;
+    DVLOG(1) << "Cannot find resource for url:" << source->url();
     AdvanceEntry();
     return;
   }
 
   ReadResponse(resource, source);
+  std::string data;
+  source->GetResponseAsString(&data);
   ReadData(resource, data);
   AdvanceEntry();
 }
diff --git a/chrome/browser/safe_browsing/malware_details_cache.h b/chrome/browser/safe_browsing/malware_details_cache.h
index 33f6391..1dbd86c0 100644
--- a/chrome/browser/safe_browsing/malware_details_cache.h
+++ b/chrome/browser/safe_browsing/malware_details_cache.h
@@ -17,7 +17,7 @@
 #include "base/memory/linked_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "chrome/browser/safe_browsing/report.pb.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "net/base/completion_callback.h"
 
 namespace net {
@@ -36,7 +36,7 @@
 
 class MalwareDetailsCacheCollector
     : public base::RefCountedThreadSafe<MalwareDetailsCacheCollector>,
-      public URLFetcher::Delegate {
+      public content::URLFetcherDelegate {
 
  public:
   MalwareDetailsCacheCollector();
@@ -57,12 +57,7 @@
  protected:
   // Implementation of URLFetcher::Delegate. Called after the request
   // completes (either successfully or with failure).
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
  private:
   // Points to the url for which we are fetching the HTTP cache entry or
diff --git a/chrome/browser/safe_browsing/protocol_manager.cc b/chrome/browser/safe_browsing/protocol_manager.cc
index 412325a..adf42d4 100644
--- a/chrome/browser/safe_browsing/protocol_manager.cc
+++ b/chrome/browser/safe_browsing/protocol_manager.cc
@@ -21,6 +21,7 @@
 #include "chrome/common/chrome_version_info.h"
 #include "chrome/common/env_vars.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -195,7 +196,7 @@
     IssueUpdateRequest();
 }
 
-// URLFetcher::Delegate implementation -----------------------------------------
+// content::URLFetcherDelegate implementation ----------------------------------
 
 // All SafeBrowsing request responses are handled here.
 // TODO(paulg): Clarify with the SafeBrowsing team whether a failed parse of a
@@ -205,13 +206,7 @@
 //              drop it. This isn't so bad because the next UPDATE_REQUEST we
 //              do will report all the chunks we have. If that chunk is still
 //              required, the SafeBrowsing servers will tell us to get it again.
-void SafeBrowsingProtocolManager::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void SafeBrowsingProtocolManager::OnURLFetchComplete(const URLFetcher* source) {
   scoped_ptr<const URLFetcher> fetcher;
   bool parsed_ok = true;
   bool must_back_off = false;  // Reduce SafeBrowsing service query frequency.
@@ -234,10 +229,10 @@
     SafeBrowsingService::SafeBrowsingCheck* check = it->second;
     std::vector<SBFullHashResult> full_hashes;
     bool can_cache = false;
-    if (response_code == 200 || response_code == 204) {
+    if (source->response_code() == 200 || source->response_code() == 204) {
       // For tracking our GetHash false positive (204) rate, compared to real
       // (200) responses.
-      if (response_code == 200)
+      if (source->response_code() == 200)
         RecordGetHashResult(check->is_download, GET_HASH_STATUS_200);
       else
         RecordGetHashResult(check->is_download, GET_HASH_STATUS_204);
@@ -246,11 +241,14 @@
       gethash_back_off_mult_ = 1;
       bool re_key = false;
       SafeBrowsingProtocolParser parser;
-      parsed_ok = parser.ParseGetHash(data.data(),
-                                      static_cast<int>(data.length()),
-                                      client_key_,
-                                      &re_key,
-                                      &full_hashes);
+      std::string data;
+      source->GetResponseAsString(&data);
+      parsed_ok = parser.ParseGetHash(
+          data.data(),
+          static_cast<int>(data.length()),
+          client_key_,
+          &re_key,
+          &full_hashes);
       if (!parsed_ok) {
         // If we fail to parse it, we must still inform the SafeBrowsingService
         // so that it doesn't hold up the user's request indefinitely. Not sure
@@ -262,12 +260,12 @@
       }
     } else {
       HandleGetHashError(Time::Now());
-      if (status.status() == net::URLRequestStatus::FAILED) {
+      if (source->status().status() == net::URLRequestStatus::FAILED) {
         VLOG(1) << "SafeBrowsing GetHash request for: " << source->url()
-                << " failed with error: " << status.error();
+                << " failed with error: " << source->status().error();
       } else {
         VLOG(1) << "SafeBrowsing GetHash request for: " << source->url()
-                << " failed with error: " << response_code;
+                << " failed with error: " << source->response_code();
       }
     }
 
@@ -292,11 +290,12 @@
       update_timer_.Stop();
     }
 
-    if (response_code == 200) {
+    if (source->response_code() == 200) {
       // We have data from the SafeBrowsing service.
-      parsed_ok = HandleServiceResponse(source->url(),
-                                        data.data(),
-                                        static_cast<int>(data.length()));
+      std::string data;
+      source->GetResponseAsString(&data);
+      parsed_ok = HandleServiceResponse(
+          source->url(), data.data(), static_cast<int>(data.length()));
       if (!parsed_ok) {
         VLOG(1) << "SafeBrowsing request for: " << source->url()
                 << " failed parse.";
@@ -336,12 +335,12 @@
       if (request_type_ == CHUNK_REQUEST)
         chunk_request_urls_.clear();
       UpdateFinished(false);
-      if (status.status() == net::URLRequestStatus::FAILED) {
+      if (source->status().status() == net::URLRequestStatus::FAILED) {
         VLOG(1) << "SafeBrowsing request for: " << source->url()
-                << " failed with error: " << status.error();
+                << " failed with error: " << source->status().error();
       } else {
         VLOG(1) << "SafeBrowsing request for: " << source->url()
-                << " failed with error: " << response_code;
+                << " failed with error: " << source->response_code();
       }
     }
   }
diff --git a/chrome/browser/safe_browsing/protocol_manager.h b/chrome/browser/safe_browsing/protocol_manager.h
index d0ff19b..08becdb 100644
--- a/chrome/browser/safe_browsing/protocol_manager.h
+++ b/chrome/browser/safe_browsing/protocol_manager.h
@@ -25,7 +25,7 @@
 #include "chrome/browser/safe_browsing/protocol_parser.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/safe_browsing/safe_browsing_util.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 namespace net {
 class URLRequestStatus;
@@ -63,7 +63,7 @@
   DISALLOW_COPY_AND_ASSIGN(SBProtocolManagerFactory);
 };
 
-class SafeBrowsingProtocolManager : public URLFetcher::Delegate {
+class SafeBrowsingProtocolManager : public content::URLFetcherDelegate {
   FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestBackOffTimes);
   FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestChunkStrings);
   FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestGetHashUrl);
@@ -102,13 +102,8 @@
   // of the SafeBrowsing service.
   virtual void Initialize();
 
-  // URLFetcher::Delegate interface.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // content::URLFetcherDelegate interface.
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   // API used by the SafeBrowsingService for issuing queries. When the results
   // are available, SafeBrowsingService::HandleGetHashResults is called.
diff --git a/chrome/browser/safe_browsing/safe_browsing_test.cc b/chrome/browser/safe_browsing/safe_browsing_test.cc
index 9ecd5427..76a87df 100644
--- a/chrome/browser/safe_browsing/safe_browsing_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_test.cc
@@ -39,6 +39,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/browser/browser_thread.h"
 #include "content/browser/renderer_host/resource_dispatcher_host.h"
+#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "net/base/host_resolver.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_log.h"
@@ -351,7 +353,7 @@
 class SafeBrowsingServiceTestHelper
     : public base::RefCountedThreadSafe<SafeBrowsingServiceTestHelper>,
       public SafeBrowsingService::Client,
-      public URLFetcher::Delegate {
+      public content::URLFetcherDelegate {
  public:
   explicit SafeBrowsingServiceTestHelper(
       SafeBrowsingServiceTest* safe_browsing_test)
@@ -507,14 +509,9 @@
   }
 
   // Callback for URLFetcher.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) {
-    response_data_ = data;
-    response_status_ = status.status();
+  virtual void OnURLFetchComplete(const URLFetcher* source) {
+    source->GetResponseAsString(&response_data_);
+    response_status_ = source->status().status();
     StopUILoop();
   }
 
diff --git a/chrome/browser/search_engines/template_url_fetcher.cc b/chrome/browser/search_engines/template_url_fetcher.cc
index bb805bde..7740fb1 100644
--- a/chrome/browser/search_engines/template_url_fetcher.cc
+++ b/chrome/browser/search_engines/template_url_fetcher.cc
@@ -19,11 +19,12 @@
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_source.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "net/url_request/url_request_status.h"
 
 // RequestDelegate ------------------------------------------------------------
 class TemplateURLFetcher::RequestDelegate
-    : public URLFetcher::Delegate,
+    : public content::URLFetcherDelegate,
       public content::NotificationObserver {
  public:
   // Takes ownership of |callbacks|.
@@ -39,15 +40,10 @@
                        const content::NotificationSource& source,
                        const content::NotificationDetails& details);
 
-  // URLFetcher::Delegate:
+  // content::URLFetcherDelegate:
   // If data contains a valid OSDD, a TemplateURL is created and added to
   // the TemplateURLService.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // URL of the OSDD.
   GURL url() const { return osdd_url_; }
@@ -120,12 +116,7 @@
 }
 
 void TemplateURLFetcher::RequestDelegate::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+    const URLFetcher* source) {
   template_url_.reset(new TemplateURL());
 
   // Validation checks.
@@ -134,8 +125,10 @@
   // For other schemes, e.g. when the OSDD file is bundled with an extension,
   // the response_code is not applicable and should be -1. Also, ensure that
   // the returned information results in a valid search URL.
-  if (!status.is_success() ||
-      ((response_code != -1) && (response_code != 200)) ||
+  std::string data;
+  if (!source->status().is_success() ||
+      ((source->response_code() != -1) && (source->response_code() != 200)) ||
+      !source->GetResponseAsString(&data) ||
       !TemplateURLParser::Parse(
           reinterpret_cast<const unsigned char*>(data.c_str()),
           data.length(),
diff --git a/chrome/browser/spellchecker/spellcheck_host_impl.cc b/chrome/browser/spellchecker/spellcheck_host_impl.cc
index 946e5ab2..c8446c8d 100644
--- a/chrome/browser/spellchecker/spellcheck_host_impl.cc
+++ b/chrome/browser/spellchecker/spellcheck_host_impl.cc
@@ -23,6 +23,7 @@
 #include "chrome/common/spellcheck_common.h"
 #include "chrome/common/spellcheck_messages.h"
 #include "content/browser/renderer_host/render_process_host.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
 #include "googleurl/src/gurl.h"
@@ -320,17 +321,12 @@
   file_util::CloseFile(f);
 }
 
-void SpellCheckHostImpl::OnURLFetchComplete(const URLFetcher* source,
-                                            const GURL& url,
-                                            const net::URLRequestStatus& status,
-                                            int response_code,
-                                            const net::ResponseCookies& cookies,
-                                            const std::string& data) {
+void SpellCheckHostImpl::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(source);
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  fetcher_.reset();
+  scoped_ptr<URLFetcher> fetcher_destructor(fetcher_.release());
 
-  if ((response_code / 100) != 2) {
+  if ((source->response_code() / 100) != 2) {
     // Initialize will not try to download the file a second time.
     LOG(ERROR) << "Failure to download dictionary.";
     InitializeOnFileThread();
@@ -340,6 +336,8 @@
   // Basic sanity check on the dictionary.
   // There's the small chance that we might see a 200 status code for a body
   // that represents some form of failure.
+  std::string data;
+  source->GetResponseAsString(&data);
   if (data.size() < 4 || data[0] != 'B' || data[1] != 'D' || data[2] != 'i' ||
       data[3] != 'c') {
     LOG(ERROR) << "Failure to download dictionary.";
diff --git a/chrome/browser/spellchecker/spellcheck_host_impl.h b/chrome/browser/spellchecker/spellcheck_host_impl.h
index 30c217c..e0b52434 100644
--- a/chrome/browser/spellchecker/spellcheck_host_impl.h
+++ b/chrome/browser/spellchecker/spellcheck_host_impl.h
@@ -13,7 +13,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "chrome/browser/spellchecker/spellcheck_host.h"
 #include "chrome/browser/spellchecker/spellcheck_profile_provider.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
@@ -38,7 +38,7 @@
 // Available languages for the checker, which we need to specify via Create(),
 // can be listed using SpellCheckHost::GetAvailableLanguages() static method.
 class SpellCheckHostImpl : public SpellCheckHost,
-                           public URLFetcher::Delegate,
+                           public content::URLFetcherDelegate,
                            public content::NotificationObserver {
  public:
   SpellCheckHostImpl(SpellCheckProfileProvider* profile,
@@ -102,14 +102,9 @@
   // Returns true if the dictionary is ready to use.
   virtual bool IsReady() const;
 
-  // URLFetcher::Delegate implementation.  Called when we finish downloading the
-  // spellcheck dictionary; saves the dictionary to |data_|.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate implementation.  Called when we finish
+  // downloading the spellcheck dictionary; saves the dictionary to |data_|.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // NotificationProfile implementation.
   virtual void Observe(int type,
diff --git a/chrome/browser/sync/glue/http_bridge.cc b/chrome/browser/sync/glue/http_bridge.cc
index e254e16..f3a0120 100644
--- a/chrome/browser/sync/glue/http_bridge.cc
+++ b/chrome/browser/sync/glue/http_bridge.cc
@@ -8,6 +8,7 @@
 #include "base/message_loop_proxy.h"
 #include "base/string_number_conversions.h"
 #include "content/browser/browser_thread.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/common/content_client.h"
 #include "net/base/cookie_monster.h"
 #include "net/base/host_resolver.h"
@@ -265,12 +266,7 @@
   http_post_completed_.Signal();
 }
 
-void HttpBridge::OnURLFetchComplete(const URLFetcher *source,
-                                    const GURL &url,
-                                    const net::URLRequestStatus &status,
-                                    int response_code,
-                                    const net::ResponseCookies &cookies,
-                                    const std::string &data) {
+void HttpBridge::OnURLFetchComplete(const URLFetcher *source) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
   base::AutoLock lock(fetch_state_lock_);
   if (fetch_state_.aborted)
@@ -278,11 +274,11 @@
 
   fetch_state_.request_completed = true;
   fetch_state_.request_succeeded =
-      (net::URLRequestStatus::SUCCESS == status.status());
-  fetch_state_.http_response_code = response_code;
-  fetch_state_.error_code = status.error();
+      (net::URLRequestStatus::SUCCESS == source->status().status());
+  fetch_state_.http_response_code = source->response_code();
+  fetch_state_.error_code = source->status().error();
 
-  fetch_state_.response_content = data;
+  source->GetResponseAsString(&fetch_state_.response_content);
   fetch_state_.response_headers = source->response_headers();
 
   // End of the line for url_poster_. It lives only on the IO loop.
diff --git a/chrome/browser/sync/glue/http_bridge.h b/chrome/browser/sync/glue/http_bridge.h
index 7f8fdb2..411967f4 100644
--- a/chrome/browser/sync/glue/http_bridge.h
+++ b/chrome/browser/sync/glue/http_bridge.h
@@ -15,7 +15,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "chrome/browser/sync/internal_api/http_post_provider_factory.h"
 #include "chrome/browser/sync/internal_api/http_post_provider_interface.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_context.h"
@@ -24,6 +24,10 @@
 class MessageLoop;
 class HttpBridgeTest;
 
+namespace net {
+class HttpResponseHeaders;
+}
+
 namespace browser_sync {
 
 // A bridge between the syncer and Chromium HTTP layers.
@@ -34,7 +38,7 @@
 // needs to stick around across context switches, etc.
 class HttpBridge : public base::RefCountedThreadSafe<HttpBridge>,
                    public sync_api::HttpPostProviderInterface,
-                   public URLFetcher::Delegate {
+                   public content::URLFetcherDelegate {
  public:
   // A request context used for HTTP requests bridged from the sync backend.
   // A bridged RequestContext has a dedicated in-memory cookie store and does
@@ -115,13 +119,8 @@
   virtual const std::string GetResponseHeaderValue(
       const std::string& name) const;
 
-  // URLFetcher::Delegate implementation.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate implementation.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
 #if defined(UNIT_TEST)
   net::URLRequestContextGetter* GetRequestContextGetter() const {
diff --git a/chrome/browser/sync/glue/http_bridge_unittest.cc b/chrome/browser/sync/glue/http_bridge_unittest.cc
index d4b3ef8..a3d4799 100644
--- a/chrome/browser/sync/glue/http_bridge_unittest.cc
+++ b/chrome/browser/sync/glue/http_bridge_unittest.cc
@@ -129,9 +129,11 @@
 
     std::string response_content = "success!";
     DummyURLFetcher fetcher;
-    OnURLFetchComplete(&fetcher, GURL("www.google.com"),
-                       net::URLRequestStatus(),
-                       200, cookies, response_content);
+    fetcher.set_url(GURL("www.google.com"));
+    fetcher.set_response_code(200);
+    fetcher.set_cookies(cookies);
+    fetcher.SetResponseString(response_content);
+    OnURLFetchComplete(&fetcher);
   }
   HttpBridgeTest* test_;
   bool never_finishes_;
diff --git a/chrome/browser/sync/signin_manager_unittest.cc b/chrome/browser/sync/signin_manager_unittest.cc
index f8a0cbd..239c4aa 100644
--- a/chrome/browser/sync/signin_manager_unittest.cc
+++ b/chrome/browser/sync/signin_manager_unittest.cc
@@ -43,20 +43,23 @@
     TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
     DCHECK(fetcher);
     DCHECK(fetcher->delegate());
-    fetcher->delegate()->OnURLFetchComplete(
-        fetcher, GURL(GaiaUrls::GetInstance()->client_login_url()),
-        net::URLRequestStatus(), 200, net::ResponseCookies(),
-        "SID=sid\nLSID=lsid\nAuth=auth");
+
+    fetcher->set_url(GURL(GaiaUrls::GetInstance()->client_login_url()));
+    fetcher->set_status(net::URLRequestStatus());
+    fetcher->set_response_code(200);
+    fetcher->SetResponseString("SID=sid\nLSID=lsid\nAuth=auth");
+    fetcher->delegate()->OnURLFetchComplete(fetcher);
 
     // Then simulate the correct GetUserInfo response for the canonical email.
     // A new URL fetcher is used for each call.
     fetcher = factory_.GetFetcherByID(0);
     DCHECK(fetcher);
     DCHECK(fetcher->delegate());
-    fetcher->delegate()->OnURLFetchComplete(
-        fetcher, GURL(GaiaUrls::GetInstance()->get_user_info_url()),
-        net::URLRequestStatus(), 200, net::ResponseCookies(),
-        "[email protected]");
+    fetcher->set_url(GURL(GaiaUrls::GetInstance()->get_user_info_url()));
+    fetcher->set_status(net::URLRequestStatus());
+    fetcher->set_response_code(200);
+    fetcher->SetResponseString("[email protected]");
+    fetcher->delegate()->OnURLFetchComplete(fetcher);
   }
 
   void SimulateSigninStartOAuth() {
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 4157578..6e6deab 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -36,6 +36,7 @@
 #include "content/browser/browser_thread.h"
 #include "content/browser/tab_contents/tab_contents.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/test/test_url_fetcher_factory.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/escape.h"
@@ -66,18 +67,15 @@
 }
 
 // Helper class that checks whether a sync test server is running or not.
-class SyncServerStatusChecker : public URLFetcher::Delegate {
+class SyncServerStatusChecker : public content::URLFetcherDelegate {
  public:
   SyncServerStatusChecker() : running_(false) {}
 
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) {
-    running_ = (status.status() == net::URLRequestStatus::SUCCESS &&
-                response_code == 200 && data.find("ok") == 0);
+  virtual void OnURLFetchComplete(const URLFetcher* source) {
+    std::string data;
+    source->GetResponseAsString(&data);
+    running_ = (source->status().status() == net::URLRequestStatus::SUCCESS &&
+                source->response_code() == 200 && data.find("ok") == 0);
     MessageLoop::current()->Quit();
   }
 
diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h
index 607bae0..49c23ec 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.h
+++ b/chrome/browser/tab_contents/render_view_context_menu.h
@@ -46,7 +46,7 @@
 // The following snippet describes the simple usage that updates a context-menu
 // item with this interface.
 //
-//   class MyTask : public URLFetcher::Delegate {
+//   class MyTask : public content::URLFetcherDelegate {
 //    public:
 //     MyTask(RenderViewContextMenuProxy* proxy, int id)
 //         : proxy_(proxy),
diff --git a/chrome/browser/tab_contents/spelling_menu_observer.cc b/chrome/browser/tab_contents/spelling_menu_observer.cc
index 0a77f77..a1d7e433d 100644
--- a/chrome/browser/tab_contents/spelling_menu_observer.cc
+++ b/chrome/browser/tab_contents/spelling_menu_observer.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/tab_contents/render_view_context_menu.h"
 #include "chrome/common/pref_names.h"
 #include "content/browser/renderer_host/render_view_host.h"
+#include "content/common/net/url_fetcher.h"
 #include "googleurl/src/gurl.h"
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -149,13 +150,7 @@
   return true;
 }
 
-void SpellingMenuObserver::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void SpellingMenuObserver::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   fetcher_.reset();
@@ -163,7 +158,9 @@
 
   // Parse the response JSON and replace misspelled words in the |result_| text
   // with their suggestions.
-  succeeded_ = ParseResponse(response, data);
+  std::string data;
+  source->GetResponseAsString(&data);
+  succeeded_ = ParseResponse(source->response_code(), data);
   if (!succeeded_)
     result_ = l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLING_CORRECT);
 
diff --git a/chrome/browser/tab_contents/spelling_menu_observer.h b/chrome/browser/tab_contents/spelling_menu_observer.h
index 4ea7a54..c9e3439 100644
--- a/chrome/browser/tab_contents/spelling_menu_observer.h
+++ b/chrome/browser/tab_contents/spelling_menu_observer.h
@@ -12,17 +12,21 @@
 #include "base/string16.h"
 #include "base/timer.h"
 #include "chrome/browser/tab_contents/render_view_context_menu_observer.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class GURL;
 class RenderViewContextMenuProxy;
 
+namespace net {
+class URLRequestContextGetter;
+}
+
 // An observer that listens to events from the RenderViewContextMenu class and
 // shows suggestions from the Spelling ("do you mean") service to a context menu
 // while we show it. This class implements two interfaces:
 // * RenderViewContextMenuObserver
 //   This interface is used for adding a menu item and update it while showing.
-// * URLFetcher::Delegate
+// * content::URLFetcherDelegate
 //   This interface is used for sending a JSON_RPC request to the Spelling
 //   service and retrieving its response.
 // These interfaces allow this class to make a JSON-RPC call to the Spelling
@@ -37,7 +41,7 @@
 //   }
 //
 class SpellingMenuObserver : public RenderViewContextMenuObserver,
-                             public URLFetcher::Delegate {
+                             public content::URLFetcherDelegate {
  public:
   explicit SpellingMenuObserver(RenderViewContextMenuProxy* proxy);
   virtual ~SpellingMenuObserver();
@@ -48,13 +52,8 @@
   virtual bool IsCommandIdEnabled(int command_id) OVERRIDE;
   virtual void ExecuteCommand(int command_id) OVERRIDE;
 
-  // URLFetcher::Delegate implementation.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data) OVERRIDE;
+  // content::URLFetcherDelegate implementation.
+  virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
  private:
   // Invokes a JSON-RPC call in the background. This function sends a JSON-RPC
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index a57972f..e2677d16 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -39,6 +39,7 @@
 #include "content/browser/tab_contents/navigation_details.h"
 #include "content/browser/tab_contents/navigation_entry.h"
 #include "content/browser/tab_contents/tab_contents.h"
+#include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_source.h"
@@ -358,12 +359,7 @@
   }
 }
 
-void TranslateManager::OnURLFetchComplete(const URLFetcher* source,
-                                          const GURL& url,
-                                          const net::URLRequestStatus& status,
-                                          int response_code,
-                                          const net::ResponseCookies& cookies,
-                                          const std::string& data) {
+void TranslateManager::OnURLFetchComplete(const URLFetcher* source) {
   if (translate_script_request_pending_.get() != source &&
       language_list_request_pending_.get() != source) {
     // Looks like crash on Mac is possibly caused with callback entering here
@@ -372,8 +368,8 @@
     return;
   }
 
-  bool error = (status.status() != net::URLRequestStatus::SUCCESS ||
-                response_code != 200);
+  bool error = (source->status().status() != net::URLRequestStatus::SUCCESS ||
+                source->response_code() != 200);
   if (translate_script_request_pending_.get() == source) {
     scoped_ptr<const URLFetcher> delete_ptr(
         translate_script_request_pending_.release());
@@ -382,6 +378,8 @@
           GetRawDataResource(IDR_TRANSLATE_JS);
       DCHECK(translate_script_.empty());
       str.CopyToString(&translate_script_);
+      std::string data;
+      source->GetResponseAsString(&data);
       translate_script_ += "\n" + data;
       // We'll expire the cached script after some time, to make sure long
       // running browsers still get fixes that might get pushed with newer
@@ -429,10 +427,13 @@
   } else {  // if (translate_script_request_pending_.get() == source)
     scoped_ptr<const URLFetcher> delete_ptr(
         language_list_request_pending_.release());
-    if (!error)
+    if (!error) {
+      std::string data;
+      source->GetResponseAsString(&data);
       SetSupportedLanguages(data);
-    else
+    } else {
       VLOG(1) << "Failed to Fetch languages from: " << kLanguageListFetchURL;
+    }
   }
 }
 
diff --git a/chrome/browser/translate/translate_manager.h b/chrome/browser/translate/translate_manager.h
index bf06f48..2cc790f 100644
--- a/chrome/browser/translate/translate_manager.h
+++ b/chrome/browser/translate/translate_manager.h
@@ -16,7 +16,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/prefs/pref_change_registrar.h"
 #include "chrome/common/translate_errors.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
@@ -33,7 +33,7 @@
 // It is a singleton.
 
 class TranslateManager : public content::NotificationObserver,
-                         public URLFetcher::Delegate {
+                         public content::URLFetcherDelegate {
  public:
   // Returns the singleton instance.
   static TranslateManager* GetInstance();
@@ -74,13 +74,8 @@
                        const content::NotificationSource& source,
                        const content::NotificationDetails& details);
 
-  // URLFetcher::Delegate implementation:
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate implementation:
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // Used by unit-tests to override the default delay after which the translate
   // script is fetched again from the translation server.
diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc
index a0cba9249..d09a13d 100644
--- a/chrome/browser/translate/translate_manager_browsertest.cc
+++ b/chrome/browser/translate/translate_manager_browsertest.cc
@@ -190,10 +190,10 @@
     net::URLRequestStatus status;
     status.set_status(success ? net::URLRequestStatus::SUCCESS :
                                 net::URLRequestStatus::FAILED);
-    fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(),
-                                            status, success ? 200 : 500,
-                                            net::ResponseCookies(),
-                                            std::string());
+    fetcher->set_url(fetcher->original_url());
+    fetcher->set_status(status);
+    fetcher->set_response_code(success ? 200 : 500);
+    fetcher->delegate()->OnURLFetchComplete(fetcher);
   }
 
   void SimulateSupportedLanguagesURLFetch(
@@ -218,10 +218,11 @@
       }
       data += "}})";
     }
-    fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(),
-                                            status, success ? 200 : 500,
-                                            net::ResponseCookies(),
-                                            data);
+    fetcher->set_url(fetcher->original_url());
+    fetcher->set_status(status);
+    fetcher->set_response_code(success ? 200 : 500);
+    fetcher->SetResponseString(data);
+    fetcher->delegate()->OnURLFetchComplete(fetcher);
   }
 
   void SetPrefObserverExpectation(const char* path) {
diff --git a/chrome/browser/web_resource/web_resource_service.cc b/chrome/browser/web_resource/web_resource_service.cc
index d9ac0d65..f9f1d34f 100644
--- a/chrome/browser/web_resource/web_resource_service.cc
+++ b/chrome/browser/web_resource/web_resource_service.cc
@@ -23,12 +23,13 @@
 #include "content/browser/browser_thread.h"
 #include "content/common/net/url_fetcher.h"
 #include "content/public/browser/notification_service.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_status.h"
 
 class WebResourceService::WebResourceFetcher
-    : public URLFetcher::Delegate {
+    : public content::URLFetcherDelegate {
  public:
   explicit WebResourceFetcher(WebResourceService* web_resource_service) :
       ALLOW_THIS_IN_INITIALIZER_LIST(fetcher_factory_(this)),
@@ -78,21 +79,18 @@
     url_fetcher_->Start();
   }
 
-  // From URLFetcher::Delegate.
-  void OnURLFetchComplete(const URLFetcher* source,
-                          const GURL& url,
-                          const net::URLRequestStatus& status,
-                          int response_code,
-                          const net::ResponseCookies& cookies,
-                          const std::string& data) {
+  // From content::URLFetcherDelegate.
+  void OnURLFetchComplete(const URLFetcher* source) {
     // Delete the URLFetcher when this function exits.
     scoped_ptr<URLFetcher> clean_up_fetcher(url_fetcher_.release());
 
     // Don't parse data if attempt to download was unsuccessful.
     // Stop loading new web resource data, and silently exit.
-    if (!status.is_success() || (response_code != 200))
+    if (!source->status().is_success() || (source->response_code() != 200))
       return;
 
+    std::string data;
+    source->GetResponseAsString(&data);
     web_resource_service_->UpdateResourceCache(data);
     web_resource_service_->Release();
   }
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index 34cf4de..8bcc58d 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -72,6 +72,7 @@
         'common/chrome_content_client.h',
         'common/chrome_notification_types.h',
         'common/chrome_plugin_messages.h',
+        'common/chrome_result_codes.h',
         'common/chrome_utility_messages.h',
         'common/chrome_version_info.cc',
         'common/chrome_version_info_linux.cc',
diff --git a/chrome/common/net/gaia/gaia_auth_fetcher.cc b/chrome/common/net/gaia/gaia_auth_fetcher.cc
index c8edd96..a66032b 100644
--- a/chrome/common/net/gaia/gaia_auth_fetcher.cc
+++ b/chrome/common/net/gaia/gaia_auth_fetcher.cc
@@ -16,6 +16,7 @@
 #include "chrome/common/net/gaia/gaia_urls.h"
 #include "chrome/common/net/gaia/google_service_auth_error.h"
 #include "chrome/common/net/http_return.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -129,7 +130,7 @@
     const std::string& body,
     const GURL& gaia_gurl,
     bool send_cookies,
-    URLFetcher::Delegate* delegate) {
+    content::URLFetcherDelegate* delegate) {
 
   URLFetcher* to_return =
       URLFetcher::Create(0,
@@ -579,13 +580,13 @@
   }
 }
 
-void GaiaAuthFetcher::OnURLFetchComplete(const URLFetcher* source,
-                                         const GURL& url,
-                                         const net::URLRequestStatus& status,
-                                         int response_code,
-                                         const net::ResponseCookies& cookies,
-                                         const std::string& data) {
+void GaiaAuthFetcher::OnURLFetchComplete(const URLFetcher* source) {
   fetch_pending_ = false;
+  const GURL& url = source->url();
+  const net::URLRequestStatus& status = source->status();
+  int response_code = source->response_code();
+  std::string data;
+  source->GetResponseAsString(&data);
   if (url == client_login_gurl_) {
     OnClientLoginFetched(data, status, response_code);
   } else if (url == issue_auth_token_gurl_) {
diff --git a/chrome/common/net/gaia/gaia_auth_fetcher.h b/chrome/common/net/gaia/gaia_auth_fetcher.h
index e9cbdd3..4e95cc6 100644
--- a/chrome/common/net/gaia/gaia_auth_fetcher.h
+++ b/chrome/common/net/gaia/gaia_auth_fetcher.h
@@ -11,7 +11,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/scoped_ptr.h"
 #include "chrome/common/net/gaia/gaia_auth_consumer.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 // Authenticate a user against the Google Accounts ClientLogin API
@@ -26,7 +26,12 @@
 
 class GaiaAuthFetcherTest;
 
-class GaiaAuthFetcher : public URLFetcher::Delegate {
+namespace net {
+class URLRequestContextGetter;
+class URLRequestStatus;
+}
+
+class GaiaAuthFetcher : public content::URLFetcherDelegate {
  public:
   enum HostedAccountsSetting {
     HostedAccountsAllowed,
@@ -76,13 +81,8 @@
   // existing accounts.
   void StartMergeSession(const std::string& auth_token);
 
-  // Implementation of URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // Implementation of content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   // StartClientLogin been called && results not back yet?
   bool HasPendingFetch();
@@ -201,7 +201,7 @@
                                        const std::string& body,
                                        const GURL& gaia_gurl,
                                        bool send_cookies,
-                                       URLFetcher::Delegate* delegate);
+                                       content::URLFetcherDelegate* delegate);
 
   // From a URLFetcher result, generate an appropriate error.
   // From the API documentation, both IssueAuthToken and ClientLogin have
diff --git a/chrome/common/net/gaia/gaia_auth_fetcher_unittest.cc b/chrome/common/net/gaia/gaia_auth_fetcher_unittest.cc
index 8f49ebb..5d8426cf 100644
--- a/chrome/common/net/gaia/gaia_auth_fetcher_unittest.cc
+++ b/chrome/common/net/gaia/gaia_auth_fetcher_unittest.cc
@@ -18,6 +18,7 @@
 #include "chrome/common/net/http_return.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/test/test_url_fetcher_factory.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/load_flags.h"
@@ -32,32 +33,63 @@
                          const GURL& url,
                          const std::string& results,
                          URLFetcher::RequestType request_type,
-                         URLFetcher::Delegate* d)
+                         content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
-      success_(success),
       url_(url),
-      results_(results) {}
+      results_(results) {
+  net::URLRequestStatus::Status code;
+  
+  if (success) {
+    response_code_ = RC_REQUEST_OK;
+    code = net::URLRequestStatus::SUCCESS;
+  } else {
+    response_code_ = RC_FORBIDDEN;
+    code = net::URLRequestStatus::FAILED;
+  }
+
+  status_ = net::URLRequestStatus(code, 0);
+}
+
+MockFetcher::MockFetcher(const GURL& url,
+                         const net::URLRequestStatus& status,
+                         int response_code,
+                         const net::ResponseCookies& cookies,
+                         const std::string& results,
+                         URLFetcher::RequestType request_type,
+                         content::URLFetcherDelegate* d)
+  : URLFetcher(url, request_type, d),
+    url_(url),
+    status_(status),
+    response_code_(response_code),
+    cookies_(cookies),
+    results_(results) {
+}
 
 MockFetcher::~MockFetcher() {}
 
 void MockFetcher::Start() {
-  net::URLRequestStatus::Status code;
-  int http_code;
-  if (success_) {
-    http_code = RC_REQUEST_OK;
-    code = net::URLRequestStatus::SUCCESS;
-  } else {
-    http_code = RC_FORBIDDEN;
-    code = net::URLRequestStatus::FAILED;
-  }
+  delegate()->OnURLFetchComplete(this);
+}
 
-  net::URLRequestStatus status(code, 0);
-  delegate()->OnURLFetchComplete(NULL,
-                                 url_,
-                                 status,
-                                 http_code,
-                                 net::ResponseCookies(),
-                                 results_);
+const GURL& MockFetcher::url() const {
+  return url_;
+}
+
+const net::URLRequestStatus& MockFetcher::status() const {
+  return status_;
+}
+
+int MockFetcher::response_code() const {
+  return response_code_;
+}
+
+const net::ResponseCookies& MockFetcher::cookies() const {
+  return cookies_;
+}
+
+bool MockFetcher::GetResponseAsString(std::string* out_response_string) const {
+  *out_response_string = results_;
+  return true;
 }
 
 
@@ -173,12 +205,10 @@
   GaiaAuthFetcher auth(&consumer, std::string(),
       profile_.GetRequestContext());
 
-  auth.OnURLFetchComplete(NULL,
-                          client_login_source_,
-                          status,
-                          0,
-                          cookies_,
-                          std::string());
+  MockFetcher mock_fetcher(
+      client_login_source_, status, 0, net::ResponseCookies(), std::string(),
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
 }
 
 TEST_F(GaiaAuthFetcherTest, TokenNetFailure) {
@@ -195,12 +225,10 @@
   GaiaAuthFetcher auth(&consumer, std::string(),
       profile_.GetRequestContext());
 
-  auth.OnURLFetchComplete(NULL,
-                          issue_auth_token_source_,
-                          status,
-                          0,
-                          cookies_,
-                          std::string());
+  MockFetcher mock_fetcher(
+      issue_auth_token_source_, status, 0, cookies_, std::string(),
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
 }
 
 
@@ -217,12 +245,11 @@
 
   GaiaAuthFetcher auth(&consumer, std::string(),
       profile_.GetRequestContext());
-  auth.OnURLFetchComplete(NULL,
-                          client_login_source_,
-                          status,
-                          RC_FORBIDDEN,
-                          cookies_,
-                          data);
+
+  MockFetcher mock_fetcher(
+      client_login_source_, status, RC_FORBIDDEN, cookies_, data,
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
 }
 
 TEST_F(GaiaAuthFetcherTest, ParseRequest) {
@@ -267,12 +294,10 @@
   GaiaAuthFetcher auth(&consumer, std::string(),
       profile_.GetRequestContext());
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  auth.OnURLFetchComplete(NULL,
-                          client_login_source_,
-                          status,
-                          RC_REQUEST_OK,
-                          cookies_,
-                          data);
+  MockFetcher mock_fetcher(
+      client_login_source_, status, RC_REQUEST_OK, cookies_, data,
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
 }
 
 TEST_F(GaiaAuthFetcherTest, WorkingIssueAuthToken) {
@@ -283,12 +308,10 @@
   GaiaAuthFetcher auth(&consumer, std::string(),
       profile_.GetRequestContext());
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  auth.OnURLFetchComplete(NULL,
-                          issue_auth_token_source_,
-                          status,
-                          RC_REQUEST_OK,
-                          cookies_,
-                          "token");
+  MockFetcher mock_fetcher(
+      issue_auth_token_source_, status, RC_REQUEST_OK, cookies_, "token",
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
 }
 
 TEST_F(GaiaAuthFetcherTest, CheckTwoFactorResponse) {
@@ -317,12 +340,10 @@
   GaiaAuthFetcher auth(&consumer, std::string(),
       profile_.GetRequestContext());
   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
-  auth.OnURLFetchComplete(NULL,
-                          client_login_source_,
-                          status,
-                          RC_FORBIDDEN,
-                          cookies_,
-                          response);
+  MockFetcher mock_fetcher(
+      client_login_source_, status, RC_FORBIDDEN, cookies_, response,
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
 }
 
 TEST_F(GaiaAuthFetcherTest, CaptchaParse) {
@@ -473,13 +494,12 @@
                         GaiaAuthFetcher::HostedAccountsAllowed);
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       client_login_source_,
       net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_REQUEST_OK,
-      cookies_,
-      "SID=sid\nLSID=lsid\nAuth=auth\n");
+      RC_REQUEST_OK, cookies_, "SID=sid\nLSID=lsid\nAuth=auth\n",
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -496,13 +516,12 @@
   auth.StartIssueAuthToken("sid", "lsid", "service");
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       issue_auth_token_source_,
       net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_REQUEST_OK,
-      cookies_,
-      "token");
+      RC_REQUEST_OK, cookies_, "token",
+      URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -519,13 +538,11 @@
   auth.StartIssueAuthToken("sid", "lsid", "service");
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       issue_auth_token_source_,
       net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_FORBIDDEN,
-      cookies_,
-      "");
+      RC_FORBIDDEN, cookies_, "", URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -542,13 +559,11 @@
   auth.StartTokenAuth("myubertoken");
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       token_auth_source_,
       net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_REQUEST_OK,
-      cookies_,
-      "<html></html>");
+      RC_REQUEST_OK, cookies_, "<html></html>", URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -565,13 +580,11 @@
   auth.StartTokenAuth("badubertoken");
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       token_auth_source_,
       net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_UNAUTHORIZED,
-      cookies_,
-      "");
+      RC_UNAUTHORIZED, cookies_, "", URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -588,13 +601,11 @@
   auth.StartTokenAuth("badubertoken");
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       token_auth_source_,
       net::URLRequestStatus(net::URLRequestStatus::FAILED, 0),
-      RC_REQUEST_OK,
-      cookies_,
-      "");
+      RC_REQUEST_OK, cookies_, "", URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -611,13 +622,11 @@
   auth.StartMergeSession("myubertoken");
 
   EXPECT_TRUE(auth.HasPendingFetch());
-  auth.OnURLFetchComplete(
-      NULL,
+  MockFetcher mock_fetcher(
       merge_session_source_,
       net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_REQUEST_OK,
-      cookies_,
-      "<html></html>");
+      RC_REQUEST_OK, cookies_, "<html></html>", URLFetcher::GET, &auth);
+  auth.OnURLFetchComplete(&mock_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
 
@@ -642,13 +651,12 @@
 
   GURL final_url("http://www.google.com/CheckCookie");
   test_fetcher->set_url(final_url);
+  test_fetcher->set_status(
+      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
+  test_fetcher->set_response_code(RC_REQUEST_OK);
+  test_fetcher->set_cookies(cookies_);
+  test_fetcher->SetResponseString("<html></html>");
 
-  auth.OnURLFetchComplete(
-      test_fetcher,
-      test_fetcher->url(),
-      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0),
-      RC_REQUEST_OK,
-      cookies_,
-      "<html></html>");
+  auth.OnURLFetchComplete(test_fetcher);
   EXPECT_FALSE(auth.HasPendingFetch());
 }
diff --git a/chrome/common/net/gaia/gaia_auth_fetcher_unittest.h b/chrome/common/net/gaia/gaia_auth_fetcher_unittest.h
index 0534c52..95550fce 100644
--- a/chrome/common/net/gaia/gaia_auth_fetcher_unittest.h
+++ b/chrome/common/net/gaia/gaia_auth_fetcher_unittest.h
@@ -17,6 +17,10 @@
 #include "content/test/test_url_fetcher_factory.h"
 #include "net/url_request/url_request_status.h"
 
+namespace content {
+class URLFetcherDelegate;
+}
+
 // Responds as though ClientLogin returned from the server.
 class MockFetcher : public URLFetcher {
  public:
@@ -24,15 +28,31 @@
               const GURL& url,
               const std::string& results,
               URLFetcher::RequestType request_type,
-              URLFetcher::Delegate* d);
+              content::URLFetcherDelegate* d);
+
+  MockFetcher(const GURL& url,
+              const net::URLRequestStatus& status,
+              int response_code,
+              const net::ResponseCookies& cookies,
+              const std::string& results,
+              URLFetcher::RequestType request_type,
+              content::URLFetcherDelegate* d);
 
   virtual ~MockFetcher();
 
   virtual void Start();
 
+  virtual const GURL& url() const;
+  virtual const net::URLRequestStatus& status() const;
+  virtual int response_code() const;
+  virtual const net::ResponseCookies& cookies() const;
+  virtual bool GetResponseAsString(std::string* out_response_string) const;
+
  private:
-  bool success_;
   GURL url_;
+  net::URLRequestStatus status_;
+  int response_code_;
+  net::ResponseCookies cookies_;
   std::string results_;
   DISALLOW_COPY_AND_ASSIGN(MockFetcher);
 };
@@ -49,7 +69,7 @@
   URLFetcher* CreateURLFetcher(int id,
                                const GURL& url,
                                URLFetcher::RequestType request_type,
-                               URLFetcher::Delegate* d) {
+                               content::URLFetcherDelegate* d) {
     return new T(success_, url, results_, request_type, d);
   }
   void set_success(bool success) {
diff --git a/chrome/common/net/gaia/gaia_oauth_client.cc b/chrome/common/net/gaia/gaia_oauth_client.cc
index 501e46e..fadf589 100644
--- a/chrome/common/net/gaia/gaia_oauth_client.cc
+++ b/chrome/common/net/gaia/gaia_oauth_client.cc
@@ -9,6 +9,7 @@
 #include "base/values.h"
 #include "chrome/common/net/http_return.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/escape.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -23,7 +24,7 @@
 
 class GaiaOAuthClient::Core
     : public base::RefCountedThreadSafe<GaiaOAuthClient::Core>,
-      public URLFetcher::Delegate {
+      public content::URLFetcherDelegate {
  public:
   Core(const std::string& gaia_url,
        net::URLRequestContextGetter* request_context_getter)
@@ -43,25 +44,14 @@
                     int max_retries,
                     GaiaOAuthClient::Delegate* delegate);
 
-  // URLFetcher::Delegate implementation.
-  virtual void OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data);
+  // content::URLFetcherDelegate implementation.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
  private:
   void MakeGaiaRequest(std::string post_body,
                        int max_retries,
                        GaiaOAuthClient::Delegate* delegate);
-  void HandleResponse(const URLFetcher* source,
-                      const GURL& url,
-                      const net::URLRequestStatus& status,
-                      int response_code,
-                      const std::string& data,
-                      bool* should_retry_request);
+  void HandleResponse(const URLFetcher* source, bool* should_retry_request);
 
   GURL gaia_url_;
   int num_retries_;
@@ -113,15 +103,9 @@
 }
 
 // URLFetcher::Delegate implementation.
-void GaiaOAuthClient::Core::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void GaiaOAuthClient::Core::OnURLFetchComplete(const URLFetcher* source) {
   bool should_retry = false;
-  HandleResponse(source, url, status, response_code, data, &should_retry);
+  HandleResponse(source, &should_retry);
   if (should_retry) {
     // Explicitly call ReceivedContentWasMalformed() to ensure the current
     // request gets counted as a failure for calculation of the back-off
@@ -140,24 +124,21 @@
 
 void GaiaOAuthClient::Core::HandleResponse(
     const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const std::string& data,
     bool* should_retry_request) {
   *should_retry_request = false;
   // RC_BAD_REQUEST means the arguments are invalid. No point retrying. We are
   // done here.
-  if (response_code == RC_BAD_REQUEST) {
+  if (source->response_code() == RC_BAD_REQUEST) {
     delegate_->OnOAuthError();
     return;
   }
   std::string access_token;
   std::string refresh_token;
   int expires_in_seconds = 0;
-  if (response_code == RC_REQUEST_OK) {
-    scoped_ptr<Value> message_value(
-        base::JSONReader::Read(data, false));
+  if (source->response_code() == RC_REQUEST_OK) {
+    std::string data;
+    source->GetResponseAsString(&data);
+    scoped_ptr<Value> message_value(base::JSONReader::Read(data, false));
     if (message_value.get() &&
         message_value->IsType(Value::TYPE_DICTIONARY)) {
       scoped_ptr<DictionaryValue> response_dict(
@@ -173,7 +154,7 @@
     if ((-1 != source->max_retries()) &&
         (num_retries_ > source->max_retries())) {
       // Retry limit reached. Give up.
-      delegate_->OnNetworkError(response_code);
+      delegate_->OnNetworkError(source->response_code());
     } else {
       *should_retry_request = true;
     }
diff --git a/chrome/common/net/gaia/gaia_oauth_client_unittest.cc b/chrome/common/net/gaia/gaia_oauth_client_unittest.cc
index 97a859bf4..f5d5cfb 100644
--- a/chrome/common/net/gaia/gaia_oauth_client_unittest.cc
+++ b/chrome/common/net/gaia/gaia_oauth_client_unittest.cc
@@ -13,6 +13,7 @@
 #include "chrome/common/net/http_return.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/test/test_url_fetcher_factory.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/net_errors.h"
@@ -31,7 +32,7 @@
                    const GURL& url,
                    const std::string& results,
                    URLFetcher::RequestType request_type,
-                   URLFetcher::Delegate* d)
+                   content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
       response_code_(response_code),
       max_failure_count_(max_failure_count),
@@ -51,16 +52,30 @@
       code = net::URLRequestStatus::FAILED;
       current_failure_count_++;
     }
-    net::URLRequestStatus status(code, 0);
-    delegate()->OnURLFetchComplete(this,
-                                   url_,
-                                   status,
-                                   response_code_,
-                                   net::ResponseCookies(),
-                                   results_);
+    status_ = net::URLRequestStatus(code, 0);
+
+    delegate()->OnURLFetchComplete(this);
+  }
+
+  virtual const GURL& url() const {
+    return url_;
+  }
+
+  virtual const net::URLRequestStatus& status() const {
+    return status_;
+  }
+
+  virtual int response_code() const {
+    return response_code_;
+  }
+
+  virtual bool GetResponseAsString(std::string* out_response_string) const {
+    *out_response_string = results_;
+    return true;
   }
 
  private:
+  net::URLRequestStatus status_;
   int response_code_;
   int max_failure_count_;
   int current_failure_count_;
@@ -81,7 +96,7 @@
       int id,
       const GURL& url,
       URLFetcher::RequestType request_type,
-      URLFetcher::Delegate* d) {
+      content::URLFetcherDelegate* d) {
     return new MockOAuthFetcher(
         response_code_,
         max_failure_count_,
diff --git a/chrome/service/cloud_print/cloud_print_url_fetcher.cc b/chrome/service/cloud_print/cloud_print_url_fetcher.cc
index 297d56c..2604392 100644
--- a/chrome/service/cloud_print/cloud_print_url_fetcher.cc
+++ b/chrome/service/cloud_print/cloud_print_url_fetcher.cc
@@ -50,38 +50,34 @@
                      additional_headers);
 }
 
-  // URLFetcher::Delegate implementation.
-void CloudPrintURLFetcher::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
-  VLOG(1) << "CP_PROXY: OnURLFetchComplete, url: " << url
-          << ", response code: " << response_code;
+void CloudPrintURLFetcher::OnURLFetchComplete(const URLFetcher* source) {
+  VLOG(1) << "CP_PROXY: OnURLFetchComplete, url: " << source->url()
+          << ", response code: " << source->response_code();
   // Make sure we stay alive through the body of this function.
   scoped_refptr<CloudPrintURLFetcher> keep_alive(this);
-  ResponseAction action = delegate_->HandleRawResponse(source,
-                                                       url,
-                                                       status,
-                                                       response_code,
-                                                       cookies,
-                                                       data);
+  std::string data;
+  source->GetResponseAsString(&data);
+  ResponseAction action = delegate_->HandleRawResponse(
+      source,
+      source->url(),
+      source->status(),
+      source->response_code(),
+      source->cookies(),
+      data);
   if (action == CONTINUE_PROCESSING) {
     // If we are not using an OAuth token, and we got an auth error, we are
     // done. Else, the token may have been refreshed. Let us try again.
-    if ((RC_FORBIDDEN == response_code) &&
+    if ((RC_FORBIDDEN == source->response_code()) &&
         (!CloudPrintTokenStore::current() ||
          !CloudPrintTokenStore::current()->token_is_oauth())) {
       delegate_->OnRequestAuthError();
       return;
     }
     // We need to retry on all network errors.
-    if (!status.is_success() || (response_code != 200))
+    if (!source->status().is_success() || (source->response_code() != 200))
       action = RETRY_REQUEST;
     else
-      action = delegate_->HandleRawData(source, url, data);
+      action = delegate_->HandleRawData(source, source->url(), data);
 
     if (action == CONTINUE_PROCESSING) {
       // If the delegate is not interested in handling the raw response data,
@@ -93,7 +89,7 @@
       CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict);
       if (response_dict)
         action = delegate_->HandleJSONData(source,
-                                           url,
+                                           source->url(),
                                            response_dict,
                                            succeeded);
       else
diff --git a/chrome/service/cloud_print/cloud_print_url_fetcher.h b/chrome/service/cloud_print/cloud_print_url_fetcher.h
index ab49923..a872386 100644
--- a/chrome/service/cloud_print/cloud_print_url_fetcher.h
+++ b/chrome/service/cloud_print/cloud_print_url_fetcher.h
@@ -8,8 +8,10 @@
 
 #include <string>
 
+#include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 class GURL;
 
@@ -18,6 +20,7 @@
 }
 
 namespace net {
+class URLRequestContextGetter;
 class URLRequestStatus;
 }  // namespace net
 
@@ -28,7 +31,7 @@
 // must also be retried.
 class CloudPrintURLFetcher
     : public base::RefCountedThreadSafe<CloudPrintURLFetcher>,
-      public URLFetcher::Delegate {
+      public content::URLFetcherDelegate {
  public:
   enum ResponseAction {
     CONTINUE_PROCESSING,
@@ -92,12 +95,9 @@
                         const std::string& post_data,
                         const std::string& additional_headers);
 
-  // URLFetcher::Delegate implementation.
-  virtual void OnURLFetchComplete(const URLFetcher* source, const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate implementation.
+  virtual void OnURLFetchComplete(const URLFetcher* source);
+
  protected:
   friend class base::RefCountedThreadSafe<CloudPrintURLFetcher>;
   virtual ~CloudPrintURLFetcher();
diff --git a/chrome/service/gaia/service_gaia_authenticator.cc b/chrome/service/gaia/service_gaia_authenticator.cc
index 8cfab51..08d1ddd 100644
--- a/chrome/service/gaia/service_gaia_authenticator.cc
+++ b/chrome/service/gaia/service_gaia_authenticator.cc
@@ -7,6 +7,7 @@
 #include "base/message_loop_proxy.h"
 #include "chrome/service/net/service_url_request_context.h"
 #include "chrome/service/service_process.h"
+#include "content/common/net/url_fetcher.h"
 #include "googleurl/src/gurl.h"
 
 ServiceGaiaAuthenticator::ServiceGaiaAuthenticator(
@@ -70,11 +71,11 @@
   request->Start();
 }
 
-// URLFetcher::Delegate implementation
+// content::URLFetcherDelegate implementation
 void ServiceGaiaAuthenticator::OnURLFetchComplete(const URLFetcher* source) {
   DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
   http_response_code_ = source->response_code();
-  response_data_ = source->GetResponseStringRef();
+  source->GetResponseAsString(&response_data_);
   delete source;
   // Add an extra reference because we want http_post_completed_ to remain
   // valid until after Signal() returns.
diff --git a/chrome/service/gaia/service_gaia_authenticator.h b/chrome/service/gaia/service_gaia_authenticator.h
index 6be5a65..8c30cd2 100644
--- a/chrome/service/gaia/service_gaia_authenticator.h
+++ b/chrome/service/gaia/service_gaia_authenticator.h
@@ -8,10 +8,11 @@
 
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/waitable_event.h"
 #include "chrome/common/net/gaia/gaia_authenticator.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 
 namespace base {
 class MessageLoopProxy;
@@ -21,7 +22,7 @@
 // we cannot rely on the existence of a Profile)
 class ServiceGaiaAuthenticator
     : public base::RefCountedThreadSafe<ServiceGaiaAuthenticator>,
-      public URLFetcher::Delegate,
+      public content::URLFetcherDelegate,
       public gaia::GaiaAuthenticator {
  public:
   ServiceGaiaAuthenticator(const std::string& user_agent,
@@ -30,7 +31,7 @@
                            base::MessageLoopProxy* io_message_loop_proxy);
   virtual ~ServiceGaiaAuthenticator();
 
-  // URLFetcher::Delegate implementation.
+  // content::URLFetcherDelegate implementation.
   virtual void OnURLFetchComplete(const URLFetcher *source) OVERRIDE;
 
  protected:
diff --git a/content/browser/geolocation/network_location_request.cc b/content/browser/geolocation/network_location_request.cc
index d345192..7284b7f 100644
--- a/content/browser/geolocation/network_location_request.cc
+++ b/content/browser/geolocation/network_location_request.cc
@@ -12,6 +12,7 @@
 #include "base/utf_string_conversions.h"
 #include "base/values.h"
 #include "content/common/geoposition.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -106,9 +107,11 @@
 
   Geoposition position;
   string16 access_token;
+  std::string data;
+  source->GetResponseAsString(&data);
   GetLocationFromResponse(status.is_success(),
                           response_code,
-                          source->GetResponseStringRef(),
+                          data,
                           timestamp_,
                           source->url(),
                           &position,
diff --git a/content/browser/geolocation/network_location_request.h b/content/browser/geolocation/network_location_request.h
index 45f6806..649d4ff 100644
--- a/content/browser/geolocation/network_location_request.h
+++ b/content/browser/geolocation/network_location_request.h
@@ -13,7 +13,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "content/browser/geolocation/device_data_provider.h"
 #include "content/common/content_export.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 
 class URLFetcher;
@@ -27,7 +27,7 @@
 
 // Takes a set of device data and sends it to a server to get a position fix.
 // It performs formatting of the request and interpretation of the response.
-class NetworkLocationRequest : private URLFetcher::Delegate {
+class NetworkLocationRequest : private content::URLFetcherDelegate {
  public:
   // ID passed to URLFetcher::Create(). Used for testing.
   CONTENT_EXPORT static int url_fetcher_id_for_tests;
@@ -65,7 +65,7 @@
   const GURL& url() const { return url_; }
 
  private:
-  // URLFetcher::Delegate
+  // content::URLFetcherDelegate
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
   scoped_refptr<net::URLRequestContextGetter> url_context_;
diff --git a/content/browser/speech/speech_recognition_request.cc b/content/browser/speech/speech_recognition_request.cc
index c61c134..e204b10 100644
--- a/content/browser/speech/speech_recognition_request.cc
+++ b/content/browser/speech/speech_recognition_request.cc
@@ -10,6 +10,7 @@
 #include "base/string_number_conversions.h"
 #include "base/string_util.h"
 #include "base/values.h"
+#include "content/common/net/url_fetcher.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
 #include "net/url_request/url_request_context.h"
@@ -209,8 +210,10 @@
   DCHECK_EQ(url_fetcher_.get(), source);
 
   SpeechInputResult result;
+  std::string data;
   if (!source->status().is_success() || source->response_code() != 200 ||
-      !ParseServerResponse(source->GetResponseStringRef(), &result)) {
+      !source->GetResponseAsString(&data) ||
+      !ParseServerResponse(data, &result)) {
     result.error = kErrorNetwork;
   }
 
diff --git a/content/browser/speech/speech_recognition_request.h b/content/browser/speech/speech_recognition_request.h
index 2382123..caab120c 100644
--- a/content/browser/speech/speech_recognition_request.h
+++ b/content/browser/speech/speech_recognition_request.h
@@ -12,7 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "content/common/content_export.h"
-#include "content/common/net/url_fetcher.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "content/common/speech_input_result.h"
 #include "googleurl/src/gurl.h"
 
@@ -26,7 +26,7 @@
 
 // Provides a simple interface for sending recorded speech data to the server
 // and get back recognition results.
-class SpeechRecognitionRequest : public URLFetcher::Delegate {
+class SpeechRecognitionRequest : public content::URLFetcherDelegate {
  public:
   // ID passed to URLFetcher::Create(). Used for testing.
   CONTENT_EXPORT static int url_fetcher_id_for_tests;
@@ -62,7 +62,7 @@
 
   CONTENT_EXPORT bool HasPendingRequest() { return url_fetcher_ != NULL; }
 
-  // URLFetcher::Delegate methods.
+  // content::URLFetcherDelegate methods.
   virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE;
 
  private:
diff --git a/content/common/net/url_fetcher.cc b/content/common/net/url_fetcher.cc
index de0cdd2f..c7b8350 100644
--- a/content/common/net/url_fetcher.cc
+++ b/content/common/net/url_fetcher.cc
@@ -18,6 +18,7 @@
 #include "base/stl_util.h"
 #include "base/string_util.h"
 #include "base/threading/thread.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "googleurl/src/gurl.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/io_buffer.h"
@@ -44,7 +45,7 @@
   Core(URLFetcher* fetcher,
        const GURL& original_url,
        RequestType request_type,
-       URLFetcher::Delegate* d);
+       content::URLFetcherDelegate* d);
 
   // Starts the load.  It's important that this not happen in the constructor
   // because it causes the IO thread to begin AddRef()ing and Release()ing
@@ -70,7 +71,7 @@
   virtual void OnResponseStarted(net::URLRequest* request);
   virtual void OnReadCompleted(net::URLRequest* request, int bytes_read);
 
-  URLFetcher::Delegate* delegate() const { return delegate_; }
+  content::URLFetcherDelegate* delegate() const { return delegate_; }
   static void CancelAll();
 
  private:
@@ -220,7 +221,7 @@
   GURL url_;                         // The URL we eventually wound up at
   RequestType request_type_;         // What type of request is this?
   net::URLRequestStatus status_;     // Status of the request
-  URLFetcher::Delegate* delegate_;   // Object to notify on completion
+  content::URLFetcherDelegate* delegate_;  // Object to notify on completion
   scoped_refptr<base::MessageLoopProxy> delegate_loop_proxy_;
                                      // Message loop proxy of the creating
                                      // thread.
@@ -465,43 +466,12 @@
 // static
 URLFetcher::Factory* URLFetcher::factory_ = NULL;
 
-void URLFetcher::Delegate::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
-  NOTREACHED() << "If you don't implement this, the no-params version "
-               << "should also be implemented, in which case this "
-               << "method won't be called...";
-}
-
-// TODO(skerner): This default implementation will be removed, and the
-// method made pure virtual, once all users of URLFetcher are updated
-// to not expect response data as a string argument.  Once this is removed,
-// the method URLFetcher::GetResponseStringRef() can be removed as well.
-// crbug.com/83592 tracks this.
-void URLFetcher::Delegate::OnURLFetchComplete(const URLFetcher* source) {
-  // A delegate that did not override this method is using the old
-  // parameter list to OnURLFetchComplete(). If a user asked to save
-  // the response to a file, they must use the new parameter list,
-  // in which case we can not get here.
-  // To avoid updating all callers, thunk to the old prototype for now.
-  OnURLFetchComplete(source,
-                     source->url(),
-                     source->status(),
-                     source->response_code(),
-                     source->cookies(),
-                     source->GetResponseStringRef());
-}
-
 // static
 bool URLFetcher::g_interception_enabled = false;
 
 URLFetcher::URLFetcher(const GURL& url,
                        RequestType request_type,
-                       Delegate* d)
+                       content::URLFetcherDelegate* d)
     : ALLOW_THIS_IN_INITIALIZER_LIST(
       core_(new Core(this, url, request_type, d))) {
 }
@@ -512,7 +482,8 @@
 
 // static
 URLFetcher* URLFetcher::Create(int id, const GURL& url,
-                               RequestType request_type, Delegate* d) {
+                               RequestType request_type,
+                               content::URLFetcherDelegate* d) {
   return factory_ ? factory_->CreateURLFetcher(id, url, request_type, d) :
                     new URLFetcher(url, request_type, d);
 }
@@ -520,7 +491,7 @@
 URLFetcher::Core::Core(URLFetcher* fetcher,
                        const GURL& original_url,
                        RequestType request_type,
-                       URLFetcher::Delegate* d)
+                       content::URLFetcherDelegate* d)
     : fetcher_(fetcher),
       original_url_(original_url),
       request_type_(request_type),
@@ -587,7 +558,9 @@
 }
 
 void URLFetcher::Core::Stop() {
-  DCHECK(delegate_loop_proxy_->BelongsToCurrentThread());
+  if (delegate_loop_proxy_) {  // May be NULL in tests.
+    DCHECK(delegate_loop_proxy_->BelongsToCurrentThread());
+  }
   delegate_ = NULL;
   fetcher_ = NULL;
   if (io_message_loop_proxy_.get()) {
@@ -1081,11 +1054,6 @@
   return true;
 }
 
-const std::string& URLFetcher::GetResponseStringRef() const {
-  CHECK(core_->response_destination_ == STRING);
-  return core_->data_;
-}
-
 void URLFetcher::SetResponseDestinationForTesting(
     ResponseDestinationType value) {
   core_->response_destination_ = value;
@@ -1122,6 +1090,6 @@
   return Core::g_registry.Get().size();
 }
 
-URLFetcher::Delegate* URLFetcher::delegate() const {
+content::URLFetcherDelegate* URLFetcher::delegate() const {
   return core_->delegate();
 }
diff --git a/content/common/net/url_fetcher.h b/content/common/net/url_fetcher.h
index f865f780..021470eb 100644
--- a/content/common/net/url_fetcher.h
+++ b/content/common/net/url_fetcher.h
@@ -31,6 +31,10 @@
 class MessageLoopProxy;
 }  // namespace base
 
+namespace content {
+class URLFetcherDelegate;
+}
+
 namespace net {
 class HostPortPair;
 class HttpResponseHeaders;
@@ -53,14 +57,14 @@
 //   fetcher->Start();
 //
 //
-// The object you supply as a delegate must inherit from URLFetcher::Delegate;
-// when the fetch is completed, OnURLFetchComplete() will be called with a
-// pointer to the URLFetcher.  From that point until the original URLFetcher
-// instance is destroyed, you may use accessor methods to see the result of
-// the fetch. You should copy these objects if you need them to live longer
-// than the URLFetcher instance. If the URLFetcher instance is destroyed
-// before the callback happens, the fetch will be canceled and no callback
-// will occur.
+// The object you supply as a delegate must inherit from
+// content::URLFetcherDelegate; when the fetch is completed,
+// OnURLFetchComplete() will be called with a pointer to the URLFetcher.  From
+// that point until the original URLFetcher instance is destroyed, you may use
+// accessor methods to see the result of the fetch. You should copy these
+// objects if you need them to live longer than the URLFetcher instance. If the
+// URLFetcher instance is destroyed before the callback happens, the fetch will
+// be canceled and no callback will occur.
 //
 // You may create the URLFetcher instance on any thread; OnURLFetchComplete()
 // will be called back on the same thread you use to create the instance.
@@ -81,26 +85,6 @@
   // was received.
   static const int kInvalidHttpResponseCode;
 
-  class CONTENT_EXPORT Delegate {
-   public:
-    // TODO(skerner): This will be removed in favor of the |source|-only
-    // version below. Leaving this for now to make the initial code review
-    // easy to read.
-    virtual void OnURLFetchComplete(const URLFetcher* source,
-                                    const GURL& url,
-                                    const net::URLRequestStatus& status,
-                                    int response_code,
-                                    const net::ResponseCookies& cookies,
-                                    const std::string& data);
-
-    // This will be called when the URL has been fetched, successfully or not.
-    // Use accessor methods on |source| to get the results.
-    virtual void OnURLFetchComplete(const URLFetcher* source);
-
-   protected:
-    virtual ~Delegate() {}
-  };
-
   // URLFetcher::Create uses the currently registered Factory to create the
   // URLFetcher. Factory is intended for testing.
   class Factory {
@@ -108,7 +92,7 @@
     virtual URLFetcher* CreateURLFetcher(int id,
                                          const GURL& url,
                                          RequestType request_type,
-                                         Delegate* d) = 0;
+                                         content::URLFetcherDelegate* d) = 0;
 
    protected:
     virtual ~Factory() {}
@@ -117,7 +101,9 @@
   // |url| is the URL to send the request to.
   // |request_type| is the type of request to make.
   // |d| the object that will receive the callback on fetch completion.
-  URLFetcher(const GURL& url, RequestType request_type, Delegate* d);
+  URLFetcher(const GURL& url,
+             RequestType request_type,
+             content::URLFetcherDelegate* d);
   virtual ~URLFetcher();
 
   // Normally interception is disabled for URLFetcher, but you can use this
@@ -132,7 +118,7 @@
   // constructor for a description of the args. |id| may be used during testing
   // to identify who is creating the URLFetcher.
   static URLFetcher* Create(int id, const GURL& url, RequestType request_type,
-                            Delegate* d);
+                            content::URLFetcherDelegate* d);
 
   // Sets data only needed by POSTs.  All callers making POST requests should
   // call this before the request is started.  |upload_content_type| is the MIME
@@ -246,10 +232,6 @@
   // set to store the response as a string.
   virtual bool GetResponseAsString(std::string* out_response_string) const;
 
-  // Return a const reference to the string data fetched.  Response type
-  // must be STRING, or this will CHECK.
-  virtual const std::string& GetResponseStringRef() const;
-
   // Get the path to the file containing the response body. Returns false
   // if the response body was not saved to a file. If take_ownership is
   // true, caller takes responsibility for the temp file, and it will not
@@ -258,7 +240,7 @@
   virtual bool GetResponseAsFilePath(bool take_ownership,
                                      FilePath* out_response_path) const;
 
-  // Cancels all existing URLFetchers.  Will notify the URLFetcher::Delegates.
+  // Cancels all existing URLFetchers.  Will notify the URLFetcherDelegates.
   // Note that any new URLFetchers created while this is running will not be
   // cancelled.  Typically, one would call this in the CleanUp() method of an IO
   // thread, so that no new URLRequests would be able to start on the IO thread
@@ -274,7 +256,7 @@
   };
 
   // Returns the delegate.
-  Delegate* delegate() const;
+  content::URLFetcherDelegate* delegate() const;
 
   // Used by tests.
   const std::string& upload_data() const;
diff --git a/content/common/net/url_fetcher_unittest.cc b/content/common/net/url_fetcher_unittest.cc
index a451bd35..d3336b87 100644
--- a/content/common/net/url_fetcher_unittest.cc
+++ b/content/common/net/url_fetcher_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "crypto/nss_util.h"
 #include "net/http/http_response_headers.h"
 #include "net/test/test_server.h"
@@ -57,7 +58,8 @@
 
 }  // namespace
 
-class URLFetcherTest : public testing::Test, public URLFetcher::Delegate {
+class URLFetcherTest : public testing::Test,
+                       public content::URLFetcherDelegate {
  public:
   URLFetcherTest() : fetcher_(NULL) { }
 
@@ -68,13 +70,8 @@
   // Creates a URLFetcher, using the program's main thread to do IO.
   virtual void CreateFetcher(const GURL& url);
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() {
     return io_message_loop_proxy_;
@@ -115,14 +112,12 @@
   fetcher_->Start();
 }
 
-void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source,
-                                        const GURL& url,
-                                        const net::URLRequestStatus& status,
-                                        int response_code,
-                                        const net::ResponseCookies& cookies,
-                                        const std::string& data) {
-  EXPECT_TRUE(status.is_success());
-  EXPECT_EQ(200, response_code);  // HTTP OK
+void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source) {
+  EXPECT_TRUE(source->status().is_success());
+  EXPECT_EQ(200, source->response_code());  // HTTP OK
+
+  std::string data;
+  EXPECT_TRUE(source->GetResponseAsString(&data));
   EXPECT_FALSE(data.empty());
 
   delete fetcher_;  // Have to delete this here and not in the destructor,
@@ -141,37 +136,22 @@
  public:
   virtual void CreateFetcher(const GURL& url);
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 };
 
 // Version of URLFetcherTest that tests headers.
 class URLFetcherHeadersTest : public URLFetcherTest {
  public:
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 };
 
 // Version of URLFetcherTest that tests SocketAddress.
 class URLFetcherSocketAddressTest : public URLFetcherTest {
  public:
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
  protected:
   std::string expected_host_;
   uint16 expected_port_;
@@ -181,13 +161,8 @@
 class URLFetcherProtectTest : public URLFetcherTest {
  public:
   virtual void CreateFetcher(const GURL& url);
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
  private:
   Time start_time_;
 };
@@ -197,13 +172,8 @@
 class URLFetcherProtectTestPassedThrough : public URLFetcherTest {
  public:
   virtual void CreateFetcher(const GURL& url);
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
  private:
   Time start_time_;
 };
@@ -213,13 +183,8 @@
  public:
   URLFetcherBadHTTPSTest();
 
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
  private:
   FilePath cert_dir_;
@@ -229,13 +194,8 @@
 class URLFetcherCancelTest : public URLFetcherTest {
  public:
   virtual void CreateFetcher(const GURL& url);
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
 
   void CancelRequest();
 };
@@ -282,13 +242,8 @@
 // Version of URLFetcherTest that tests retying the same request twice.
 class URLFetcherMultipleAttemptTest : public URLFetcherTest {
  public:
-  // URLFetcher::Delegate
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
+  // content::URLFetcherDelegate
+  virtual void OnURLFetchComplete(const URLFetcher* source);
  private:
   std::string data_;
 };
@@ -299,18 +254,9 @@
       : take_ownership_of_temp_file_(false) {
   }
 
-  // URLFetcher::Delegate
+  // content::URLFetcherDelegate
   virtual void OnURLFetchComplete(const URLFetcher* source);
 
-  // This obsolete signature should not be used, but must be present
-  // to make clang happy.
-  virtual void OnURLFetchComplete(const URLFetcher* source,
-                                  const GURL& url,
-                                  const net::URLRequestStatus& status,
-                                  int response_code,
-                                  const net::ResponseCookies& cookies,
-                                  const std::string& data);
-
   virtual void CreateFetcher(const GURL& url);
 
  protected:
@@ -407,43 +353,25 @@
   fetcher_->Start();
 }
 
-void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source,
-                                            const GURL& url,
-                                            const net::URLRequestStatus& status,
-                                            int response_code,
-                                            const net::ResponseCookies& cookies,
-                                            const std::string& data) {
+void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source) {
+  std::string data;
+  EXPECT_TRUE(source->GetResponseAsString(&data));
   EXPECT_EQ(std::string("bobsyeruncle"), data);
-  URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
-                                     cookies, data);
+  URLFetcherTest::OnURLFetchComplete(source);
 }
 
-void URLFetcherHeadersTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void URLFetcherHeadersTest::OnURLFetchComplete(const URLFetcher* source) {
   std::string header;
   EXPECT_TRUE(source->response_headers()->GetNormalizedHeader("cache-control",
                                                               &header));
   EXPECT_EQ("private", header);
-  URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
-                                     cookies, data);
+  URLFetcherTest::OnURLFetchComplete(source);
 }
 
-void URLFetcherSocketAddressTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void URLFetcherSocketAddressTest::OnURLFetchComplete(const URLFetcher* source) {
   EXPECT_EQ("127.0.0.1", source->socket_address().host());
   EXPECT_EQ(expected_port_, source->socket_address().port());
-  URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
-                                     cookies, data);
+  URLFetcherTest::OnURLFetchComplete(source);
 }
 
 void URLFetcherProtectTest::CreateFetcher(const GURL& url) {
@@ -455,19 +383,15 @@
   fetcher_->Start();
 }
 
-void URLFetcherProtectTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void URLFetcherProtectTest::OnURLFetchComplete(const URLFetcher* source) {
   const TimeDelta one_second = TimeDelta::FromMilliseconds(1000);
-  if (response_code >= 500) {
+  if (source->response_code() >= 500) {
     // Now running ServerUnavailable test.
     // It takes more than 1 second to finish all 11 requests.
     EXPECT_TRUE(Time::Now() - start_time_ >= one_second);
-    EXPECT_TRUE(status.is_success());
+    EXPECT_TRUE(source->status().is_success());
+    std::string data;
+    EXPECT_TRUE(source->GetResponseAsString(&data));
     EXPECT_FALSE(data.empty());
     delete fetcher_;
     io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
@@ -482,8 +406,7 @@
       // We have already sent 20 requests continuously. And we expect that
       // it takes more than 1 second due to the overload protection settings.
       EXPECT_TRUE(Time::Now() - start_time_ >= one_second);
-      URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
-                                         cookies, data);
+      URLFetcherTest::OnURLFetchComplete(source);
     }
   }
 }
@@ -499,21 +422,18 @@
 }
 
 void URLFetcherProtectTestPassedThrough::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+    const URLFetcher* source) {
   const TimeDelta one_minute = TimeDelta::FromMilliseconds(60000);
-  if (response_code >= 500) {
+  if (source->response_code() >= 500) {
     // Now running ServerUnavailable test.
     // It should get here on the first attempt, so almost immediately and
     // *not* to attempt to execute all 11 requests (2.5 minutes).
     EXPECT_TRUE(Time::Now() - start_time_ < one_minute);
-    EXPECT_TRUE(status.is_success());
+    EXPECT_TRUE(source->status().is_success());
     // Check that suggested back off time is bigger than 0.
     EXPECT_GT(fetcher_->backoff_delay().InMicroseconds(), 0);
+    std::string data;
+    EXPECT_TRUE(source->GetResponseAsString(&data));
     EXPECT_FALSE(data.empty());
   } else {
     // We should not get here!
@@ -537,19 +457,15 @@
 // The "server certificate expired" error should result in automatic
 // cancellation of the request by
 // net::URLRequest::Delegate::OnSSLCertificateError.
-void URLFetcherBadHTTPSTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void URLFetcherBadHTTPSTest::OnURLFetchComplete(const URLFetcher* source) {
   // This part is different from URLFetcherTest::OnURLFetchComplete
   // because this test expects the request to be cancelled.
-  EXPECT_EQ(net::URLRequestStatus::CANCELED, status.status());
-  EXPECT_EQ(net::ERR_ABORTED, status.error());
-  EXPECT_EQ(-1, response_code);
-  EXPECT_TRUE(cookies.empty());
+  EXPECT_EQ(net::URLRequestStatus::CANCELED, source->status().status());
+  EXPECT_EQ(net::ERR_ABORTED, source->status().error());
+  EXPECT_EQ(-1, source->response_code());
+  EXPECT_TRUE(source->cookies().empty());
+  std::string data;
+  EXPECT_TRUE(source->GetResponseAsString(&data));
   EXPECT_TRUE(data.empty());
 
   // The rest is the same as URLFetcherTest::OnURLFetchComplete.
@@ -570,13 +486,7 @@
   CancelRequest();
 }
 
-void URLFetcherCancelTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
+void URLFetcherCancelTest::OnURLFetchComplete(const URLFetcher* source) {
   // We should have cancelled the request before completion.
   ADD_FAILURE();
   delete fetcher_;
@@ -591,14 +501,11 @@
 }
 
 void URLFetcherMultipleAttemptTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
-  EXPECT_TRUE(status.is_success());
-  EXPECT_EQ(200, response_code);  // HTTP OK
+    const URLFetcher* source) {
+  EXPECT_TRUE(source->status().is_success());
+  EXPECT_EQ(200, source->response_code());  // HTTP OK
+  std::string data;
+  EXPECT_TRUE(source->GetResponseAsString(&data));
   EXPECT_FALSE(data.empty());
   if (!data.empty() && data_.empty()) {
     data_ = data;
@@ -630,17 +537,6 @@
   io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
 }
 
-void URLFetcherTempFileTest::OnURLFetchComplete(
-    const URLFetcher* source,
-    const GURL& url,
-    const net::URLRequestStatus& status,
-    int response_code,
-    const net::ResponseCookies& cookies,
-    const std::string& data) {
-  NOTREACHED();
-}
-
-
 TEST_F(URLFetcherTest, SameThreadsTest) {
   net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
   ASSERT_TRUE(test_server.Start());
diff --git a/content/content_common.gypi b/content/content_common.gypi
index fdf8dfef..6777d30 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -48,6 +48,7 @@
     'public/common/serialized_script_value.h',
     'public/common/url_constants.cc',
     'public/common/url_constants.h',
+    'public/common/url_fetcher_delegate.h',
     'public/common/view_types.h',
     'common/appcache/appcache_backend_proxy.cc',
     'common/appcache/appcache_backend_proxy.h',
diff --git a/content/public/common/url_fetcher_delegate.h b/content/public/common/url_fetcher_delegate.h
new file mode 100644
index 0000000..3a06ab11
--- /dev/null
+++ b/content/public/common/url_fetcher_delegate.h
@@ -0,0 +1,27 @@
+// Copyright (c) 2011 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 CONTENT_PUBLIC_COMMON_URL_FETCHER_DELEGATE_H_
+#define CONTENT_PUBLIC_COMMON_URL_FETCHER_DELEGATE_H_
+#pragma once
+
+#include "content/common/content_export.h"
+
+class URLFetcher;
+
+namespace content {
+// A delegate interface for users of URLFetcher.
+class CONTENT_EXPORT URLFetcherDelegate {
+ public:
+  // This will be called when the URL has been fetched, successfully or not.
+  // Use accessor methods on |source| to get the results.
+  virtual void OnURLFetchComplete(const URLFetcher* source) = 0;
+
+ protected:
+  virtual ~URLFetcherDelegate() {}
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_COMMON_URL_FETCHER_DELEGATE_H_
diff --git a/content/test/test_url_fetcher_factory.cc b/content/test/test_url_fetcher_factory.cc
index f6ebe94..7a78b317 100644
--- a/content/test/test_url_fetcher_factory.cc
+++ b/content/test/test_url_fetcher_factory.cc
@@ -8,6 +8,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/message_loop.h"
+#include "content/public/common/url_fetcher_delegate.h"
 #include "net/http/http_response_headers.h"
 #include "net/url_request/url_request_status.h"
 
@@ -24,7 +25,7 @@
 TestURLFetcher::TestURLFetcher(int id,
                                const GURL& url,
                                URLFetcher::RequestType request_type,
-                               URLFetcher::Delegate* d)
+                               content::URLFetcherDelegate* d)
     : URLFetcher(url, request_type, d),
       id_(id),
       original_url_(url),
@@ -68,10 +69,6 @@
   fake_response_file_path_ = path;
 }
 
-const std::string& TestURLFetcher::GetResponseStringRef() const {
-  return fake_response_string_;
-}
-
 bool TestURLFetcher::GetResponseAsString(
     std::string* out_response_string) const {
   if (GetResponseDestinationForTesting() != STRING)
@@ -100,7 +97,7 @@
     int id,
     const GURL& url,
     URLFetcher::RequestType request_type,
-    URLFetcher::Delegate* d) {
+    content::URLFetcherDelegate* d) {
   TestURLFetcher* fetcher = new TestURLFetcher(id, url, request_type, d);
   fetchers_[id] = fetcher;
   return fetcher;
@@ -129,11 +126,16 @@
   return fake_response_code_;
 }
 
+const net::ResponseCookies& TestURLFetcher::cookies() const {
+  return fake_cookies_;
+}
+
 // This class is used by the FakeURLFetcherFactory below.
 class FakeURLFetcher : public URLFetcher {
  public:
   // Normal URL fetcher constructor but also takes in a pre-baked response.
-  FakeURLFetcher(const GURL& url, RequestType request_type, Delegate* d,
+  FakeURLFetcher(const GURL& url, RequestType request_type,
+                 content::URLFetcherDelegate* d,
                  const std::string& response_data, bool success)
     : URLFetcher(url, request_type, d),
       url_(url),
@@ -158,10 +160,6 @@
     return cookies_;
   }
 
-  virtual const std::string& GetResponseStringRef() const OVERRIDE {
-    return response_data_;
-  }
-
   virtual bool GetResponseAsString(
       std::string* out_response_string) const OVERRIDE {
     *out_response_string = response_data_;
@@ -220,7 +218,7 @@
     int id,
     const GURL& url,
     URLFetcher::RequestType request_type,
-    URLFetcher::Delegate* d) {
+    content::URLFetcherDelegate* d) {
   FakeResponseMap::const_iterator it = fake_responses_.find(url);
   if (it == fake_responses_.end()) {
     if (default_factory_ == NULL) {
@@ -254,6 +252,6 @@
     int id,
     const GURL& url,
     URLFetcher::RequestType request_type,
-    URLFetcher::Delegate* d) {
+    content::URLFetcherDelegate* d) {
   return new URLFetcher(url, request_type, d);
 }
diff --git a/content/test/test_url_fetcher_factory.h b/content/test/test_url_fetcher_factory.h
index 377b5b0..2e7593ea 100644
--- a/content/test/test_url_fetcher_factory.h
+++ b/content/test/test_url_fetcher_factory.h
@@ -57,7 +57,7 @@
   TestURLFetcher(int id,
                  const GURL& url,
                  RequestType request_type,
-                 Delegate* d);
+                 content::URLFetcherDelegate* d);
   virtual ~TestURLFetcher();
 
   // Overriden to do nothing. It is assumed the caller will notify the delegate.
@@ -83,7 +83,9 @@
   const std::list<std::string>& upload_chunks() const { return chunks_; }
 
   // Returns the delegate installed on the URLFetcher.
-  Delegate* delegate() const { return URLFetcher::delegate(); }
+  content::URLFetcherDelegate* delegate() const {
+    return URLFetcher::delegate();
+  }
 
   void set_url(const GURL& url) { fake_url_ = url; }
   virtual const GURL& url() const OVERRIDE;
@@ -96,6 +98,9 @@
   }
   virtual int response_code() const OVERRIDE;
 
+  void set_cookies(const net::ResponseCookies& c) { fake_cookies_ = c; }
+  virtual const net::ResponseCookies& cookies() const OVERRIDE;
+
   void set_was_fetched_via_proxy(bool flag);
 
   void set_response_headers(scoped_refptr<net::HttpResponseHeaders> headers);
@@ -107,7 +112,6 @@
   void SetResponseFilePath(const FilePath& path);
 
   // Override response access functions to return fake data.
-  virtual const std::string& GetResponseStringRef() const OVERRIDE;
   virtual bool GetResponseAsString(std::string* out_response_string) const
       OVERRIDE;
   virtual bool GetResponseAsFilePath(bool take_ownership,
@@ -127,6 +131,7 @@
   GURL fake_url_;
   net::URLRequestStatus fake_status_;
   int fake_response_code_;
+  net::ResponseCookies fake_cookies_;
   std::string fake_response_string_;
   FilePath fake_response_file_path_;
 
@@ -144,7 +149,7 @@
   virtual URLFetcher* CreateURLFetcher(int id,
                                        const GURL& url,
                                        URLFetcher::RequestType request_type,
-                                       URLFetcher::Delegate* d) OVERRIDE;
+                                       content::URLFetcherDelegate* d) OVERRIDE;
   TestURLFetcher* GetFetcherByID(int id) const;
   void RemoveFetcherFromMap(int id);
 
@@ -205,7 +210,7 @@
   virtual URLFetcher* CreateURLFetcher(int id,
                                        const GURL& url,
                                        URLFetcher::RequestType request_type,
-                                       URLFetcher::Delegate* d) OVERRIDE;
+                                       content::URLFetcherDelegate* d) OVERRIDE;
 
   // Sets the fake response for a given URL.  If success is true we will serve
   // an HTTP/200 and an HTTP/500 otherwise.  The |response_data| may be empty.
@@ -238,7 +243,7 @@
   virtual URLFetcher* CreateURLFetcher(int id,
                                        const GURL& url,
                                        URLFetcher::RequestType request_type,
-                                       URLFetcher::Delegate* d) OVERRIDE;
+                                       content::URLFetcherDelegate* d) OVERRIDE;
 
 };