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