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