accessible/tests/mochitest/textattrs/test_general.html
author John Daggett <jdaggett@mozilla.com>
Mon, 16 Nov 2015 08:48:45 +0900
changeset 272735 236908ce084c6f22379eb32e7635737b4e02d8fd
parent 270701 95346f49d048f5abb3d60df4beec4fe4ef412017
child 275175 ef68dc6a289da306e5afa73f5a51d0ba41ec9e2f
permissions -rw-r--r--
Bug 1173260 - stub out tests that fail when 'cursive' is looked up via fontconfig. r=m_kato

<html>

<head>
  <title>Text attributes tests</title>
  <meta charset="utf-8" />
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />

  <style type="text/css">
    .gencontent:before { content: "*"; }
    .gencontent:after  { content: "*"; }
  </style>

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>

  <script type="application/javascript"
          src="../common.js"></script>
  <script type="application/javascript"
          src="../attributes.js"></script>
  <script type="application/javascript"
          src="../events.js"></script>

  <script type="application/javascript">
    var gComputedStyle = null;

    function doTest()
    {
      //////////////////////////////////////////////////////////////////////////
      // area1
      var ID = "area1";
      var defAttrs = buildDefaultTextAttrs(ID, "10pt");
      testDefaultTextAttrs(ID, defAttrs);

      var attrs = {};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 7);

      attrs = { "font-weight": kBoldFontWeight };
      testTextAttrs(ID, 7, attrs, defAttrs, 7, 11);

      attrs = {};
      testTextAttrs(ID, 12, attrs, defAttrs, 11, 18);

      //////////////////////////////////////////////////////////////////////////
      // area2
      ID = "area2";
      defAttrs = buildDefaultTextAttrs(ID, "14pt");
      testDefaultTextAttrs(ID, defAttrs);

      attrs = {};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 7);

      attrs = { "font-weight": kBoldFontWeight };
      testTextAttrs(ID, 7, attrs, defAttrs, 7, 12);

      var tempElem = getNode(ID).firstChild.nextSibling.firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"font-style": gComputedStyle.fontStyle,
               "font-weight": kBoldFontWeight };
      testTextAttrs(ID, 13, attrs, defAttrs, 12, 19);

      attrs = { "font-weight": kBoldFontWeight };
      testTextAttrs(ID, 20, attrs, defAttrs, 19, 23);

      attrs = {};
      testTextAttrs(ID, 24, attrs, defAttrs, 23, 30);

      //////////////////////////////////////////////////////////////////////////
      // area3
      ID = "area3";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      tempElem = getNode(ID).firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 6);

      tempElem = tempElem.firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 6, attrs, defAttrs, 6, 26);

      tempElem = tempElem.parentNode;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 26, attrs, defAttrs, 26, 27);

      tempElem = tempElem.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color,
               "background-color": gComputedStyle.backgroundColor};
      testTextAttrs(ID, 27, attrs, defAttrs, 27, 49);

      //////////////////////////////////////////////////////////////////////////
      // area4
      ID = "area4";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      tempElem = getNode(ID).firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 16);

      tempElem = tempElem.nextSibling.firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 16, attrs, defAttrs, 16, 33);

      tempElem = tempElem.parentNode;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 34, attrs, defAttrs, 33, 45);

      //////////////////////////////////////////////////////////////////////////
      // area5: "Green!*!RedNormal"
      ID = "area5";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      // Green
      tempElem = getNode(ID).firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 5);

      // br
      attrs = {};
      testTextAttrs(ID, 5, attrs, defAttrs, 5, 6);

      // img, embedded accessible, no attributes
      attrs = {};
      testTextAttrs(ID, 6, attrs, {}, 6, 7);

      // br
      attrs = {};
      testTextAttrs(ID, 7, attrs, defAttrs, 7, 8);

      // Red
      tempElem = tempElem.nextSibling.nextSibling.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 9, attrs, defAttrs, 8, 11);

      // Normal
      attrs = {};
      testTextAttrs(ID, 11, attrs, defAttrs, 11, 17);

      //////////////////////////////////////////////////////////////////////////
      // area6 (CSS vertical-align property, refer to bug 445938 for details
      // 	and sup and sub elements, refer to bug 735645 for details)
      ID = "area6";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      attrs = {};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 5);

      attrs = { "text-position": "super", "font-size": "10pt" };
      testTextAttrs(ID, 5, attrs, defAttrs, 5, 13);

      attrs = {};
      testTextAttrs(ID, 13, attrs, defAttrs, 13, 27);

      attrs = { "text-position": "super" };
      testTextAttrs(ID, 27, attrs, defAttrs, 27, 35);

      attrs = {};
      testTextAttrs(ID, 35, attrs, defAttrs, 35, 39);

      attrs = { "text-position": "sub", "font-size": "10pt" };
      testTextAttrs(ID, 39, attrs, defAttrs, 39, 50);

      attrs = {};
      testTextAttrs(ID, 50, attrs, defAttrs, 50, 55);

      attrs = { "text-position": "sub" };
      testTextAttrs(ID, 55, attrs, defAttrs, 55, 64);

      attrs = {};
      testTextAttrs(ID, 64, attrs, defAttrs, 64, 69);

      attrs = { "text-position": "super" };
      testTextAttrs(ID, 69, attrs, defAttrs, 69, 84);

      attrs = {};
      testTextAttrs(ID, 84, attrs, defAttrs, 84, 89);

      attrs = { "text-position": "sub" };
      testTextAttrs(ID, 89, attrs, defAttrs, 89, 102);

      attrs = {};
      testTextAttrs(ID, 102, attrs, defAttrs, 102, 107);

      attrs = { "text-position": "super" };
      testTextAttrs(ID, 107, attrs, defAttrs, 107, 123);

      attrs = {};
      testTextAttrs(ID, 123, attrs, defAttrs, 123, 128);

      attrs = { "text-position": "sub" };
      testTextAttrs(ID, 128, attrs, defAttrs, 128, 142);

      //////////////////////////////////////////////////////////////////////////
      // area7
      ID = "area7";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      defAttrs["language"] = "en";
      testDefaultTextAttrs(ID, defAttrs);

      attrs = {"language": "ru"};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 6);

      attrs = {};
      testTextAttrs(ID, 6, attrs, defAttrs, 6, 7);

      tempElem = getNode(ID).firstChild.nextSibling.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "background-color": gComputedStyle.backgroundColor};
      testTextAttrs(ID, 13, attrs, defAttrs, 7, 20);

      attrs = {};
      testTextAttrs(ID, 20, attrs, defAttrs, 20, 21);

      attrs = {"language": "de"};
      testTextAttrs(ID, 21, attrs, defAttrs, 21, 36);

      attrs = {};
      testTextAttrs(ID, 36, attrs, defAttrs, 36, 44);

      attrs = {};
      testTextAttrs(ID, 37, attrs, defAttrs, 36, 44);

      tempElem = tempElem.nextSibling.nextSibling.nextSibling.nextSibling.firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 44, attrs, defAttrs, 44, 51);

      tempElem = tempElem.firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"font-weight": kBoldFontWeight,
               "color": gComputedStyle.color};
      testTextAttrs(ID, 51, attrs, defAttrs, 51, 55);

      tempElem = tempElem.parentNode;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"color": gComputedStyle.color};
      testTextAttrs(ID, 55, attrs, defAttrs, 55, 62);

      //////////////////////////////////////////////////////////////////////////
      // area9, different single style spans in styled paragraph
      ID = "area9";
      defAttrs = buildDefaultTextAttrs(ID, "10pt");
      testDefaultTextAttrs(ID, defAttrs);

      attrs = {};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 6);

      attrs = { "font-size": "12pt" };
      testTextAttrs(ID, 7, attrs, defAttrs, 6, 12);

      attrs = {};
      testTextAttrs(ID, 13, attrs, defAttrs, 12, 21);

      // Walk to the span with the different background color
      tempElem = getNode(ID).firstChild.nextSibling.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "background-color": gComputedStyle.backgroundColor };
      testTextAttrs(ID, 22, attrs, defAttrs, 21, 36);

      attrs = {};
      testTextAttrs(ID, 37, attrs, defAttrs, 36, 44);

      // Walk from the background color span to the one with font-style
      tempElem = tempElem.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "font-style": gComputedStyle.fontStyle };
      testTextAttrs(ID, 45, attrs, defAttrs, 44, 61);

      attrs = {};
      testTextAttrs(ID, 62, attrs, defAttrs, 61, 69);

      // Walk from span with font-style to the one with font-family.
      tempElem = tempElem.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "font-family": kMonospaceFontFamily };
      testTextAttrs(ID, 70, attrs, defAttrs, 69, 83);

      attrs = {};
      testTextAttrs(ID, 84, attrs, defAttrs, 83, 91);

      attrs = {
        "text-underline-style": "solid",
        "text-underline-color": gComputedStyle.color
      };
      testTextAttrs(ID, 92, attrs, defAttrs, 91, 101);

      attrs = {};
      testTextAttrs(ID, 102, attrs, defAttrs, 101, 109);

      attrs = {
        "text-line-through-style": "solid",
        "text-line-through-color": gComputedStyle.color
      };
      testTextAttrs(ID, 110, attrs, defAttrs, 109, 122);

      attrs = {};
      testTextAttrs(ID, 123, attrs, defAttrs, 122, 130);

      attrs = {
        "text-line-through-style": "solid",
        "text-line-through-color": gComputedStyle.color
      };
      testTextAttrs(ID, 131, attrs, defAttrs, 130, 143);

      attrs = {};
      testTextAttrs(ID, 144, attrs, defAttrs, 143, 151);

      attrs = {
        "text-line-through-style": "solid",
        "text-line-through-color": gComputedStyle.color
      };
      testTextAttrs(ID, 152, attrs, defAttrs, 151, 164);

      attrs = {};
      testTextAttrs(ID, 165, attrs, defAttrs, 164, 171);

      //////////////////////////////////////////////////////////////////////////
      // area10, different single style spans in non-styled paragraph
      ID = "area10";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      attrs = {};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 7);

      attrs = { "font-size": "14pt" };
      testTextAttrs(ID, 7, attrs, defAttrs, 7, 13);

      attrs = {};
      testTextAttrs(ID, 13, attrs, defAttrs, 13, 22);

      // Walk to the span with the different background color
      tempElem = getNode(ID).firstChild.nextSibling.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "background-color": gComputedStyle.backgroundColor };
      testTextAttrs(ID, 23, attrs, defAttrs, 22, 37);

      attrs = {};
      testTextAttrs(ID, 38, attrs, defAttrs, 37, 45);

      // Walk from the background color span to the one with font-style
      tempElem = tempElem.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = {"font-style": gComputedStyle.fontStyle};
      testTextAttrs(ID, 46, attrs, defAttrs, 45, 62);

      attrs = {};
      testTextAttrs(ID, 63, attrs, defAttrs, 62, 70);

      // Walk from span with font-style to the one with font-family.
      tempElem = tempElem.nextSibling.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "font-family": kMonospaceFontFamily };
      testTextAttrs(ID, 71, attrs, defAttrs, 70, 84);

      attrs = {};
      testTextAttrs(ID, 85, attrs, defAttrs, 84, 92);

      attrs = {
        "text-underline-style": "solid",
        "text-underline-color": gComputedStyle.color
      };
      testTextAttrs(ID, 93, attrs, defAttrs, 92, 102);

      attrs = {};
      testTextAttrs(ID, 103, attrs, defAttrs, 102, 110);

      attrs = {
        "text-line-through-style": "solid",
        "text-line-through-color": gComputedStyle.color
      };
      testTextAttrs(ID, 111, attrs, defAttrs, 110, 123);

      attrs = {};
      testTextAttrs(ID, 124, attrs, defAttrs, 123, 130);

      //////////////////////////////////////////////////////////////////////////
      // area11, "font-weight" tests
      ID = "area11";
      defAttrs = buildDefaultTextAttrs(ID, "12pt", kBoldFontWeight);
      testDefaultTextAttrs(ID, defAttrs);

      attrs = { };
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 13);

      attrs = { "font-weight": kNormalFontWeight };
      testTextAttrs(ID, 13, attrs, defAttrs, 13, 20);

      attrs = { };
      testTextAttrs(ID, 20, attrs, defAttrs, 20, 27);

      attrs = { "font-weight": kNormalFontWeight };
      testTextAttrs(ID, 27, attrs, defAttrs, 27, 33);

      attrs = { };
      testTextAttrs(ID, 33, attrs, defAttrs, 33, 51);

      attrs = { "font-weight": kNormalFontWeight };
      testTextAttrs(ID, 51, attrs, defAttrs, 51, 57);

      attrs = { };
      testTextAttrs(ID, 57, attrs, defAttrs, 57, 96);

      //////////////////////////////////////////////////////////////////////////
      // test out of range offset
      testTextAttrsWrongOffset("area12", -1);
      testTextAttrsWrongOffset("area12", 500);

      //////////////////////////////////////////////////////////////////////////
      // test zero offset on empty hypertext accessibles
      ID = "area13";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      attrs = { };
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 0);

      ID = "area14";
      defAttrs = buildDefaultTextAttrs(ID, kInputFontSize,
                                       kNormalFontWeight, kInputFontFamily);

      attrs = { };
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 0);

      //////////////////////////////////////////////////////////////////////////
      // area15, embed char tests, "*plain*plain**bold*bold*"
      ID = "area15";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");

      // p
      testTextAttrs(ID, 0, { }, { }, 0, 1);
      // plain
      testTextAttrs(ID, 1, { }, defAttrs, 1, 6);
      // p
      testTextAttrs(ID, 6, { }, { }, 6, 7);
      // plain
      testTextAttrs(ID, 7, { }, defAttrs, 7, 12);
      // p and img
      testTextAttrs(ID, 12, { }, { }, 12, 14);
      // bold
      attrs = { "font-weight": kBoldFontWeight };
      testTextAttrs(ID, 14, attrs, defAttrs, 14, 18);
      // p
      testTextAttrs(ID, 18, { }, { }, 18, 19);
      // bold
      attrs = { "font-weight": kBoldFontWeight };
      testTextAttrs(ID, 19, attrs, defAttrs, 19, 23);
      // p
      testTextAttrs(ID, 23, { }, { }, 23, 24);

      //////////////////////////////////////////////////////////////////////////
      // area16, "font-family" tests
      ID = "area16";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      attrs = { "font-family": kMonospaceFontFamily };
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 4);

      attrs = { };
      testTextAttrs(ID, 4, attrs, defAttrs, 4, 9);

      attrs = { "font-family": kSerifFontFamily };
      testTextAttrs(ID, 9, attrs, defAttrs, 9, 13);

      attrs = { };
      testTextAttrs(ID, 13, attrs, defAttrs, 13, 18);

      attrs = { "font-family": kAbsentFontFamily };
      testTextAttrs(ID, 18, attrs, defAttrs, 18, 22);

      // bug 1224498 - this fails with 'cursive' fontconfig lookup
      if (!LINUX) {
        attrs = { };
        testTextAttrs(ID, 22, attrs, defAttrs, 22, 27);

        attrs = { "font-family": kCursiveFontFamily };
        testTextAttrs(ID, 27, attrs, defAttrs, 27, 31);

        attrs = { };
        testTextAttrs(ID, 31, attrs, defAttrs, 31, 44);
      }

      //////////////////////////////////////////////////////////////////////////
      // area17, "text-decoration" tests
      ID = "area17";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      attrs = {
        "text-underline-style": "solid",
        "text-underline-color": "rgb(0, 0, 0)",
      };
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 10);

      attrs = {
        "text-underline-style": "solid",
        "text-underline-color": "rgb(0, 0, 255)",
      };
      testTextAttrs(ID, 10, attrs, defAttrs, 10, 15);

      attrs = {
        "text-underline-style": "dotted",
        "text-underline-color": "rgb(0, 0, 0)",
      };
      testTextAttrs(ID, 15, attrs, defAttrs, 15, 22);

      attrs = {
        "text-line-through-style": "solid",
        "text-line-through-color": "rgb(0, 0, 0)",
      };
      testTextAttrs(ID, 22, attrs, defAttrs, 22, 34);

      attrs = {
        "text-line-through-style": "solid",
        "text-line-through-color": "rgb(0, 0, 255)",
      };
      testTextAttrs(ID, 34, attrs, defAttrs, 34, 39);

      attrs = {
        "text-line-through-style": "wavy",
        "text-line-through-color": "rgb(0, 0, 0)",
      };
      testTextAttrs(ID, 39, attrs, defAttrs, 39, 43);

      //////////////////////////////////////////////////////////////////////////
      // area18, "auto-generation text" tests
      ID = "area18";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");
      testDefaultTextAttrs(ID, defAttrs);

      var attrs = {
        "auto-generated": "true"
      };
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 3);
      testTextAttrs(ID, 3, { }, defAttrs, 3, 7);
      testTextAttrs(ID, 7, attrs, defAttrs, 7, 8);

       //////////////////////////////////////////////////////////////////////////
      // area19, "HTML5 mark tag" test
      // text enclosed in mark tag will have a different background color
      ID = "area19";
      defAttrs = buildDefaultTextAttrs(ID, "12pt");

      attrs = {};
      testTextAttrs(ID, 0, attrs, defAttrs, 0, 10);
      
      tempElem = getNode(ID).firstChild.nextSibling;
      gComputedStyle = document.defaultView.getComputedStyle(tempElem, "");
      attrs = { "background-color": gComputedStyle.backgroundColor };
      testTextAttrs(ID, 11, attrs, defAttrs, 10, 17);

      attrs = {};
      testTextAttrs(ID, 18, attrs, defAttrs, 17, 27);

       //////////////////////////////////////////////////////////////////////////
      // area20, "aOffset as -1 (Mozilla Bug 789621)" test

      ID = "area20";
      defAttrs = buildDefaultTextAttrs(ID, "15pt");
      testDefaultTextAttrs(ID, defAttrs);

      testTextAttrs(ID, -1, {}, defAttrs, 0, 11);
      SimpleTest.finish();
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTest);
  </script>
</head>
<body style="font-size: 12pt">

  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=345759"
     title="Implement text attributes">
    Mozilla Bug 345759
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=473569"
     title="Restrict text-position to allowed values">
    Mozilla Bug 473569
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=473576"
     title="font-family text attribute should expose actual font used">
    Mozilla Bug 473576
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=523304"
     title="expose text-underline-color and text-line-through-color text attributes">
    Mozilla Bug 523304
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=735645"
     title="expose sub and sup elements in text attributes">
    Mozilla Bug 735645
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=445516"
     title="Support auto-generated text attribute on bullet lists">
    Mozilla Bug 445516
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=789621"
     title="getTextAttributes doesn't work with magic offsets">
    Mozilla Bug 789621
  </a>
  <p id="display"></p>
  <div id="content" style="display: none"></div>
  <pre id="test">
  </pre>

  <p id="area1" style="font-size: smaller">Normal <b>Bold</b> Normal</p>
  <p id="area2" style="font-size: 120%">Normal <b>Bold <i>Italic </i>Bold</b> Normal</p>
  <p id="area3" style="background-color: blue;">
    <span style="color: green; background-color: rgb(0, 0, 255)">
      Green
      <span style="color: red">but children are red</span>
    </span><span style="color: green; background-color: rgb(255, 255, 0);">
      Another green section.
    </span>
  </p>
  <p id="area4">
    <span style="color: green">
      Green
    </span><span style="color: green">
      Green too
      <span style="color: red">with red children</span>
      Green again
    </span>
  </p>
  <!-- Green!*!RedNormal-->
  <p id="area5">
    <span style="color: green">Green</span>
    <img src="../moz.png" alt="image"/>
    <span style="color: red">Red</span>Normal
  </p>
  <p id="area6">
    This <sup>sentence</sup> has the word 
    <span style="vertical-align:super;">sentence</span> in 
    <sub>superscript</sub> and 
    <span style="vertical-align:sub;">subscript</span> and
    <span style="vertical-align:20%;">superscript 20%</span> and
    <span style="vertical-align:-20%;">subscript 20%</span> and
    <span style="vertical-align:20px;">superscript 20px</span> and
    <span style="vertical-align:-20px;">subscript 20px</span>
  </p>

  <p lang="en" id="area7">
    <span lang="ru">Привет</span>
    <span style="background-color: blue">Blue BG color</span>
    <span lang="de">Ich bin/Du bist</span>
    <span lang="en">
      Normal
      <span style="color: magenta">Magenta<b>Bold</b>Magenta</span>
    </span>
  </p>

  <p id="area9" style="font-size: smaller">Small
    <span style="font-size: 120%">bigger</span> smaller
    <span style="background-color: blue;">background blue</span> normal
    <span style="font-style: italic;">Different styling</span> normal
    <span style="font-family: monospace;">Different font</span> normal
    <span style="text-decoration: underline;">underlined</span> normal
    <span style="text-decoration: line-through;">strikethrough</span> normal
    <s>strikethrough</s> normal
    <strike>strikethrough</strike> normal
  </p>

  <p id="area10">Normal
    <span style="font-size: 120%">bigger</span> smaller
    <span style="background-color: blue;">background blue</span> normal
    <span style="font-style: italic;">Different styling</span> normal
    <span style="font-family: monospace;">Different font</span> normal
    <span style="text-decoration: underline;">underlined</span> normal
    <span style="text-decoration: line-through;">strikethrough</span> normal
  </p>

  <p id="area11" style="font-weight: bolder;">
    <span style="font-weight: bolder;">bolder</span>bolder
    <span style="font-weight: lighter;">lighter</span>bolder
    <span style="font-weight: normal;">normal</span>bolder
    <b>bold</b>bolder
    <span style="font-weight: 400;">normal</span>bolder
    <span style="font-weight: 700;">bold</span>bolder
    <span style="font-weight: bold;">bold</span>bolder
    <span style="font-weight: 900;">bold</span>bolder
  </p>

  <p id="area12">hello</p>
  <p id="area13"></p>
  <input id="area14">

  <!-- *plain*plain**bold*bold*-->
  <div id="area15"><p>embed</p>plain<p>embed</p>plain<p>embed</p><img src="../moz.png" alt="image"/><b>bold</b><p>embed</p><b>bold</b><p>embed</p></div>

  <p id="area16" style="font-family: sans-serif;">
    <span style="font-family: monospace;">text</span>text
    <span style="font-family: serif;">text</span>text
    <span style="font-family: BodoniThatDoesntExist;">text</span>text
    <span style="font-family: Comic Sans MS, cursive;">text</span>text
    <span style="font-family: sans-serif, fantasy;">text</span>text
  </p>

  <p id="area17">
    <span style="text-decoration-line: underline;">underline
    </span><span style="text-decoration: underline; text-decoration-color: blue;">blue
    </span><span style="text-decoration: underline; text-decoration-style: dotted;">dotted
    </span><span style="text-decoration-line: line-through;">linethrough
    </span><span style="text-decoration: line-through; text-decoration-color: blue;">blue
    </span><span style="text-decoration: line-through; text-decoration-style: wavy;">wavy
    </span>
  </p>

  <ul>
    <li id="area18" class="gencontent">item</li>
  </ul>

  <p id="area19">uncolored
    <mark>colored</mark> uncolored
  </p>

  <p id="area20" style="font-size: 15pt;">offset test</p>

</body>
</html>