| OLD | NEW |
| 1 (function() | 1 (function() |
| 2 { | 2 { |
| 3 let server = null; | 3 let server = null; |
| 4 let frame = null; | 4 let frame = null; |
| 5 let requestNotifier = null; | 5 let requestNotifier = null; |
| 6 let httpProtocol = null; | 6 let httpProtocol = null; |
| 7 | 7 |
| 8 module("Content policy", { | 8 module("Content policy", { |
| 9 setup: function() | 9 setup: function() |
| 10 { | 10 { |
| 11 prepareFilterComponents.call(this); | 11 prepareFilterComponents.call(this); |
| 12 preparePrefs.call(this); | 12 preparePrefs.call(this); |
| 13 | 13 |
| 14 server = new nsHttpServer(); | 14 server = new nsHttpServer(); |
| 15 server.start(1234); | 15 server.start(1234); |
| 16 | 16 |
| 17 frame = document.createElementNS("http://www.mozilla.org/keymaster/gatekee
per/there.is.only.xul", "iframe"); | 17 frame = document.createElementNS("http://www.mozilla.org/keymaster/gatekee
per/there.is.only.xul", "browser"); |
| 18 frame.setAttribute("type", "content"); | 18 frame.setAttribute("type", "content"); |
| 19 frame.setAttribute("disablehistory", "true"); |
| 19 frame.style.visibility = "collapse"; | 20 frame.style.visibility = "collapse"; |
| 20 document.body.appendChild(frame); | 21 document.body.appendChild(frame); |
| 21 | 22 |
| 22 requestNotifier = new RequestNotifier(frame.contentWindow, onPolicyHit); | 23 requestNotifier = new RequestNotifier(frame.outerWindowID, onPolicyHit); |
| 23 | 24 |
| 24 httpProtocol = Utils.httpProtocol; | 25 httpProtocol = Utils.httpProtocol; |
| 25 Utils.httpProtocol = {userAgent: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64;
rv:30.0) Gecko/20100101 Firefox/30.0"}; | 26 Utils.httpProtocol = {userAgent: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64;
rv:30.0) Gecko/20100101 Firefox/30.0"}; |
| 26 }, | 27 }, |
| 27 teardown: function() | 28 teardown: function() |
| 28 { | 29 { |
| 29 restoreFilterComponents.call(this); | 30 restoreFilterComponents.call(this); |
| 30 restorePrefs.call(this); | 31 restorePrefs.call(this); |
| 31 | 32 |
| 32 stop(); | 33 stop(); |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 "http://127.0.0.1:1234/test.class", "object", false, false | 264 "http://127.0.0.1:1234/test.class", "object", false, false |
| 264 ], | 265 ], |
| 265 [ | 266 [ |
| 266 "HTML object (Java)", | 267 "HTML object (Java)", |
| 267 '<object type="application/x-java-applet" data="test.class"></object>', | 268 '<object type="application/x-java-applet" data="test.class"></object>', |
| 268 "http://127.0.0.1:1234/test.class", "object", false, false | 269 "http://127.0.0.1:1234/test.class", "object", false, false |
| 269 ]); | 270 ]); |
| 270 } | 271 } |
| 271 | 272 |
| 272 let policyHits = []; | 273 let policyHits = []; |
| 273 function onPolicyHit(wnd, node, item, scanComplete) | 274 function onPolicyHit(item, scanComplete) |
| 274 { | 275 { |
| 275 if (!item) | 276 if (!item) |
| 276 return; | 277 return; |
| 277 if (item.location == "http://127.0.0.1:1234/test" || | 278 if (item.location == "http://127.0.0.1:1234/test" || |
| 278 item.location == "http://127.0.0.1:1234/redirect.gif" || | 279 item.location == "http://127.0.0.1:1234/redirect.gif" || |
| 279 item.location == "http://127.0.0.1:1234/redirect2.gif") | 280 item.location == "http://127.0.0.1:1234/redirect2.gif") |
| 280 { | 281 { |
| 281 return; | 282 return; |
| 282 } | 283 } |
| 283 if (item.filter instanceof WhitelistFilter) | 284 if (item.filter && item.filter.substr(0, 2) == "@@") |
| 284 return; | 285 return; |
| 285 | 286 |
| 286 if (policyHits.length > 0) | 287 if (policyHits.length > 0) |
| 287 { | 288 { |
| 288 // Ignore duplicate policy calls (possible due to prefetching) | 289 // Ignore duplicate policy calls (possible due to prefetching) |
| 289 let [prevWnd, prevNode, prevItem] = policyHits[policyHits.length - 1]; | 290 let prevItem = policyHits[policyHits.length - 1]; |
| 290 if (prevWnd == wnd && prevItem.location == item.location && prevItem.type
== item.type && prevItem.docDomain == item.docDomain) | 291 if (prevItem.location == item.location && prevItem.type == item.type && pr
evItem.docDomain == item.docDomain) |
| 291 policyHits.pop(); | 292 policyHits.pop(); |
| 292 } | 293 } |
| 293 policyHits.push([wnd, node, item]); | 294 policyHits.push(item); |
| 294 } | 295 } |
| 295 | 296 |
| 296 function runTest([name, body, expectedURL, expectedType, expectedThirdParty, e
xplicitEvent], stage) | 297 function runTest([name, body, expectedURL, expectedType, expectedThirdParty, e
xplicitEvent], stage) |
| 297 { | 298 { |
| 298 defaultMatcher.clear(); | 299 defaultMatcher.clear(); |
| 299 | 300 |
| 300 if (stage == 7) | 301 if (stage == 7) |
| 301 defaultMatcher.add(Filter.fromText(expectedURL + "$domain=127.0.0.1")); | 302 defaultMatcher.add(Filter.fromText(expectedURL + "$domain=127.0.0.1")); |
| 302 else if (stage > 1) | 303 else if (stage > 1) |
| 303 defaultMatcher.add(Filter.fromText(expectedURL)); | 304 defaultMatcher.add(Filter.fromText(expectedURL)); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 serverHit = true; | 361 serverHit = true; |
| 361 response.setStatusLine("1.1", "404", "Not Found"); | 362 response.setStatusLine("1.1", "404", "Not Found"); |
| 362 response.setHeader("Content-Type", "text/html"); | 363 response.setHeader("Content-Type", "text/html"); |
| 363 | 364 |
| 364 // Work around weird Firefox behavior, where worker scripts succesfully lo
ad with empty 404 pages. | 365 // Work around weird Firefox behavior, where worker scripts succesfully lo
ad with empty 404 pages. |
| 365 var error = "<b>Not found...<b>"; | 366 var error = "<b>Not found...<b>"; |
| 366 response.bodyOutputStream.write(error, error.length); | 367 response.bodyOutputStream.write(error, error.length); |
| 367 }); | 368 }); |
| 368 | 369 |
| 369 policyHits = []; | 370 policyHits = []; |
| 370 var callback = function() | 371 let callback = function() |
| 371 { | 372 { |
| 373 frame.messageManager.removeMessageListener("ready", callback); |
| 374 |
| 372 let expectedStatus = "allowed"; | 375 let expectedStatus = "allowed"; |
| 373 if (stage == 3) | 376 if (stage == 3) |
| 374 equal(policyHits.length, 0, "Number of policy hits"); | 377 equal(policyHits.length, 0, "Number of policy hits"); |
| 375 // We cannot rely on the correctness of policy hits for sitekey filters du
e to blocking | 378 // We cannot rely on the correctness of policy hits for sitekey filters du
e to blocking |
| 376 // filter hits being counted even if the resource doesn't end up getting b
locked | 379 // filter hits being counted even if the resource doesn't end up getting b
locked |
| 377 else if (stage != 5 && stage != 6 && stage != 8) | 380 else if (stage != 5 && stage != 6 && stage != 8) |
| 378 { | 381 { |
| 379 equal(policyHits.length, 1, "Number of policy hits"); | 382 equal(policyHits.length, 1, "Number of policy hits"); |
| 380 if (policyHits.length == 1) | 383 if (policyHits.length == 1) |
| 381 { | 384 { |
| 382 let [wnd, node, item] = policyHits[0]; | 385 let item = policyHits[0]; |
| 383 | 386 |
| 384 equal(item.location, expectedURL, "Request URL"); | 387 equal(item.location, expectedURL, "Request URL"); |
| 385 | 388 |
| 386 expectedStatus = (stage == 1 ? "allowed" : "blocked"); | 389 expectedStatus = (stage == 1 ? "allowed" : "blocked"); |
| 387 let actualStatus = (item.filter ? "blocked" : "allowed"); | 390 let actualStatus = (item.filter ? "blocked" : "allowed"); |
| 388 | 391 |
| 389 equal(actualStatus, expectedStatus, "Request blocked"); | 392 equal(actualStatus, expectedStatus, "Request blocked"); |
| 390 equal(item.type.toLowerCase(), expectedType, "Request type"); | 393 equal(item.type.toLowerCase(), expectedType, "Request type"); |
| 391 equal(item.thirdParty, expectedThirdParty, "Third-party flag"); | 394 equal(item.thirdParty, expectedThirdParty, "Third-party flag"); |
| 392 equal(item.docDomain, "127.0.0.1", "Document domain"); | 395 equal(item.docDomain, "127.0.0.1", "Document domain"); |
| 393 } | 396 } |
| 394 } | 397 } |
| 395 server.registerPathHandler(expectedURL.replace(/http:\/\/[^\/]+/, ""), nul
l); | 398 server.registerPathHandler(expectedURL.replace(/http:\/\/[^\/]+/, ""), nul
l); |
| 396 equal(serverHit, expectedStatus == "allowed", "Request received by server"
); | 399 equal(serverHit, expectedStatus == "allowed", "Request received by server"
); |
| 397 | 400 |
| 398 frame.removeEventListener("abp:frameready", callback, false); | |
| 399 | |
| 400 start(); | 401 start(); |
| 401 }; | 402 }; |
| 402 frame.addEventListener("abp:frameready", callback, false, true); | 403 let callback2 = function() |
| 404 { |
| 405 // The frame will report hits asynchronously so make the frame send us a |
| 406 // message and only process the results after it is received. |
| 407 frame.removeEventListener("abp:frameready", callback2, false); |
| 408 frame.messageManager.addMessageListener("ready", callback); |
| 409 frame.messageManager.loadFrameScript("data:text/javascript,sendAsyncMessag
e('ready')", false); |
| 410 }; |
| 411 frame.addEventListener("abp:frameready", callback2, false, true); |
| 403 frame.setAttribute("src", "http://127.0.0.1:1234/test"); | 412 frame.setAttribute("src", "http://127.0.0.1:1234/test"); |
| 404 } | 413 } |
| 405 | 414 |
| 406 let stageDescriptions = { | 415 let stageDescriptions = { |
| 407 1: "running without filters", | 416 1: "running without filters", |
| 408 2: "running with filter %S", | 417 2: "running with filter %S", |
| 409 3: "running with filter %S and site exception", | 418 3: "running with filter %S and site exception", |
| 410 4: "running with filter %S and exception not applicable to sites", | 419 4: "running with filter %S and exception not applicable to sites", |
| 411 5: "running with filter %S and sitekey exception", | 420 5: "running with filter %S and sitekey exception", |
| 412 6: "running with filter %S and $genericblock exception", | 421 6: "running with filter %S and $genericblock exception", |
| 413 7: "running with filter %S$domain=127.0.0.1 and $genericblock exception", | 422 7: "running with filter %S$domain=127.0.0.1 and $genericblock exception", |
| 414 8: "running with filter %S and $genericblock,sitekey exception" | 423 8: "running with filter %S and $genericblock,sitekey exception" |
| 415 }; | 424 }; |
| 416 | 425 |
| 417 for (let test = 0; test < tests.length; test++) | 426 for (let test = 0; test < tests.length; test++) |
| 418 { | 427 { |
| 419 let [name, body, expectedURL, expectedType, expectedDomain, expectedThirdPar
ty] = tests[test]; | 428 let [name, body, expectedURL, expectedType, expectedDomain, expectedThirdPar
ty] = tests[test]; |
| 420 for (let stage = 1; stage in stageDescriptions; stage++) | 429 for (let stage = 1; stage in stageDescriptions; stage++) |
| 421 { | 430 { |
| 422 let stageDescription = stageDescriptions[stage]; | 431 let stageDescription = stageDescriptions[stage]; |
| 423 if (stageDescription.indexOf("%S") >= 0) | 432 if (stageDescription.indexOf("%S") >= 0) |
| 424 stageDescription = stageDescription.replace("%S", expectedURL); | 433 stageDescription = stageDescription.replace("%S", expectedURL); |
| 425 | 434 |
| 426 asyncTest(name + " (" + stageDescription + ")", runTest.bind(null, tests[t
est], stage)); | 435 asyncTest(name + " (" + stageDescription + ")", runTest.bind(null, tests[t
est], stage)); |
| 427 } | 436 } |
| 428 } | 437 } |
| 429 })(); | 438 })(); |
| OLD | NEW |