1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/prerender/prerender_pending_swap_throttle.h" 6 7 #include "chrome/browser/prerender/prerender_final_status.h" 8 #include "chrome/browser/prerender/prerender_manager.h" 9 #include "chrome/browser/prerender/prerender_tracker.h" 10 #include "chrome/browser/prerender/prerender_util.h" 11 #include "content/public/browser/resource_controller.h" 12 #include "content/public/browser/resource_request_info.h" 13 #include "net/url_request/url_request.h" 14 15 using content::ResourceType; 16 17 namespace prerender { 18 19 PrerenderPendingSwapThrottle::PrerenderPendingSwapThrottle( 20 net::URLRequest* request, 21 PrerenderTracker* tracker) 22 : request_(request), 23 tracker_(tracker), 24 throttled_(false) { 25 } 26 27 void PrerenderPendingSwapThrottle::WillStartRequest(bool* defer) { 28 DCHECK(!throttled_); 29 const content::ResourceRequestInfo* info = 30 content::ResourceRequestInfo::ForRequest(request_); 31 32 // We only care about main frame loads. 33 if (info->GetResourceType() != content::RESOURCE_TYPE_MAIN_FRAME) 34 return; 35 36 int render_process_id = info->GetChildID(); 37 int render_frame_id = info->GetRenderFrameID(); 38 39 // Check if this request is for a URL we intend to swap in. 40 if (!tracker_->IsPendingSwapRequestOnIOThread( 41 render_process_id, render_frame_id, request_->url())) { 42 return; 43 } 44 45 *defer = true; 46 throttled_ = true; 47 tracker_->AddPendingSwapThrottleOnIOThread( 48 render_process_id, render_frame_id, request_->url(), this->AsWeakPtr()); 49 } 50 51 const char* PrerenderPendingSwapThrottle::GetNameForLogging() const { 52 return "PrerenderPendingSwapThrottle"; 53 } 54 55 void PrerenderPendingSwapThrottle::Resume() { 56 DCHECK(throttled_); 57 58 throttled_ = false; 59 controller()->Resume(); 60 } 61 62 void PrerenderPendingSwapThrottle::Cancel() { 63 DCHECK(throttled_); 64 65 throttled_ = false; 66 controller()->Cancel(); 67 } 68 69 } // namespace prerender 70