summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/tests/browser/browser_Deprecated.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/tests/browser/browser_Deprecated.js')
-rw-r--r--toolkit/modules/tests/browser/browser_Deprecated.js157
1 files changed, 157 insertions, 0 deletions
diff --git a/toolkit/modules/tests/browser/browser_Deprecated.js b/toolkit/modules/tests/browser/browser_Deprecated.js
new file mode 100644
index 000000000..3217bdd22
--- /dev/null
+++ b/toolkit/modules/tests/browser/browser_Deprecated.js
@@ -0,0 +1,157 @@
+/* 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/. */
+
+var Ci = Components.interfaces;
+var Cu = Components.utils;
+const PREF_DEPRECATION_WARNINGS = "devtools.errorconsole.deprecation_warnings";
+
+Cu.import("resource://gre/modules/Services.jsm", this);
+Cu.import("resource://gre/modules/Deprecated.jsm", this);
+
+// Using this named functions to test deprecation and the properly logged
+// callstacks.
+function basicDeprecatedFunction () {
+ Deprecated.warning("this method is deprecated.", "http://example.com");
+ return true;
+}
+
+function deprecationFunctionBogusCallstack () {
+ Deprecated.warning("this method is deprecated.", "http://example.com", {
+ caller: {}
+ });
+ return true;
+}
+
+function deprecationFunctionCustomCallstack () {
+ // Get the nsIStackFrame that will contain the name of this function.
+ function getStack () {
+ return Components.stack;
+ }
+ Deprecated.warning("this method is deprecated.", "http://example.com",
+ getStack());
+ return true;
+}
+
+var tests = [
+// Test deprecation warning without passing the callstack.
+{
+ deprecatedFunction: basicDeprecatedFunction,
+ expectedObservation: function (aMessage) {
+ testAMessage(aMessage);
+ ok(aMessage.errorMessage.indexOf("basicDeprecatedFunction") > 0,
+ "Callstack is correctly logged.");
+ }
+},
+// Test a reported error when URL to documentation is not passed.
+{
+ deprecatedFunction: function () {
+ Deprecated.warning("this method is deprecated.");
+ return true;
+ },
+ expectedObservation: function (aMessage) {
+ ok(aMessage.errorMessage.indexOf("must provide a URL") > 0,
+ "Deprecation warning logged an empty URL argument.");
+ }
+},
+// Test deprecation with a bogus callstack passed as an argument (it will be
+// replaced with the current call stack).
+{
+ deprecatedFunction: deprecationFunctionBogusCallstack,
+ expectedObservation: function (aMessage) {
+ testAMessage(aMessage);
+ ok(aMessage.errorMessage.indexOf("deprecationFunctionBogusCallstack") > 0,
+ "Callstack is correctly logged.");
+ }
+},
+// When pref is unset Deprecated.warning should not log anything.
+{
+ deprecatedFunction: basicDeprecatedFunction,
+ expectedObservation: null,
+ // Set pref to false.
+ logWarnings: false
+},
+// Test deprecation with a valid custom callstack passed as an argument.
+{
+ deprecatedFunction: deprecationFunctionCustomCallstack,
+ expectedObservation: function (aMessage) {
+ testAMessage(aMessage);
+ ok(aMessage.errorMessage.indexOf("deprecationFunctionCustomCallstack") > 0,
+ "Callstack is correctly logged.");
+ },
+ // Set pref to true.
+ logWarnings: true
+}];
+
+// Which test are we running now?
+var idx = -1;
+
+function test() {
+ waitForExplicitFinish();
+
+ // Check if Deprecated is loaded.
+ ok(Deprecated, "Deprecated object exists");
+
+ nextTest();
+}
+
+// Test Consle Message attributes.
+function testAMessage (aMessage) {
+ ok(aMessage.errorMessage.indexOf("DEPRECATION WARNING: " +
+ "this method is deprecated.") === 0,
+ "Deprecation is correctly logged.");
+ ok(aMessage.errorMessage.indexOf("http://example.com") > 0,
+ "URL is correctly logged.");
+}
+
+function nextTest() {
+ idx++;
+
+ if (idx == tests.length) {
+ finish();
+ return;
+ }
+
+ info("Running test #" + idx);
+ let test = tests[idx];
+
+ // Deprecation warnings will be logged only when the preference is set.
+ if (typeof test.logWarnings !== "undefined") {
+ Services.prefs.setBoolPref(PREF_DEPRECATION_WARNINGS, test.logWarnings);
+ }
+
+ // Create a console listener.
+ let consoleListener = {
+ observe: function (aMessage) {
+ // Ignore unexpected messages.
+ if (!(aMessage instanceof Ci.nsIScriptError)) {
+ return;
+ }
+ if (aMessage.errorMessage.indexOf("DEPRECATION WARNING: ") < 0 &&
+ aMessage.errorMessage.indexOf("must provide a URL") < 0) {
+ return;
+ }
+ ok(aMessage instanceof Ci.nsIScriptError,
+ "Deprecation log message is an instance of type nsIScriptError.");
+
+
+ if (test.expectedObservation === null) {
+ ok(false, "Deprecated warning not expected");
+ }
+ else {
+ test.expectedObservation(aMessage);
+ }
+
+ Services.console.unregisterListener(consoleListener);
+ executeSoon(nextTest);
+ }
+ };
+ Services.console.registerListener(consoleListener);
+ test.deprecatedFunction();
+ if (test.expectedObservation === null) {
+ executeSoon(function() {
+ Services.console.unregisterListener(consoleListener);
+ executeSoon(nextTest);
+ });
+ }
+}