summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/browser_process_impl.cc4
-rw-r--r--chrome/browser/extensions/extension_host.cc15
-rw-r--r--chrome/browser/extensions/extension_host.h3
-rw-r--r--chrome/browser/extensions/extension_prefs.cc21
-rw-r--r--chrome/browser/extensions/extension_prefs.h9
-rw-r--r--chrome/browser/extensions/extension_service.cc6
-rw-r--r--chrome/browser/extensions/network_delay_listener.cc165
-rw-r--r--chrome/browser/extensions/network_delay_listener.h105
-rw-r--r--chrome/browser/extensions/network_delay_listener_unittest.cc279
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/extensions/extension.cc6
-rw-r--r--chrome/common/extensions/extension.h5
-rw-r--r--net/url_request/url_request.h2
14 files changed, 1 insertions, 622 deletions
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 3854864..f1cb8e4 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -29,7 +29,6 @@
#include "chrome/browser/download/download_status_updater.h"
#include "chrome/browser/extensions/extension_event_router_forwarder.h"
#include "chrome/browser/extensions/extension_tab_id_map.h"
-#include "chrome/browser/extensions/network_delay_listener.h"
#include "chrome/browser/extensions/user_script_listener.h"
#include "chrome/browser/first_run/upgrade_util.h"
#include "chrome/browser/google/google_url_tracker.h"
@@ -644,10 +643,9 @@ AudioManager* BrowserProcessImpl::audio_manager() {
}
void BrowserProcessImpl::ResourceDispatcherHostCreated() {
- // UserScriptListener and NetworkDelayListener will delete themselves.
+ // UserScriptListener will delete itself.
ResourceDispatcherHost* rdh = ResourceDispatcherHost::Get();
rdh->AddResourceQueueDelegate(new UserScriptListener());
- rdh->AddResourceQueueDelegate(new NetworkDelayListener());
resource_dispatcher_host_delegate_.reset(
new ChromeResourceDispatcherHostDelegate(rdh, prerender_tracker()));
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 1f0bc4f..3eae9ca 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -148,21 +148,6 @@ ExtensionHost::ExtensionHost(const Extension* extension,
content::Source<Profile>(profile_));
}
-// This "mock" constructor should only be used by unit tests.
-ExtensionHost::ExtensionHost(const Extension* extension,
- content::ViewType host_type)
- : extension_(extension),
- extension_id_(extension->id()),
- profile_(NULL),
- did_stop_loading_(false),
- document_element_available_(false),
- initial_url_(GURL()),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- extension_function_dispatcher_(profile_, this)),
- extension_host_type_(host_type),
- associated_web_contents_(NULL) {
-}
-
ExtensionHost::~ExtensionHost() {
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index 82a1094..044e15d 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -168,9 +168,6 @@ class ExtensionHost : public content::WebContentsDelegate,
const content::NotificationDetails& details) OVERRIDE;
protected:
- // This should only be used by unit tests.
- ExtensionHost(const Extension* extension, content::ViewType host_type);
-
private:
friend class ProcessCreationQueue;
diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc
index 63cbbec..890ba99 100644
--- a/chrome/browser/extensions/extension_prefs.cc
+++ b/chrome/browser/extensions/extension_prefs.cc
@@ -93,12 +93,6 @@ const char kPrefAllowFileAccess[] = "newAllowFileAccess";
// the old flag and possibly go back to that name.
// const char kPrefAllowFileAccessOld[] = "allowFileAccess";
-// A preference indicating that the extension wants to delay network requests
-// on browser launch until it indicates it's ready. For example, an extension
-// using the webRequest API might want to ensure that no requests are sent
-// before it has registered its event handlers.
-const char kPrefDelayNetworkRequests[] = "delayNetworkRequests";
-
// A preference set by the web store to indicate login information for
// purchased apps.
const char kWebStoreLogin[] = "extensions.webstore_login";
@@ -953,21 +947,6 @@ bool ExtensionPrefs::HasAllowFileAccessSetting(
return ext && ext->HasKey(kPrefAllowFileAccess);
}
-void ExtensionPrefs::SetDelaysNetworkRequests(const std::string& extension_id,
- bool does_delay) {
- if (does_delay) {
- UpdateExtensionPref(extension_id, kPrefDelayNetworkRequests,
- Value::CreateBooleanValue(true));
- } else {
- // Remove the pref.
- UpdateExtensionPref(extension_id, kPrefDelayNetworkRequests, NULL);
- }
-}
-
-bool ExtensionPrefs::DelaysNetworkRequests(const std::string& extension_id) {
- return ReadExtensionPrefBoolean(extension_id, kPrefDelayNetworkRequests);
-}
-
ExtensionPrefs::LaunchType ExtensionPrefs::GetLaunchType(
const std::string& extension_id,
ExtensionPrefs::LaunchType default_pref_value) {
diff --git a/chrome/browser/extensions/extension_prefs.h b/chrome/browser/extensions/extension_prefs.h
index f5bb0834..19b7938 100644
--- a/chrome/browser/extensions/extension_prefs.h
+++ b/chrome/browser/extensions/extension_prefs.h
@@ -252,15 +252,6 @@ class ExtensionPrefs : public ExtensionContentSettingsStore::Observer,
void SetAllowFileAccess(const std::string& extension_id, bool allow);
bool HasAllowFileAccessSetting(const std::string& extension_id) const;
- // Sets the extension preference indicating that an extension wants to delay
- // network requests on browser startup.
- void SetDelaysNetworkRequests(const std::string& extension_id,
- bool does_delay);
-
- // Returns true if an extension has registered to delay network requests on
- // browser startup.
- bool DelaysNetworkRequests(const std::string& extension_id);
-
// Get the launch type preference. If no preference is set, return
// |default_pref_value|.
LaunchType GetLaunchType(const std::string& extension_id,
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 3b0902c..3bc6a49 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -2259,12 +2259,6 @@ void ExtensionService::OnExtensionInstalled(
extension_prefs_->SetAllowFileAccess(id, true);
}
- // If the extension should automatically block network startup (e.g., it uses
- // the webRequest API), set the preference. Otherwise clear it, in case the
- // extension stopped using a relevant API.
- extension_prefs_->SetDelaysNetworkRequests(
- extension->id(), extension->ImplicitlyDelaysNetworkStartup());
-
// Transfer ownership of |extension| to AddExtension.
if (AddExtension(scoped_extension)) {
content::NotificationService::current()->Notify(
diff --git a/chrome/browser/extensions/network_delay_listener.cc b/chrome/browser/extensions/network_delay_listener.cc
deleted file mode 100644
index 6659c4f..0000000
--- a/chrome/browser/extensions/network_delay_listener.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (c) 2012 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/network_delay_listener.h"
-
-#include "base/bind.h"
-#include "base/metrics/histogram.h"
-#include "chrome/browser/extensions/extension_host.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "chrome/common/chrome_view_type.h"
-#include "chrome/common/extensions/extension.h"
-#include "chrome/common/url_constants.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_service.h"
-#include "net/url_request/url_request.h"
-
-using content::BrowserThread;
-using content::GlobalRequestID;
-
-NetworkDelayListener::NetworkDelayListener()
- : resource_queue_(NULL),
- extensions_ready_(true),
- recorded_startup_delay_(false) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
- content::NotificationService::AllSources());
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
- content::NotificationService::AllSources());
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DOM_CONTENT_LOADED,
- content::NotificationService::AllSources());
- AddRef(); // Will be balanced in WillShutdownResourceQueue().
-}
-
-void NetworkDelayListener::Initialize(ResourceQueue* resource_queue) {
- resource_queue_ = resource_queue;
-}
-
-bool NetworkDelayListener::ShouldDelayRequest(
- net::URLRequest* request,
- const ResourceDispatcherHostRequestInfo& request_info,
- const GlobalRequestID& request_id) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- // Don't block internal URLs.
- if (request->url().SchemeIs(chrome::kChromeUIScheme) ||
- request->url().SchemeIs(chrome::kExtensionScheme) ||
- request->url().SchemeIs(chrome::kChromeDevToolsScheme)) {
- return false;
- }
-
- return !extensions_ready_;
-}
-
-NetworkDelayListener::~NetworkDelayListener() {
-}
-
-void NetworkDelayListener::WillShutdownResourceQueue() {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- resource_queue_ = NULL;
- Release();
-}
-
-void NetworkDelayListener::OnExtensionPending(const std::string& id) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- DCHECK(pending_extensions_.count(id) == 0);
- extensions_ready_ = false;
- pending_extensions_.insert(id);
- delay_start_times_[id] = base::TimeTicks::Now();
-}
-
-void NetworkDelayListener::OnExtensionReady(const std::string& id) {
- // This may be called multiple times, if an extension finishes loading and is
- // then disabled or uninstalled.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- // Quick escape to save work in the common case.
- if (pending_extensions_.count(id) == 0)
- return;
-
- UMA_HISTOGRAM_TIMES("Extensions.StartupDelay",
- base::TimeTicks::Now() - delay_start_times_[id]);
- delay_start_times_.erase(id);
- pending_extensions_.erase(id);
-
- StartDelayedRequestsIfReady();
-}
-
-void NetworkDelayListener::StartDelayedRequestsIfReady() {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- if (pending_extensions_.empty()) {
- extensions_ready_ = true;
- if (!recorded_startup_delay_) {
- UMA_HISTOGRAM_TIMES("Extensions.StartupDelay_Total",
- overall_start_time_.Elapsed());
- recorded_startup_delay_ = true;
- }
- if (resource_queue_)
- resource_queue_->StartDelayedRequests(this);
- }
-}
-
-void NetworkDelayListener::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- switch (type) {
- case chrome::NOTIFICATION_EXTENSION_LOADED: {
- const Extension* extension =
- content::Details<const Extension>(details).ptr();
- ExtensionService* service =
- content::Source<Profile>(source).ptr()->GetExtensionService();
- // We only wait for background pages to load. If the extension has no
- // background page, ignore it.
- if (service->extension_prefs()->DelaysNetworkRequests(extension->id()) &&
- extension->has_background_page()) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&NetworkDelayListener::OnExtensionPending,
- this, extension->id()));
- }
- break;
- }
- case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
- const Extension* extension =
- content::Details<UnloadedExtensionInfo>(details)->extension;
- ExtensionService* service =
- content::Source<Profile>(source).ptr()->GetExtensionService();
- if (service->extension_prefs()->DelaysNetworkRequests(extension->id())) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&NetworkDelayListener::OnExtensionReady,
- this, extension->id()));
- }
- break;
- }
- case chrome::NOTIFICATION_EXTENSION_HOST_DOM_CONTENT_LOADED: {
- const ExtensionHost* eh = content::Details<ExtensionHost>(details).ptr();
- if (eh->extension_host_type() !=
- chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE)
- return;
-
- const Extension* extension = eh->extension();
- ExtensionService* service =
- content::Source<Profile>(source).ptr()->GetExtensionService();
- if (service->extension_prefs()->DelaysNetworkRequests(extension->id())) {
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&NetworkDelayListener::OnExtensionReady,
- this, extension->id()));
- }
- break;
- }
-
- default:
- NOTREACHED();
- }
-}
diff --git a/chrome/browser/extensions/network_delay_listener.h b/chrome/browser/extensions/network_delay_listener.h
deleted file mode 100644
index 5834b79..0000000
--- a/chrome/browser/extensions/network_delay_listener.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2012 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_NETWORK_DELAY_LISTENER_H_
-#define CHROME_BROWSER_EXTENSIONS_NETWORK_DELAY_LISTENER_H_
-#pragma once
-
-#include <map>
-#include <set>
-
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "base/perftimer.h"
-#include "base/time.h"
-#include "content/browser/renderer_host/resource_queue.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-
-// This class handles delaying of resource loads that depend on unloaded
-// extensions. For each request that comes in, we check if all extensions are
-// ready for it to be loaded; if not, we delay the request.
-//
-// This class lives mostly on the IO thread. It listens on the UI thread for
-// updates to loaded extensions. It will delete itself on the UI thread after
-// WillShutdownResourceQueue is called (on the IO thread).
-class NetworkDelayListener
- : public base::RefCountedThreadSafe<
- NetworkDelayListener,
- content::BrowserThread::DeleteOnUIThread>,
- public ResourceQueueDelegate,
- public content::NotificationObserver {
- public:
- NetworkDelayListener();
-
- private:
- // ResourceQueueDelegate:
- virtual void Initialize(ResourceQueue* resource_queue) OVERRIDE;
- virtual bool ShouldDelayRequest(
- net::URLRequest* request,
- const ResourceDispatcherHostRequestInfo& request_info,
- const content::GlobalRequestID& request_id) OVERRIDE;
- virtual void WillShutdownResourceQueue() OVERRIDE;
-
- friend struct content::BrowserThread::DeleteOnThread<
- content::BrowserThread::UI>;
- friend class base::DeleteHelper<NetworkDelayListener>;
-
- virtual ~NetworkDelayListener();
-
- // Called when an extension that wants to delay network requests is loading.
- void OnExtensionPending(const std::string& id);
-
- // Called when an extension that wants to delay network requests is ready.
- void OnExtensionReady(const std::string& id);
-
- // If there are no more extensions pending, tell the network queue to resume
- // processing requests.
- void StartDelayedRequestsIfReady();
-
- ResourceQueue* resource_queue_;
-
- // TODO(mpcomplete, pamg): the rest of this stuff should really be
- // per-profile, but the complexity doesn't seem worth it at this point.
-
- // True if the extensions are ready for network requests to proceed. In
- // practice this means that the background pages of any pending extensions
- // have been run.
- // This flag starts out true, until the first extension that is registered to
- // delay network requests starts loading. That's safe because the profile
- // must be created, and thus extensions loaded, before a browser session is
- // restored. It's also necessary, because Chrome Frame doesn't support
- // extensions, and therefore doesn't send any notification that they're all
- // done loading.
- bool extensions_ready_;
-
- // Which extension IDs have registered to delay network requests on startup,
- // but are not yet ready for them to resume.
- std::set<std::string> pending_extensions_;
-
- // Used to measure how long each extension has taken to become ready.
- std::map<std::string, base::TimeTicks> delay_start_times_;
-
- // Used to measure total time between the first delay request and resuming
- // network requests.
- PerfTimer overall_start_time_;
-
- // Whether we've already calculated total startup time, so we don't corrupt
- // the data with entries from installing or enabling single extensions.
- bool recorded_startup_delay_;
-
- // --- UI thread:
-
- // content::NotificationObserver
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE;
-
- content::NotificationRegistrar registrar_;
-
- DISALLOW_COPY_AND_ASSIGN(NetworkDelayListener);
-};
-
-#endif // CHROME_BROWSER_EXTENSIONS_NETWORK_DELAY_LISTENER_H_
diff --git a/chrome/browser/extensions/network_delay_listener_unittest.cc b/chrome/browser/extensions/network_delay_listener_unittest.cc
deleted file mode 100644
index cafa665..0000000
--- a/chrome/browser/extensions/network_delay_listener_unittest.cc
+++ /dev/null
@@ -1,279 +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 "base/message_loop.h"
-#include "chrome/browser/extensions/extension_host.h"
-#include "chrome/browser/extensions/extension_service_unittest.h"
-#include "chrome/browser/extensions/unpacked_installer.h"
-#include "chrome/browser/extensions/network_delay_listener.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/common/chrome_view_type.h"
-#include "chrome/common/extensions/extension_file_util.h"
-#include "chrome/test/base/testing_profile.h"
-#include "content/browser/mock_resource_context.h"
-#include "content/browser/renderer_host/dummy_resource_handler.h"
-#include "content/browser/renderer_host/resource_dispatcher_host_request_info.h"
-#include "content/browser/renderer_host/resource_queue.h"
-#include "content/public/browser/notification_service.h"
-#include "net/url_request/url_request.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"
-
-using content::DummyResourceHandler;
-
-namespace {
-
-const char kTestUrl[] = "http://www.google.com/";
-const char kTestData[] = "Hello, World!";
-const char kTestExtensionId1[] = "jfjjgilipffmpphcikcmjdaoomecgelc";
-const char kTestExtensionId2[] = "pjohnlkdpdolplmenneanegndccmdlpc";
-const char kTestExtensionNoNetworkDelay[] = "aocebcndggcnnmflapdklcmnfojmkmie";
-
-// A simple test net::URLRequestJob. We don't care what it does, only whether
-// it starts and finishes.
-class SimpleTestJob : public net::URLRequestTestJob {
- public:
- explicit SimpleTestJob(net::URLRequest* request)
- : net::URLRequestTestJob(request, test_headers(), kTestData, true) {}
- private:
- ~SimpleTestJob() {}
-};
-
-// An ExtensionHost that doesn't require a Profile or TabContents, to use
-// in notifications to the NetworkDelayListener.
-class TestExtensionHost : public ExtensionHost {
- public:
- TestExtensionHost(const Extension* extension, content::ViewType host_type)
- : ExtensionHost(extension, host_type) {
- }
-};
-
-} // namespace
-
-class NetworkDelayListenerTest
- : public ExtensionServiceTestBase,
- public net::URLRequest::Interceptor {
- public:
- NetworkDelayListenerTest() {
- net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
- }
-
- ~NetworkDelayListenerTest() {
- net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
- }
-
- virtual void SetUp() {
- ExtensionServiceTestBase::SetUp();
-
- InitializeEmptyExtensionService();
- service_->Init();
- MessageLoop::current()->RunAllPending();
-
- listener_ = new NetworkDelayListener();
-
- ResourceQueue::DelegateSet delegates;
- delegates.insert(listener_.get());
- resource_queue_.Initialize(delegates);
- }
-
- virtual void TearDown() {
- resource_queue_.Shutdown();
- listener_ = NULL;
- MessageLoop::current()->RunAllPending();
- }
-
- // net::URLRequest::Interceptor
- virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request) {
- return new SimpleTestJob(request);
- }
-
- protected:
- TestURLRequest* StartTestRequest(net::URLRequest::Delegate* delegate,
- const std::string& url) {
- TestURLRequest* request = new TestURLRequest(GURL(url), delegate);
- scoped_ptr<ResourceDispatcherHostRequestInfo> rdh_info(
- CreateRequestInfo(0));
- resource_queue_.AddRequest(request, *rdh_info.get());
- return request;
- }
-
- void LoadTestExtension(const char* id) {
- FilePath test_dir;
- ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir));
- FilePath extension_path = test_dir
- .AppendASCII("extensions")
- .AppendASCII("network_delay")
- .AppendASCII(id)
- .AppendASCII("1.0");
-
- extensions::UnpackedInstaller::Create(service_)->Load(extension_path);
- MessageLoop::current()->RunAllPending();
- }
-
- void LoadTestExtension1() {
- LoadTestExtension(kTestExtensionId1);
- ASSERT_FALSE(service_->extensions()->is_empty());
- extension1_ = service_->extensions()->GetByID(kTestExtensionId1);
- ASSERT_TRUE(extension1_);
- }
-
- void SendExtensionLoadedNotification(const Extension* extension,
- chrome::ViewType host_type) {
- scoped_ptr<TestExtensionHost> extension_host(
- new TestExtensionHost(extension, host_type));
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_EXTENSION_HOST_DOM_CONTENT_LOADED,
- content::Source<Profile>(profile_.get()),
- content::Details<ExtensionHost>(extension_host.get()));
- MessageLoop::current()->RunAllPending();
- }
-
- void SendBackgroundLoadedNotification(const Extension* extension) {
- SendExtensionLoadedNotification(extension,
- chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE);
- }
-
- scoped_refptr<NetworkDelayListener> listener_;
-
- // Weak reference.
- const Extension* extension1_;
-
- private:
- ResourceDispatcherHostRequestInfo* CreateRequestInfo(int request_id) {
- return new ResourceDispatcherHostRequestInfo(
- new DummyResourceHandler(), content::PROCESS_TYPE_RENDERER, 0, 0, 0,
- request_id, false, -1, false, -1, ResourceType::MAIN_FRAME,
- content::PAGE_TRANSITION_LINK, 0, false, false, false,
- WebKit::WebReferrerPolicyDefault, &resource_context_);
- }
-
- ResourceQueue resource_queue_;
- content::MockResourceContext resource_context_;
-};
-
-namespace {
-
-// Tests that an extension delays network requests, and that loading its
-// background page releases the block.
-TEST_F(NetworkDelayListenerTest, DelayAndLoad) {
- LoadTestExtension1();
-
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
- ASSERT_FALSE(request->is_pending());
-
- // We don't care about a loaded extension dialog.
- SendExtensionLoadedNotification(extension1_,
- chrome::VIEW_TYPE_EXTENSION_DIALOG);
-
- ASSERT_FALSE(request->is_pending());
-
- SendBackgroundLoadedNotification(extension1_);
- EXPECT_EQ(kTestData, delegate.data_received());
-}
-
-// Tests that an extension delays network requests, and that unloading it
-// releases the block.
-TEST_F(NetworkDelayListenerTest, DelayAndUnload) {
- LoadTestExtension1();
-
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
- ASSERT_FALSE(request->is_pending());
-
- service_->UnloadExtension(extension1_->id(),
- extension_misc::UNLOAD_REASON_DISABLE);
- MessageLoop::current()->RunAllPending();
- EXPECT_EQ(kTestData, delegate.data_received());
-}
-
-// Tests that an extension that uses Analytics in the recommended way (i.e.,
-// it includes a local JS file in a <script> tag in its background page and
-// also injects a <script> tag into the page that will be loaded
-// asynchronously) doesn't deadlock.
-TEST_F(NetworkDelayListenerTest, AsynchDelayAndLoad) {
- LoadTestExtension(kTestExtensionId2);
- ASSERT_EQ(1u, service_->extensions()->size());
- const Extension* extension =
- service_->extensions()->GetByID(kTestExtensionId2);
- ASSERT_TRUE(extension);
-
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
- ASSERT_FALSE(request->is_pending());
-
- SendBackgroundLoadedNotification(extension);
- EXPECT_EQ(kTestData, delegate.data_received());
-}
-
-// Tests that two blocking extensions must both load for the block to be
-// released.
-TEST_F(NetworkDelayListenerTest, TwoBlockingExtensions) {
- LoadTestExtension1();
- LoadTestExtension(kTestExtensionId2);
- ASSERT_EQ(2u, service_->extensions()->size());
- const Extension* extension2 =
- service_->extensions()->GetByID(kTestExtensionId2);
- ASSERT_TRUE(extension2);
-
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
- ASSERT_FALSE(request->is_pending());
-
- SendBackgroundLoadedNotification(extension1_);
- ASSERT_FALSE(request->is_pending());
-
- SendBackgroundLoadedNotification(extension2);
- EXPECT_EQ(kTestData, delegate.data_received());
-}
-
-// Tests that unloading a fully loaded extension (i.e., saying it's "ready"
-// twice) doesn't crash.
-TEST_F(NetworkDelayListenerTest, ExtensionReadyTwice) {
- LoadTestExtension1();
-
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
- ASSERT_FALSE(request->is_pending());
-
- SendBackgroundLoadedNotification(extension1_);
- EXPECT_EQ(kTestData, delegate.data_received());
-
- service_->UnloadExtension(extension1_->id(),
- extension_misc::UNLOAD_REASON_DISABLE);
- MessageLoop::current()->RunAllPending();
-}
-
-// Tests that there's no delay if no loaded extension needs one.
-TEST_F(NetworkDelayListenerTest, NoDelayNoWebRequest) {
- LoadTestExtension(kTestExtensionNoNetworkDelay);
- ASSERT_FALSE(service_->extensions()->is_empty());
-
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
-
- // The request should be started immediately.
- ASSERT_TRUE(request->is_pending());
-
- MessageLoop::current()->RunAllPending();
- EXPECT_EQ(kTestData, delegate.data_received());
-}
-
-// Tests that there's no delay if no extensions are loaded.
-TEST_F(NetworkDelayListenerTest, NoDelayNoExtensions) {
- TestDelegate delegate;
- scoped_ptr<TestURLRequest> request(StartTestRequest(&delegate, kTestUrl));
-
- // The request should be started immediately.
- ASSERT_TRUE(request->is_pending());
-
- MessageLoop::current()->RunAllPending();
- EXPECT_EQ(kTestData, delegate.data_received());
-}
-
-} // namespace
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 3983924..f188807 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1290,8 +1290,6 @@
'browser/extensions/installed_loader.h',
'browser/extensions/key_identifier_conversion_views.cc',
'browser/extensions/key_identifier_conversion_views.h',
- 'browser/extensions/network_delay_listener.cc',
- 'browser/extensions/network_delay_listener.h',
'browser/extensions/pack_extension_job.cc',
'browser/extensions/pack_extension_job.h',
'browser/extensions/pending_extension_info.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 89cb276..40760e7 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1464,7 +1464,6 @@
'browser/extensions/file_reader_unittest.cc',
'browser/extensions/image_loading_tracker_unittest.cc',
'browser/extensions/key_identifier_conversion_views_unittest.cc',
- 'browser/extensions/network_delay_listener_unittest.cc',
'browser/extensions/process_map_unittest.cc',
'browser/extensions/sandboxed_extension_unpacker_unittest.cc',
'browser/extensions/settings/settings_frontend_unittest.cc',
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index 16b35b6..332bf6c 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -2841,12 +2841,6 @@ bool Extension::ShowConfigureContextMenus() const {
return location() != Extension::COMPONENT;
}
-bool Extension::ImplicitlyDelaysNetworkStartup() const {
- // Network requests should be deferred until any extensions that might want
- // to observe and modify them are loaded.
- return HasAPIPermission(ExtensionAPIPermission::kWebRequestBlocking);
-}
-
bool Extension::CanSpecifyAPIPermission(
const ExtensionAPIPermission* permission,
string16* error) const {
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h
index b85c7cd..7ec576e 100644
--- a/chrome/common/extensions/extension.h
+++ b/chrome/common/extensions/extension.h
@@ -434,11 +434,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> {
// Whether context menu should be shown for page and browser actions.
bool ShowConfigureContextMenus() const;
- // Whether network requests should be delayed on browser startup until the
- // extension's background page has loaded, even if the extension doesn't
- // explicitly request a delay.
- bool ImplicitlyDelaysNetworkStartup() const;
-
// Returns the Homepage URL for this extension. If homepage_url was not
// specified in the manifest, this returns the Google Gallery URL. For
// third-party extensions, this returns a blank GURL.
diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h
index 918a7e6..2c54cbc 100644
--- a/net/url_request/url_request.h
+++ b/net/url_request/url_request.h
@@ -38,7 +38,6 @@ class ResourceDispatcherHostTest;
class TestAutomationProvider;
class URLRequestAutomationJob;
class UserScriptListenerTest;
-class NetworkDelayListenerTest;
// Temporary layering violation to allow existing users of a deprecated
// interface.
@@ -159,7 +158,6 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe),
friend class ::ResourceDispatcherHostTest;
friend class ::TestAutomationProvider;
friend class ::UserScriptListenerTest;
- friend class ::NetworkDelayListenerTest;
friend class ::URLRequestAutomationJob;
friend class TestInterceptor;
friend class URLRequestFilter;