1// Copyright (c) 2012 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 "content/browser/loader/resource_scheduler_filter.h" 6 7#include "content/browser/loader/resource_dispatcher_host_impl.h" 8#include "content/browser/loader/resource_scheduler.h" 9#include "content/common/frame_messages.h" 10#include "content/common/view_messages.h" 11#include "ui/base/page_transition_types.h" 12 13namespace content { 14namespace { 15const uint32 kFilteredMessageClasses[] = { 16 FrameMsgStart, 17 ViewMsgStart, 18}; 19} // namespace 20 21ResourceSchedulerFilter::ResourceSchedulerFilter(int child_id) 22 : BrowserMessageFilter( 23 kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), 24 child_id_(child_id) { 25} 26 27ResourceSchedulerFilter::~ResourceSchedulerFilter() { 28} 29 30bool ResourceSchedulerFilter::OnMessageReceived(const IPC::Message& message) { 31 ResourceScheduler* scheduler = 32 ResourceDispatcherHostImpl::Get()->scheduler(); 33 // scheduler can be NULL during shutdown, in which case it's ok to ignore the 34 // renderer's messages. 35 if (!scheduler) 36 return false; 37 38 switch (message.type()) { 39 case FrameHostMsg_DidCommitProvisionalLoad::ID: { 40 PickleIterator iter(message); 41 FrameHostMsg_DidCommitProvisionalLoad_Params params; 42 if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>::Read( 43 &message, &iter, ¶ms)) { 44 break; 45 } 46 if (ui::PageTransitionIsMainFrame(params.transition) && 47 !params.was_within_same_page) { 48 // We need to track the RenderViewHost routing_id because of downstream 49 // dependencies (crbug.com/392171 DownloadRequestHandle, 50 // SaveFileManager, ResourceDispatcherHostImpl, MediaStreamUIProxy, 51 // SpeechRecognitionDispatcherHost and possibly others). They look up 52 // the view based on the ID stored in the resource requests. 53 // Once those dependencies are unwound or moved to RenderFrameHost 54 // (crbug.com/304341) we can move the client to be based on the 55 // routing_id of the RenderFrameHost. 56 scheduler->OnNavigate(child_id_, params.render_view_routing_id); 57 } 58 break; 59 } 60 61 case ViewHostMsg_WillInsertBody::ID: 62 scheduler->OnWillInsertBody(child_id_, message.routing_id()); 63 break; 64 65 default: 66 break; 67 } 68 69 return false; 70} 71 72} // namespace content 73