michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: let Cu = Components.utils; michael@0: let Ci = Components.interfaces; michael@0: michael@0: Cu.import("resource:///modules/sessionstore/FrameTree.jsm", this); michael@0: let gFrameTree = new FrameTree(this); michael@0: michael@0: gFrameTree.addObserver({ michael@0: onFrameTreeReset: function () { michael@0: sendAsyncMessage("ss-test:onFrameTreeReset"); michael@0: }, michael@0: michael@0: onFrameTreeCollected: function () { michael@0: sendAsyncMessage("ss-test:onFrameTreeCollected"); michael@0: } michael@0: }); michael@0: michael@0: /** michael@0: * This frame script is only loaded for sessionstore mochitests. It enables us michael@0: * to modify and query docShell data when running with multiple processes. michael@0: */ michael@0: michael@0: addEventListener("hashchange", function () { michael@0: sendAsyncMessage("ss-test:hashchange"); michael@0: }); michael@0: michael@0: addEventListener("MozStorageChanged", function () { michael@0: sendSyncMessage("ss-test:MozStorageChanged"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:modifySessionStorage", function (msg) { michael@0: for (let key of Object.keys(msg.data)) { michael@0: content.sessionStorage[key] = msg.data[key]; michael@0: } michael@0: }); michael@0: michael@0: addMessageListener("ss-test:modifySessionStorage2", function (msg) { michael@0: for (let key of Object.keys(msg.data)) { michael@0: content.frames[0].sessionStorage[key] = msg.data[key]; michael@0: } michael@0: }); michael@0: michael@0: addMessageListener("ss-test:purgeDomainData", function ({data: domain}) { michael@0: Services.obs.notifyObservers(null, "browser:purge-domain-data", domain); michael@0: content.setTimeout(() => sendAsyncMessage("ss-test:purgeDomainData")); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:purgeSessionHistory", function () { michael@0: Services.obs.notifyObservers(null, "browser:purge-session-history", ""); michael@0: content.setTimeout(() => sendAsyncMessage("ss-test:purgeSessionHistory")); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:getStyleSheets", function (msg) { michael@0: let sheets = content.document.styleSheets; michael@0: let titles = Array.map(sheets, ss => [ss.title, ss.disabled]); michael@0: sendSyncMessage("ss-test:getStyleSheets", titles); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:enableStyleSheetsForSet", function (msg) { michael@0: content.document.enableStyleSheetsForSet(msg.data); michael@0: sendAsyncMessage("ss-test:enableStyleSheetsForSet"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:enableSubDocumentStyleSheetsForSet", function (msg) { michael@0: let iframe = content.document.getElementById(msg.data.id); michael@0: iframe.contentDocument.enableStyleSheetsForSet(msg.data.set); michael@0: sendAsyncMessage("ss-test:enableSubDocumentStyleSheetsForSet"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:getAuthorStyleDisabled", function (msg) { michael@0: let {authorStyleDisabled} = michael@0: docShell.contentViewer.QueryInterface(Ci.nsIMarkupDocumentViewer); michael@0: sendSyncMessage("ss-test:getAuthorStyleDisabled", authorStyleDisabled); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:setAuthorStyleDisabled", function (msg) { michael@0: let markupDocumentViewer = michael@0: docShell.contentViewer.QueryInterface(Ci.nsIMarkupDocumentViewer); michael@0: markupDocumentViewer.authorStyleDisabled = msg.data; michael@0: sendSyncMessage("ss-test:setAuthorStyleDisabled"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:setUsePrivateBrowsing", function (msg) { michael@0: let loadContext = michael@0: docShell.QueryInterface(Ci.nsILoadContext); michael@0: loadContext.usePrivateBrowsing = msg.data; michael@0: sendAsyncMessage("ss-test:setUsePrivateBrowsing"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:getScrollPosition", function (msg) { michael@0: let frame = content; michael@0: if (msg.data.hasOwnProperty("frame")) { michael@0: frame = content.frames[msg.data.frame]; michael@0: } michael@0: let {scrollX: x, scrollY: y} = frame; michael@0: sendAsyncMessage("ss-test:getScrollPosition", {x: x, y: y}); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:setScrollPosition", function (msg) { michael@0: let frame = content; michael@0: let {x, y} = msg.data; michael@0: if (msg.data.hasOwnProperty("frame")) { michael@0: frame = content.frames[msg.data.frame]; michael@0: } michael@0: frame.scrollTo(x, y); michael@0: michael@0: frame.addEventListener("scroll", function onScroll(event) { michael@0: if (frame.document == event.target) { michael@0: frame.removeEventListener("scroll", onScroll); michael@0: sendAsyncMessage("ss-test:setScrollPosition"); michael@0: } michael@0: }); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:createDynamicFrames", function ({data}) { michael@0: function createIFrame(rows) { michael@0: let frames = content.document.getElementById(data.id); michael@0: frames.setAttribute("rows", rows); michael@0: michael@0: let frame = content.document.createElement("frame"); michael@0: frame.setAttribute("src", data.url); michael@0: frames.appendChild(frame); michael@0: } michael@0: michael@0: addEventListener("DOMContentLoaded", function onContentLoaded(event) { michael@0: if (content.document == event.target) { michael@0: removeEventListener("DOMContentLoaded", onContentLoaded, true); michael@0: // DOMContentLoaded is fired right after we finished parsing the document. michael@0: createIFrame("33%, 33%, 33%"); michael@0: } michael@0: }, true); michael@0: michael@0: addEventListener("load", function onLoad(event) { michael@0: if (content.document == event.target) { michael@0: removeEventListener("load", onLoad, true); michael@0: michael@0: // Creating this frame on the same tick as the load event michael@0: // means that it must not be included in the frame tree. michael@0: createIFrame("25%, 25%, 25%, 25%"); michael@0: } michael@0: }, true); michael@0: michael@0: sendAsyncMessage("ss-test:createDynamicFrames"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:removeLastFrame", function ({data}) { michael@0: let frames = content.document.getElementById(data.id); michael@0: frames.lastElementChild.remove(); michael@0: sendAsyncMessage("ss-test:removeLastFrame"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:mapFrameTree", function (msg) { michael@0: let result = gFrameTree.map(frame => ({href: frame.location.href})); michael@0: sendAsyncMessage("ss-test:mapFrameTree", result); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:click", function ({data}) { michael@0: content.document.getElementById(data.id).click(); michael@0: sendAsyncMessage("ss-test:click"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:historyPushState", function ({data}) { michael@0: content.window.history. michael@0: pushState(data.stateObj || {}, data.title || "", data.url); michael@0: michael@0: sendAsyncMessage("ss-test:historyPushState"); michael@0: }); michael@0: michael@0: addMessageListener("ss-test:historyReplaceState", function ({data}) { michael@0: content.window.history. michael@0: replaceState(data.stateObj || {}, data.title || "", data.url); michael@0: michael@0: sendAsyncMessage("ss-test:historyReplaceState"); michael@0: });