12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_scheduler_filter.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_scheduler.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/frame_messages.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/view_messages.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kFilteredMessageClasses[] = { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsgStart, 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ViewMsgStart, 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceSchedulerFilter::ResourceSchedulerFilter(int child_id) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter( 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_id_(child_id) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceSchedulerFilter::~ResourceSchedulerFilter() { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ResourceSchedulerFilter::OnMessageReceived(const IPC::Message& message) { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceScheduler* scheduler = 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceDispatcherHostImpl::Get()->scheduler(); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // scheduler can be NULL during shutdown, in which case it's ok to ignore the 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // renderer's messages. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!scheduler) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (message.type()) { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case FrameHostMsg_DidCommitProvisionalLoad::ID: { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PickleIterator iter(message); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameHostMsg_DidCommitProvisionalLoad_Params params; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>::Read( 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &message, &iter, ¶ms)) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ui::PageTransitionIsMainFrame(params.transition) && 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !params.was_within_same_page) { 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // We need to track the RenderViewHost routing_id because of downstream 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // dependencies (crbug.com/392171 DownloadRequestHandle, 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SaveFileManager, ResourceDispatcherHostImpl, MediaStreamUIProxy, 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SpeechRecognitionDispatcherHost and possibly others). They look up 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the view based on the ID stored in the resource requests. 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Once those dependencies are unwound or moved to RenderFrameHost 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // (crbug.com/304341) we can move the client to be based on the 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // routing_id of the RenderFrameHost. 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scheduler->OnNavigate(child_id_, params.render_view_routing_id); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ViewHostMsg_WillInsertBody::ID: 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scheduler->OnWillInsertBody(child_id_, message.routing_id()); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 73