Chromium Code Reviews| 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..132e8ffbef8059c13a1d0bb50e8606e5b08e282a 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,86 @@ 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(); |
| + |
| + 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)); |
|
mnaganov (inactive)
2015/11/04 01:03:19
You should also test that request count is 0 somew
gsennton
2015/11/04 01:21:52
Done.
|
| + } |
| + |
| + private static class BooleanValueJavascriptObserver extends JavascriptEventObserver { |
| + private boolean mValue = false; |
|
mnaganov (inactive)
2015/11/04 01:03:19
This value is set on one thread (Java Bridge backg
gsennton
2015/11/04 01:21:52
Done.
|
| + |
| + public void setValue(boolean value) { |
| + mValue = value; |
| + notifyJava(); |
| + } |
| + |
| + public boolean getValue() { |
| + return mValue; |
| + } |
| + } |
| } |