michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: "use strict"; michael@0: michael@0: const {Services} = Cu.import("resource://gre/modules/Services.jsm"); michael@0: michael@0: const MANIFEST_EDITOR_ENABLED = "devtools.appmanager.manifestEditor.enabled"; michael@0: michael@0: let gManifestWindow, gManifestEditor; michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: michael@0: Task.spawn(function() { michael@0: Services.prefs.setBoolPref(MANIFEST_EDITOR_ENABLED, true); michael@0: let tab = yield openAppManager(); michael@0: yield selectProjectsPanel(); michael@0: yield addSamplePackagedApp(); michael@0: yield showSampleProjectDetails(); michael@0: michael@0: gManifestWindow = getManifestWindow(); michael@0: gManifestEditor = getProjectsWindow().UI.manifestEditor; michael@0: yield changeManifestValue("name", "the best app"); michael@0: yield changeManifestValueBad("name", "the worst app"); michael@0: yield addNewManifestProperty("developer", "foo", "bar"); michael@0: yield addNewManifestPropertyBad("developer", "blob", "bob"); michael@0: yield removeManifestProperty("developer", "foo"); michael@0: gManifestWindow = null; michael@0: gManifestEditor = null; michael@0: michael@0: yield removeSamplePackagedApp(); michael@0: yield removeTab(tab); michael@0: Services.prefs.setBoolPref(MANIFEST_EDITOR_ENABLED, false); michael@0: finish(); michael@0: }); michael@0: } michael@0: michael@0: // Wait until the animation from commitHierarchy has completed michael@0: function waitForUpdate() { michael@0: return waitForTime(gManifestEditor.editor.lazyEmptyDelay + 1); michael@0: } michael@0: michael@0: function changeManifestValue(key, value) { michael@0: return Task.spawn(function() { michael@0: let propElem = gManifestWindow.document michael@0: .querySelector("[id ^= '" + key + "']"); michael@0: is(propElem.querySelector(".name").value, key, michael@0: "Key doesn't match expected value"); michael@0: michael@0: let valueElem = propElem.querySelector(".value"); michael@0: EventUtils.sendMouseEvent({ type: "mousedown" }, valueElem, gManifestWindow); michael@0: michael@0: let valueInput = propElem.querySelector(".element-value-input"); michael@0: valueInput.value = '"' + value + '"'; michael@0: EventUtils.sendKey("RETURN", gManifestWindow); michael@0: michael@0: yield waitForUpdate(); michael@0: // Elements have all been replaced, re-select them michael@0: propElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); michael@0: valueElem = propElem.querySelector(".value"); michael@0: is(valueElem.value, '"' + value + '"', michael@0: "Value doesn't match expected value"); michael@0: michael@0: is(gManifestEditor.manifest[key], value, michael@0: "Manifest doesn't contain expected value"); michael@0: }); michael@0: } michael@0: michael@0: function changeManifestValueBad(key, value) { michael@0: return Task.spawn(function() { michael@0: let propElem = gManifestWindow.document michael@0: .querySelector("[id ^= '" + key + "']"); michael@0: is(propElem.querySelector(".name").value, key, michael@0: "Key doesn't match expected value"); michael@0: michael@0: let valueElem = propElem.querySelector(".value"); michael@0: EventUtils.sendMouseEvent({ type: "mousedown" }, valueElem, gManifestWindow); michael@0: michael@0: let valueInput = propElem.querySelector(".element-value-input"); michael@0: // Leaving out quotes will result in an error, so no change should be made. michael@0: valueInput.value = value; michael@0: EventUtils.sendKey("RETURN", gManifestWindow); michael@0: michael@0: yield waitForUpdate(); michael@0: // Elements have all been replaced, re-select them michael@0: propElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); michael@0: valueElem = propElem.querySelector(".value"); michael@0: isnot(valueElem.value, '"' + value + '"', michael@0: "Value was changed, but it should not have been"); michael@0: michael@0: isnot(gManifestEditor.manifest[key], value, michael@0: "Manifest was changed, but it should not have been"); michael@0: }); michael@0: } michael@0: michael@0: function addNewManifestProperty(parent, key, value) { michael@0: return Task.spawn(function() { michael@0: let parentElem = gManifestWindow.document michael@0: .querySelector("[id ^= '" + parent + "']"); michael@0: ok(parentElem, michael@0: "Found parent element"); michael@0: let addPropertyElem = parentElem michael@0: .querySelector(".variables-view-add-property"); michael@0: ok(addPropertyElem, michael@0: "Found add-property button"); michael@0: michael@0: EventUtils.sendMouseEvent({ type: "mousedown" }, addPropertyElem, gManifestWindow); michael@0: michael@0: let nameInput = parentElem.querySelector(".element-name-input"); michael@0: nameInput.value = key; michael@0: EventUtils.sendKey("TAB", gManifestWindow); michael@0: michael@0: let valueInput = parentElem.querySelector(".element-value-input"); michael@0: valueInput.value = '"' + value + '"'; michael@0: EventUtils.sendKey("RETURN", gManifestWindow); michael@0: michael@0: yield waitForUpdate(); michael@0: michael@0: let newElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); michael@0: let nameElem = newElem.querySelector(".name"); michael@0: is(nameElem.value, key, michael@0: "Key doesn't match expected Key"); michael@0: michael@0: ok(key in gManifestEditor.manifest[parent], michael@0: "Manifest doesn't contain expected key"); michael@0: michael@0: let valueElem = newElem.querySelector(".value"); michael@0: is(valueElem.value, '"' + value + '"', michael@0: "Value doesn't match expected value"); michael@0: michael@0: is(gManifestEditor.manifest[parent][key], value, michael@0: "Manifest doesn't contain expected value"); michael@0: }); michael@0: } michael@0: michael@0: function addNewManifestPropertyBad(parent, key, value) { michael@0: return Task.spawn(function() { michael@0: let parentElem = gManifestWindow.document michael@0: .querySelector("[id ^= '" + parent + "']"); michael@0: ok(parentElem, michael@0: "Found parent element"); michael@0: let addPropertyElem = parentElem michael@0: .querySelector(".variables-view-add-property"); michael@0: ok(addPropertyElem, michael@0: "Found add-property button"); michael@0: michael@0: EventUtils.sendMouseEvent({ type: "mousedown" }, addPropertyElem, gManifestWindow); michael@0: michael@0: let nameInput = parentElem.querySelector(".element-name-input"); michael@0: nameInput.value = key; michael@0: EventUtils.sendKey("TAB", gManifestWindow); michael@0: michael@0: let valueInput = parentElem.querySelector(".element-value-input"); michael@0: // Leaving out quotes will result in an error, so no change should be made. michael@0: valueInput.value = value; michael@0: EventUtils.sendKey("RETURN", gManifestWindow); michael@0: michael@0: yield waitForUpdate(); michael@0: michael@0: let newElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); michael@0: ok(!newElem, "Key was added, but it should not have been"); michael@0: ok(!(key in gManifestEditor.manifest[parent]), michael@0: "Manifest contains key, but it should not"); michael@0: }); michael@0: } michael@0: michael@0: function removeManifestProperty(parent, key) { michael@0: info("*** Remove property test ***"); michael@0: michael@0: return Task.spawn(function() { michael@0: let parentElem = gManifestWindow.document michael@0: .querySelector("[id ^= '" + parent + "']"); michael@0: ok(parentElem, "Found parent element"); michael@0: michael@0: let keyExists = key in gManifestEditor.manifest[parent]; michael@0: ok(keyExists, michael@0: "The manifest contains the key under the expected parent"); michael@0: michael@0: let newElem = gManifestWindow.document.querySelector("[id ^= '" + key + "']"); michael@0: let removePropertyButton = newElem.querySelector(".variables-view-delete"); michael@0: ok(removePropertyButton, "The remove property button was found"); michael@0: removePropertyButton.click(); michael@0: michael@0: yield waitForUpdate(); michael@0: michael@0: ok(!(key in gManifestEditor.manifest[parent]), "Property was successfully removed"); michael@0: }); michael@0: }