| |
1 /* Any copyright is dedicated to the Public Domain. |
| |
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
| |
3 "use strict"; |
| |
4 |
| |
5 const {Services} = Cu.import("resource://gre/modules/Services.jsm"); |
| |
6 |
| |
7 const MANIFEST_EDITOR_ENABLED = "devtools.appmanager.manifestEditor.enabled"; |
| |
8 |
| |
9 let gManifestWindow, gManifestEditor; |
| |
10 |
| |
11 function test() { |
| |
12 waitForExplicitFinish(); |
| |
13 |
| |
14 Task.spawn(function() { |
| |
15 Services.prefs.setBoolPref(MANIFEST_EDITOR_ENABLED, true); |
| |
16 let tab = yield openAppManager(); |
| |
17 yield selectProjectsPanel(); |
| |
18 yield addSamplePackagedApp(); |
| |
19 yield showSampleProjectDetails(); |
| |
20 |
| |
21 gManifestWindow = getManifestWindow(); |
| |
22 gManifestEditor = getProjectsWindow().UI.manifestEditor; |
| |
23 yield changeManifestValue("name", "the best app"); |
| |
24 yield changeManifestValueBad("name", "the worst app"); |
| |
25 yield addNewManifestProperty("developer", "foo", "bar"); |
| |
26 yield addNewManifestPropertyBad("developer", "blob", "bob"); |
| |
27 yield removeManifestProperty("developer", "foo"); |
| |
28 gManifestWindow = null; |
| |
29 gManifestEditor = null; |
| |
30 |
| |
31 yield removeSamplePackagedApp(); |
| |
32 yield removeTab(tab); |
| |
33 Services.prefs.setBoolPref(MANIFEST_EDITOR_ENABLED, false); |
| |
34 finish(); |
| |
35 }); |
| |
36 } |
| |
37 |
| |
38 // Wait until the animation from commitHierarchy has completed |
| |
39 function waitForUpdate() { |
| |
40 return waitForTime(gManifestEditor.editor.lazyEmptyDelay + 1); |
| |
41 } |
| |
42 |
| |
43 function changeManifestValue(key, value) { |
| |
44 return Task.spawn(function() { |
| |
45 let propElem = gManifestWindow.document |
| |
46 .querySelector("[id ^= '" + key + "']"); |
| |
47 is(propElem.querySelector(".name").value, key, |
| |
48 "Key doesn't match expected value"); |
| |
49 |
| |
50 let valueElem = propElem.querySelector(".value"); |
| |
51 EventUtils.sendMouseEvent({ type: "mousedown" }, valueElem, gManifestWindow); |
| |
52 |
| |
53 let valueInput = propElem.querySelector(".element-value-input"); |
| |
54 valueInput.value = '"' + value + '"'; |
| |
55 EventUtils.sendKey("RETURN", gManifestWindow); |
| |
56 |
| |
57 yield waitForUpdate(); |
| |
58 // Elements have all been replaced, re-select them |
| |
59 propElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); |
| |
60 valueElem = propElem.querySelector(".value"); |
| |
61 is(valueElem.value, '"' + value + '"', |
| |
62 "Value doesn't match expected value"); |
| |
63 |
| |
64 is(gManifestEditor.manifest[key], value, |
| |
65 "Manifest doesn't contain expected value"); |
| |
66 }); |
| |
67 } |
| |
68 |
| |
69 function changeManifestValueBad(key, value) { |
| |
70 return Task.spawn(function() { |
| |
71 let propElem = gManifestWindow.document |
| |
72 .querySelector("[id ^= '" + key + "']"); |
| |
73 is(propElem.querySelector(".name").value, key, |
| |
74 "Key doesn't match expected value"); |
| |
75 |
| |
76 let valueElem = propElem.querySelector(".value"); |
| |
77 EventUtils.sendMouseEvent({ type: "mousedown" }, valueElem, gManifestWindow); |
| |
78 |
| |
79 let valueInput = propElem.querySelector(".element-value-input"); |
| |
80 // Leaving out quotes will result in an error, so no change should be made. |
| |
81 valueInput.value = value; |
| |
82 EventUtils.sendKey("RETURN", gManifestWindow); |
| |
83 |
| |
84 yield waitForUpdate(); |
| |
85 // Elements have all been replaced, re-select them |
| |
86 propElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); |
| |
87 valueElem = propElem.querySelector(".value"); |
| |
88 isnot(valueElem.value, '"' + value + '"', |
| |
89 "Value was changed, but it should not have been"); |
| |
90 |
| |
91 isnot(gManifestEditor.manifest[key], value, |
| |
92 "Manifest was changed, but it should not have been"); |
| |
93 }); |
| |
94 } |
| |
95 |
| |
96 function addNewManifestProperty(parent, key, value) { |
| |
97 return Task.spawn(function() { |
| |
98 let parentElem = gManifestWindow.document |
| |
99 .querySelector("[id ^= '" + parent + "']"); |
| |
100 ok(parentElem, |
| |
101 "Found parent element"); |
| |
102 let addPropertyElem = parentElem |
| |
103 .querySelector(".variables-view-add-property"); |
| |
104 ok(addPropertyElem, |
| |
105 "Found add-property button"); |
| |
106 |
| |
107 EventUtils.sendMouseEvent({ type: "mousedown" }, addPropertyElem, gManifestWindow); |
| |
108 |
| |
109 let nameInput = parentElem.querySelector(".element-name-input"); |
| |
110 nameInput.value = key; |
| |
111 EventUtils.sendKey("TAB", gManifestWindow); |
| |
112 |
| |
113 let valueInput = parentElem.querySelector(".element-value-input"); |
| |
114 valueInput.value = '"' + value + '"'; |
| |
115 EventUtils.sendKey("RETURN", gManifestWindow); |
| |
116 |
| |
117 yield waitForUpdate(); |
| |
118 |
| |
119 let newElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); |
| |
120 let nameElem = newElem.querySelector(".name"); |
| |
121 is(nameElem.value, key, |
| |
122 "Key doesn't match expected Key"); |
| |
123 |
| |
124 ok(key in gManifestEditor.manifest[parent], |
| |
125 "Manifest doesn't contain expected key"); |
| |
126 |
| |
127 let valueElem = newElem.querySelector(".value"); |
| |
128 is(valueElem.value, '"' + value + '"', |
| |
129 "Value doesn't match expected value"); |
| |
130 |
| |
131 is(gManifestEditor.manifest[parent][key], value, |
| |
132 "Manifest doesn't contain expected value"); |
| |
133 }); |
| |
134 } |
| |
135 |
| |
136 function addNewManifestPropertyBad(parent, key, value) { |
| |
137 return Task.spawn(function() { |
| |
138 let parentElem = gManifestWindow.document |
| |
139 .querySelector("[id ^= '" + parent + "']"); |
| |
140 ok(parentElem, |
| |
141 "Found parent element"); |
| |
142 let addPropertyElem = parentElem |
| |
143 .querySelector(".variables-view-add-property"); |
| |
144 ok(addPropertyElem, |
| |
145 "Found add-property button"); |
| |
146 |
| |
147 EventUtils.sendMouseEvent({ type: "mousedown" }, addPropertyElem, gManifestWindow); |
| |
148 |
| |
149 let nameInput = parentElem.querySelector(".element-name-input"); |
| |
150 nameInput.value = key; |
| |
151 EventUtils.sendKey("TAB", gManifestWindow); |
| |
152 |
| |
153 let valueInput = parentElem.querySelector(".element-value-input"); |
| |
154 // Leaving out quotes will result in an error, so no change should be made. |
| |
155 valueInput.value = value; |
| |
156 EventUtils.sendKey("RETURN", gManifestWindow); |
| |
157 |
| |
158 yield waitForUpdate(); |
| |
159 |
| |
160 let newElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); |
| |
161 ok(!newElem, "Key was added, but it should not have been"); |
| |
162 ok(!(key in gManifestEditor.manifest[parent]), |
| |
163 "Manifest contains key, but it should not"); |
| |
164 }); |
| |
165 } |
| |
166 |
| |
167 function removeManifestProperty(parent, key) { |
| |
168 info("*** Remove property test ***"); |
| |
169 |
| |
170 return Task.spawn(function() { |
| |
171 let parentElem = gManifestWindow.document |
| |
172 .querySelector("[id ^= '" + parent + "']"); |
| |
173 ok(parentElem, "Found parent element"); |
| |
174 |
| |
175 let keyExists = key in gManifestEditor.manifest[parent]; |
| |
176 ok(keyExists, |
| |
177 "The manifest contains the key under the expected parent"); |
| |
178 |
| |
179 let newElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); |
| |
180 let removePropertyButton = newElem.querySelector(".variables-view-delete"); |
| |
181 ok(removePropertyButton, "The remove property button was found"); |
| |
182 removePropertyButton.click(); |
| |
183 |
| |
184 yield waitForUpdate(); |
| |
185 |
| |
186 ok(!(key in gManifestEditor.manifest[parent]), "Property was successfully removed"); |
| |
187 }); |
| |
188 } |