15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @interface 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.OutputStreamDelegate = function() 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.OutputStreamDelegate.prototype = { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onTransferStarted: function() { }, 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onTransferFinished: function() { }, 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {WebInspector.ChunkedReader} reader 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onChunkTransferred: function(reader) { }, 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {WebInspector.ChunkedReader} reader 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) onError: function(reader, event) { }, 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @interface 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.OutputStream = function() 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.OutputStream.prototype = { 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} data 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {function(WebInspector.OutputStream)=} callback 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) write: function(data, callback) { }, 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) close: function() { } 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @interface 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedReader = function() 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedReader.prototype = { 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {number} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileSize: function() { }, 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {number} 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) loadedSize: function() { }, 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {string} 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileName: function() { }, 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancel: function() { } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.ChunkedReader} 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!File} file 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} chunkSize 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!WebInspector.OutputStreamDelegate} delegate 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedFileReader = function(file, chunkSize, delegate) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._file = file; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._fileSize = file.size; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._loadedSize = 0; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._chunkSize = chunkSize; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate = delegate; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._isCanceled = false; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedFileReader.prototype = { 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!WebInspector.OutputStream} output 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) start: function(output) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._output = output; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._reader = new FileReader(); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._reader.onload = this._onChunkLoaded.bind(this); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._reader.onerror = this._delegate.onError.bind(this._delegate, this); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate.onTransferStarted(); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._loadChunk(); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancel: function() 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._isCanceled = true; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {number} 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) loadedSize: function() 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._loadedSize; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {number} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileSize: function() 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._fileSize; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {string} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileName: function() 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._file.name; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {Event} event 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _onChunkLoaded: function(event) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._isCanceled) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.target.readyState !== FileReader.DONE) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var data = event.target.result; 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._loadedSize += data.length; 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._output.write(data); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._isCanceled) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate.onChunkTransferred(this); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._loadedSize === this._fileSize) { 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._file = null; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._reader = null; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._output.close(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate.onTransferFinished(); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._loadChunk(); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _loadChunk: function() 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var chunkStart = this._loadedSize; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var chunkEnd = Math.min(this._fileSize, chunkStart + this._chunkSize) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nextPart = this._file.slice(chunkStart, chunkEnd); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._reader.readAsText(nextPart); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.ChunkedReader} 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} url 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!WebInspector.OutputStreamDelegate} delegate 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedXHRReader = function(url, delegate) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._url = url; 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate = delegate; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._fileSize = 0; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._loadedSize = 0; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._isCanceled = false; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedXHRReader.prototype = { 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!WebInspector.OutputStream} output 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) start: function(output) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._output = output; 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr = new XMLHttpRequest(); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr.open("GET", this._url, true); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr.onload = this._onLoad.bind(this); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr.onprogress = this._onProgress.bind(this); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr.onerror = this._delegate.onError.bind(this._delegate, this); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr.send(null); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate.onTransferStarted(); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancel: function() 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._isCanceled = true; 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._xhr.abort(); 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {number} 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) loadedSize: function() 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._loadedSize; 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {number} 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileSize: function() 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._fileSize; 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {string} 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileName: function() 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._url; 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {Event} event 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _onProgress: function(event) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._isCanceled) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.lengthComputable) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._fileSize = event.total; 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var data = this._xhr.responseText.substring(this._loadedSize); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!data.length) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._loadedSize += data.length; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._output.write(data); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._isCanceled) 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate.onChunkTransferred(this); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {Event} event 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _onLoad: function(event) 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._onProgress(event); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._isCanceled) 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._output.close(); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._delegate.onTransferFinished(); 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {function(!File)} callback 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {Node} 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.createFileSelectorElement = function(callback) { 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var fileSelectorElement = document.createElement("input"); 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fileSelectorElement.type = "file"; 304e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) fileSelectorElement.style.display = "none"; 305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) fileSelectorElement.setAttribute("tabindex", -1); 306e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) fileSelectorElement.onchange = onChange; 307e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) function onChange(event) 308e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) { 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) callback(fileSelectorElement.files[0]); 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return fileSelectorElement; 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} source 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number=} startIndex 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number=} lastIndex 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.findBalancedCurlyBrackets = function(source, startIndex, lastIndex) { 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lastIndex = lastIndex || source.length; 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startIndex = startIndex || 0; 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var counter = 0; 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var inString = false; 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var index = startIndex; index < lastIndex; ++index) { 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var character = source[index]; 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (inString) { 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (character === "\\") 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++index; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (character === "\"") 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inString = false; 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (character === "\"") 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inString = true; 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (character === "{") 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++counter; 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (character === "}") { 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (--counter === 0) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return index + 1; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.OutputStream} 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FileOutputStream = function() 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FileOutputStream.prototype = { 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} fileName 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {function(WebInspector.FileOutputStream, string=)} callback 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) open: function(fileName, callback) 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._closed = false; 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._writeCallbacks = []; 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._fileName = fileName; 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function callbackWrapper() 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.SavedURL, callbackWrapper, this); 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) callback(this); 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.SavedURL, callbackWrapper, this); 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.save(this._fileName, "", true); 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} data 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {function(WebInspector.OutputStream)=} callback 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) write: function(data, callback) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._writeCallbacks.push(callback); 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.append(this._fileName, data); 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) close: function() 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._closed = true; 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._writeCallbacks.length) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this); 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.close(this._fileName); 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {Event} event 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _onAppendDone: function(event) 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.data !== this._fileName) 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._writeCallbacks.length) { 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._closed) { 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this); 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.fileManager.close(this._fileName); 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var callback = this._writeCallbacks.shift(); 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (callback) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) callback(this); 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 412