1a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)/* 2a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 3a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * 4a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 5a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * modification, are permitted provided that the following conditions are 6a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * met: 7a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * 8a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 9a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 10a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 11a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 12a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * in the documentation and/or other materials provided with the 13a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * distribution. 14a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 15a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 16a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * this software without specific prior written permission. 17a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * 18a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) */ 30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; 32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)/** 34a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @constructor 35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!string} dirPath 36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!string} name 37a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!function(?WebInspector.TempFile)} callback 38a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) */ 39a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)WebInspector.TempFile = function(dirPath, name, callback) 40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._fileEntry = null; 42a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._writer = null; 43a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!FileSystem} fs 4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {WebInspector.TempFile} 4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 48a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didInitFs(fs) 49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 5043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) fs.root.getDirectory(dirPath, { create: true }, didGetDir.bind(this), errorHandler); 51a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 52a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!DirectoryEntry} dir 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {WebInspector.TempFile} 5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 57a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didGetDir(dir) 58a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 5943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) dir.getFile(name, { create: true }, didCreateFile.bind(this), errorHandler); 60a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!FileEntry} fileEntry 6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {WebInspector.TempFile} 6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 66a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didCreateFile(fileEntry) 67a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 68a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._fileEntry = fileEntry; 6943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) fileEntry.createWriter(didCreateWriter.bind(this), errorHandler); 70a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!FileWriter} writer 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {WebInspector.TempFile} 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 76a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didCreateWriter(writer) 77a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {WebInspector.TempFile} 8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 81a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didTruncate(e) 82a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 83a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._writer = writer; 84a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) writer.onwrite = null; 85a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) writer.onerror = null; 86a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) callback(this); 87a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 8843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 89a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function onTruncateError(e) 90a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error("Failed to truncate temp file " + e.code + " : " + e.message); 92a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) callback(null); 93a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 9443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 95a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (writer.length) { 96a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) writer.onwrite = didTruncate.bind(this); 9743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) writer.onerror = onTruncateError; 98a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) writer.truncate(0); 99a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } else { 100a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._writer = writer; 101a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) callback(this); 102a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 103a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 104a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 105a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function errorHandler(e) 106a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error("Failed to create temp file " + e.code + " : " + e.message); 108a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) callback(null); 109a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {WebInspector.TempFile} 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) function didClearTempStorage() 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 11643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) window.requestFileSystem(window.TEMPORARY, 10, didInitFs.bind(this), errorHandler); 11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebInspector.TempFile._ensureTempStorageCleared(didClearTempStorage.bind(this)); 119a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 120a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 121a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)WebInspector.TempFile.prototype = { 122a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) /** 1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!Array.<string>} strings 12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!function(boolean)} callback 125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) */ 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci write: function(strings, callback) 127a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var blob = new Blob(strings, {type: 'text/plain'}); 129a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._writer.onerror = function(e) 130a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error("Failed to write into a temp file: " + e.message); 13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callback(false); 13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._writer.onwrite = function(e) 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callback(true); 137a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 138a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._writer.write(blob); 13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) finishWriting: function() 14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 143a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._writer = null; 144a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) }, 145a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 146a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) /** 14709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {function(?string)} callback 148a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) */ 149a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) read: function(callback) 150a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this.readRange(undefined, undefined, callback); 1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }, 1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci /** 1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {number|undefined} startOffset 1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {number|undefined} endOffset 1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {function(?string)} callback 1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */ 1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci readRange: function(startOffset, endOffset, callback) 1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!Blob} file 16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 164a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didGetFile(file) 165a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 166a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) var reader = new FileReader(); 16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (typeof startOffset === "number" || typeof endOffset === "number") 1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci file = file.slice(/** @type {number} */ (startOffset), /** @type {number} */ (endOffset)); 17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @this {FileReader} 17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 173a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) reader.onloadend = function(e) 174a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 17509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callback(/** @type {?string} */ (this.result)); 176a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 177a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) reader.onerror = function(error) 178a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error("Failed to read from temp file: " + error.message); 180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) reader.readAsText(file); 182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 183a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) function didFailToGetFile(error) 184a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) { 185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error("Failed to load temp file: " + error.message); 18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callback(null); 187a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 18843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) this._fileEntry.file(didGetFile, didFailToGetFile); 18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!WebInspector.OutputStream} outputStream 19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!WebInspector.OutputStreamDelegate} delegate 19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) writeToOutputSteam: function(outputStream, delegate) 19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!File} file 19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) function didGetFile(file) 20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) var reader = new WebInspector.ChunkedFileReader(file, 10*1000*1000, delegate); 20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) reader.start(outputStream); 20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 20543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) function didFailToGetFile(error) 20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error("Failed to load temp file: " + error.message); 20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) outputStream.close(); 21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 21143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 21243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) this._fileEntry.file(didGetFile, didFailToGetFile); 21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 21409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 21509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) remove: function() 21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._fileEntry) 21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._fileEntry.remove(function() {}); 21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 22009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 22109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 22209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @constructor 22409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!string} dirPath 22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!string} name 22609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.DeferredTempFile = function(dirPath, name) 22809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 22909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._chunks = []; 23009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._tempFile = null; 23109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._isWriting = false; 23209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._finishCallback = null; 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._finishedWriting = false; 2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._callsPendingOpen = []; 2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._pendingReads = []; 23609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) new WebInspector.TempFile(dirPath, name, this._didCreateTempFile.bind(this)); 23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.DeferredTempFile.prototype = { 24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!Array.<string>} strings 24209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci write: function(strings) 24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!this._chunks) 24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 24709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._finishCallback) 248f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) throw new Error("No writes are allowed after close."); 2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._chunks.push.apply(this._chunks, strings); 25009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._tempFile && !this._isWriting) 25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._writeNextChunk(); 25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 25509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!function(?WebInspector.TempFile)} callback 25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci finishWriting: function(callback) 25809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 25909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._finishCallback = callback; 2607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (this._finishedWriting) 26109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callback(this._tempFile); 26209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else if (!this._isWriting && !this._chunks.length) 26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._notifyFinished(); 26409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 26509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _didCreateTempFile: function(tempFile) 26709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._tempFile = tempFile; 2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var callsPendingOpen = this._callsPendingOpen; 2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._callsPendingOpen = null; 2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (var i = 0; i < callsPendingOpen.length; ++i) 2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci callsPendingOpen[i](); 27309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!tempFile) { 27409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._chunks = null; 27509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._notifyFinished(); 27609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 27709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 27809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._chunks.length) 27909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._writeNextChunk(); 28009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 28109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 28209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _writeNextChunk: function() 28309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var chunks = this._chunks; 2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._chunks = []; 28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._isWriting = true; 2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._tempFile.write(chunks, this._didWriteChunk.bind(this)); 28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 29009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _didWriteChunk: function(success) 29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 29209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._isWriting = false; 29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!success) { 29409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._tempFile = null; 29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._chunks = null; 29609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._notifyFinished(); 29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._chunks.length) 30009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._writeNextChunk(); 30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else if (this._finishCallback) 30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._notifyFinished(); 30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 30409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _notifyFinished: function() 30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 3077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._finishedWriting = true; 30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._tempFile) 30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._tempFile.finishWriting(); 31009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._finishCallback) 31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._finishCallback(this._tempFile); 3127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var pendingReads = this._pendingReads; 3137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (var i = 0; i < this._pendingReads.length; ++i) 3147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._pendingReads[i](); 3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._pendingReads = []; 3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }, 3177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci /** 3197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {number|undefined} startOffset 3207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {number|undefined} endOffset 3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {function(string?)} callback 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */ 3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci readRange: function(startOffset, endOffset, callback) 3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!this._finishedWriting) { 3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._pendingReads.push(this.readRange.bind(this, startOffset, endOffset, callback)); 3277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!this._tempFile) { 3307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci callback(null); 3317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._tempFile.readRange(startOffset, endOffset, callback); 3347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }, 3357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci /** 3377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!WebInspector.OutputStream} outputStream 3387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!WebInspector.OutputStreamDelegate} delegate 3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */ 3407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci writeToOutputStream: function(outputStream, delegate) 3417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (this._callsPendingOpen) { 3437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._callsPendingOpen.push(this.writeToOutputStream.bind(this, outputStream, delegate)); 3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (this._tempFile) 3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._tempFile.writeToOutputSteam(outputStream, delegate); 3487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }, 3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci remove: function() 3517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 3527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (this._callsPendingOpen) { 3537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._callsPendingOpen.push(this.remove.bind(this)); 3547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (this._tempFile) 3577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci this._tempFile.remove(); 358a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 359a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @constructor 36309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 36409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.TempStorageCleaner = function() 36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 3669e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) this._worker = Runtime.startSharedWorker("temp_storage_shared_worker", "TempStorage"); 3679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) this._worker.onerror = this._handleError.bind(this); 36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._callbacks = []; 36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._worker.port.onmessage = this._handleMessage.bind(this); 37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._worker.port.onerror = this._handleError.bind(this); 37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.TempStorageCleaner.prototype = { 37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!function()} callback 37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ensureStorageCleared: function(callback) 37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 37909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (this._callbacks) 38009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._callbacks.push(callback); 38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else 38209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callback(); 38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 38409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _handleMessage: function(event) 38609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (event.data.type === "tempStorageCleared") { 38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (event.data.error) 389197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error(event.data.error); 39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._notifyCallbacks(); 39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 39209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _handleError: function(event) 39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 396197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebInspector.console.error(WebInspector.UIString("Failed to clear temp storage: %s", event.data)); 39709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._notifyCallbacks(); 39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 39909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _notifyCallbacks: function() 40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 40209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) var callbacks = this._callbacks; 40309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this._callbacks = null; 40409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (var i = 0; i < callbacks.length; i++) 40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) callbacks[i](); 40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 40709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 40809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 40909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!function()} callback 41109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 41209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.TempFile._ensureTempStorageCleared = function(callback) 41309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 41409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!WebInspector.TempFile._storageCleaner) 41509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebInspector.TempFile._storageCleaner = new WebInspector.TempStorageCleaner(); 41609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebInspector.TempFile._storageCleaner.ensureStorageCleared(callback); 41709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 418