gecko/browser/devtools/debugger/test/browser_dbg_break-on-dom-02.js
Panos Astithas 97a45e85f9 Make the debugger frontend cope with an already connected target (bug 933212); r=jryans,fitzgen
* Made the DebuggerClient, which is actually the RootActor front, not consider one of the attached child fronts as "active". Since a single DebuggerClient (or RootFront) is kept around for the App Manager's lifetime, it makes sense to move the notion of "active" tab to the toolbox's target. As each toolbox gets destroyed, the fronts should be detaching from their actors (if they are stateful) so that the app is no longer in a debugging state. Debugging a new app (or reconnecting to a previous one) will create new fronts anyway.
* Slightly refactored the TabClient, ThreadClient, SourceClient and TracerClient towards a protocol.js-based architecture, by adding parent-child references and lifecycle management. Now a tab-scoped thread actor for instance has the tab as its parent, while a global-scoped thread actor (chrome debugger) has the DebuggerCLient (RootFront) as its parent. This lets parents reference their children, so that caching in the target object can work. It also allowed me to move some methods from the DebuggerClient to the actual front that should be responsible, like reconfigureTab, reconfigureThread and attachThread. These methods now use DebuggerClient.requester, too.
* Added some error handling in the debugger client requester around "before" and "after" callbacks, which exposed some errors in tests that are now fixed.
* Fixed the state handling in the thread actor so that merely detaching from a thread doesn't put it in the exited state. This is the part that what was necessary for Firebug's use case.
* Properly loading tracer and webgl actors now on b2g.
2014-01-14 17:39:40 +02:00

127 lines
4.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that event listeners are fetched when the events tab is selected
* or while sources are fetched and the events tab is focused.
*/
const TAB_URL = EXAMPLE_URL + "doc_event-listeners-02.html";
function test() {
initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
let gDebugger = aPanel.panelWin;
let gView = gDebugger.DebuggerView;
let gEvents = gView.EventListeners;
Task.spawn(function() {
yield waitForSourceShown(aPanel, ".html");
yield testFetchOnFocus();
yield testFetchOnReloadWhenFocused();
yield testFetchOnReloadWhenNotFocused();
yield closeDebuggerAndFinish(aPanel);
});
function testFetchOnFocus() {
return Task.spawn(function() {
let fetched = waitForDebuggerEvents(aPanel, gDebugger.EVENTS.EVENT_LISTENERS_FETCHED);
gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
is(gView.instrumentsPaneHidden, false,
"The instruments pane should be visible now.");
is(gView.instrumentsPaneTab, "events-tab",
"The events tab should be selected.");
yield fetched;
ok(true,
"Event listeners were fetched when the events tab was selected");
is(gEvents.itemCount, 4,
"There should be 4 events displayed in the view.");
});
}
function testFetchOnReloadWhenFocused() {
return Task.spawn(function() {
let fetched = waitForDebuggerEvents(aPanel, gDebugger.EVENTS.EVENT_LISTENERS_FETCHED);
let reloading = once(gDebugger.gTarget, "will-navigate");
let reloaded = waitForSourcesAfterReload();
gDebugger.DebuggerController._target.activeTab.reload();
yield reloading;
is(gEvents.itemCount, 0,
"There should be no events displayed in the view while reloading.");
ok(true,
"Event listeners were removed when the target started navigating.");
yield reloaded;
is(gView.instrumentsPaneHidden, false,
"The instruments pane should still be visible.");
is(gView.instrumentsPaneTab, "events-tab",
"The events tab should still be selected.");
yield fetched;
is(gEvents.itemCount, 4,
"There should be 4 events displayed in the view after reloading.");
ok(true,
"Event listeners were added back after the target finished navigating.");
});
}
function testFetchOnReloadWhenNotFocused() {
return Task.spawn(function() {
gDebugger.on(gDebugger.EVENTS.EVENT_LISTENERS_FETCHED, () => {
ok(false, "Shouldn't have fetched any event listeners.");
});
gDebugger.on(gDebugger.EVENTS.EVENT_BREAKPOINTS_UPDATED, () => {
ok(false, "Shouldn't have updated any event breakpoints.");
});
gView.toggleInstrumentsPane({ visible: true, animated: false }, 0);
is(gView.instrumentsPaneHidden, false,
"The instruments pane should still be visible.");
is(gView.instrumentsPaneTab, "variables-tab",
"The variables tab should be selected.");
let reloading = once(gDebugger.gTarget, "will-navigate");
let reloaded = waitForSourcesAfterReload();
gDebugger.DebuggerController._target.activeTab.reload();
yield reloading;
is(gEvents.itemCount, 0,
"There should be no events displayed in the view while reloading.");
ok(true,
"Event listeners were removed when the target started navigating.");
yield reloaded;
is(gView.instrumentsPaneHidden, false,
"The instruments pane should still be visible.");
is(gView.instrumentsPaneTab, "variables-tab",
"The variables tab should still be selected.");
// Just to be really sure that the events will never ever fire.
yield waitForTime(1000);
is(gEvents.itemCount, 0,
"There should be no events displayed in the view after reloading.");
ok(true,
"Event listeners were not added after the target finished navigating.");
});
}
function waitForSourcesAfterReload() {
return promise.all([
waitForDebuggerEvents(aPanel, gDebugger.EVENTS.NEW_SOURCE),
waitForDebuggerEvents(aPanel, gDebugger.EVENTS.SOURCES_ADDED),
waitForDebuggerEvents(aPanel, gDebugger.EVENTS.SOURCE_SHOWN)
]);
}
});
}