diff --git a/toolkit/components/extensions/ext-webNavigation.js b/toolkit/components/extensions/ext-webNavigation.js index 2c50515d65b..0a3811aa0dd 100644 --- a/toolkit/components/extensions/ext-webNavigation.js +++ b/toolkit/components/extensions/ext-webNavigation.js @@ -79,7 +79,6 @@ extensions.registerSchemaAPI("webNavigation", "webNavigation", (extension, conte onCompleted: new WebNavigationEventManager(context, "onCompleted").api(), onErrorOccurred: new WebNavigationEventManager(context, "onErrorOccurred").api(), onReferenceFragmentUpdated: new WebNavigationEventManager(context, "onReferenceFragmentUpdated").api(), - onHistoryStateUpdated: new WebNavigationEventManager(context, "onHistoryStateUpdated").api(), onCreatedNavigationTarget: ignoreEvent(context, "webNavigation.onCreatedNavigationTarget"), getAllFrames(details) { let tab = TabManager.getTab(details.tabId); diff --git a/toolkit/components/extensions/schemas/web_navigation.json b/toolkit/components/extensions/schemas/web_navigation.json index be712f23225..1ed98fac665 100644 --- a/toolkit/components/extensions/schemas/web_navigation.json +++ b/toolkit/components/extensions/schemas/web_navigation.json @@ -345,6 +345,7 @@ }, { "name": "onHistoryStateUpdated", + "unsupported": true, "type": "function", "description": "Fired when the frame's history was updated to a new URL. All future events for that frame will use the updated URL.", "filters": [ diff --git a/toolkit/components/extensions/test/mochitest/test_ext_webnavigation.html b/toolkit/components/extensions/test/mochitest/test_ext_webnavigation.html index 4df347ca6b9..9ae38940bb9 100644 --- a/toolkit/components/extensions/test/mochitest/test_ext_webnavigation.html +++ b/toolkit/components/extensions/test/mochitest/test_ext_webnavigation.html @@ -24,7 +24,6 @@ function backgroundScript() { "onCompleted", "onErrorOccurred", "onReferenceFragmentUpdated", - "onHistoryStateUpdated", ]; let expectedTabId = -1; @@ -69,7 +68,6 @@ const BASE = "http://mochi.test:8888/tests/toolkit/components/extensions/test/mo const URL = BASE + "/file_WebNavigation_page1.html"; const FRAME = BASE + "/file_WebNavigation_page2.html"; const FRAME2 = BASE + "/file_WebNavigation_page3.html"; -const FRAME_PUSHSTATE = BASE + "/file_WebNavigation_page3_pushState.html"; const REQUIRED = [ "onBeforeNavigate", @@ -157,71 +155,10 @@ add_task(function* webnav_ordering() { checkRequired(FRAME2); - let navigationSequence = [ - { - action: () => { win.frames[0].document.getElementById("elt").click(); }, - waitURL: `${FRAME2}#ref`, - expectedEvent: "onReferenceFragmentUpdated", - description: "clicked an anchor link", - }, - { - action: () => { win.frames[0].history.pushState({}, "History PushState", `${FRAME2}#ref2`); }, - waitURL: `${FRAME2}#ref2`, - expectedEvent: "onReferenceFragmentUpdated", - description: "history.pushState, same pathname, different hash", - }, - { - action: () => { win.frames[0].history.pushState({}, "History PushState", `${FRAME2}#ref2`); }, - waitURL: `${FRAME2}#ref2`, - expectedEvent: "onHistoryStateUpdated", - description: "history.pushState, same pathname, same hash", - }, - { - action: () => { - win.frames[0].history.pushState({}, "History PushState", `${FRAME2}?query_param1=value#ref2`); - }, - waitURL: `${FRAME2}?query_param1=value#ref2`, - expectedEvent: "onHistoryStateUpdated", - description: "history.pushState, same pathname, same hash, different query params", - }, - { - action: () => { - win.frames[0].history.pushState({}, "History PushState", `${FRAME2}?query_param2=value#ref3`); - }, - waitURL: `${FRAME2}?query_param2=value#ref3`, - expectedEvent: "onHistoryStateUpdated", - description: "history.pushState, same pathname, different hash, different query params", - }, - { - action: () => { win.frames[0].history.pushState(null, "History PushState", FRAME_PUSHSTATE); }, - waitURL: FRAME_PUSHSTATE, - expectedEvent: "onHistoryStateUpdated", - description: "history.pushState, different pathname", - }, - ]; + yield loadAndWait(win, "onReferenceFragmentUpdated", FRAME2 + "#ref", + () => { win.frames[0].document.getElementById("elt").click(); }); - for (let navigation of navigationSequence) { - let { expectedEvent, waitURL, action, description } = navigation; - info(`Waiting ${expectedEvent} from ${waitURL} - ${description}`); - yield loadAndWait(win, expectedEvent, waitURL, action); - info(`Received ${expectedEvent} from ${waitURL} - ${description}`); - } - - for (let i = navigationSequence.length - 1; i > 0; i--) { - let { waitURL: fromURL, expectedEvent } = navigationSequence[i]; - let { waitURL } = navigationSequence[i - 1]; - info(`Waiting ${expectedEvent} from ${waitURL} - history.back() from ${fromURL} to ${waitURL}`); - yield loadAndWait(win, expectedEvent, waitURL, () => { win.frames[0].history.back(); }); - info(`Received ${expectedEvent} from ${waitURL} - history.back() from ${fromURL} to ${waitURL}`); - } - - for (let i = 0; i < navigationSequence.length - 1; i++) { - let { waitURL: fromURL } = navigationSequence[i]; - let { waitURL, expectedEvent } = navigationSequence[i + 1]; - info(`Waiting ${expectedEvent} from ${waitURL} - history.forward() from ${fromURL} to ${waitURL}`); - yield loadAndWait(win, expectedEvent, waitURL, () => { win.frames[0].history.forward(); }); - info(`Received ${expectedEvent} from ${waitURL} - history.forward() from ${fromURL} to ${waitURL}`); - } + info("Received onReferenceFragmentUpdated from FRAME2"); win.close(); diff --git a/toolkit/modules/addons/WebNavigation.jsm b/toolkit/modules/addons/WebNavigation.jsm index 1abf8fe151d..b62e321985a 100644 --- a/toolkit/modules/addons/WebNavigation.jsm +++ b/toolkit/modules/addons/WebNavigation.jsm @@ -99,11 +99,8 @@ var Manager = { onLocationChange(browser, data) { let url = data.location; - - if (data.isReferenceFragmentUpdated) { + if (data.flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT) { this.fire("onReferenceFragmentUpdated", browser, data, {url}); - } else if (data.isHistoryStateUpdated) { - this.fire("onHistoryStateUpdated", browser, data, {url}); } else { this.fire("onCommitted", browser, data, {url}); } @@ -145,8 +142,9 @@ const EVENTS = [ "onCompleted", "onErrorOccurred", "onReferenceFragmentUpdated", - "onHistoryStateUpdated", + // "onCreatedNavigationTarget", + // "onHistoryStateUpdated", ]; var WebNavigation = {}; diff --git a/toolkit/modules/addons/WebNavigationContent.js b/toolkit/modules/addons/WebNavigationContent.js index 3452795d656..0e469ee9b89 100644 --- a/toolkit/modules/addons/WebNavigationContent.js +++ b/toolkit/modules/addons/WebNavigationContent.js @@ -25,19 +25,6 @@ addMessageListener("Extension:DisableWebNavigation", () => { var WebProgressListener = { init: function() { - // This WeakMap (DOMWindow -> nsIURI) keeps track of the pathname and hash - // of the previous location for all the existent docShells. - this.previousURIMap = new WeakMap(); - - // Populate the above previousURIMap by iterating over the docShells tree. - for (let currentDocShell of WebNavigationFrames.iterateDocShellTree(docShell)) { - let win = currentDocShell.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindow); - let { currentURI } = currentDocShell.QueryInterface(Ci.nsIWebNavigation); - - this.previousURIMap.set(win, currentURI); - } - let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebProgress); webProgress.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_STATE_WINDOW | @@ -61,7 +48,6 @@ var WebProgressListener = { status, stateFlags, }; - sendAsyncMessage("Extension:StateChange", data); if (webProgress.DOMWindow.top != webProgress.DOMWindow) { @@ -70,51 +56,24 @@ var WebProgressListener = { // For some reason we don't fire onLocationChange for the // initial navigation of a sub-frame. So we need to simulate // it here. - this.onLocationChange(webProgress, request, request.QueryInterface(Ci.nsIChannel).URI, 0); + let data = { + location: request.QueryInterface(Ci.nsIChannel).URI.spec, + windowId: webProgress.DOMWindowID, + parentWindowId: WebNavigationFrames.getParentWindowId(webProgress.DOMWindow), + flags: 0, + }; + sendAsyncMessage("Extension:LocationChange", data); } } }, onLocationChange: function onLocationChange(webProgress, request, locationURI, flags) { - let { DOMWindow, loadType } = webProgress; - - // Get the previous URI loaded in the DOMWindow. - let previousURI = this.previousURIMap.get(DOMWindow); - - // Update the URI in the map with the new locationURI. - this.previousURIMap.set(DOMWindow, locationURI); - - let isSameDocument = (flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT); - let isHistoryStateUpdated = false; - let isReferenceFragmentUpdated = false; - - if (isSameDocument) { - let pathChanged = !(previousURI && locationURI.equalsExceptRef(previousURI)); - let hashChanged = !(previousURI && previousURI.ref == locationURI.ref); - - // When the location changes but the document is the same: - // - path not changed and hash changed -> |onReferenceFragmentUpdated| - // (even if it changed using |history.pushState|) - // - path not changed and hash not changed -> |onHistoryStateUpdated| - // (only if it changes using |history.pushState|) - // - path changed -> |onHistoryStateUpdated| - - if (!pathChanged && hashChanged) { - isReferenceFragmentUpdated = true; - } else if (loadType & Ci.nsIDocShell.LOAD_CMD_PUSHSTATE) { - isHistoryStateUpdated = true; - } else if (loadType & Ci.nsIDocShell.LOAD_CMD_HISTORY) { - isHistoryStateUpdated = true; - } - } - let data = { - isHistoryStateUpdated, isReferenceFragmentUpdated, location: locationURI ? locationURI.spec : "", windowId: webProgress.DOMWindowID, parentWindowId: WebNavigationFrames.getParentWindowId(webProgress.DOMWindow), + flags, }; - sendAsyncMessage("Extension:LocationChange", data); }, diff --git a/toolkit/modules/addons/WebNavigationFrames.jsm b/toolkit/modules/addons/WebNavigationFrames.jsm index cb404b251c9..0aeb78acd32 100644 --- a/toolkit/modules/addons/WebNavigationFrames.jsm +++ b/toolkit/modules/addons/WebNavigationFrames.jsm @@ -97,8 +97,6 @@ function findFrame(windowId, rootDocShell) { } var WebNavigationFrames = { - iterateDocShellTree, - getFrame(docShell, frameId) { if (frameId == 0) { return convertDocShellToFrameDetail(docShell);