Home | History | Annotate | Download | only in loader
      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 
     13 namespace content {
     14 namespace {
     15 const uint32 kFilteredMessageClasses[] = {
     16   FrameMsgStart,
     17   ViewMsgStart,
     18 };
     19 }  // namespace
     20 
     21 ResourceSchedulerFilter::ResourceSchedulerFilter(int child_id)
     22     : BrowserMessageFilter(
     23           kFilteredMessageClasses, arraysize(kFilteredMessageClasses)),
     24       child_id_(child_id) {
     25 }
     26 
     27 ResourceSchedulerFilter::~ResourceSchedulerFilter() {
     28 }
     29 
     30 bool 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, &params)) {
     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