OLD | NEW |
1 (function() | 1 (function() |
2 { | 2 { |
3 module("Filter storage read/write", { | 3 module("Filter storage read/write", { |
4 setup: function() | 4 setup: function() |
5 { | 5 { |
6 prepareFilterComponents.call(this); | 6 prepareFilterComponents.call(this); |
7 preparePrefs.call(this); | 7 preparePrefs.call(this); |
8 | 8 |
9 FilterStorage.addSubscription(Subscription.fromURL("~fl~")); | 9 FilterStorage.addSubscription(Subscription.fromURL("~fl~")); |
10 }, | 10 }, |
(...skipping 15 matching lines...) Expand all Loading... |
26 { | 26 { |
27 FilterNotifier.removeListener(listener); | 27 FilterNotifier.removeListener(listener); |
28 callback(); | 28 callback(); |
29 } | 29 } |
30 }; | 30 }; |
31 FilterNotifier.addListener(listener); | 31 FilterNotifier.addListener(listener); |
32 | 32 |
33 FilterStorage.loadFromDisk(file); | 33 FilterStorage.loadFromDisk(file); |
34 } | 34 } |
35 | 35 |
| 36 function writeToFile(file, data) |
| 37 { |
| 38 let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createIns
tance(Ci.nsIScriptableUnicodeConverter); |
| 39 converter.charset = "utf-8"; |
| 40 data = converter.ConvertFromUnicode(data); |
| 41 |
| 42 let stream = FileUtils.openFileOutputStream(file); |
| 43 stream.write(data, data.length); |
| 44 stream.close(); |
| 45 } |
| 46 |
36 function saveFilters(file, callback) | 47 function saveFilters(file, callback) |
37 { | 48 { |
38 let listener = function(action) | 49 let listener = function(action) |
39 { | 50 { |
40 if (action == "save") | 51 if (action == "save") |
41 { | 52 { |
42 FilterNotifier.removeListener(listener); | 53 FilterNotifier.removeListener(listener); |
43 callback(); | 54 callback(); |
44 } | 55 } |
45 }; | 56 }; |
46 FilterNotifier.addListener(listener); | 57 FilterNotifier.addListener(listener); |
47 | 58 |
48 FilterStorage.saveToDisk(file); | 59 FilterStorage.saveToDisk(file); |
49 } | 60 } |
50 | 61 |
51 function testReadWrite(withExternal) | 62 function testReadWrite(withExternal) |
52 { | 63 { |
53 let tempFile = FileUtils.getFile("TmpD", ["temp_patterns.ini"]); | 64 let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); |
| 65 let tempFile2 = FileUtils.getFile("TmpD", ["temp_patterns2.ini"]); |
54 tempFile.createUnique(tempFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); | 66 tempFile.createUnique(tempFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); |
55 readFile(); | 67 createTempFile(); |
56 | 68 |
57 function canonize(data) | 69 function canonize(data) |
58 { | 70 { |
59 let curSection = null; | 71 let curSection = null; |
60 let sections = []; | 72 let sections = []; |
61 for each (let line in (data + "\n[end]").split(/[\r\n]+/)) | 73 for each (let line in (data + "\n[end]").split(/[\r\n]+/)) |
62 { | 74 { |
63 if (/^\[.*\]$/.test(line)) | 75 if (/^\[.*\]$/.test(line)) |
64 { | 76 { |
65 if (curSection) | 77 if (curSection) |
(...skipping 16 matching lines...) Expand all Loading... |
82 else if (a.key > b.key) | 94 else if (a.key > b.key) |
83 return 1; | 95 return 1; |
84 else | 96 else |
85 return 0; | 97 return 0; |
86 }); | 98 }); |
87 return sections.map(function(section) { | 99 return sections.map(function(section) { |
88 return [section.header].concat(section.data).join("\n"); | 100 return [section.header].concat(section.data).join("\n"); |
89 }).join("\n"); | 101 }).join("\n"); |
90 } | 102 } |
91 | 103 |
92 function readFile() | 104 function createTempFile() |
93 { | 105 { |
94 let source = Services.io.newURI("data/patterns.ini", null, Services.io.new
URI(window.location.href, null, null)); | 106 let request = new XMLHttpRequest(); |
95 loadFilters(source, saveFile); | 107 request.open("GET", "data/patterns.ini"); |
| 108 request.overrideMimeType("text/plain; charset=utf-8"); |
| 109 request.addEventListener("load", function() |
| 110 { |
| 111 writeToFile(tempFile, request.responseText); |
| 112 loadFilters(tempFile, saveFile); |
| 113 }, false); |
| 114 request.send(null); |
96 } | 115 } |
97 | 116 |
98 function saveFile() | 117 function saveFile() |
99 { | 118 { |
100 equal(FilterStorage.fileProperties.version, FilterStorage.formatVersion, "
File format version"); | 119 equal(FilterStorage.fileProperties.version, FilterStorage.formatVersion, "
File format version"); |
101 | 120 |
102 if (withExternal) | 121 if (withExternal) |
103 { | 122 { |
104 let {AdblockPlus} = Cu.import(Cc["@adblockplus.org/abp/public;1"].getSer
vice(Ci.nsIURI).spec, null); | 123 let {AdblockPlus} = Cu.import(Cc["@adblockplus.org/abp/public;1"].getSer
vice(Ci.nsIURI).spec, null); |
105 AdblockPlus.updateExternalSubscription("~external~external subscription
ID", "External subscription", ["foo", "bar"]); | 124 AdblockPlus.updateExternalSubscription("~external~external subscription
ID", "External subscription", ["foo", "bar"]); |
106 | 125 |
107 let externalSubscriptions = FilterStorage.subscriptions.filter(function
(subscription) subscription instanceof ExternalSubscription); | 126 let externalSubscriptions = FilterStorage.subscriptions.filter(function
(subscription) subscription instanceof ExternalSubscription); |
108 equal(externalSubscriptions.length, 1, "Number of external subscriptions
after updateExternalSubscription"); | 127 equal(externalSubscriptions.length, 1, "Number of external subscriptions
after updateExternalSubscription"); |
109 | 128 |
110 if (externalSubscriptions.length == 1) | 129 if (externalSubscriptions.length == 1) |
111 { | 130 { |
112 equal(externalSubscriptions[0].url, "~external~external subscription I
D", "ID of external subscription"); | 131 equal(externalSubscriptions[0].url, "~external~external subscription I
D", "ID of external subscription"); |
113 equal(externalSubscriptions[0].filters.length, 2, "Number of filters i
n external subscription"); | 132 equal(externalSubscriptions[0].filters.length, 2, "Number of filters i
n external subscription"); |
114 } | 133 } |
115 } | 134 } |
116 | 135 |
117 saveFilters(tempFile, compareFile); | 136 saveFilters(tempFile2, compareFile); |
118 } | 137 } |
119 | 138 |
120 function compareFile() | 139 function compareFile() |
121 { | 140 { |
122 let stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance
(Ci.nsIFileInputStream); | 141 let stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance
(Ci.nsIFileInputStream); |
123 stream.init(tempFile, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, Ci.nsIF
ileInputStream.DEFER_OPEN); | 142 stream.init(tempFile2, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, Ci.nsI
FileInputStream.DEFER_OPEN); |
124 | 143 |
125 NetUtil.asyncFetch(stream, function(inputStream, nsresult) | 144 NetUtil.asyncFetch(stream, function(inputStream, nsresult) |
126 { | 145 { |
127 let result = NetUtil.readInputStreamToString(inputStream, inputStream.av
ailable(), {charset: "utf-8"}); | 146 let result = NetUtil.readInputStreamToString(inputStream, inputStream.av
ailable(), {charset: "utf-8"}); |
128 | 147 |
129 let request = new XMLHttpRequest(); | 148 let request = new XMLHttpRequest(); |
130 request.open("GET", "data/patterns.ini"); | 149 request.open("GET", "data/patterns.ini"); |
131 request.overrideMimeType("text/plain"); | 150 request.overrideMimeType("text/plain"); |
132 request.addEventListener("load", function() | 151 request.addEventListener("load", function() |
133 { | 152 { |
134 let expected = request.responseText; | 153 let expected = request.responseText; |
135 equal(canonize(result), canonize(expected), "Read/write result"); | 154 equal(canonize(result), canonize(expected), "Read/write result"); |
136 | 155 |
137 tempFile.remove(false); | 156 tempFile.remove(false); |
| 157 tempFile2.remove(false); |
138 start(); | 158 start(); |
139 }, false); | 159 }, false); |
140 request.send(null); | 160 request.send(null); |
141 }); | 161 }); |
142 } | 162 } |
143 } | 163 } |
144 | 164 |
145 asyncTest("Read from URL, write to file", testReadWrite.bind(false)); | 165 asyncTest("Read and save to file", testReadWrite.bind(false)); |
146 asyncTest("Read from URL, add external subscription, write to file", testReadW
rite.bind(true)); | 166 asyncTest("Read, add external subscription and save to file", testReadWrite.bi
nd(true)); |
147 | 167 |
148 let groupTests = [ | 168 let groupTests = [ |
149 ["~wl~", "whitelist"], | 169 ["~wl~", "whitelist"], |
150 ["~fl~", "blocking"], | 170 ["~fl~", "blocking"], |
151 ["~eh~", "elemhide"] | 171 ["~eh~", "elemhide"] |
152 ]; | 172 ]; |
153 for (let i = 0; i < groupTests.length; i++) | 173 for (let i = 0; i < groupTests.length; i++) |
154 { | 174 { |
155 let [url, defaults] = groupTests[i]; | 175 let [url, defaults] = groupTests[i]; |
156 asyncTest("Read empty legacy user-defined group (" + url + ")", function() | 176 asyncTest("Read empty legacy user-defined group (" + url + ")", function() |
157 { | 177 { |
158 let data = "[Subscription]\nurl=" + url; | 178 let data = "[Subscription]\nurl=" + url; |
159 let source = "data:text/plain;charset=utf-8," + encodeURIComponent(data); | 179 let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); |
160 loadFilters(Services.io.newURI(source, null, null), function() | 180 writeToFile(tempFile, data); |
| 181 |
| 182 loadFilters(tempFile, function() |
161 { | 183 { |
| 184 tempFile.remove(false); |
162 equal(FilterStorage.subscriptions.length, 0, "Number of filter subscript
ions"); | 185 equal(FilterStorage.subscriptions.length, 0, "Number of filter subscript
ions"); |
163 start(); | 186 start(); |
164 }); | 187 }); |
165 }); | 188 }); |
166 asyncTest("Read non-empty legacy user-defined group (" + url + ")", function
() | 189 asyncTest("Read non-empty legacy user-defined group (" + url + ")", function
() |
167 { | 190 { |
168 let data = "[Subscription]\nurl=" + url + "\n[Subscription filters]\nfoo"; | 191 let data = "[Subscription]\nurl=" + url + "\n[Subscription filters]\nfoo"; |
169 let source = "data:text/plain;charset=utf-8," + encodeURIComponent(data); | 192 let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); |
170 loadFilters(Services.io.newURI(source, null, null), function() | 193 writeToFile(tempFile, data); |
| 194 |
| 195 loadFilters(tempFile, function() |
171 { | 196 { |
| 197 tempFile.remove(false); |
172 equal(FilterStorage.subscriptions.length, 1, "Number of filter subscript
ions"); | 198 equal(FilterStorage.subscriptions.length, 1, "Number of filter subscript
ions"); |
173 if (FilterStorage.subscriptions.length == 1) | 199 if (FilterStorage.subscriptions.length == 1) |
174 { | 200 { |
175 let subscription = FilterStorage.subscriptions[0]; | 201 let subscription = FilterStorage.subscriptions[0]; |
176 equal(subscription.url, url, "Subscription ID"); | 202 equal(subscription.url, url, "Subscription ID"); |
177 equal(subscription.title, Utils.getString(defaults + "Group_title"), "
Subscription title"); | 203 equal(subscription.title, Utils.getString(defaults + "Group_title"), "
Subscription title"); |
178 deepEqual(subscription.defaults, [defaults], "Default types"); | 204 deepEqual(subscription.defaults, [defaults], "Default types"); |
179 equal(subscription.filters.length, 1, "Number of subscription filters"
); | 205 equal(subscription.filters.length, 1, "Number of subscription filters"
); |
180 if (subscription.filters.length == 1) | 206 if (subscription.filters.length == 1) |
181 equal(subscription.filters[0].text, "foo", "First filter"); | 207 equal(subscription.filters[0].text, "foo", "First filter"); |
182 } | 208 } |
183 start(); | 209 start(); |
184 }); | 210 }); |
185 }); | 211 }); |
186 } | 212 } |
187 | 213 |
188 asyncTest("Read legacy user-defined filters", function() | 214 asyncTest("Read legacy user-defined filters", function() |
189 { | 215 { |
190 let data = "[Subscription]\nurl=~user~1234\ntitle=Foo\n[Subscription filters
]\n[User patterns]\nfoo\n\\[bar]\nfoo#bar"; | 216 let data = "[Subscription]\nurl=~user~1234\ntitle=Foo\n[Subscription filters
]\n[User patterns]\nfoo\n\\[bar]\nfoo#bar"; |
191 let source = "data:text/plain;charset=utf-8," + encodeURIComponent(data); | 217 let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); |
192 loadFilters(Services.io.newURI(source, null, null), function() | 218 writeToFile(tempFile, data); |
| 219 |
| 220 loadFilters(tempFile, function() |
193 { | 221 { |
| 222 tempFile.remove(false); |
194 equal(FilterStorage.subscriptions.length, 1, "Number of filter subscriptio
ns"); | 223 equal(FilterStorage.subscriptions.length, 1, "Number of filter subscriptio
ns"); |
195 if (FilterStorage.subscriptions.length == 1) | 224 if (FilterStorage.subscriptions.length == 1) |
196 { | 225 { |
197 let subscription = FilterStorage.subscriptions[0]; | 226 let subscription = FilterStorage.subscriptions[0]; |
198 equal(subscription.filters.length, 3, "Number of subscription filters"); | 227 equal(subscription.filters.length, 3, "Number of subscription filters"); |
199 if (subscription.filters.length == 3) | 228 if (subscription.filters.length == 3) |
200 { | 229 { |
201 equal(subscription.filters[0].text, "foo", "First filter"); | 230 equal(subscription.filters[0].text, "foo", "First filter"); |
202 equal(subscription.filters[1].text, "[bar]", "Second filter"); | 231 equal(subscription.filters[1].text, "[bar]", "Second filter"); |
203 equal(subscription.filters[2].text, "foo#bar", "Third filter"); | 232 equal(subscription.filters[2].text, "foo#bar", "Third filter"); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 } catch (e) {} | 349 } catch (e) {} |
321 try | 350 try |
322 { | 351 { |
323 backupFile3.remove(false); | 352 backupFile3.remove(false); |
324 } catch (e) {} | 353 } catch (e) {} |
325 | 354 |
326 start(); | 355 start(); |
327 } | 356 } |
328 }); | 357 }); |
329 })(); | 358 })(); |
OLD | NEW |