diff options
Diffstat (limited to 'devtools/client/shared/test/browser_inplace-editor_maxwidth.js')
-rw-r--r-- | devtools/client/shared/test/browser_inplace-editor_maxwidth.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/devtools/client/shared/test/browser_inplace-editor_maxwidth.js b/devtools/client/shared/test/browser_inplace-editor_maxwidth.js new file mode 100644 index 000000000..205f4418e --- /dev/null +++ b/devtools/client/shared/test/browser_inplace-editor_maxwidth.js @@ -0,0 +1,114 @@ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +/* import-globals-from helper_inplace_editor.js */ + +"use strict"; + +loadHelperScript("helper_inplace_editor.js"); + +const MAX_WIDTH = 300; +const START_TEXT = "Start text"; +const LONG_TEXT = "I am a long text and I will not fit in a 300px container. " + + "I expect the inplace editor to wrap."; + +// Test the inplace-editor behavior with a maxWidth configuration option +// defined. + +add_task(function* () { + yield addTab("data:text/html;charset=utf-8,inplace editor max width tests"); + let [host, , doc] = yield createHost(); + + info("Testing the maxWidth option in pixels, to precisely check the size"); + yield new Promise(resolve => { + createInplaceEditorAndClick({ + multiline: true, + maxWidth: MAX_WIDTH, + start: testMaxWidth, + done: resolve + }, doc, START_TEXT); + }); + + host.destroy(); + gBrowser.removeCurrentTab(); +}); + +let testMaxWidth = Task.async(function* (editor) { + is(editor.input.value, START_TEXT, "Span text content should be used"); + ok(editor.input.offsetWidth < MAX_WIDTH, + "Input width should be strictly smaller than MAX_WIDTH"); + is(getLines(editor.input), 1, "Input should display 1 line of text"); + + info("Check a text is on several lines if it does not fit MAX_WIDTH"); + for (let key of LONG_TEXT) { + EventUtils.sendChar(key); + checkScrollbars(editor.input); + } + + is(editor.input.value, LONG_TEXT, "Long text should be the input value"); + is(editor.input.offsetWidth, MAX_WIDTH, + "Input width should be the same as MAX_WIDTH"); + is(getLines(editor.input), 3, "Input should display 3 lines of text"); + checkScrollbars(editor.input); + + info("Delete all characters on line 3."); + while (getLines(editor.input) === 3) { + EventUtils.sendKey("BACK_SPACE"); + checkScrollbars(editor.input); + } + + is(editor.input.offsetWidth, MAX_WIDTH, + "Input width should be the same as MAX_WIDTH"); + is(getLines(editor.input), 2, "Input should display 2 lines of text"); + checkScrollbars(editor.input); + + info("Delete all characters on line 2."); + while (getLines(editor.input) === 2) { + EventUtils.sendKey("BACK_SPACE"); + checkScrollbars(editor.input); + } + + is(getLines(editor.input), 1, "Input should display 1 line of text"); + checkScrollbars(editor.input); + + info("Delete all characters."); + while (editor.input.value !== "") { + EventUtils.sendKey("BACK_SPACE"); + checkScrollbars(editor.input); + } + + ok(editor.input.offsetWidth < MAX_WIDTH, + "Input width should again be strictly smaller than MAX_WIDTH"); + ok(editor.input.offsetWidth > 0, + "Even with no content, the input has a non-zero width"); + is(getLines(editor.input), 1, "Input should display 1 line of text"); + checkScrollbars(editor.input); + + info("Leave the inplace-editor"); + EventUtils.sendKey("RETURN"); +}); + +/** + * Retrieve the current number of lines displayed in the provided textarea. + * + * @param {DOMNode} textarea + * @return {Number} the number of lines + */ +function getLines(textarea) { + let win = textarea.ownerDocument.defaultView; + let style = win.getComputedStyle(textarea); + let lineHeight = style.getPropertyCSSValue("line-height").cssText; + return Math.floor(textarea.clientHeight / parseFloat(lineHeight)); +} + +/** + * Verify that the provided textarea has no vertical or horizontal scrollbar. + * + * @param {DOMNode} textarea + */ +function checkScrollbars(textarea) { + is(textarea.scrollHeight, textarea.clientHeight, + "Textarea should never have vertical scrollbars"); + is(textarea.scrollWidth, textarea.clientWidth, + "Textarea should never have horizontal scrollbars"); +} |