From 4a87e7e27780d83b8f7434773b2977c5110748c2 Mon Sep 17 00:00:00 2001 From: Brian Grinstead Date: Tue, 9 Feb 2016 19:57:34 -0800 Subject: [PATCH] Bug 1246843 - Add a default page for mozscreenshots mochitest;r=MattN MozReview-Commit-ID: Cv74fVKrUkQ --- .../mozscreenshots/extension/TestRunner.jsm | 28 ++++++++------ .../mozscreenshots/extension/bootstrap.js | 8 ---- .../mozscreenshots/extension/jar.mn | 2 +- .../extension/lib/mozscreenshots-script.js | 13 +++++++ .../extension/lib/mozscreenshots-style.css | 28 ++++++++++++++ .../extension/lib/mozscreenshots.html | 36 ++++++++++++++++++ .../mozscreenshots/extension/lib/robot.png | Bin 0 -> 9817 bytes 7 files changed, 94 insertions(+), 21 deletions(-) create mode 100644 browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-script.js create mode 100644 browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-style.css create mode 100644 browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots.html create mode 100644 browser/tools/mozscreenshots/mozscreenshots/extension/lib/robot.png diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm b/browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm index 419a457454b..5a9bf7fd881 100644 --- a/browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm +++ b/browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm @@ -9,7 +9,9 @@ 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); +const HOME_PAGE = "chrome://mozscreenshots/content/lib/mozscreenshots.html"; +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"); @@ -46,7 +48,7 @@ this.TestRunner = { /** * 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", @@ -83,18 +85,20 @@ this.TestRunner = { // 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. diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js b/browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js index a0c5572300f..7fcd96ce265 100644 --- a/browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js +++ b/browser/tools/mozscreenshots/mozscreenshots/extension/bootstrap.js @@ -62,11 +62,3 @@ function uninstallExtension(data) { 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); -} diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn b/browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn index 383d9160eb4..0f403013a4e 100644 --- a/browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn +++ b/browser/tools/mozscreenshots/mozscreenshots/extension/jar.mn @@ -3,4 +3,4 @@ mozscreenshots.jar: Screenshot.jsm TestRunner.jsm configurations/ (configurations/*.jsm) - lib/ (lib/*.png) + lib/ (lib/*) diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-script.js b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-script.js new file mode 100644 index 00000000000..66cdd8c8610 --- /dev/null +++ b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-script.js @@ -0,0 +1,13 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +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"); diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-style.css b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-style.css new file mode 100644 index 00000000000..145a4e57d4b --- /dev/null +++ b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots-style.css @@ -0,0 +1,28 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +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; +} diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots.html b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots.html new file mode 100644 index 00000000000..6778cf7daa7 --- /dev/null +++ b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/mozscreenshots.html @@ -0,0 +1,36 @@ + + + + + + mozscreenshots + + + + + +

mozscreenshots

+ +

+ This page was generated by mozscreenshots +

+ + + +

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 should not be bitten. And they have distilled a public benefit is committed to use Mozilla project one basic and communities of modern life.

+ +

Robots have distilled a balance between commercial aspects of life.

+ +

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.

+ +

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 There are Your Plastic Pal Who's Fun To Be With

+ +

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 the Internet is a human being 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.

+ +

We have metal posteriors which should not deeply involved in a reality. 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.

+ + + + diff --git a/browser/tools/mozscreenshots/mozscreenshots/extension/lib/robot.png b/browser/tools/mozscreenshots/mozscreenshots/extension/lib/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..1c4899aaf72ac0ee9dea01bbe90485f34974ee8d GIT binary patch literal 9817 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