web_contents_impl_browsertest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/load_notification_details.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_details.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_types.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/content_paths.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/test/content_browser_test.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/test/content_browser_test_utils.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ResizeWebContentsView(Shell* shell, const gfx::Size& size, 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool set_start_page) { 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Shell::SizeTo is not implemented on Aura; WebContentsView::SizeContents 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // works on Win and ChromeOS but not Linux - we need to resize the shell 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // window on Linux because if we don't, the next layout of the unchanged shell 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // window will resize WebContentsView back to the previous size. 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The cleaner and shorter SizeContents is preferred as more platforms convert 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // to Aura. 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if defined(TOOLKIT_GTK) || defined(OS_MACOSX) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shell->SizeTo(size); 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If |set_start_page| is true, start with blank page to make sure resize 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // takes effect. 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (set_start_page) 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NavigateToURL(shell, GURL("about://blank")); 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell->web_contents()->GetView()->SizeContents(size); 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif // defined(TOOLKIT_GTK) || defined(OS_MACOSX) 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebContentsImplBrowserTest : public ContentBrowserTest { 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsImplBrowserTest() {} 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebContentsImplBrowserTest); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Keeps track of data from LoadNotificationDetails so we can later verify that 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// they are correct, after the LoadNotificationDetails object is deleted. 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LoadStopNotificationObserver : public WindowedNotificationObserver { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadStopNotificationObserver(NavigationController* controller) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : WindowedNotificationObserver(NOTIFICATION_LOAD_STOP, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Source<NavigationController>(controller)), 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_index_(-1), 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(NULL) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Observe(int type, 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotificationSource& source, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotificationDetails& details) OVERRIDE { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == NOTIFICATION_LOAD_STOP) { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Details<LoadNotificationDetails> load_details(details); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url_ = load_details->url; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_index_ = load_details->session_index; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_ = load_details->controller; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WindowedNotificationObserver::Observe(type, source, details); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url_; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int session_index_; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationController* controller_; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Starts a new navigation as soon as the current one commits, but does not 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// wait for it to complete. This allows us to observe DidStopLoading while 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// a pending entry is present. 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NavigateOnCommitObserver : public WebContentsObserver { 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateOnCommitObserver(Shell* shell, GURL url) 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : WebContentsObserver(shell->web_contents()), 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell_(shell), 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url_(url), 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) done_(false) { 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // WebContentsObserver: 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void NavigationEntryCommitted( 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) OVERRIDE { 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!done_) { 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) done_ = true; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell_->LoadURL(url_); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell* shell_; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url_; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool done_; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class RenderViewSizeDelegate : public WebContentsDelegate { 108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void set_size_insets(const gfx::Size& size_insets) { 110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size_insets_ = size_insets; 111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContentsDelegate: 114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual gfx::Size GetSizeForNewRenderView( 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const WebContents* web_contents) const OVERRIDE { 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size(web_contents->GetView()->GetContainerSize()); 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size.Enlarge(size_insets_.width(), size_insets_.height()); 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size_insets_; 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class RenderViewSizeObserver : public WebContentsObserver { 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderViewSizeObserver(Shell* shell, const gfx::Size& wcv_new_size) 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : WebContentsObserver(shell->web_contents()), 129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell_(shell), 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) wcv_new_size_(wcv_new_size) { 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContentsObserver: 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void RenderViewCreated(RenderViewHost* rvh) OVERRIDE { 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) rwhv_create_size_ = rvh->GetView()->GetViewBounds().size(); 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidStartNavigationToPendingEntry( 139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const GURL& url, 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NavigationController::ReloadType reload_type) OVERRIDE { 141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResizeWebContentsView(shell_, wcv_new_size_, false); 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size rwhv_create_size() const { return rwhv_create_size_; } 145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Shell* shell_; // Weak ptr. 148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size wcv_new_size_; 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size rwhv_create_size_; 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// See: http://crbug.com/298193 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN) 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetails DISABLED_DidStopLoadingDetails 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetails DidStopLoadingDetails 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that DidStopLoading includes the correct URL in the details. 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MAYBE_DidStopLoadingDetails) { 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadStopNotificationObserver load_observer( 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shell()->web_contents()->GetController()); 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.Wait(); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("/title1.html", load_observer.url_.path()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, load_observer.session_index_); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(&shell()->web_contents()->GetController(), 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.controller_); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// See: http://crbug.com/298193 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN) 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetailsWithPending \ 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISABLED_DidStopLoadingDetailsWithPending 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetailsWithPending DidStopLoadingDetailsWithPending 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that DidStopLoading includes the correct URL in the details when a 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// pending entry is present. 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MAYBE_DidStopLoadingDetailsWithPending) { 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Listen for the first load to stop. 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadStopNotificationObserver load_observer( 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shell()->web_contents()->GetController()); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start a new pending navigation as soon as the first load commits. 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We will hear a DidStopLoading from the first load as the new load 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is started. 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateOnCommitObserver commit_observer( 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) shell(), embedded_test_server()->GetURL("/title2.html")); 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.Wait(); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("/title1.html", load_observer.url_.path()); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, load_observer.session_index_); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(&shell()->web_contents()->GetController(), 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.controller_); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a renderer-initiated navigation to an invalid URL does not leave 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// around a pending entry that could be used in a URL spoof. We test this in 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// a browser test because our unit test framework incorrectly calls 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// DidStartProvisionalLoadForFrame for in-page navigations. 20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// See http://crbug.com/280512. 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ClearNonVisiblePendingOnFail) { 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Navigate to an invalid URL and make sure it doesn't leave a pending entry. 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoadStopNotificationObserver load_observer1( 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &shell()->web_contents()->GetController()); 21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "window.location.href=\"nonexistent:12121\";")); 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) load_observer1.Wait(); 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(shell()->web_contents()->GetController().GetPendingEntry()); 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoadStopNotificationObserver load_observer2( 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &shell()->web_contents()->GetController()); 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "window.location.href=\"#foo\";")); 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) load_observer2.Wait(); 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(embedded_test_server()->GetURL("/title1.html#foo"), 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell()->web_contents()->GetVisibleURL()); 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// TODO(sail): enable this for MAC when auto resizing of WebContentsViewCocoa is 234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// fixed. 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(shrikant): enable this for Windows when issue with 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// force-compositing-mode is resolved (http://crbug.com/281726). 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_ANDROID) 238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define MAYBE_GetSizeForNewRenderView DISABLED_GetSizeForNewRenderView 239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else 240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define MAYBE_GetSizeForNewRenderView GetSizeForNewRenderView 241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif 242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Test that RenderViewHost is created and updated at the size specified by 243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// WebContentsDelegate::GetSizeForNewRenderView(). 244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MAYBE_GetSizeForNewRenderView) { 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Create a new server with a different site. 248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::SpawnedTestServer https_server( 249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("content/test/data"))); 252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<RenderViewSizeDelegate> delegate(new RenderViewSizeDelegate()); 255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->SetDelegate(delegate.get()); 256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(shell()->web_contents()->GetDelegate() == delegate.get()); 257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When no size is set, RenderWidgetHostView adopts the size of 259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContenntsView. 260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title2.html")); 261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(shell()->web_contents()->GetView()->GetContainerSize(), 262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size()); 264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When a size is set, RenderWidgetHostView and WebContentsView honor this 266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // size. 267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size(300, 300); 268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size_insets(-10, -15); 269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResizeWebContentsView(shell(), size, true); 270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delegate->set_size_insets(size_insets); 271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURL(shell(), https_server.GetURL("/")); 272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size.Enlarge(size_insets.width(), size_insets.height()); 273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(size, 274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size()); 276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(size, shell()->web_contents()->GetView()->GetContainerSize()); 277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If WebContentsView is resized after RenderWidgetHostView is created but 279424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // before pending navigation entry is committed, both RenderWidgetHostView and 280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContentsView use the new size of WebContentsView. 281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size init_size(200, 200); 282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size new_size(100, 100); 283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size_insets = gfx::Size(-20, -30); 284424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResizeWebContentsView(shell(), init_size, true); 285424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delegate->set_size_insets(size_insets); 286424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderViewSizeObserver observer(shell(), new_size); 287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // RenderWidgetHostView is created at specified size. 289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) init_size.Enlarge(size_insets.width(), size_insets.height()); 290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(init_size, observer.rwhv_create_size()); 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // RenderViewSizeObserver resizes WebContentsView in 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // DidStartNavigationToPendingEntry, so both WebContentsView and 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // RenderWidgetHostView adopt this new size. 294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new_size.Enlarge(size_insets.width(), size_insets.height()); 295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(new_size, 296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size()); 298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(new_size, shell()->web_contents()->GetView()->GetContainerSize()); 299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, OpenURLSubframe) { 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Navigate with source_frame_id 3, FrameTreeNode ID 4. 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL url("http://foo"); 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OpenURLParams params(url, Referrer(), 3, 4, CURRENT_TAB, PAGE_TRANSITION_LINK, 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) true); 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shell()->web_contents()->OpenURL(params); 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure the NavigationEntry ends up with the FrameTreeNode ID. 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigationController* controller = &shell()->web_contents()->GetController(); 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(controller->GetPendingEntry()); 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(4, NavigationEntryImpl::FromNavigationEntry( 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) controller->GetPendingEntry())->frame_tree_node_id()); 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 318