web_contents_impl_browsertest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org// Copyright 2013 The Chromium Authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Use of this source code is governed by a BSD-style license that can be 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "base/strings/utf_string_conversions.h" 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "base/values.h" 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/browser/frame_host/navigation_entry_impl.h" 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/browser/web_contents/web_contents_impl.h" 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/browser/web_contents/web_contents_view.h" 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/load_notification_details.h" 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/navigation_controller.h" 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/notification_details.h" 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/notification_observer.h" 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/notification_types.h" 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/render_view_host.h" 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/render_widget_host_view.h" 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/browser/web_contents_observer.h" 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/common/content_paths.h" 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/test/browser_test_utils.h" 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/test/content_browser_test.h" 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/test/content_browser_test_utils.h" 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/public/test/test_utils.h" 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "content/shell/browser/shell.h" 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "net/dns/mock_host_resolver.h" 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "net/test/embedded_test_server/embedded_test_server.h" 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace content { 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ResizeWebContentsView(Shell* shell, const gfx::Size& size, 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool set_start_page) { 31c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // Shell::SizeTo is not implemented on Aura; WebContentsView::SizeContents 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // works on Win and ChromeOS but not Linux - we need to resize the shell 331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // window on Linux because if we don't, the next layout of the unchanged shell 34f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org // window will resize WebContentsView back to the previous size. 35b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // SizeContents is a hack and should not be relied on. 3665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org#if defined(OS_MACOSX) 37ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org shell->SizeTo(size); 38dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org // If |set_start_page| is true, start with blank page to make sure resize 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // takes effect. 40fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org if (set_start_page) 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NavigateToURL(shell, GURL("about://blank")); 4255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#else 43b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org static_cast<WebContentsImpl*>(shell->web_contents())->GetView()-> 44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org SizeContents(size); 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // defined(OS_MACOSX) 4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 4771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass WebContentsImplBrowserTest : public ContentBrowserTest { 49b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org public: 50b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org WebContentsImplBrowserTest() {} 51b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 52b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org private: 53b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org DISALLOW_COPY_AND_ASSIGN(WebContentsImplBrowserTest); 54b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org}; 55b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 56b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org// Keeps track of data from LoadNotificationDetails so we can later verify that 57b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org// they are correct, after the LoadNotificationDetails object is deleted. 58b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgclass LoadStopNotificationObserver : public WindowedNotificationObserver { 59b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org public: 60b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org LoadStopNotificationObserver(NavigationController* controller) 61b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org : WindowedNotificationObserver(NOTIFICATION_LOAD_STOP, 62b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org Source<NavigationController>(controller)), 63b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org session_index_(-1), 64b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org controller_(NULL) { 65b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org } 66b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org virtual void Observe(int type, 67b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org const NotificationSource& source, 68b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org const NotificationDetails& details) OVERRIDE { 69b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org if (type == NOTIFICATION_LOAD_STOP) { 70b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org const Details<LoadNotificationDetails> load_details(details); 71b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org url_ = load_details->url; 72b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org session_index_ = load_details->session_index; 73b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org controller_ = load_details->controller; 74b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org } 75b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org WindowedNotificationObserver::Observe(type, source, details); 76b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org } 77b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 78b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org GURL url_; 79b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org int session_index_; 80b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org NavigationController* controller_; 81b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org}; 82b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 83b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org// Starts a new navigation as soon as the current one commits, but does not 84b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org// wait for it to complete. This allows us to observe DidStopLoading while 85b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org// a pending entry is present. 86b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgclass NavigateOnCommitObserver : public WebContentsObserver { 87b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org public: 88b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org NavigateOnCommitObserver(Shell* shell, GURL url) 89400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org : WebContentsObserver(shell->web_contents()), 90400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org shell_(shell), 91c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org url_(url), 92c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org done_(false) { 93c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 94c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 95a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // WebContentsObserver: 96c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org virtual void NavigationEntryCommitted( 97a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const LoadCommittedDetails& load_details) OVERRIDE { 98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (!done_) { 99a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org done_ = true; 100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org shell_->Stop(); 101a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org shell_->LoadURL(url_); 102a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 103a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 104c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 105a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Shell* shell_; 1067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org GURL url_; 107a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool done_; 108a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 109a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 110a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass RenderViewSizeDelegate : public WebContentsDelegate { 111a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 112a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void set_size_insets(const gfx::Size& size_insets) { 113a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org size_insets_ = size_insets; 114a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 115a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // WebContentsDelegate: 117a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual gfx::Size GetSizeForNewRenderView( 1187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org WebContents* web_contents) const OVERRIDE { 119a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org gfx::Size size(web_contents->GetContainerBounds().size()); 1207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org size.Enlarge(size_insets_.width(), size_insets_.height()); 121a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return size; 1227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org } 1237028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 124a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 125a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org gfx::Size size_insets_; 126a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 127a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 128a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass RenderViewSizeObserver : public WebContentsObserver { 129a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 130a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RenderViewSizeObserver(Shell* shell, const gfx::Size& wcv_new_size) 131a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org : WebContentsObserver(shell->web_contents()), 1327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org shell_(shell), 133a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org wcv_new_size_(wcv_new_size) { 1347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org } 135a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 136a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // WebContentsObserver: 137a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual void RenderViewCreated(RenderViewHost* rvh) OVERRIDE { 138a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org rwhv_create_size_ = rvh->GetView()->GetViewBounds().size(); 139a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 140a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 141a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual void DidStartNavigationToPendingEntry( 142a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const GURL& url, 143a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NavigationController::ReloadType reload_type) OVERRIDE { 144a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ResizeWebContentsView(shell_, wcv_new_size_, false); 145a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 146a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 147a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org gfx::Size rwhv_create_size() const { return rwhv_create_size_; } 148a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 149a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 150a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Shell* shell_; // Weak ptr. 1517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org gfx::Size wcv_new_size_; 152a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org gfx::Size rwhv_create_size_; 153a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 1547028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 155a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass LoadingStateChangedDelegate : public WebContentsDelegate { 156a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 157a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org LoadingStateChangedDelegate() 158a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org : loadingStateChangedCount_(0) 159a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org , loadingStateToDifferentDocumentCount_(0) { 160a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 161a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // WebContentsDelegate: 163a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual void LoadingStateChanged(WebContents* contents, 164a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool to_different_document) OVERRIDE { 165a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org loadingStateChangedCount_++; 166a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (to_different_document) 167a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org loadingStateToDifferentDocumentCount_++; 168a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 169a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 170a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int loadingStateChangedCount() const { return loadingStateChangedCount_; } 171a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int loadingStateToDifferentDocumentCount() const { 172a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return loadingStateToDifferentDocumentCount_; 173a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 174a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 175a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 176a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int loadingStateChangedCount_; 177a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int loadingStateToDifferentDocumentCount_; 178a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 179a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 180a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// See: http://crbug.com/298193 1817028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org#if defined(OS_WIN) 182a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAYBE_DidStopLoadingDetails DISABLED_DidStopLoadingDetails 1837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org#else 184a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAYBE_DidStopLoadingDetails DidStopLoadingDetails 185a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#endif 186a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 187a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that DidStopLoading includes the correct URL in the details. 188a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 189a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org MAYBE_DidStopLoadingDetails) { 190a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 191a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 192a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org LoadStopNotificationObserver load_observer( 193a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org &shell()->web_contents()->GetController()); 194a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 195a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org load_observer.Wait(); 196a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 197a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EXPECT_EQ("/title1.html", load_observer.url_.path()); 1987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org EXPECT_EQ(0, load_observer.session_index_); 199a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EXPECT_EQ(&shell()->web_contents()->GetController(), 200a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org load_observer.controller_); 201a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 2020c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 2030c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org// See: http://crbug.com/298193 2040c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org#if defined(OS_WIN) 205a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAYBE_DidStopLoadingDetailsWithPending \ 206a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org DISABLED_DidStopLoadingDetailsWithPending 207a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#else 208a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAYBE_DidStopLoadingDetailsWithPending DidStopLoadingDetailsWithPending 209a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#endif 210a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 211a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that DidStopLoading includes the correct URL in the details when a 212a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// pending entry is present. 213a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 214a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org MAYBE_DidStopLoadingDetailsWithPending) { 215a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org GURL url("data:text/html,<div>test</div>"); 2177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 218a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Listen for the first load to stop. 219a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org LoadStopNotificationObserver load_observer( 220a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org &shell()->web_contents()->GetController()); 221c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // Start a new pending navigation as soon as the first load commits. 222a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // We will hear a DidStopLoading from the first load as the new load 223a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // is started. 224a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NavigateOnCommitObserver commit_observer( 225a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org shell(), embedded_test_server()->GetURL("/title2.html")); 226a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NavigateToURL(shell(), url); 227a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org load_observer.Wait(); 228a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 229a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EXPECT_EQ(url, load_observer.url_); 23037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com EXPECT_EQ(0, load_observer.session_index_); 23137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com EXPECT_EQ(&shell()->web_contents()->GetController(), 232a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org load_observer.controller_); 233a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 234a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test that a renderer-initiated navigation to an invalid URL does not leave 235a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// around a pending entry that could be used in a URL spoof. We test this in 2367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org// a browser test because our unit test framework incorrectly calls 237a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// DidStartProvisionalLoadForFrame for in-page navigations. 238a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// See http://crbug.com/280512. 239a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 240a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ClearNonVisiblePendingOnFail) { 241a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 242a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 243a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 2447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 245a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Navigate to an invalid URL and make sure it doesn't leave a pending entry. 246a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org LoadStopNotificationObserver load_observer1( 247a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org &shell()->web_contents()->GetController()); 248a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 2499e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org "window.location.href=\"nonexistent:12121\";")); 250fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org load_observer1.Wait(); 251fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org EXPECT_FALSE(shell()->web_contents()->GetController().GetPendingEntry()); 252fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org 253fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org LoadStopNotificationObserver load_observer2( 254fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org &shell()->web_contents()->GetController()); 255fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 2569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org "window.location.href=\"#foo\";")); 257ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org load_observer2.Wait(); 258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org EXPECT_EQ(embedded_test_server()->GetURL("/title1.html#foo"), 2599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org shell()->web_contents()->GetVisibleURL()); 260ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 261154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 2629e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// Crashes under ThreadSanitizer, http://crbug.com/356758. 263fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org#if defined(OS_WIN) || defined(OS_ANDROID) \ 2649e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org || defined(THREAD_SANITIZER) 265fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org#define MAYBE_GetSizeForNewRenderView DISABLED_GetSizeForNewRenderView 266fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org#else 267fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org#define MAYBE_GetSizeForNewRenderView GetSizeForNewRenderView 2689e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#endif 269fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org// Test that RenderViewHost is created and updated at the size specified by 270fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org// WebContentsDelegate::GetSizeForNewRenderView(). 271fa943b736b1d996084393011529d568165bb5d83lrn@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 272fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org MAYBE_GetSizeForNewRenderView) { 2737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 274fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org // Create a new server with a different site. 275fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org net::SpawnedTestServer https_server( 276fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org net::SpawnedTestServer::TYPE_HTTPS, 2779e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org net::SpawnedTestServer::kLocalhost, 278ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org base::FilePath(FILE_PATH_LITERAL("content/test/data"))); 279ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT_TRUE(https_server.Start()); 2809e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 281ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org scoped_ptr<RenderViewSizeDelegate> delegate(new RenderViewSizeDelegate()); 282154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org shell()->web_contents()->SetDelegate(delegate.get()); 2839e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org ASSERT_TRUE(shell()->web_contents()->GetDelegate() == delegate.get()); 284fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org 2855b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org // When no size is set, RenderWidgetHostView adopts the size of 28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // WebContentsView. 2877979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org NavigateToURL(shell(), embedded_test_server()->GetURL("/title2.html")); 288fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org EXPECT_EQ(shell()->web_contents()->GetContainerBounds().size(), 289fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen size()); 29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 292d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // When a size is set, RenderWidgetHostView and WebContentsView honor this 293d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // size. 294d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org gfx::Size size(300, 300); 2955b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org gfx::Size size_insets(10, 15); 2965b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org ResizeWebContentsView(shell(), size, true); 2975b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org delegate->set_size_insets(size_insets); 2985b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org NavigateToURL(shell(), https_server.GetURL("/")); 299d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org size.Enlarge(size_insets.width(), size_insets.height()); 300d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org EXPECT_EQ(size, 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen shell()->web_contents()->GetRenderWidgetHostView()->GetViewBounds(). 30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen size()); 30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The web_contents size is set by the embedder, and should not depend on the 30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // rwhv size. The behavior is correct on OSX, but incorrect on other 30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // platforms. 306d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com gfx::Size exp_wcv_size(300, 300); 307d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com#if !defined(OS_MACOSX) 3085b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org exp_wcv_size.Enlarge(size_insets.width(), size_insets.height()); 3095b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org#endif 3105b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 3115b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org EXPECT_EQ(exp_wcv_size, 3125b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org shell()->web_contents()->GetContainerBounds().size()); 3135b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 314beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org // If WebContentsView is resized after RenderWidgetHostView is created but 315beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org // before pending navigation entry is committed, both RenderWidgetHostView and 316beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org // WebContentsView use the new size of WebContentsView. 3175b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org gfx::Size init_size(200, 200); 3185b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org gfx::Size new_size(100, 100); 319beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org size_insets = gfx::Size(20, 30); 320beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org ResizeWebContentsView(shell(), init_size, true); 321beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org delegate->set_size_insets(size_insets); 322beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org RenderViewSizeObserver observer(shell(), new_size); 323beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 324beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org // RenderWidgetHostView is created at specified size. 325beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org init_size.Enlarge(size_insets.width(), size_insets.height()); 326beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org EXPECT_EQ(init_size, observer.rwhv_create_size()); 327beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 328beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Once again, the behavior is correct on OSX. The embedder explicitly sets 3295b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org// the size to (100,100) during navigation. Both the wcv and the rwhv should 330beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// take on that size. 331beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#if !defined(OS_MACOSX) 332beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org new_size.Enlarge(size_insets.width(), size_insets.height()); 3335b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org#endif 3345b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org gfx::Size actual_size = shell()->web_contents()->GetRenderWidgetHostView()-> 3355b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org GetViewBounds().size(); 3365b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 337beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org EXPECT_EQ(new_size, actual_size); 338beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org EXPECT_EQ(new_size, shell()->web_contents()->GetContainerBounds().size()); 339beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org} 3405b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 3415b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, OpenURLSubframe) { 3425b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 3435b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org // Navigate with FrameTreeNode ID 4. 344beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org const GURL url("http://foo"); 3455b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org OpenURLParams params(url, Referrer(), 4, CURRENT_TAB, PAGE_TRANSITION_LINK, 3465b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org true); 3475b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org shell()->web_contents()->OpenURL(params); 3485b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 349beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org // Make sure the NavigationEntry ends up with the FrameTreeNode ID. 3505b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org NavigationController* controller = &shell()->web_contents()->GetController(); 351d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com EXPECT_TRUE(controller->GetPendingEntry()); 3525b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org EXPECT_EQ(4, NavigationEntryImpl::FromNavigationEntry( 353beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org controller->GetPendingEntry())->frame_tree_node_id()); 3545b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org} 35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Observer class to track the creation of RenderFrameHost objects. It is used 35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// in subsequent tests. 35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass RenderFrameCreatedObserver : public WebContentsObserver { 3592ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org public: 36065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org RenderFrameCreatedObserver(Shell* shell) 36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen : WebContentsObserver(shell->web_contents()), 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen last_rfh_(NULL) { 36365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org } 36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) OVERRIDE { 36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen last_rfh_ = render_frame_host; 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RenderFrameHost* last_rfh() const { return last_rfh_; } 37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 372beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org RenderFrameHost* last_rfh_; 373beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_COPY_AND_ASSIGN(RenderFrameCreatedObserver); 37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Test that creation of new RenderFrameHost objects sends the correct object 37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// to the WebContentObservers. See http://crbug.com/347339. 379beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 38065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org RenderFrameCreatedCorrectProcessForObservers) { 38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen std::string foo_com("foo.com"); 38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GURL::Replacements replace_host; 38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen net::HostPortPair foo_host_port; 38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GURL cross_site_url; 385beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Setup the server to allow serving separate sites, so we can perform 387d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // cross-process navigation. 388d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com host_resolver()->AddRule("*", "127.0.0.1"); 389beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org ASSERT_TRUE(test_server()->Start()); 390beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen foo_host_port = test_server()->host_port_pair(); 39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen foo_host_port.set_host(foo_com); 39365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GURL initial_url(test_server()->GetURL("/title1.html")); 39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cross_site_url = test_server()->GetURL("/title2.html"); 39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen replace_host.SetHostStr(foo_com); 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cross_site_url = cross_site_url.ReplaceComponents(replace_host); 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Navigate to the initial URL and capture the RenderFrameHost for later 401beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org // comparison. 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NavigateToURL(shell(), initial_url); 40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RenderFrameHost* orig_rfh = shell()->web_contents()->GetMainFrame(); 40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Install the observer and navigate cross-site. 406beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org RenderFrameCreatedObserver observer(shell()); 40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NavigateToURL(shell(), cross_site_url); 40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The observer should've seen a RenderFrameCreated call for the new frame 410394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // and not the old one. 4117028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org EXPECT_NE(observer.last_rfh(), orig_rfh); 412394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com EXPECT_EQ(observer.last_rfh(), shell()->web_contents()->GetMainFrame()); 41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 4164f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org LoadingStateChangedForSameDocumentNavigation) { 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen scoped_ptr<LoadingStateChangedDelegate> delegate( 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen new LoadingStateChangedDelegate()); 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen shell()->web_contents()->SetDelegate(delegate.get()); 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen LoadStopNotificationObserver load_observer( 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen &shell()->web_contents()->GetController()); 42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TitleWatcher title_watcher(shell()->web_contents(), 425e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org base::ASCIIToUTF16("pushState")); 426e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org NavigateToURL(shell(), embedded_test_server()->GetURL("/push_state.html")); 427e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org load_observer.Wait(); 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen base::string16 title = title_watcher.WaitAndGetTitle(); 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_EQ(title, base::ASCIIToUTF16("pushState")); 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 431e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // LoadingStateChanged should be called 4 times: start and stop for the 43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // initial load of push_state.html, and start and stop for the "navigation" 43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // triggered by history.pushState(). However, the start notification for the 434b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // history.pushState() navigation should set to_different_document to false. 4350b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org EXPECT_EQ("pushState", shell()->web_contents()->GetURL().ref()); 436b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org EXPECT_EQ(4, delegate->loadingStateChangedCount()); 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EXPECT_EQ(3, delegate->loadingStateToDifferentDocumentCount()); 438e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org} 4390b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 440b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, 44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen RenderViewCreatedForChildWindow) { 44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NavigateToURL(shell(), 44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen embedded_test_server()->GetURL("/title1.html")); 446e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 447e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org WebContentsAddedObserver new_web_contents_observer; 448e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org ASSERT_TRUE(ExecuteScript(shell()->web_contents(), 44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "var a = document.createElement('a');" 45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "a.href='./title2.html';" 45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "a.target = '_blank';" 452e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org "document.body.appendChild(a);" 45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "a.click();")); 45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen WebContents* new_web_contents = new_web_contents_observer.GetWebContents(); 45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen WaitForLoadStop(new_web_contents); 456e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org EXPECT_TRUE(new_web_contents_observer.RenderViewCreatedCalled()); 457b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct LoadProgressDelegateAndObserver : public WebContentsDelegate, 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public WebContentsObserver { 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen LoadProgressDelegateAndObserver(Shell* shell) 462c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org : WebContentsObserver(shell->web_contents()), 463c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org did_start_loading(false), 464c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org did_stop_loading(false) { 465c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org web_contents()->SetDelegate(this); 466c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 467394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 468c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // WebContentsDelegate: 469394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com virtual void LoadProgressChanged(WebContents* source, 470c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org double progress) OVERRIDE { 471394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com EXPECT_TRUE(did_start_loading); 472c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org EXPECT_FALSE(did_stop_loading); 473394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com progresses.push_back(progress); 474394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 475394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 476c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // WebContentsObserver: 477394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com virtual void DidStartLoading(RenderViewHost* render_view_host) OVERRIDE { 478394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com EXPECT_FALSE(did_start_loading); 479394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com EXPECT_EQ(0U, progresses.size()); 480c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org EXPECT_FALSE(did_stop_loading); 481394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com did_start_loading = true; 482394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 484c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 485c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org EXPECT_TRUE(did_start_loading); 486c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org EXPECT_GE(progresses.size(), 1U); 487c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org EXPECT_FALSE(did_stop_loading); 48804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org did_stop_loading = true; 489c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 490c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 491c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool did_start_loading; 492c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org std::vector<double> progresses; 493c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool did_stop_loading; 494c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}; 495b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 4965a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgIN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, LoadProgress) { 497ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 498c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org scoped_ptr<LoadProgressDelegateAndObserver> delegate( 499471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org new LoadProgressDelegateAndObserver(shell())); 500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")); 502ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 503c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org const std::vector<double>& progresses = delegate->progresses; 504c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // All updates should be in order ... 505c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org if (std::adjacent_find(progresses.begin(), 50656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org progresses.end(), 50756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org std::greater<double>()) != progresses.end()) { 50856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org ADD_FAILURE() << "Progress values should be in order: " 509ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org << ::testing::PrintToString(progresses); 510ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 511ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ... and the last one should be 1.0, meaning complete. 51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_GE(progresses.size(), 1U) 51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen << "There should be at least one progress update"; 51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen EXPECT_EQ(1.0, *progresses.rbegin()); 51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} // namespace content 51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen