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