Index: chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java |
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java |
index ca1b0429fc2e8566128f93a97e8e1a1fd5dc0006..3b0be216af4c3269b1d4f5c85594b3a0e71ea231 100644 |
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java |
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java |
@@ -6,16 +6,22 @@ package org.chromium.chrome.test.util.browser; |
import android.text.TextUtils; |
+import junit.framework.Assert; |
+ |
import org.chromium.base.ThreadUtils; |
import org.chromium.chrome.browser.tab.EmptyTabObserver; |
import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.content.browser.test.util.Criteria; |
+import org.chromium.content.browser.test.util.CriteriaHelper; |
import org.chromium.content_public.browser.LoadUrlParams; |
+import java.util.Locale; |
+import java.util.concurrent.atomic.AtomicReference; |
+ |
/** |
* Monitors that a Tab starts loading and stops loading a URL. |
*/ |
-public class TabLoadObserver extends EmptyTabObserver implements Criteria { |
+public class TabLoadObserver extends EmptyTabObserver { |
private static final float FLOAT_EPSILON = 0.001f; |
private final Tab mTab; |
@@ -53,21 +59,68 @@ public class TabLoadObserver extends EmptyTabObserver implements Criteria { |
mTabLoadStopped = true; |
} |
- @Override |
- public boolean isSatisfied() { |
- if (!mTabLoadStarted) return false; |
- if (!mTabLoadStopped) return false; |
- if (!mTab.isLoadingAndRenderingDone()) return false; |
+ /** |
+ * Asserts the page has loaded. |
+ * @param maxAllowedTime The maximum time this will wait for the page to load. |
+ */ |
+ public void assertLoaded(long maxAllowedTime) throws InterruptedException { |
+ final AtomicReference<String> failureReason = new AtomicReference<>(); |
- if (mExpectedTitle != null && !TextUtils.equals(mExpectedTitle, mTab.getTitle())) { |
- return false; |
- } |
- if (mExpectedScale != null) { |
- if (mTab.getContentViewCore() == null) return false; |
- if (Math.abs(mExpectedScale - mTab.getContentViewCore().getScale()) >= FLOAT_EPSILON) { |
- return false; |
+ Criteria loadedCriteria = new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ if (!mTabLoadStarted) { |
+ failureReason.set("load started never called"); |
+ return false; |
+ } |
+ if (!mTabLoadStopped) { |
+ failureReason.set("load stopped never called"); |
+ return false; |
+ } |
+ if (!mTab.isLoadingAndRenderingDone()) { |
+ failureReason.set("load and rendering never completed"); |
+ return false; |
+ } |
+ |
+ String title = mTab.getTitle(); |
+ if (mExpectedTitle != null && !TextUtils.equals(mExpectedTitle, title)) { |
+ failureReason.set(String.format( |
+ Locale.ENGLISH, |
+ "title did not match -- expected: \"%s\", actual \"%s\"", |
+ mExpectedTitle, title)); |
+ return false; |
+ } |
+ if (mExpectedScale != null) { |
+ if (mTab.getContentViewCore() == null) { |
+ failureReason.set("tab has no content view core"); |
+ return false; |
+ } |
+ |
+ float scale = mTab.getContentViewCore().getScale(); |
+ if (Math.abs(mExpectedScale - scale) >= FLOAT_EPSILON) { |
+ failureReason.set(String.format( |
+ Locale.ENGLISH, |
+ "scale did not match with allowed epsilon -- " |
+ + "expected: \"%f\", actual \"%f\"", mExpectedScale, scale)); |
+ return false; |
+ } |
+ } |
+ failureReason.set(null); |
+ return true; |
} |
+ }; |
+ |
+ boolean result = CriteriaHelper.pollForUIThreadCriteria( |
+ loadedCriteria, maxAllowedTime, CriteriaHelper.DEFAULT_POLLING_INTERVAL); |
+ if (!result) { |
+ Assert.fail("Tab not fully loaded because: " + failureReason.get()); |
} |
- return true; |
+ } |
+ |
+ /** |
+ * Asserts that the page has loaded. |
+ */ |
+ public void assertLoaded() throws InterruptedException { |
+ assertLoaded(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL); |
} |
} |