render_view_test.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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)#include "content/public/test/render_view_test.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h" 8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/common/dom_storage/dom_storage_types.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/frame_messages.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/browser/content_browser_client.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h" 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/common/content_client.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/renderer_preferences.h" 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/renderer/history_controller.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/renderer/history_serialization.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_main_platform_delegate.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webkitplatformsupport_impl.h" 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/test/frame_load_waiter.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/mock_render_process.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHistoryItem.h" 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h" 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "v8/include/v8.h" 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing blink::WebLocalFrame; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScriptSource; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kOpenerId = -2; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kRouteId = 5; 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int32 kMainFrameRouteId = 6; 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int32 kNewWindowRouteId = 7; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int32 kNewFrameRouteId = 10; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kSurfaceId = 42; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RendererWebKitPlatformSupportImplNoSandboxImpl 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public RendererWebKitPlatformSupportImpl { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebSandboxSupport* sandboxSupport() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::RendererWebKitPlatformSupportImplNoSandbox:: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererWebKitPlatformSupportImplNoSandbox() { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_platform_support_.reset( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RendererWebKitPlatformSupportImplNoSandboxImpl()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::RendererWebKitPlatformSupportImplNoSandbox:: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RendererWebKitPlatformSupportImplNoSandbox() { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::Platform* 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewTest::RendererWebKitPlatformSupportImplNoSandbox::Get() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_platform_support_.get(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::RenderViewTest() 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : view_(NULL) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::~RenderViewTest() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::ProcessPendingMessages() { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) msg_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_loop_.Run(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochWebLocalFrame* RenderViewTest::GetMainFrame() { 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return view_->GetWebView()->mainFrame()->toWebLocalFrame(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::ExecuteJavaScript(const char* js) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(js))); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewTest::ExecuteJavaScriptAndReturnIntValue( 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& script, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* int_result) { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Value> result = 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainFrame()->executeScriptAndReturnValue(WebScriptSource(script)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.IsEmpty() || !result->IsInt32()) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (int_result) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *int_result = result->Int32Value(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::LoadHTML(const char* html) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str = "data:text/html;charset=utf-8,"; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_str.append(html); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(url_str); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainFrame()->loadRequest(WebURLRequest(url)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The load actually happens asynchronously, so we pump messages to process 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pending continuation. 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FrameLoadWaiter(view_->GetMainRenderFrame()).Wait(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PageState RenderViewTest::GetCurrentPageState() { 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return HistoryEntryToPageState(impl->history_controller()->GetCurrentEntry()); 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderViewTest::GoBack(const PageState& state) { 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GoToOffset(-1, state); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderViewTest::GoForward(const PageState& state) { 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GoToOffset(1, state); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SetUp() { 14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_client_.reset(CreateContentClient()); 14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_browser_client_.reset(CreateContentBrowserClient()); 14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_renderer_client_.reset(CreateContentRendererClient()); 14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetContentClient(content_client_.get()); 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetBrowserClientForTesting(content_browser_client_.get()); 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetRendererClientForTesting(content_renderer_client_.get()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses can set render_thread_ with their own implementation before 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling RenderViewTest::SetUp(). 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!render_thread_) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_.reset(new MockRenderThread()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->set_routing_id(kRouteId); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->set_surface_id(kSurfaceId); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->set_new_window_routing_id(kNewWindowRouteId); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_thread_->set_new_frame_routing_id(kNewFrameRouteId); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autorelease_pool_.reset(new base::mac::ScopedNSAutoreleasePool()); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_.reset(new CommandLine(CommandLine::NO_PROGRAM)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_.reset(new MainFunctionParams(*command_line_)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_.reset(new RendererMainPlatformDelegate(*params_)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_->PlatformInitialize(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting flags and really doing anything with WebKit is fairly fragile and 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hacky, but this is the world we live in... 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string flags("--expose-gc"); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::V8::SetFlagsFromString(flags.c_str(), static_cast<int>(flags.size())); 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::initialize(webkit_platform_support_.Get()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we register any necessary schemes when initializing WebKit, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since we are using a MockRenderThread. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::RegisterSchemes(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This check is needed because when run under content_browsertests, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceBundle isn't initialized (since we have to use a diferent test 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // suite implementation than for content_unittests). For browser_tests, this 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is already initialized. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ResourceBundle::HasSharedInstance()) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::InitSharedInstanceWithLocale("en-US", NULL); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_process_.reset(new MockRenderProcess); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This needs to pass the mock render thread to the view. 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewImpl* view = 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewImpl::Create(kOpenerId, 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false, // window_was_created_with_opener 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RendererPreferences(), 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebPreferences(), 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kRouteId, 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kMainFrameRouteId, 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kSurfaceId, 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kInvalidSessionStorageNamespaceId, 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16(), 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // is_renderer_created 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // swapped_out 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MSG_ROUTING_NONE, // proxy_routing_id 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // hidden 1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false, // never_visible 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1, // next_page_id 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebScreenInfo()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddRef(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = view; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::TearDown() { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try very hard to collect garbage before shutting down. 2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // "5" was chosen following http://crbug.com/46571#c9 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const int kGCIterations = 5; 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < kGCIterations; i++) 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetMainFrame()->collectGarbage(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the loop so the release task from the renderwidget executes. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < kGCIterations; i++) 2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetMainFrame()->collectGarbage(); 2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->SendCloseMessage(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = NULL; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_process_.reset(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After telling the view to close and resetting mock_process_ we may get 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // some new tasks which need to be processed before shutting down WebKit 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (http://crbug.com/21508). 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Needs to run before blink::shutdown(). 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autorelease_pool_.reset(NULL); 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::shutdown(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_->PlatformUninitialize(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_.reset(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_.reset(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_.reset(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendNativeKeyEvent( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& key_event) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendWebKeyboardEvent(key_event); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendWebKeyboardEvent( 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebKeyboardEvent& key_event) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) impl->OnMessageReceived( 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMsg_HandleInputEvent(0, &key_event, ui::LatencyInfo(), false)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendWebMouseEvent( 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseEvent& mouse_event) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->OnMessageReceived( 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMsg_HandleInputEvent(0, &mouse_event, ui::LatencyInfo(), false)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kGetCoordinatesScript = 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(function() {" 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " function GetCoordinates(elem) {" 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!elem)" 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return [ 0, 0];" 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var coordinates = [ elem.offsetLeft, elem.offsetTop];" 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var parent_coordinates = GetCoordinates(elem.offsetParent);" 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " coordinates[0] += parent_coordinates[0];" 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " coordinates[1] += parent_coordinates[1];" 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " return [ Math.round(coordinates[0])," 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " Math.round(coordinates[1])];" 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " };" 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var elem = document.getElementById('$1');" 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!elem)" 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return null;" 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var bounds = GetCoordinates(elem);" 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " bounds[2] = Math.round(elem.offsetWidth);" 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) " bounds[3] = Math.round(elem.offsetHeight);" 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return bounds;" 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "})();"; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderViewTest::GetElementBounds(const std::string& element_id) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> params; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.push_back(element_id); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string script = 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReplaceStringPlaceholders(kGetCoordinatesScript, params, NULL); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::Isolate* isolate = v8::Isolate::GetCurrent(); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::HandleScope handle_scope(isolate); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Value> value = GetMainFrame()->executeScriptAndReturnValue( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebScriptSource(WebString::fromUTF8(script))); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.IsEmpty() || !value->IsArray()) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Array> array = value.As<v8::Array>(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (array->Length() != 4) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> coords; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 4; ++i) { 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::Handle<v8::Number> index = v8::Number::New(isolate, i); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Local<v8::Value> value = array->Get(index); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.IsEmpty() || !value->IsInt32()) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coords.push_back(value->Int32Value()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(coords[0], coords[1], coords[2], coords[3]); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewTest::SimulateElementClick(const std::string& element_id) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = GetElementBounds(element_id); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.IsEmpty()) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseEvent mouse_event; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type = WebInputEvent::MouseDown; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.button = WebMouseEvent::ButtonLeft; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.x = bounds.CenterPoint().x(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.y = bounds.CenterPoint().y(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.clickCount = 1; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<IPC::Message> input_message( 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new InputMsg_HandleInputEvent(0, &mouse_event, ui::LatencyInfo(), false)); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->OnMessageReceived(*input_message); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewTest::SetFocused(const blink::WebNode& node) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->focusedNodeChanged(node); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::ClearHistory() { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->page_id_ = -1; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->history_list_offset_ = -1; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->history_list_length_ = 0; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->history_page_ids_.clear(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::Reload(const GURL& url) { 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Params params; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url = url; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.navigation_type = FrameMsg_Navigate_Type::RELOAD; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) impl->main_render_frame()->OnNavigate(params); 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FrameLoadWaiter(impl->main_render_frame()).Wait(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 RenderViewTest::GetNavigationIPCType() { 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FrameHostMsg_DidCommitProvisionalLoad::ID; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::Resize(gfx::Size new_size, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect resizer_rect, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen) { 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ViewMsg_Resize_Params params; 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) params.screen_info = blink::WebScreenInfo(); 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.new_size = new_size; 35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.physical_backing_size = new_size; 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.overdraw_bottom_height = 0.f; 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.resizer_rect = resizer_rect; 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.is_fullscreen = is_fullscreen; 36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<IPC::Message> resize_message(new ViewMsg_Resize(0, params)); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMessageReceived(*resize_message); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewTest::OnMessageReceived(const IPC::Message& msg) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return impl->OnMessageReceived(msg); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderViewTest::DidNavigateWithinPage(blink::WebLocalFrame* frame, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_new_navigation) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebHistoryItem item; 373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch item.initialize(); 374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch impl->main_render_frame()->didNavigateWithinPage( 375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame, 376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch item, 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_new_navigation ? blink::WebStandardCommit 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : blink::WebHistoryInertCommit); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendContentStateImmediately() { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->set_send_content_state_immediately(true); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebWidget* RenderViewTest::GetWebWidget() { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return impl->webwidget(); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 39223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentClient* RenderViewTest::CreateContentClient() { 39323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new ContentClient; 39423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 39523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 39623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentBrowserClient* RenderViewTest::CreateContentBrowserClient() { 39723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new ContentBrowserClient; 39823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 39923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 40023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentRendererClient* RenderViewTest::CreateContentRendererClient() { 40123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new ContentRendererClient; 40223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 40323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderViewTest::GoToOffset(int offset, const PageState& state) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_list_length = impl->historyBackListCount() + 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->historyForwardListCount() + 1; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pending_offset = offset + impl->history_list_offset(); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Params navigate_params; 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_params.navigation_type = FrameMsg_Navigate_Type::NORMAL; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.transition = PAGE_TRANSITION_FORWARD_BACK; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.current_history_list_length = history_list_length; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.current_history_list_offset = impl->history_list_offset(); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.pending_history_list_offset = pending_offset; 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch navigate_params.page_id = impl->page_id_ + offset; 4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigate_params.page_state = state; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.request_time = base::Time::Now(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate navigate_message(impl->main_render_frame()->GetRoutingID(), 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_params); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) impl->main_render_frame()->OnMessageReceived(navigate_message); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The load actually happens asynchronously, so we pump messages to process 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pending continuation. 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FrameLoadWaiter(view_->GetMainRenderFrame()).Wait(); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 431