Index: chrome/content/tests/popupBlocker.js |
=================================================================== |
--- a/chrome/content/tests/popupBlocker.js |
+++ b/chrome/content/tests/popupBlocker.js |
@@ -1,11 +1,12 @@ |
(function() |
{ |
+ let tabs = SDK.require("sdk/tabs"); |
+ let modelFor = SDK.require("sdk/model/core").modelFor; |
Erik
2015/12/04 20:58:33
oh I should remove this.
|
let server = null; |
- let wnd = null; |
let tab = null; |
module("Pop-up blocker", { |
- setup: function() |
+ beforeEach: function() |
{ |
prepareFilterComponents.call(this, true); |
preparePrefs.call(this); |
@@ -13,22 +14,27 @@ |
server = new nsHttpServer(); |
server.start(1234); |
+ // '/test' serves an html page with a single link |
server.registerPathHandler("/test", function(metadata, response) |
{ |
response.setStatusLine("1.1", "200", "OK"); |
response.setHeader("Content-Type", "text/html; charset=utf-8"); |
let body = |
- '<body onload="document.dispatchEvent(new CustomEvent(\'abp:frameready\', {bubbles: true}));">' + |
+ '<body>' + |
'<a id="link" href="/redirect" target="_blank">link</a>' + |
'</body>'; |
response.bodyOutputStream.write(body, body.length); |
}); |
+ |
+ // redirects '/redirect' to '/target' |
server.registerPathHandler("/redirect", function(metadata, response) |
{ |
response.setStatusLine("1.1", "302", "Moved Temporarily"); |
response.setHeader("Location", "http://127.0.0.1:1234/target"); |
}); |
+ |
+ // '/target' serves an html page with 'OK' message |
server.registerPathHandler("/target", function(metadata, response) |
{ |
response.setHeader("Content-Type", "text/html; charset=utf-8"); |
@@ -37,16 +43,30 @@ |
response.bodyOutputStream.write(body, body.length); |
}); |
- wnd = UI.currentWindow; |
- tab = wnd.gBrowser.loadOneTab("http://127.0.0.1:1234/test", {inBackground: false}); |
- wnd.gBrowser.getBrowserForTab(tab).addEventListener("abp:frameready", function(event) |
- { |
- start(); |
- }, false, true); |
+ tabs.open({ |
+ url: "http://127.0.0.1:1234/test", |
+ inBackground: false, |
+ onReady: function(aTab) |
+ { |
+ tab = aTab; |
+ var worker = tab.attach({ |
+ contentScript: "(" + function() |
+ { |
+ if (document.getElementById("link")) |
+ self.port.emit("done"); |
+ } + ")()" |
+ }); |
Wladimir Palant
2015/12/14 11:28:53
I don't think that clicking the link should be par
|
+ |
+ worker.port.once("done", function() |
+ { |
+ start(); |
+ }) |
Wladimir Palant
2015/12/14 11:28:53
Nit: No need to wrap the callback here, this will
|
+ } |
+ }); |
stop(); |
}, |
- teardown: function() |
+ afterEach: function() |
{ |
restoreFilterComponents.call(this); |
restorePrefs.call(this); |
@@ -54,71 +74,109 @@ |
stop(); |
server.stop(function() |
{ |
- wnd.gBrowser.removeTab(tab); |
- |
- server = null; |
- frame = null; |
- |
- start(); |
+ tab.close(function() |
+ { |
+ server = null; |
+ start(); |
+ }); |
}); |
} |
}); |
let tests = [ |
- ["||127.0.0.1:1234/target$popup", false], |
+ // filter says '/target' as a popup should be blocked |
+ // expect no opened tab |
Wladimir Palant
2015/12/14 11:28:52
Frankly, I think that this is overdocumenting. I w
Erik
2015/12/29 22:49:40
We can leave this for another issue, I'll take it
|
+ //["||127.0.0.1:1234/target$popup", false], |
Wladimir Palant
2015/12/14 11:28:53
Why is this test commented out, isn't it working c
Erik
2015/12/29 22:49:40
oh I didn't notice that I did that, iirc I comment
|
+ // filter says '/target' as a subdoc should be blocked |
+ // expect to find OK message in opened tab (b/c popup is not blocked) |
["||127.0.0.1:1234/target$~subdocument", true], |
+ // filter says '/target' as a popup should be blocked from domain 127.0.0.1 |
+ // expect no opened tab |
["||127.0.0.1:1234/target$popup,domain=127.0.0.1", false], |
+ // filter says '/target' as a popup should be blocked from domain 128.0.0.1 |
+ // expect to find OK message in opened tab (b/c popup is not blocked) |
["||127.0.0.1:1234/target$popup,domain=128.0.0.1", true], |
+ // filter says '/redirect' as a popup should be blocked |
+ // expect no opened tab |
["||127.0.0.1:1234/redirect$popup", false], |
+ // filter says '/redirect' as a subdocument should be blocked |
+ // expect to find OK message in opened tab (b/c popup is not blocked) |
["||127.0.0.1:1234/redirect$~subdocument", true], |
+ // filter says '/redirect' as a popup should be blocked from domain 127.0.0.1 |
+ // expect no opened tab |
["||127.0.0.1:1234/redirect$popup,domain=127.0.0.1", false], |
+ // filter says '/redirect' as a popup should be blocked from domain 128.0.0.1 |
+ // expect to find OK message in opened tab (b/c popup is not blocked) |
["||127.0.0.1:1234/redirect$popup,domain=128.0.0.1", true], |
]; |
+ var testCount = 0; |
Wladimir Palant
2015/12/14 11:28:52
This variable seems unused.
|
function runTest(filter, result) |
{ |
+ tabs.off("ready", onTabOpen); |
Wladimir Palant
2015/12/14 11:28:53
This seems pointless, why would there be an existi
Erik
2015/12/29 22:49:40
This should be in `onTabOpen`.
|
FilterStorage.addFilter(filter); |
let successful = false; |
- function onTabOpen(event) |
- { |
+ function onTabOpen(tab) { |
Wladimir Palant
2015/12/14 11:28:52
Style nit: Bracket on the next line please.
|
+ // link in '/test' was clicked |
+ tab.on("close", onTabClose); |
window.clearTimeout(timeout); |
- wnd.gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen, false); |
- let tab = event.target; |
- let browser = wnd.gBrowser.getBrowserForTab(tab); |
- Utils.runAsync(function() |
+ var worker = tab.attach({ |
+ contentScriptWhen: "ready", |
+ contentScript: "self.port.emit('done', document.body.innerHTML.toString());" |
Wladimir Palant
2015/12/14 11:28:52
No point calling toString() here - innerHTML is al
Erik
2015/12/29 22:49:40
good point.
|
+ }); |
+ |
+ worker.port.once("done", function(bodyText) |
{ |
- browser.contentWindow.addEventListener("load", function(event) |
- { |
- if (browser.contentDocument.body.textContent.indexOf("OK") >= 0) |
- successful = true; |
+ if (bodyText.indexOf("OK") >= 0) |
+ successful = true; |
- browser.contentWindow.close(); |
- }, false); |
+ // pop-up was not blocked so close it |
+ tab.close(); |
}); |
} |
+ tabs.on("ready", onTabOpen); |
- function onTabClose(event) |
+ function onTabClose(tab) |
{ |
- wnd.gBrowser.tabContainer.removeEventListener("TabClose", onTabClose, false); |
+ tabs.off("ready", onTabOpen); |
+ if (tab) |
+ tab.off("close", onTabClose); |
+ |
ok(result == successful, "Opening tab with filter " + filter.text); |
+ |
var keys = []; |
for (let key in defaultMatcher.blacklist.keywordByFilter) |
keys.push(key); |
Wladimir Palant
2015/12/14 11:28:52
I have no idea why this code is here, it isn't bei
Erik
2015/12/29 22:49:40
alright it doesn't seem to be used to me either.
|
FilterStorage.removeFilter(filter); |
+ |
start(); |
} |
- wnd.gBrowser.tabContainer.addEventListener("TabOpen", onTabOpen, false); |
- wnd.gBrowser.tabContainer.addEventListener("TabClose", onTabClose, false); |
- let timeout = window.setTimeout(onTabClose, 1000); // In case the tab isn't opened |
+ // In case the tab isn't opened |
+ var timeout = window.setTimeout(function() |
+ { |
+ onTabClose(); |
+ }, 1000); |
Wladimir Palant
2015/12/14 11:28:52
Nit: no point wrapping the callback here either. T
|
- wnd.gBrowser.getBrowserForTab(tab).contentDocument.getElementById("link").click(); |
+ // click the link in the '/test' tab opened before the test |
+ var worker = tab.attach({ |
+ contentScriptWhen: "ready", |
+ contentScriptOptions: { |
+ filter: filter.toString() |
+ }, |
Wladimir Palant
2015/12/14 11:28:52
The content script doesn't need any options...
|
+ contentScript: "(" + function() |
+ { |
+ document.getElementById('link').click(); |
+ } + ")()" |
+ //contentScript: "document.getElementById('link').click();" |
Wladimir Palant
2015/12/14 11:28:52
Please remove this line.
|
+ }); |
} |
+ // create async qunit tests |
Wladimir Palant
2015/12/14 11:28:52
This is stating the obvious again.
|
for (let [filter, result] of tests) |
asyncTest(filter, runTest.bind(null, Filter.fromText(filter), result)); |
})(); |