• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ResourceSchedulerFilter(int child_id)21 ResourceSchedulerFilter::ResourceSchedulerFilter(int child_id)
22     : BrowserMessageFilter(
23           kFilteredMessageClasses, arraysize(kFilteredMessageClasses)),
24       child_id_(child_id) {
25 }
26 
~ResourceSchedulerFilter()27 ResourceSchedulerFilter::~ResourceSchedulerFilter() {
28 }
29 
OnMessageReceived(const IPC::Message & message)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