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, ¶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