Bug 849500 - navigate and will-navigate events for remoted targets carry payload that is incompatible with the non-remoted case; r=jwalker

This commit is contained in:
Panos Astithas 2013-04-04 11:23:42 +03:00
parent d9bf59efa7
commit 24790d3940
11 changed files with 50 additions and 81 deletions

View File

@ -201,7 +201,7 @@ let DebuggerController = {
* Packet received from the server. * Packet received from the server.
*/ */
_onTabNavigated: function DC__onTabNavigated(aType, aPacket) { _onTabNavigated: function DC__onTabNavigated(aType, aPacket) {
if (aPacket.state == "start") { if (aType == "will-navigate") {
DebuggerView._handleTabNavigation(); DebuggerView._handleTabNavigation();
// Discard all the old sources. // Discard all the old sources.

View File

@ -40,14 +40,7 @@ function testInitialLoad() {
function testLocationChange() function testLocationChange()
{ {
gDebugger.DebuggerController.activeThread.resume(function() { gDebugger.DebuggerController.activeThread.resume(function() {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired."); ok(true, "tabNavigated event was fired.");
info("Still attached to the tab."); info("Still attached to the tab.");
@ -66,14 +59,7 @@ function testLocationChange()
function testBack() function testBack()
{ {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired after going back."); ok(true, "tabNavigated event was fired after going back.");
info("Still attached to the tab."); info("Still attached to the tab.");
@ -93,14 +79,7 @@ function testBack()
function testForward() function testForward()
{ {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired after going forward."); ok(true, "tabNavigated event was fired after going forward.");
info("Still attached to the tab."); info("Still attached to the tab.");

View File

@ -73,13 +73,7 @@ function testSimpleCall() {
function testLocationChange() function testLocationChange()
{ {
gDebugger.DebuggerController.activeThread.resume(function() { gDebugger.DebuggerController.activeThread.resume(function() {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired."); ok(true, "tabNavigated event was fired.");
info("Still attached to the tab."); info("Still attached to the tab.");

View File

@ -73,13 +73,7 @@ function testSimpleCall() {
function testLocationChange() function testLocationChange()
{ {
gDebugger.DebuggerController.activeThread.resume(function() { gDebugger.DebuggerController.activeThread.resume(function() {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired."); ok(true, "tabNavigated event was fired.");
info("Still attached to the tab."); info("Still attached to the tab.");

View File

@ -50,13 +50,7 @@ function testSimpleCall() {
function testLocationChange() function testLocationChange()
{ {
gDebugger.DebuggerController.activeThread.resume(function() { gDebugger.DebuggerController.activeThread.resume(function() {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired."); ok(true, "tabNavigated event was fired.");
info("Still attached to the tab."); info("Still attached to the tab.");

View File

@ -109,14 +109,7 @@ function doSearch() {
function testLocationChange() function testLocationChange()
{ {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
dump("tabNavigated state " + aPacket.state + "\n");
if (aPacket.state == "start") {
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired after location change."); ok(true, "tabNavigated event was fired after location change.");
info("Still attached to the tab."); info("Still attached to the tab.");

View File

@ -125,15 +125,8 @@ function fetchSources(callback) {
} }
function performReload(callback) { function performReload(callback) {
gDebugger.DebuggerController.client.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { gDebugger.DebuggerController._target.once("will-navigate", testStateBeforeReload);
dump("tabNavigated state " + aPacket.state + "\n"); gDebugger.DebuggerController._target.once("navigate", function onTabNavigated(aEvent, aPacket) {
if (aPacket.state == "start") {
testStateBeforeReload();
return;
}
gDebugger.DebuggerController.client.removeListener("tabNavigated", onTabNavigated);
ok(true, "tabNavigated event was fired."); ok(true, "tabNavigated event was fired.");
info("Still attached to the tab."); info("Still attached to the tab.");

View File

@ -306,19 +306,21 @@ TabTarget.prototype = {
* Setup listeners for remote debugging, updating existing ones as necessary. * Setup listeners for remote debugging, updating existing ones as necessary.
*/ */
_setupRemoteListeners: function TabTarget__setupRemoteListeners() { _setupRemoteListeners: function TabTarget__setupRemoteListeners() {
// Reset any conflicting event handlers that were set before makeRemote().
if (this._webProgressListener) {
this._webProgressListener.destroy();
}
this.client.addListener("tabDetached", this.destroy); this.client.addListener("tabDetached", this.destroy);
this._onTabNavigated = function onRemoteTabNavigated(aType, aPacket) { this._onTabNavigated = function onRemoteTabNavigated(aType, aPacket) {
let event = Object.create(null);
event.url = aPacket.url;
event.title = aPacket.title;
// Send any stored event payload (DOMWindow or nsIRequest) for backwards
// compatibility with non-remotable tools.
event._navPayload = this._navPayload;
if (aPacket.state == "start") { if (aPacket.state == "start") {
this.emit("will-navigate", aPacket); this.emit("will-navigate", event);
} else { } else {
this.emit("navigate", aPacket); this.emit("navigate", event);
} }
this._navPayload = null;
}.bind(this); }.bind(this);
this.client.addListener("tabNavigated", this._onTabNavigated); this.client.addListener("tabNavigated", this._onTabNavigated);
}, },
@ -377,6 +379,10 @@ TabTarget.prototype = {
this.off("thread-paused", this._handleThreadState); this.off("thread-paused", this._handleThreadState);
if (this._tab) { if (this._tab) {
if (this._webProgressListener) {
this._webProgressListener.destroy();
}
this._tab.ownerDocument.defaultView.removeEventListener("unload", this); this._tab.ownerDocument.defaultView.removeEventListener("unload", this);
this._tab.removeEventListener("TabClose", this); this._tab.removeEventListener("TabClose", this);
this._tab.parentNode.removeEventListener("TabSelect", this); this._tab.parentNode.removeEventListener("TabSelect", this);
@ -385,10 +391,6 @@ TabTarget.prototype = {
// If this target was not remoted, the promise will be resolved before the // If this target was not remoted, the promise will be resolved before the
// function returns. // function returns.
if (this._tab && !this._client) { if (this._tab && !this._client) {
if (this._webProgressListener) {
this._webProgressListener.destroy();
}
targets.delete(this._tab); targets.delete(this._tab);
this._tab = null; this._tab = null;
this._client = null; this._client = null;
@ -454,7 +456,13 @@ TabWebProgressListener.prototype = {
// emit event if the top frame is navigating // emit event if the top frame is navigating
if (this.target && this.target.window == progress.DOMWindow) { if (this.target && this.target.window == progress.DOMWindow) {
this.target.emit("will-navigate", request); // Emit the event if the target is not remoted or store the payload for
// later emission otherwise.
if (this.target._client) {
this.target._navPayload = request;
} else {
this.target.emit("will-navigate", request);
}
} }
}, },
@ -466,7 +474,13 @@ TabWebProgressListener.prototype = {
if (this.target && if (this.target &&
!(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) { !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)) {
let window = webProgress.DOMWindow; let window = webProgress.DOMWindow;
this.target.emit("navigate", window); // Emit the event if the target is not remoted or store the payload for
// later emission otherwise.
if (this.target._client) {
this.target._navPayload = window;
} else {
this.target.emit("navigate", window);
}
} }
}, },

View File

@ -248,7 +248,8 @@ InspectorPanel.prototype = {
/** /**
* Reset the inspector on navigate away. * Reset the inspector on navigate away.
*/ */
onNavigatedAway: function InspectorPanel_onNavigatedAway(event, newWindow) { onNavigatedAway: function InspectorPanel_onNavigatedAway(event, payload) {
let newWindow = payload._navPayload || payload;
this.selection.setNode(null); this.selection.setNode(null);
this._destroyMarkup(); this._destroyMarkup();
this.isDirty = false; this.isDirty = false;
@ -503,7 +504,11 @@ InspectorPanel.prototype = {
*/ */
clearPseudoClasses: function InspectorPanel_clearPseudoClasses() { clearPseudoClasses: function InspectorPanel_clearPseudoClasses() {
this.breadcrumbs.nodeHierarchy.forEach(function(crumb) { this.breadcrumbs.nodeHierarchy.forEach(function(crumb) {
DOMUtils.clearPseudoClassLocks(crumb.node); try {
DOMUtils.clearPseudoClassLocks(crumb.node);
} catch(e) {
// Ignore dead nodes after navigation.
}
}); });
}, },

View File

@ -162,6 +162,7 @@ Selection.prototype = {
isNode: function SN_isNode() { isNode: function SN_isNode() {
return (this.node && return (this.node &&
!Components.utils.isDeadWrapper(this.node) &&
this.node.ownerDocument && this.node.ownerDocument &&
this.node.ownerDocument.defaultView && this.node.ownerDocument.defaultView &&
this.node instanceof this.node.ownerDocument.defaultView.Node); this.node instanceof this.node.ownerDocument.defaultView.Node);

View File

@ -86,7 +86,8 @@ StyleEditorPanel.prototype = {
/** /**
* Navigated to a new page. * Navigated to a new page.
*/ */
newPage: function StyleEditor_newPage(event, window) { newPage: function StyleEditor_newPage(event, payload) {
let window = payload._navPayload || payload;
this.reset(); this.reset();
this.setPage(window); this.setPage(window);
}, },
@ -94,7 +95,8 @@ StyleEditorPanel.prototype = {
/** /**
* Before navigating to a new page or reloading the page. * Before navigating to a new page or reloading the page.
*/ */
beforeNavigate: function StyleEditor_beforeNavigate(event, request) { beforeNavigate: function StyleEditor_beforeNavigate(event, payload) {
let request = payload._navPayload || payload;
if (this.styleEditorChrome.isDirty) { if (this.styleEditorChrome.isDirty) {
this.preventNavigate(request); this.preventNavigate(request);
} }
@ -206,4 +208,4 @@ XPCOMUtils.defineLazyGetter(StyleEditorPanel.prototype, "strings",
function () { function () {
return Services.strings.createBundle( return Services.strings.createBundle(
"chrome://browser/locale/devtools/styleeditor.properties"); "chrome://browser/locale/devtools/styleeditor.properties");
}); });