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