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