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