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