Bug 983386 - Delay "navigate" event when we are redirected to a error page, to only fire once the error page is loaded. r=jryans
MozReview-Commit-ID: 4XIgKzUHVLW
--- a/devtools/server/actors/webbrowser.js
+++ b/devtools/server/actors/webbrowser.js
@@ -3,17 +3,17 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/* global XPCNativeWrapper */
-var { Ci, Cu } = require("chrome");
+var { Ci, Cu, Cr } = require("chrome");
var Services = require("Services");
var { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
var promise = require("promise");
var {
ActorPool, createExtraActors, appendExtraActors, GeneratedLocation
} = require("devtools/server/actors/common");
var { DebuggerServer } = require("devtools/server/main");
var DevToolsUtils = require("devtools/shared/DevToolsUtils");
@@ -2490,19 +2490,37 @@ DebuggerProgressListener.prototype = {
let window = progress.DOMWindow;
if (isDocument && isStart) {
// One of the earliest events that tells us a new URI
// is being loaded in this window.
let newURI = request instanceof Ci.nsIChannel ? request.URI.spec : null;
this._tabActor._willNavigate(window, newURI, request);
}
if (isWindow && isStop) {
- // Somewhat equivalent of load event.
- // (window.document.readyState == complete)
- this._tabActor._navigate(window);
+ // Don't dispatch "navigate" event just yet when there is a redirect to
+ // about:neterror page.
+ if (request.status != Cr.NS_OK) {
+ // Instead, listen for DOMContentLoaded as about:neterror is loaded
+ // with LOAD_BACKGROUND flags and never dispatches load event.
+ // That may be the same reason why there is no onStateChange event
+ // for about:neterror loads.
+ let handler = getDocShellChromeEventHandler(progress);
+ let onLoad = evt => {
+ // Ignore events from iframes
+ if (evt.target == window.document) {
+ handler.removeEventListener("DOMContentLoaded", onLoad, true);
+ this._tabActor._navigate(window);
+ }
+ };
+ handler.addEventListener("DOMContentLoaded", onLoad, true);
+ } else {
+ // Somewhat equivalent of load event.
+ // (window.document.readyState == complete)
+ this._tabActor._navigate(window);
+ }
}
}, "DebuggerProgressListener.prototype.onStateChange")
};
exports.register = function (handle) {
handle.setRootActor(createRootActor);
};