michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Tests if the function searching works properly. michael@0: */ michael@0: michael@0: const TAB_URL = EXAMPLE_URL + "doc_function-search.html"; michael@0: michael@0: let gTab, gDebuggee, gPanel, gDebugger; michael@0: let gEditor, gSources, gSearchBox, gFilteredFunctions; michael@0: michael@0: function test() { michael@0: initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => { michael@0: gTab = aTab; michael@0: gDebuggee = aDebuggee; michael@0: gPanel = aPanel; michael@0: gDebugger = gPanel.panelWin; michael@0: gEditor = gDebugger.DebuggerView.editor; michael@0: gSources = gDebugger.DebuggerView.Sources; michael@0: gSearchBox = gDebugger.DebuggerView.Filtering._searchbox; michael@0: gFilteredFunctions = gDebugger.DebuggerView.FilteredFunctions; michael@0: michael@0: waitForSourceShown(gPanel, "-01.js") michael@0: .then(() => showSource("doc_function-search.html")) michael@0: .then(htmlSearch) michael@0: .then(() => showSource("code_function-search-01.js")) michael@0: .then(firstJsSearch) michael@0: .then(() => showSource("code_function-search-02.js")) michael@0: .then(secondJsSearch) michael@0: .then(() => showSource("code_function-search-03.js")) michael@0: .then(thirdJsSearch) michael@0: .then(saveSearch) michael@0: .then(filterSearch) michael@0: .then(bogusSearch) michael@0: .then(incrementalSearch) michael@0: .then(emptySearch) michael@0: .then(() => closeDebuggerAndFinish(gPanel)) michael@0: .then(null, aError => { michael@0: ok(false, "Got an error: " + aError.message + "\n" + aError.stack); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function htmlSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popupshown").then(() => { michael@0: writeInfo(); michael@0: michael@0: is(gFilteredFunctions.selectedIndex, 0, michael@0: "An item should be selected in the filtered functions view (1)."); michael@0: ok(gFilteredFunctions.selectedItem, michael@0: "An item should be selected in the filtered functions view (2)."); michael@0: michael@0: if (gSources.selectedValue.indexOf(".html") != -1) { michael@0: let expectedResults = [ michael@0: ["inline", ".html", "", 19, 16], michael@0: ["arrow", ".html", "", 20, 11], michael@0: ["foo", ".html", "", 22, 11], michael@0: ["foo2", ".html", "", 23, 11], michael@0: ["bar2", ".html", "", 23, 18] michael@0: ]; michael@0: michael@0: for (let [label, value, description, line, column] of expectedResults) { michael@0: let target = gFilteredFunctions.selectedItem.target; michael@0: michael@0: if (label) { michael@0: is(target.querySelector(".results-panel-item-label").getAttribute("value"), michael@0: gDebugger.SourceUtils.trimUrlLength(label + "()"), michael@0: "The corect label (" + label + ") is currently selected."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (value) { michael@0: ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value), michael@0: "The corect value (" + value + ") is attached."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-below"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (description) { michael@0: is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description, michael@0: "The corect description (" + description + ") is currently shown."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-before"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, line, column), michael@0: "The editor didn't jump to the correct line."); michael@0: michael@0: EventUtils.sendKey("DOWN", gDebugger); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, expectedResults[0][3], expectedResults[0][4]), michael@0: "The editor didn't jump to the correct line again."); michael@0: michael@0: deferred.resolve(); michael@0: } else { michael@0: ok(false, "How did you get here? Go away, you."); michael@0: } michael@0: }); michael@0: michael@0: setText(gSearchBox, "@"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function firstJsSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popupshown").then(() => { michael@0: writeInfo(); michael@0: michael@0: is(gFilteredFunctions.selectedIndex, 0, michael@0: "An item should be selected in the filtered functions view (1)."); michael@0: ok(gFilteredFunctions.selectedItem, michael@0: "An item should be selected in the filtered functions view (2)."); michael@0: michael@0: if (gSources.selectedValue.indexOf("-01.js") != -1) { michael@0: let s = " " + gDebugger.L10N.getStr("functionSearchSeparatorLabel") + " "; michael@0: let expectedResults = [ michael@0: ["test", "-01.js", "", 4, 10], michael@0: ["anonymousExpression", "-01.js", "test.prototype", 9, 3], michael@0: ["namedExpression" + s + "NAME", "-01.js", "test.prototype", 11, 3], michael@0: ["a_test", "-01.js", "foo", 22, 3], michael@0: ["n_test" + s + "x", "-01.js", "foo", 24, 3], michael@0: ["a_test", "-01.js", "foo.sub", 27, 5], michael@0: ["n_test" + s + "y", "-01.js", "foo.sub", 29, 5], michael@0: ["a_test", "-01.js", "foo.sub.sub", 32, 7], michael@0: ["n_test" + s + "z", "-01.js", "foo.sub.sub", 34, 7], michael@0: ["test_SAME_NAME", "-01.js", "foo.sub.sub.sub", 37, 9] michael@0: ]; michael@0: michael@0: for (let [label, value, description, line, column] of expectedResults) { michael@0: let target = gFilteredFunctions.selectedItem.target; michael@0: michael@0: if (label) { michael@0: is(target.querySelector(".results-panel-item-label").getAttribute("value"), michael@0: gDebugger.SourceUtils.trimUrlLength(label + "()"), michael@0: "The corect label (" + label + ") is currently selected."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (value) { michael@0: ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value), michael@0: "The corect value (" + value + ") is attached."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-below"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (description) { michael@0: is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description, michael@0: "The corect description (" + description + ") is currently shown."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-before"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, line, column), michael@0: "The editor didn't jump to the correct line."); michael@0: michael@0: EventUtils.sendKey("DOWN", gDebugger); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, expectedResults[0][3], expectedResults[0][4]), michael@0: "The editor didn't jump to the correct line again."); michael@0: michael@0: deferred.resolve() michael@0: } else { michael@0: ok(false, "How did you get here? Go away, you."); michael@0: } michael@0: }); michael@0: michael@0: setText(gSearchBox, "@"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function secondJsSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popupshown").then(() => { michael@0: writeInfo(); michael@0: michael@0: is(gFilteredFunctions.selectedIndex, 0, michael@0: "An item should be selected in the filtered functions view (1)."); michael@0: ok(gFilteredFunctions.selectedItem, michael@0: "An item should be selected in the filtered functions view (2)."); michael@0: michael@0: if (gSources.selectedValue.indexOf("-02.js") != -1) { michael@0: let s = " " + gDebugger.L10N.getStr("functionSearchSeparatorLabel") + " "; michael@0: let expectedResults = [ michael@0: ["test2", "-02.js", "", 4, 5], michael@0: ["test3" + s + "test3_NAME", "-02.js", "", 8, 5], michael@0: ["test4_SAME_NAME", "-02.js", "", 11, 5], michael@0: ["x" + s + "X", "-02.js", "test.prototype", 14, 1], michael@0: ["y" + s + "Y", "-02.js", "test.prototype.sub", 16, 1], michael@0: ["z" + s + "Z", "-02.js", "test.prototype.sub.sub", 18, 1], michael@0: ["t", "-02.js", "test.prototype.sub.sub.sub", 20, 1], michael@0: ["x", "-02.js", "this", 20, 32], michael@0: ["y", "-02.js", "this", 20, 41], michael@0: ["z", "-02.js", "this", 20, 50] michael@0: ]; michael@0: michael@0: for (let [label, value, description, line, column] of expectedResults) { michael@0: let target = gFilteredFunctions.selectedItem.target; michael@0: michael@0: if (label) { michael@0: is(target.querySelector(".results-panel-item-label").getAttribute("value"), michael@0: gDebugger.SourceUtils.trimUrlLength(label + "()"), michael@0: "The corect label (" + label + ") is currently selected."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (value) { michael@0: ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value), michael@0: "The corect value (" + value + ") is attached."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-below"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (description) { michael@0: is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description, michael@0: "The corect description (" + description + ") is currently shown."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-before"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, line, column), michael@0: "The editor didn't jump to the correct line."); michael@0: michael@0: EventUtils.sendKey("DOWN", gDebugger); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, expectedResults[0][3], expectedResults[0][4]), michael@0: "The editor didn't jump to the correct line again."); michael@0: michael@0: deferred.resolve(); michael@0: } else { michael@0: ok(false, "How did you get here? Go away, you."); michael@0: } michael@0: }); michael@0: michael@0: setText(gSearchBox, "@"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function thirdJsSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popupshown").then(() => { michael@0: writeInfo(); michael@0: michael@0: is(gFilteredFunctions.selectedIndex, 0, michael@0: "An item should be selected in the filtered functions view (1)."); michael@0: ok(gFilteredFunctions.selectedItem, michael@0: "An item should be selected in the filtered functions view (2)."); michael@0: michael@0: if (gSources.selectedValue.indexOf("-03.js") != -1) { michael@0: let s = " " + gDebugger.L10N.getStr("functionSearchSeparatorLabel") + " "; michael@0: let expectedResults = [ michael@0: ["namedEventListener", "-03.js", "", 4, 43], michael@0: ["a" + s + "A", "-03.js", "bar", 10, 5], michael@0: ["b" + s + "B", "-03.js", "bar.alpha", 15, 5], michael@0: ["c" + s + "C", "-03.js", "bar.alpha.beta", 20, 5], michael@0: ["d" + s + "D", "-03.js", "this.theta", 25, 5], michael@0: ["fun", "-03.js", "", 29, 7], michael@0: ["foo", "-03.js", "", 29, 13], michael@0: ["bar", "-03.js", "", 29, 19], michael@0: ["t_foo", "-03.js", "this", 29, 25], michael@0: ["w_bar" + s + "baz", "-03.js", "window", 29, 38] michael@0: ]; michael@0: michael@0: for (let [label, value, description, line, column] of expectedResults) { michael@0: let target = gFilteredFunctions.selectedItem.target; michael@0: michael@0: if (label) { michael@0: is(target.querySelector(".results-panel-item-label").getAttribute("value"), michael@0: gDebugger.SourceUtils.trimUrlLength(label + "()"), michael@0: "The corect label (" + label + ") is currently selected."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (value) { michael@0: ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value), michael@0: "The corect value (" + value + ") is attached."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-below"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (description) { michael@0: is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description, michael@0: "The corect description (" + description + ") is currently shown."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-before"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, line, column), michael@0: "The editor didn't jump to the correct line."); michael@0: michael@0: EventUtils.sendKey("DOWN", gDebugger); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, expectedResults[0][3], expectedResults[0][4]), michael@0: "The editor didn't jump to the correct line again."); michael@0: michael@0: deferred.resolve(); michael@0: } else { michael@0: ok(false, "How did you get here? Go away, you."); michael@0: } michael@0: }); michael@0: michael@0: setText(gSearchBox, "@"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function filterSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popupshown").then(() => { michael@0: writeInfo(); michael@0: michael@0: is(gFilteredFunctions.selectedIndex, 0, michael@0: "An item should be selected in the filtered functions view (1)."); michael@0: ok(gFilteredFunctions.selectedItem, michael@0: "An item should be selected in the filtered functions view (2)."); michael@0: michael@0: if (gSources.selectedValue.indexOf("-03.js") != -1) { michael@0: let s = " " + gDebugger.L10N.getStr("functionSearchSeparatorLabel") + " "; michael@0: let expectedResults = [ michael@0: ["namedEventListener", "-03.js", "", 4, 43], michael@0: ["bar", "-03.js", "", 29, 19], michael@0: ["w_bar" + s + "baz", "-03.js", "window", 29, 38], michael@0: ["anonymousExpression", "-01.js", "test.prototype", 9, 3], michael@0: ["namedExpression" + s + "NAME", "-01.js", "test.prototype", 11, 3], michael@0: ["arrow", ".html", "", 20, 11], michael@0: ["bar2", ".html", "", 23, 18] michael@0: ]; michael@0: michael@0: for (let [label, value, description, line, column] of expectedResults) { michael@0: let target = gFilteredFunctions.selectedItem.target; michael@0: michael@0: if (label) { michael@0: is(target.querySelector(".results-panel-item-label").getAttribute("value"), michael@0: gDebugger.SourceUtils.trimUrlLength(label + "()"), michael@0: "The corect label (" + label + ") is currently selected."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (value) { michael@0: ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value), michael@0: "The corect value (" + value + ") is attached."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-below"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: if (description) { michael@0: is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description, michael@0: "The corect description (" + description + ") is currently shown."); michael@0: } else { michael@0: ok(!target.querySelector(".results-panel-item-label-before"), michael@0: "Shouldn't create empty label nodes."); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, line, column), michael@0: "The editor didn't jump to the correct line."); michael@0: michael@0: EventUtils.sendKey("DOWN", gDebugger); michael@0: } michael@0: michael@0: ok(isCaretPos(gPanel, expectedResults[0][3], expectedResults[0][4]), michael@0: "The editor didn't jump to the correct line again."); michael@0: michael@0: deferred.resolve(); michael@0: } else { michael@0: ok(false, "How did you get here? Go away, you."); michael@0: } michael@0: }); michael@0: michael@0: setText(gSearchBox, "@r"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function bogusSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popuphidden").then(() => { michael@0: ok(true, "Popup was successfully hidden after no matches were found."); michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: setText(gSearchBox, "@bogus"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function incrementalSearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popupshown").then(() => { michael@0: ok(true, "Popup was successfully shown after some matches were found."); michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: setText(gSearchBox, "@NAME"); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function emptySearch() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(gDebugger, "popuphidden").then(() => { michael@0: ok(true, "Popup was successfully hidden when nothing was searched."); michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: clearText(gSearchBox); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function showSource(aLabel) { michael@0: let deferred = promise.defer(); michael@0: michael@0: waitForSourceShown(gPanel, aLabel).then(deferred.resolve); michael@0: gSources.selectedItem = e => e.attachment.label == aLabel; michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function saveSearch() { michael@0: let finished = once(gDebugger, "popuphidden"); michael@0: michael@0: // Either by pressing RETURN or clicking on an item in the popup, michael@0: // the popup should hide and the item should become selected. michael@0: let random = Math.random(); michael@0: if (random >= 0.33) { michael@0: EventUtils.sendKey("RETURN", gDebugger); michael@0: } else if (random >= 0.66) { michael@0: EventUtils.sendKey("RETURN", gDebugger); michael@0: } else { michael@0: EventUtils.sendMouseEvent({ type: "click" }, michael@0: gFilteredFunctions.selectedItem.target, michael@0: gDebugger); michael@0: } michael@0: michael@0: return finished; michael@0: } michael@0: michael@0: function writeInfo() { michael@0: info("Current source url:\n" + gSources.selectedValue); michael@0: info("Debugger editor text:\n" + gEditor.getText()); michael@0: } michael@0: michael@0: registerCleanupFunction(function() { michael@0: gTab = null; michael@0: gDebuggee = null; michael@0: gPanel = null; michael@0: gDebugger = null; michael@0: gEditor = null; michael@0: gSources = null; michael@0: gSearchBox = null; michael@0: gFilteredFunctions = null; michael@0: });