зеркало из https://github.com/mozilla/gecko-dev.git
Bug 715892 - In the Style Editor, remove the stylesheet filter. r=dcamp,paul
--- browser/devtools/shared/SplitView.jsm | 116 -------------------- browser/devtools/styleeditor/styleeditor.xul | 23 +--- browser/devtools/styleeditor/test/Makefile.in | 1 - .../test/browser_styleeditor_sv_filter.js | 101 ----------------- .../en-US/chrome/browser/devtools/styleeditor.dtd | 11 -- 5 files changed, 6 insertions(+), 246 deletions(-) delete mode 100644 browser/devtools/styleeditor/test/browser_styleeditor_sv_filter.js --- browser/devtools/shared/SplitView.jsm | 116 -------------------- browser/devtools/styleeditor/styleeditor.xul | 23 +--- browser/devtools/styleeditor/test/Makefile.in | 1 - .../test/browser_styleeditor_sv_filter.js | 101 ----------------- .../en-US/chrome/browser/devtools/styleeditor.dtd | 11 -- 5 files changed, 6 insertions(+), 246 deletions(-) delete mode 100644 browser/devtools/styleeditor/test/browser_styleeditor_sv_filter.js
This commit is contained in:
Родитель
bd40a20e09
Коммит
064a82217b
|
@ -69,11 +69,6 @@ function SplitView(aRoot)
|
|||
|
||||
this._mql = aRoot.ownerDocument.defaultView.matchMedia(LANDSCAPE_MEDIA_QUERY);
|
||||
|
||||
this._filter = aRoot.querySelector(".splitview-filter");
|
||||
if (this._filter) {
|
||||
this._setupFilterBox();
|
||||
}
|
||||
|
||||
// items list focus and search-on-type handling
|
||||
this._nav.addEventListener("keydown", function onKeyCatchAll(aEvent) {
|
||||
function getFocusedItemWithin(nav) {
|
||||
|
@ -116,13 +111,6 @@ function SplitView(aRoot)
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// search-on-type when any non-whitespace character is pressed while list
|
||||
// has the focus
|
||||
if (this._filter &&
|
||||
!/\s/.test(String.fromCharCode(aEvent.which))) {
|
||||
this._filter.focus();
|
||||
}
|
||||
}.bind(this), false);
|
||||
}
|
||||
|
||||
|
@ -227,10 +215,6 @@ SplitView.prototype = {
|
|||
* Called when the item is hidden/inactive.
|
||||
* - function(summary, details, data) onDestroy
|
||||
* Called when the item has been removed.
|
||||
* - function(summary, details, data, query) onFilterBy
|
||||
* Called when the user performs a filtering search.
|
||||
* If the function returns false, the item does not match query
|
||||
* string and will be hidden.
|
||||
* - object data
|
||||
* Object to pass to the callbacks above.
|
||||
* - number ordinal
|
||||
|
@ -327,71 +311,6 @@ SplitView.prototype = {
|
|||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Filter items by given string.
|
||||
* Matching is performed on every item by calling onFilterBy when defined
|
||||
* and then by searching aQuery in the summary element's text item.
|
||||
* Non-matching item is hidden.
|
||||
*
|
||||
* If no item matches, 'splitview-all-filtered' class is set on the filter
|
||||
* input element and the splitview-nav element.
|
||||
*
|
||||
* @param string aQuery
|
||||
* The query string. Use null to reset (no filter).
|
||||
* @return number
|
||||
* The number of filtered (non-matching) item.
|
||||
*/
|
||||
filterItemsBy: function ASV_filterItemsBy(aQuery)
|
||||
{
|
||||
if (!this._nav.hasChildNodes()) {
|
||||
return 0;
|
||||
}
|
||||
if (aQuery) {
|
||||
aQuery = aQuery.trim();
|
||||
}
|
||||
if (!aQuery) {
|
||||
for (let i = 0; i < this._nav.childNodes.length; ++i) {
|
||||
this._nav.childNodes[i].classList.remove("splitview-filtered");
|
||||
}
|
||||
this._filter.classList.remove("splitview-all-filtered");
|
||||
this._nav.classList.remove("splitview-all-filtered");
|
||||
return 0;
|
||||
}
|
||||
|
||||
let count = 0;
|
||||
let filteredCount = 0;
|
||||
for (let i = 0; i < this._nav.childNodes.length; ++i) {
|
||||
let summary = this._nav.childNodes[i];
|
||||
|
||||
let matches = false;
|
||||
let binding = summary.getUserData(BINDING_USERDATA);
|
||||
if (binding.onFilterBy) {
|
||||
matches = binding.onFilterBy(summary, binding._details, binding.data, aQuery);
|
||||
}
|
||||
if (!matches) { // try text content
|
||||
let content = summary.textContent.toUpperCase();
|
||||
matches = (content.indexOf(aQuery.toUpperCase()) > -1);
|
||||
}
|
||||
|
||||
count++;
|
||||
if (!matches) {
|
||||
summary.classList.add("splitview-filtered");
|
||||
filteredCount++;
|
||||
} else {
|
||||
summary.classList.remove("splitview-filtered");
|
||||
}
|
||||
}
|
||||
|
||||
if (count > 0 && filteredCount == count) {
|
||||
this._filter.classList.add("splitview-all-filtered");
|
||||
this._nav.classList.add("splitview-all-filtered");
|
||||
} else {
|
||||
this._filter.classList.remove("splitview-all-filtered");
|
||||
this._nav.classList.remove("splitview-all-filtered");
|
||||
}
|
||||
return filteredCount;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the item's CSS class name.
|
||||
* This sets the class on both the summary and details elements, retaining
|
||||
|
@ -415,39 +334,4 @@ SplitView.prototype = {
|
|||
viewSpecific = viewSpecific ? viewSpecific.join(" ") : "";
|
||||
binding._details.className = viewSpecific + " " + aClassName;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set up filter search box.
|
||||
*/
|
||||
_setupFilterBox: function ASV__setupFilterBox()
|
||||
{
|
||||
let clearFilter = function clearFilter(aEvent) {
|
||||
this._filter.value = "";
|
||||
this.filterItemsBy("");
|
||||
return false;
|
||||
}.bind(this);
|
||||
|
||||
this._filter.addEventListener("command", function onFilterInput(aEvent) {
|
||||
this.filterItemsBy(this._filter.value);
|
||||
}.bind(this), false);
|
||||
|
||||
this._filter.addEventListener("keyup", function onFilterKeyUp(aEvent) {
|
||||
if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE) {
|
||||
clearFilter();
|
||||
}
|
||||
if (aEvent.keyCode == aEvent.DOM_VK_ENTER ||
|
||||
aEvent.keyCode == aEvent.DOM_VK_RETURN) {
|
||||
// autofocus matching item if there is only one
|
||||
let matches = this._nav.querySelectorAll("* > li:not(.splitview-filtered)");
|
||||
if (matches.length == 1) {
|
||||
this.activeSummary = matches[0];
|
||||
}
|
||||
}
|
||||
}.bind(this), false);
|
||||
|
||||
let clearButtons = this._root.querySelectorAll(".splitview-filter-clearButton");
|
||||
for (let i = 0; i < clearButtons.length; ++i) {
|
||||
clearButtons[i].addEventListener("click", clearFilter, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
<xul:script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
|
||||
|
||||
<xul:box id="style-editor-chrome" class="splitview-root loading">
|
||||
<xul:box class="splitview-controller" id="stylesheets-controller" persist="width height">
|
||||
<xul:box class="splitview-controller">
|
||||
<xul:box class="splitview-main">
|
||||
<xul:toolbar class="devtools-toolbar">
|
||||
<xul:toolbarbutton class="style-editor-newButton devtools-toolbarbutton"
|
||||
|
@ -68,14 +68,10 @@
|
|||
tooltiptext="&importButton.tooltip;"
|
||||
label="&importButton.label;"
|
||||
disabled="true"/>
|
||||
<xul:spacer flex="1"/>
|
||||
<xul:textbox class="splitview-filter devtools-searchinput"
|
||||
type="search" flex="1"
|
||||
tooltiptext="&searchInput.tooltip;"
|
||||
placeholder="&searchInput.placeholder;"/>
|
||||
</xul:toolbar>
|
||||
</xul:box>
|
||||
<xul:box class="splitview-nav-container">
|
||||
<xul:box id="splitview-resizer-target" class="splitview-nav-container"
|
||||
persist="width height">
|
||||
<ol class="splitview-nav" tabindex="0"></ol>
|
||||
<div class="splitview-nav placeholder empty">
|
||||
<p><strong>&noStyleSheet.label;</strong></p>
|
||||
|
@ -84,13 +80,6 @@
|
|||
class="style-editor-newButton">&noStyleSheet-tip-action.label;</a>
|
||||
&noStyleSheet-tip-end.label;</p>
|
||||
</div>
|
||||
<div class="splitview-nav placeholder all-filtered">
|
||||
<p><strong>&searchNoResults.label;</strong></p>
|
||||
<p>
|
||||
<a href="#"
|
||||
class="splitview-filter-clearButton">&searchClearButton.label;</a>
|
||||
</p>
|
||||
</div>
|
||||
</xul:box> <!-- .splitview-nav-container -->
|
||||
</xul:box> <!-- .splitview-controller -->
|
||||
<xul:box class="splitview-side-details"/>
|
||||
|
@ -116,12 +105,12 @@
|
|||
|
||||
<xul:box id="splitview-tpl-details-stylesheet" class="splitview-details">
|
||||
<xul:resizer class="splitview-portrait-resizer"
|
||||
dir="bottom"
|
||||
element="stylesheets-controller"/>
|
||||
dir="bottom"
|
||||
element="splitview-resizer-target"/>
|
||||
<xul:toolbar id="splitview-details-toolbar" class="devtools-toolbar">
|
||||
<xul:resizer class="splitview-landscape-resizer"
|
||||
dir="bottomend"
|
||||
element="stylesheets-controller"/>
|
||||
element="splitview-resizer-target"/>
|
||||
</xul:toolbar>
|
||||
<xul:box class="stylesheet-editor-input textbox"
|
||||
data-placeholder="&editorTextbox.placeholder;"/>
|
||||
|
|
|
@ -53,7 +53,6 @@ _BROWSER_TEST_FILES = \
|
|||
browser_styleeditor_pretty.js \
|
||||
browser_styleeditor_readonly.js \
|
||||
browser_styleeditor_reopen.js \
|
||||
browser_styleeditor_sv_filter.js \
|
||||
browser_styleeditor_sv_keynav.js \
|
||||
browser_styleeditor_sv_resize.js \
|
||||
four.html \
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run
|
||||
});
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function getFilteredItemsCount(nav)
|
||||
{
|
||||
let matches = nav.querySelectorAll("*.splitview-filtered");
|
||||
return matches ? matches.length : 0;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
aChrome.editors[0].addActionListener({onAttach: onFirstEditorAttach});
|
||||
aChrome.editors[1].addActionListener({onAttach: onSecondEditorAttach});
|
||||
}
|
||||
|
||||
function onFirstEditorAttach(aEditor)
|
||||
{
|
||||
let filter = gChromeWindow.document.querySelector(".splitview-filter");
|
||||
// force the command event on input since it is not possible to disable
|
||||
// the search textbox's timeout.
|
||||
let forceCommandEvent = function forceCommandEvent() {
|
||||
let evt = gChromeWindow.document.createEvent("XULCommandEvent");
|
||||
evt.initCommandEvent("command", true, true, gChromeWindow, 0, false, false,
|
||||
false, false, null);
|
||||
filter.dispatchEvent(evt);
|
||||
}
|
||||
filter.addEventListener("input", forceCommandEvent, false);
|
||||
|
||||
let nav = gChromeWindow.document.querySelector(".splitview-nav");
|
||||
nav.focus();
|
||||
|
||||
is(getFilteredItemsCount(nav), 0,
|
||||
"there is 0 filtered item initially");
|
||||
|
||||
waitForFocus(function () {
|
||||
// Search [s] (type-on-search since we focused nav above - not filter directly)
|
||||
EventUtils.synthesizeKey("s", {}, gChromeWindow);
|
||||
|
||||
// the search space is "simple.css" and "inline stylesheet #1" (2 sheets)
|
||||
is(getFilteredItemsCount(nav), 0,
|
||||
"there is 0 filtered item if searching for 's'");
|
||||
|
||||
EventUtils.synthesizeKey("i", {}, gChromeWindow); // Search [si]
|
||||
|
||||
is(getFilteredItemsCount(nav), 1, // inline stylesheet is filtered
|
||||
"there is 1 filtered item if searching for 's'");
|
||||
|
||||
// use uppercase to check that filtering is case-insensitive
|
||||
EventUtils.synthesizeKey("X", {}, gChromeWindow); // Search [siX]
|
||||
is(getFilteredItemsCount(nav), 2,
|
||||
"there is 2 filtered items if searching for 's'"); // no match
|
||||
|
||||
// clear the search
|
||||
EventUtils.synthesizeKey("VK_ESCAPE", {}, gChromeWindow);
|
||||
|
||||
is(filter.value, "",
|
||||
"filter is back to empty");
|
||||
is(getFilteredItemsCount(nav), 0,
|
||||
"there is 0 filtered item when filter is empty again");
|
||||
|
||||
for each (let c in "inline") {
|
||||
EventUtils.synthesizeKey(c, {}, gChromeWindow);
|
||||
}
|
||||
|
||||
is(getFilteredItemsCount(nav), 1, // simple.css is filtered
|
||||
"there is 1 filtered item if searching for 'inline'");
|
||||
|
||||
// auto-select the only result (enter the editor)
|
||||
EventUtils.synthesizeKey("VK_ENTER", {}, gChromeWindow);
|
||||
|
||||
filter.removeEventListener("input", forceCommandEvent, false);
|
||||
}, gChromeWindow);
|
||||
}
|
||||
|
||||
function onSecondEditorAttach(aEditor)
|
||||
{
|
||||
ok(aEditor.sourceEditor.hasFocus(),
|
||||
"second editor has been selected and focused automatically.");
|
||||
|
||||
finish();
|
||||
}
|
|
@ -22,17 +22,6 @@
|
|||
<!ENTITY importButton.accesskey "I">
|
||||
<!ENTITY importButton.commandkey "i">
|
||||
|
||||
<!ENTITY searchInput.tooltip "Filter style sheets by name">
|
||||
<!ENTITY searchInput.placeholder "Find style sheet">
|
||||
|
||||
<!-- LOCALIZATION NOTE (searchNoResults): This is shown when searching a term
|
||||
that is not found in any stylesheet or stylesheet name. -->
|
||||
<!ENTITY searchNoResults.label "No matching style sheet has been found.">
|
||||
|
||||
<!-- LOCALIZATION NOTE (searchClearButton): This button clears the search input
|
||||
box and is visible only when a search term has been typed. -->
|
||||
<!ENTITY searchClearButton.label "Clear">
|
||||
|
||||
<!ENTITY visibilityToggle.tooltip "Toggle style sheet visibility">
|
||||
<!ENTITY visibilityToggle.accesskey "V">
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче