15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/mock_browser_plugin_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/mock_browser_plugin.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockBrowserPluginManager::MockBrowserPluginManager(
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewImpl* render_view)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : BrowserPluginManager(render_view),
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      guest_instance_id_counter_(0),
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      last_plugin_(NULL) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockBrowserPluginManager::~MockBrowserPluginManager() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin* MockBrowserPluginManager::CreateBrowserPlugin(
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    RenderViewImpl* render_view,
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    blink::WebFrame* frame,
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool auto_navigate) {
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  last_plugin_ = new MockBrowserPlugin(render_view, frame, auto_navigate);
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return last_plugin_;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockBrowserPluginManager::AllocateInstanceID(
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    BrowserPlugin* browser_plugin) {
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AllocateInstanceIDACK(browser_plugin, ++guest_instance_id_counter_);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockBrowserPluginManager::AllocateInstanceIDACK(
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPlugin* browser_plugin,
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int guest_instance_id) {
409ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  scoped_ptr<base::DictionaryValue> extra_params(new base::DictionaryValue());
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  browser_plugin->Attach(guest_instance_id, extra_params.Pass());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockBrowserPluginManager::Send(IPC::Message* msg) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a copy-and-paste from MockRenderThread::Send.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to simulate a synchronous channel, thus we are going to receive
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // through this function messages, messages with reply and reply messages.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can only handle one synchronous message at a time.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (msg->is_reply()) {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (reply_deserializer_) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_deserializer_->SerializeOutputParameters(*msg);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_deserializer_.reset();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg->is_sync()) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We actually need to handle deleting the reply deserializer for sync
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // messages.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply_deserializer_.reset(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnMessageReceived(*msg);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete msg;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockBrowserPluginManager::OnMessageReceived(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the message in the sink.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sink_.OnMessageReceived(message);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
75