Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / test / test_render_view_host.h
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_TEST_TEST_RENDER_VIEW_HOST_H_
6 #define CONTENT_TEST_TEST_RENDER_VIEW_HOST_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/gtest_prod_util.h"
13 #include "build/build_config.h"
14 #include "content/browser/renderer_host/render_view_host_impl.h"
15 #include "content/browser/renderer_host/render_widget_host_view_base.h"
16 #include "content/public/common/page_transition_types.h"
17 #include "content/public/test/test_renderer_host.h"
18 #include "content/test/test_render_frame_host.h"
19 #include "ui/base/layout.h"
20 #include "ui/gfx/vector2d_f.h"
21
22 // This file provides a testing framework for mocking out the RenderProcessHost
23 // layer. It allows you to test RenderViewHost, WebContentsImpl,
24 // NavigationController, and other layers above that without running an actual
25 // renderer process.
26 //
27 // To use, derive your test base class from RenderViewHostImplTestHarness.
28
29 struct FrameHostMsg_DidCommitProvisionalLoad_Params;
30
31 namespace gfx {
32 class Rect;
33 }
34
35 namespace content {
36
37 class SiteInstance;
38 class TestRenderFrameHost;
39 class TestWebContents;
40
41 // Utility function to initialize ViewHostMsg_NavigateParams_Params
42 // with given |page_id|, |url| and |transition_type|.
43 void InitNavigateParams(FrameHostMsg_DidCommitProvisionalLoad_Params* params,
44                         int page_id,
45                         const GURL& url,
46                         PageTransition transition_type);
47
48 // TestRenderViewHostView ------------------------------------------------------
49
50 // Subclass the RenderViewHost's view so that we can call Show(), etc.,
51 // without having side-effects.
52 class TestRenderWidgetHostView : public RenderWidgetHostViewBase {
53  public:
54   explicit TestRenderWidgetHostView(RenderWidgetHost* rwh);
55   virtual ~TestRenderWidgetHostView();
56
57   // RenderWidgetHostView implementation.
58   virtual void InitAsChild(gfx::NativeView parent_view) OVERRIDE {}
59   virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE;
60   virtual void SetSize(const gfx::Size& size) OVERRIDE {}
61   virtual void SetBounds(const gfx::Rect& rect) OVERRIDE {}
62   virtual gfx::NativeView GetNativeView() const OVERRIDE;
63   virtual gfx::NativeViewId GetNativeViewId() const OVERRIDE;
64   virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE;
65   virtual bool HasFocus() const OVERRIDE;
66   virtual bool IsSurfaceAvailableForCopy() const OVERRIDE;
67   virtual void Show() OVERRIDE;
68   virtual void Hide() OVERRIDE;
69   virtual bool IsShowing() OVERRIDE;
70   virtual gfx::Rect GetViewBounds() const OVERRIDE;
71 #if defined(OS_MACOSX)
72   virtual void SetActive(bool active) OVERRIDE;
73   virtual void SetTakesFocusOnlyOnMouseDown(bool flag) OVERRIDE {}
74   virtual void SetWindowVisibility(bool visible) OVERRIDE {}
75   virtual void WindowFrameChanged() OVERRIDE {}
76   virtual void ShowDefinitionForSelection() OVERRIDE {}
77   virtual bool SupportsSpeech() const OVERRIDE;
78   virtual void SpeakSelection() OVERRIDE;
79   virtual bool IsSpeaking() const OVERRIDE;
80   virtual void StopSpeaking() OVERRIDE;
81 #endif  // defined(OS_MACOSX)
82 #if defined(TOOLKIT_GTK)
83   virtual GdkEventButton* GetLastMouseDown() OVERRIDE;
84   virtual gfx::NativeView BuildInputMethodsGtkMenu() OVERRIDE;
85 #endif  // defined(TOOLKIT_GTK)
86   virtual void OnSwapCompositorFrame(
87       uint32 output_surface_id,
88       scoped_ptr<cc::CompositorFrame> frame) OVERRIDE;
89
90   // RenderWidgetHostViewPort implementation.
91   virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
92                            const gfx::Rect& pos) OVERRIDE {}
93   virtual void InitAsFullscreen(
94       RenderWidgetHostView* reference_host_view) OVERRIDE {}
95   virtual void WasShown() OVERRIDE {}
96   virtual void WasHidden() OVERRIDE {}
97   virtual void MovePluginWindows(
98       const gfx::Vector2d& scroll_offset,
99       const std::vector<WebPluginGeometry>& moves) OVERRIDE {}
100   virtual void Focus() OVERRIDE {}
101   virtual void Blur() OVERRIDE {}
102   virtual void SetIsLoading(bool is_loading) OVERRIDE {}
103   virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE {}
104   virtual void TextInputTypeChanged(ui::TextInputType type,
105                                     ui::TextInputMode input_mode,
106                                     bool can_compose_inline) OVERRIDE {}
107   virtual void ImeCancelComposition() OVERRIDE {}
108 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA)
109   virtual void ImeCompositionRangeChanged(
110       const gfx::Range& range,
111       const std::vector<gfx::Rect>& character_bounds) OVERRIDE {}
112 #endif
113   virtual void DidUpdateBackingStore(
114       const gfx::Rect& scroll_rect,
115       const gfx::Vector2d& scroll_delta,
116       const std::vector<gfx::Rect>& rects,
117       const std::vector<ui::LatencyInfo>& latency_info) OVERRIDE {}
118   virtual void RenderProcessGone(base::TerminationStatus status,
119                                  int error_code) OVERRIDE;
120   virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) { }
121   virtual void Destroy() OVERRIDE;
122   virtual void SetTooltipText(const base::string16& tooltip_text) OVERRIDE {}
123   virtual void SelectionBoundsChanged(
124       const ViewHostMsg_SelectionBounds_Params& params) OVERRIDE {}
125   virtual void ScrollOffsetChanged() OVERRIDE {}
126   virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE;
127   virtual void CopyFromCompositingSurface(
128       const gfx::Rect& src_subrect,
129       const gfx::Size& dst_size,
130       const base::Callback<void(bool, const SkBitmap&)>& callback,
131       const SkBitmap::Config config) OVERRIDE;
132   virtual void CopyFromCompositingSurfaceToVideoFrame(
133       const gfx::Rect& src_subrect,
134       const scoped_refptr<media::VideoFrame>& target,
135       const base::Callback<void(bool)>& callback) OVERRIDE;
136   virtual bool CanCopyToVideoFrame() const OVERRIDE;
137   virtual void OnAcceleratedCompositingStateChange() OVERRIDE;
138   virtual void AcceleratedSurfaceInitialized(int host_id,
139                                              int route_id) OVERRIDE;
140   virtual void AcceleratedSurfaceBuffersSwapped(
141       const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
142       int gpu_host_id) OVERRIDE;
143   virtual void AcceleratedSurfacePostSubBuffer(
144       const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
145       int gpu_host_id) OVERRIDE;
146   virtual void AcceleratedSurfaceSuspend() OVERRIDE;
147   virtual void AcceleratedSurfaceRelease() OVERRIDE {}
148   virtual bool HasAcceleratedSurface(const gfx::Size& desired_size) OVERRIDE;
149 #if defined(OS_MACOSX)
150   virtual bool PostProcessEventForPluginIme(
151       const NativeWebKeyboardEvent& event) OVERRIDE;
152 #elif defined(OS_ANDROID)
153   virtual void ShowDisambiguationPopup(
154       const gfx::Rect& target_rect,
155       const SkBitmap& zoomed_bitmap) OVERRIDE {}
156 #endif
157   virtual void GetScreenInfo(blink::WebScreenInfo* results) OVERRIDE {}
158   virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE;
159   virtual void SetHasHorizontalScrollbar(
160       bool has_horizontal_scrollbar) OVERRIDE { }
161   virtual void SetScrollOffsetPinning(
162       bool is_pinned_to_left, bool is_pinned_to_right) OVERRIDE { }
163   virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE;
164   virtual bool LockMouse() OVERRIDE;
165   virtual void UnlockMouse() OVERRIDE;
166 #if defined(OS_WIN)
167   virtual void SetParentNativeViewAccessible(
168       gfx::NativeViewAccessible accessible_parent) OVERRIDE;
169   virtual gfx::NativeViewId GetParentForWindowlessPlugin() const OVERRIDE;
170 #endif
171
172   bool is_showing() const { return is_showing_; }
173   bool did_swap_compositor_frame() const { return did_swap_compositor_frame_; }
174
175  protected:
176   RenderWidgetHostImpl* rwh_;
177
178  private:
179   bool is_showing_;
180   bool did_swap_compositor_frame_;
181 };
182
183 #if defined(COMPILER_MSVC)
184 // See comment for same warning on RenderViewHostImpl.
185 #pragma warning(push)
186 #pragma warning(disable: 4250)
187 #endif
188
189 // TestRenderViewHost ----------------------------------------------------------
190
191 // TODO(brettw) this should use a TestWebContents which should be generalized
192 // from the WebContentsImpl test. We will probably also need that class' version
193 // of CreateRenderViewForRenderManager when more complicated tests start using
194 // this.
195 //
196 // Note that users outside of content must use this class by getting
197 // the separate RenderViewHostTester interface via
198 // RenderViewHostTester::For(rvh) on the RenderViewHost they want to
199 // drive tests on.
200 //
201 // Users within content may directly static_cast from a
202 // RenderViewHost* to a TestRenderViewHost*.
203 //
204 // The reasons we do it this way rather than extending the parallel
205 // inheritance hierarchy we have for RenderWidgetHost/RenderViewHost
206 // vs. RenderWidgetHostImpl/RenderViewHostImpl are:
207 //
208 // a) Extending the parallel class hierarchy further would require
209 // more classes to use virtual inheritance.  This is a complexity that
210 // is better to avoid, especially when it would be introduced in the
211 // production code solely to facilitate testing code.
212 //
213 // b) While users outside of content only need to drive tests on a
214 // RenderViewHost, content needs a test version of the full
215 // RenderViewHostImpl so that it can test all methods on that concrete
216 // class (e.g. overriding a method such as
217 // RenderViewHostImpl::CreateRenderView).  This would have complicated
218 // the dual class hierarchy even further.
219 //
220 // The reason we do it this way instead of using composition is
221 // similar to (b) above, essentially it gets very tricky.  By using
222 // the split interface we avoid complexity within content and maintain
223 // reasonable utility for embedders.
224 class TestRenderViewHost
225     : public RenderViewHostImpl,
226       public RenderViewHostTester {
227  public:
228   TestRenderViewHost(SiteInstance* instance,
229                      RenderViewHostDelegate* delegate,
230                      RenderWidgetHostDelegate* widget_delegate,
231                      int routing_id,
232                      int main_frame_routing_id,
233                      bool swapped_out);
234   virtual ~TestRenderViewHost();
235
236   // RenderViewHostTester implementation.  Note that CreateRenderView
237   // is not specified since it is synonymous with the one from
238   // RenderViewHostImpl, see below.
239   virtual void SendShouldCloseACK(bool proceed) OVERRIDE;
240   virtual void SetContentsMimeType(const std::string& mime_type) OVERRIDE;
241   virtual void SimulateSwapOutACK() OVERRIDE;
242   virtual void SimulateWasHidden() OVERRIDE;
243   virtual void SimulateWasShown() OVERRIDE;
244
245   // NOTE: These methods are deprecated and the equivalents in
246   // TestRenderFrameHost should be used.
247   virtual void SendNavigate(int page_id, const GURL& url) OVERRIDE;
248   virtual void SendFailedNavigate(int page_id, const GURL& url) OVERRIDE;
249   virtual void SendNavigateWithTransition(int page_id, const GURL& url,
250                                           PageTransition transition) OVERRIDE;
251
252   // Calls OnNavigate on the RenderViewHost with the given information,
253   // including a custom original request URL.  Sets the rest of the
254   // parameters in the message to the "typical" values.  This is a helper
255   // function for simulating the most common types of loads.
256   void SendNavigateWithOriginalRequestURL(
257       int page_id, const GURL& url, const GURL& original_request_url);
258
259   void SendNavigateWithFile(
260       int page_id, const GURL& url, const base::FilePath& file_path);
261
262   void SendNavigateWithParams(
263       FrameHostMsg_DidCommitProvisionalLoad_Params* params);
264
265   void TestOnUpdateStateWithFile(
266       int process_id, const base::FilePath& file_path);
267
268   void TestOnStartDragging(const DropData& drop_data);
269
270   // If set, *delete_counter is incremented when this object destructs.
271   void set_delete_counter(int* delete_counter) {
272     delete_counter_ = delete_counter;
273   }
274
275   // Sets whether the RenderView currently exists or not. This controls the
276   // return value from IsRenderViewLive, which the rest of the system uses to
277   // check whether the RenderView has crashed or not.
278   void set_render_view_created(bool created) {
279     render_view_created_ = created;
280   }
281
282   // Returns whether the RenderViewHost is currently waiting to hear the result
283   // of a before unload handler from the renderer.
284   bool is_waiting_for_beforeunload_ack() const {
285     return is_waiting_for_beforeunload_ack_;
286   }
287
288   // Sets whether the RenderViewHost is currently swapped out, and thus
289   // filtering messages from the renderer.
290   void set_rvh_state(RenderViewHostImplState rvh_state) {
291     rvh_state_ = rvh_state;
292   }
293
294   // If set, navigations will appear to have loaded through a proxy
295   // (ViewHostMsg_FrameNavigte_Params::was_fetched_via_proxy).
296   // False by default.
297   void set_simulate_fetch_via_proxy(bool proxy);
298
299   // If set, navigations will appear to have cleared the history list in the
300   // RenderView
301   // (FrameHostMsg_DidCommitProvisionalLoad_Params::history_list_was_cleared).
302   // False by default.
303   void set_simulate_history_list_was_cleared(bool cleared);
304
305   // The opener route id passed to CreateRenderView().
306   int opener_route_id() const { return opener_route_id_; }
307
308   // TODO(creis): Remove the need for these methods.
309   TestRenderFrameHost* main_render_frame_host() const {
310     return main_render_frame_host_;
311   }
312   void set_main_render_frame_host(TestRenderFrameHost* rfh) {
313     main_render_frame_host_ = rfh;
314   }
315
316   // RenderViewHost overrides --------------------------------------------------
317
318   virtual bool CreateRenderView(const base::string16& frame_name,
319                                 int opener_route_id,
320                                 int32 max_page_id) OVERRIDE;
321   virtual bool IsRenderViewLive() const OVERRIDE;
322
323  private:
324   FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, FilterNavigate);
325
326   void SendNavigateWithTransitionAndResponseCode(int page_id,
327                                                  const GURL& url,
328                                                  PageTransition transition,
329                                                  int response_code);
330
331   // Calls OnNavigate on the RenderViewHost with the given information.
332   // Sets the rest of the parameters in the message to the "typical" values.
333   // This is a helper function for simulating the most common types of loads.
334   void SendNavigateWithParameters(
335       int page_id,
336       const GURL& url,
337       PageTransition transition,
338       const GURL& original_request_url,
339       int response_code,
340       const base::FilePath* file_path_for_history_item);
341
342   // Tracks if the caller thinks if it created the RenderView. This is so we can
343   // respond to IsRenderViewLive appropriately.
344   bool render_view_created_;
345
346   // See set_delete_counter() above. May be NULL.
347   int* delete_counter_;
348
349   // See set_simulate_fetch_via_proxy() above.
350   bool simulate_fetch_via_proxy_;
351
352   // See set_simulate_history_list_was_cleared() above.
353   bool simulate_history_list_was_cleared_;
354
355   // See SetContentsMimeType() above.
356   std::string contents_mime_type_;
357
358   // See opener_route_id() above.
359   int opener_route_id_;
360
361   TestRenderFrameHost* main_render_frame_host_;
362
363   DISALLOW_COPY_AND_ASSIGN(TestRenderViewHost);
364 };
365
366 #if defined(COMPILER_MSVC)
367 #pragma warning(pop)
368 #endif
369
370 // Adds methods to get straight at the impl classes.
371 class RenderViewHostImplTestHarness : public RenderViewHostTestHarness {
372  public:
373   RenderViewHostImplTestHarness();
374   virtual ~RenderViewHostImplTestHarness();
375
376   TestRenderViewHost* test_rvh();
377   TestRenderViewHost* pending_test_rvh();
378   TestRenderViewHost* active_test_rvh();
379   TestRenderFrameHost* main_test_rfh();
380   TestWebContents* contents();
381
382  private:
383   typedef scoped_ptr<ui::test::ScopedSetSupportedScaleFactors>
384       ScopedSetSupportedScaleFactors;
385   ScopedSetSupportedScaleFactors scoped_set_supported_scale_factors_;
386   DISALLOW_COPY_AND_ASSIGN(RenderViewHostImplTestHarness);
387 };
388
389 }  // namespace content
390
391 #endif  // CONTENT_TEST_TEST_RENDER_VIEW_HOST_H_