browser_dbg_break-on-dom-event-02.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 even for bound event
  6. * listeners and handler objects with 'handleEvent' methods.
  7. */
  8. const TAB_URL = EXAMPLE_URL + "doc_event-listeners-03.html";
  9. var gClient, gThreadClient;
  10. function test() {
  11. if (!DebuggerServer.initialized) {
  12. DebuggerServer.init();
  13. DebuggerServer.addBrowserActors();
  14. }
  15. let transport = DebuggerServer.connectPipe();
  16. gClient = new DebuggerClient(transport);
  17. gClient.connect().then(([aType, aTraits]) => {
  18. is(aType, "browser",
  19. "Root actor should identify itself as a browser.");
  20. addTab(TAB_URL)
  21. .then(() => attachThreadActorForUrl(gClient, TAB_URL))
  22. .then(aThreadClient => gThreadClient = aThreadClient)
  23. .then(pauseDebuggee)
  24. .then(testBreakOnClick)
  25. .then(() => gClient.close())
  26. .then(finish)
  27. .then(null, aError => {
  28. ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
  29. });
  30. });
  31. }
  32. function pauseDebuggee() {
  33. let deferred = promise.defer();
  34. gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
  35. is(aPacket.type, "paused",
  36. "We should now be paused.");
  37. is(aPacket.why.type, "debuggerStatement",
  38. "The debugger statement was hit.");
  39. gThreadClient.resume(deferred.resolve);
  40. });
  41. // Spin the event loop before causing the debuggee to pause, to allow
  42. // this function to return first.
  43. executeSoon(() => triggerButtonClick("initialSetup"));
  44. return deferred.promise;
  45. }
  46. // Test pause on a single event.
  47. function testBreakOnClick() {
  48. let deferred = promise.defer();
  49. // Test calling pauseOnDOMEvents from a running state.
  50. gThreadClient.pauseOnDOMEvents(["click"], (aPacket) => {
  51. is(aPacket.error, undefined,
  52. "The pause-on-click request completed successfully.");
  53. let handlers = ["clicker"];
  54. gClient.addListener("paused", function tester(aEvent, aPacket) {
  55. is(aPacket.why.type, "pauseOnDOMEvents",
  56. "A hidden breakpoint was hit.");
  57. switch (handlers.length) {
  58. case 1:
  59. is(aPacket.frame.where.line, 26, "Found the clicker handler.");
  60. handlers.push("handleEventClick");
  61. break;
  62. case 2:
  63. is(aPacket.frame.where.line, 36, "Found the handleEventClick handler.");
  64. handlers.push("boundHandleEventClick");
  65. break;
  66. case 3:
  67. is(aPacket.frame.where.line, 46, "Found the boundHandleEventClick handler.");
  68. gClient.removeListener("paused", tester);
  69. deferred.resolve();
  70. }
  71. gThreadClient.resume(() => triggerButtonClick(handlers.slice(-1)));
  72. });
  73. triggerButtonClick(handlers.slice(-1));
  74. });
  75. return deferred.promise;
  76. }
  77. function triggerButtonClick(aNodeId) {
  78. let button = content.document.getElementById(aNodeId);
  79. EventUtils.sendMouseEvent({ type: "click" }, button);
  80. }
  81. registerCleanupFunction(function () {
  82. gClient = null;
  83. gThreadClient = null;
  84. });