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/async_resource_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/alias.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/devtools/devtools_netlog_observer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_buffer.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_message_filter.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_request_info_impl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/resource_context_impl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/resource_messages.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host_delegate.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/resource_response.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/url_request/redirect_info.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeTicks; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kBufferSize = 1024 * 512; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kMinAllocationSize = 1024 * 4; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kMaxAllocationSize = 1024 * 32; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetNumericArg(const std::string& name, int* result) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value = 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(name); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.empty()) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt(value, result); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeResourceBufferConstants() { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool did_init = false; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_init) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_init = true; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNumericArg("resource-buffer-size", &kBufferSize); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNumericArg("resource-buffer-min-allocation-size", &kMinAllocationSize); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNumericArg("resource-buffer-max-allocation-size", &kMaxAllocationSize); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CalcUsedPercentage(int bytes_read, int buffer_size) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double ratio = static_cast<double>(bytes_read) / buffer_size; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(ratio * 100.0 + 0.5); // Round to nearest integer. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DependentIOBuffer : public net::WrappedIOBuffer { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependentIOBuffer(ResourceBuffer* backing, char* memory) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : net::WrappedIOBuffer(memory), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backing_(backing) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DependentIOBuffer() {} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ResourceBuffer> backing_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AsyncResourceHandler::AsyncResourceHandler( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh) 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : ResourceHandler(request), 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceMessageDelegate(request), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh_(rdh), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_data_count_(0), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allocation_size_(0), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_defer_(false), 89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) has_checked_for_sufficient_resources_(false), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_received_response_msg_(false), 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sent_first_data_msg_(false), 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reported_transfer_size_(0) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeResourceBufferConstants(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AsyncResourceHandler::~AsyncResourceHandler() { 97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (has_checked_for_sufficient_resources_) 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) rdh_->FinishedWithResourcesForRequest(request()); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnMessageReceived(const IPC::Message& message) { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool handled = true; 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(AsyncResourceHandler, message) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ResourceHostMsg_FollowRedirect, OnFollowRedirect) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ResourceHostMsg_DataReceived_ACK, OnDataReceivedACK) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return handled; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AsyncResourceHandler::OnFollowRedirect(int request_id) { 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!request()->status().is_success()) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "OnFollowRedirect for invalid request"; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!redirect_start_time_.is_null()) { 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UMA_HISTOGRAM_TIMES("Net.AsyncResourceHandler_RedirectHopTime", 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TimeTicks::Now() - redirect_start_time_); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Reset start time. 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci redirect_start_time_ = TimeTicks(); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResumeIfDeferred(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AsyncResourceHandler::OnDataReceivedACK(int request_id) { 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (pending_data_count_) { 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) --pending_data_count_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) buffer_->RecycleLeastRecentlyAllocated(); 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (buffer_->CanAllocate()) 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResumeIfDeferred(); 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnUploadProgress(uint64 position, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 size) { 1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ResourceMessageFilter* filter = GetFilter(); 1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!filter) 1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return false; 1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return filter->Send( 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ResourceMsg_UploadProgress(GetRequestID(), position, size)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool AsyncResourceHandler::OnRequestRedirected( 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::RedirectInfo& redirect_info, 1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ResourceResponse* response, 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool* defer) { 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ResourceRequestInfoImpl* info = GetRequestInfo(); 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!info->filter()) 1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return false; 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci redirect_start_time_ = TimeTicks::Now(); 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *defer = did_defer_ = true; 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnDefer(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh_->delegate()) { 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) rdh_->delegate()->OnRequestRedirected( 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) redirect_info.new_url, request(), info->GetContext(), response); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DevToolsNetLogObserver::PopulateResponseInfo(request(), response); 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response->head.encoded_data_length = request()->GetTotalReceivedBytes(); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reported_transfer_size_ = 0; 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) response->head.request_start = request()->creation_time(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response->head.response_start = TimeTicks::Now(); 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(davidben): Is it necessary to pass the new first party URL for 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // cookies? The only case where it can change is top-level navigation requests 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and hopefully those will eventually all be owned by the browser. It's 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // possible this is still needed while renderer-owned ones exist. 17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return info->filter()->Send(new ResourceMsg_ReceivedRedirect( 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetRequestID(), redirect_info, response->head)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnResponseStarted(ResourceResponse* response, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* defer) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For changes to the main frame, inform the renderer of the new URL's 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-host settings before the request actually commits. This way the 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer will be able to set these precisely at the time the 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request commits, avoiding the possibility of e.g. zooming the old content 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or of having to layout the new content twice. 1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const ResourceRequestInfoImpl* info = GetRequestInfo(); 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!info->filter()) 1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return false; 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh_->delegate()) { 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) rdh_->delegate()->OnResponseStarted( 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) request(), info->GetContext(), response, info->filter()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DevToolsNetLogObserver::PopulateResponseInfo(request(), response); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMap* host_zoom_map = 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetHostZoomMapForResourceContext(info->GetContext()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME && host_zoom_map) { 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& request_url = request()->url(); 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) info->filter()->Send(new ViewMsg_SetZoomLevelForLoadingURL( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->GetRouteID(), 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_url, host_zoom_map->GetZoomLevelForHostAndScheme( 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_url.scheme(), 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::GetHostOrSpecFromURL(request_url)))); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If the parent handler downloaded the resource to a file, grant the child 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // read permissions on it. 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!response->head.download_file_path.empty()) { 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rdh_->RegisterDownloadedTempFile( 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) info->GetChildID(), info->GetRequestID(), 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) response->head.download_file_path); 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) response->head.request_start = request()->creation_time(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response->head.response_start = TimeTicks::Now(); 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) info->filter()->Send(new ResourceMsg_ReceivedResponse(GetRequestID(), 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) response->head)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_received_response_msg_ = true; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (request()->response_info().metadata.get()) { 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<char> copy(request()->response_info().metadata->data(), 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) request()->response_info().metadata->data() + 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) request()->response_info().metadata->size()); 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) info->filter()->Send(new ResourceMsg_ReceivedCachedMetadata(GetRequestID(), 22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) copy)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnBeforeNetworkStart(const GURL& url, bool* defer) { 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int* buf_size, 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int min_size) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(-1, min_size); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!EnsureResourceBufferIsInitialized()) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(buffer_->CanAllocate()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* memory = buffer_->Allocate(&allocation_size_); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(memory); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *buf = new DependentIOBuffer(buffer_.get(), memory); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *buf_size = allocation_size_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Net.AsyncResourceHandler_SharedIOBuffer_Alloc", 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *buf_size, 0, kMaxAllocationSize, 100); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { 2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK_GE(bytes_read, 0); 2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bytes_read) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceMessageFilter* filter = GetFilter(); 2690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!filter) 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_->ShrinkLastAllocation(bytes_read); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Net.AsyncResourceHandler_SharedIOBuffer_Used", 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_read, 0, kMaxAllocationSize, 100); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_PERCENTAGE( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Net.AsyncResourceHandler_SharedIOBuffer_UsedPercentage", 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalcUsedPercentage(bytes_read, allocation_size_)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sent_first_data_msg_) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle handle; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!buffer_->ShareToProcess(filter->PeerHandle(), &handle, &size)) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter->Send(new ResourceMsg_SetDataBuffer( 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRequestID(), handle, size, filter->peer_pid())); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_first_data_msg_ = true; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_offset = buffer_->GetLastAllocationOffset(); 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64_t current_transfer_size = request()->GetTotalReceivedBytes(); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int encoded_data_length = current_transfer_size - reported_transfer_size_; 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reported_transfer_size_ = current_transfer_size; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter->Send(new ResourceMsg_DataReceived( 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRequestID(), data_offset, bytes_read, encoded_data_length)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++pending_data_count_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Net.AsyncResourceHandler_PendingDataCount", 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_data_count_, 0, 100, 100); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buffer_->CanAllocate()) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Net.AsyncResourceHandler_PendingDataCount_WhenFull", 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_data_count_, 0, 100, 100); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *defer = did_defer_ = true; 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnDefer(); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64_t current_transfer_size = request()->GetTotalReceivedBytes(); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int encoded_data_length = current_transfer_size - reported_transfer_size_; 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reported_transfer_size_ = current_transfer_size; 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceMessageFilter* filter = GetFilter(); 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (filter) { 3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter->Send(new ResourceMsg_DataDownloaded( 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRequestID(), bytes_downloaded, encoded_data_length)); 32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AsyncResourceHandler::OnResponseCompleted( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLRequestStatus& status, 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& security_info, 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool* defer) { 3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ResourceRequestInfoImpl* info = GetRequestInfo(); 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!info->filter()) 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we crash here, figure out what URL the renderer was requesting. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/107692 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char url_buf[128]; 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::strlcpy(url_buf, request()->url().spec().c_str(), arraysize(url_buf)); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(url_buf); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gavinp): Remove this CHECK when we figure out the cause of 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/124680 . This check mirrors closely check in 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebURLLoaderImpl::OnCompletedRequest that routes this message to a WebCore 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceHandleInternal which asserts on its state and crashes. By crashing 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the message is sent, we should get better crash reports. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(status.status() != net::URLRequestStatus::SUCCESS || 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_received_response_msg_); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code = status.error(); 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool was_ignored_by_handler = info->WasIgnoredByHandler(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(status.status() != net::URLRequestStatus::IO_PENDING); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this check fails, then we're in an inconsistent state because all 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requests ignored by the handler should be canceled (which should result in 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ERR_ABORTED error code). 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!was_ignored_by_handler || error_code == net::ERR_ABORTED); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mkosiba): Fix up cases where we create a URLRequestStatus 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with a status() != SUCCESS and an error_code() == net::OK. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status.status() == net::URLRequestStatus::CANCELED && 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code == net::OK) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code = net::ERR_ABORTED; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (status.status() == net::URLRequestStatus::FAILED && 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code == net::OK) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code = net::ERR_FAILED; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceMsg_RequestCompleteData request_complete_data; 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_complete_data.error_code = error_code; 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_complete_data.was_ignored_by_handler = was_ignored_by_handler; 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_complete_data.exists_in_cache = request()->response_info().was_cached; 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_complete_data.security_info = security_info; 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_complete_data.completion_time = TimeTicks::Now(); 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_complete_data.encoded_data_length = 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request()->GetTotalReceivedBytes(); 37668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) info->filter()->Send( 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ResourceMsg_RequestComplete(GetRequestID(), request_complete_data)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (buffer_.get() && buffer_->IsInitialized()) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 384b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!has_checked_for_sufficient_resources_) { 385b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) has_checked_for_sufficient_resources_ = true; 3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!rdh_->HasSufficientResourcesForRequest(request())) { 387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); 388b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 391b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_ = new ResourceBuffer(); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer_->Initialize(kBufferSize, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinAllocationSize, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxAllocationSize); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AsyncResourceHandler::ResumeIfDeferred() { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_defer_) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_defer_ = false; 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request()->LogUnblocked(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller()->Resume(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AsyncResourceHandler::OnDefer() { 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request()->LogBlockedBy("AsyncResourceHandler"); 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 411