Home | History | Annotate | Download | only in prerender
      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