Bug 771655 - Debugger does not show up if any progress listener (e.g. NoScript) reads the WebProgress argument's DOMWindow property in onStateChange(); r=vporof

This commit is contained in:
Panos Astithas 2012-10-31 16:02:07 +02:00
parent 9bc475fdc6
commit fbc64fb6e0
4 changed files with 74 additions and 1 deletions

View File

@ -51,6 +51,7 @@ let DebuggerController = {
window.removeEventListener("load", this._startupDebugger, true);
DebuggerView.initialize(function() {
DebuggerView._isInitialized = true;
window.dispatchEvent("Debugger:Loaded");
this._connect();
}.bind(this));
@ -67,6 +68,7 @@ let DebuggerController = {
window.removeEventListener("unload", this._shutdownDebugger, true);
DebuggerView.destroy(function() {
DebuggerView._isDestroyed = true;
this.SourceScripts.disconnect();
this.StackFrames.disconnect();
this.ThreadState.disconnect();

View File

@ -45,7 +45,6 @@ let DebuggerView = {
this._initializePanes();
this._initializeEditor(aCallback)
this._isInitialized = true;
},
/**
@ -419,6 +418,7 @@ let DebuggerView = {
_stackframesAndBreakpoints: null,
_variables: null,
_isInitialized: false,
_isDestroyed: false
};
/**

View File

@ -73,6 +73,7 @@ MOCHITEST_BROWSER_TESTS = \
browser_dbg_bfcache.js \
browser_dbg_breakpoint-new-script.js \
browser_dbg_bug737803_editor_actual_location.js \
browser_dbg_progress-listener-bug.js \
head.js \
$(NULL)

View File

@ -0,0 +1,70 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
// Tests that the debugger does show up even if a progress listener reads the
// WebProgress argument's DOMWindow property in onStateChange() (bug 771655).
var gPane = null;
var gTab = null;
var gOldListener = null;
const TEST_URL = EXAMPLE_URL + "browser_dbg_script-switching.html";
function test() {
installListener();
debug_tab_pane(TEST_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab;
gPane = aPane;
let gDebugger = gPane.contentWindow;
is(gDebugger.DebuggerController._isInitialized, true,
"Controller should be initialized after debug_tab_pane.");
is(gDebugger.DebuggerView._isInitialized, true,
"View should be initialized after debug_tab_pane.");
closeDebuggerAndFinish();
});
}
// This is taken almost verbatim from bug 771655.
function installListener() {
if ("_testPL" in window) {
gOldListener = _testPL;
Cc['@mozilla.org/docloaderservice;1'].getService(Ci.nsIWebProgress)
.removeProgressListener(_testPL);
}
window._testPL = {
START_DOC: Ci.nsIWebProgressListener.STATE_START |
Ci.nsIWebProgressListener.STATE_IS_DOCUMENT,
onStateChange: function(wp, req, stateFlags, status) {
if ((stateFlags & this.START_DOC) === this.START_DOC) {
// This DOMWindow access triggers the unload event.
wp.DOMWindow;
}
},
QueryInterface: function(iid) {
if (iid.equals(Ci.nsISupportsWeakReference) ||
iid.equals(Ci.nsIWebProgressListener))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
}
}
Cc['@mozilla.org/docloaderservice;1'].getService(Ci.nsIWebProgress)
.addProgressListener(_testPL, Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
}
registerCleanupFunction(function() {
if (gOldListener) {
window._testPL = gOldListener;
} else {
delete window._testPL;
}
removeTab(gTab);
gPane = null;
gTab = null;
});