Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(682)

Unified Diff: Source/core/loader/DocumentThreadableLoader.cpp

Issue 14246006: Implementing timeout support for XHR (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@timeoutResourceHandle
Patch Set: Timeout support in DocumentThreadableLoader (speculative bot failure fix) Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/loader/DocumentThreadableLoader.h ('k') | Source/core/loader/ThreadableLoader.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/loader/DocumentThreadableLoader.cpp
diff --git a/Source/core/loader/DocumentThreadableLoader.cpp b/Source/core/loader/DocumentThreadableLoader.cpp
index 7470cdf8953416f1b890bb612e64daf5413a83fc..968f3fc4b59b0668754728fcaff7c69625a73833 100644
--- a/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/Source/core/loader/DocumentThreadableLoader.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2011, 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2013, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -74,6 +75,7 @@ DocumentThreadableLoader::DocumentThreadableLoader(Document* document, Threadabl
, m_sameOriginRequest(securityOrigin()->canRequest(request.url()))
, m_simpleRequest(true)
, m_async(blockingBehavior == LoadAsynchronously)
+ , m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout)
{
ASSERT(document);
ASSERT(client);
@@ -141,14 +143,22 @@ DocumentThreadableLoader::~DocumentThreadableLoader()
void DocumentThreadableLoader::cancel()
{
+ cancelWithError(ResourceError());
+}
+
+void DocumentThreadableLoader::cancelWithError(const ResourceError& error)
+{
RefPtr<DocumentThreadableLoader> protect(this);
// Cancel can re-enter and m_resource might be null here as a result.
if (m_client && m_resource) {
- // FIXME: This error is sent to the client in didFail(), so it should not be an internal one. Use FrameLoaderClient::cancelledError() instead.
- ResourceError error(errorDomainWebKitInternal, 0, m_resource->url().string(), "Load cancelled");
- error.setIsCancellation(true);
- didFail(m_resource->identifier(), error);
+ ResourceError errorForCallback = error;
+ if (errorForCallback.isNull()) {
+ // FIXME: This error is sent to the client in didFail(), so it should not be an internal one. Use FrameLoaderClient::cancelledError() instead.
+ errorForCallback = ResourceError(errorDomainWebKitInternal, 0, m_resource->url().string(), "Load cancelled");
+ errorForCallback.setIsCancellation(true);
+ }
+ didFail(m_resource->identifier(), errorForCallback);
}
clearResource();
m_client = 0;
@@ -319,6 +329,8 @@ void DocumentThreadableLoader::notifyFinished(CachedResource* resource)
{
ASSERT(m_client);
ASSERT_UNUSED(resource, resource == m_resource);
+
+ m_timeoutTimer.stop();
if (m_resource->errorOccurred())
didFail(m_resource->identifier(), m_resource->resourceError());
@@ -345,6 +357,18 @@ void DocumentThreadableLoader::didFail(unsigned long identifier, const ResourceE
m_client->didFail(error);
}
+void DocumentThreadableLoader::didTimeout(Timer<DocumentThreadableLoader>* timer)
+{
+ ASSERT_UNUSED(timer, timer == &m_timeoutTimer);
+
+ // Using values from net/base/net_error_list.h ERR_TIMED_OUT,
+ // Same as existing FIXME above - this error should be coming from FrameLoaderClient to be identifiable.
+ static const int timeoutError = -7;
+ ResourceError error("net", timeoutError, m_resource->url(), String());
+ error.setIsTimeout(true);
+ cancelWithError(error);
+}
+
void DocumentThreadableLoader::preflightSuccess()
{
OwnPtr<ResourceRequest> actualRequest;
@@ -386,6 +410,9 @@ void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, Secur
options.dataBufferingPolicy = BufferData;
}
+ if (m_options.timeoutMilliseconds > 0)
+ m_timeoutTimer.startOneShot(m_options.timeoutMilliseconds / 1000.0);
+
CachedResourceRequest newRequest(request, m_options.initiator, options);
ASSERT(!m_resource);
m_resource = m_document->cachedResourceLoader()->requestRawResource(newRequest);
« no previous file with comments | « Source/core/loader/DocumentThreadableLoader.h ('k') | Source/core/loader/ThreadableLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698