render_view_test.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
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" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/renderer/history_item_serialization.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_main_platform_delegate.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webkitplatformsupport_impl.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/mock_render_process.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHistoryItem.h" 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "v8/include/v8.h" 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScriptSource; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kOpenerId = -2; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kRouteId = 5; 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int32 kMainFrameRouteId = 6; 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int32 kNewWindowRouteId = 7; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int32 kNewFrameRouteId = 10; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kSurfaceId = 42; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RendererWebKitPlatformSupportImplNoSandboxImpl 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public RendererWebKitPlatformSupportImpl { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebSandboxSupport* sandboxSupport() { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::RendererWebKitPlatformSupportImplNoSandbox:: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererWebKitPlatformSupportImplNoSandbox() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_platform_support_.reset( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RendererWebKitPlatformSupportImplNoSandboxImpl()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::RendererWebKitPlatformSupportImplNoSandbox:: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RendererWebKitPlatformSupportImplNoSandbox() { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::Platform* 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewTest::RendererWebKitPlatformSupportImplNoSandbox::Get() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_platform_support_.get(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::RenderViewTest() 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : view_(NULL) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewTest::~RenderViewTest() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::ProcessPendingMessages() { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) msg_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_loop_.Run(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebFrame* RenderViewTest::GetMainFrame() { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_->GetWebView()->mainFrame(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::ExecuteJavaScript(const char* js) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(js))); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewTest::ExecuteJavaScriptAndReturnIntValue( 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& script, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* int_result) { 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Value> result = 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainFrame()->executeScriptAndReturnValue(WebScriptSource(script)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.IsEmpty() || !result->IsInt32()) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (int_result) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *int_result = result->Int32Value(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::LoadHTML(const char* html) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str = "data:text/html;charset=utf-8,"; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_str.append(html); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(url_str); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMainFrame()->loadRequest(WebURLRequest(url)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The load actually happens asynchronously, so we pump messages to process 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pending continuation. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewTest::GoBack(const blink::WebHistoryItem& item) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoToOffset(-1, item); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewTest::GoForward(const blink::WebHistoryItem& item) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoToOffset(1, item); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SetUp() { 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_client_.reset(CreateContentClient()); 13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_browser_client_.reset(CreateContentBrowserClient()); 13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_renderer_client_.reset(CreateContentRendererClient()); 13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetContentClient(content_client_.get()); 14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetBrowserClientForTesting(content_browser_client_.get()); 14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetRendererClientForTesting(content_renderer_client_.get()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses can set render_thread_ with their own implementation before 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling RenderViewTest::SetUp(). 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!render_thread_) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_.reset(new MockRenderThread()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->set_routing_id(kRouteId); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->set_surface_id(kSurfaceId); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->set_new_window_routing_id(kNewWindowRouteId); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_thread_->set_new_frame_routing_id(kNewFrameRouteId); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autorelease_pool_.reset(new base::mac::ScopedNSAutoreleasePool()); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_.reset(new CommandLine(CommandLine::NO_PROGRAM)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_.reset(new MainFunctionParams(*command_line_)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_.reset(new RendererMainPlatformDelegate(*params_)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_->PlatformInitialize(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting flags and really doing anything with WebKit is fairly fragile and 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hacky, but this is the world we live in... 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string flags("--expose-gc"); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::V8::SetFlagsFromString(flags.c_str(), static_cast<int>(flags.size())); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::initialize(webkit_platform_support_.Get()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we register any necessary schemes when initializing WebKit, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since we are using a MockRenderThread. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::RegisterSchemes(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This check is needed because when run under content_browsertests, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceBundle isn't initialized (since we have to use a diferent test 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // suite implementation than for content_unittests). For browser_tests, this 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is already initialized. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ResourceBundle::HasSharedInstance()) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::InitSharedInstanceWithLocale("en-US", NULL); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_process_.reset(new MockRenderProcess); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This needs to pass the mock render thread to the view. 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewImpl* view = 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewImpl::Create(kOpenerId, 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RendererPreferences(), 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebPreferences(), 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kRouteId, 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kMainFrameRouteId, 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kSurfaceId, 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kInvalidSessionStorageNamespaceId, 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16(), 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // is_renderer_created 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // swapped_out 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // hidden 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1, // next_page_id 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebScreenInfo(), 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AccessibilityModeOff); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddRef(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = view; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::TearDown() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try very hard to collect garbage before shutting down. 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // "5" was chosen following http://crbug.com/46571#c9 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const int kGCIterations = 5; 2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < kGCIterations; i++) 2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetMainFrame()->collectGarbage(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the loop so the release task from the renderwidget executes. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < kGCIterations; i++) 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetMainFrame()->collectGarbage(); 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_->SendCloseMessage(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = NULL; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_process_.reset(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After telling the view to close and resetting mock_process_ we may get 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // some new tasks which need to be processed before shutting down WebKit 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (http://crbug.com/21508). 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Needs to run before blink::shutdown(). 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autorelease_pool_.reset(NULL); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::shutdown(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_->PlatformUninitialize(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_.reset(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_.reset(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_.reset(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendNativeKeyEvent( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& key_event) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendWebKeyboardEvent(key_event); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendWebKeyboardEvent( 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebKeyboardEvent& key_event) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) impl->OnMessageReceived( 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMsg_HandleInputEvent(0, &key_event, ui::LatencyInfo(), false)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendWebMouseEvent( 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseEvent& mouse_event) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl->OnMessageReceived( 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMsg_HandleInputEvent(0, &mouse_event, ui::LatencyInfo(), false)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kGetCoordinatesScript = 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(function() {" 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " function GetCoordinates(elem) {" 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!elem)" 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return [ 0, 0];" 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var coordinates = [ elem.offsetLeft, elem.offsetTop];" 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var parent_coordinates = GetCoordinates(elem.offsetParent);" 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " coordinates[0] += parent_coordinates[0];" 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " coordinates[1] += parent_coordinates[1];" 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return coordinates;" 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " };" 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var elem = document.getElementById('$1');" 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!elem)" 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return null;" 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var bounds = GetCoordinates(elem);" 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " bounds[2] = elem.offsetWidth;" 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " bounds[3] = elem.offsetHeight;" 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return bounds;" 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "})();"; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderViewTest::GetElementBounds(const std::string& element_id) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> params; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.push_back(element_id); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string script = 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReplaceStringPlaceholders(kGetCoordinatesScript, params, NULL); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::Isolate* isolate = v8::Isolate::GetCurrent(); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::HandleScope handle_scope(isolate); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Value> value = GetMainFrame()->executeScriptAndReturnValue( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebScriptSource(WebString::fromUTF8(script))); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.IsEmpty() || !value->IsArray()) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Array> array = value.As<v8::Array>(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (array->Length() != 4) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> coords; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 4; ++i) { 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::Handle<v8::Number> index = v8::Number::New(isolate, i); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Local<v8::Value> value = array->Get(index); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.IsEmpty() || !value->IsInt32()) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) coords.push_back(value->Int32Value()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(coords[0], coords[1], coords[2], coords[3]); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewTest::SimulateElementClick(const std::string& element_id) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = GetElementBounds(element_id); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.IsEmpty()) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseEvent mouse_event; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type = WebInputEvent::MouseDown; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.button = WebMouseEvent::ButtonLeft; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.x = bounds.CenterPoint().x(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.y = bounds.CenterPoint().y(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.clickCount = 1; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<IPC::Message> input_message( 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new InputMsg_HandleInputEvent(0, &mouse_event, ui::LatencyInfo(), false)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->OnMessageReceived(*input_message); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewTest::SetFocused(const blink::WebNode& node) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->focusedNodeChanged(node); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::ClearHistory() { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->page_id_ = -1; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->history_list_offset_ = -1; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->history_list_length_ = 0; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->history_page_ids_.clear(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::Reload(const GURL& url) { 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Params params; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url = url; 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.navigation_type = FrameMsg_Navigate_Type::RELOAD; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) impl->main_render_frame()->OnNavigate(params); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 RenderViewTest::GetNavigationIPCType() { 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FrameHostMsg_DidCommitProvisionalLoad::ID; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::Resize(gfx::Size new_size, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect resizer_rect, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen) { 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ViewMsg_Resize_Params params; 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) params.screen_info = blink::WebScreenInfo(); 34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.new_size = new_size; 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.physical_backing_size = new_size; 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.overdraw_bottom_height = 0.f; 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.resizer_rect = resizer_rect; 35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.is_fullscreen = is_fullscreen; 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<IPC::Message> resize_message(new ViewMsg_Resize(0, params)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMessageReceived(*resize_message); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewTest::OnMessageReceived(const IPC::Message& msg) { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return impl->OnMessageReceived(msg); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewTest::DidNavigateWithinPage(blink::WebFrame* frame, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_new_navigation) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->didNavigateWithinPage(frame, is_new_navigation); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::SendContentStateImmediately() { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->set_send_content_state_immediately(true); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebWidget* RenderViewTest::GetWebWidget() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return impl->webwidget(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 37723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentClient* RenderViewTest::CreateContentClient() { 37823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new ContentClient; 37923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 38023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 38123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentBrowserClient* RenderViewTest::CreateContentBrowserClient() { 38223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new ContentBrowserClient; 38323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 38423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 38523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ContentRendererClient* RenderViewTest::CreateContentRendererClient() { 38623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new ContentRendererClient; 38723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 38823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewTest::GoToOffset(int offset, 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebHistoryItem& history_item) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_list_length = impl->historyBackListCount() + 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) impl->historyForwardListCount() + 1; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pending_offset = offset + impl->history_list_offset(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Params navigate_params; 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_params.navigation_type = FrameMsg_Navigate_Type::NORMAL; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.transition = PAGE_TRANSITION_FORWARD_BACK; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.current_history_list_length = history_list_length; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.current_history_list_offset = impl->history_list_offset(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.pending_history_list_offset = pending_offset; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.page_id = impl->GetPageId() + offset; 40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) navigate_params.page_state = HistoryItemToPageState(history_item); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_params.request_time = base::Time::Now(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate navigate_message(impl->main_render_frame()->GetRoutingID(), 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_params); 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) impl->main_render_frame()->OnMessageReceived(navigate_message); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The load actually happens asynchronously, so we pump messages to process 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pending continuation. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 417