12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_scheduler_filter.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_scheduler.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/frame_messages.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/view_messages.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kFilteredMessageClasses[] = {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FrameMsgStart,
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ViewMsgStart,
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceSchedulerFilter::ResourceSchedulerFilter(int child_id)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kFilteredMessageClasses, arraysize(kFilteredMessageClasses)),
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      child_id_(child_id) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceSchedulerFilter::~ResourceSchedulerFilter() {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ResourceSchedulerFilter::OnMessageReceived(const IPC::Message& message) {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceScheduler* scheduler =
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ResourceDispatcherHostImpl::Get()->scheduler();
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // scheduler can be NULL during shutdown, in which case it's ok to ignore the
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // renderer's messages.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!scheduler)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (message.type()) {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case FrameHostMsg_DidCommitProvisionalLoad::ID: {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PickleIterator iter(message);
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FrameHostMsg_DidCommitProvisionalLoad_Params params;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>::Read(
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &message, &iter, &params)) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ui::PageTransitionIsMainFrame(params.transition) &&
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !params.was_within_same_page) {
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // We need to track the RenderViewHost routing_id because of downstream
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // dependencies (crbug.com/392171 DownloadRequestHandle,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // SaveFileManager, ResourceDispatcherHostImpl, MediaStreamUIProxy,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // SpeechRecognitionDispatcherHost and possibly others). They look up
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // the view based on the ID stored in the resource requests.
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // Once those dependencies are unwound or moved to RenderFrameHost
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // (crbug.com/304341) we can move the client to be based on the
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // routing_id of the RenderFrameHost.
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        scheduler->OnNavigate(child_id_, params.render_view_routing_id);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ViewHostMsg_WillInsertBody::ID:
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scheduler->OnWillInsertBody(child_id_, message.routing_id());
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
73