15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PUBLIC_TEST_RENDER_VIEW_TEST_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_TEST_RENDER_VIEW_TEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/main_function_params.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/page_state.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_thread.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/Platform.h" 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosibastruct ViewMsg_Resize_Params; 23e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebWidget; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ContentBrowserClient; 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ContentClient; 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ContentRendererClient; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRenderProcess; 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PageState; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererMainPlatformDelegate; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererWebKitPlatformSupportImplNoSandboxImpl; 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class RenderView; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewTest : public testing::Test { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A special WebKitPlatformSupportImpl class for getting rid off the 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dependency to the sandbox, which is not available in RenderViewTest. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class RendererWebKitPlatformSupportImplNoSandbox { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererWebKitPlatformSupportImplNoSandbox(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RendererWebKitPlatformSupportImplNoSandbox(); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::Platform* Get(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RendererWebKitPlatformSupportImplNoSandboxImpl> 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_platform_support_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewTest(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RenderViewTest(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Spins the message loop to process all messages that are currently pending. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessPendingMessages(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to the main frame. 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* GetMainFrame(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executes the given JavaScript in the context of the main frame. The input 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is a NULL-terminated UTF-8 string. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExecuteJavaScript(const char* js); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executes the given JavaScript and sets the int value it evaluates to in 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |result|. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the JavaScript was evaluated correctly to an int value, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // false otherwise. 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ExecuteJavaScriptAndReturnIntValue(const base::string16& script, 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* result); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads the given HTML into the main frame as a data: URL and blocks until 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the navigation is committed. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadHTML(const char* html); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns the current PageState. 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PageState GetCurrentPageState(); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates the main frame back or forward in session history and commits. 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The caller must capture a PageState for the target page. 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void GoBack(const PageState& state); 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void GoForward(const PageState& state); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends one native key event over IPC. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendNativeKeyEvent(const NativeWebKeyboardEvent& key_event); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a raw keyboard event to the renderer. 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SendWebKeyboardEvent(const blink::WebKeyboardEvent& key_event); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a raw mouse event to the renderer. 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SendWebMouseEvent(const blink::WebMouseEvent& key_event); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the bounds (coordinates and size) of the element with id 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |element_id|. Returns an empty rect if such an element was not found. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetElementBounds(const std::string& element_id); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends a left mouse click in the middle of the element with id |element_id|. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the event was sent, false otherwise (typically because 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the element was not found). 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SimulateElementClick(const std::string& element_id); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates |node| being focused. 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetFocused(const blink::WebNode& node); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clears anything associated with the browsing history. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearHistory(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a navigation with a type of reload to the given url. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reload(const GURL& url); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the IPC message ID of the navigation message. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 GetNavigationIPCType(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize the view. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Resize(gfx::Size new_size, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect resizer_rect, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are all methods from RenderViewImpl that we expose to testing code. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool OnMessageReceived(const IPC::Message& msg); 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void DidNavigateWithinPage(blink::WebLocalFrame* frame, 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_new_navigation); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendContentStateImmediately(); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebWidget* GetWebWidget(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Allows a subclass to override the various content client implementations. 13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual ContentClient* CreateContentClient(); 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual ContentBrowserClient* CreateContentBrowserClient(); 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual ContentRendererClient* CreateContentRendererClient(); 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 137e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba // Allows a subclass to customize the initial size of the RenderView. 138e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba virtual scoped_ptr<ViewMsg_Resize_Params> InitialSizeParams(); 139e578b2d213c837aab9cea5407d30f5c84065cd0eMarcin Kosiba 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing::Test 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop msg_loop_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockRenderProcess> mock_process_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use a naked pointer because we don't want to expose RenderViewImpl in 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the embedder's namespace. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderView* view_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererWebKitPlatformSupportImplNoSandbox webkit_platform_support_; 15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ContentClient> content_client_; 15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ContentBrowserClient> content_browser_client_; 15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ContentRendererClient> content_renderer_client_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockRenderThread> render_thread_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to setup the process so renderers can run. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RendererMainPlatformDelegate> platform_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MainFunctionParams> params_; 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<base::CommandLine> command_line_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::mac::ScopedNSAutoreleasePool> autorelease_pool_; 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void GoToOffset(int offset, const PageState& state); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_PUBLIC_TEST_RENDER_VIEW_TEST_H_ 172