| Index: content/child/resource_dispatcher.cc
|
| diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc
|
| index acb291a436e4fe44d63bec932a399ba73bd1727c..b89aba9b061bb49651ebc47d0327779c36b3c835 100644
|
| --- a/content/child/resource_dispatcher.cc
|
| +++ b/content/child/resource_dispatcher.cc
|
| @@ -359,12 +359,12 @@ void ResourceDispatcher::OnReceivedResponse(
|
|
|
| ResourceResponseInfo renderer_response_info;
|
| ToResourceResponseInfo(*request_info, response_head, &renderer_response_info);
|
| - SiteIsolationPolicy::OnReceivedResponse(request_id,
|
| - request_info->frame_origin,
|
| - request_info->response_url,
|
| - request_info->resource_type,
|
| - request_info->origin_pid,
|
| - renderer_response_info);
|
| + request_info->site_isolation_metadata =
|
| + SiteIsolationPolicy::OnReceivedResponse(request_info->frame_origin,
|
| + request_info->response_url,
|
| + request_info->resource_type,
|
| + request_info->origin_pid,
|
| + renderer_response_info);
|
| request_info->peer->OnReceivedResponse(renderer_response_info);
|
| }
|
|
|
| @@ -432,13 +432,18 @@ void ResourceDispatcher::OnReceivedData(int request_id,
|
| CHECK(data_ptr + data_offset);
|
|
|
| // Check whether this response data is compliant with our cross-site
|
| - // document blocking policy.
|
| + // document blocking policy. We only do this for the first packet.
|
| std::string alternative_data;
|
| - bool blocked_response = SiteIsolationPolicy::ShouldBlockResponse(
|
| - request_id, data_ptr + data_offset, data_length, &alternative_data);
|
| + if (request_info->site_isolation_metadata.get()) {
|
| + request_info->blocked_response =
|
| + SiteIsolationPolicy::ShouldBlockResponse(
|
| + request_info->site_isolation_metadata, data_ptr + data_offset,
|
| + data_length, &alternative_data);
|
| + request_info->site_isolation_metadata.reset();
|
| + }
|
|
|
| // When the response is not blocked.
|
| - if (!blocked_response) {
|
| + if (!request_info->blocked_response) {
|
| request_info->peer->OnReceivedData(
|
| data_ptr + data_offset, data_length, encoded_data_length);
|
| } else if (alternative_data.size() > 0) {
|
| @@ -521,7 +526,6 @@ void ResourceDispatcher::OnRequestComplete(
|
| int request_id,
|
| const ResourceMsg_RequestCompleteData& request_complete_data) {
|
| TRACE_EVENT0("loader", "ResourceDispatcher::OnRequestComplete");
|
| - SiteIsolationPolicy::OnRequestComplete(request_id);
|
|
|
| PendingRequestInfo* request_info = GetPendingRequestInfo(request_id);
|
| if (!request_info)
|
| @@ -572,7 +576,6 @@ bool ResourceDispatcher::RemovePendingRequest(int request_id) {
|
| if (it == pending_requests_.end())
|
| return false;
|
|
|
| - SiteIsolationPolicy::OnRequestComplete(request_id);
|
| PendingRequestInfo& request_info = it->second;
|
| ReleaseResourcesInMessageQueue(&request_info.deferred_message_queue);
|
| pending_requests_.erase(it);
|
| @@ -625,6 +628,7 @@ ResourceDispatcher::PendingRequestInfo::PendingRequestInfo()
|
| : peer(NULL),
|
| resource_type(ResourceType::SUB_RESOURCE),
|
| is_deferred(false),
|
| + blocked_response(false),
|
| buffer_size(0) {
|
| }
|
|
|
| @@ -641,7 +645,8 @@ ResourceDispatcher::PendingRequestInfo::PendingRequestInfo(
|
| url(request_url),
|
| frame_origin(frame_origin),
|
| response_url(request_url),
|
| - request_start(base::TimeTicks::Now()) {
|
| + request_start(base::TimeTicks::Now()),
|
| + blocked_response(false) {
|
| }
|
|
|
| ResourceDispatcher::PendingRequestInfo::~PendingRequestInfo() {}
|
|
|