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)#ifndef CONTENT_PUBLIC_TEST_MOCK_RENDER_THREAD_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_TEST_MOCK_RENDER_THREAD_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/observer_list.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_test_sink.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPopupType.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ViewHostMsg_CreateWindow_Params;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MessageFilter;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageReplyDeserializer;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is a very simple mock of RenderThread. It simulates an IPC channel
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which supports only three messages:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewHostMsg_CreateWidget : sync message sent by the Widget.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewHostMsg_CreateWindow : sync message sent by the Widget.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewMsg_Close : async, send to the Widget.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRenderThread : public RenderThread {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRenderThread();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockRenderThread();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provides access to the messages that have been received by this thread.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::TestSink& sink() { return sink_; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderThread implementation:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual base::MessageLoop* GetMessageLoop() OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual IPC::SyncChannel* GetChannel() OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetLocale() OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual IPC::SyncMessageFilter* GetSyncMessageFilter() OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy()
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddRoute(int32 routing_id, IPC::Listener* listener) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveRoute(int32 routing_id) OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GenerateRoutingID() OVERRIDE;
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void AddFilter(IPC::MessageFilter* filter) OVERRIDE;
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void RemoveFilter(IPC::MessageFilter* filter) OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddObserver(RenderProcessObserver* observer) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveObserver(RenderProcessObserver* observer) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetResourceDispatcherDelegate(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceDispatcherDelegate* delegate) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnsureWebKitInitialized() OVERRIDE;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RecordAction(const base::UserMetricsAction& action) OVERRIDE;
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void RecordComputedAction(const std::string& action) OVERRIDE;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<base::SharedMemory> HostAllocateSharedMemoryBuffer(
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      size_t buffer_size) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterExtension(v8::Extension* extension) OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ScheduleIdleHandler(int64 initial_delay_ms) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void IdleHandler() OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int64 GetIdleNotificationDelayInMs() const OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetIdleNotificationDelayInMs(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 idle_notification_delay_in_ms) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateHistograms(int sequence_number) OVERRIDE;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int PostTaskToAllWebWorkers(const base::Closure& closure) OVERRIDE;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ResolveProxy(const GURL& url, std::string* proxy_list) OVERRIDE;
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::WaitableEvent* GetShutdownEvent() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PreCacheFont(const LOGFONT& log_font) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReleaseCachedFonts() OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ServiceRegistry* GetServiceRegistry() OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //////////////////////////////////////////////////////////////////////////
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following functions are called by the test itself.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_routing_id(int32 id) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    routing_id_ = id;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_surface_id(int32 id) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    surface_id_ = id;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 opener_id() const {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return opener_id_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_new_window_routing_id(int32 id) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_window_routing_id_ = id;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_new_frame_routing_id(int32 id) {
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_frame_routing_id_ = id;
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates the Widget receiving a close message. This should result
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on releasing the internal reference counts and destroying the internal
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendCloseMessage();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Dispatches control messages to observers.
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool OnControlMessageReceived(const IPC::Message& msg);
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ObserverList<RenderProcessObserver>& observers() {
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return observers_;
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function operates as a regular IPC listener. Subclasses
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overriding this should first delegate to this implementation.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Widget expects to be returned valid route_id.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCreateWidget(int opener_id,
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      blink::WebPopupType popup_type,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      int* route_id,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      int* surface_id);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The View expects to be returned a valid route_id different from its own.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not keep track of the newly created widget in MockRenderThread,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so it must be cleaned up on its own.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCreateWindow(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_CreateWindow_Params& params,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* route_id,
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int* main_frame_route_id,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* surface_id,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* cloned_session_storage_namespace_id);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The Frame expects to be returned a valid route_id different from its own.
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnCreateChildFrame(int new_frame_routing_id,
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const std::string& frame_name,
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          int* new_render_frame_id);
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDuplicateSection(base::SharedMemoryHandle renderer_handle,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          base::SharedMemoryHandle* browser_handle);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::TestSink sink_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Routing id what will be assigned to the Widget.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 routing_id_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Surface id what will be assigned to the Widget.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 surface_id_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opener id reported by the Widget.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 opener_id_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Routing id that will be assigned to a CreateWindow Widget.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 new_window_routing_id_;
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int32 new_window_main_frame_routing_id_;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32 new_frame_routing_id_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last known good deserializer for sync messages.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IPC::MessageReplyDeserializer> reply_deserializer_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A list of message filters added to this thread.
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::vector<scoped_refptr<IPC::MessageFilter> > filters_;
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Observers to notify.
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ObserverList<RenderProcessObserver> observers_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_TEST_MOCK_RENDER_THREAD_H_
171