|
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 } |