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

Unified Diff: content/browser/loader/mojo_async_resource_handler.cc

Issue 2467833002: Implement redirect handling on MojoAsyncResourceHandler (Closed)
Patch Set: fix Created 4 years, 1 month 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
Index: content/browser/loader/mojo_async_resource_handler.cc
diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc
index 6d5a9d7c4a08f396856ebee72852a861a6a3eb21..21961837a45cc8e98486d9ff154e429381ab8937 100644
--- a/content/browser/loader/mojo_async_resource_handler.cc
+++ b/content/browser/loader/mojo_async_resource_handler.cc
@@ -127,8 +127,23 @@ bool MojoAsyncResourceHandler::OnRequestRedirected(
const net::RedirectInfo& redirect_info,
ResourceResponse* response,
bool* defer) {
- // Not implemented.
- return false;
+ // Unlike OnResponseReceived, OnRequestRedirected will NOT be preceded by
+ // OnWillRead.
+ DCHECK(!shared_writer_);
+
+ *defer = true;
+ OnDefer();
+
+ NetLogObserver::PopulateResponseInfo(request(), response);
+ response->head.encoded_data_length = request()->GetTotalReceivedBytes();
+ response->head.request_start = request()->creation_time();
+ response->head.response_start = base::TimeTicks::Now();
+ // TODO(davidben): Is it necessary to pass the new first party URL for
+ // cookies? The only case where it can change is top-level navigation requests
+ // and hopefully those will eventually all be owned by the browser. It's
+ // possible this is still needed while renderer-owned ones exist.
+ url_loader_client_->OnReceiveRedirect(redirect_info, response->head);
+ return true;
}
bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response,
@@ -245,11 +260,19 @@ void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) {
}
void MojoAsyncResourceHandler::FollowRedirect() {
- NOTIMPLEMENTED();
+ if (!request()->status().is_success()) {
+ DVLOG(1) << "OnFollowRedirect for invalid request";
+ return;
+ }
+
+ DCHECK(did_defer_);
dcheng 2016/11/10 07:09:27 Is it safe to allow this to be called multiple tim
mmenke 2016/11/10 21:42:40 Good question...It looks like it's actually safe (
yhirano 2016/11/11 09:47:03 Done. It's now cancelling the request, I don't kno
+ did_defer_ = false;
+ request()->LogUnblocked();
+ controller()->Resume();
}
-void MojoAsyncResourceHandler::ResumeForTesting() {
- Resume();
+void MojoAsyncResourceHandler::OnWritableForTesting() {
+ OnWritable(MOJO_RESULT_OK);
}
void MojoAsyncResourceHandler::SetAllocationSizeForTesting(size_t size) {
@@ -351,7 +374,24 @@ bool MojoAsyncResourceHandler::AllocateWriterIOBuffer(
return true;
}
-void MojoAsyncResourceHandler::Resume() {
+void MojoAsyncResourceHandler::OnDefer() {
+ request()->LogBlockedBy("MojoAsyncResourceHandler");
+ did_defer_ = true;
+}
+
+bool MojoAsyncResourceHandler::CheckForSufficientResource() {
+ if (has_checked_for_sufficient_resources_)
+ return true;
+ has_checked_for_sufficient_resources_ = true;
+
+ if (rdh_->HasSufficientResourcesForRequest(request()))
+ return true;
+
+ controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
+ return false;
+}
+
+void MojoAsyncResourceHandler::OnWritable(MojoResult unused) {
mmenke 2016/11/10 21:42:40 nit: I think the style is to not name unused vari
yhirano 2016/11/11 09:47:03 Done.
if (!did_defer_)
return;
did_defer_ = false;
@@ -380,27 +420,6 @@ void MojoAsyncResourceHandler::Resume() {
controller()->Resume();
}
-void MojoAsyncResourceHandler::OnDefer() {
- request()->LogBlockedBy("MojoAsyncResourceHandler");
- did_defer_ = true;
-}
-
-bool MojoAsyncResourceHandler::CheckForSufficientResource() {
- if (has_checked_for_sufficient_resources_)
- return true;
- has_checked_for_sufficient_resources_ = true;
-
- if (rdh_->HasSufficientResourcesForRequest(request()))
- return true;
-
- controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
- return false;
-}
-
-void MojoAsyncResourceHandler::OnWritable(MojoResult unused) {
- Resume();
-}
-
void MojoAsyncResourceHandler::Cancel() {
const ResourceRequestInfoImpl* info = GetRequestInfo();
ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer(

Powered by Google App Engine
This is Rietveld 408576698