1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Use of this source code is governed by a BSD-style license that can be
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#ifndef CONTENT_PUBLIC_TEST_MOCK_RENDER_PROCESS_HOST_H_
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#define CONTENT_PUBLIC_TEST_MOCK_RENDER_PROCESS_HOST_H_
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "base/basictypes.h"
97ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com#include "base/memory/scoped_vector.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "base/observer_list.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "content/public/browser/render_process_host.h"
124991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "content/public/browser/render_process_host_factory.h"
138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "ipc/ipc_test_sink.h"
148b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass StoragePartition;
164991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com
174991b8f23482afc1494fd17647421ce68de53331robertphillips@google.comnamespace content {
184991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass MockRenderProcessHostFactory;
2073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// A mock render process host that has no corresponding renderer process.  All
227ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com// IPC messages are sent into the message sink for inspection by tests.
237ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.comclass MockRenderProcessHost : public RenderProcessHost {
247ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com public:
2573cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org  explicit MockRenderProcessHost(BrowserContext* browser_context);
267ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  virtual ~MockRenderProcessHost();
277bd141dce43ea3405bc60c9c84e6f910b851b079skia.committer@gmail.com
287ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  // Provides access to all IPC messages that would have been sent to the
297ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  // renderer via this RenderProcessHost.
307ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  IPC::TestSink& sink() { return sink_; }
317ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com
327ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  // Provides test access to how many times a bad message has been received.
337ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  int bad_msg_count() const { return bad_msg_count_; }
347ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com
357ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  // RenderProcessHost implementation (public portion).
367ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  virtual void EnableSendQueue() OVERRIDE;
377ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  virtual bool Init() OVERRIDE;
384e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual int GetNextRoutingID() OVERRIDE;
39038aff623d9fd47946cd31685f74cf473f7c84f0senorblanco@chromium.org  virtual void AddRoute(int32 routing_id, IPC::Listener* listener) OVERRIDE;
407ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  virtual void RemoveRoute(int32 routing_id) OVERRIDE;
4182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com  virtual void AddObserver(RenderProcessHostObserver* observer) OVERRIDE;
4282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com  virtual void RemoveObserver(RenderProcessHostObserver* observer) OVERRIDE;
43038aff623d9fd47946cd31685f74cf473f7c84f0senorblanco@chromium.org  virtual void ReceivedBadMessage() OVERRIDE;
44038aff623d9fd47946cd31685f74cf473f7c84f0senorblanco@chromium.org  virtual void WidgetRestored() OVERRIDE;
454868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual void WidgetHidden() OVERRIDE;
46fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com  virtual int VisibleWidgetCount() const OVERRIDE;
474868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual bool IsIsolatedGuest() const OVERRIDE;
484868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual StoragePartition* GetStoragePartition() const OVERRIDE;
497ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  virtual void AddWord(const base::string16& word);
507ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com  virtual bool FastShutdownIfPossible() OVERRIDE;
51038aff623d9fd47946cd31685f74cf473f7c84f0senorblanco@chromium.org  virtual bool FastShutdownStarted() const OVERRIDE;
524e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual void DumpHandles() OVERRIDE;
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual base::ProcessHandle GetHandle() const OVERRIDE;
544868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual int GetID() const OVERRIDE;
554868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual bool HasConnection() const OVERRIDE;
564e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual void SetIgnoreInputEvents(bool ignore_input_events) OVERRIDE;
57a6398911174d5445456ecb2f5f4f0565db2f100bjunov@google.com  virtual bool IgnoreInputEvents() const OVERRIDE;
58a6398911174d5445456ecb2f5f4f0565db2f100bjunov@google.com  virtual void Cleanup() OVERRIDE;
59a6398911174d5445456ecb2f5f4f0565db2f100bjunov@google.com  virtual void AddPendingView() OVERRIDE;
604868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual void RemovePendingView() OVERRIDE;
614e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual void SetSuddenTerminationAllowed(bool allowed) OVERRIDE;
624e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual bool SuddenTerminationAllowed() const OVERRIDE;
634e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual BrowserContext* GetBrowserContext() const OVERRIDE;
644868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  virtual bool InSameStoragePartition(
654868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org      StoragePartition* partition) const OVERRIDE;
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual IPC::ChannelProxy* GetChannel() OVERRIDE;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void AddFilter(BrowserMessageFilter* filter) OVERRIDE;
688b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org  virtual bool FastShutdownForPageCount(size_t count) OVERRIDE;
696bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com  virtual base::TimeDelta GetChildProcessIdleTime() const OVERRIDE;
706bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com  virtual void ResumeRequestsForView(int route_id) OVERRIDE;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void FilterURL(bool empty_allowed, GURL* url) OVERRIDE;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(ENABLE_WEBRTC)
73c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  virtual void EnableAecDump(const base::FilePath& file) OVERRIDE;
74353482251e61971a8cf3a60bbb6910f482be634freed@google.com  virtual void DisableAecDump() OVERRIDE;
75353482251e61971a8cf3a60bbb6910f482be634freed@google.com  virtual void SetWebRtcLogMessageCallback(
76c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com      base::Callback<void(const std::string&)> callback) OVERRIDE;
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual WebRtcStopRtpDumpCallback StartRtpDump(
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      bool incoming,
794e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com      bool outgoing,
8082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com      const WebRtcRtpPacketCallback& packet_callback) OVERRIDE;
814868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org#endif
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void ResumeDeferredNavigation(const GlobalRequestID& request_id)
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      OVERRIDE;
848b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org  virtual void NotifyTimezoneChange() OVERRIDE;
8554924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com  virtual ServiceRegistry* GetServiceRegistry() OVERRIDE;
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // IPC::Sender via RenderProcessHost.
88c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  virtual bool Send(IPC::Message* msg) OVERRIDE;
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
904868e6b221a4a98e40f977851af5fcf09631ea15senorblanco@chromium.org  // IPC::Listener via RenderProcessHost.
91c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9479fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  // Attaches the factory object so we can remove this object in its destructor
9579fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  // and prevent MockRenderProcessHostFacotry from deleting it.
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void SetFactory(const MockRenderProcessHostFactory* factory) {
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    factory_ = factory;
9879fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  }
9979fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org
10079fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  int GetActiveViewCount();
10179fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org
10279fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  void set_is_isolated_guest(bool is_isolated_guest) {
10379fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org    is_isolated_guest_ = is_isolated_guest;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
1054e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com
1064e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  void SetProcessHandle(scoped_ptr<base::ProcessHandle> new_handle) {
1074e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com    process_handle = new_handle.Pass();
1084e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  }
1094e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com
1104e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com private:
11156c69773aea56c6c6bd47bc7e7970dd081205184djsollen@google.com  // Stores IPC messages that would have been sent to the renderer.
112f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com  IPC::TestSink sink_;
11379fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  int bad_msg_count_;
114f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com  const MockRenderProcessHostFactory* factory_;
115f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com  int id_;
116f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com  BrowserContext* browser_context_;
117f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com  ObserverList<RenderProcessHostObserver> observers_;
118f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com
11979fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  IDMap<RenderWidgetHost> render_widget_hosts_;
120f5dbe2f00f853c6a1719924bdd0c33335a53423adjsollen@google.com  int prev_routing_id_;
12179fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  IDMap<IPC::Listener> listeners_;
12279fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  bool fast_shutdown_started_;
12374e608cdc1e13593b54d54f11e65c1c309d19370commit-bot@chromium.org  bool deletion_callback_called_;
12479fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org  bool is_isolated_guest_;
1254e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  scoped_ptr<base::ProcessHandle> process_handle;
12679fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org
1274e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  DISALLOW_COPY_AND_ASSIGN(MockRenderProcessHost);
1284e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com};
12979fbb40bca9d815ef79b896b31ba6ee736817e0fcommit-bot@chromium.org
1304e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.comclass MockRenderProcessHostFactory : public RenderProcessHostFactory {
1314e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com public:
1324e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  MockRenderProcessHostFactory();
1334e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual ~MockRenderProcessHostFactory();
1344e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com
1354e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  virtual RenderProcessHost* CreateRenderProcessHost(
1364e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com      BrowserContext* browser_context,
1374e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com      SiteInstance* site_instance) const OVERRIDE;
1384e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com
1394e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com  // Removes the given MockRenderProcessHost from the MockRenderProcessHost list
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // without deleting it. When a test deletes a MockRenderProcessHost, we need
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // to remove it from |processes_| to prevent it from being deleted twice.
1424991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com  void Remove(MockRenderProcessHost* host) const;
1430f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org
1444991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com private:
1454991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com  // A list of MockRenderProcessHosts created by this object. This list is used
1464991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com  // for deleting all MockRenderProcessHosts that have not deleted by a test in
1474991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com  // the destructor and prevent them from being leaked.
1484991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com  mutable ScopedVector<MockRenderProcessHost> processes_;
1494991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com
1504991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com  DISALLOW_COPY_AND_ASSIGN(MockRenderProcessHostFactory);
1514991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com};
1524991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com
1534991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com}  // namespace content
1544991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com
1554991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#endif  // CONTENT_PUBLIC_TEST_MOCK_RENDER_PROCESS_HOST_H_
1564991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com