Add XR instrumentation web content workaround

Adds a workaround for https://crbug.com/908917 into the XR
instrumentation test setup since attempts to work around the issue in
the test runner haven't been completely successful. This workaround
performs a swipe which should be a no-op when running a RenderTest,
which seems to prevent the flakiness when doing pixel diffs.

Bug: 908917
Change-Id: I38bf8fb5abe1c0a2bf19e044dd9237919ec2b019
Reviewed-on: https://chromium-review.googlesource.com/c/1362293
Reviewed-by: Bill Orr <billorr@chromium.org>
Commit-Queue: Brian Sheedy <bsheedy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#614250}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/ChromeTabbedActivityXrTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/ChromeTabbedActivityXrTestRule.java
index 742be80..2831f93 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/ChromeTabbedActivityXrTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/ChromeTabbedActivityXrTestRule.java
@@ -8,6 +8,7 @@
 import org.junit.runners.model.Statement;
 
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction.SupportedActivity;
+import org.chromium.chrome.browser.vr.util.XrTestRuleUtils;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 
 /**
@@ -21,6 +22,7 @@
         return super.apply(new Statement() {
             @Override
             public void evaluate() throws Throwable {
+                XrTestRuleUtils.maybeWorkaroundWebContentFlakiness(desc);
                 startMainActivityOnBlankPage();
                 base.evaluate();
             }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/CustomTabActivityXrTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/CustomTabActivityXrTestRule.java
index 493d448..a753e8f2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/CustomTabActivityXrTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/CustomTabActivityXrTestRule.java
@@ -12,6 +12,7 @@
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction.SupportedActivity;
+import org.chromium.chrome.browser.vr.util.XrTestRuleUtils;
 
 /**
  * XR extension of CustomTabActivityTestRule. Applies CustomTabActivityTestRule then
@@ -23,6 +24,7 @@
         return super.apply(new Statement() {
             @Override
             public void evaluate() throws Throwable {
+                XrTestRuleUtils.maybeWorkaroundWebContentFlakiness(desc);
                 startCustomTabActivityWithIntent(CustomTabsTestUtils.createMinimalCustomTabIntent(
                         InstrumentationRegistry.getTargetContext(), "about:blank"));
                 base.evaluate();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/WebappActivityXrTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/WebappActivityXrTestRule.java
index 76078ff..fc58334a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/WebappActivityXrTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/WebappActivityXrTestRule.java
@@ -8,6 +8,7 @@
 import org.junit.runners.model.Statement;
 
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction.SupportedActivity;
+import org.chromium.chrome.browser.vr.util.XrTestRuleUtils;
 import org.chromium.chrome.browser.webapps.WebappActivityTestRule;
 
 /**
@@ -22,6 +23,7 @@
         return super.apply(new Statement() {
             @Override
             public void evaluate() throws Throwable {
+                XrTestRuleUtils.maybeWorkaroundWebContentFlakiness(desc);
                 startWebappActivity();
                 base.evaluate();
             }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrTestRuleUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrTestRuleUtils.java
index dbab8c8..453a8ae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrTestRuleUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrTestRuleUtils.java
@@ -58,6 +58,7 @@
     public static void evaluateVrTestRuleImpl(final Statement base, final Description desc,
             final VrTestRule rule, final ChromeLaunchMethod launcher) throws Throwable {
         VrTestRuleUtils.ensureNoVrActivitiesDisplayed();
+        VrTestRuleUtils.maybeWorkaroundWebContentFlakiness(desc);
         HeadTrackingUtils.checkForAndApplyHeadTrackingModeAnnotation(rule, desc);
         launcher.launch();
         // Must be called after Chrome is started, as otherwise startService fails with an
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/XrTestRuleUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/XrTestRuleUtils.java
index 73c47f7..61334f6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/XrTestRuleUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/XrTestRuleUtils.java
@@ -4,11 +4,16 @@
 
 package org.chromium.chrome.browser.vr.util;
 
+import android.support.test.InstrumentationRegistry;
+import android.support.test.uiautomator.UiDevice;
+
 import org.junit.Assert;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
+import org.junit.runner.Description;
 
 import org.chromium.base.test.params.ParameterSet;
+import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityXrTestRule;
 import org.chromium.chrome.browser.vr.rules.CustomTabActivityXrTestRule;
 import org.chromium.chrome.browser.vr.rules.WebappActivityXrTestRule;
@@ -17,6 +22,7 @@
 import org.chromium.chrome.browser.vr.rules.XrTestRule;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.concurrent.Callable;
 
 /**
@@ -78,6 +84,28 @@
     }
 
     /**
+     * Works around https://crbug.com/908917, where web contents can be darker due to Android doing
+     * really weird things when some keyevents are input over adb. This normally isn't an issue, but
+     * can cause flakiness in RenderTests, so only apply the workaround to those. The issue gets
+     * resolved when there is touchscreen input, so perform a swipe that should be a no-op.
+     *
+     * This would ideally be worked around in the test runner, but attempts to do so have not been
+     * completely successful.
+     *
+     * @param desc The Description of the Rule currently being applied.
+     */
+    public static void maybeWorkaroundWebContentFlakiness(Description desc) {
+        Feature annotation = desc.getAnnotation(Feature.class);
+        if (annotation == null) return;
+        if (!Arrays.asList(annotation.value()).contains("RenderTest")) return;
+
+        UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        uiDevice.drag(uiDevice.getDisplayWidth() / 2, uiDevice.getDisplayHeight() / 2,
+                uiDevice.getDisplayWidth() / 2, 3 * uiDevice.getDisplayHeight() / 4,
+                10 /* steps */);
+    }
+
+    /**
      * Converts XrActivityRestriction.SupportedActivity enum to strings.
      *
      * @param activity The SupportedActivity value to convert to a String.