Bug 854468: Add command-line flag to record Moz2D drawing. r=roc
authorBas Schouten <bschouten@mozilla.com>
Tue, 26 Mar 2013 03:20:30 +0000
changeset 136599 2e93bd9434821258b69164c567b6e8222b861bdb
parent 136598 22f4559c2f00d827aa0fa47db2b763fb3e388018
child 136600 790c60e0ce809d6c4d34e31c352f8dafb71ac339
push id2452
push userlsblakk@mozilla.com
push dateMon, 13 May 2013 16:59:38 +0000
treeherdermozilla-beta@d4b152d29d8d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersroc
bugs854468
milestone22.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 854468: Add command-line flag to record Moz2D drawing. r=roc
layout/moz.build
layout/tools/recording/Makefile.in
layout/tools/recording/jar.mn
layout/tools/recording/moz.build
layout/tools/recording/recording-cmdline.js
layout/tools/recording/recording-cmdline.manifest
layout/tools/recording/recording.js
layout/tools/recording/recording.xul
--- a/layout/moz.build
+++ b/layout/moz.build
@@ -11,16 +11,17 @@ PARALLEL_DIRS += [
     'tables',
     'svg',
     'xul/base/public',
     'xul/base/src',
     'ipc',
     'mathml',
     'inspector/public',
     'inspector/src',
+    'tools/recording',
 ]
 
 if CONFIG['NS_PRINTING']:
     PARALLEL_DIRS += ['printing']
 
 if CONFIG['MOZ_XUL']:
     PARALLEL_DIRS += ['xul/tree', 'xul/grid']
 
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/Makefile.in
@@ -0,0 +1,19 @@
+# vim: set shiftwidth=8 tabstop=8 autoindent noexpandtab copyindent:
+# 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/.
+
+DEPTH		= @DEPTH@
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+EXTRA_COMPONENTS = \
+		recording-cmdline.js \
+		$(NULL)
+
+EXTRA_COMPONENTS += recording-cmdline.manifest
+
+include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/jar.mn
@@ -0,0 +1,4 @@
+recording.jar:
+% content recording %content/
+  content/recording.xul (recording.xul)
+  content/recording.js (recording.js)
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/moz.build
@@ -0,0 +1,6 @@
+# vim: set filetype=python:
+# 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/.
+
+MODULE = 'recording'
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/recording-cmdline.js
@@ -0,0 +1,73 @@
+/* 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/. */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const nsISupports                    = Components.interfaces.nsISupports;
+  
+const nsICommandLine                 = Components.interfaces.nsICommandLine;
+const nsICommandLineHandler          = Components.interfaces.nsICommandLineHandler;
+const nsISupportsString              = Components.interfaces.nsISupportsString;
+const nsIWindowWatcher               = Components.interfaces.nsIWindowWatcher;
+
+function RecordingCmdLineHandler() {}
+RecordingCmdLineHandler.prototype =
+{
+    classID: Components.ID('{86FB70EC-90FF-45AD-A1C1-F77D3C1184E9}'),
+
+    /* nsISupports */
+    QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler]),
+
+    /* nsICommandLineHandler */
+    handle : function handler_handle(cmdLine) {
+        var args = { };
+        args.wrappedJSObject = args;
+        try {
+            var uristr = cmdLine.handleFlagWithParam("recording", false);
+            if (uristr == null)
+                return;
+            try {
+                args.uri = cmdLine.resolveURI(uristr).spec;
+            }
+            catch (e) {
+                return;
+            }
+        }
+        catch (e) {
+            cmdLine.handleFlag("recording", true);
+        }
+
+        /**
+         * Manipulate preferences by adding to the *default* branch.  Adding
+         * to the default branch means the changes we make won't get written
+         * back to user preferences.
+         *
+         * We want to do this here rather than in reftest.js because it's
+         * important to set the recording pref before the platform Init gets
+         * called.
+         */
+        var prefs = Components.classes["@mozilla.org/preferences-service;1"].
+                    getService(Components.interfaces.nsIPrefService);
+        var branch = prefs.getDefaultBranch("");
+        branch.setBoolPref("gfx.2d.recording", true);
+
+        try {
+            var outputstr = cmdLine.handleFlagWithParam("recording-output", false);
+            if (outputstr != null) {
+                branch.setCharPref("gfx.2d.recordingfile", outputstr);
+            }
+        } catch (e) { }
+
+        var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
+                               .getService(nsIWindowWatcher);
+        wwatch.openWindow(null, "chrome://recording/content/recording.xul", "_blank",
+                          "chrome,dialog=no,all", args);
+        cmdLine.preventDefault = true;
+    },
+
+    helpInfo : "  -recording <file>  Record drawing for a given URL.\n" +
+               "  -recording-output <file> Specify destination file for a drawing recording.\n"
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RecordingCmdLineHandler]);
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/recording-cmdline.manifest
@@ -0,0 +1,3 @@
+component {86FB70EC-90FF-45AD-A1C1-F77D3C1184E9} recording-cmdline.js
+contract @mozilla.org/commandlinehandler/general-startup;1?type=recording {86FB70EC-90FF-45AD-A1C1-F77D3C1184E9}
+category command-line-handler m-recording @mozilla.org/commandlinehandler/general-startup;1?type=recording
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/recording.js
@@ -0,0 +1,53 @@
+/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- /
+/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */
+/* 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/. */
+
+const CC = Components.classes;
+const CI = Components.interfaces;
+const CR = Components.results;
+
+const XHTML_NS = "http://www.w3.org/1999/xhtml";
+const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+const NS_GFXINFO_CONTRACTID = "@mozilla.org/gfx/info;1";
+
+var gContainingWindow = null;
+
+var gBrowser;
+
+function OnDocumentLoad() {
+    gContainingWindow.close();
+}
+
+this.OnRecordingLoad = function OnRecordingLoad(win) {
+    var prefs = Components.classes["@mozilla.org/preferences-service;1"].
+                getService(Components.interfaces.nsIPrefBranch);
+
+    if (win === undefined || win == null) {
+        win = window;
+    }
+    if (gContainingWindow == null && win != null) {
+        gContainingWindow = win;
+    }
+
+    gBrowser = gContainingWindow.document.getElementById("browser");
+
+    var gfxInfo = (NS_GFXINFO_CONTRACTID in CC) && CC[NS_GFXINFO_CONTRACTID].getService(CI.nsIGfxInfo);
+    var info = gfxInfo.getInfo();
+    dump(info.AzureContentBackend);
+    if (info.AzureContentBackend == "none") {
+        alert("Page recordings may only be made with Azure content enabled.");
+        gContainingWindow.close();
+        return;
+    }
+
+    gContainingWindow.document.addEventListener("load", OnDocumentLoad, true);
+
+    var args = window.arguments[0].wrappedJSObject;
+
+    gBrowser.loadURI(args.uri);
+}
+
+function OnRecordingUnload() {
+}
new file mode 100644
--- /dev/null
+++ b/layout/tools/recording/recording.xul
@@ -0,0 +1,22 @@
+<!-- vim: set shiftwidth=4 tabstop=8 autoindent expandtab: -->
+<!-- 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/. -->
+<?xml-stylesheet type="text/css" href="data:text/css,
+
+%23_box_windowsDefaultTheme:-moz-system-metric(windows-default-theme) {
+  display: none;
+}
+
+" ?>
+
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        id="recording-window"
+        hidechrome="true"
+        onload="OnRecordingLoad();"
+        onunload="OnRecordingUnload();"
+        style="background:white; overflow:hidden; width:800px; height:600px;"
+        >
+    <script type="application/ecmascript" src="recording.js" />
+  <browser id="browser" type="content-primary" style="min-width: 1024px; min-height: 768px; max-width: 1024px; max-height: 768px"/>
+</window>