OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 "use strict"; | 18 "use strict"; |
19 | 19 |
20 const TEST_PAGES_URL = "https://testpages.adblockplus.org/"; | 20 const TEST_PAGES_URL = "https://testpages.adblockplus.org/"; |
21 | 21 |
22 const assert = require("assert"); | 22 const assert = require("assert"); |
23 const Jimp = require("jimp"); | 23 const Jimp = require("jimp"); |
24 const {By} = require("selenium-webdriver"); | 24 const {By} = require("selenium-webdriver"); |
25 | 25 |
| 26 // Once we require Node.js >= 10 this should be replaced with |
| 27 // the built-in finally() method of the Promise object. |
| 28 function promiseFinally(p, callback) |
| 29 { |
| 30 return p.then(callback, callback); |
| 31 } |
| 32 |
| 33 function closeWindow(driver, goTo, returnTo, callback) |
| 34 { |
| 35 return promiseFinally( |
| 36 driver.switchTo().window(goTo).then(() => |
| 37 promiseFinally( |
| 38 new Promise(resolve => resolve(callback && callback())), |
| 39 () => driver.close() |
| 40 ) |
| 41 ), |
| 42 () => driver.switchTo().window(returnTo) |
| 43 ); |
| 44 } |
| 45 |
| 46 function testSubscribeLink(driver) |
| 47 { |
| 48 return driver.findElement(By.id("subscribe-button")).click().then(() => |
| 49 driver.wait(() => |
| 50 driver.getAllWindowHandles().then(handles => |
| 51 handles.length > 2 ? handles : null |
| 52 ), 1000 |
| 53 ) |
| 54 ).then(handles => |
| 55 closeWindow(driver, handles[2], handles[1], () => |
| 56 driver.switchTo().frame(0).then(() => |
| 57 driver.findElement(By.id("dialog-content-predefined")) |
| 58 ).then(dialog => |
| 59 Promise.all([ |
| 60 dialog.isDisplayed(), |
| 61 dialog.findElement(By.css("h3")).getText() |
| 62 ]).then(([displayed, title]) => |
| 63 { |
| 64 assert.ok(displayed, "subscribe link: dialog shown"); |
| 65 assert.equal(title, "ABP Testcase Subscription", |
| 66 "subscribe link: title shown in dialog"); |
| 67 |
| 68 return dialog.findElement(By.css("button")).click(); |
| 69 }) |
| 70 ).then(() => |
| 71 driver.executeAsyncScript(` |
| 72 let callback = arguments[arguments.length - 1]; |
| 73 browser.runtime.sendMessage({type: "subscriptions.get", |
| 74 ignoreDisabled: true, |
| 75 downloadable: true}).then(subs => |
| 76 subs.some(s => |
| 77 s.url.endsWith("${TEST_PAGES_URL.replace(/^[^:]+/, "")}" + |
| 78 "abp-testcase-subscription.txt") |
| 79 ) |
| 80 ).then( |
| 81 res => callback([res, null]), |
| 82 err => callback([null, err]) |
| 83 ); |
| 84 `) |
| 85 ).then(([added, err]) => |
| 86 { |
| 87 if (err) |
| 88 throw err; |
| 89 assert.ok(added, "subscribe link: subscription added"); |
| 90 }) |
| 91 ) |
| 92 ); |
| 93 } |
| 94 |
26 function imageFromBase64(s) | 95 function imageFromBase64(s) |
27 { | 96 { |
28 return Jimp.read(Buffer.from(s, "base64")); | 97 return Jimp.read(Buffer.from(s, "base64")); |
29 } | 98 } |
30 | 99 |
31 function takeScreenshot(element) | 100 function takeScreenshot(element) |
32 { | 101 { |
33 return element.takeScreenshot().then( | 102 return element.takeScreenshot().then( |
34 imageFromBase64, | 103 imageFromBase64, |
35 | 104 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 } | 143 } |
75 | 144 |
76 it("test pages", function() | 145 it("test pages", function() |
77 { | 146 { |
78 return this.driver.navigate().to(TEST_PAGES_URL).then(() => | 147 return this.driver.navigate().to(TEST_PAGES_URL).then(() => |
79 this.driver.findElements(By.css(".site-pagelist a")) | 148 this.driver.findElements(By.css(".site-pagelist a")) |
80 ).then(elements => | 149 ).then(elements => |
81 Promise.all(elements.map(elem => elem.getAttribute("href"))) | 150 Promise.all(elements.map(elem => elem.getAttribute("href"))) |
82 ).then(urls => | 151 ).then(urls => |
83 { | 152 { |
84 let p1 = Promise.resolve(); | 153 let p1 = testSubscribeLink(this.driver); |
85 for (let url of urls) | 154 for (let url of urls) |
86 p1 = p1.then(() => | 155 p1 = p1.then(() => |
87 this.driver.navigate().to(url) | 156 this.driver.navigate().to(url) |
88 ).then(() => | 157 ).then(() => |
89 Promise.all([ | 158 Promise.all([ |
90 getSections(this.driver), | 159 getSections(this.driver), |
91 this.driver.findElement(By.css("h2")).getAttribute("textContent"), | 160 this.driver.findElement(By.css("h2")).getAttribute("textContent"), |
92 this.driver.executeScript("document.body.classList.add('expected');") | 161 this.driver.executeScript("document.body.classList.add('expected');") |
93 ]) | 162 ]) |
94 ).then(([sections, pageTitle]) => | 163 ).then(([sections, pageTitle]) => |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 By.css("a[href],button") | 218 By.css("a[href],button") |
150 ).click().then(() => | 219 ).click().then(() => |
151 this.driver.sleep(100) | 220 this.driver.sleep(100) |
152 ).then(() => | 221 ).then(() => |
153 this.driver.getAllWindowHandles() | 222 this.driver.getAllWindowHandles() |
154 ).then(handles => | 223 ).then(handles => |
155 { | 224 { |
156 if (title.startsWith("$popup Exception -")) | 225 if (title.startsWith("$popup Exception -")) |
157 { | 226 { |
158 assert.equal(handles.length, 3, title); | 227 assert.equal(handles.length, 3, title); |
159 | 228 return closeWindow(this.driver, handles[2], handles[1]); |
160 return this.driver.switchTo().window(handles[2]).then(() => | |
161 this.driver.close() | |
162 ).then(() => | |
163 this.driver.switchTo().window(handles[1]) | |
164 ); | |
165 } | 229 } |
166 | 230 |
167 assert.equal(handles.length, 2, title); | 231 assert.equal(handles.length, 2, title); |
168 }); | 232 }); |
169 } | 233 } |
170 | 234 |
171 return takeScreenshot(element).then(screenshot => | 235 return takeScreenshot(element).then(screenshot => |
172 assert.ok( | 236 assert.ok( |
173 screenshot.width == expectedScreenshot.width && | 237 screenshot.width == expectedScreenshot.width && |
174 screenshot.height == expectedScreenshot.height && | 238 screenshot.height == expectedScreenshot.height && |
175 screenshot.data.compare(expectedScreenshot.data) == 0, | 239 screenshot.data.compare(expectedScreenshot.data) == 0, |
176 title | 240 title |
177 ) | 241 ) |
178 ); | 242 ); |
179 }); | 243 }); |
180 } | 244 } |
181 return p2; | 245 return p2; |
182 }); | 246 }); |
183 return p1; | 247 return p1; |
184 }); | 248 }); |
185 }); | 249 }); |
OLD | NEW |