blob: cf68659db60906c7d87fa870be94718f9a710429 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/public/browser/resource_request_details.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/shell/browser/shell.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
namespace content {
class NavigationObserver: public WebContentsObserver {
public:
explicit NavigationObserver(WebContents* web_contents)
: WebContentsObserver(web_contents) {}
virtual ~NavigationObserver() {}
virtual void DidCommitProvisionalLoadForFrame(
RenderFrameHost* render_frame_host,
const GURL& url,
ui::PageTransition transition_type) OVERRIDE {
navigation_url_ = url;
}
virtual void DidGetRedirectForResourceRequest(
RenderViewHost* render_view_host,
const ResourceRedirectDetails& details) OVERRIDE {
redirect_url_ = details.new_url;
}
const GURL& navigation_url() const {
return navigation_url_;
}
const GURL& redirect_url() const {
return redirect_url_;
}
private:
GURL redirect_url_;
GURL navigation_url_;
DISALLOW_COPY_AND_ASSIGN(NavigationObserver);
};
class CrossSiteRedirectorBrowserTest : public ContentBrowserTest {
public:
CrossSiteRedirectorBrowserTest() {}
};
IN_PROC_BROWSER_TEST_F(CrossSiteRedirectorBrowserTest,
VerifyCrossSiteRedirectURL) {
// Map all hosts to localhost and setup the EmbeddedTestServer for redirects.
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
SetupCrossSiteRedirector(embedded_test_server());
embedded_test_server()->ServeFilesFromDirectory(GetTestFilePath("files", ""));
// Navigate to http://localhost:<port>/cross-site/foo.com/title2.html and
// ensure that the redirector forwards the navigation to
// http://foo.com:<port>/title2.html
NavigationObserver observer(shell()->web_contents());
NavigateToURL(
shell(),
embedded_test_server()->GetURL("/cross-site/foo.com/title2.html"));
// The expectation is that the cross-site redirector will take the
// hostname supplied in the URL and rewrite the URL. Build the
// expected URL to ensure navigation was properly redirected.
GURL::Replacements replace_host;
std::string foo_com("foo.com");
GURL expected_url(embedded_test_server()->GetURL("/title2.html"));
replace_host.SetHostStr(foo_com);
expected_url = expected_url.ReplaceComponents(replace_host);
EXPECT_EQ(expected_url, observer.navigation_url());
EXPECT_EQ(observer.redirect_url(), observer.navigation_url());
}
} // namespace content
|