diff -r 000000000000 -r 6474c204b198 mobile/android/base/tests/PixelTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/tests/PixelTest.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,130 @@ +package org.mozilla.gecko.tests; + +import org.mozilla.gecko.Actions; +import org.mozilla.gecko.PaintedSurface; + +abstract class PixelTest extends BaseTest { + private static final long PAINT_CLEAR_DELAY = 10000; // milliseconds + + protected final PaintedSurface loadAndGetPainted(String url) { + Actions.RepeatedEventExpecter paintExpecter = mActions.expectPaint(); + inputAndLoadUrl(url); + verifyHomePagerHidden(); + paintExpecter.blockUntilClear(PAINT_CLEAR_DELAY); + paintExpecter.unregisterListener(); + PaintedSurface p = mDriver.getPaintedSurface(); + if (p == null) { + mAsserter.ok(p != null, "checking that painted surface loaded", + "painted surface loaded"); + } + return p; + } + + protected final void loadAndPaint(String url) { + PaintedSurface painted = loadAndGetPainted(url); + painted.close(); + } + + protected final PaintedSurface reloadAndGetPainted() { + Actions.RepeatedEventExpecter paintExpecter = mActions.expectPaint(); + + mActions.sendSpecialKey(Actions.SpecialKey.MENU); + waitForText("Reload"); + mSolo.clickOnText("Reload"); + + paintExpecter.blockUntilClear(PAINT_CLEAR_DELAY); + paintExpecter.unregisterListener(); + PaintedSurface p = mDriver.getPaintedSurface(); + if (p == null) { + mAsserter.ok(p != null, "checking that painted surface loaded", + "painted surface loaded"); + } + return p; + } + + protected final void reloadAndPaint() { + PaintedSurface painted = reloadAndGetPainted(); + painted.close(); + } + + public void addTab(String url, String title, boolean isPrivate) { + Actions.EventExpecter tabEventExpecter = mActions.expectGeckoEvent("Tab:Added"); + Actions.EventExpecter contentEventExpecter = mActions.expectGeckoEvent("DOMContentLoaded"); + if (isPrivate) { + selectMenuItem(StringHelper.NEW_PRIVATE_TAB_LABEL); + } else { + selectMenuItem(StringHelper.NEW_TAB_LABEL); + } + tabEventExpecter.blockForEvent(); + contentEventExpecter.blockForEvent(); + waitForText(StringHelper.TITLE_PLACE_HOLDER); + loadAndPaint(url); + tabEventExpecter.unregisterListener(); + contentEventExpecter.unregisterListener(); + mAsserter.ok(waitForText(title), "Checking that the page has loaded", "The page has loaded"); + } + + protected final PaintedSurface waitForPaint(Actions.RepeatedEventExpecter expecter) { + expecter.blockUntilClear(PAINT_CLEAR_DELAY); + PaintedSurface p = mDriver.getPaintedSurface(); + if (p == null) { + mAsserter.ok(p != null, "checking that painted surface loaded", + "painted surface loaded"); + } + return p; + } + + protected final PaintedSurface waitWithNoPaint(Actions.RepeatedEventExpecter expecter) { + try { + Thread.sleep(PAINT_CLEAR_DELAY); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + mAsserter.is(expecter.eventReceived(), false, "Checking gecko didn't draw unnecessarily"); + PaintedSurface p = mDriver.getPaintedSurface(); + if (p == null) { + mAsserter.ok(p != null, "checking that painted surface loaded", + "painted surface loaded"); + } + return p; + } + + // this matches the algorithm in robocop_boxes.html + protected final int[] getBoxColorAt(int x, int y) { + int r = ((int)Math.floor(x / 3) % 256); + r = r & 0xF8; + int g = (x + y) % 256; + g = g & 0xFC; + int b = ((int)Math.floor(y / 3) % 256); + b = b & 0xF8; + return new int[] { r, g, b }; + } + + /** + * Checks the top-left corner of the visible area of the page is at (x,y) of robocop_boxes.html. + */ + protected final void checkScrollWithBoxes(PaintedSurface painted, int x, int y) { + int[] color = getBoxColorAt(x, y); + mAsserter.ispixel(painted.getPixelAt(0, 0), color[0], color[1], color[2], "Pixel at 0, 0"); + color = getBoxColorAt(x + 100, y); + mAsserter.ispixel(painted.getPixelAt(100, 0), color[0], color[1], color[2], "Pixel at 100, 0"); + color = getBoxColorAt(x, y + 100); + mAsserter.ispixel(painted.getPixelAt(0, 100), color[0], color[1], color[2], "Pixel at 0, 100"); + color = getBoxColorAt(x + 100, y + 100); + mAsserter.ispixel(painted.getPixelAt(100, 100), color[0], color[1], color[2], "Pixel at 100, 100"); + } + + /** + * Loads the robocop_boxes.html file and verifies that we are positioned at (0,0) on it. + * @param url URL of the robocop_boxes.html file. + * @return The painted surface after rendering the file. + */ + protected final void loadAndVerifyBoxes(String url) { + PaintedSurface painted = loadAndGetPainted(url); + try { + checkScrollWithBoxes(painted, 0, 0); + } finally { + painted.close(); + } + } +}