forked from mirrors/gecko-dev
		
	MozReview-Commit-ID: F0Z8dRaYOku --HG-- extra : rebase_source : 3ebc9ab6ea9f1741d8a986c9217575644411e2a1
		
			
				
	
	
		
			347 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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);
 |