UNPKG

node-webodf

Version:

WebODF - JavaScript Document Engine http://webodf.org/

445 lines (390 loc) 23.6 kB
/** * Copyright (C) 2012 KO GmbH <copyright@kogmbh.com> * * @licstart * This file is part of WebODF. * * WebODF is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License (GNU AGPL) * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * WebODF is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with WebODF. If not, see <http://www.gnu.org/licenses/>. * @licend * * @source: http://www.webodf.org/ * @source: https://github.com/kogmbh/WebODF/ */ /*global runtime, core, odf, NodeFilter*/ /** * @constructor * @param {core.UnitTestRunner} runner * @implements {core.UnitTest} */ odf.OdfUtilsTests = function OdfUtilsTests(runner) { "use strict"; var t, r = runner, namespace = { "text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0", "office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0", "style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0", "fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", "draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", "svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", "dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0", "xlink":"http://www.w3.org/1999/xlink", "cursor":"urn:webodf:names:cursor" }; this.setUp = function () { t = { testArea : core.UnitTest.provideTestAreaDiv(), ns: namespace }; t.odfUtils = odf.OdfUtils; }; this.tearDown = function () { t = {}; core.UnitTest.cleanupTestAreaDiv(); }; /** * @param {!string} fontFamilyName * @param {!string} expectedNormalizedFontFamilyName * @return {undefined} */ function testFontFamilyNameNormalizing(fontFamilyName, expectedNormalizedFontFamilyName) { t.expectedNormalizedFontFamilyName = expectedNormalizedFontFamilyName; t.normalizedFontFamilyName = t.odfUtils.getNormalizedFontFamilyName(fontFamilyName); r.shouldBe(t, "t.normalizedFontFamilyName", "t.expectedNormalizedFontFamilyName"); } function createDocument(dom) { var fragment; fragment = core.UnitTest.createOdtDocument("<office:text>" + dom + "</office:text>", namespace); t.testArea.appendChild(fragment.documentElement); t.range = t.testArea.ownerDocument.createRange(); return t.testArea.firstChild.firstChild.childNodes.length === 1 ? t.testArea.firstChild.firstChild.firstChild : t.testArea.firstChild.firstChild; } function isAnchoredAsCharacterElement_ReturnTrueForTab() { t.doc = createDocument("<text:p><text:tab/></text:p>"); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "true"); } function isAnchoredAsCharacterElement_ReturnTrueForSpace() { t.doc = createDocument("<text:p><text:s/></text:p>"); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "true"); } function isAnchoredAsCharacterElement_ReturnTrueForLineBreak() { t.doc = createDocument("<text:p><text:line-break/></text:p>"); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "true"); } function isAnchoredAsCharacterElement_ReturnTrueForCharacterFrame() { t.doc = createDocument("<text:p><draw:frame text:anchor-type='as-char'/></text:p>"); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "true"); } function isAnchoredAsCharacterElement_ReturnFalseForNonCharacterFrame() { t.doc = createDocument("<text:p><draw:frame text:anchor-type='char'/></text:p>"); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "false"); } function isAnchoredAsCharacterElement_ReturnTrueForAnnotation() { t.doc = createDocument("<text:p><office:annotation><text:p></text:p></office:annotation></text:p>"); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "true"); } function isAnchoredAsCharacterElement_ReturnTrueForAnnotationWrapper() { var div = t.testArea.ownerDocument.createElement('div'); div.className = "annotationWrapper"; t.doc = createDocument("<text:p><office:annotation><text:p></text:p></office:annotation></text:p>"); div.appendChild(t.doc.firstChild); t.doc.appendChild(div); t.isAnchoredAsCharacter = t.odfUtils.isAnchoredAsCharacterElement(t.doc.firstChild); r.shouldBe(t, "t.isAnchoredAsCharacter", "true"); } function getTextElements_EncompassedWithinParagraph() { t.doc = createDocument("<text:p>AB<text:s> </text:s>CD</text:p>"); t.range.setStart(t.doc.childNodes[0], 0); t.range.setEnd(t.doc.childNodes[2], 0); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.paragraphs.length", "1"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc"); r.shouldBe(t, "t.textElements.length", "2"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0]"); // "AB" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1]"); // text:s } function getTextElements_EncompassedWithinSpan_And_Paragraph() { t.doc = createDocument("<text:p><text:span>A</text:span>B<text:s/>CD</text:p>"); t.range.setStart(t.doc.childNodes[0], 0); t.range.setEnd(t.doc.childNodes[2], 0); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.paragraphs.length", "1"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc"); r.shouldBe(t, "t.textElements.length", "3"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[0]"); // "A" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1]"); // "B" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2]"); // text:s } function getTextElements_IgnoresEditInfo() { t.doc = createDocument("<text:p>AB<editinfo>HI</editinfo><text:s/>CD</text:p>"); t.range.setStart(t.doc.childNodes[0], 0); t.range.setEnd(t.doc.childNodes[2], 0); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.paragraphs.length", "1"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc"); r.shouldBe(t, "t.textElements.length", "2"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0]"); // "AB" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2]"); // text:s } function getTextElements_IgnoresEditInfoWithTextChild() { t.doc = createDocument("<text:p><editinfo>HI</editinfo><text:s/>CD</text:p>"); t.range.setStart(t.doc, 0); t.range.setEnd(t.doc, t.doc.childNodes.length); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.paragraphs.length", "1"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc"); r.shouldBe(t, "t.textElements.length", "2"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1]"); // text:s r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2]"); // "CD" } function getTextElements_SpansMultipleParagraphs() { t.doc = createDocument("<text:p>AB<text:s/>CD</text:p><text:p>EF<text:s/>GH</text:p>"); t.range.setStart(t.doc.childNodes[0].childNodes[0], 0); t.range.setEnd(t.doc.childNodes[1].childNodes[1], 0); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.paragraphs.length", "2"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc.childNodes[0]"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc.childNodes[1]"); r.shouldBe(t, "t.textElements.length", "5"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[0]"); // "AB" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[1]"); // text:s r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[2]"); // "CD" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1].childNodes[0]"); // "EF" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1].childNodes[1]"); // text:s } function getTextElements_IncludesInsignificantWhitespace() { t.doc = createDocument("<text:p>AB<text:s> </text:s>CD</text:p>\n<text:p>EF<text:s/>GH</text:p>"); t.range.setStart(t.doc.childNodes[0].childNodes[0], 0); t.range.setEnd(t.doc.childNodes[2].childNodes[1], 0); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, true); r.shouldBe(t, "t.paragraphs.length", "2"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc.childNodes[0]"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc.childNodes[2]"); r.shouldBe(t, "t.textElements.length", "6"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[0]"); // "AB" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[1]"); // text:s r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[2]"); // "CD" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1]"); // "\n" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2].childNodes[0]"); // "EF" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2].childNodes[1]"); // text:s } function getTextElements_ExcludesInsignificantWhitespace() { t.doc = createDocument("<text:p>AB<text:s> </text:s>CD</text:p>\n<text:p>EF<text:s/>GH</text:p>"); t.range.setStart(t.doc.childNodes[0].childNodes[0], 0); t.range.setEnd(t.doc.childNodes[2].childNodes[1], 0); t.paragraphs = t.odfUtils.getParagraphElements(t.range); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.paragraphs.length", "2"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc.childNodes[0]"); r.shouldBe(t, "t.paragraphs.shift()", "t.doc.childNodes[2]"); r.shouldBe(t, "t.textElements.length", "5"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[0]"); // "AB" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[1]"); // text:s r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0].childNodes[2]"); // "CD" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2].childNodes[0]"); // "EF" r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2].childNodes[1]"); // text:s } function getTextElements_CharacterElements() { t.doc = createDocument("<text:p><text:s> </text:s><text:tab> </text:tab><text:line-break>\n</text:line-break><draw:frame text:anchor-type='as-char'><draw:image/></draw:frame></text:p>"); t.range.selectNode(t.doc); t.textElements = t.odfUtils.getTextElements(t.range, false, true); r.shouldBe(t, "t.textElements.length", "4"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0]"); // text:s r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[1]"); // text:tab r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2]"); // text:line-break r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[3]"); // draw:frame } function getImageElements_ReturnTwoImages() { t.doc = createDocument("<text:h><text:span><draw:frame><draw:image/></draw:frame></text:span></text:h><text:p><text:span><draw:a><draw:frame><draw:image/></draw:frame></draw:a></text:span></text:p>"); t.range.setStartBefore(t.doc.firstChild); t.range.setEndAfter(t.doc.lastChild); t.imageElements = t.odfUtils.getImageElements(t.range); r.shouldBe(t, "t.imageElements.length", "2"); r.shouldBe(t, "t.imageElements.shift()", "t.doc.childNodes[0].firstChild.firstChild.firstChild"); r.shouldBe(t, "t.imageElements.shift()", "t.doc.childNodes[1].firstChild.firstChild.firstChild.firstChild"); } function getTextElements_InlineRoots_ExcludesSubRoots() { t.doc = createDocument("<text:p>abc<div xmlns='http://www.w3.org/1999/xhtml' class='annotationWrapper'><office:annotation>def</office:annotation></div>ghi</text:p>"); t.range.selectNode(t.doc); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.textElements.length", "2"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0]"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2]"); } function getTextElements_InlineRoots_ExcludesCursorContent() { t.doc = createDocument("<text:p>abc<cursor:cursor>def</cursor:cursor>ghi</text:p>"); t.range.selectNode(t.doc); t.textElements = t.odfUtils.getTextElements(t.range, false, false); r.shouldBe(t, "t.textElements.length", "2"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[0]"); r.shouldBe(t, "t.textElements.shift()", "t.doc.childNodes[2]"); } function getTextElements_ContainedWithinRoot_StaysBounded() { t.doc = createDocument("<text:p>abc<div xmlns='http://www.w3.org/1999/xhtml' class='annotationWrapper'>" + "<office:annotation>" + "<text:list><text:list-item><text:p>def</text:p></text:list-item></text:list>" + "</office:annotation>" + "</div>ghi</text:p>"); t.annotationText = t.doc.childNodes[1].firstChild.firstChild.firstChild.firstChild.firstChild; // should be "def" t.range.selectNodeContents(t.annotationText.parentNode); t.textElements = t.odfUtils.getTextElements(t.range, true, false); r.shouldBe(t, "t.textElements.length", "1"); r.shouldBe(t, "t.textElements.shift()", "t.annotationText"); } function getParagraphElements_Returns_ParagraphsAndHeadings() { t.doc = createDocument("<text:p>abc</text:p><text:h>def</text:h>"); t.range.setStart(t.doc.firstChild.firstChild, 0); t.range.setEnd(t.doc.lastChild.lastChild, t.doc.lastChild.lastChild.length); t.paragraphElements = t.odfUtils.getParagraphElements(t.range); r.shouldBe(t, "t.paragraphElements.length", "2"); r.shouldBe(t, "t.paragraphElements.shift()", "t.doc.firstChild"); r.shouldBe(t, "t.paragraphElements.shift()", "t.doc.lastChild"); } function getParagraphElements_ContainedWithinRoot_StaysBounded() { t.doc = createDocument("<text:p>abc<div xmlns='http://www.w3.org/1999/xhtml' class='annotationWrapper'><office:annotation><text:p>hi</text:p></office:annotation></div>ghi</text:p>"); t.range.selectNodeContents(t.doc.childNodes[1].firstChild); t.paragraphElements = t.odfUtils.getParagraphElements(t.range); r.shouldBe(t, "t.paragraphElements.length", "1"); r.shouldBe(t, "t.paragraphElements.shift()", "t.doc.childNodes[1].getElementsByTagNameNS(t.ns.text, 'p')[0]"); } function getParagraphElements_InlineRoots_ExcludesSubRoots() { t.doc = createDocument("<text:p>abc<div xmlns='http://www.w3.org/1999/xhtml' class='annotationWrapper'><office:annotation><text:p>hi</text:p></office:annotation></div>ghi</text:p>"); t.range.selectNode(t.doc); t.paragraphElements = t.odfUtils.getParagraphElements(t.range); r.shouldBe(t, "t.paragraphElements.length", "1"); r.shouldBe(t, "t.paragraphElements.shift()", "t.doc"); } function isDowngradableWhitespace_DowngradesFirstSpaceAfterChar() { t.doc = createDocument("<text:p>a<text:s> </text:s>b</text:p>"); t.isDowngradable = t.odfUtils.isDowngradableSpaceElement(t.doc.childNodes[1]); r.shouldBe(t, "t.isDowngradable", "true"); } function isDowngradableWhitespace_DowngradesFirstSpaceAfterTab() { t.doc = createDocument("<text:p><text:tab> </text:tab><text:s> </text:s>b</text:p>"); t.isDowngradable = t.odfUtils.isDowngradableSpaceElement(t.doc.childNodes[1]); r.shouldBe(t, "t.isDowngradable", "true"); } function isDowngradableWhitespace_DoesNotDowngradeTrailingSpace() { t.doc = createDocument("<text:p>a<text:s> </text:s></text:p>"); t.isDowngradable = t.odfUtils.isDowngradableSpaceElement(t.doc.childNodes[1]); r.shouldBe(t, "t.isDowngradable", "false"); } function isDowngradableWhitespace_DoesNotDowngradeLeading() { t.doc = createDocument("<text:p><text:s> </text:s>a</text:p>"); t.isDowngradable = t.odfUtils.isDowngradableSpaceElement(t.doc.childNodes[0]); r.shouldBe(t, "t.isDowngradable", "false"); } function isDowngradableWhitespace_DoesNotDowngradeAfterSpace() { t.doc = createDocument("<text:p>a<text:s> </text:s><text:s> </text:s>b</text:p>"); t.isDowngradable1 = t.odfUtils.isDowngradableSpaceElement(t.doc.childNodes[1]); t.isDowngradable2 = t.odfUtils.isDowngradableSpaceElement(t.doc.childNodes[2]); r.shouldBe(t, "t.isDowngradable1", "true"); r.shouldBe(t, "t.isDowngradable2", "false"); } function getHyperlinkElements_ReturnNoLinkOutsideSelection() { t.doc = createDocument("<text:p><text:a xlink:href='apple'>apple</text:a>google</text:p>"); t.range.setStartBefore(t.doc.childNodes[1]); t.range.setEndAfter(t.doc.childNodes[1]); t.hyperlinks = t.odfUtils.getHyperlinkElements(t.range); r.shouldBe(t, "t.hyperlinks.length", "0"); } function getHyperlinkElements_ReturnLinkWithinSelection() { t.doc = createDocument("<text:p><text:a xlink:href='google'>google</text:a><text:a xlink:href='apple'>apple</text:a></text:p>"); t.range.setStartBefore(t.doc.childNodes[0]); t.range.setEndAfter(t.doc.childNodes[0]); t.hyperlinks = t.odfUtils.getHyperlinkElements(t.range); r.shouldBe(t, "t.hyperlinks.length", "1"); r.shouldBe(t, "t.hyperlinks.shift()", "t.doc.childNodes[0]"); } function getHyperlinkElements_ReturnLinksForPartialSelection() { t.doc = createDocument("<text:p><text:a xlink:href='google'>google</text:a><text:a xlink:href='apple'>apple</text:a></text:p>"); t.range.setStart(t.doc.childNodes[0].childNodes[0], 1); t.range.setEnd(t.doc.childNodes[1].childNodes[0], 2); t.hyperlinks = t.odfUtils.getHyperlinkElements(t.range); r.shouldBe(t, "t.hyperlinks.length", "2"); r.shouldBe(t, "t.hyperlinks.shift()", "t.doc.childNodes[0]"); r.shouldBe(t, "t.hyperlinks.shift()", "t.doc.childNodes[1]"); } function getNormalizedFontFamilyName_normalizeUnquoted() { testFontFamilyNameNormalizing("Heisi Mincho W3", "'Heisi Mincho W3'"); testFontFamilyNameNormalizing(" \t\n\f\rHeisi Mincho W3", "'Heisi Mincho W3'"); testFontFamilyNameNormalizing("Heisi Mincho \t\n\f\r W3", "'Heisi Mincho W3'"); testFontFamilyNameNormalizing("Heisi Mincho W3 \t\n\f\r", "'Heisi Mincho W3'"); testFontFamilyNameNormalizing("\t\n\f\r Heisi Mincho \t\n\f\r W3\t\n\f\r ", "'Heisi Mincho W3'"); testFontFamilyNameNormalizing("serif", "serif"); } function getNormalizedFontFamilyName_doNotChangeQuoted() { testFontFamilyNameNormalizing("\"\t\n\f\r Heisi Mincho \t\n\f\r W3\t\n\f\r \"", "\"\t\n\f\r Heisi Mincho \t\n\f\r W3\t\n\f\r \""); testFontFamilyNameNormalizing("'\t\n\f\r Heisi Mincho \t\n\f\r W3\t\n\f\r '", "'\t\n\f\r Heisi Mincho \t\n\f\r W3\t\n\f\r '"); testFontFamilyNameNormalizing("'serif'", "'serif'"); testFontFamilyNameNormalizing("\"serif\"", "\"serif\""); } this.tests = function () { return r.name([ isAnchoredAsCharacterElement_ReturnTrueForTab, isAnchoredAsCharacterElement_ReturnTrueForSpace, isAnchoredAsCharacterElement_ReturnTrueForLineBreak, isAnchoredAsCharacterElement_ReturnTrueForCharacterFrame, isAnchoredAsCharacterElement_ReturnTrueForAnnotation, isAnchoredAsCharacterElement_ReturnTrueForAnnotationWrapper, isAnchoredAsCharacterElement_ReturnFalseForNonCharacterFrame, getTextElements_EncompassedWithinParagraph, getTextElements_EncompassedWithinSpan_And_Paragraph, getTextElements_IgnoresEditInfo, getTextElements_IgnoresEditInfoWithTextChild, getTextElements_SpansMultipleParagraphs, getTextElements_IncludesInsignificantWhitespace, getTextElements_ExcludesInsignificantWhitespace, getTextElements_CharacterElements, getImageElements_ReturnTwoImages, getTextElements_InlineRoots_ExcludesSubRoots, getTextElements_InlineRoots_ExcludesCursorContent, getTextElements_ContainedWithinRoot_StaysBounded, getParagraphElements_Returns_ParagraphsAndHeadings, getParagraphElements_ContainedWithinRoot_StaysBounded, getParagraphElements_InlineRoots_ExcludesSubRoots, isDowngradableWhitespace_DowngradesFirstSpaceAfterChar, isDowngradableWhitespace_DowngradesFirstSpaceAfterTab, isDowngradableWhitespace_DoesNotDowngradeTrailingSpace, isDowngradableWhitespace_DoesNotDowngradeLeading, isDowngradableWhitespace_DoesNotDowngradeAfterSpace, getHyperlinkElements_ReturnNoLinkOutsideSelection, getHyperlinkElements_ReturnLinkWithinSelection, getHyperlinkElements_ReturnLinksForPartialSelection, getNormalizedFontFamilyName_normalizeUnquoted, getNormalizedFontFamilyName_doNotChangeQuoted ]); }; this.asyncTests = function () { return []; }; }; odf.OdfUtilsTests.prototype.description = function () { "use strict"; return "Test the OdfUtilsTests class."; };