Commit 77197c1c authored by mnaganov's avatar mnaganov Committed by Commit bot

[Android WebView] Add tests for catching console messages on denied loads

Add test imitating several well-known situations where loading is blocked
by Blink. Verify that clients can know about blocks via
WebChromeClient.onConsoleMessage.

Remove traces of previous attempt to add ERR_BLOCKED code.

BUG=456782

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

Cr-Commit-Position: refs/heads/master@{#322185}
parent 531e5de1
......@@ -42,8 +42,6 @@ public abstract class ErrorCodeConversionHelper {
public static final int ERROR_FILE_NOT_FOUND = -14;
// Too many requests during this load
public static final int ERROR_TOO_MANY_REQUESTS = -15;
// Request blocked by the browser
public static final int ERROR_BLOCKED = -16;
static int convertErrorCode(int netError) {
// Note: many NetError.Error constants don't have an obvious mapping.
......
......@@ -380,37 +380,4 @@ public class ClientOnReceivedError2Test extends AwTestBase {
assertEquals(onReceivedError2CallCount + 1, onReceivedError2Helper.getCallCount());
assertEquals(BAD_HTML_URL, onReceivedError2Helper.getRequest().url);
}
/*
* TODO(mnaganov): Implement, add tests for other security blocks in Blink.
@SmallTest
@Feature({"AndroidWebView"})
public void testOnXFrameOptionsDenial() throws Throwable {
startWebServer();
final String iframeHtml = CommonResources.makeHtmlPageFrom(
"", "You shouldn't see me :)");
List<Pair<String, String>> iframeHeaders = new ArrayList<Pair<String, String>>();
iframeHeaders.add(Pair.create("x-frame-options", "DENY"));
final String iframeUrl = mWebServer.setResponse("/iframe.html", iframeHeaders);
final String pageHtml = CommonResources.makeHtmlPageFrom(
"", "<iframe src='" + iframeUrl + "' />");
getAwSettingsOnUiThread(mAwContents).setCacheMode(WebSettings.LOAD_CACHE_ONLY);
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
pageHtml, "text/html", false);
TestAwContentsClient.OnReceivedError2Helper onReceivedError2Helper =
mContentsClient.getOnReceivedError2Helper();
AwWebResourceRequest request = onReceivedError2Helper.getRequest();
assertNotNull(request);
assertEquals(iframeUrl, request.url);
assertEquals("GET", request.method);
assertNotNull(request.requestHeaders);
assertFalse(request.requestHeaders.isEmpty());
assertFalse(request.isMainFrame);
assertFalse(request.hasUserGesture);
AwWebResourceError error = onReceivedError2Helper.getError();
assertEquals(ErrorCodeConversionHelper.ERROR_BLOCKED, error.errorCode);
assertNotNull(error.description);
}
*/
}
// Copyright 2015 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.
package org.chromium.android_webview.test;
import android.os.Build;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Pair;
import android.webkit.ConsoleMessage;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwSettings;
import org.chromium.android_webview.test.util.CommonResources;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.net.test.util.TestWebServer;
import java.util.ArrayList;
import java.util.List;
/**
* Verify that content loading blocks initiated by renderer can be detected
* by the embedder via WebChromeClient.onConsoleMessage.
*/
@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT)
public class ConsoleMessagesForBlockedLoadsTest extends AwTestBase {
private TestAwContentsClient mContentsClient;
private AwTestContainerView mTestContainerView;
private TestAwContentsClient.AddMessageToConsoleHelper mOnConsoleMessageHelper;
private AwContents mAwContents;
private TestWebServer mWebServer;
@Override
public void setUp() throws Exception {
super.setUp();
mContentsClient = new TestAwContentsClient();
mTestContainerView = createAwTestContainerViewOnMainSync(mContentsClient);
mAwContents = mTestContainerView.getAwContents();
mOnConsoleMessageHelper = mContentsClient.getAddMessageToConsoleHelper();
}
@Override
protected void tearDown() throws Exception {
if (mWebServer != null) mWebServer.shutdown();
super.tearDown();
}
private void startWebServer() throws Exception {
mWebServer = TestWebServer.start();
}
private ConsoleMessage getSingleErrorMessage() {
ConsoleMessage result = null;
for (ConsoleMessage m : mOnConsoleMessageHelper.getMessages()) {
if (m.messageLevel() == ConsoleMessage.MessageLevel.ERROR) {
assertNull(result);
result = m;
}
}
assertNotNull(result);
return result;
}
@SmallTest
@Feature({"AndroidWebView"})
public void testXFrameOptionsDenial() throws Throwable {
startWebServer();
final String iframeHtml = CommonResources.makeHtmlPageFrom("", "FAIL");
List<Pair<String, String>> iframeHeaders = new ArrayList<Pair<String, String>>();
iframeHeaders.add(Pair.create("x-frame-options", "DENY"));
final String iframeUrl = mWebServer.setResponse("/iframe.html", iframeHtml, iframeHeaders);
final String pageHtml = CommonResources.makeHtmlPageFrom(
"", "<iframe src='" + iframeUrl + "' />");
final String pageUrl = mWebServer.setResponse("/page.html", pageHtml, null);
mOnConsoleMessageHelper.clearMessages();
loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
ConsoleMessage errorMessage = getSingleErrorMessage();
assertTrue(errorMessage.message().indexOf(iframeUrl) != -1);
}
@SmallTest
@Feature({"AndroidWebView"})
public void testMixedContentDenial() throws Throwable {
startWebServer();
TestWebServer httpsServer = null;
AwSettings settings = getAwSettingsOnUiThread(mAwContents);
settings.setMixedContentMode(AwSettings.MIXED_CONTENT_NEVER_ALLOW);
try {
httpsServer = TestWebServer.startSsl();
final String imageUrl = mWebServer.setResponseBase64(
"/insecure.png", CommonResources.FAVICON_DATA_BASE64, null);
final String secureHtml = CommonResources.makeHtmlPageFrom(
"", "<img src='" + imageUrl + "' />");
String secureUrl = httpsServer.setResponse("/secure.html", secureHtml, null);
mOnConsoleMessageHelper.clearMessages();
loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), secureUrl);
ConsoleMessage errorMessage = getSingleErrorMessage();
assertTrue(errorMessage.message().indexOf(imageUrl) != -1);
assertTrue(errorMessage.message().indexOf(secureUrl) != -1);
} finally {
if (httpsServer != null) {
httpsServer.shutdown();
}
}
}
@SmallTest
@Feature({"AndroidWebView"})
public void testCrossOriginDenial() throws Throwable {
startWebServer();
final String iframeXsl =
"<?xml version='1.0' encoding='UTF-8'?>"
+ "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>"
+ "<xsl:template match='*'>"
+ "<html><body>FAIL</body></html>"
+ "</xsl:template>"
+ "</xsl:stylesheet>";
final String iframeXslUrl = mWebServer.setResponse(
"/iframe.xsl", iframeXsl, null).replace("localhost", "127.0.0.1");
final String iframeXml =
"<?xml version='1.0' encoding='UTF-8'?>"
+ "<?xml-stylesheet type='text/xsl' href='" + iframeXslUrl + "'?>"
+ "<html xmlns='http://www.w3.org/1999/xhtml'>"
+ "<body>PASS</body></html>";
final String iframeXmlUrl = mWebServer.setResponse("/iframe.xml", iframeXml, null);
final String pageHtml = CommonResources.makeHtmlPageFrom(
"", "<iframe src='" + iframeXmlUrl + "' />");
final String pageUrl = mWebServer.setResponse("/page.html", pageHtml, null);
mOnConsoleMessageHelper.clearMessages();
loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
ConsoleMessage errorMessage = getSingleErrorMessage();
assertTrue(errorMessage.message().indexOf(iframeXslUrl) != -1);
assertTrue(errorMessage.message().indexOf(iframeXmlUrl) != -1);
}
}
......@@ -19,6 +19,9 @@ import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPage
import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageStartedHelper;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnReceivedErrorHelper;
import java.util.ArrayList;
import java.util.List;
/**
* AwContentsClient subclass used for testing.
*/
......@@ -327,8 +330,7 @@ public class TestAwContentsClient extends NullContentsClient {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
mAddMessageToConsoleHelper.notifyCalled(consoleMessage.messageLevel().ordinal(),
consoleMessage.message(), consoleMessage.lineNumber(), consoleMessage.sourceId());
mAddMessageToConsoleHelper.notifyCalled(consoleMessage);
return false;
}
......@@ -336,36 +338,42 @@ public class TestAwContentsClient extends NullContentsClient {
* Callback helper for AddMessageToConsole.
*/
public static class AddMessageToConsoleHelper extends CallbackHelper {
private int mLevel;
private String mMessage;
private int mLineNumber;
private String mSourceId;
private List<ConsoleMessage> mMessages = new ArrayList<ConsoleMessage>();
public void clearMessages() {
mMessages.clear();
}
public List<ConsoleMessage> getMessages() {
return mMessages;
}
public int getLevel() {
assert getCallCount() > 0;
return mLevel;
return getLastMessage().messageLevel().ordinal();
}
public String getMessage() {
assert getCallCount() > 0;
return mMessage;
return getLastMessage().message();
}
public int getLineNumber() {
assert getCallCount() > 0;
return mLineNumber;
return getLastMessage().lineNumber();
}
public String getSourceId() {
assert getCallCount() > 0;
return mSourceId;
return getLastMessage().sourceId();
}
private ConsoleMessage getLastMessage() {
return mMessages.get(mMessages.size() - 1);
}
void notifyCalled(int level, String message, int lineNumer, String sourceId) {
mLevel = level;
mMessage = message;
mLineNumber = lineNumer;
mSourceId = sourceId;
void notifyCalled(ConsoleMessage message) {
mMessages.add(message);
notifyCalled();
}
}
......
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