12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/shell/shell.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/content_browser_test.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/content_browser_test_utils.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SitePerProcessWebContentsObserver: public WebContentsObserver {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SitePerProcessWebContentsObserver(WebContents* web_contents)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(web_contents),
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        navigation_succeeded_(true) {}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SitePerProcessWebContentsObserver() {}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidFailProvisionalLoad(
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& validated_url,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int error_code,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const string16& error_description,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host) OVERRIDE {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_url_ = validated_url;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_succeeded_ = false;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommitProvisionalLoadForFrame(
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageTransition transition_type,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host) OVERRIDE{
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_url_ = url;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_succeeded_ = true;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL& navigation_url() const {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return navigation_url_;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int navigation_succeeded() const { return navigation_succeeded_; }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL navigation_url_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool navigation_succeeded_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SitePerProcessWebContentsObserver);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RedirectNotificationObserver : public NotificationObserver {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register to listen for notifications of the given type from either a
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // specific source, or from all sources if |source| is
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NotificationService::AllSources().
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RedirectNotificationObserver(int notification_type,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const NotificationSource& source);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RedirectNotificationObserver();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait until the specified notification occurs.  If the notification was
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // emitted between the construction of this object and this call then it
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returns immediately.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Wait();
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns NotificationService::AllSources() if we haven't observed a
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // notification yet.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NotificationSource& source() const {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return source_;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NotificationDetails& details() const {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return details_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NotificationObserver:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const NotificationSource& source,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const NotificationDetails& details) OVERRIDE;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool seen_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool seen_twice_;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool running_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationRegistrar registrar_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationSource source_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationDetails details_;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MessageLoopRunner> message_loop_runner_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RedirectNotificationObserver);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RedirectNotificationObserver::RedirectNotificationObserver(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int notification_type,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NotificationSource& source)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : seen_(false),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      running_(false),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      source_(NotificationService::AllSources()) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this, notification_type, source);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RedirectNotificationObserver::~RedirectNotificationObserver() {}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RedirectNotificationObserver::Wait() {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (seen_ && seen_twice_)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  running_ = true;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_runner_ = new MessageLoopRunner;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_runner_->Run();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(seen_);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RedirectNotificationObserver::Observe(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NotificationSource& source,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NotificationDetails& details) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source_ = source;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  details_ = details;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  seen_twice_ = seen_;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  seen_ = true;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!running_)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_runner_->Quit();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  running_ = false;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SitePerProcessBrowserTest : public ContentBrowserTest {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SitePerProcessBrowserTest() {}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NavigateIframeToURL(Shell* window,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const GURL& url,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           std::string iframe_id) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string script = base::StringPrintf(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "var iframes = document.getElementById('%s');iframes.src='%s';",
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        iframe_id.c_str(), url.spec().c_str());
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WindowedNotificationObserver load_observer(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTIFICATION_LOAD_STOP,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Source<NavigationController>(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &shell()->web_contents()->GetController()));
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool result = ExecuteScript(window->web_contents(), script);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    load_observer.Wait();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    command_line->AppendSwitch(switches::kSitePerProcess);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(nasko): Disable this test until out-of-process iframes is ready and the
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// security checks are back in place.
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, DISABLED_CrossSiteIframe) {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server(
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::TYPE_HTTPS,
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::kLocalhost,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("content/test/data")));
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(https_server.Start());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL main_url(test_server()->GetURL("files/site_per_process_main.html"));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigateToURL(shell(), main_url);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SitePerProcessWebContentsObserver observer(shell()->web_contents());
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load same-site page into Iframe.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL http_url(test_server()->GetURL("files/title1.html"));
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(), http_url, "test"));
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), http_url);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load cross-site page into Iframe.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL https_url(https_server.GetURL("files/title1.html"));
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(), https_url, "test"));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), https_url);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(nasko): Disable this test until out-of-process iframes is ready and the
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// security checks are back in place.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_CrossSiteIframeRedirectOnce) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server(
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::TYPE_HTTPS,
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::kLocalhost,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("content/test/data")));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(https_server.Start());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL main_url(test_server()->GetURL("files/site_per_process_main.html"));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL https_url(https_server.GetURL("files/title1.html"));
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigateToURL(shell(), main_url);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SitePerProcessWebContentsObserver observer(shell()->web_contents());
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load cross-site client-redirect page into Iframe.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Should be blocked.
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL client_redirect_https_url(https_server.GetURL(
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "client-redirect?files/title1.html"));
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    client_redirect_https_url, "test"));
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DidFailProvisionalLoad when navigating to client_redirect_https_url.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), client_redirect_https_url);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load cross-site server-redirect page into Iframe,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which redirects to same-site page.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(https_server.GetURL(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + http_url.spec()));
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    server_redirect_http_url, "test"));
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), http_url);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load cross-site server-redirect page into Iframe,
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which redirects to cross-site page.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(https_server.GetURL(
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?files/title1.html"));
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    server_redirect_http_url, "test"));
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DidFailProvisionalLoad when navigating to https_url.
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), https_url);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load same-site server-redirect page into Iframe,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which redirects to cross-site page.
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(test_server()->GetURL(
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + https_url.spec()));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    server_redirect_http_url, "test"));
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), https_url);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load same-site client-redirect page into Iframe,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which redirects to cross-site page.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL client_redirect_http_url(test_server()->GetURL(
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "client-redirect?" + https_url.spec()));
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RedirectNotificationObserver load_observer2(
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTIFICATION_LOAD_STOP,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Source<NavigationController>(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &shell()->web_contents()->GetController()));
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    client_redirect_http_url, "test"));
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Same-site Client-Redirect Page should be loaded successfully.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), client_redirect_http_url);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Redirecting to Cross-site Page should be blocked.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    load_observer2.Wait();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), https_url);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load same-site server-redirect page into Iframe,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which redirects to same-site page.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(test_server()->GetURL(
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?files/title1.html"));
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    server_redirect_http_url, "test"));
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), http_url);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load same-site client-redirect page into Iframe,
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which redirects to same-site page.
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL client_redirect_http_url(test_server()->GetURL(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "client-redirect?" + http_url.spec()));
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RedirectNotificationObserver load_observer2(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTIFICATION_LOAD_STOP,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Source<NavigationController>(
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &shell()->web_contents()->GetController()));
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    client_redirect_http_url, "test"));
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Same-site Client-Redirect Page should be loaded successfully.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), client_redirect_http_url);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Redirecting to Same-site Page should be loaded successfully.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    load_observer2.Wait();
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), http_url);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(nasko): Disable this test until out-of-process iframes is ready and the
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// security checks are back in place.
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_CrossSiteIframeRedirectTwice) {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server(
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::TYPE_HTTPS,
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      net::SpawnedTestServer::kLocalhost,
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("content/test/data")));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(https_server.Start());
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL main_url(test_server()->GetURL("files/site_per_process_main.html"));
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL https_url(https_server.GetURL("files/title1.html"));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigateToURL(shell(), main_url);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SitePerProcessWebContentsObserver observer(shell()->web_contents());
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load client-redirect page pointing to a cross-site client-redirect page,
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which eventually redirects back to same-site page.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL client_redirect_https_url(https_server.GetURL(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "client-redirect?" + http_url.spec()));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL client_redirect_http_url(test_server()->GetURL(
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "client-redirect?" + client_redirect_https_url.spec()));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We should wait until second client redirect get cancelled.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RedirectNotificationObserver load_observer2(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTIFICATION_LOAD_STOP,
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Source<NavigationController>(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &shell()->web_contents()->GetController()));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(), client_redirect_http_url, "test"));
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DidFailProvisionalLoad when navigating to client_redirect_https_url.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    load_observer2.Wait();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), client_redirect_https_url);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load server-redirect page pointing to a cross-site server-redirect page,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which eventually redirect back to same-site page.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_https_url(https_server.GetURL(
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + http_url.spec()));
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(test_server()->GetURL(
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + server_redirect_https_url.spec()));
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(),
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    server_redirect_http_url, "test"));
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), http_url);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(observer.navigation_succeeded());
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load server-redirect page pointing to a cross-site server-redirect page,
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which eventually redirects back to cross-site page.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_https_url(https_server.GetURL(
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + https_url.spec()));
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(test_server()->GetURL(
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + server_redirect_https_url.spec()));
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(), server_redirect_http_url, "test"));
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DidFailProvisionalLoad when navigating to https_url.
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), https_url);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load server-redirect page pointing to a cross-site client-redirect page,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // which eventually redirects back to same-site page.
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL client_redirect_http_url(https_server.GetURL(
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "client-redirect?" + http_url.spec()));
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL server_redirect_http_url(test_server()->GetURL(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "server-redirect?" + client_redirect_http_url.spec()));
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NavigateIframeToURL(shell(), server_redirect_http_url, "test"));
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // DidFailProvisionalLoad when navigating to client_redirect_http_url.
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(observer.navigation_url(), client_redirect_http_url);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(observer.navigation_succeeded());
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
403