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)    /**
44a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ChunkedReader} reader
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onChunkTransferred: function(reader) { },
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ChunkedReader} reader
50f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {!Event} event
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onError: function(reader, event) { },
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @interface
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.OutputStream = function()
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.OutputStream.prototype = {
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} data
65a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.OutputStream)=} callback
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    write: function(data, callback) { },
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    close: function() { }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @interface
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedReader = function()
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedReader.prototype = {
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {number}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fileSize: function() { },
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {number}
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    loadedSize: function() { },
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fileName: function() { },
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancel: function() { }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.ChunkedReader}
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!File} file
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} chunkSize
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!WebInspector.OutputStreamDelegate} delegate
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedFileReader = function(file, chunkSize, delegate)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._file = file;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._fileSize = file.size;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._loadedSize = 0;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._chunkSize = chunkSize;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._delegate = delegate;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._isCanceled = false;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ChunkedFileReader.prototype = {
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {!WebInspector.OutputStream} output
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    start: function(output)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._output = output;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._reader = new FileReader();
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._reader.onload = this._onChunkLoaded.bind(this);
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._reader.onerror = this._delegate.onError.bind(this._delegate, this);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._delegate.onTransferStarted();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._loadChunk();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancel: function()
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isCanceled = true;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {number}
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    loadedSize: function()
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._loadedSize;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {number}
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fileSize: function()
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._fileSize;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fileName: function()
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._file.name;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Event} event
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onChunkLoaded: function(event)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isCanceled)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.target.readyState !== FileReader.DONE)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var data = event.target.result;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._loadedSize += data.length;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._output.write(data);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isCanceled)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._delegate.onChunkTransferred(this);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._loadedSize === this._fileSize) {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._file = null;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._reader = null;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._output.close();
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._delegate.onTransferFinished();
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._loadChunk();
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _loadChunk: function()
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var chunkStart = this._loadedSize;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var chunkEnd = Math.min(this._fileSize, chunkStart + this._chunkSize)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nextPart = this._file.slice(chunkStart, chunkEnd);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._reader.readAsText(nextPart);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {function(!File)} callback
200a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @return {!Node}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.createFileSelectorElement = function(callback) {
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var fileSelectorElement = document.createElement("input");
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fileSelectorElement.type = "file";
205e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    fileSelectorElement.style.display = "none";
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    fileSelectorElement.setAttribute("tabindex", -1);
207e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    fileSelectorElement.onchange = onChange;
208e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    function onChange(event)
209e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        callback(fileSelectorElement.files[0]);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fileSelectorElement;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.OutputStream}
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FileOutputStream = function()
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FileOutputStream.prototype = {
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} fileName
226a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(boolean)} callback
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    open: function(fileName, callback)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._closed = false;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._writeCallbacks = [];
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._fileName = fileName;
233a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
234a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        /**
235a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {boolean} accepted
23609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.FileOutputStream}
237a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         */
238a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        function callbackWrapper(accepted)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
240a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (accepted)
241a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this);
242a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            callback(accepted);
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
244a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        WebInspector.fileManager.save(this._fileName, "", true, callbackWrapper.bind(this));
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} data
249a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.OutputStream)=} callback
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    write: function(data, callback)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._writeCallbacks.push(callback);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.fileManager.append(this._fileName, data);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    close: function()
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._closed = true;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._writeCallbacks.length)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this);
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.fileManager.close(this._fileName);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
26709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {!WebInspector.Event} event
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onAppendDone: function(event)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.data !== this._fileName)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        var callback = this._writeCallbacks.shift();
2748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (callback)
2758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            callback(this);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._writeCallbacks.length) {
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._closed) {
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this);
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.fileManager.close(this._fileName);
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
284