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 #include "content/public/test/layouttest_support.h" 6 7 #include "base/callback.h" 8 #include "base/lazy_instance.h" 9 #include "content/browser/renderer_host/render_widget_host_impl.h" 10 #include "content/common/gpu/image_transport_surface.h" 11 #include "content/renderer/render_thread_impl.h" 12 #include "content/renderer/render_view_impl.h" 13 #include "content/renderer/renderer_webkitplatformsupport_impl.h" 14 #include "content/test/test_media_stream_client.h" 15 #include "third_party/WebKit/public/platform/WebDeviceMotionData.h" 16 #include "third_party/WebKit/public/platform/WebDeviceOrientationData.h" 17 #include "third_party/WebKit/public/platform/WebGamepads.h" 18 #include "third_party/WebKit/public/testing/WebFrameTestProxy.h" 19 #include "third_party/WebKit/public/testing/WebTestProxy.h" 20 21 #if defined(OS_WIN) && !defined(USE_AURA) 22 #include "content/browser/web_contents/web_contents_drag_win.h" 23 #endif 24 25 #if defined(OS_MACOSX) 26 #include "content/browser/renderer_host/popup_menu_helper_mac.h" 27 #endif 28 29 using blink::WebDeviceMotionData; 30 using blink::WebDeviceOrientationData; 31 using blink::WebGamepads; 32 using blink::WebRect; 33 using blink::WebSize; 34 using WebTestRunner::WebFrameTestProxy; 35 using WebTestRunner::WebTestProxy; 36 using WebTestRunner::WebTestProxyBase; 37 38 namespace content { 39 40 namespace { 41 42 base::LazyInstance<base::Callback<void(RenderView*, WebTestProxyBase*)> >::Leaky 43 g_callback = LAZY_INSTANCE_INITIALIZER; 44 45 RenderViewImpl* CreateWebTestProxy(RenderViewImplParams* params) { 46 typedef WebTestProxy<RenderViewImpl, RenderViewImplParams*> ProxyType; 47 ProxyType* render_view_proxy = new ProxyType( 48 reinterpret_cast<RenderViewImplParams*>(params)); 49 if (g_callback == 0) 50 return render_view_proxy; 51 g_callback.Get().Run( 52 static_cast<RenderView*>(render_view_proxy), render_view_proxy); 53 return render_view_proxy; 54 } 55 56 WebTestProxyBase* GetWebTestProxyBase(RenderViewImpl* render_view) { 57 typedef WebTestProxy<RenderViewImpl, RenderViewImplParams*> ViewProxy; 58 59 ViewProxy* render_view_proxy = static_cast<ViewProxy*>(render_view); 60 return static_cast<WebTestProxyBase*>(render_view_proxy); 61 } 62 63 RenderFrameImpl* CreateWebFrameTestProxy( 64 RenderViewImpl* render_view, 65 int32 routing_id) { 66 typedef WebFrameTestProxy<RenderFrameImpl, RenderViewImpl*, int32> FrameProxy; 67 68 FrameProxy* render_frame_proxy = new FrameProxy(render_view, routing_id); 69 render_frame_proxy->setBaseProxy(GetWebTestProxyBase(render_view)); 70 render_frame_proxy->setVersion(3); 71 72 return render_frame_proxy; 73 } 74 75 } // namespace 76 77 78 void EnableWebTestProxyCreation( 79 const base::Callback<void(RenderView*, WebTestProxyBase*)>& callback) { 80 g_callback.Get() = callback; 81 RenderViewImpl::InstallCreateHook(CreateWebTestProxy); 82 RenderFrameImpl::InstallCreateHook(CreateWebFrameTestProxy); 83 } 84 85 void SetMockGamepads(const WebGamepads& pads) { 86 RendererWebKitPlatformSupportImpl::SetMockGamepadsForTesting(pads); 87 } 88 89 void SetMockDeviceMotionData(const WebDeviceMotionData& data) { 90 RendererWebKitPlatformSupportImpl::SetMockDeviceMotionDataForTesting(data); 91 } 92 93 void SetMockDeviceOrientationData(const WebDeviceOrientationData& data) { 94 RendererWebKitPlatformSupportImpl:: 95 SetMockDeviceOrientationDataForTesting(data); 96 } 97 98 void EnableRendererLayoutTestMode() { 99 RenderThreadImpl::current()->set_layout_test_mode(true); 100 } 101 102 void EnableBrowserLayoutTestMode() { 103 #if defined(OS_MACOSX) 104 ImageTransportSurface::SetAllowOSMesaForTesting(true); 105 PopupMenuHelper::DontShowPopupMenuForTesting(); 106 #elif defined(OS_WIN) && !defined(USE_AURA) 107 WebContentsDragWin::DisableDragDropForTesting(); 108 #endif 109 RenderWidgetHostImpl::DisableResizeAckCheckForTesting(); 110 } 111 112 int GetLocalSessionHistoryLength(RenderView* render_view) { 113 return static_cast<RenderViewImpl*>(render_view)-> 114 GetLocalSessionHistoryLengthForTesting(); 115 } 116 117 void SyncNavigationState(RenderView* render_view) { 118 static_cast<RenderViewImpl*>(render_view)->SyncNavigationState(); 119 } 120 121 void SetFocusAndActivate(RenderView* render_view, bool enable) { 122 static_cast<RenderViewImpl*>(render_view)-> 123 SetFocusAndActivateForTesting(enable); 124 } 125 126 void ForceResizeRenderView(RenderView* render_view, 127 const WebSize& new_size) { 128 RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view); 129 render_view_impl->ForceResizeForTesting(new_size); 130 GetWebTestProxyBase(render_view_impl)->didForceResize(); 131 } 132 133 void SetDeviceScaleFactor(RenderView* render_view, float factor) { 134 static_cast<RenderViewImpl*>(render_view)-> 135 SetDeviceScaleFactorForTesting(factor); 136 } 137 138 void UseSynchronousResizeMode(RenderView* render_view, bool enable) { 139 static_cast<RenderViewImpl*>(render_view)-> 140 UseSynchronousResizeModeForTesting(enable); 141 } 142 143 void EnableAutoResizeMode(RenderView* render_view, 144 const WebSize& min_size, 145 const WebSize& max_size) { 146 static_cast<RenderViewImpl*>(render_view)-> 147 EnableAutoResizeForTesting(min_size, max_size); 148 } 149 150 void DisableAutoResizeMode(RenderView* render_view, const WebSize& new_size) { 151 static_cast<RenderViewImpl*>(render_view)-> 152 DisableAutoResizeForTesting(new_size); 153 } 154 155 void UseMockMediaStreams(RenderView* render_view) { 156 RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view); 157 render_view_impl->SetMediaStreamClientForTesting( 158 new TestMediaStreamClient(render_view_impl)); 159 } 160 161 } // namespace content 162