tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

common.js (6994B)


      1 var namespaces = {
      2    "html":"http://www.w3.org/1999/xhtml",
      3    "mathml":"http://www.w3.org/1998/Math/MathML",
      4    "svg":"http://www.w3.org/2000/svg",
      5    "xlink":"http://www.w3.org/1999/xlink",
      6    "xml":"http://www.w3.org/XML/1998/namespace",
      7    "xmlns":"http://www.w3.org/2000/xmlns/"
      8 };
      9 
     10 var prefixes = {};
     11 for (var prefix in namespaces) {
     12  if (namespaces.hasOwnProperty(prefix)) {
     13    prefixes[namespaces[prefix]] = prefix;
     14  }
     15 }
     16 prefixes[namespaces["mathml"]] = "math";
     17 
     18 function format(format_string) {
     19  var insertions = Array.prototype.slice.call(arguments, 1);
     20  var regexp = /%s/g;
     21  var match_count = 0;
     22  var rv = format_string.replace(regexp, function(match) {
     23                                   var rv = insertions[match_count];
     24                                   match_count++;
     25                                   return rv;
     26                                 });
     27  return rv;
     28 }
     29 
     30 function test_serializer(element) {
     31  //element.normalize();
     32  var lines = [];
     33  function serialize_element(element, indent) {
     34    var indent_spaces = (new Array(indent)).join(" ");
     35    switch(element.nodeType) {
     36      case Node.DOCUMENT_TYPE_NODE:
     37        if (element.name) {
     38          if (element.publicId || element.systemId) {
     39            var publicId = element.publicId ? element.publicId : "";
     40            var systemId = element.systemId ? element.systemId : "";
     41            lines.push(format("|%s<!DOCTYPE %s \"%s\" \"%s\">", indent_spaces,
     42                                element.name, publicId, systemId));
     43          } else {
     44            lines.push(format("|%s<!DOCTYPE %s>", indent_spaces,
     45                                element.name));
     46          }
     47        } else {
     48          lines.push(format("|%s<!DOCTYPE >", indent_spaces));
     49        }
     50        break;
     51      case Node.DOCUMENT_NODE:
     52        lines.push("#document");
     53        break;
     54      case Node.DOCUMENT_FRAGMENT_NODE:
     55        lines.push("#document-fragment");
     56        break;
     57      case Node.PROCESSING_INSTRUCTION_NODE:
     58        lines.push(format("|%s<?%s %s>", indent_spaces, element.target, element.data));
     59        break;
     60      case Node.COMMENT_NODE:
     61        lines.push(format("|%s<!-- %s -->", indent_spaces, element.nodeValue));
     62        break;
     63      case Node.TEXT_NODE:
     64        lines.push(format("|%s\"%s\"", indent_spaces, element.nodeValue));
     65        break;
     66      case Node.ELEMENT_NODE:
     67        if (element.getAttribute("data-skip") !== null) {
     68          return;
     69        }
     70        if (element.namespaceURI !== null && element.namespaceURI !== namespaces.html) {
     71          var name = format("%s %s", prefixes[element.namespaceURI],
     72                            element.localName);
     73        } else {
     74          var name = element.localName;
     75        }
     76        lines.push(format("|%s<%s>", indent_spaces, name));
     77 
     78        var attributes = Array.prototype.map.call(
     79               element.attributes,
     80               function(attr) {
     81                 var name = (attr.namespaceURI ? prefixes[attr.namespaceURI] + " " : "") +
     82                      attr.localName;
     83                 return [name, attr.value];
     84               });
     85        attributes.sort(function (a, b) {
     86              var x = a[0];
     87              var y = b[0];
     88              if (x === y) {
     89                        return 0;
     90              }
     91              return x > y ? 1 : -1;
     92                });
     93 
     94        attributes.forEach(
     95          function(attr) {
     96            var indent_spaces = (new Array(indent + 2)).join(" ");
     97            lines.push(format("|%s%s=\"%s\"", indent_spaces, attr[0], attr[1]));
     98          }
     99        );
    100        break;
    101    }
    102    indent += 2;
    103    Array.prototype.forEach.call(element.childNodes,
    104                                 function(node) {
    105                                   serialize_element(node, indent);
    106                                 });
    107  }
    108  serialize_element(element, 0);
    109  return lines.join("\n");
    110 }
    111 
    112 function print_diffs(test_id, uri_encoded_input, expected, actual, container) {
    113  container = container ? container : null;
    114  if (actual) {
    115    var diffs = mark_diffs(expected, actual);
    116    var expected_text = diffs[0];
    117    var actual_text = diffs[1];
    118  } else {
    119    var expected_text = expected;
    120    var actual_text = "";
    121  }
    122 
    123  var tmpl = ["div", {"id":"${test_id}"},
    124              ["h2", {}, "${test_id}"],
    125              function(vars) {
    126                if (vars.container !== null) {
    127                  return ["div", {"class":"container"},
    128                  ["h3", {}, "innerHTML Container"],
    129                  ["pre", {}, vars.container]];
    130                } else {
    131                  return null;
    132                }
    133              },
    134              ["div", {"id":"input_${test_id}"}, ["h3", {}, "Input"], ["pre", {},
    135                                                                       ["code", {}, decodeURIComponent(uri_encoded_input)]]],
    136              ["div", {"id":"expected_${test_id}"}, ["h3", {}, "Expected"],
    137               ["pre", {}, ["code", {}, expected_text]]],
    138              ["div", {"id":"actual_${test_id}"}, ["h3", {}, "Actual"],
    139               ["pre", {}, ["code", {}, actual_text]]]
    140             ];
    141 
    142  var diff_dom = template.render(tmpl, {test_id:test_id, container:container});
    143  document.body.appendChild(diff_dom);
    144 }
    145 
    146 function runTests(tests) {
    147    tests.forEach(function(test){
    148        var expected = decodeURIComponent(test.expected);
    149        var t = async_test(document.title + ' - ' + test.name);
    150        t.step(function(){
    151            var video = document.createElement('video');
    152            var track = document.createElement('track');
    153            assert_true('src' in track, 'track not supported');
    154            t.test_id = test.name;
    155            t.url_encoded_input = test.input;
    156            t.expected = expected;
    157            var track_blob = new Blob(['WEBVTT\n\n00:00.000 --> 00:01.000\n',
    158                                       decodeURIComponent(test.input)],
    159                                      { type: 'text/vtt' });
    160            var track_url = URL.createObjectURL(track_blob);;
    161            track.src = track_url;
    162            t.add_cleanup(function() {
    163                URL.revokeObjectURL(track_url);
    164            });
    165            track['default'] = true;
    166            track.kind = 'subtitles';
    167            track.onload = t.step_func(trackLoaded);
    168            track.onerror = t.step_func(trackError);
    169            video.appendChild(track);
    170            document.body.appendChild(video);
    171        });
    172    });
    173 }
    174 
    175 function trackLoaded(e) {
    176    var track = e.target;
    177    setTimeout(removeElm, 0, track.parentNode);
    178    var cue = track.track.cues[0];
    179    var frag = cue.getCueAsHTML();
    180    var got = test_serializer(frag);
    181    if (got !== this.expected) {
    182        print_diffs(this.test_id, this.url_encoded_input, this.expected, got);
    183    }
    184    assert_equals(got, this.expected);
    185    this.done();
    186 }
    187 
    188 function trackError(e) {
    189    setTimeout(removeElm, 0, e.target.parentNode);
    190    assert_unreached('got error event');
    191    this.done();
    192 }
    193 
    194 function removeElm(elm) {
    195    document.body.removeChild(elm);
    196 }