Left: | ||
Right: |
OLD | NEW |
---|---|
1 "use strict"; | 1 "use strict"; |
2 | 2 |
3 let data = {}; | 3 let data = new Map(); |
4 | |
5 // | |
6 // Fake nsIFile implementation for our I/O | |
kzar
2017/04/20 06:49:25
We have similar crap in adblockpluschrome, I wonde
Wladimir Palant
2017/04/20 07:17:06
Yes, that was the point - fake files should no lon
| |
7 // | |
8 function FakeFile(path) | |
9 { | |
10 this.path = path; | |
11 } | |
12 FakeFile.prototype = | |
13 { | |
14 get leafName() | |
15 { | |
16 return this.path; | |
17 }, | |
18 set leafName(value) | |
19 { | |
20 this.path = value; | |
21 }, | |
22 append(path) | |
23 { | |
24 this.path += path; | |
25 }, | |
26 exists() | |
27 { | |
28 return this.path in data; | |
29 }, | |
30 get contents() | |
31 { | |
32 return (data[this.path] || {}).contents; | |
33 }, | |
34 set contents(value) | |
35 { | |
36 data[this.path] = {lastModified: Date.now()}; | |
37 return data[this.path].contents = value; | |
38 }, | |
39 get lastModifiedTime() | |
40 { | |
41 return (data[this.path] || {}).lastModified; | |
42 }, | |
43 set lastModifiedTime(value) | |
44 { | |
45 return (data[this.path] || {}).lastModified = value; | |
46 }, | |
47 clone() | |
48 { | |
49 return new FakeFile(this.path); | |
50 }, | |
51 get parent() | |
52 { | |
53 return {create() {}}; | |
54 }, | |
55 normalize() {} | |
56 }; | |
57 | 4 |
58 exports.IO = { | 5 exports.IO = { |
59 lineBreak: "\n", | 6 // Non-public API, for tests only |
60 resolveFilePath(path) | 7 _getFileContents(fileName) |
61 { | 8 { |
62 return new FakeFile(path); | 9 if (data.has(fileName)) |
10 return data.get(fileName).contents; | |
11 return null; | |
63 }, | 12 }, |
64 writeToFile(file, generator, callback) | 13 _setFileContents(fileName, contents) |
65 { | 14 { |
66 Promise.resolve().then(() => | 15 data.set(fileName, { |
16 lastModified: Date.now(), | |
17 contents | |
18 }); | |
19 }, | |
20 _getModifiedTime(fileName) | |
21 { | |
22 if (data.has(fileName)) | |
23 return data.get(fileName).lastModified; | |
24 return 0; | |
25 }, | |
26 _setModifiedTime(fileName, lastModified) | |
27 { | |
28 if (data.has(fileName)) | |
29 data.get(fileName).lastModified = lastModified; | |
30 }, | |
31 | |
32 // Public API | |
33 writeToFile(fileName, generator) | |
34 { | |
35 return Promise.resolve().then(() => | |
67 { | 36 { |
68 let lines = []; | 37 data.set(fileName, { |
69 for (let line of generator) | 38 lastModified: Date.now(), |
70 lines.push(line); | 39 contents: Array.from(generator) |
71 file.contents = lines.join("\n") + "\n"; | 40 }); |
72 }).then(() => callback(null)).catch(e => callback(e)); | 41 }); |
73 }, | 42 }, |
74 readFromFile(file, listener, callback) | 43 readFromFile(fileName, listener) |
75 { | 44 { |
76 Promise.resolve().then(() => | 45 return Promise.resolve().then(() => |
77 { | 46 { |
78 if (!data.hasOwnProperty(file.path)) | 47 if (!data.has(fileName)) |
79 throw new Error("File doesn't exist"); | 48 throw new Error("File doesn't exist"); |
80 | 49 |
81 let lines = file.contents.split("\n"); | 50 let lines = data.get(fileName).contents; |
82 if (lines.length && lines[lines.length - 1] == "") | |
83 lines.pop(); | |
84 for (let line of lines) | 51 for (let line of lines) |
85 listener.process(line); | 52 listener(line); |
86 listener.process(null); | 53 }); |
87 }).then(() => callback(null)).catch(e => callback(e)); | |
88 }, | 54 }, |
89 copyFile(from, to, callback) | 55 copyFile(fromName, toName) |
90 { | 56 { |
91 Promise.resolve().then(() => | 57 return Promise.resolve().then(() => |
92 { | 58 { |
93 if (!data.hasOwnProperty(from.path)) | 59 if (!data.has(fromName)) |
94 throw new Error("File doesn't exist"); | 60 throw new Error("File doesn't exist"); |
95 if (from.path == to.path) | 61 if (fromName == toName) |
96 throw new Error("Cannot copy file to itself"); | 62 throw new Error("Cannot copy file to itself"); |
97 | 63 |
98 to.contents = from.contents; | 64 data.set(toName, data.get(fromName)); |
99 }).then(() => callback(null)).catch(e => callback(e)); | 65 }); |
100 }, | 66 }, |
101 renameFile(from, newName, callback) | 67 renameFile(fromName, toName) |
102 { | 68 { |
103 Promise.resolve().then(() => | 69 return this.copyFile(fromName, toName).then(() => this.removeFile(fromName)) ; |
70 }, | |
71 removeFile(fileName) | |
72 { | |
73 return Promise.resolve().then(() => | |
104 { | 74 { |
105 if (!data.hasOwnProperty(from.path)) | 75 if (!data.has(fileName)) |
106 throw new Error("File doesn't exist"); | |
107 if (from.path == newName) | |
108 throw new Error("Cannot move file to itself"); | |
109 | |
110 data[newName] = data[from.path]; | |
111 delete data[from.path]; | |
112 }).then(() => callback(null)).catch(e => callback(e)); | |
113 }, | |
114 removeFile(file, callback) | |
115 { | |
116 Promise.resolve().then(() => | |
117 { | |
118 if (!data.hasOwnProperty(file.path)) | |
119 throw new Error("File doesn't exist"); | 76 throw new Error("File doesn't exist"); |
120 | 77 |
121 delete data[file.path]; | 78 data.delete(fileName); |
122 }).then(() => callback(null)).catch(e => callback(e)); | 79 }); |
123 }, | 80 }, |
124 statFile(file, callback) | 81 statFile(fileName) |
125 { | 82 { |
126 Promise.resolve().then(() => | 83 return Promise.resolve().then(() => |
127 { | 84 { |
128 if (file.exists()) | 85 if (data.has(fileName)) |
129 { | 86 { |
130 return { | 87 return { |
131 exists: true, | 88 exists: true, |
132 isDirectory: false, | 89 lastModified: data.get(fileName).lastModified |
133 isFile: true, | |
134 lastModified: file.lastModifiedTime | |
135 }; | 90 }; |
136 } | 91 } |
137 return { | 92 return { |
138 exists: false, | 93 exists: false, |
139 isDirectory: false, | |
140 isFile: false, | |
141 lastModified: 0 | 94 lastModified: 0 |
142 }; | 95 }; |
143 }).then(result => callback(null, result)).catch(e => callback(e)); | 96 }); |
144 } | 97 } |
145 }; | 98 }; |
OLD | NEW |