browser/devtools/canvasdebugger/test/head.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2    http://creativecommons.org/publicdomain/zero/1.0/ */
     3 "use strict";
     5 const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
     7 let { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
     9 // Disable logging for all the tests. Both the debugger server and frontend will
    10 // be affected by this pref.
    11 let gEnableLogging = Services.prefs.getBoolPref("devtools.debugger.log");
    12 Services.prefs.setBoolPref("devtools.debugger.log", false);
    14 let { Task } = Cu.import("resource://gre/modules/Task.jsm", {});
    15 let { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {});
    16 let { gDevTools } = Cu.import("resource:///modules/devtools/gDevTools.jsm", {});
    17 let { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
    18 let { DebuggerServer } = Cu.import("resource://gre/modules/devtools/dbg-server.jsm", {});
    19 let { DebuggerClient } = Cu.import("resource://gre/modules/devtools/dbg-client.jsm", {});
    21 let { CallWatcherFront } = devtools.require("devtools/server/actors/call-watcher");
    22 let { CanvasFront } = devtools.require("devtools/server/actors/canvas");
    23 let TiltGL = devtools.require("devtools/tilt/tilt-gl");
    24 let TargetFactory = devtools.TargetFactory;
    25 let Toolbox = devtools.Toolbox;
    27 const EXAMPLE_URL = "http://example.com/browser/browser/devtools/canvasdebugger/test/";
    28 const SIMPLE_CANVAS_URL = EXAMPLE_URL + "doc_simple-canvas.html";
    29 const SIMPLE_CANVAS_TRANSPARENT_URL = EXAMPLE_URL + "doc_simple-canvas-transparent.html";
    30 const SIMPLE_CANVAS_DEEP_STACK_URL = EXAMPLE_URL + "doc_simple-canvas-deep-stack.html";
    32 // All tests are asynchronous.
    33 waitForExplicitFinish();
    35 let gToolEnabled = Services.prefs.getBoolPref("devtools.canvasdebugger.enabled");
    37 registerCleanupFunction(() => {
    38   info("finish() was called, cleaning up...");
    39   Services.prefs.setBoolPref("devtools.debugger.log", gEnableLogging);
    40   Services.prefs.setBoolPref("devtools.canvasdebugger.enabled", gToolEnabled);
    42   // Some of yhese tests use a lot of memory due to GL contexts, so force a GC
    43   // to help fragmentation.
    44   info("Forcing GC after canvas debugger test.");
    45   Cu.forceGC();
    46 });
    48 function addTab(aUrl, aWindow) {
    49   info("Adding tab: " + aUrl);
    51   let deferred = promise.defer();
    52   let targetWindow = aWindow || window;
    53   let targetBrowser = targetWindow.gBrowser;
    55   targetWindow.focus();
    56   let tab = targetBrowser.selectedTab = targetBrowser.addTab(aUrl);
    57   let linkedBrowser = tab.linkedBrowser;
    59   linkedBrowser.addEventListener("load", function onLoad() {
    60     linkedBrowser.removeEventListener("load", onLoad, true);
    61     info("Tab added and finished loading: " + aUrl);
    62     deferred.resolve(tab);
    63   }, true);
    65   return deferred.promise;
    66 }
    68 function removeTab(aTab, aWindow) {
    69   info("Removing tab.");
    71   let deferred = promise.defer();
    72   let targetWindow = aWindow || window;
    73   let targetBrowser = targetWindow.gBrowser;
    74   let tabContainer = targetBrowser.tabContainer;
    76   tabContainer.addEventListener("TabClose", function onClose(aEvent) {
    77     tabContainer.removeEventListener("TabClose", onClose, false);
    78     info("Tab removed and finished closing.");
    79     deferred.resolve();
    80   }, false);
    82   targetBrowser.removeTab(aTab);
    83   return deferred.promise;
    84 }
    86 function handleError(aError) {
    87   ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
    88   finish();
    89 }
    91 let gRequiresWebGL = false;
    93 function ifTestingSupported() {
    94   ok(false, "You need to define a 'ifTestingSupported' function.");
    95   finish();
    96 }
    98 function ifTestingUnsupported() {
    99   todo(false, "Skipping test because some required functionality isn't supported.");
   100   finish();
   101 }
   103 function test() {
   104   let generator = isTestingSupported() ? ifTestingSupported : ifTestingUnsupported;
   105   Task.spawn(generator).then(null, handleError);
   106 }
   108 function createCanvas() {
   109   return document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
   110 }
   112 function isTestingSupported() {
   113   if (!gRequiresWebGL) {
   114     info("This test does not require WebGL support.");
   115     return true;
   116   }
   118   let supported =
   119     !TiltGL.isWebGLForceEnabled() &&
   120      TiltGL.isWebGLSupported() &&
   121      TiltGL.create3DContext(createCanvas());
   123   info("This test requires WebGL support.");
   124   info("Apparently, WebGL is" + (supported ? "" : " not") + " supported.");
   125   return supported;
   126 }
   128 function once(aTarget, aEventName, aUseCapture = false) {
   129   info("Waiting for event: '" + aEventName + "' on " + aTarget + ".");
   131   let deferred = promise.defer();
   133   for (let [add, remove] of [
   134     ["on", "off"], // Use event emitter before DOM events for consistency
   135     ["addEventListener", "removeEventListener"],
   136     ["addListener", "removeListener"]
   137   ]) {
   138     if ((add in aTarget) && (remove in aTarget)) {
   139       aTarget[add](aEventName, function onEvent(...aArgs) {
   140         aTarget[remove](aEventName, onEvent, aUseCapture);
   141         deferred.resolve(...aArgs);
   142       }, aUseCapture);
   143       break;
   144     }
   145   }
   147   return deferred.promise;
   148 }
   150 function waitForTick() {
   151   let deferred = promise.defer();
   152   executeSoon(deferred.resolve);
   153   return deferred.promise;
   154 }
   156 function navigateInHistory(aTarget, aDirection, aWaitForTargetEvent = "navigate") {
   157   executeSoon(() => content.history[aDirection]());
   158   return once(aTarget, aWaitForTargetEvent);
   159 }
   161 function navigate(aTarget, aUrl, aWaitForTargetEvent = "navigate") {
   162   executeSoon(() => aTarget.activeTab.navigateTo(aUrl));
   163   return once(aTarget, aWaitForTargetEvent);
   164 }
   166 function reload(aTarget, aWaitForTargetEvent = "navigate") {
   167   executeSoon(() => aTarget.activeTab.reload());
   168   return once(aTarget, aWaitForTargetEvent);
   169 }
   171 function initServer() {
   172   if (!DebuggerServer.initialized) {
   173     DebuggerServer.init(() => true);
   174     DebuggerServer.addBrowserActors();
   175   }
   176 }
   178 function initCallWatcherBackend(aUrl) {
   179   info("Initializing a call watcher front.");
   180   initServer();
   182   return Task.spawn(function*() {
   183     let tab = yield addTab(aUrl);
   184     let target = TargetFactory.forTab(tab);
   185     let debuggee = target.window.wrappedJSObject;
   187     yield target.makeRemote();
   189     let front = new CallWatcherFront(target.client, target.form);
   190     return [target, debuggee, front];
   191   });
   192 }
   194 function initCanavsDebuggerBackend(aUrl) {
   195   info("Initializing a canvas debugger front.");
   196   initServer();
   198   return Task.spawn(function*() {
   199     let tab = yield addTab(aUrl);
   200     let target = TargetFactory.forTab(tab);
   201     let debuggee = target.window.wrappedJSObject;
   203     yield target.makeRemote();
   205     let front = new CanvasFront(target.client, target.form);
   206     return [target, debuggee, front];
   207   });
   208 }
   210 function initCanavsDebuggerFrontend(aUrl) {
   211   info("Initializing a canvas debugger pane.");
   213   return Task.spawn(function*() {
   214     let tab = yield addTab(aUrl);
   215     let target = TargetFactory.forTab(tab);
   216     let debuggee = target.window.wrappedJSObject;
   218     yield target.makeRemote();
   220     Services.prefs.setBoolPref("devtools.canvasdebugger.enabled", true);
   221     let toolbox = yield gDevTools.showToolbox(target, "canvasdebugger");
   222     let panel = toolbox.getCurrentPanel();
   223     return [target, debuggee, panel];
   224   });
   225 }
   227 function teardown(aPanel) {
   228   info("Destroying the specified canvas debugger.");
   230   return promise.all([
   231     once(aPanel, "destroyed"),
   232     removeTab(aPanel.target.tab)
   233   ]);
   234 }

mercurial