web_contents_impl_browsertest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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) 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/utf_string_conversions.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/load_notification_details.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_details.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_types.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/content_paths.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h" 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h" 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/dns/mock_host_resolver.h" 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void ResizeWebContentsView(Shell* shell, const gfx::Size& size, 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool set_start_page) { 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Shell::SizeTo is not implemented on Aura; WebContentsView::SizeContents 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // works on Win and ChromeOS but not Linux - we need to resize the shell 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // window on Linux because if we don't, the next layout of the unchanged shell 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // window will resize WebContentsView back to the previous size. 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // SizeContents is a hack and should not be relied on. 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shell->SizeTo(size); 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If |set_start_page| is true, start with blank page to make sure resize 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // takes effect. 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (set_start_page) 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NavigateToURL(shell, GURL("about://blank")); 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell->web_contents()->GetView()->SizeContents(size); 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // defined(OS_MACOSX) 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebContentsImplBrowserTest : public ContentBrowserTest { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsImplBrowserTest() {} 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebContentsImplBrowserTest); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Keeps track of data from LoadNotificationDetails so we can later verify that 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// they are correct, after the LoadNotificationDetails object is deleted. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LoadStopNotificationObserver : public WindowedNotificationObserver { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadStopNotificationObserver(NavigationController* controller) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : WindowedNotificationObserver(NOTIFICATION_LOAD_STOP, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Source<NavigationController>(controller)), 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_index_(-1), 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(NULL) { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Observe(int type, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotificationSource& source, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotificationDetails& details) OVERRIDE { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == NOTIFICATION_LOAD_STOP) { 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Details<LoadNotificationDetails> load_details(details); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url_ = load_details->url; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_index_ = load_details->session_index; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_ = load_details->controller; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WindowedNotificationObserver::Observe(type, source, details); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url_; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int session_index_; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationController* controller_; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Starts a new navigation as soon as the current one commits, but does not 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// wait for it to complete. This allows us to observe DidStopLoading while 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// a pending entry is present. 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NavigateOnCommitObserver : public WebContentsObserver { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateOnCommitObserver(Shell* shell, GURL url) 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : WebContentsObserver(shell->web_contents()), 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell_(shell), 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url_(url), 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) done_(false) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // WebContentsObserver: 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void NavigationEntryCommitted( 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) OVERRIDE { 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!done_) { 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) done_ = true; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell_->LoadURL(url_); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell* shell_; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url_; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool done_; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class RenderViewSizeDelegate : public WebContentsDelegate { 109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void set_size_insets(const gfx::Size& size_insets) { 111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size_insets_ = size_insets; 112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContentsDelegate: 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual gfx::Size GetSizeForNewRenderView( 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const WebContents* web_contents) const OVERRIDE { 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size(web_contents->GetView()->GetContainerSize()); 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size.Enlarge(size_insets_.width(), size_insets_.height()); 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size_insets_; 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class RenderViewSizeObserver : public WebContentsObserver { 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderViewSizeObserver(Shell* shell, const gfx::Size& wcv_new_size) 129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : WebContentsObserver(shell->web_contents()), 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell_(shell), 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) wcv_new_size_(wcv_new_size) { 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContentsObserver: 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void RenderViewCreated(RenderViewHost* rvh) OVERRIDE { 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) rwhv_create_size_ = rvh->GetView()->GetViewBounds().size(); 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidStartNavigationToPendingEntry( 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const GURL& url, 141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NavigationController::ReloadType reload_type) OVERRIDE { 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResizeWebContentsView(shell_, wcv_new_size_, false); 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size rwhv_create_size() const { return rwhv_create_size_; } 146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Shell* shell_; // Weak ptr. 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size wcv_new_size_; 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size rwhv_create_size_; 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass LoadingStateChangedDelegate : public WebContentsDelegate { 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LoadingStateChangedDelegate() 156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : loadingStateChangedCount_(0) 157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch , loadingStateToDifferentDocumentCount_(0) { 158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // WebContentsDelgate: 161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void LoadingStateChanged(WebContents* contents, 162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) OVERRIDE { 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch loadingStateChangedCount_++; 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (to_different_document) 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch loadingStateToDifferentDocumentCount_++; 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int loadingStateChangedCount() const { return loadingStateChangedCount_; } 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int loadingStateToDifferentDocumentCount() const { 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return loadingStateToDifferentDocumentCount_; 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int loadingStateChangedCount_; 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int loadingStateToDifferentDocumentCount_; 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// See: http://crbug.com/298193 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN) 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetails DISABLED_DidStopLoadingDetails 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetails DidStopLoadingDetails 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that DidStopLoading includes the correct URL in the details. 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MAYBE_DidStopLoadingDetails) { 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadStopNotificationObserver load_observer( 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shell()->web_contents()->GetController()); 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.Wait(); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("/title1.html", load_observer.url_.path()); 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, load_observer.session_index_); 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(&shell()->web_contents()->GetController(), 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.controller_); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// See: http://crbug.com/298193 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN) 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetailsWithPending \ 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISABLED_DidStopLoadingDetailsWithPending 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_DidStopLoadingDetailsWithPending DidStopLoadingDetailsWithPending 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that DidStopLoading includes the correct URL in the details when a 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// pending entry is present. 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MAYBE_DidStopLoadingDetailsWithPending) { 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Listen for the first load to stop. 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadStopNotificationObserver load_observer( 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &shell()->web_contents()->GetController()); 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start a new pending navigation as soon as the first load commits. 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We will hear a DidStopLoading from the first load as the new load 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is started. 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateOnCommitObserver commit_observer( 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) shell(), embedded_test_server()->GetURL("/title2.html")); 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.Wait(); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("/title1.html", load_observer.url_.path()); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, load_observer.session_index_); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(&shell()->web_contents()->GetController(), 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_observer.controller_); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that a renderer-initiated navigation to an invalid URL does not leave 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// around a pending entry that could be used in a URL spoof. We test this in 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// a browser test because our unit test framework incorrectly calls 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// DidStartProvisionalLoadForFrame for in-page navigations. 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// See http://crbug.com/280512. 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ClearNonVisiblePendingOnFail) { 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Navigate to an invalid URL and make sure it doesn't leave a pending entry. 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoadStopNotificationObserver load_observer1( 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &shell()->web_contents()->GetController()); 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "window.location.href=\"nonexistent:12121\";")); 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) load_observer1.Wait(); 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(shell()->web_contents()->GetController().GetPendingEntry()); 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoadStopNotificationObserver load_observer2( 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &shell()->web_contents()->GetController()); 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "window.location.href=\"#foo\";")); 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) load_observer2.Wait(); 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(embedded_test_server()->GetURL("/title1.html#foo"), 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell()->web_contents()->GetVisibleURL()); 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(shrikant): enable this for Windows when issue with 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// force-compositing-mode is resolved (http://crbug.com/281726). 261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Also crashes under ThreadSanitizer, http://crbug.com/356758. 262a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_ANDROID) \ 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch || defined(THREAD_SANITIZER) 264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define MAYBE_GetSizeForNewRenderView DISABLED_GetSizeForNewRenderView 265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#else 266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define MAYBE_GetSizeForNewRenderView GetSizeForNewRenderView 267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif 268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Test that RenderViewHost is created and updated at the size specified by 269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// WebContentsDelegate::GetSizeForNewRenderView(). 270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MAYBE_GetSizeForNewRenderView) { 272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Create a new server with a different site. 274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::SpawnedTestServer https_server( 275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 276d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 277d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("content/test/data"))); 278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<RenderViewSizeDelegate> delegate(new RenderViewSizeDelegate()); 281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->SetDelegate(delegate.get()); 282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(shell()->web_contents()->GetDelegate() == delegate.get()); 283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 284424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When no size is set, RenderWidgetHostView adopts the size of 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // WebContentsView. 286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title2.html")); 287424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(shell()->web_contents()->GetView()->GetContainerSize(), 288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size()); 290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When a size is set, RenderWidgetHostView and WebContentsView honor this 292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // size. 293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size(300, 300); 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size size_insets(10, 15); 295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResizeWebContentsView(shell(), size, true); 296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delegate->set_size_insets(size_insets); 297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURL(shell(), https_server.GetURL("/")); 298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size.Enlarge(size_insets.width(), size_insets.height()); 299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(size, 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size()); 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The web_contents size is set by the embedder, and should not depend on the 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // rwhv size. The behavior is correct on OSX, but incorrect on other 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // platforms. 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size exp_wcv_size(300, 300); 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(OS_MACOSX) 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) exp_wcv_size.Enlarge(size_insets.width(), size_insets.height()); 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(exp_wcv_size, 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) shell()->web_contents()->GetView()->GetContainerSize()); 312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If WebContentsView is resized after RenderWidgetHostView is created but 314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // before pending navigation entry is committed, both RenderWidgetHostView and 315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WebContentsView use the new size of WebContentsView. 316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size init_size(200, 200); 317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size new_size(100, 100); 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_insets = gfx::Size(20, 30); 319424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResizeWebContentsView(shell(), init_size, true); 320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delegate->set_size_insets(size_insets); 321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderViewSizeObserver observer(shell(), new_size); 322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // RenderWidgetHostView is created at specified size. 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) init_size.Enlarge(size_insets.width(), size_insets.height()); 325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(init_size, observer.rwhv_create_size()); 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Once again, the behavior is correct on OSX. The embedder explicitly sets 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the size to (100,100) during navigation. Both the wcv and the rwhv should 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// take on that size. 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(OS_MACOSX) 331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new_size.Enlarge(size_insets.width(), size_insets.height()); 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size actual_size = shell()->web_contents()->GetRenderWidgetHostView()-> 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetViewBounds().size(); 335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(new_size, actual_size); 337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(new_size, shell()->web_contents()->GetView()->GetContainerSize()); 338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 339424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, OpenURLSubframe) { 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Navigate with FrameTreeNode ID 4. 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL url("http://foo"); 344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OpenURLParams params(url, Referrer(), 4, CURRENT_TAB, PAGE_TRANSITION_LINK, 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) true); 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shell()->web_contents()->OpenURL(params); 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure the NavigationEntry ends up with the FrameTreeNode ID. 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigationController* controller = &shell()->web_contents()->GetController(); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(controller->GetPendingEntry()); 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(4, NavigationEntryImpl::FromNavigationEntry( 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) controller->GetPendingEntry())->frame_tree_node_id()); 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Observer class to track the creation of RenderFrameHost objects. It is used 356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// in subsequent tests. 357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class RenderFrameCreatedObserver : public WebContentsObserver { 358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameCreatedObserver(Shell* shell) 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : WebContentsObserver(shell->web_contents()), 361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) last_rfh_(NULL) { 362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) OVERRIDE { 365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LOG(ERROR) << "RFCreated: " << render_frame_host; 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) last_rfh_ = render_frame_host; 367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* last_rfh() const { return last_rfh_; } 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* last_rfh_; 373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RenderFrameCreatedObserver); 375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that creation of new RenderFrameHost objects sends the correct object 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// to the WebContentObservers. See http://crbug.com/347339. 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameCreatedCorrectProcessForObservers) { 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string foo_com("foo.com"); 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL::Replacements replace_host; 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::HostPortPair foo_host_port; 384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL cross_site_url; 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Setup the server to allow serving separate sites, so we can perform 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // cross-process navigation. 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_resolver()->AddRule("*", "127.0.0.1"); 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) foo_host_port = test_server()->host_port_pair(); 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) foo_host_port.set_host(foo_com); 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL initial_url(test_server()->GetURL("/title1.html")); 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cross_site_url = test_server()->GetURL("/title2.html"); 397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) replace_host.SetHostStr(foo_com); 398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cross_site_url = cross_site_url.ReplaceComponents(replace_host); 399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Navigate to the initial URL and capture the RenderFrameHost for later 401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // comparison. 402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToURL(shell(), initial_url); 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* orig_rfh = shell()->web_contents()->GetMainFrame(); 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Install the observer and navigate cross-site. 406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameCreatedObserver observer(shell()); 407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToURL(shell(), cross_site_url); 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The observer should've seen a RenderFrameCreated call for the new frame 410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // and not the old one. 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(observer.last_rfh(), orig_rfh); 412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(observer.last_rfh(), shell()->web_contents()->GetMainFrame()); 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 415effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LoadingStateChangedForSameDocumentNavigation) { 417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<LoadingStateChangedDelegate> delegate( 419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new LoadingStateChangedDelegate()); 420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch shell()->web_contents()->SetDelegate(delegate.get()); 421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LoadStopNotificationObserver load_observer( 423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &shell()->web_contents()->GetController()); 424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TitleWatcher title_watcher(shell()->web_contents(), 425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::ASCIIToUTF16("pushState")); 426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigateToURL(shell(), embedded_test_server()->GetURL("/push_state.html")); 427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch load_observer.Wait(); 428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16 title = title_watcher.WaitAndGetTitle(); 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_EQ(title, base::ASCIIToUTF16("pushState")); 430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // LoadingStateChanged should be called 4 times: start and stop for the 432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // initial load of push_state.html, and start and stop for the "navigation" 433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // triggered by history.pushState(). However, the start notification for the 434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // history.pushState() navigation should set to_different_document to false. 435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("pushState", shell()->web_contents()->GetURL().ref()); 436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(4, delegate->loadingStateChangedCount()); 437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(3, delegate->loadingStateToDifferentDocumentCount()); 438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 441