browser/devtools/debugger/test/browser_dbg_break-on-dom-event.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/ */
     4 /**
     5  * Tests that the break-on-dom-events request works.
     6  */
     8 const TAB_URL = EXAMPLE_URL + "doc_event-listeners.html";
    10 let gClient, gThreadClient, gInput, gButton;
    12 function test() {
    13   if (!DebuggerServer.initialized) {
    14     DebuggerServer.init(() => true);
    15     DebuggerServer.addBrowserActors();
    16   }
    18   let transport = DebuggerServer.connectPipe();
    19   gClient = new DebuggerClient(transport);
    20   gClient.connect((aType, aTraits) => {
    21     is(aType, "browser",
    22       "Root actor should identify itself as a browser.");
    24     addTab(TAB_URL)
    25       .then(() => attachThreadActorForUrl(gClient, TAB_URL))
    26       .then(setupGlobals)
    27       .then(pauseDebuggee)
    28       .then(testBreakOnAll)
    29       .then(testBreakOnDisabled)
    30       .then(testBreakOnNone)
    31       .then(testBreakOnClick)
    32       .then(closeConnection)
    33       .then(finish)
    34       .then(null, aError => {
    35         ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
    36       });
    37   });
    38 }
    40 function setupGlobals(aThreadClient) {
    41   gThreadClient = aThreadClient;
    42   gInput = content.document.querySelector("input");
    43   gButton = content.document.querySelector("button");
    44 }
    46 function pauseDebuggee() {
    47   let deferred = promise.defer();
    49   gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
    50     is(aPacket.type, "paused",
    51       "We should now be paused.");
    52     is(aPacket.why.type, "debuggerStatement",
    53       "The debugger statement was hit.");
    55     deferred.resolve();
    56   });
    58   // Spin the event loop before causing the debuggee to pause, to allow
    59   // this function to return first.
    60   executeSoon(triggerButtonClick);
    62   return deferred.promise;
    63 }
    65 // Test pause on all events.
    66 function testBreakOnAll() {
    67   let deferred = promise.defer();
    69   // Test calling pauseOnDOMEvents from a paused state.
    70   gThreadClient.pauseOnDOMEvents("*", (aPacket) => {
    71     is(aPacket.error, undefined,
    72       "The pause-on-any-event request completed successfully.");
    74     gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
    75       is(aPacket.why.type, "pauseOnDOMEvents",
    76         "A hidden breakpoint was hit.");
    77       is(aPacket.frame.callee.name, "keyupHandler",
    78         "The keyupHandler is entered.");
    80       gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
    81         is(aPacket.why.type, "pauseOnDOMEvents",
    82           "A hidden breakpoint was hit.");
    83         is(aPacket.frame.callee.name, "clickHandler",
    84           "The clickHandler is entered.");
    86         gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
    87           is(aPacket.why.type, "pauseOnDOMEvents",
    88             "A hidden breakpoint was hit.");
    89           is(aPacket.frame.callee.name, "onchange",
    90             "The onchange handler is entered.");
    92           gThreadClient.resume(deferred.resolve);
    93         });
    95         gThreadClient.resume(triggerInputChange);
    96       });
    98       gThreadClient.resume(triggerButtonClick);
    99     });
   101     gThreadClient.resume(triggerInputKeyup);
   102   });
   104   return deferred.promise;
   105 }
   107 // Test that removing events from the array disables them.
   108 function testBreakOnDisabled() {
   109   let deferred = promise.defer();
   111   // Test calling pauseOnDOMEvents from a running state.
   112   gThreadClient.pauseOnDOMEvents(["click"], (aPacket) => {
   113     is(aPacket.error, undefined,
   114       "The pause-on-click-only request completed successfully.");
   116     gClient.addListener("paused", unexpectedListener);
   118     // This non-capturing event listener is guaranteed to run after the page's
   119     // capturing one had a chance to execute and modify window.foobar.
   120     once(gInput, "keyup").then(() => {
   121       is(content.wrappedJSObject.foobar, "keyupHandler",
   122         "No hidden breakpoint was hit.");
   124       gClient.removeListener("paused", unexpectedListener);
   125       deferred.resolve();
   126     });
   128     triggerInputKeyup();
   129   });
   131   return deferred.promise;
   132 }
   134 // Test that specifying an empty event array clears all hidden breakpoints.
   135 function testBreakOnNone() {
   136   let deferred = promise.defer();
   138   // Test calling pauseOnDOMEvents from a running state.
   139   gThreadClient.pauseOnDOMEvents([], (aPacket) => {
   140     is(aPacket.error, undefined,
   141       "The pause-on-none request completed successfully.");
   143     gClient.addListener("paused", unexpectedListener);
   145     // This non-capturing event listener is guaranteed to run after the page's
   146     // capturing one had a chance to execute and modify window.foobar.
   147     once(gInput, "keyup").then(() => {
   148       is(content.wrappedJSObject.foobar, "keyupHandler",
   149         "No hidden breakpoint was hit.");
   151       gClient.removeListener("paused", unexpectedListener);
   152       deferred.resolve();
   153     });
   155     triggerInputKeyup();
   156   });
   158   return deferred.promise;
   159 }
   161 // Test pause on a single event.
   162 function testBreakOnClick() {
   163   let deferred = promise.defer();
   165   // Test calling pauseOnDOMEvents from a running state.
   166   gThreadClient.pauseOnDOMEvents(["click"], (aPacket) => {
   167     is(aPacket.error, undefined,
   168       "The pause-on-click request completed successfully.");
   170     gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
   171       is(aPacket.why.type, "pauseOnDOMEvents",
   172         "A hidden breakpoint was hit.");
   173       is(aPacket.frame.callee.name, "clickHandler",
   174         "The clickHandler is entered.");
   176       gThreadClient.resume(deferred.resolve);
   177     });
   179     triggerButtonClick();
   180   });
   182   return deferred.promise;
   183 }
   185 function closeConnection() {
   186   let deferred = promise.defer();
   187   gClient.close(deferred.resolve);
   188   return deferred.promise;
   189 }
   191 function unexpectedListener() {
   192   gClient.removeListener("paused", unexpectedListener);
   193   ok(false, "An unexpected hidden breakpoint was hit.");
   194   gThreadClient.resume(testBreakOnClick);
   195 }
   197 function triggerInputKeyup() {
   198   // Make sure that the focus is not on the input box so that a focus event
   199   // will be triggered.
   200   window.focus();
   201   gBrowser.selectedBrowser.focus();
   202   gButton.focus();
   204   // Focus the element and wait for focus event.
   205   once(gInput, "focus").then(() => {
   206     executeSoon(() => {
   207       EventUtils.synthesizeKey("e", { shiftKey: 1 }, content);
   208     });
   209   });
   211   gInput.focus();
   212 }
   214 function triggerButtonClick() {
   215   EventUtils.sendMouseEvent({ type: "click" }, gButton);
   216 }
   218 function triggerInputChange() {
   219   gInput.focus();
   220   gInput.value = "foo";
   221   gInput.blur();
   222 }
   224 registerCleanupFunction(function() {
   225   removeTab(gBrowser.selectedTab);
   226   gClient = null;
   227   gThreadClient = null;
   228   gInput = null;
   229   gButton = null;
   230 });

mercurial