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