summaryrefslogtreecommitdiffstats
path: root/content/browser/loader
diff options
context:
space:
mode:
authormkosiba@chromium.org <mkosiba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-26 23:29:12 +0000
committermkosiba@chromium.org <mkosiba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-26 23:29:12 +0000
commit4c4092118a405d228377cf7f0ca114ce34699b9f (patch)
tree56a0abd1e467c09168a087b33523bed89d5b7cc5 /content/browser/loader
parent2ed0e624ab59fe8fbcdae0666c26b7076b61ef86 (diff)
downloadchromium_src-4c4092118a405d228377cf7f0ca114ce34699b9f.zip
chromium_src-4c4092118a405d228377cf7f0ca114ce34699b9f.tar.gz
chromium_src-4c4092118a405d228377cf7f0ca114ce34699b9f.tar.bz2
Don't resume cancelled requests.
If ResourceLoader::Resume() is called after CancelRequestInternal but before ResourceLoader::ResponseCompleted we'll hit a DCHECK in URLRequest saying we're trying to start a cancelled request. BUG=338437 Review URL: https://codereview.chromium.org/180183003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@253625 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/loader')
-rw-r--r--content/browser/loader/resource_loader.cc5
-rw-r--r--content/browser/loader/resource_loader_unittest.cc103
2 files changed, 58 insertions, 50 deletions
diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc
index 97017da..02e9a1c 100644
--- a/content/browser/loader/resource_loader.cc
+++ b/content/browser/loader/resource_loader.cc
@@ -433,6 +433,11 @@ void ResourceLoader::Cancel() {
void ResourceLoader::StartRequestInternal() {
DCHECK(!request_->is_pending());
+
+ if (!request_->status().is_success()) {
+ return;
+ }
+
request_->Start();
delegate_->DidStartRequest(this);
diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc
index d82092f..363c9ff 100644
--- a/content/browser/loader/resource_loader_unittest.cc
+++ b/content/browser/loader/resource_loader_unittest.cc
@@ -69,7 +69,12 @@ class ClientCertStoreStub : public net::ClientCertStore {
// initialize ResourceLoader.
class ResourceHandlerStub : public ResourceHandler {
public:
- ResourceHandlerStub() : ResourceHandler(NULL) {}
+ ResourceHandlerStub()
+ : ResourceHandler(NULL), defer_request_on_will_start_(false) {}
+
+ void set_defer_request_on_will_start(bool defer_request_on_will_start) {
+ defer_request_on_will_start_ = defer_request_on_will_start;
+ }
virtual bool OnUploadProgress(int request_id,
uint64 position,
@@ -86,11 +91,14 @@ class ResourceHandlerStub : public ResourceHandler {
virtual bool OnResponseStarted(int request_id,
ResourceResponse* response,
- bool* defer) OVERRIDE { return true; }
+ bool* defer) OVERRIDE {
+ return true;
+ }
virtual bool OnWillStart(int request_id,
const GURL& url,
bool* defer) OVERRIDE {
+ *defer = defer_request_on_will_start_;
return true;
}
@@ -121,6 +129,9 @@ class ResourceHandlerStub : public ResourceHandler {
virtual void OnDataDownloaded(int request_id,
int bytes_downloaded) OVERRIDE {}
+
+ private:
+ bool defer_request_on_will_start_;
};
// Test browser client that captures calls to SelectClientCertificates and
@@ -179,6 +190,29 @@ class ResourceLoaderTest : public testing::Test,
resource_context_(&test_url_request_context_) {
}
+ virtual void SetUp() OVERRIDE {
+ const int kRenderProcessId = 1;
+ const int kRenderViewId = 2;
+
+ scoped_ptr<net::URLRequest> request(
+ new net::URLRequest(GURL("dummy"),
+ net::DEFAULT_PRIORITY,
+ NULL,
+ resource_context_.GetRequestContext()));
+ raw_ptr_to_request_ = request.get();
+ ResourceRequestInfo::AllocateForTesting(request.get(),
+ ResourceType::MAIN_FRAME,
+ &resource_context_,
+ kRenderProcessId,
+ kRenderViewId,
+ MSG_ROUTING_NONE,
+ false);
+ scoped_ptr<ResourceHandlerStub> resource_handler(new ResourceHandlerStub());
+ raw_ptr_resource_handler_ = resource_handler.get();
+ loader_.reset(new ResourceLoader(
+ request.Pass(), resource_handler.PassAs<ResourceHandler>(), this));
+ }
+
// ResourceLoaderDelegate:
virtual ResourceDispatcherHostLoginDelegate* CreateLoginDelegate(
ResourceLoader* loader,
@@ -199,6 +233,11 @@ class ResourceLoaderTest : public testing::Test,
net::TestURLRequestContext test_url_request_context_;
ResourceContextStub resource_context_;
+
+ // The ResourceLoader owns the URLRequest and the ResourceHandler.
+ ResourceHandlerStub* raw_ptr_resource_handler_;
+ net::URLRequest* raw_ptr_to_request_;
+ scoped_ptr<ResourceLoader> loader_;
};
// Verifies if a call to net::UrlRequest::Delegate::OnCertificateRequested()
@@ -206,22 +245,6 @@ class ResourceLoaderTest : public testing::Test,
// certificates are correctly passed to the content browser client for
// selection.
TEST_F(ResourceLoaderTest, ClientCertStoreLookup) {
- const int kRenderProcessId = 1;
- const int kRenderViewId = 2;
-
- scoped_ptr<net::URLRequest> request(
- new net::URLRequest(GURL("dummy"),
- net::DEFAULT_PRIORITY,
- NULL,
- resource_context_.GetRequestContext()));
- ResourceRequestInfo::AllocateForTesting(request.get(),
- ResourceType::MAIN_FRAME,
- &resource_context_,
- kRenderProcessId,
- kRenderViewId,
- MSG_ROUTING_NONE,
- false);
-
// Set up the test client cert store.
net::CertificateList dummy_certs(1, scoped_refptr<net::X509Certificate>(
new net::X509Certificate("test", "test", base::Time(), base::Time())));
@@ -229,17 +252,12 @@ TEST_F(ResourceLoaderTest, ClientCertStoreLookup) {
new ClientCertStoreStub(dummy_certs));
EXPECT_EQ(0, test_store->request_count());
- // Ownership of the |request| and |test_store| is about to be turned over to
- // ResourceLoader. We need to keep raw pointer copies to access these objects
- // later.
- net::URLRequest* raw_ptr_to_request = request.get();
+ // Ownership of the |test_store| is about to be turned over to ResourceLoader.
+ // We need to keep raw pointer copies to access these objects later.
ClientCertStoreStub* raw_ptr_to_store = test_store.get();
resource_context_.SetClientCertStore(
test_store.PassAs<net::ClientCertStore>());
- scoped_ptr<ResourceHandler> resource_handler(new ResourceHandlerStub());
- ResourceLoader loader(request.Pass(), resource_handler.Pass(), this);
-
// Prepare a dummy certificate request.
scoped_refptr<net::SSLCertRequestInfo> cert_request_info(
new net::SSLCertRequestInfo());
@@ -252,7 +270,7 @@ TEST_F(ResourceLoaderTest, ClientCertStoreLookup) {
// Everything is set up. Trigger the resource loader certificate request event
// and run the message loop.
- loader.OnCertificateRequested(raw_ptr_to_request, cert_request_info.get());
+ loader_->OnCertificateRequested(raw_ptr_to_request_, cert_request_info.get());
base::RunLoop().RunUntilIdle();
// Restore the original content browser client.
@@ -272,29 +290,6 @@ TEST_F(ResourceLoaderTest, ClientCertStoreLookup) {
// on a platform with a NULL client cert store still calls the content browser
// client for selection.
TEST_F(ResourceLoaderTest, ClientCertStoreNull) {
- const int kRenderProcessId = 1;
- const int kRenderViewId = 2;
-
- scoped_ptr<net::URLRequest> request(
- new net::URLRequest(GURL("dummy"),
- net::DEFAULT_PRIORITY,
- NULL,
- resource_context_.GetRequestContext()));
- ResourceRequestInfo::AllocateForTesting(request.get(),
- ResourceType::MAIN_FRAME,
- &resource_context_,
- kRenderProcessId,
- kRenderViewId,
- MSG_ROUTING_NONE,
- false);
-
- // Ownership of the |request| is about to be turned over to ResourceLoader. We
- // need to keep a raw pointer copy to access this object later.
- net::URLRequest* raw_ptr_to_request = request.get();
-
- scoped_ptr<ResourceHandler> resource_handler(new ResourceHandlerStub());
- ResourceLoader loader(request.Pass(), resource_handler.Pass(), this);
-
// Prepare a dummy certificate request.
scoped_refptr<net::SSLCertRequestInfo> cert_request_info(
new net::SSLCertRequestInfo());
@@ -307,7 +302,7 @@ TEST_F(ResourceLoaderTest, ClientCertStoreNull) {
// Everything is set up. Trigger the resource loader certificate request event
// and run the message loop.
- loader.OnCertificateRequested(raw_ptr_to_request, cert_request_info.get());
+ loader_->OnCertificateRequested(raw_ptr_to_request_, cert_request_info.get());
base::RunLoop().RunUntilIdle();
// Restore the original content browser client.
@@ -319,4 +314,12 @@ TEST_F(ResourceLoaderTest, ClientCertStoreNull) {
EXPECT_EQ(net::CertificateList(), test_client.passed_certs());
}
+TEST_F(ResourceLoaderTest, ResumeCancelledRequest) {
+ raw_ptr_resource_handler_->set_defer_request_on_will_start(true);
+
+ loader_->StartRequest();
+ loader_->CancelRequest(true);
+ static_cast<ResourceController*>(loader_.get())->Resume();
+}
+
} // namespace content