Bug 1246843 - Add a default page for mozscreenshots mochitest;r=MattN draft
authorBrian Grinstead <bgrinstead@mozilla.com>
Tue, 09 Feb 2016 16:18:38 -0800
changeset 329911 c57ab462b69e37407aa2b5d9e1d15b0a3c65920d
parent 329876 0e2df20590bdee51dbd978b350f050459d040bb7
child 514071 105c730608b7b44f1e934191b39c2f1621c22de6
push id10645
push userbgrinstead@mozilla.com
push dateWed, 10 Feb 2016 00:18:45 +0000
reviewersMattN
bugs1246843
milestone47.0a1
Bug 1246843 - Add a default page for mozscreenshots mochitest;r=MattN MozReview-Commit-ID: I3PG4BW3rbB
browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm
browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js
browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn
browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-script.js
browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-style.css
browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots.html
browser/tools/mozscreenshots/mozscreenshots/extension/lib/robot.png
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm
@@ -5,25 +5,28 @@
 "use strict";
 
 this.EXPORTED_SYMBOLS = ["TestRunner"];
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 const defaultSetNames = ["TabsInTitlebar", "Tabs", "WindowSize", "Toolbars", "LightweightThemes"];
 const env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
 
+Cu.import("resource://testing-common/BrowserTestUtils.jsm");
 Cu.import("resource://gre/modules/FileUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/Timer.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/osfile.jsm");
 
 Cu.import("chrome://mozscreenshots/content/Screenshot.jsm");
 
+const HOME_PAGE = "chrome://mozscreenshots/content/lib/mozscreenshots.html";
+
 // Create a new instance of the ConsoleAPI so we can control the maxLogLevel with a pref.
 // See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
 const PREF_LOG_LEVEL = "extensions.mozscreenshots@mozilla.org.loglevel";
 XPCOMUtils.defineLazyGetter(this, "log", () => {
   let ConsoleAPI = Cu.import("resource://gre/modules/Console.jsm", {}).ConsoleAPI;
   let consoleOptions = {
     maxLogLevel: "info",
     maxLogLevelPref: PREF_LOG_LEVEL,
@@ -41,17 +44,17 @@ this.TestRunner = {
 
   init(extensionPath) {
     this._extensionPath = extensionPath;
   },
 
   /**
    * Load specified sets, execute all combinations of them, and capture screenshots.
    */
-  start(setNames = null) {
+  start: Task.async(function*(setNames = null) {
     setNames = setNames || defaultSetNames;
 
     let subDirs = ["mozscreenshots",
                    (new Date()).toISOString().replace(/:/g, "-") + "_" + Services.appinfo.OS];
     let screenshotPath = FileUtils.getFile("TmpD", subDirs).path;
 
     const MOZ_UPLOAD_DIR = env.get("MOZ_UPLOAD_DIR");
     if (MOZ_UPLOAD_DIR) {
@@ -78,28 +81,30 @@ this.TestRunner = {
 
     // Setup some prefs
     Services.prefs.setCharPref("browser.aboutHomeSnippets.updateUrl",
                                "data:text/html;charset=utf-8,Generated by mozscreenshots");
     Services.prefs.setCharPref("extensions.ui.lastCategory", "addons://list/extension");
     // Don't let the caret blink since it causes false positives for image diffs
     Services.prefs.setIntPref("ui.caretBlinkTime", -1);
 
-    return Task.spawn(function* doStart() {
-      for (let i = 0; i < this.combos.length;
-           i++){
-        this.currentComboIndex = i;
-        yield* this._performCombo(this.combos.item(this.currentComboIndex));
-      }
+    let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
+    let selectedBrowser = browserWindow.gBrowser.selectedBrowser;
+    yield BrowserTestUtils.loadURI(selectedBrowser, HOME_PAGE);
+    yield BrowserTestUtils.browserLoaded(selectedBrowser);
 
-      log.info("Done: Completed " + this.completedCombos + " out of " +
-               this.combos.length + " configurations.");
-      this.cleanup();
-    }.bind(this));
-  },
+    for (let i = 0; i < this.combos.length; i++){
+      this.currentComboIndex = i;
+      yield this._performCombo(this.combos.item(this.currentComboIndex));
+    }
+
+    log.info("Done: Completed " + this.completedCombos + " out of " +
+             this.combos.length + " configurations.");
+    this.cleanup();
+  }),
 
   /**
    * Load sets of configurations from JSMs.
    * @param {String[]} setNames - array of set names (e.g. ["Tabs", "WindowSize"].
    * @return {Object[]} Array of sets containing `name` and `configurations` properties.
    */
   loadSets(setNames) {
     let sets = [];
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js
@@ -57,16 +57,8 @@ function isAppSupported() {
   return true;
 }
 
 function uninstallExtension(data) {
   AddonManager.getAddonByID(data.id, function(addon) {
     addon.uninstall();
   });
 }
-
-function startRun() {
-  let env = Cc["@mozilla.org/process/environment;1"]
-              .getService(Ci.nsIEnvironment);
-  let setsEnv = env.get("MOZSCREENSHOTS_SETS");
-  let sets = setsEnv ? setsEnv.split(",") : null;
-  TestRunner.start(sets);
-}
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn
@@ -1,6 +1,6 @@
 mozscreenshots.jar:
 % content mozscreenshots chrome/mozscreenshots/
   Screenshot.jsm
   TestRunner.jsm
   configurations/ (configurations/*.jsm)
-  lib/            (lib/*.png)
+  lib/            (lib/*)
new file mode 100644
--- /dev/null
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-script.js
@@ -0,0 +1,10 @@
+
+console.log(document, document.body);
+console.assert(false, "Failing mozscreenshots assertion");
+
+console.group("Grouped Message");
+console.log("group message 1");
+console.groupEnd("Grouped Message");
+
+console.count("counter");
+console.count("counter");
new file mode 100644
--- /dev/null
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-style.css
@@ -0,0 +1,25 @@
+
+body {
+  --background-color: #f3f3f3;
+  background: tomato;
+}
+
+body {
+  background: var(--background-color);
+  color: #222;
+  padding: 0 10px;
+  margin: 0;
+}
+
+header {
+  background: #eee;
+  border-bottom: solid 2px #ccc;
+  margin: 0 -10px;
+  margin-bottom: 5px;
+  padding: 4px;
+}
+
+header h1 {
+  margin: 0;
+  padding: 0;
+}
new file mode 100644
--- /dev/null
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>mozscreenshots</title>
+    <link rel="stylesheet" href="mozscreenshots-style.css" />
+    <script>console.info("This page was generated by mozscreenshots");</script>
+  </head>
+
+<body>
+  <header><h1>mozscreenshots</h1></header>
+
+  <p>
+  This page was generated by mozscreenshots
+  </p>
+
+  <img src="robot.png" />
+
+  <p>Welcome Humans! We invite others to keep the Manifesto’s principles; use the creation delivery and commitment. Advancing the Manifesto. We have shiny metal posteriors which <strong>should not be bitten</strong>. And they have distilled a public benefit is committed to use Mozilla project one basic and communities of modern life.</p>
+
+  <p>Robots have <mark>distilled a balance between commercial aspects of life</mark>.</p>
+
+  <p>Robots may not they have shown in education communication collaboration business entertainment and other people to pursue; speak to continue; and opportunity are many different ways to benefit the public benefit the Manifesto’s principles; build and motivate us and trademarks infrastructure funds and trademarks infrastructure funds and enable open-source technologies and provide a whole. </p>
+
+  <p>And they have seen things you people who believe that Mozilla Manifesto. We are to: articulate a vision of individual human being to benefit the lives of these efforts we will: build and promote models for creating economic value for the Internet. We create world-class open and anticipate the Mozilla Manifesto <strong>There are Your Plastic Pal Who's Fun To Be With</strong></p>
+
+  <p>Some Foundation to advance this vision of individual human being or not deeply involved in groups and promote models for the Manifesto principles will not come to support the Mozilla Foundation Pledge The Mozilla Manifesto in its activities.  People are to: articulate a set of consumer products that support <mark>the Internet is a human being</mark> or not be treated as individuals working together in the development of the Internet open and with goodwill!Specifically we believe that we will: build and society as a public good as a result of the lives of collaborative activities. Specifically we have seen things you people acting as optional. Individuals must not come to continue to develop new ways of the Internet are fundamental and with us to ensure that openness innovation and very effective way that the Manifesto There are many benefits; a global public benefit; and society as optional.</p>
+
+  <p><strong>We have metal posteriors which should not deeply involved in a reality.</strong> Individuals must remain open source software promotes the Internet is a balance between commercial profit and within the Mozilla Corporation. Invitation The Internet are key to join us to life on their own.  The Internet a whole. The Internet as a vision of the Mozilla contributors proud of time attention and motivate us and provide a reality.</p>
+
+  <script src="mozscreenshots-script.js"></script>
+</body>
+</html>
new file mode 100644
index 0000000000000000000000000000000000000000..1c4899aaf72ac0ee9dea01bbe90485f34974ee8d
GIT binary patch
literal 9817
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
R2p$A@krI;^tr9T|_z!F)fe8Qr