browser/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.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  * Test if the context menu associated with each breakpoint does what it should.
     6  */
     8 const TAB_URL = EXAMPLE_URL + "doc_script-switching-01.html";
    10 function test() {
    11   // Debug test slaves are a bit slow at this test.
    12   requestLongerTimeout(2);
    14   let gTab, gDebuggee, gPanel, gDebugger;
    15   let gSources, gBreakpoints;
    17   initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
    18     gTab = aTab;
    19     gDebuggee = aDebuggee;
    20     gPanel = aPanel;
    21     gDebugger = gPanel.panelWin;
    22     gSources = gDebugger.DebuggerView.Sources;
    23     gBreakpoints = gDebugger.DebuggerController.Breakpoints;
    25     waitForSourceShown(gPanel, "-01.js")
    26       .then(performTestWhileNotPaused)
    27       .then(performTestWhilePaused)
    28       .then(() => resumeDebuggerThenCloseAndFinish(gPanel))
    29       .then(null, aError => {
    30         ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
    31       });
    32   });
    34   function addBreakpoints() {
    35     return promise.resolve(null)
    36       .then(() => gPanel.addBreakpoint({ url: gSources.values[0], line: 5 }))
    37       .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 6 }))
    38       .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 7 }))
    39       .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 8 }))
    40       .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 9 }))
    41       .then(() => ensureThreadClientState(gPanel, "resumed"));
    42   }
    44   function performTestWhileNotPaused() {
    45     info("Performing test while not paused...");
    47     return addBreakpoints()
    48       .then(initialChecks)
    49       .then(() => checkBreakpointToggleSelf(0))
    50       .then(() => checkBreakpointToggleOthers(0))
    51       .then(() => checkBreakpointToggleSelf(1))
    52       .then(() => checkBreakpointToggleOthers(1))
    53       .then(() => checkBreakpointToggleSelf(2))
    54       .then(() => checkBreakpointToggleOthers(2))
    55       .then(() => checkBreakpointToggleSelf(3))
    56       .then(() => checkBreakpointToggleOthers(3))
    57       .then(() => checkBreakpointToggleSelf(4))
    58       .then(() => checkBreakpointToggleOthers(4))
    59       .then(testDeleteAll);
    60   }
    62   function performTestWhilePaused() {
    63     info("Performing test while paused...");
    65     return addBreakpoints()
    66       .then(initialChecks)
    67       .then(pauseAndCheck)
    68       .then(() => checkBreakpointToggleSelf(0))
    69       .then(() => checkBreakpointToggleOthers(0))
    70       .then(() => checkBreakpointToggleSelf(1))
    71       .then(() => checkBreakpointToggleOthers(1))
    72       .then(() => checkBreakpointToggleSelf(2))
    73       .then(() => checkBreakpointToggleOthers(2))
    74       .then(() => checkBreakpointToggleSelf(3))
    75       .then(() => checkBreakpointToggleOthers(3))
    76       .then(() => checkBreakpointToggleSelf(4))
    77       .then(() => checkBreakpointToggleOthers(4))
    78       .then(testDeleteAll);
    79   }
    81   function pauseAndCheck() {
    82     let finished = waitForSourceAndCaretAndScopes(gPanel, "-01.js", 5).then(() => {
    83       is(gSources.selectedValue, EXAMPLE_URL + "code_script-switching-01.js",
    84         "The currently selected source is incorrect (3).");
    85       is(gSources.selectedIndex, 0,
    86         "The currently selected source is incorrect (4).");
    87       ok(isCaretPos(gPanel, 5),
    88         "The editor location is correct after pausing.");
    89     });
    91     is(gSources.selectedValue, EXAMPLE_URL + "code_script-switching-02.js",
    92       "The currently selected source is incorrect (1).");
    93     is(gSources.selectedIndex, 1,
    94       "The currently selected source is incorrect (2).");
    95     ok(isCaretPos(gPanel, 9),
    96       "The editor location is correct before pausing.");
    98     // Spin the event loop before causing the debuggee to pause, to allow
    99     // this function to return first.
   100     executeSoon(() => {
   101       EventUtils.sendMouseEvent({ type: "click" },
   102         gDebuggee.document.querySelector("button"),
   103         gDebuggee);
   104     });
   106     return finished;
   107   }
   109   function initialChecks() {
   110     for (let source of gSources) {
   111       for (let breakpoint of source) {
   112         ok(gBreakpoints._getAdded(breakpoint.attachment),
   113           "All breakpoint items should have corresponding promises (1).");
   114         ok(!gBreakpoints._getRemoving(breakpoint.attachment),
   115           "All breakpoint items should have corresponding promises (2).");
   116         ok(breakpoint.attachment.actor,
   117           "All breakpoint items should have corresponding promises (3).");
   118         is(!!breakpoint.attachment.disabled, false,
   119           "All breakpoints should initially be enabled.");
   121         let prefix = "bp-cMenu-"; // "breakpoints context menu"
   122         let identifier = gBreakpoints.getIdentifier(breakpoint.attachment);
   123         let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem";
   124         let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem";
   126         is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true",
   127           "The 'Enable breakpoint' context menu item should initially be hidden'.");
   128         ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"),
   129           "The 'Disable breakpoint' context menu item should initially not be hidden'.");
   130         is(breakpoint.attachment.view.checkbox.getAttribute("checked"), "true",
   131           "All breakpoints should initially have a checked checkbox.");
   132       }
   133     }
   134   }
   136   function checkBreakpointToggleSelf(aIndex) {
   137     let deferred = promise.defer();
   139     EventUtils.sendMouseEvent({ type: "click" },
   140       gDebugger.document.querySelectorAll(".dbg-breakpoint")[aIndex],
   141       gDebugger);
   143     let selectedBreakpoint = gSources._selectedBreakpointItem;
   145     ok(gBreakpoints._getAdded(selectedBreakpoint.attachment),
   146       "There should be a breakpoint client available (1).");
   147     ok(!gBreakpoints._getRemoving(selectedBreakpoint.attachment),
   148       "There should be a breakpoint client available (2).");
   149     ok(selectedBreakpoint.attachment.actor,
   150       "There should be a breakpoint client available (3).");
   151     is(!!selectedBreakpoint.attachment.disabled, false,
   152       "The breakpoint should not be disabled yet (" + aIndex + ").");
   154     gBreakpoints._getAdded(selectedBreakpoint.attachment).then(aBreakpointClient => {
   155       ok(aBreakpointClient,
   156         "There should be a breakpoint client available as a promise.");
   157     });
   159     let prefix = "bp-cMenu-"; // "breakpoints context menu"
   160     let identifier = gBreakpoints.getIdentifier(selectedBreakpoint.attachment);
   161     let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem";
   162     let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem";
   164     is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true",
   165       "The 'Enable breakpoint' context menu item should be hidden'.");
   166     ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"),
   167       "The 'Disable breakpoint' context menu item should not be hidden'.");
   169     ok(isCaretPos(gPanel, selectedBreakpoint.attachment.line),
   170       "The source editor caret position was incorrect (" + aIndex + ").");
   172     waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED).then(() => {
   173       ok(!gBreakpoints._getAdded(selectedBreakpoint.attachment),
   174         "There should be no breakpoint client available (4).");
   176       waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED).then(() => {
   177         ok(gBreakpoints._getAdded(selectedBreakpoint.attachment),
   178           "There should be a breakpoint client available (5).");
   180         deferred.resolve();
   181       });
   183       // Test re-disabling this breakpoint.
   184       gSources._onEnableSelf(selectedBreakpoint.attachment);
   185       is(selectedBreakpoint.attachment.disabled, false,
   186         "The current breakpoint should now be enabled.")
   188       is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true",
   189         "The 'Enable breakpoint' context menu item should be hidden'.");
   190       ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"),
   191         "The 'Disable breakpoint' context menu item should not be hidden'.");
   192       ok(selectedBreakpoint.attachment.view.checkbox.hasAttribute("checked"),
   193         "The breakpoint should now be checked.");
   194     });
   196     // Test disabling this breakpoint.
   197     gSources._onDisableSelf(selectedBreakpoint.attachment);
   198     is(selectedBreakpoint.attachment.disabled, true,
   199       "The current breakpoint should now be disabled.")
   201     ok(!gDebugger.document.getElementById(enableSelfId).hasAttribute("hidden"),
   202       "The 'Enable breakpoint' context menu item should not be hidden'.");
   203     is(gDebugger.document.getElementById(disableSelfId).getAttribute("hidden"), "true",
   204       "The 'Disable breakpoint' context menu item should be hidden'.");
   205     ok(!selectedBreakpoint.attachment.view.checkbox.hasAttribute("checked"),
   206       "The breakpoint should now be unchecked.");
   208     return deferred.promise;
   209   }
   211   function checkBreakpointToggleOthers(aIndex) {
   212     let deferred = promise.defer();
   214     waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 4).then(() => {
   215       let selectedBreakpoint = gSources._selectedBreakpointItem;
   217       ok(gBreakpoints._getAdded(selectedBreakpoint.attachment),
   218         "There should be a breakpoint client available (6).");
   219       ok(!gBreakpoints._getRemoving(selectedBreakpoint.attachment),
   220         "There should be a breakpoint client available (7).");
   221       ok(selectedBreakpoint.attachment.actor,
   222         "There should be a breakpoint client available (8).");
   223       is(!!selectedBreakpoint.attachment.disabled, false,
   224         "The targetted breakpoint should not have been disabled (" + aIndex + ").");
   226       for (let source of gSources) {
   227         for (let otherBreakpoint of source) {
   228           if (otherBreakpoint != selectedBreakpoint) {
   229             ok(!gBreakpoints._getAdded(otherBreakpoint.attachment),
   230               "There should be no breakpoint client for a disabled breakpoint (9).");
   231             is(otherBreakpoint.attachment.disabled, true,
   232               "Non-targetted breakpoints should have been disabled (10).");
   233           }
   234         }
   235       }
   237       waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED, 4).then(() => {
   238         for (let source of gSources) {
   239           for (let someBreakpoint of source) {
   240             ok(gBreakpoints._getAdded(someBreakpoint.attachment),
   241               "There should be a breakpoint client for all enabled breakpoints (11).");
   242             is(someBreakpoint.attachment.disabled, false,
   243               "All breakpoints should now have been enabled (12).");
   244           }
   245         }
   247         waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 5).then(() => {
   248           for (let source of gSources) {
   249             for (let someBreakpoint of source) {
   250               ok(!gBreakpoints._getAdded(someBreakpoint.attachment),
   251                 "There should be no breakpoint client for a disabled breakpoint (13).");
   252               is(someBreakpoint.attachment.disabled, true,
   253                 "All breakpoints should now have been disabled (14).");
   254             }
   255           }
   257           waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED, 5).then(() => {
   258             for (let source of gSources) {
   259               for (let someBreakpoint of source) {
   260                 ok(gBreakpoints._getAdded(someBreakpoint.attachment),
   261                   "There should be a breakpoint client for all enabled breakpoints (15).");
   262                 is(someBreakpoint.attachment.disabled, false,
   263                   "All breakpoints should now have been enabled (16).");
   264               }
   265             }
   267             // Done.
   268             deferred.resolve();
   269           });
   271           // Test re-enabling all breakpoints.
   272           enableAll();
   273         });
   275         // Test disabling all breakpoints.
   276         disableAll();
   277       });
   279       // Test re-enabling other breakpoints.
   280       enableOthers();
   281     });
   283     // Test disabling other breakpoints.
   284     disableOthers();
   286     return deferred.promise;
   287   }
   289   function testDeleteAll() {
   290     let deferred = promise.defer();
   292     waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 5).then(() => {
   293       ok(!gSources._selectedBreakpointItem,
   294         "There should be no breakpoint available after removing all breakpoints.");
   296       for (let source of gSources) {
   297         for (let otherBreakpoint of source) {
   298           ok(false, "It's a trap!");
   299         }
   300       }
   302       // Done.
   303       deferred.resolve()
   304     });
   306     // Test deleting all breakpoints.
   307     deleteAll();
   309     return deferred.promise;
   310   }
   312   function disableOthers() {
   313     gSources._onDisableOthers(gSources._selectedBreakpointItem.attachment);
   314   }
   315   function enableOthers() {
   316     gSources._onEnableOthers(gSources._selectedBreakpointItem.attachment);
   317   }
   318   function disableAll() {
   319     gSources._onDisableAll();
   320   }
   321   function enableAll() {
   322     gSources._onEnableAll();
   323   }
   324   function deleteAll() {
   325     gSources._onDeleteAll();
   326   }
   327 }

mercurial