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