diff options
-rw-r--r-- | chrome/browser/browser_process_impl.cc | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 15 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.h | 3 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_prefs.cc | 21 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_prefs.h | 9 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_service.cc | 6 | ||||
-rw-r--r-- | chrome/browser/extensions/network_delay_listener.cc | 165 | ||||
-rw-r--r-- | chrome/browser/extensions/network_delay_listener.h | 105 | ||||
-rw-r--r-- | chrome/browser/extensions/network_delay_listener_unittest.cc | 279 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/common/extensions/extension.cc | 6 | ||||
-rw-r--r-- | chrome/common/extensions/extension.h | 5 | ||||
-rw-r--r-- | net/url_request/url_request.h | 2 |
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; |