|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 let Cu = Components.utils; |
|
8 let Ci = Components.interfaces; |
|
9 |
|
10 Cu.import("resource:///modules/sessionstore/FrameTree.jsm", this); |
|
11 let gFrameTree = new FrameTree(this); |
|
12 |
|
13 gFrameTree.addObserver({ |
|
14 onFrameTreeReset: function () { |
|
15 sendAsyncMessage("ss-test:onFrameTreeReset"); |
|
16 }, |
|
17 |
|
18 onFrameTreeCollected: function () { |
|
19 sendAsyncMessage("ss-test:onFrameTreeCollected"); |
|
20 } |
|
21 }); |
|
22 |
|
23 /** |
|
24 * This frame script is only loaded for sessionstore mochitests. It enables us |
|
25 * to modify and query docShell data when running with multiple processes. |
|
26 */ |
|
27 |
|
28 addEventListener("hashchange", function () { |
|
29 sendAsyncMessage("ss-test:hashchange"); |
|
30 }); |
|
31 |
|
32 addEventListener("MozStorageChanged", function () { |
|
33 sendSyncMessage("ss-test:MozStorageChanged"); |
|
34 }); |
|
35 |
|
36 addMessageListener("ss-test:modifySessionStorage", function (msg) { |
|
37 for (let key of Object.keys(msg.data)) { |
|
38 content.sessionStorage[key] = msg.data[key]; |
|
39 } |
|
40 }); |
|
41 |
|
42 addMessageListener("ss-test:modifySessionStorage2", function (msg) { |
|
43 for (let key of Object.keys(msg.data)) { |
|
44 content.frames[0].sessionStorage[key] = msg.data[key]; |
|
45 } |
|
46 }); |
|
47 |
|
48 addMessageListener("ss-test:purgeDomainData", function ({data: domain}) { |
|
49 Services.obs.notifyObservers(null, "browser:purge-domain-data", domain); |
|
50 content.setTimeout(() => sendAsyncMessage("ss-test:purgeDomainData")); |
|
51 }); |
|
52 |
|
53 addMessageListener("ss-test:purgeSessionHistory", function () { |
|
54 Services.obs.notifyObservers(null, "browser:purge-session-history", ""); |
|
55 content.setTimeout(() => sendAsyncMessage("ss-test:purgeSessionHistory")); |
|
56 }); |
|
57 |
|
58 addMessageListener("ss-test:getStyleSheets", function (msg) { |
|
59 let sheets = content.document.styleSheets; |
|
60 let titles = Array.map(sheets, ss => [ss.title, ss.disabled]); |
|
61 sendSyncMessage("ss-test:getStyleSheets", titles); |
|
62 }); |
|
63 |
|
64 addMessageListener("ss-test:enableStyleSheetsForSet", function (msg) { |
|
65 content.document.enableStyleSheetsForSet(msg.data); |
|
66 sendAsyncMessage("ss-test:enableStyleSheetsForSet"); |
|
67 }); |
|
68 |
|
69 addMessageListener("ss-test:enableSubDocumentStyleSheetsForSet", function (msg) { |
|
70 let iframe = content.document.getElementById(msg.data.id); |
|
71 iframe.contentDocument.enableStyleSheetsForSet(msg.data.set); |
|
72 sendAsyncMessage("ss-test:enableSubDocumentStyleSheetsForSet"); |
|
73 }); |
|
74 |
|
75 addMessageListener("ss-test:getAuthorStyleDisabled", function (msg) { |
|
76 let {authorStyleDisabled} = |
|
77 docShell.contentViewer.QueryInterface(Ci.nsIMarkupDocumentViewer); |
|
78 sendSyncMessage("ss-test:getAuthorStyleDisabled", authorStyleDisabled); |
|
79 }); |
|
80 |
|
81 addMessageListener("ss-test:setAuthorStyleDisabled", function (msg) { |
|
82 let markupDocumentViewer = |
|
83 docShell.contentViewer.QueryInterface(Ci.nsIMarkupDocumentViewer); |
|
84 markupDocumentViewer.authorStyleDisabled = msg.data; |
|
85 sendSyncMessage("ss-test:setAuthorStyleDisabled"); |
|
86 }); |
|
87 |
|
88 addMessageListener("ss-test:setUsePrivateBrowsing", function (msg) { |
|
89 let loadContext = |
|
90 docShell.QueryInterface(Ci.nsILoadContext); |
|
91 loadContext.usePrivateBrowsing = msg.data; |
|
92 sendAsyncMessage("ss-test:setUsePrivateBrowsing"); |
|
93 }); |
|
94 |
|
95 addMessageListener("ss-test:getScrollPosition", function (msg) { |
|
96 let frame = content; |
|
97 if (msg.data.hasOwnProperty("frame")) { |
|
98 frame = content.frames[msg.data.frame]; |
|
99 } |
|
100 let {scrollX: x, scrollY: y} = frame; |
|
101 sendAsyncMessage("ss-test:getScrollPosition", {x: x, y: y}); |
|
102 }); |
|
103 |
|
104 addMessageListener("ss-test:setScrollPosition", function (msg) { |
|
105 let frame = content; |
|
106 let {x, y} = msg.data; |
|
107 if (msg.data.hasOwnProperty("frame")) { |
|
108 frame = content.frames[msg.data.frame]; |
|
109 } |
|
110 frame.scrollTo(x, y); |
|
111 |
|
112 frame.addEventListener("scroll", function onScroll(event) { |
|
113 if (frame.document == event.target) { |
|
114 frame.removeEventListener("scroll", onScroll); |
|
115 sendAsyncMessage("ss-test:setScrollPosition"); |
|
116 } |
|
117 }); |
|
118 }); |
|
119 |
|
120 addMessageListener("ss-test:createDynamicFrames", function ({data}) { |
|
121 function createIFrame(rows) { |
|
122 let frames = content.document.getElementById(data.id); |
|
123 frames.setAttribute("rows", rows); |
|
124 |
|
125 let frame = content.document.createElement("frame"); |
|
126 frame.setAttribute("src", data.url); |
|
127 frames.appendChild(frame); |
|
128 } |
|
129 |
|
130 addEventListener("DOMContentLoaded", function onContentLoaded(event) { |
|
131 if (content.document == event.target) { |
|
132 removeEventListener("DOMContentLoaded", onContentLoaded, true); |
|
133 // DOMContentLoaded is fired right after we finished parsing the document. |
|
134 createIFrame("33%, 33%, 33%"); |
|
135 } |
|
136 }, true); |
|
137 |
|
138 addEventListener("load", function onLoad(event) { |
|
139 if (content.document == event.target) { |
|
140 removeEventListener("load", onLoad, true); |
|
141 |
|
142 // Creating this frame on the same tick as the load event |
|
143 // means that it must not be included in the frame tree. |
|
144 createIFrame("25%, 25%, 25%, 25%"); |
|
145 } |
|
146 }, true); |
|
147 |
|
148 sendAsyncMessage("ss-test:createDynamicFrames"); |
|
149 }); |
|
150 |
|
151 addMessageListener("ss-test:removeLastFrame", function ({data}) { |
|
152 let frames = content.document.getElementById(data.id); |
|
153 frames.lastElementChild.remove(); |
|
154 sendAsyncMessage("ss-test:removeLastFrame"); |
|
155 }); |
|
156 |
|
157 addMessageListener("ss-test:mapFrameTree", function (msg) { |
|
158 let result = gFrameTree.map(frame => ({href: frame.location.href})); |
|
159 sendAsyncMessage("ss-test:mapFrameTree", result); |
|
160 }); |
|
161 |
|
162 addMessageListener("ss-test:click", function ({data}) { |
|
163 content.document.getElementById(data.id).click(); |
|
164 sendAsyncMessage("ss-test:click"); |
|
165 }); |
|
166 |
|
167 addMessageListener("ss-test:historyPushState", function ({data}) { |
|
168 content.window.history. |
|
169 pushState(data.stateObj || {}, data.title || "", data.url); |
|
170 |
|
171 sendAsyncMessage("ss-test:historyPushState"); |
|
172 }); |
|
173 |
|
174 addMessageListener("ss-test:historyReplaceState", function ({data}) { |
|
175 content.window.history. |
|
176 replaceState(data.stateObj || {}, data.title || "", data.url); |
|
177 |
|
178 sendAsyncMessage("ss-test:historyReplaceState"); |
|
179 }); |