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