Commit b4110230 authored by fsamuel's avatar fsamuel Committed by Commit bot

<webview>: Add additional WebRequest API test coverage.

This CL adds a test which verifies that we read and change HTTP headers.

BUG=352293
TBR=rockot@chromium.org

Review URL: https://codereview.chromium.org/640603005

Cr-Commit-Position: refs/heads/master@{#299047}
parent e20e3b27
...@@ -69,6 +69,7 @@ using ui::MenuModel; ...@@ -69,6 +69,7 @@ using ui::MenuModel;
namespace { namespace {
const char kEmptyResponsePath[] = "/close-socket"; const char kEmptyResponsePath[] = "/close-socket";
const char kRedirectResponsePath[] = "/server-redirect"; const char kRedirectResponsePath[] = "/server-redirect";
const char kUserAgentRedirectResponsePath[] = "/detect-user-agent";
const char kRedirectResponseFullPath[] = const char kRedirectResponseFullPath[] =
"/extensions/platform_apps/web_view/shim/guest_redirect.html"; "/extensions/platform_apps/web_view/shim/guest_redirect.html";
...@@ -470,6 +471,28 @@ class WebViewTest : public extensions::PlatformAppBrowserTest { ...@@ -470,6 +471,28 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
} }
} }
// Handles |request| by serving a redirect response if the |User-Agent| is
// foobar.
static scoped_ptr<net::test_server::HttpResponse> UserAgentResponseHandler(
const std::string& path,
const GURL& redirect_target,
const net::test_server::HttpRequest& request) {
if (!StartsWithASCII(path, request.relative_url, true))
return scoped_ptr<net::test_server::HttpResponse>();
std::map<std::string, std::string>::const_iterator it =
request.headers.find("User-Agent");
EXPECT_TRUE(it != request.headers.end());
if (!StartsWithASCII("foobar", it->second, true))
return scoped_ptr<net::test_server::HttpResponse>();
scoped_ptr<net::test_server::BasicHttpResponse> http_response(
new net::test_server::BasicHttpResponse);
http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
http_response->AddCustomHeader("Location", redirect_target.spec());
return http_response.PassAs<net::test_server::HttpResponse>();
}
// Handles |request| by serving a redirect response. // Handles |request| by serving a redirect response.
static scoped_ptr<net::test_server::HttpResponse> RedirectResponseHandler( static scoped_ptr<net::test_server::HttpResponse> RedirectResponseHandler(
const std::string& path, const std::string& path,
...@@ -537,6 +560,12 @@ class WebViewTest : public extensions::PlatformAppBrowserTest { ...@@ -537,6 +560,12 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::Bind(&WebViewTest::EmptyResponseHandler, kEmptyResponsePath)); base::Bind(&WebViewTest::EmptyResponseHandler, kEmptyResponsePath));
embedded_test_server()->RegisterRequestHandler(
base::Bind(
&WebViewTest::UserAgentResponseHandler,
kUserAgentRedirectResponsePath,
embedded_test_server()->GetURL(kRedirectResponseFullPath)));
} }
LoadAndLaunchPlatformApp(app_location.c_str(), "Launched"); LoadAndLaunchPlatformApp(app_location.c_str(), "Launched");
...@@ -1028,6 +1057,12 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPI) { ...@@ -1028,6 +1057,12 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPI) {
TestHelper("testWebRequestAPI", "web_view/shim", NEEDS_TEST_SERVER); TestHelper("testWebRequestAPI", "web_view/shim", NEEDS_TEST_SERVER);
} }
IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIWithHeaders) {
TestHelper("testWebRequestAPIWithHeaders",
"web_view/shim",
NEEDS_TEST_SERVER);
}
IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIGoogleProperty) { IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIGoogleProperty) {
TestHelper("testWebRequestAPIGoogleProperty", TestHelper("testWebRequestAPIGoogleProperty",
"web_view/shim", "web_view/shim",
......
...@@ -24,6 +24,7 @@ embedder.setUp_ = function(config) { ...@@ -24,6 +24,7 @@ embedder.setUp_ = function(config) {
'/extensions/platform_apps/web_view/shim/guest.html'; '/extensions/platform_apps/web_view/shim/guest.html';
embedder.noReferrerGuestURL = embedder.baseGuestURL + embedder.noReferrerGuestURL = embedder.baseGuestURL +
'/extensions/platform_apps/web_view/shim/guest_noreferrer.html'; '/extensions/platform_apps/web_view/shim/guest_noreferrer.html';
embedder.detectUserAgentURL = embedder.baseGuestURL + '/detect-user-agent';
embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect'; embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect';
embedder.redirectGuestURLDest = embedder.baseGuestURL + embedder.redirectGuestURLDest = embedder.baseGuestURL +
'/extensions/platform_apps/web_view/shim/guest_redirect.html'; '/extensions/platform_apps/web_view/shim/guest_redirect.html';
...@@ -1083,6 +1084,52 @@ function testWebRequestAPI() { ...@@ -1083,6 +1084,52 @@ function testWebRequestAPI() {
document.body.appendChild(webview); document.body.appendChild(webview);
} }
// This test verifies that the WebRequest API onBeforeSendHeaders event fires on
// webview and supports headers. This tests verifies that we can modify HTTP
// headers via the WebRequest API and those modified headers will be sent to the
// HTTP server.
function testWebRequestAPIWithHeaders() {
var webview = new WebView();
var requestFilter = {
urls: ['<all_urls>']
};
var extraInfoSpec = ['requestHeaders', 'blocking'];
webview.request.onBeforeSendHeaders.addListener(function(details) {
var headers = details.requestHeaders;
for( var i = 0, l = headers.length; i < l; ++i ) {
if (headers[i].name == 'User-Agent') {
headers[i].value = 'foobar';
break;
}
}
var blockingResponse = {};
blockingResponse.requestHeaders = headers;
return blockingResponse;
}, requestFilter, extraInfoSpec);
var loadstartCalled = false;
webview.addEventListener('loadstart', function(e) {
embedder.test.assertTrue(e.isTopLevel);
embedder.test.assertEq(embedder.detectUserAgentURL, e.url);
loadstartCalled = true;
});
webview.addEventListener('loadredirect', function(e) {
embedder.test.assertTrue(e.isTopLevel);
embedder.test.assertEq(embedder.detectUserAgentURL,
e.oldUrl.replace('127.0.0.1', 'localhost'));
embedder.test.assertEq(embedder.redirectGuestURLDest,
e.newUrl.replace('127.0.0.1', 'localhost'));
if (loadstartCalled) {
embedder.test.succeed();
} else {
embedder.test.fail();
}
});
webview.src = embedder.detectUserAgentURL;
document.body.appendChild(webview);
}
// This test verifies that the basic use cases of the declarative WebRequest API // This test verifies that the basic use cases of the declarative WebRequest API
// work as expected. This test demonstrates that rules can be added prior to // work as expected. This test demonstrates that rules can be added prior to
// navigation and attachment. // navigation and attachment.
...@@ -1976,6 +2023,7 @@ embedder.test.testList = { ...@@ -1976,6 +2023,7 @@ embedder.test.testList = {
'testDeclarativeWebRequestAPISendMessage': 'testDeclarativeWebRequestAPISendMessage':
testDeclarativeWebRequestAPISendMessage, testDeclarativeWebRequestAPISendMessage,
'testWebRequestAPI': testWebRequestAPI, 'testWebRequestAPI': testWebRequestAPI,
'testWebRequestAPIWithHeaders': testWebRequestAPIWithHeaders,
'testWebRequestAPIGoogleProperty': testWebRequestAPIGoogleProperty, 'testWebRequestAPIGoogleProperty': testWebRequestAPIGoogleProperty,
'testWebRequestListenerSurvivesReparenting': 'testWebRequestListenerSurvivesReparenting':
testWebRequestListenerSurvivesReparenting, testWebRequestListenerSurvivesReparenting,
......
...@@ -36,6 +36,7 @@ namespace { ...@@ -36,6 +36,7 @@ namespace {
const char kEmptyResponsePath[] = "/close-socket"; const char kEmptyResponsePath[] = "/close-socket";
const char kRedirectResponsePath[] = "/server-redirect"; const char kRedirectResponsePath[] = "/server-redirect";
const char kRedirectResponseFullPath[] = "/guest_redirect.html"; const char kRedirectResponseFullPath[] = "/guest_redirect.html";
const char kUserAgentRedirectResponsePath[] = "/detect-user-agent";
const char kTestDataDirectory[] = "testDataDirectory"; const char kTestDataDirectory[] = "testDataDirectory";
const char kTestServerPort[] = "testServer.port"; const char kTestServerPort[] = "testServer.port";
const char kTestWebSocketPort[] = "testWebSocketPort"; const char kTestWebSocketPort[] = "testWebSocketPort";
...@@ -47,6 +48,28 @@ class EmptyHttpResponse : public net::test_server::HttpResponse { ...@@ -47,6 +48,28 @@ class EmptyHttpResponse : public net::test_server::HttpResponse {
} }
}; };
// Handles |request| by serving a redirect response if the |User-Agent| is
// foobar.
static scoped_ptr<net::test_server::HttpResponse> UserAgentResponseHandler(
const std::string& path,
const GURL& redirect_target,
const net::test_server::HttpRequest& request) {
if (!StartsWithASCII(path, request.relative_url, true))
return scoped_ptr<net::test_server::HttpResponse>();
std::map<std::string, std::string>::const_iterator it =
request.headers.find("User-Agent");
EXPECT_TRUE(it != request.headers.end());
if (!StartsWithASCII("foobar", it->second, true))
return scoped_ptr<net::test_server::HttpResponse>();
scoped_ptr<net::test_server::BasicHttpResponse> http_response(
new net::test_server::BasicHttpResponse);
http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
http_response->AddCustomHeader("Location", redirect_target.spec());
return http_response.PassAs<net::test_server::HttpResponse>();
}
// Handles |request| by serving a redirect response. // Handles |request| by serving a redirect response.
scoped_ptr<net::test_server::HttpResponse> RedirectResponseHandler( scoped_ptr<net::test_server::HttpResponse> RedirectResponseHandler(
const std::string& path, const std::string& path,
...@@ -147,6 +170,12 @@ void WebViewAPITest::StartTestServer() { ...@@ -147,6 +170,12 @@ void WebViewAPITest::StartTestServer() {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::Bind(&EmptyResponseHandler, kEmptyResponsePath)); base::Bind(&EmptyResponseHandler, kEmptyResponsePath));
embedded_test_server()->RegisterRequestHandler(
base::Bind(
&UserAgentResponseHandler,
kUserAgentRedirectResponsePath,
embedded_test_server()->GetURL(kRedirectResponseFullPath)));
} }
void WebViewAPITest::StopTestServer() { void WebViewAPITest::StopTestServer() {
...@@ -469,6 +498,12 @@ IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPI) { ...@@ -469,6 +498,12 @@ IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPI) {
StopTestServer(); StopTestServer();
} }
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPIWithHeaders) {
StartTestServer();
RunTest("testWebRequestAPIWithHeaders", "web_view/apitest");
StopTestServer();
}
// Tests the existence of WebRequest API event objects on the request // Tests the existence of WebRequest API event objects on the request
// object, on the webview element, and hanging directly off webview. // object, on the webview element, and hanging directly off webview.
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPIExistence) { IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestWebRequestAPIExistence) {
......
...@@ -14,6 +14,7 @@ embedder.setUp_ = function(config) { ...@@ -14,6 +14,7 @@ embedder.setUp_ = function(config) {
embedder.emptyGuestURL = embedder.baseGuestURL + '/empty_guest.html'; embedder.emptyGuestURL = embedder.baseGuestURL + '/empty_guest.html';
embedder.noReferrerGuestURL = embedder.noReferrerGuestURL =
embedder.baseGuestURL + '/guest_noreferrer.html'; embedder.baseGuestURL + '/guest_noreferrer.html';
embedder.detectUserAgentURL = embedder.baseGuestURL + '/detect-user-agent';
embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect'; embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect';
embedder.redirectGuestURLDest = embedder.redirectGuestURLDest =
embedder.baseGuestURL + '/guest_redirect.html'; embedder.baseGuestURL + '/guest_redirect.html';
...@@ -1549,6 +1550,52 @@ function testWebRequestAPI() { ...@@ -1549,6 +1550,52 @@ function testWebRequestAPI() {
document.body.appendChild(webview); document.body.appendChild(webview);
} }
// This test verifies that the WebRequest API onBeforeSendHeaders event fires on
// webview and supports headers. This tests verifies that we can modify HTTP
// headers via the WebRequest API and those modified headers will be sent to the
// HTTP server.
function testWebRequestAPIWithHeaders() {
var webview = new WebView();
var requestFilter = {
urls: ['<all_urls>']
};
var extraInfoSpec = ['requestHeaders', 'blocking'];
webview.request.onBeforeSendHeaders.addListener(function(details) {
var headers = details.requestHeaders;
for( var i = 0, l = headers.length; i < l; ++i ) {
if (headers[i].name == 'User-Agent') {
headers[i].value = 'foobar';
break;
}
}
var blockingResponse = {};
blockingResponse.requestHeaders = headers;
return blockingResponse;
}, requestFilter, extraInfoSpec);
var loadstartCalled = false;
webview.addEventListener('loadstart', function(e) {
embedder.test.assertTrue(e.isTopLevel);
embedder.test.assertEq(embedder.detectUserAgentURL, e.url);
loadstartCalled = true;
});
webview.addEventListener('loadredirect', function(e) {
embedder.test.assertTrue(e.isTopLevel);
embedder.test.assertEq(embedder.detectUserAgentURL,
e.oldUrl.replace('127.0.0.1', 'localhost'));
embedder.test.assertEq(embedder.redirectGuestURLDest,
e.newUrl.replace('127.0.0.1', 'localhost'));
if (loadstartCalled) {
embedder.test.succeed();
} else {
embedder.test.fail();
}
});
webview.src = embedder.detectUserAgentURL;
document.body.appendChild(webview);
}
function testWebRequestAPIExistence() { function testWebRequestAPIExistence() {
var apiPropertiesToCheck = [ var apiPropertiesToCheck = [
// Declarative WebRequest API. // Declarative WebRequest API.
...@@ -1672,6 +1719,7 @@ embedder.test.testList = { ...@@ -1672,6 +1719,7 @@ embedder.test.testList = {
'testResizeWebviewResizesContent': testResizeWebviewResizesContent, 'testResizeWebviewResizesContent': testResizeWebviewResizesContent,
'testTerminateAfterExit': testTerminateAfterExit, 'testTerminateAfterExit': testTerminateAfterExit,
'testWebRequestAPI': testWebRequestAPI, 'testWebRequestAPI': testWebRequestAPI,
'testWebRequestAPIWithHeaders': testWebRequestAPIWithHeaders,
'testWebRequestAPIExistence': testWebRequestAPIExistence, 'testWebRequestAPIExistence': testWebRequestAPIExistence,
'testWebRequestAPIGoogleProperty': testWebRequestAPIGoogleProperty 'testWebRequestAPIGoogleProperty': testWebRequestAPIGoogleProperty
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment