15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/throttling_resource_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/loader/resource_request_info_impl.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_throttle.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/resource_response.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/url_request/url_request.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ThrottlingResourceHandler::ThrottlingResourceHandler( 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ResourceHandler> next_handler, 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::URLRequest* request, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<ResourceThrottle> throttles) 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : LayeredResourceHandler(request, next_handler.Pass()), 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_stage_(DEFERRED_NONE), 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throttles_(throttles.Pass()), 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_(0), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancelled_by_resource_throttle_(false) { 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < throttles_.size(); ++i) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throttles_[i]->set_controller(this); 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Throttles must have a name, as otherwise, bugs where a throttle fails 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to resume a request can be very difficult to debug. 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(throttles_[i]->GetNameForLogging()); 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ThrottlingResourceHandler::~ThrottlingResourceHandler() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ThrottlingResourceHandler::OnRequestRedirected( 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::RedirectInfo& redirect_info, 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ResourceResponse* response, 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool* defer) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *defer = false; 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (next_index_ < throttles_.size()) { 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int index = next_index_; 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) throttles_[index]->WillRedirectRequest(redirect_info.new_url, defer); 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_++; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancelled_by_resource_throttle_) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*defer) { 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnRequestDefered(index); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_stage_ = DEFERRED_REDIRECT; 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) deferred_redirect_ = redirect_info; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_response_ = response; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Do not cancel. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_ = 0; // Reset for next time. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return next_handler_->OnRequestRedirected(redirect_info, response, defer); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThrottlingResourceHandler::OnWillStart(const GURL& url, bool* defer) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *defer = false; 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (next_index_ < throttles_.size()) { 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int index = next_index_; 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throttles_[index]->WillStartRequest(defer); 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_++; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancelled_by_resource_throttle_) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*defer) { 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnRequestDefered(index); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_stage_ = DEFERRED_START; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_url_ = url; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Do not cancel. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_ = 0; // Reset for next time. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return next_handler_->OnWillStart(url, defer); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThrottlingResourceHandler::OnBeforeNetworkStart(const GURL& url, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* defer) { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *defer = false; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (next_index_ < throttles_.size()) { 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int index = next_index_; 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) throttles_[index]->WillStartUsingNetwork(defer); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) next_index_++; 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cancelled_by_resource_throttle_) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (*defer) { 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnRequestDefered(index); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) deferred_stage_ = DEFERRED_NETWORK_START; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) deferred_url_ = url; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; // Do not cancel. 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) next_index_ = 0; // Reset for next time. 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return next_handler_->OnBeforeNetworkStart(url, defer); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThrottlingResourceHandler::OnResponseStarted(ResourceResponse* response, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* defer) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (next_index_ < throttles_.size()) { 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int index = next_index_; 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throttles_[index]->WillProcessResponse(defer); 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_++; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancelled_by_resource_throttle_) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*defer) { 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnRequestDefered(index); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_stage_ = DEFERRED_RESPONSE; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_response_ = response; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Do not cancel. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_index_ = 0; // Reset for next time. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return next_handler_->OnResponseStarted(response, defer); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::Cancel() { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancelled_by_resource_throttle_ = true; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Cancel(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::CancelAndIgnore() { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancelled_by_resource_throttle_ = true; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->CancelAndIgnore(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::CancelWithError(int error_code) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancelled_by_resource_throttle_ = true; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->CancelWithError(error_code); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::Resume() { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeferredStage last_deferred_stage = deferred_stage_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_stage_ = DEFERRED_NONE; 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Clear information about the throttle that delayed the request. 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request()->LogUnblocked(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (last_deferred_stage) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DEFERRED_NONE: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DEFERRED_START: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResumeStart(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case DEFERRED_NETWORK_START: 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResumeNetworkStart(); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DEFERRED_REDIRECT: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResumeRedirect(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DEFERRED_RESPONSE: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResumeResponse(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::ResumeStart() { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = deferred_url_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_url_ = GURL(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool defer = false; 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!OnWillStart(url, &defer)) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Cancel(); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!defer) { 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller()->Resume(); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ThrottlingResourceHandler::ResumeNetworkStart() { 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = deferred_url_; 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) deferred_url_ = GURL(); 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool defer = false; 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!OnBeforeNetworkStart(url, &defer)) { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller()->Cancel(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!defer) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Resume(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::ResumeRedirect() { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::RedirectInfo redirect_info = deferred_redirect_; 2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) deferred_redirect_ = net::RedirectInfo(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ResourceResponse> response; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_response_.swap(response); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool defer = false; 2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!OnRequestRedirected(redirect_info, response.get(), &defer)) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Cancel(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!defer) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Resume(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::ResumeResponse() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!cancelled_by_resource_throttle_); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ResourceResponse> response; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deferred_response_.swap(response); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool defer = false; 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!OnResponseStarted(response.get(), &defer)) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Cancel(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!defer) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Resume(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ThrottlingResourceHandler::OnRequestDefered(int throttle_index) { 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request()->LogBlockedBy(throttles_[throttle_index]->GetNameForLogging()); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 235