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 #ifndef CONTENT_PUBLIC_TEST_MOCK_RENDER_THREAD_H_ 6 #define CONTENT_PUBLIC_TEST_MOCK_RENDER_THREAD_H_ 7 8 #include "base/memory/shared_memory.h" 9 #include "base/observer_list.h" 10 #include "base/strings/string16.h" 11 #include "content/public/renderer/render_thread.h" 12 #include "ipc/ipc_test_sink.h" 13 #include "ipc/message_filter.h" 14 #include "third_party/WebKit/public/web/WebPopupType.h" 15 16 struct ViewHostMsg_CreateWindow_Params; 17 18 namespace IPC { 19 class MessageFilter; 20 class MessageReplyDeserializer; 21 } 22 23 namespace content { 24 25 // This class is a very simple mock of RenderThread. It simulates an IPC channel 26 // which supports only three messages: 27 // ViewHostMsg_CreateWidget : sync message sent by the Widget. 28 // ViewHostMsg_CreateWindow : sync message sent by the Widget. 29 // ViewMsg_Close : async, send to the Widget. 30 class MockRenderThread : public RenderThread { 31 public: 32 MockRenderThread(); 33 virtual ~MockRenderThread(); 34 35 // Provides access to the messages that have been received by this thread. 36 IPC::TestSink& sink() { return sink_; } 37 38 // RenderThread implementation: 39 virtual bool Send(IPC::Message* msg) OVERRIDE; 40 virtual base::MessageLoop* GetMessageLoop() OVERRIDE; 41 virtual IPC::SyncChannel* GetChannel() OVERRIDE; 42 virtual std::string GetLocale() OVERRIDE; 43 virtual IPC::SyncMessageFilter* GetSyncMessageFilter() OVERRIDE; 44 virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() 45 OVERRIDE; 46 virtual void AddRoute(int32 routing_id, IPC::Listener* listener) OVERRIDE; 47 virtual void RemoveRoute(int32 routing_id) OVERRIDE; 48 virtual int GenerateRoutingID() OVERRIDE; 49 virtual void AddFilter(IPC::MessageFilter* filter) OVERRIDE; 50 virtual void RemoveFilter(IPC::MessageFilter* filter) OVERRIDE; 51 virtual void AddObserver(RenderProcessObserver* observer) OVERRIDE; 52 virtual void RemoveObserver(RenderProcessObserver* observer) OVERRIDE; 53 virtual void SetResourceDispatcherDelegate( 54 ResourceDispatcherDelegate* delegate) OVERRIDE; 55 virtual void EnsureWebKitInitialized() OVERRIDE; 56 virtual void RecordAction(const base::UserMetricsAction& action) OVERRIDE; 57 virtual void RecordComputedAction(const std::string& action) OVERRIDE; 58 virtual scoped_ptr<base::SharedMemory> HostAllocateSharedMemoryBuffer( 59 size_t buffer_size) OVERRIDE; 60 virtual void RegisterExtension(v8::Extension* extension) OVERRIDE; 61 virtual void ScheduleIdleHandler(int64 initial_delay_ms) OVERRIDE; 62 virtual void IdleHandler() OVERRIDE; 63 virtual int64 GetIdleNotificationDelayInMs() const OVERRIDE; 64 virtual void SetIdleNotificationDelayInMs( 65 int64 idle_notification_delay_in_ms) OVERRIDE; 66 virtual void UpdateHistograms(int sequence_number) OVERRIDE; 67 virtual int PostTaskToAllWebWorkers(const base::Closure& closure) OVERRIDE; 68 virtual bool ResolveProxy(const GURL& url, std::string* proxy_list) OVERRIDE; 69 virtual base::WaitableEvent* GetShutdownEvent() OVERRIDE; 70 #if defined(OS_WIN) 71 virtual void PreCacheFont(const LOGFONT& log_font) OVERRIDE; 72 virtual void ReleaseCachedFonts() OVERRIDE; 73 #endif 74 75 ////////////////////////////////////////////////////////////////////////// 76 // The following functions are called by the test itself. 77 78 void set_routing_id(int32 id) { 79 routing_id_ = id; 80 } 81 82 void set_surface_id(int32 id) { 83 surface_id_ = id; 84 } 85 86 int32 opener_id() const { 87 return opener_id_; 88 } 89 90 void set_new_window_routing_id(int32 id) { 91 new_window_routing_id_ = id; 92 } 93 94 void set_new_frame_routing_id(int32 id) { 95 new_frame_routing_id_ = id; 96 } 97 98 // Simulates the Widget receiving a close message. This should result 99 // on releasing the internal reference counts and destroying the internal 100 // state. 101 void SendCloseMessage(); 102 103 // Dispatches control messages to observers. 104 bool OnControlMessageReceived(const IPC::Message& msg); 105 106 ObserverList<RenderProcessObserver>& observers() { 107 return observers_; 108 } 109 110 protected: 111 // This function operates as a regular IPC listener. Subclasses 112 // overriding this should first delegate to this implementation. 113 virtual bool OnMessageReceived(const IPC::Message& msg); 114 115 // The Widget expects to be returned valid route_id. 116 void OnCreateWidget(int opener_id, 117 blink::WebPopupType popup_type, 118 int* route_id, 119 int* surface_id); 120 121 // The View expects to be returned a valid route_id different from its own. 122 // We do not keep track of the newly created widget in MockRenderThread, 123 // so it must be cleaned up on its own. 124 void OnCreateWindow( 125 const ViewHostMsg_CreateWindow_Params& params, 126 int* route_id, 127 int* main_frame_route_id, 128 int* surface_id, 129 int64* cloned_session_storage_namespace_id); 130 131 // The Frame expects to be returned a valid route_id different from its own. 132 void OnCreateChildFrame(int new_frame_routing_id, 133 const std::string& frame_name, 134 int* new_render_frame_id); 135 136 #if defined(OS_WIN) 137 void OnDuplicateSection(base::SharedMemoryHandle renderer_handle, 138 base::SharedMemoryHandle* browser_handle); 139 #endif 140 141 IPC::TestSink sink_; 142 143 // Routing id what will be assigned to the Widget. 144 int32 routing_id_; 145 146 // Surface id what will be assigned to the Widget. 147 int32 surface_id_; 148 149 // Opener id reported by the Widget. 150 int32 opener_id_; 151 152 // Routing id that will be assigned to a CreateWindow Widget. 153 int32 new_window_routing_id_; 154 int32 new_window_main_frame_routing_id_; 155 int32 new_frame_routing_id_; 156 157 // The last known good deserializer for sync messages. 158 scoped_ptr<IPC::MessageReplyDeserializer> reply_deserializer_; 159 160 // A list of message filters added to this thread. 161 std::vector<scoped_refptr<IPC::MessageFilter> > filters_; 162 163 // Observers to notify. 164 ObserverList<RenderProcessObserver> observers_; 165 }; 166 167 } // namespace content 168 169 #endif // CONTENT_PUBLIC_TEST_MOCK_RENDER_THREAD_H_ 170