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