зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1032482 - Only render redundant connections between nodes once in the web audio editor. r=vp
This commit is contained in:
Родитель
953010ad99
Коммит
024bb2d308
|
@ -5,6 +5,8 @@
|
||||||
* Tests that SVG nodes and edges were created for the Graph View.
|
* Tests that SVG nodes and edges were created for the Graph View.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
let connectCount = 0;
|
||||||
|
|
||||||
function spawnTest() {
|
function spawnTest() {
|
||||||
let [target, debuggee, panel] = yield initWebAudioEditor(SIMPLE_CONTEXT_URL);
|
let [target, debuggee, panel] = yield initWebAudioEditor(SIMPLE_CONTEXT_URL);
|
||||||
let { panelWin } = panel;
|
let { panelWin } = panel;
|
||||||
|
@ -14,6 +16,8 @@ function spawnTest() {
|
||||||
|
|
||||||
reload(target);
|
reload(target);
|
||||||
|
|
||||||
|
panelWin.on(EVENTS.CONNECT_NODE, onConnectNode);
|
||||||
|
|
||||||
let [actors] = yield Promise.all([
|
let [actors] = yield Promise.all([
|
||||||
get3(gFront, "create-node"),
|
get3(gFront, "create-node"),
|
||||||
waitForGraphRendered(panelWin, 3, 2)
|
waitForGraphRendered(panelWin, 3, 2)
|
||||||
|
@ -27,7 +31,16 @@ function spawnTest() {
|
||||||
is(findGraphEdge(panelWin, oscId, gainId).toString(), "[object SVGGElement]", "found edge for osc -> gain");
|
is(findGraphEdge(panelWin, oscId, gainId).toString(), "[object SVGGElement]", "found edge for osc -> gain");
|
||||||
is(findGraphEdge(panelWin, gainId, destId).toString(), "[object SVGGElement]", "found edge for gain -> dest");
|
is(findGraphEdge(panelWin, gainId, destId).toString(), "[object SVGGElement]", "found edge for gain -> dest");
|
||||||
|
|
||||||
|
yield wait(1000);
|
||||||
|
|
||||||
|
is(connectCount, 2, "Only two node connect events should be fired.");
|
||||||
|
|
||||||
|
panelWin.off(EVENTS.CONNECT_NODE, onConnectNode);
|
||||||
|
|
||||||
yield teardown(panel);
|
yield teardown(panel);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onConnectNode () {
|
||||||
|
++connectCount;
|
||||||
|
}
|
||||||
|
|
|
@ -17,8 +17,15 @@
|
||||||
let osc = ctx.createOscillator();
|
let osc = ctx.createOscillator();
|
||||||
let gain = ctx.createGain();
|
let gain = ctx.createGain();
|
||||||
gain.gain.value = 0;
|
gain.gain.value = 0;
|
||||||
|
|
||||||
|
// Connect multiple times to test that it's disregarded.
|
||||||
osc.connect(gain);
|
osc.connect(gain);
|
||||||
gain.connect(ctx.destination);
|
gain.connect(ctx.destination);
|
||||||
|
gain.connect(ctx.destination);
|
||||||
|
gain.connect(ctx.destination);
|
||||||
|
gain.connect(ctx.destination);
|
||||||
|
gain.connect(ctx.destination);
|
||||||
|
gain.connect(ctx.destination);
|
||||||
osc.start(0);
|
osc.start(0);
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -94,19 +94,24 @@ AudioNodeView.prototype.getType = Task.async(function* () {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Helper method to create connections in the AudioNodeConnections
|
// Helper method to create connections in the AudioNodeConnections
|
||||||
// WeakMap for rendering
|
// WeakMap for rendering. Returns a boolean indicating
|
||||||
|
// if the connection was successfully created. Will return `false`
|
||||||
|
// when the connection was previously made.
|
||||||
AudioNodeView.prototype.connect = function (destination) {
|
AudioNodeView.prototype.connect = function (destination) {
|
||||||
let connections = AudioNodeConnections.get(this);
|
let connections = AudioNodeConnections.get(this) || new Set();
|
||||||
if (!connections) {
|
AudioNodeConnections.set(this, connections);
|
||||||
connections = [];
|
|
||||||
AudioNodeConnections.set(this, connections);
|
// Don't duplicate add.
|
||||||
|
if (!connections.has(destination)) {
|
||||||
|
connections.add(destination);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
connections.push(destination);
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper method to remove audio connections from the current AudioNodeView
|
// Helper method to remove audio connections from the current AudioNodeView
|
||||||
AudioNodeView.prototype.disconnect = function () {
|
AudioNodeView.prototype.disconnect = function () {
|
||||||
AudioNodeConnections.set(this, []);
|
AudioNodeConnections.set(this, new Set());
|
||||||
};
|
};
|
||||||
|
|
||||||
// Returns a promise that resolves to an array of objects containing
|
// Returns a promise that resolves to an array of objects containing
|
||||||
|
@ -293,8 +298,10 @@ let WebAudioEditorController = {
|
||||||
// adding an edge.
|
// adding an edge.
|
||||||
let [source, dest] = yield waitForNodeCreation(sourceActor, destActor);
|
let [source, dest] = yield waitForNodeCreation(sourceActor, destActor);
|
||||||
|
|
||||||
source.connect(dest);
|
// Connect nodes, and only emit if it's a new connection.
|
||||||
window.emit(EVENTS.CONNECT_NODE, source.id, dest.id);
|
if (source.connect(dest)) {
|
||||||
|
window.emit(EVENTS.CONNECT_NODE, source.id, dest.id);
|
||||||
|
}
|
||||||
|
|
||||||
function waitForNodeCreation (sourceActor, destActor) {
|
function waitForNodeCreation (sourceActor, destActor) {
|
||||||
let deferred = defer();
|
let deferred = defer();
|
||||||
|
|
|
@ -161,7 +161,7 @@ let WebAudioGraphView = {
|
||||||
// Add all of the connections from this node to the edge array to be added
|
// Add all of the connections from this node to the edge array to be added
|
||||||
// after all the nodes are added, otherwise edges will attempted to be created
|
// after all the nodes are added, otherwise edges will attempted to be created
|
||||||
// for nodes that have not yet been added
|
// for nodes that have not yet been added
|
||||||
AudioNodeConnections.get(node, []).forEach(dest => edges.push([node, dest]));
|
AudioNodeConnections.get(node, new Set()).forEach(dest => edges.push([node, dest]));
|
||||||
});
|
});
|
||||||
|
|
||||||
edges.forEach(([node, dest]) => graph.addEdge(null, node.id, dest.id, {
|
edges.forEach(([node, dest]) => graph.addEdge(null, node.id, dest.id, {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче