browser_dbg_break-on-dom-event-03.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
  2. /* Any copyright is dedicated to the Public Domain.
  3. * http://creativecommons.org/publicdomain/zero/1.0/ */
  4. /**
  5. * Tests that the break-on-dom-events request works for load event listeners.
  6. */
  7. const TAB_URL = EXAMPLE_URL + "doc_event-listeners-04.html";
  8. var gClient, gThreadClient;
  9. function test() {
  10. if (!DebuggerServer.initialized) {
  11. DebuggerServer.init();
  12. DebuggerServer.addBrowserActors();
  13. }
  14. let transport = DebuggerServer.connectPipe();
  15. gClient = new DebuggerClient(transport);
  16. gClient.connect().then(([aType, aTraits]) => {
  17. is(aType, "browser",
  18. "Root actor should identify itself as a browser.");
  19. addTab(TAB_URL)
  20. .then(() => attachThreadActorForUrl(gClient, TAB_URL))
  21. .then(aThreadClient => gThreadClient = aThreadClient)
  22. .then(pauseDebuggee)
  23. .then(testBreakOnLoad)
  24. .then(() => gClient.close())
  25. .then(finish)
  26. .then(null, aError => {
  27. ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
  28. });
  29. });
  30. }
  31. function pauseDebuggee() {
  32. let deferred = promise.defer();
  33. gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
  34. is(aPacket.type, "paused",
  35. "We should now be paused.");
  36. is(aPacket.why.type, "debuggerStatement",
  37. "The debugger statement was hit.");
  38. gThreadClient.resume(deferred.resolve);
  39. });
  40. // Spin the event loop before causing the debuggee to pause, to allow
  41. // this function to return first.
  42. executeSoon(() => triggerButtonClick());
  43. return deferred.promise;
  44. }
  45. // Test pause on a load event.
  46. function testBreakOnLoad() {
  47. let deferred = promise.defer();
  48. // Test calling pauseOnDOMEvents from a running state.
  49. gThreadClient.pauseOnDOMEvents(["load"], (aPacket) => {
  50. is(aPacket.error, undefined,
  51. "The pause-on-load request completed successfully.");
  52. let handlers = ["loadHandler"];
  53. gClient.addListener("paused", function tester(aEvent, aPacket) {
  54. is(aPacket.why.type, "pauseOnDOMEvents",
  55. "A hidden breakpoint was hit.");
  56. is(aPacket.frame.where.line, 15, "Found the load event listener.");
  57. gClient.removeListener("paused", tester);
  58. deferred.resolve();
  59. gThreadClient.resume(() => triggerButtonClick(handlers.slice(-1)));
  60. });
  61. getTabActorForUrl(gClient, TAB_URL).then(aGrip => {
  62. gClient.attachTab(aGrip.actor, (aResponse, aTabClient) => {
  63. aTabClient.reload();
  64. });
  65. });
  66. });
  67. return deferred.promise;
  68. }
  69. function triggerButtonClick() {
  70. let button = content.document.querySelector("button");
  71. EventUtils.sendMouseEvent({ type: "click" }, button);
  72. }
  73. registerCleanupFunction(function () {
  74. gClient = null;
  75. gThreadClient = null;
  76. });