Convert trivial URLRequest::Interceptors and URLRequestJobFactory::Interceptor into URLRequestJobFactory::ProtocolHandlers.
BUG=161524
Review URL: https://codereview.chromium.org/11293252
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174174 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/component_updater/component_updater_interceptor.cc b/chrome/browser/component_updater/component_updater_interceptor.cc
deleted file mode 100644
index 41d7eae..0000000
--- a/chrome/browser/component_updater/component_updater_interceptor.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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.
-#include "chrome/browser/component_updater/component_updater_interceptor.h"
-
-#include "base/file_util.h"
-#include "base/threading/thread_restrictions.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_job.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using content::BrowserThread;
-
-ComponentUpdateInterceptor::ComponentUpdateInterceptor()
- : hit_count_(0) {
- net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
-}
-
-ComponentUpdateInterceptor::~ComponentUpdateInterceptor() {
- net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
-}
-
-net::URLRequestJob* ComponentUpdateInterceptor::MaybeIntercept(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
- EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (request->url().scheme() != "http" ||
- request->url().host() != "localhost") {
- return NULL;
- }
-
- // It's ok to do a blocking disk access on this thread; this class
- // is just used for tests.
- base::ThreadRestrictions::ScopedAllowIO allow_io;
-
- ResponseMap::iterator it = responses_.find(request->url());
- if (it == responses_.end()) {
- return NULL;
- }
- const Response& response = it->second;
- ++hit_count_;
-
- std::string contents;
- EXPECT_TRUE(file_util::ReadFileToString(response.data_path, &contents));
-
- return new net::URLRequestTestJob(request,
- network_delegate,
- response.headers,
- contents,
- true);
-}
-
-void ComponentUpdateInterceptor::SetResponse(const std::string& url,
- const std::string& headers,
- const FilePath& path) {
- // It's ok to do a blocking disk access on this thread; this class
- // is just used for tests.
- base::ThreadRestrictions::ScopedAllowIO allow_io;
- GURL gurl(url);
- EXPECT_EQ("http", gurl.scheme());
- EXPECT_EQ("localhost", gurl.host());
- EXPECT_TRUE(file_util::PathExists(path));
- Response response = { path, headers };
- responses_[gurl] = response;
-}
diff --git a/chrome/browser/component_updater/component_updater_interceptor.h b/chrome/browser/component_updater/component_updater_interceptor.h
deleted file mode 100644
index 67b9199..0000000
--- a/chrome/browser/component_updater/component_updater_interceptor.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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 CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_UPDATER_INTERCEPTOR_H_
-#define CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_UPDATER_INTERCEPTOR_H_
-
-#include <map>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/file_path.h"
-#include "googleurl/src/gurl.h"
-#include "net/url_request/url_request.h"
-
-#if !defined(UNIT_TEST)
-#error "use this class only in unit tests"
-#endif
-
-// This url request interceptor lets us respond to localhost http request urls
-// with the contents of files on disk for use in tests.
-class ComponentUpdateInterceptor
- : public net::URLRequest::Interceptor,
- public base::RefCountedThreadSafe<ComponentUpdateInterceptor> {
- public:
- ComponentUpdateInterceptor();
-
- // When requests for |url| arrive, respond with the contents of |path|. The
- // hostname of |url| must be "localhost" to avoid DNS lookups, and the scheme
- // must be "http".
- void SetResponse(const std::string& url,
- const std::string& headers,
- const FilePath& path);
-
- // Returns how many requests have been issued that have a stored reply.
- int hit_count() const { return hit_count_; }
-
- private:
- // When computing matches, this ignores the query parameters of the url.
- virtual net::URLRequestJob* MaybeIntercept(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) OVERRIDE;
-
- friend class base::RefCountedThreadSafe<ComponentUpdateInterceptor>;
-
- virtual ~ComponentUpdateInterceptor();
-
- struct Response {
- FilePath data_path;
- std::string headers;
- };
-
- typedef std::map<GURL, Response> ResponseMap;
- ResponseMap responses_;
- int hit_count_;
-
- DISALLOW_COPY_AND_ASSIGN(ComponentUpdateInterceptor);
-};
-
-#endif // CHROME_BROWSER_COMPONENT_UPDATER_COMPONENT_UPDATER_INTERCEPTOR_H_
diff --git a/chrome/browser/component_updater/test/component_updater_service_unittest.cc b/chrome/browser/component_updater/test/component_updater_service_unittest.cc
index 10a30ec..c886819 100644
--- a/chrome/browser/component_updater/test/component_updater_service_unittest.cc
+++ b/chrome/browser/component_updater/test/component_updater_service_unittest.cc
@@ -11,13 +11,13 @@
#include "base/message_loop.h"
#include "base/path_service.h"
#include "base/values.h"
-#include "chrome/browser/component_updater/component_updater_interceptor.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/chrome_paths.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_service.h"
#include "content/public/test/test_browser_thread.h"
#include "content/public/test/test_notification_tracker.h"
+#include "content/test/net/url_request_prepackaged_interceptor.h"
#include "googleurl/src/gurl.h"
#include "libxml/globals.h"
#include "net/url_request/url_fetcher.h"
@@ -120,11 +120,6 @@
0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
0x06,0x01};
-const char header_ok_reply[] =
- "HTTP/1.1 200 OK\0"
- "Content-type: text/html\0"
- "\0";
-
const char expected_crx_url[] =
"http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx";
@@ -245,19 +240,17 @@
io_thread.StartIOThread();
file_thread.Start();
- scoped_refptr<ComponentUpdateInterceptor>
- interceptor(new ComponentUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
CrxComponent com;
RegisterComponent(&com, kTestComponent_abag, Version("1.1"));
- const char expected_update_url[] =
+ const GURL expected_update_url(
"http://localhost/upd?extra=foo&x=id%3D"
- "abagagagagagagagagagagagagagagag%26v%3D1.1%26uc";
+ "abagagagagagagagagagagagagagagag%26v%3D1.1%26uc");
- interceptor->SetResponse(expected_update_url,
- header_ok_reply,
- test_file("updatecheck_reply_1.xml"));
+ interceptor.SetResponse(expected_update_url,
+ test_file("updatecheck_reply_1.xml"));
// We loop twice, but there are no updates so we expect two sleep messages.
test_configurator()->SetLoopCount(2);
@@ -274,7 +267,7 @@
EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
TestNotificationTracker::Event ev3 = notification_tracker().at(2);
EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
- EXPECT_EQ(2, interceptor->hit_count());
+ EXPECT_EQ(2, interceptor.GetHitCount());
EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
@@ -284,9 +277,8 @@
// Loop twice again but this case we simulate a server error by returning
// an empty file.
- interceptor->SetResponse(expected_update_url,
- header_ok_reply,
- test_file("updatecheck_reply_empty"));
+ interceptor.SetResponse(expected_update_url,
+ test_file("updatecheck_reply_empty"));
notification_tracker().Reset();
test_configurator()->SetLoopCount(2);
@@ -301,7 +293,7 @@
EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
ev3 = notification_tracker().at(2);
EXPECT_EQ(chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, ev2.type);
- EXPECT_EQ(4, interceptor->hit_count());
+ EXPECT_EQ(4, interceptor.GetHitCount());
EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
@@ -326,30 +318,29 @@
io_thread.StartIOThread();
file_thread.Start();
- scoped_refptr<ComponentUpdateInterceptor>
- interceptor(new ComponentUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
CrxComponent com1;
RegisterComponent(&com1, kTestComponent_jebg, Version("0.9"));
CrxComponent com2;
RegisterComponent(&com2, kTestComponent_abag, Version("2.2"));
- const char expected_update_url_1[] =
+ const GURL expected_update_url_1(
"http://localhost/upd?extra=foo&x=id%3D"
"jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc&x=id%3D"
- "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc";
+ "abagagagagagagagagagagagagagagag%26v%3D2.2%26uc");
- const char expected_update_url_2[] =
+ const GURL expected_update_url_2(
"http://localhost/upd?extra=foo&x=id%3D"
"abagagagagagagagagagagagagagagag%26v%3D2.2%26uc&x=id%3D"
- "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc";
+ "jebgalgnebhfojomionfpkfelancnnkf%26v%3D1.0%26uc");
- interceptor->SetResponse(expected_update_url_1, header_ok_reply,
- test_file("updatecheck_reply_1.xml"));
- interceptor->SetResponse(expected_update_url_2, header_ok_reply,
- test_file("updatecheck_reply_1.xml"));
- interceptor->SetResponse(expected_crx_url, header_ok_reply,
- test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
+ interceptor.SetResponse(expected_update_url_1,
+ test_file("updatecheck_reply_1.xml"));
+ interceptor.SetResponse(expected_update_url_2,
+ test_file("updatecheck_reply_1.xml"));
+ interceptor.SetResponse(GURL(expected_crx_url),
+ test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
test_configurator()->SetLoopCount(2);
@@ -358,7 +349,7 @@
EXPECT_EQ(0, static_cast<TestInstaller*>(com1.installer)->error());
EXPECT_EQ(1, static_cast<TestInstaller*>(com1.installer)->install_count());
- EXPECT_EQ(3, interceptor->hit_count());
+ EXPECT_EQ(3, interceptor.GetHitCount());
ASSERT_EQ(5ul, notification_tracker().size());
@@ -389,27 +380,25 @@
io_thread.StartIOThread();
file_thread.Start();
- scoped_refptr<ComponentUpdateInterceptor>
- interceptor(new ComponentUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
CrxComponent com;
RegisterComponent(&com, kTestComponent_jebg, Version("0.9"));
- const char expected_update_url[] =
+ const GURL expected_update_url(
"http://localhost/upd?extra=foo&x=id%3D"
- "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc";
+ "jebgalgnebhfojomionfpkfelancnnkf%26v%3D0.9%26uc");
- interceptor->SetResponse(expected_update_url,
- header_ok_reply,
- test_file("updatecheck_reply_2.xml"));
- interceptor->SetResponse(expected_crx_url, header_ok_reply,
- test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
+ interceptor.SetResponse(expected_update_url,
+ test_file("updatecheck_reply_2.xml"));
+ interceptor.SetResponse(GURL(expected_crx_url),
+ test_file("jebgalgnebhfojomionfpkfelancnnkf.crx"));
test_configurator()->SetLoopCount(1);
component_updater()->Start();
message_loop.Run();
- EXPECT_EQ(1, interceptor->hit_count());
+ EXPECT_EQ(1, interceptor.GetHitCount());
EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->error());
EXPECT_EQ(0, static_cast<TestInstaller*>(com.installer)->install_count());
diff --git a/chrome/browser/extensions/api/management/management_browsertest.cc b/chrome/browser/extensions/api/management/management_browsertest.cc
index c7a8fa6..e0949d2 100644
--- a/chrome/browser/extensions/api/management/management_browsertest.cc
+++ b/chrome/browser/extensions/api/management/management_browsertest.cc
@@ -6,7 +6,6 @@
#include "base/bind_helpers.h"
#include "base/memory/ref_counted.h"
#include "base/stl_util.h"
-#include "chrome/browser/extensions/autoupdate_interceptor.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -27,6 +26,7 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/test/browser_test_utils.h"
+#include "content/test/net/url_request_prepackaged_interceptor.h"
#include "net/url_request/url_fetcher.h"
using extensions::Extension;
@@ -250,14 +250,14 @@
NotificationListener notification_listener;
FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
// Note: This interceptor gets requests on the IO thread.
- scoped_refptr<extensions::AutoUpdateInterceptor> interceptor(
- new extensions::AutoUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
net::URLFetcher::SetEnableInterceptionForTests(true);
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/manifest",
- basedir.AppendASCII("manifest_v2.xml"));
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/v2.crx",
- basedir.AppendASCII("v2.crx"));
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/manifest"),
+ basedir.AppendASCII("manifest_v2.xml"));
+ interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
+ basedir.AppendASCII("v2.crx"));
// Install version 1 of the extension.
ExtensionTestMessageListener listener1("v1 installed", false);
@@ -298,9 +298,10 @@
// Now try doing an update to version 3, which has been incorrectly
// signed. This should fail.
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/manifest",
- basedir.AppendASCII("manifest_v3.xml"));
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/v3.crx",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/manifest"),
+ basedir.AppendASCII("manifest_v3.xml"));
+ interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v3.crx"),
basedir.AppendASCII("v3.crx"));
service->updater()->CheckNow(params);
@@ -335,13 +336,13 @@
NotificationListener notification_listener;
FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
// Note: This interceptor gets requests on the IO thread.
- scoped_refptr<extensions::AutoUpdateInterceptor> interceptor(
- new extensions::AutoUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
net::URLFetcher::SetEnableInterceptionForTests(true);
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/manifest",
- basedir.AppendASCII("manifest_v2.xml"));
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/v2.crx",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/manifest"),
+ basedir.AppendASCII("manifest_v2.xml"));
+ interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
basedir.AppendASCII("v2.crx"));
// Install version 1 of the extension.
@@ -411,13 +412,13 @@
FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
// Note: This interceptor gets requests on the IO thread.
- scoped_refptr<extensions::AutoUpdateInterceptor> interceptor(
- new extensions::AutoUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
net::URLFetcher::SetEnableInterceptionForTests(true);
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/manifest",
- basedir.AppendASCII("manifest_v2.xml"));
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/v2.crx",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/manifest"),
+ basedir.AppendASCII("manifest_v2.xml"));
+ interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
basedir.AppendASCII("v2.crx"));
const size_t size_before = service->extensions()->size();
@@ -497,13 +498,13 @@
FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
// Note: This interceptor gets requests on the IO thread.
- scoped_refptr<extensions::AutoUpdateInterceptor> interceptor(
- new extensions::AutoUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
net::URLFetcher::SetEnableInterceptionForTests(true);
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/manifest",
- basedir.AppendASCII("manifest_v2.xml"));
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/v2.crx",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/manifest"),
+ basedir.AppendASCII("manifest_v2.xml"));
+ interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
basedir.AppendASCII("v2.crx"));
const size_t size_before = service->extensions()->size();
@@ -572,13 +573,13 @@
ASSERT_TRUE(service->disabled_extensions()->is_empty());
// Note: This interceptor gets requests on the IO thread.
- scoped_refptr<extensions::AutoUpdateInterceptor> interceptor(
- new extensions::AutoUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
net::URLFetcher::SetEnableInterceptionForTests(true);
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/manifest",
- basedir.AppendASCII("manifest_v2.xml"));
- interceptor->SetResponseOnIOThread("http://localhost/autoupdate/v2.crx",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/manifest"),
+ basedir.AppendASCII("manifest_v2.xml"));
+ interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
basedir.AppendASCII("v2.crx"));
// Check that the policy is initially empty.
diff --git a/chrome/browser/extensions/autoupdate_interceptor.cc b/chrome/browser/extensions/autoupdate_interceptor.cc
deleted file mode 100644
index febc9cf..0000000
--- a/chrome/browser/extensions/autoupdate_interceptor.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// 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.
-
-#include "chrome/browser/extensions/autoupdate_interceptor.h"
-
-#include "base/bind.h"
-#include "base/file_util.h"
-#include "base/threading/thread_restrictions.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_job.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using content::BrowserThread;
-
-namespace extensions {
-
-// This is a specialized version of net::URLRequestTestJob that lets us specify
-// response data and make sure the response code is 200, which the autoupdate
-// code relies on.
-class AutoUpdateTestRequestJob : public net::URLRequestTestJob {
- public:
- AutoUpdateTestRequestJob(net::URLRequest* request,
- net::NetworkDelegate* network_delegate,
- const std::string& response_data)
- : net::URLRequestTestJob(request,
- network_delegate,
- net::URLRequestTestJob::test_headers(),
- response_data,
- true) {
- }
-
- virtual int GetResponseCode() const { return 200; }
-
- private:
- ~AutoUpdateTestRequestJob() {}
-};
-
-
-AutoUpdateInterceptor::AutoUpdateInterceptor() {
- net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
-}
-
-AutoUpdateInterceptor::~AutoUpdateInterceptor() {
- net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
-}
-
-net::URLRequestJob* AutoUpdateInterceptor::MaybeIntercept(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
- EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (request->url().scheme() != "http" ||
- request->url().host() != "localhost") {
- return NULL;
- }
-
- // It's ok to do a blocking disk access on this thread; this class
- // is just used for tests.
- base::ThreadRestrictions::ScopedAllowIO allow_io;
-
- // Search for this request's url, ignoring any query parameters.
- GURL url = request->url();
- if (url.has_query()) {
- GURL::Replacements replacements;
- replacements.ClearQuery();
- url = url.ReplaceComponents(replacements);
- }
- std::map<GURL, FilePath>::iterator i = responses_.find(url);
- if (i == responses_.end()) {
- return NULL;
- }
- std::string contents;
- EXPECT_TRUE(file_util::ReadFileToString(i->second, &contents));
-
- return new AutoUpdateTestRequestJob(request, network_delegate, contents);
-}
-
-
-void AutoUpdateInterceptor::SetResponse(const std::string url,
- const FilePath& path) {
- EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
- // It's ok to do a blocking disk access on this thread; this class
- // is just used for tests.
- base::ThreadRestrictions::ScopedAllowIO allow_io;
- GURL gurl(url);
- EXPECT_EQ("http", gurl.scheme());
- EXPECT_EQ("localhost", gurl.host());
- EXPECT_TRUE(file_util::PathExists(path));
- responses_[gurl] = path;
-}
-
-
-void AutoUpdateInterceptor::SetResponseOnIOThread(const std::string url,
- const FilePath& path) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&AutoUpdateInterceptor::SetResponse, this, url, path));
-}
-
-} // namespace extensions
diff --git a/chrome/browser/extensions/autoupdate_interceptor.h b/chrome/browser/extensions/autoupdate_interceptor.h
deleted file mode 100644
index cfc06590..0000000
--- a/chrome/browser/extensions/autoupdate_interceptor.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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 CHROME_BROWSER_EXTENSIONS_AUTOUPDATE_INTERCEPTOR_H_
-#define CHROME_BROWSER_EXTENSIONS_AUTOUPDATE_INTERCEPTOR_H_
-
-#include <map>
-#include <string>
-
-#include "googleurl/src/gurl.h"
-#include "net/url_request/url_request.h"
-
-namespace extensions {
-
-// This url request interceptor lets us respond to localhost http request urls
-// with the contents of files on disk for use in tests.
-class AutoUpdateInterceptor
- : public net::URLRequest::Interceptor,
- public base::RefCountedThreadSafe<AutoUpdateInterceptor> {
- public:
- AutoUpdateInterceptor();
-
- // When computing matches, this ignores query parameters (since the autoupdate
- // fetch code appends a bunch of them to manifest fetches).
- virtual net::URLRequestJob* MaybeIntercept(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) OVERRIDE;
-
- // When requests for |url| arrive, respond with the contents of |path|. The
- // hostname of |url| must be "localhost" to avoid DNS lookups, and the scheme
- // must be "http" so MaybeIntercept can ignore "chrome" and other schemes.
- // Also, the match for |url| will ignore any query parameters.
- void SetResponse(const std::string url, const FilePath& path);
-
- // A helper function to call SetResponse on the I/O thread.
- void SetResponseOnIOThread(const std::string url, const FilePath& path);
-
- private:
- friend class base::RefCountedThreadSafe<AutoUpdateInterceptor>;
-
- virtual ~AutoUpdateInterceptor();
-
- std::map<GURL, FilePath> responses_;
-
- DISALLOW_COPY_AND_ASSIGN(AutoUpdateInterceptor);
-};
-
-} // namespace extensions
-
-#endif // CHROME_BROWSER_EXTENSIONS_AUTOUPDATE_INTERCEPTOR_H_
diff --git a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
index 1f88dd9..5033c65 100644
--- a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
+++ b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
@@ -5,7 +5,6 @@
#include "base/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/extensions/autoupdate_interceptor.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_prefs.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -17,6 +16,7 @@
#include "chrome/browser/ui/global_error/global_error_service_factory.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension.h"
+#include "content/test/net/url_request_prepackaged_interceptor.h"
#include "net/url_request/url_fetcher.h"
using extensions::Extension;
@@ -189,15 +189,14 @@
InstallIncreasingPermissionExtensionV1();
// Note: This interceptor gets requests on the IO thread.
- scoped_refptr<extensions::AutoUpdateInterceptor> interceptor(
- new extensions::AutoUpdateInterceptor());
+ content::URLRequestPrepackagedInterceptor interceptor;
net::URLFetcher::SetEnableInterceptionForTests(true);
- interceptor->SetResponseOnIOThread(
- "http://localhost/autoupdate/updates.xml",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/updates.xml"),
test_data_dir_.AppendASCII("permissions_increase")
.AppendASCII("updates.xml"));
- interceptor->SetResponseOnIOThread(
- "http://localhost/autoupdate/v2.crx",
+ interceptor.SetResponseIgnoreQuery(
+ GURL("http://localhost/autoupdate/v2.crx"),
scoped_temp_dir_.path().AppendASCII("permissions2.crx"));
extensions::ExtensionUpdater::CheckParams params;
diff --git a/chrome/browser/extensions/user_script_listener_unittest.cc b/chrome/browser/extensions/user_script_listener_unittest.cc
index b0fc268..f43e5c0a 100644
--- a/chrome/browser/extensions/user_script_listener_unittest.cc
+++ b/chrome/browser/extensions/user_script_listener_unittest.cc
@@ -17,6 +17,7 @@
#include "content/public/browser/resource_controller.h"
#include "content/public/browser/resource_throttle.h"
#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_filter.h"
#include "net/url_request/url_request_test_job.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -101,17 +102,23 @@
class UserScriptListenerTest
: public ExtensionServiceTestBase,
- public net::URLRequest::Interceptor {
+ public net::URLRequestJobFactory::ProtocolHandler {
public:
UserScriptListenerTest() {
- net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
+ net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
+ "http", "google.com", this);
+ net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
+ "http", "example.com", this);
}
~UserScriptListenerTest() {
- net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
+ net::URLRequestFilter::GetInstance()->RemoveHostnameHandler("http",
+ "google.com");
+ net::URLRequestFilter::GetInstance()->RemoveHostnameHandler("http",
+ "example.com");
}
- virtual void SetUp() {
+ virtual void SetUp() OVERRIDE {
ExtensionServiceTestBase::SetUp();
InitializeEmptyExtensionService();
@@ -121,14 +128,15 @@
listener_ = new UserScriptListener();
}
- virtual void TearDown() {
+ virtual void TearDown() OVERRIDE {
listener_ = NULL;
MessageLoop::current()->RunUntilIdle();
}
- // net::URLRequest::Interceptor
- virtual net::URLRequestJob* MaybeIntercept(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
+ // net::URLRequestJobFactory::ProtocolHandler
+ virtual net::URLRequestJob* MaybeCreateJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) const OVERRIDE {
return new SimpleTestJob(request, network_delegate);
}
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index a352093..c66e5152 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/google/google_util.h"
+#include "chrome/browser/net/connect_interceptor.h"
#include "chrome/browser/net/load_time_stats.h"
#include "chrome/browser/performance_monitor/performance_monitor.h"
#include "chrome/browser/prefs/pref_service.h"
@@ -292,6 +293,12 @@
cookie_settings_ = cookie_settings;
}
+void ChromeNetworkDelegate::set_predictor(
+ chrome_browser_net::Predictor* predictor) {
+ connect_interceptor_.reset(
+ new chrome_browser_net::ConnectInterceptor(predictor));
+}
+
// static
void ChromeNetworkDelegate::NeverThrottleRequests() {
g_never_throttle_requests_ = true;
@@ -394,6 +401,9 @@
if (force_safe_search && rv == net::OK && new_url->is_empty())
ForceGoogleSafeSearch(request, new_url);
+ if (connect_interceptor_)
+ connect_interceptor_->WitnessURLRequest(request);
+
return rv;
}
diff --git a/chrome/browser/net/chrome_network_delegate.h b/chrome/browser/net/chrome_network_delegate.h
index 598e51b9..90e7a75 100644
--- a/chrome/browser/net/chrome_network_delegate.h
+++ b/chrome/browser/net/chrome_network_delegate.h
@@ -25,7 +25,9 @@
}
namespace chrome_browser_net {
+class ConnectInterceptor;
class LoadTimeStats;
+class Predictor;
}
namespace extensions {
@@ -72,6 +74,9 @@
// the header file. Here we just forward-declare it.
void set_cookie_settings(CookieSettings* cookie_settings);
+ // Causes requested URLs to be fed to |predictor| via ConnectInterceptor.
+ void set_predictor(chrome_browser_net::Predictor* predictor);
+
void set_load_time_stats(chrome_browser_net::LoadTimeStats* load_time_stats) {
load_time_stats_ = load_time_stats;
}
@@ -167,6 +172,8 @@
scoped_refptr<ExtensionInfoMap> extension_info_map_;
+ scoped_ptr<chrome_browser_net::ConnectInterceptor> connect_interceptor_;
+
// Weak, owned by our owner.
BooleanPrefMember* enable_referrers_;
BooleanPrefMember* enable_do_not_track_;
diff --git a/chrome/browser/net/connect_interceptor.cc b/chrome/browser/net/connect_interceptor.cc
index c1d6deac..d40bc06 100644
--- a/chrome/browser/net/connect_interceptor.cc
+++ b/chrome/browser/net/connect_interceptor.cc
@@ -27,11 +27,10 @@
ConnectInterceptor::~ConnectInterceptor() {
}
-net::URLRequestJob* ConnectInterceptor::MaybeIntercept(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
+void ConnectInterceptor::WitnessURLRequest(net::URLRequest* request) const {
GURL request_scheme_host(Predictor::CanonicalizeUrl(request->url()));
if (request_scheme_host == GURL::EmptyGURL())
- return NULL;
+ return;
// Learn what URLs are likely to be needed during next startup.
predictor_->LearnAboutInitialNavigation(request_scheme_host);
@@ -74,7 +73,7 @@
// We don't update the RecentlySeen() time because any preconnections
// need to be made at the first navigation (i.e., when referer was loaded)
// and wouldn't have waited for this current request navigation.
- return NULL;
+ return;
}
}
timed_cache_.SetRecentlySeen(request_scheme_host);
@@ -84,19 +83,7 @@
// predictions now for subresources or for redirected hosts.
if ((request->load_flags() & net::LOAD_SUB_FRAME) || redirected_host)
predictor_->PredictFrameSubresources(request_scheme_host);
- return NULL;
-}
-
-net::URLRequestJob* ConnectInterceptor::MaybeInterceptResponse(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) const {
- return NULL;
-}
-
-net::URLRequestJob* ConnectInterceptor::MaybeInterceptRedirect(
- const GURL& location,
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const {
- return NULL;
+ return;
}
ConnectInterceptor::TimedCache::TimedCache(const base::TimeDelta& max_duration)
diff --git a/chrome/browser/net/connect_interceptor.h b/chrome/browser/net/connect_interceptor.h
index afc27af9e..3372ad8 100644
--- a/chrome/browser/net/connect_interceptor.h
+++ b/chrome/browser/net/connect_interceptor.h
@@ -7,8 +7,14 @@
#include "base/containers/mru_cache.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/scoped_ptr.h"
#include "base/time.h"
-#include "net/url_request/url_request_job_factory.h"
+
+class GURL;
+
+namespace net {
+class URLRequest;
+}
namespace chrome_browser_net {
@@ -17,26 +23,15 @@
//------------------------------------------------------------------------------
// An interceptor to monitor URLRequests so that we can do speculative DNS
// resolution and/or speculative TCP preconnections.
-class ConnectInterceptor : public net::URLRequestJobFactory::Interceptor {
+class ConnectInterceptor {
public:
// Construction includes registration as an URL.
explicit ConnectInterceptor(Predictor* predictor);
// Destruction includes unregistering.
virtual ~ConnectInterceptor();
- protected:
- // Overridden from net::URLRequest::Interceptor:
// Learn about referrers, and optionally preconnect based on history.
- virtual net::URLRequestJob* MaybeIntercept(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const OVERRIDE;
- virtual net::URLRequestJob* MaybeInterceptResponse(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const OVERRIDE;
- virtual net::URLRequestJob* MaybeInterceptRedirect(
- const GURL& location,
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) const OVERRIDE;
+ void WitnessURLRequest(net::URLRequest* request) const;
private:
// Provide access to local class TimedCache for testing.
diff --git a/chrome/browser/net/http_intercept_job_factory.cc b/chrome/browser/net/http_intercept_job_factory.cc
deleted file mode 100644
index e3f2e7748..0000000
--- a/chrome/browser/net/http_intercept_job_factory.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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.
-
-#include "chrome/browser/net/http_intercept_job_factory.h"
-
-#include "base/stl_util.h"
-#include "googleurl/src/gurl.h"
-#include "net/base/load_flags.h"
-#include "net/url_request/url_request_job_manager.h"
-
-class GURL;
-
-namespace net {
-
-const char* kHttpScheme = "http";
-const char* kHttpsScheme = "https";
-
-HttpInterceptJobFactory::HttpInterceptJobFactory(
- const URLRequestJobFactory* job_factory,
- ProtocolHandler* protocol_handler)
- : job_factory_(job_factory),
- protocol_handler_(protocol_handler) {
-}
-
-HttpInterceptJobFactory::~HttpInterceptJobFactory() {}
-
-bool HttpInterceptJobFactory::SetProtocolHandler(
- const std::string& scheme, ProtocolHandler* protocol_handler) {
- NOTREACHED();
- return false;
-}
-
-void HttpInterceptJobFactory::AddInterceptor(Interceptor* interceptor) {
- // Interceptor addition is not allowed.
- NOTREACHED();
-}
-
-URLRequestJob* HttpInterceptJobFactory::MaybeCreateJobWithInterceptor(
- URLRequest* request, NetworkDelegate* network_delegate) const {
- return job_factory_->MaybeCreateJobWithInterceptor(request, network_delegate);
-}
-
-URLRequestJob* HttpInterceptJobFactory::MaybeCreateJobWithProtocolHandler(
- const std::string& scheme,
- URLRequest* request,
- NetworkDelegate* network_delegate) const {
- DCHECK(CalledOnValidThread());
- if (scheme == kHttpScheme || scheme == kHttpsScheme)
- return protocol_handler_->MaybeCreateJob(request, network_delegate);
- return job_factory_->MaybeCreateJobWithProtocolHandler(
- scheme, request, network_delegate);
-}
-
-URLRequestJob* HttpInterceptJobFactory::MaybeInterceptRedirect(
- const GURL& location,
- URLRequest* request,
- NetworkDelegate* network_delegate) const {
- return job_factory_->MaybeInterceptRedirect(
- location, request, network_delegate);
-}
-
-URLRequestJob* HttpInterceptJobFactory::MaybeInterceptResponse(
- URLRequest* request, NetworkDelegate* network_delegate) const {
- return job_factory_->MaybeInterceptResponse(request, network_delegate);
-}
-
-bool HttpInterceptJobFactory::IsHandledProtocol(
- const std::string& scheme) const {
- DCHECK(CalledOnValidThread());
- if (scheme == kHttpScheme || scheme == kHttpsScheme)
- return true;
- return job_factory_->IsHandledProtocol(scheme);
-}
-
-bool HttpInterceptJobFactory::IsHandledURL(const GURL& url) const {
- if (url.scheme() == kHttpScheme || url.scheme() == kHttpsScheme)
- return true;
- return job_factory_->IsHandledURL(url);
-}
-
-} // namespace net
diff --git a/chrome/browser/net/http_intercept_job_factory.h b/chrome/browser/net/http_intercept_job_factory.h
deleted file mode 100644
index 7e78d3d..0000000
--- a/chrome/browser/net/http_intercept_job_factory.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// 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 CHROME_BROWSER_NET_HTTP_INTERCEPT_JOB_FACTORY_H_
-#define CHROME_BROWSER_NET_HTTP_INTERCEPT_JOB_FACTORY_H_
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "net/url_request/url_request_job_factory.h"
-
-class GURL;
-
-namespace net {
-
-class URLRequest;
-class URLRequestJob;
-
-// This class acts as a wrapper for URLRequestJobFactory. It handles HTTP and
-// HTTPS jobs using |protocol_handler_|, but forwards all other schemes to the
-// old job factory to be handled there.
-class HttpInterceptJobFactory : public URLRequestJobFactory {
- public:
- HttpInterceptJobFactory(const URLRequestJobFactory* job_factory,
- ProtocolHandler* protocol_handler);
- virtual ~HttpInterceptJobFactory();
-
- // URLRequestJobFactory implementation
- virtual bool SetProtocolHandler(const std::string& scheme,
- ProtocolHandler* protocol_handler) OVERRIDE;
- virtual void AddInterceptor(Interceptor* interceptor) OVERRIDE;
- virtual URLRequestJob* MaybeCreateJobWithInterceptor(
- URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE;
- virtual URLRequestJob* MaybeCreateJobWithProtocolHandler(
- const std::string& scheme,
- URLRequest* request,
- NetworkDelegate* network_delegate) const OVERRIDE;
- virtual URLRequestJob* MaybeInterceptRedirect(
- const GURL& location,
- URLRequest* request,
- NetworkDelegate* network_delegate) const OVERRIDE;
- virtual URLRequestJob* MaybeInterceptResponse(
- URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE;
- virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE;
- virtual bool IsHandledURL(const GURL& url) const OVERRIDE;
-
- private:
- const URLRequestJobFactory* job_factory_;
- ProtocolHandler* protocol_handler_;
-
- DISALLOW_COPY_AND_ASSIGN(HttpInterceptJobFactory);
-};
-
-} // namespace net
-
-#endif // CHROME_BROWSER_NET_HTTP_INTERCEPT_JOB_FACTORY_H_
diff --git a/chrome/browser/policy/device_management_service_browsertest.cc b/chrome/browser/policy/device_management_service_browsertest.cc
index 4e6a032..69b29f06 100644
--- a/chrome/browser/policy/device_management_service_browsertest.cc
+++ b/chrome/browser/policy/device_management_service_browsertest.cc
@@ -8,15 +8,19 @@
#include "chrome/browser/policy/cloud_policy_constants.h"
#include "chrome/browser/policy/device_management_service.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/browser/browser_thread.h"
#include "net/base/upload_bytes_element_reader.h"
#include "net/base/upload_data_stream.h"
#include "net/test/test_server.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_filter.h"
+#include "net/url_request/url_request_job_factory.h"
#include "net/url_request/url_request_test_job.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+using content::BrowserThread;
using testing::DoAll;
using testing::Invoke;
using testing::InvokeWithoutArgs;
@@ -29,68 +33,89 @@
// Dummy service URL for testing with request interception enabled.
const char kServiceUrl[] = "http://example.com/device_management";
-// Interceptor implementation that returns test data back to the service.
-class CannedResponseInterceptor : public net::URLRequest::Interceptor {
+// During construction and destruction of CannedResponseInterceptor tasks are
+// posted to the IO thread to add and remove an interceptor for URLRequest's of
+// |service_url|. The interceptor returns test data back to the service.
+class CannedResponseInterceptor {
public:
explicit CannedResponseInterceptor(const GURL& service_url)
- : service_url_(service_url) {
- net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
+ : delegate_(new Delegate(service_url)) {
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&Delegate::Register,
+ base::Unretained(delegate_)));
}
virtual ~CannedResponseInterceptor() {
- net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
- }
-
- // net::URLRequest::Interceptor overrides.
- virtual net::URLRequestJob* MaybeIntercept(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate) OVERRIDE {
- em::DeviceManagementRequest dm_request;
- const net::UploadDataStream* upload = request->get_upload();
- if (request->url().GetOrigin() == service_url_.GetOrigin() &&
- request->url().path() == service_url_.path() &&
- upload != NULL &&
- upload->element_readers().size() == 1 &&
- upload->element_readers()[0]->AsBytesReader()) {
- std::string response_data;
- const net::UploadBytesElementReader* bytes_reader =
- upload->element_readers()[0]->AsBytesReader();
- ConstructResponse(bytes_reader->bytes(),
- bytes_reader->length(),
- &response_data);
- return new net::URLRequestTestJob(request,
- network_delegate,
- net::URLRequestTestJob::test_headers(),
- response_data,
- true);
- }
-
- return NULL;
+ BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, delegate_);
}
private:
- void ConstructResponse(const char* request_data,
- uint64 request_data_length,
- std::string* response_data) {
- em::DeviceManagementRequest request;
- ASSERT_TRUE(request.ParseFromArray(request_data, request_data_length));
- em::DeviceManagementResponse response;
- if (request.has_register_request()) {
- response.mutable_register_response()->set_device_management_token(
- "fake_token");
- } else if (request.has_unregister_request()) {
- response.mutable_unregister_response();
- } else if (request.has_policy_request()) {
- response.mutable_policy_response()->add_response();
- } else if (request.has_auto_enrollment_request()) {
- response.mutable_auto_enrollment_response();
- } else {
- FAIL() << "Failed to parse request.";
+ class Delegate : public net::URLRequestJobFactory::ProtocolHandler {
+ public:
+ explicit Delegate(const GURL& service_url) : service_url_(service_url) {}
+ ~Delegate() {
+ net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(
+ "http", "example.com");
}
- ASSERT_TRUE(response.SerializeToString(response_data));
- }
- const GURL service_url_;
+ void Register() {
+ net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
+ "http", "example.com", this);
+ }
+
+ // net::URLRequestJobFactory::ProtocolHandler overrides.
+ virtual net::URLRequestJob* MaybeCreateJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) const OVERRIDE {
+ const net::UploadDataStream* upload = request->get_upload();
+ if (request->url().GetOrigin() == service_url_.GetOrigin() &&
+ request->url().path() == service_url_.path() &&
+ upload != NULL &&
+ upload->element_readers().size() == 1 &&
+ upload->element_readers()[0]->AsBytesReader()) {
+ std::string response_data;
+ const net::UploadBytesElementReader* bytes_reader =
+ upload->element_readers()[0]->AsBytesReader();
+ ConstructResponse(bytes_reader->bytes(),
+ bytes_reader->length(),
+ &response_data);
+ return new net::URLRequestTestJob(
+ request,
+ network_delegate,
+ net::URLRequestTestJob::test_headers(),
+ response_data,
+ true);
+ }
+
+ return NULL;
+ }
+
+ private:
+ void ConstructResponse(const char* request_data,
+ uint64 request_data_length,
+ std::string* response_data) const {
+ em::DeviceManagementRequest request;
+ ASSERT_TRUE(request.ParseFromArray(request_data, request_data_length));
+ em::DeviceManagementResponse response;
+ if (request.has_register_request()) {
+ response.mutable_register_response()->set_device_management_token(
+ "fake_token");
+ } else if (request.has_unregister_request()) {
+ response.mutable_unregister_response();
+ } else if (request.has_policy_request()) {
+ response.mutable_policy_response()->add_response();
+ } else if (request.has_auto_enrollment_request()) {
+ response.mutable_auto_enrollment_response();
+ } else {
+ FAIL() << "Failed to parse request.";
+ }
+ ASSERT_TRUE(response.SerializeToString(response_data));
+ }
+
+ const GURL service_url_;
+ };
+
+ Delegate* delegate_;
};
class DeviceManagementServiceIntegrationTest
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 8632a2d2..abc0207 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -148,8 +148,18 @@
for (size_t i = 0; i < size; ++i) {
const GURL url(urls[i]);
EXPECT_TRUE(url.is_valid());
- filter->AddHostnameHandler(url.scheme(), url.host(),
- URLRequestMockHTTPJob::Factory);
+ filter->AddUrlHandler(url, URLRequestMockHTTPJob::Factory);
+ }
+}
+
+// Remove filters for requests to the hosts in |urls|.
+void UndoRedirectHostsToTestData(const char* const urls[], size_t size) {
+ // Map the given hosts to the test data dir.
+ net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
+ for (size_t i = 0; i < size; ++i) {
+ const GURL url(urls[i]);
+ EXPECT_TRUE(url.is_valid());
+ filter->RemoveUrlHandler(url);
}
}
@@ -162,21 +172,42 @@
request, network_delegate, net::ERR_CONNECTION_RESET);
}
-// Filters requests to the |host| such that they fail. Run on IO thread.
-void MakeRequestFailOnIO(const std::string& host) {
- net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
- filter->AddHostnameHandler("http", host, &FailedJobFactory);
- filter->AddHostnameHandler("https", host, &FailedJobFactory);
-}
+// While |MakeRequestFail| is in scope URLRequests to |host| will fail.
+class MakeRequestFail {
+ public:
+ // Sets up the filter on IO thread such that requests to |host| fail.
+ explicit MakeRequestFail(const std::string& host) : host_(host) {
+ BrowserThread::PostTaskAndReply(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(MakeRequestFailOnIO, host_),
+ MessageLoop::QuitClosure());
+ content::RunMessageLoop();
+ }
+ ~MakeRequestFail() {
+ BrowserThread::PostTaskAndReply(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(UndoMakeRequestFailOnIO, host_),
+ MessageLoop::QuitClosure());
+ content::RunMessageLoop();
+ }
-// Sets up the filter on IO thread such that requests to |host| fail.
-void MakeRequestFail(const std::string& host) {
- BrowserThread::PostTaskAndReply(
- BrowserThread::IO, FROM_HERE,
- base::Bind(MakeRequestFailOnIO, host),
- MessageLoop::QuitClosure());
- content::RunMessageLoop();
-}
+ private:
+ // Filters requests to the |host| such that they fail. Run on IO thread.
+ static void MakeRequestFailOnIO(const std::string& host) {
+ net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
+ filter->AddHostnameHandler("http", host, &FailedJobFactory);
+ filter->AddHostnameHandler("https", host, &FailedJobFactory);
+ }
+
+ // Remove filters for requests to the |host|. Run on IO thread.
+ static void UndoMakeRequestFailOnIO(const std::string& host) {
+ net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
+ filter->RemoveHostnameHandler("http", host);
+ filter->RemoveHostnameHandler("https", host);
+ }
+
+ const std::string host_;
+};
// Verifies that the given url |spec| can be opened. This assumes that |spec|
// points at empty.html in the test data dir.
@@ -615,7 +646,7 @@
}
IN_PROC_BROWSER_TEST_F(PolicyTest, DefaultSearchProvider) {
- MakeRequestFail("search.example");
+ MakeRequestFail make_request_fail("search.example");
// Verifies that a default search is made using the provider configured via
// policy. Also checks that default search can be completely disabled.
@@ -685,7 +716,7 @@
IN_PROC_BROWSER_TEST_F(PolicyTest, ForceSafeSearch) {
// Makes the requests fail since all we want to check is that the redirection
// is done properly.
- MakeRequestFail("google.com");
+ MakeRequestFail make_request_fail("google.com");
// Verifies that requests to Google Search engine with the SafeSearch
// enabled set the safe=active&ssui=on parameters at the end of the query.
@@ -738,7 +769,7 @@
}
IN_PROC_BROWSER_TEST_F(PolicyTest, ReplaceSearchTerms) {
- MakeRequestFail("search.example");
+ MakeRequestFail make_request_fail("search.example");
chrome::search::EnableInstantExtendedAPIForTesting();
@@ -1416,6 +1447,12 @@
CheckURLIsBlocked(browser(), kURLS[1]);
CheckCanOpenURL(browser(), kURLS[2]);
CheckCanOpenURL(browser(), kURLS[3]);
+
+ BrowserThread::PostTaskAndReply(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(UndoRedirectHostsToTestData, kURLS, arraysize(kURLS)),
+ MessageLoop::QuitClosure());
+ content::RunMessageLoop();
}
// Flaky on Linux. http://crbug.com/155459
diff --git a/chrome/browser/printing/print_dialog_cloud_interative_uitest.cc b/chrome/browser/printing/print_dialog_cloud_interative_uitest.cc
index 4f67ada0..071c9b8 100644
--- a/chrome/browser/printing/print_dialog_cloud_interative_uitest.cc
+++ b/chrome/browser/printing/print_dialog_cloud_interative_uitest.cc
@@ -166,15 +166,16 @@
}
};
- virtual void SetUp() {
+ virtual void SetUp() OVERRIDE {
TestController::GetInstance()->set_result(false);
InProcessBrowserTest::SetUp();
}
- virtual void TearDown() {
+ virtual void TearDown() OVERRIDE {
if (handler_added_) {
- net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
- filter->RemoveHostnameHandler(scheme_, host_name_);
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(UnregisterTestHandlers, scheme_, host_name_));
handler_added_ = false;
TestController::GetInstance()->set_delegate(NULL);
}
@@ -187,14 +188,14 @@
// individual test functions seems to fix that.
void AddTestHandlers() {
if (!handler_added_) {
- net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
GURL cloud_print_service_url =
CloudPrintURL(browser()->profile()).
GetCloudPrintServiceURL();
scheme_ = cloud_print_service_url.scheme();
host_name_ = cloud_print_service_url.host();
- filter->AddHostnameHandler(scheme_, host_name_,
- &PrintDialogCloudTest::Factory);
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(RegisterTestHandlers, scheme_, host_name_));
handler_added_ = true;
GURL cloud_print_dialog_url =
@@ -218,6 +219,18 @@
std::string("application/pdf"), false));
}
+ private:
+ static void RegisterTestHandlers(const std::string& scheme,
+ const std::string& host_name) {
+ net::URLRequestFilter::GetInstance()->AddHostnameHandler(
+ scheme, host_name, &PrintDialogCloudTest::Factory);
+ }
+ static void UnregisterTestHandlers(const std::string& scheme,
+ const std::string& host_name) {
+ net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(scheme,
+ host_name);
+ }
+
bool handler_added_;
std::string scheme_;
std::string host_name_;
diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.cc b/chrome/browser/profiles/off_the_record_profile_io_data.cc
index dfc9b81d..37a3f73 100644
--- a/chrome/browser/profiles/off_the_record_profile_io_data.cc
+++ b/chrome/browser/profiles/off_the_record_profile_io_data.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/io_thread.h"
#include "chrome/browser/net/about_protocol_handler.h"
#include "chrome/browser/net/chrome_net_log.h"
+#include "chrome/browser/net/chrome_network_delegate.h"
#include "chrome/browser/net/chrome_url_request_context.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index e927363..861e3f6 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
#include "chrome/browser/io_thread.h"
#include "chrome/browser/net/chrome_net_log.h"
+#include "chrome/browser/net/chrome_network_delegate.h"
#include "chrome/browser/net/clear_on_exit_policy.h"
#include "chrome/browser/net/connect_interceptor.h"
#include "chrome/browser/net/http_server_properties_manager.h"
@@ -313,6 +314,8 @@
command_line.HasSwitch(switches::kVisitURLs));
bool playback_mode = command_line.HasSwitch(switches::kPlaybackMode);
+ network_delegate()->set_predictor(predictor_.get());
+
// Initialize context members.
ApplyProfileParamsToContext(main_context);
@@ -419,11 +422,11 @@
scoped_ptr<net::URLRequestJobFactoryImpl> main_job_factory(
new net::URLRequestJobFactoryImpl());
- SetUpJobFactory(main_job_factory.get(),
- profile_params->protocol_handler_interceptor.Pass(),
- network_delegate(),
- main_context->ftp_transaction_factory(),
- main_context->ftp_auth_cache());
+ SetUpJobFactoryDefaults(main_job_factory.get(),
+ profile_params->protocol_handler_interceptor.Pass(),
+ network_delegate(),
+ main_context->ftp_transaction_factory(),
+ main_context->ftp_auth_cache());
main_job_factory_ = main_job_factory.Pass();
main_context->set_job_factory(main_job_factory_.get());
@@ -478,11 +481,12 @@
// job_factory::IsHandledProtocol return true, which prevents attempts to
// handle the protocol externally. We pass NULL in to
// SetUpJobFactory() to get this effect.
- SetUpJobFactory(extensions_job_factory.get(),
- scoped_ptr<net::URLRequestJobFactoryImpl::Interceptor>(NULL),
- NULL,
- extensions_context->ftp_transaction_factory(),
- extensions_context->ftp_auth_cache());
+ SetUpJobFactoryDefaults(
+ extensions_job_factory.get(),
+ scoped_ptr<net::URLRequestJobFactoryImpl::Interceptor>(NULL),
+ NULL,
+ extensions_context->ftp_transaction_factory(),
+ extensions_context->ftp_auth_cache());
extensions_job_factory_ = extensions_job_factory.Pass();
extensions_context->set_job_factory(extensions_job_factory_.get());
}
@@ -556,16 +560,17 @@
scoped_ptr<net::HttpTransactionFactory>(app_http_cache));
// Overwrite the job factory that we inherit from the main context so
- // that we can later provide our own handles for storage related protocols.
+ // that we can later provide our own handlers for storage related protocols.
// Install all the usual protocol handlers unless we are in a browser plugin
// guest process, in which case only web-safe schemes are allowed.
scoped_ptr<net::URLRequestJobFactoryImpl> job_factory(
new net::URLRequestJobFactoryImpl());
if (!partition_descriptor.in_memory) {
- SetUpJobFactory(job_factory.get(), protocol_handler_interceptor.Pass(),
- network_delegate(),
- context->ftp_transaction_factory(),
- context->ftp_auth_cache());
+ SetUpJobFactoryDefaults(
+ job_factory.get(), protocol_handler_interceptor.Pass(),
+ network_delegate(),
+ context->ftp_transaction_factory(),
+ context->ftp_auth_cache());
}
context->SetJobFactory(job_factory.PassAs<net::URLRequestJobFactory>());
@@ -656,21 +661,6 @@
return io_thread_globals->load_time_stats.get();
}
-void ProfileImplIOData::SetUpJobFactory(
- net::URLRequestJobFactoryImpl* job_factory,
- scoped_ptr<net::URLRequestJobFactory::Interceptor>
- protocol_handler_interceptor,
- net::NetworkDelegate* network_delegate,
- net::FtpTransactionFactory* ftp_transaction_factory,
- net::FtpAuthCache* ftp_auth_cache) const {
- SetUpJobFactoryDefaults(job_factory, protocol_handler_interceptor.Pass(),
- network_delegate, ftp_transaction_factory,
- ftp_auth_cache);
-
- job_factory->AddInterceptor(
- new chrome_browser_net::ConnectInterceptor(predictor_.get()));
-}
-
void ProfileImplIOData::ClearNetworkingHistorySinceOnIOThread(
base::Time time,
const base::Closure& completion) {
diff --git a/chrome/browser/profiles/profile_impl_io_data.h b/chrome/browser/profiles/profile_impl_io_data.h
index 04b66b2d..0f79bd0 100644
--- a/chrome/browser/profiles/profile_impl_io_data.h
+++ b/chrome/browser/profiles/profile_impl_io_data.h
@@ -172,13 +172,6 @@
virtual chrome_browser_net::LoadTimeStats* GetLoadTimeStats(
IOThread::Globals* io_thread_globals) const OVERRIDE;
- void SetUpJobFactory(net::URLRequestJobFactoryImpl* job_factory,
- scoped_ptr<net::URLRequestJobFactory::Interceptor>
- protocol_handler_interceptor,
- net::NetworkDelegate* network_delegate,
- net::FtpTransactionFactory* ftp_transaction_factory,
- net::FtpAuthCache* ftp_auth_cache) const;
-
// Deletes all network related data since |time|. It deletes transport
// security state since |time| and also deletes HttpServerProperties data.
// Works asynchronously, however if the |completion| callback is non-null,
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h
index ef91f6a..948e016 100644
--- a/chrome/browser/profiles/profile_io_data.h
+++ b/chrome/browser/profiles/profile_io_data.h
@@ -24,6 +24,7 @@
#include "net/url_request/url_request_job_factory.h"
class ChromeHttpUserAgentSettings;
+class ChromeNetworkDelegate;
class CookieSettings;
class DesktopNotificationService;
class ExtensionInfoMap;
@@ -269,7 +270,7 @@
void set_server_bound_cert_service(
net::ServerBoundCertService* server_bound_cert_service) const;
- net::NetworkDelegate* network_delegate() const {
+ ChromeNetworkDelegate* network_delegate() const {
return network_delegate_.get();
}
@@ -433,7 +434,7 @@
mutable scoped_ptr<ChromeURLDataManagerBackend>
chrome_url_data_manager_backend_;
mutable scoped_ptr<net::ServerBoundCertService> server_bound_cert_service_;
- mutable scoped_ptr<net::NetworkDelegate> network_delegate_;
+ mutable scoped_ptr<ChromeNetworkDelegate> network_delegate_;
mutable scoped_ptr<net::FraudulentCertificateReporter>
fraudulent_certificate_reporter_;
mutable scoped_ptr<net::ProxyService> proxy_service_;