fune/toolkit/components/url-classifier/tests/browser/classifierTester.js
Dan Banner 436f06fda4 Bug 1386684 - Enable ESLint for toolkit/components/url-classifier (automatic fixes). r=hchang
MozReview-Commit-ID: F0Z8dRaYOku

--HG--
extra : rebase_source : 3ebc9ab6ea9f1741d8a986c9217575644411e2a1
2017-08-02 16:12:07 +01:00

347 lines
13 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
var classifierTester = {
URL_PATH: "/browser/toolkit/components/url-classifier/tests/browser/flash_block_frame.html",
OBJECT_ID: "testObject",
IFRAME_ID: "testFrame",
FLASHBLOCK_ENABLE_PREF: "plugins.flashBlock.enabled",
FLASH_PLUGIN_USER_SETTING_PREF: "plugin.state.flash",
URLCLASSIFIER_DISALLOW_COMPLETIONS_PREF: "urlclassifier.disallow_completions",
NEVER_ACTIVATE_PREF_VALUE: 0,
ASK_TO_ACTIVATE_PREF_VALUE: 1,
ALWAYS_ACTIVATE_PREF_VALUE: 2,
ALLOW_CTA_PREF: "plugins.click_to_play",
dbUrls: [
{
url: "flashallow.example.com/",
db: "test-flashallow-simple",
pref: "urlclassifier.flashAllowTable"
},
{
url: "exception.flashallow.example.com/",
db: "testexcept-flashallow-simple",
pref: "urlclassifier.flashAllowExceptTable"
},
{
url: "flashblock.example.com/",
db: "test-flash-simple",
pref: "urlclassifier.flashTable"
},
{
url: "exception.flashblock.example.com/",
db: "testexcept-flash-simple",
pref: "urlclassifier.flashExceptTable"
},
{
url: "subdocument.example.com/",
db: "test-flashsubdoc-simple",
pref: "urlclassifier.flashSubDocTable"
},
{
url: "exception.subdocument.example.com/",
db: "testexcept-flashsubdoc-simple",
pref: "urlclassifier.flashSubDocExceptTable"
}
],
setPrefs({setDBs = true, flashBlockEnable = true, flashSetting = classifierTester.ALWAYS_ACTIVATE_PREF_VALUE} = {}) {
if (setDBs) {
let DBs = [];
for (let dbData of classifierTester.dbUrls) {
Services.prefs.setCharPref(dbData.pref, dbData.db);
DBs.push(dbData.db);
}
let completions = Services.prefs.getCharPref(classifierTester.URLCLASSIFIER_DISALLOW_COMPLETIONS_PREF);
completions += "," + DBs.join(",");
Services.prefs.setCharPref(classifierTester.URLCLASSIFIER_DISALLOW_COMPLETIONS_PREF, completions);
}
Services.prefs.setBoolPref(classifierTester.FLASHBLOCK_ENABLE_PREF,
flashBlockEnable);
Services.prefs.setIntPref(classifierTester.FLASH_PLUGIN_USER_SETTING_PREF,
flashSetting);
Services.prefs.setBoolPref(classifierTester.ALLOW_CTA_PREF, true);
},
unsetPrefs() {
for (let dbData of classifierTester.dbUrls) {
Services.prefs.clearUserPref(dbData.pref);
}
Services.prefs.clearUserPref(classifierTester.URLCLASSIFIER_DISALLOW_COMPLETIONS_PREF);
Services.prefs.clearUserPref(classifierTester.FLASHBLOCK_ENABLE_PREF);
Services.prefs.clearUserPref(classifierTester.FLASH_PLUGIN_USER_SETTING_PREF);
Services.prefs.clearUserPref(classifierTester.ALLOW_CTA_PREF);
},
// The |domains| property describes the domains of the nested documents making
// up the page. |domains[0]| represents the domain in the URL bar. The last
// domain in the list is the domain of the most deeply nested iframe.
// Only the plugin in the most deeply nested document will be checked.
testCases: [
{
name: "Unknown domain",
domains: ["http://example.com"],
expectedFlashClassification: "unknown"
},
{
name: "Nested unknown domains",
domains: ["http://example.com", "http://example.org"],
expectedFlashClassification: "unknown"
},
{
name: "Allowed domain",
domains: ["http://flashallow.example.com"],
expectedFlashClassification: "allowed"
},
{
name: "Allowed nested domain",
domains: ["http://example.com", "http://flashallow.example.com"],
expectedFlashClassification: "allowed"
},
{
name: "Subdocument of allowed domain",
domains: ["http://flashallow.example.com", "http://example.com"],
expectedFlashClassification: "allowed"
},
{
name: "Exception to allowed domain",
domains: ["http://exception.flashallow.example.com"],
expectedFlashClassification: "unknown"
},
{
name: "Blocked domain",
domains: ["http://flashblock.example.com"],
expectedFlashClassification: "denied"
},
{
name: "Nested blocked domain",
domains: ["http://example.com", "http://flashblock.example.com"],
expectedFlashClassification: "denied"
},
{
name: "Subdocument of blocked subdocument",
domains: ["http://example.com", "http://flashblock.example.com", "http://example.com"],
expectedFlashClassification: "denied"
},
{
name: "Blocked subdocument nested among in allowed documents",
domains: ["http://flashallow.example.com", "http://flashblock.example.com", "http://flashallow.example.com"],
expectedFlashClassification: "denied"
},
{
name: "Exception to blocked domain",
domains: ["http://exception.flashblock.example.com"],
expectedFlashClassification: "unknown"
},
{
name: "Sub-document blocked domain in top-level context",
domains: ["http://subdocument.example.com"],
expectedFlashClassification: "unknown"
},
{
name: "Sub-document blocked domain",
domains: ["http://example.com", "http://subdocument.example.com"],
expectedFlashClassification: "denied"
},
{
name: "Sub-document blocked domain in non-Third-Party context",
domains: ["http://subdocument.example.com", "http://subdocument.example.com"],
expectedFlashClassification: "unknown"
},
{
name: "Sub-document blocked domain differing only by scheme",
domains: ["http://subdocument.example.com", "https://subdocument.example.com"],
expectedFlashClassification: "denied"
},
{
name: "Sub-document blocked subdocument of an allowed domain",
domains: ["http://flashallow.example.com", "http://subdocument.example.com"],
expectedFlashClassification: "denied"
},
{
name: "Subdocument of Sub-document blocked domain",
domains: ["http://example.com", "http://subdocument.example.com", "http://example.com"],
expectedFlashClassification: "denied"
},
{
name: "Sub-document exception in top-level context",
domains: ["http://exception.subdocument.example.com"],
expectedFlashClassification: "unknown"
},
{
name: "Sub-document blocked domain exception",
domains: ["http://example.com", "http://exception.subdocument.example.com"],
expectedFlashClassification: "unknown"
}
],
// Returns null if this value should not be verified given the combination
// of inputs
expectedPluginFallbackType(classification, flashSetting) {
switch (classification) {
case "unknown":
if (flashSetting == classifierTester.ALWAYS_ACTIVATE_PREF_VALUE) {
return null;
} else if (flashSetting == classifierTester.ASK_TO_ACTIVATE_PREF_VALUE) {
return Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY;
} else if (flashSetting == classifierTester.NEVER_ACTIVATE_PREF_VALUE) {
return Ci.nsIObjectLoadingContent.PLUGIN_DISABLED;
}
break;
case "allowed":
if (flashSetting == classifierTester.NEVER_ACTIVATE_PREF_VALUE) {
return Ci.nsIObjectLoadingContent.PLUGIN_DISABLED;
}
return null;
case "denied":
return Ci.nsIObjectLoadingContent.PLUGIN_USER_DISABLED;
}
throw new Error("Invalid classification or flash setting");
},
// Returns null if this value should not be verified given the combination
// of inputs
expectedActivated(classification, flashSetting) {
switch (classification) {
case "unknown":
return (flashSetting == classifierTester.ALWAYS_ACTIVATE_PREF_VALUE);
case "allowed":
return (flashSetting != classifierTester.NEVER_ACTIVATE_PREF_VALUE);
case "denied":
return false;
}
throw new Error("Invalid classification or flash setting");
},
// Returns null if this value should not be verified given the combination
// of inputs
expectedHasRunningPlugin(classification, flashSetting) {
switch (classification) {
case "unknown":
return (flashSetting == classifierTester.ALWAYS_ACTIVATE_PREF_VALUE);
case "allowed":
return (flashSetting != classifierTester.NEVER_ACTIVATE_PREF_VALUE);
case "denied":
return false;
}
throw new Error("Invalid classification or flash setting");
},
// Returns null if this value should not be verified given the combination
// of inputs
expectedPluginListed(classification, flashSetting) {
if (flashSetting == classifierTester.ASK_TO_ACTIVATE_PREF_VALUE &&
Services.prefs.getCharPref("plugins.navigator.hidden_ctp_plugin") == "Shockwave Flash") {
return false;
}
switch (classification) {
case "unknown":
case "allowed":
return (flashSetting != classifierTester.NEVER_ACTIVATE_PREF_VALUE);
case "denied":
return false;
}
throw new Error("Invalid classification or flash setting");
},
buildTestCaseInNewTab(browser, testCase) {
return (async function() {
let iframeDomains = testCase.domains.slice();
let pageDomain = iframeDomains.shift();
let tab = await BrowserTestUtils.openNewForegroundTab(browser,
pageDomain + classifierTester.URL_PATH);
let depth = 0;
for (let domain of iframeDomains) {
// Firefox does not like to load the same page in its own iframe. Put some
// bogus query strings in the URL to make it happy.
let url = domain + classifierTester.URL_PATH + "?date=" + Date.now() + "rand=" + Math.random();
let domainLoaded = BrowserTestUtils.browserLoaded(tab.linkedBrowser, true, url);
ContentTask.spawn(tab.linkedBrowser, {iframeId: classifierTester.IFRAME_ID, url, depth},
async function({iframeId, url, depth}) {
let doc = content.document;
for (let i = 0; i < depth; ++i) {
doc = doc.getElementById(iframeId).contentDocument;
}
doc.getElementById(iframeId).src = url;
});
await domainLoaded;
++depth;
}
return tab;
})();
},
getPluginInfo(browser, depth) {
return ContentTask.spawn(browser,
{iframeId: classifierTester.IFRAME_ID, depth},
async function({iframeId, depth}) {
let doc = content.document;
let win = content.window;
for (let i = 0; i < depth; ++i) {
let frame = doc.getElementById(iframeId);
doc = frame.contentDocument;
win = frame.contentWindow;
}
let pluginObj = doc.getElementById("testObject");
if (!(pluginObj instanceof Ci.nsIObjectLoadingContent)) {
throw new Error("Unable to find plugin!");
}
return {
pluginFallbackType: pluginObj.pluginFallbackType,
activated: pluginObj.activated,
hasRunningPlugin: pluginObj.hasRunningPlugin,
listed: ("Shockwave Flash" in win.navigator.plugins),
flashClassification: doc.documentFlashClassification
};
});
},
checkPluginInfo(pluginInfo, expectedClassification, flashSetting) {
is(pluginInfo.flashClassification, expectedClassification,
"Page's classification should match expected");
let expectedPluginFallbackType =
classifierTester.expectedPluginFallbackType(pluginInfo.flashClassification,
flashSetting);
if (expectedPluginFallbackType != null) {
is(pluginInfo.pluginFallbackType, expectedPluginFallbackType,
"Plugin should have the correct fallback type");
}
let expectedActivated =
classifierTester.expectedActivated(pluginInfo.flashClassification,
flashSetting);
if (expectedActivated != null) {
is(pluginInfo.activated, expectedActivated,
"Plugin should have the correct activation");
}
let expectedHasRunningPlugin =
classifierTester.expectedHasRunningPlugin(pluginInfo.flashClassification,
flashSetting);
if (expectedHasRunningPlugin != null) {
is(pluginInfo.hasRunningPlugin, expectedHasRunningPlugin,
"Plugin should have the correct 'plugin running' state");
}
let expectedPluginListed =
classifierTester.expectedPluginListed(pluginInfo.flashClassification,
flashSetting);
if (expectedPluginListed != null) {
is(pluginInfo.listed, expectedPluginListed,
"Plugin's existance in navigator.plugins should match expected");
}
}
};
registerCleanupFunction(classifierTester.unsetPrefs);