| Index: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
|
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
|
| index 29b67402b0152fc4390613bc4964a40f93b341ad..b96529eca320c71f03199e612642a6b60dce5e26 100644
|
| --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
|
| @@ -11,6 +11,7 @@ import org.chromium.android_webview.AwContents;
|
| import org.chromium.android_webview.AwContentsClient;
|
| import org.chromium.android_webview.test.util.CommonResources;
|
| import org.chromium.android_webview.test.util.JSUtils;
|
| +import org.chromium.android_webview.test.util.JavascriptEventObserver;
|
| import org.chromium.base.annotations.SuppressFBWarnings;
|
| import org.chromium.base.test.util.DisabledTest;
|
| import org.chromium.base.test.util.Feature;
|
| @@ -25,6 +26,7 @@ import org.chromium.net.test.util.TestWebServer;
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| import java.util.concurrent.Callable;
|
| +import java.util.concurrent.CountDownLatch;
|
| import java.util.concurrent.TimeUnit;
|
|
|
| /**
|
| @@ -720,7 +722,9 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
|
| assertEquals(redirectTarget,
|
| mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
|
| assertEquals(serverSideRedirect, mShouldOverrideUrlLoadingHelper.isRedirect());
|
| - assertFalse(mShouldOverrideUrlLoadingHelper.hasUserGesture());
|
| + // We keep the user gesture from the initial navigation for serverside redirects but drop
|
| + // the user gesture for browser initiated redirects.
|
| + assertEquals(serverSideRedirect, mShouldOverrideUrlLoadingHelper.hasUserGesture());
|
| assertTrue(mShouldOverrideUrlLoadingHelper.isMainFrame());
|
| }
|
|
|
| @@ -1049,4 +1053,88 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
|
| assertTrue(mShouldOverrideUrlLoadingHelper.hasUserGesture());
|
| assertFalse(mShouldOverrideUrlLoadingHelper.isMainFrame());
|
| }
|
| +
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testXhrInLink() throws Throwable {
|
| + standardSetup();
|
| + final CountDownLatch shouldOverrideUrlLoadingSignal = new CountDownLatch(1);
|
| +
|
| + final String xhrPath = "/xhrPath.html";
|
| + final String xhrUrl = mWebServer.setResponseWithRunnableAction(
|
| + xhrPath, CommonResources.makeHtmlPageFrom("", ""), null, new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + try {
|
| + shouldOverrideUrlLoadingSignal.await();
|
| + } catch (InterruptedException e) {
|
| + throw new RuntimeException(e);
|
| + }
|
| + }
|
| + });
|
| +
|
| + final String xhrJs = "function xhrFunction() {"
|
| + + " var xhr = new XMLHttpRequest();"
|
| + + " xhr.onload=function() {"
|
| + + " console.info('xhr loaded');"
|
| + + " window.jsInterface.setValue(true);"
|
| + + " };"
|
| + + " xhr.onerror=function() {"
|
| + + " console.info('xhr failed, status ' + xhr.status);"
|
| + + " window.jsInterface.setValue(false);"
|
| + + " };"
|
| + + " xhr.open('GET', '" + xhrUrl + "', true);"
|
| + + " xhr.send();"
|
| + + "};";
|
| +
|
| + String pageWithXhrLink = makeHtmlPageFrom(
|
| + "<script>" + xhrJs + "</script>", "<img onclick=\"xhrFunction(); location.href='"
|
| + + "thiswillbe://intercepted/"
|
| + + "'\" class=\"big\" id=\"link\" />");
|
| +
|
| + final String startPath = "/startPath.html";
|
| + final String startUrl = addPageToTestServer(startPath, pageWithXhrLink);
|
| +
|
| + enableJavaScriptOnUiThread(mAwContents);
|
| + final BooleanValueJavascriptObserver jsInterface = new BooleanValueJavascriptObserver();
|
| +
|
| + // add javascript interface
|
| + getInstrumentation().runOnMainSync(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + jsInterface.register(mAwContents.getContentViewCore(), "jsInterface");
|
| + }
|
| + });
|
| +
|
| + loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), startUrl);
|
| +
|
| + setShouldOverrideUrlLoadingReturnValueOnUiThread(true);
|
| + final int shouldOverrideUrlLoadingCallCount =
|
| + mShouldOverrideUrlLoadingHelper.getCallCount();
|
| +
|
| + assertEquals(0, mWebServer.getRequestCount(xhrPath));
|
| +
|
| + clickOnLinkUsingJs();
|
| +
|
| + // Make the server xhr response wait until the navigation request is intercepted.
|
| + mShouldOverrideUrlLoadingHelper.waitForCallback(shouldOverrideUrlLoadingCallCount);
|
| + shouldOverrideUrlLoadingSignal.countDown();
|
| +
|
| + jsInterface.waitForEvent(WAIT_TIMEOUT_MS);
|
| + assertTrue(jsInterface.getValue());
|
| + assertEquals(1, mWebServer.getRequestCount(xhrPath));
|
| + }
|
| +
|
| + private static class BooleanValueJavascriptObserver extends JavascriptEventObserver {
|
| + private boolean mValue = false;
|
| +
|
| + public void setValue(boolean value) {
|
| + mValue = value;
|
| + notifyJava();
|
| + }
|
| +
|
| + public boolean getValue() {
|
| + return mValue;
|
| + }
|
| + }
|
| }
|
|
|