test_dbgactor.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* Any copyright is dedicated to the Public Domain.
  2. http://creativecommons.org/publicdomain/zero/1.0/ */
  3. var gClient;
  4. var gDebuggee;
  5. const xpcInspector = Cc["@mozilla.org/jsinspector;1"].getService(Ci.nsIJSInspector);
  6. function run_test()
  7. {
  8. initTestDebuggerServer();
  9. gDebuggee = testGlobal("test-1");
  10. DebuggerServer.addTestGlobal(gDebuggee);
  11. let transport = DebuggerServer.connectPipe();
  12. gClient = new DebuggerClient(transport);
  13. gClient.addListener("connected", function (aEvent, aType, aTraits) {
  14. gClient.listTabs((aResponse) => {
  15. do_check_true("tabs" in aResponse);
  16. for (let tab of aResponse.tabs) {
  17. if (tab.title == "test-1") {
  18. test_attach_tab(tab.actor);
  19. return false;
  20. }
  21. }
  22. do_check_true(false); // We should have found our tab in the list.
  23. return undefined;
  24. });
  25. });
  26. gClient.connect();
  27. do_test_pending();
  28. }
  29. // Attach to |aTabActor|, and check the response.
  30. function test_attach_tab(aTabActor)
  31. {
  32. gClient.request({ to: aTabActor, type: "attach" }, function (aResponse) {
  33. do_check_false("error" in aResponse);
  34. do_check_eq(aResponse.from, aTabActor);
  35. do_check_eq(aResponse.type, "tabAttached");
  36. do_check_true(typeof aResponse.threadActor === "string");
  37. test_attach_thread(aResponse.threadActor);
  38. });
  39. }
  40. // Attach to |aThreadActor|, check the response, and resume it.
  41. function test_attach_thread(aThreadActor)
  42. {
  43. gClient.request({ to: aThreadActor, type: "attach" }, function (aResponse) {
  44. do_check_false("error" in aResponse);
  45. do_check_eq(aResponse.from, aThreadActor);
  46. do_check_eq(aResponse.type, "paused");
  47. do_check_true("why" in aResponse);
  48. do_check_eq(aResponse.why.type, "attached");
  49. test_resume_thread(aThreadActor);
  50. });
  51. }
  52. // Resume |aThreadActor|, and see that it stops at the 'debugger'
  53. // statement.
  54. function test_resume_thread(aThreadActor)
  55. {
  56. // Allow the client to resume execution.
  57. gClient.request({ to: aThreadActor, type: "resume" }, function (aResponse) {
  58. do_check_false("error" in aResponse);
  59. do_check_eq(aResponse.from, aThreadActor);
  60. do_check_eq(aResponse.type, "resumed");
  61. do_check_eq(xpcInspector.eventLoopNestLevel, 0);
  62. // Now that we know we're resumed, we can make the debuggee do something.
  63. Cu.evalInSandbox("var a = true; var b = false; debugger; var b = true;", gDebuggee);
  64. // Now make sure that we've run the code after the debugger statement...
  65. do_check_true(gDebuggee.b);
  66. });
  67. gClient.addListener("paused", function (aName, aPacket) {
  68. do_check_eq(aName, "paused");
  69. do_check_false("error" in aPacket);
  70. do_check_eq(aPacket.from, aThreadActor);
  71. do_check_eq(aPacket.type, "paused");
  72. do_check_true("actor" in aPacket);
  73. do_check_true("why" in aPacket);
  74. do_check_eq(aPacket.why.type, "debuggerStatement");
  75. // Reach around the protocol to check that the debuggee is in the state
  76. // we expect.
  77. do_check_true(gDebuggee.a);
  78. do_check_false(gDebuggee.b);
  79. do_check_eq(xpcInspector.eventLoopNestLevel, 1);
  80. // Let the debuggee continue execution.
  81. gClient.request({ to: aThreadActor, type: "resume" }, cleanup);
  82. });
  83. }
  84. function cleanup()
  85. {
  86. gClient.addListener("closed", function (aEvent, aResult) {
  87. do_test_finished();
  88. });
  89. try {
  90. let xpcInspector = Cc["@mozilla.org/jsinspector;1"].getService(Ci.nsIJSInspector);
  91. do_check_eq(xpcInspector.eventLoopNestLevel, 0);
  92. } catch (e) {
  93. dump(e);
  94. }
  95. gClient.close();
  96. }