1<!DOCTYPE html>
2<!--
3Copyright (c) 2014 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7<link rel="import" href="/tracing/base/base.html">
8<script>
9'use strict';
10
11tr.exportTo('tr.b', function() {
12
13  function Base64() {
14  }
15
16  function b64ToUint6(nChr) {
17    if (nChr > 64 && nChr < 91)
18      return nChr - 65;
19    if (nChr > 96 && nChr < 123)
20      return nChr - 71;
21    if (nChr > 47 && nChr < 58)
22      return nChr + 4;
23    if (nChr === 43)
24      return 62;
25    if (nChr === 47)
26      return 63;
27    return 0;
28  }
29
30  Base64.getDecodedBufferLength = function(input) {
31    return input.length * 3 + 1 >> 2;
32  };
33
34  Base64.EncodeArrayBufferToString = function(input) {
35    // http://stackoverflow.com/questions/9267899/
36    var binary = '';
37    var bytes = new Uint8Array(input);
38    var len = bytes.byteLength;
39    for (var i = 0; i < len; i++)
40      binary += String.fromCharCode(bytes[i]);
41    return btoa(binary);
42  };
43
44  Base64.DecodeToTypedArray = function(input, output) {
45
46    var nInLen = input.length;
47    var nOutLen = nInLen * 3 + 1 >> 2;
48    var nMod3 = 0;
49    var nMod4 = 0;
50    var nUint24 = 0;
51    var nOutIdx = 0;
52
53    if (nOutLen > output.byteLength)
54      throw new Error('Output buffer too small to decode.');
55
56    for (var nInIdx = 0; nInIdx < nInLen; nInIdx++) {
57      nMod4 = nInIdx & 3;
58      nUint24 |= b64ToUint6(input.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
59      if (nMod4 === 3 || nInLen - nInIdx === 1) {
60        for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
61          output.setUint8(nOutIdx, nUint24 >>> (16 >>> nMod3 & 24) & 255);
62        }
63        nUint24 = 0;
64      }
65    }
66    return nOutIdx - 1;
67  };
68
69  /*
70   * Wrapper of btoa
71   * The reason is that window object has a builtin btoa,
72   * but we also want to use btoa when it is headless.
73   * For example we want to use it in a mapper
74   */
75  Base64.btoa = function(input) {
76    return btoa(input);
77  };
78
79  /*
80   * Wrapper of atob
81   * The reason is that window object has a builtin atob,
82   * but we also want to use atob when it is headless.
83   * For example we want to use it in a mapper
84   */
85  Base64.atob = function(input) {
86    return atob(input);
87  };
88
89  return {
90    Base64: Base64
91  };
92
93});
94</script>
95