Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / browser / loader / resource_scheduler_filter.cc
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 "content/public/common/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 (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