Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* 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/. */
"use strict";
const GETHASH_URL = "http://mochi.test:8888/" + TEST_PATH + "gethashV5.sjs?";
const TEST_DOMAIN_IN_CACHE = "https://globalcache-test.example.com/";
const TEST_DOMAIN_NOT_IN_CACHE = "https://not-in-cache.example.com/";
let { UrlClassifierTestUtils } = ChromeUtils.importESModule(
);
function waitForGlobalCacheNotification(expectedResult) {
return new Promise(resolve => {
let start = Date.now();
function observer(subject, topic, data) {
Services.obs.removeObserver(observer, "urlclassifier-globalcache-result");
info(
`GlobalCache notification received: ${data} (after ${Date.now() - start}ms)`
);
is(
data,
expectedResult,
`Should receive a GlobalCache ${expectedResult} notification`
);
resolve(data);
}
Services.obs.addObserver(observer, "urlclassifier-globalcache-result");
});
}
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [
["browser.safebrowsing.realTime.enabled", true],
["browser.safebrowsing.realTime.debug", true],
["browser.safebrowsing.globalCache.enabled", true],
["browser.safebrowsing.provider.google5.enabled", true],
[
"browser.safebrowsing.provider.google5.excludeFromGoogleSafeBrowsingKeyCheck",
true,
],
["browser.safebrowsing.provider.google5.gethashURL", GETHASH_URL],
],
});
});
// Verify the case where the URL is in the GlobalCache table.
add_task(async function test_globalcache_hit() {
info("Testing GlobalCache hit scenario");
await UrlClassifierTestUtils.addTestV5Entry();
let notificationPromise = waitForGlobalCacheNotification("hit");
let tab = BrowserTestUtils.addTab(gBrowser, TEST_DOMAIN_IN_CACHE);
await notificationPromise;
await BrowserTestUtils.removeTab(tab);
UrlClassifierTestUtils.cleanupTestV5Entry();
});
// Verify the case where the URL is not in the GlobalCache table.
add_task(async function test_globalcache_miss() {
info("Testing GlobalCache miss scenario");
let notificationPromise = waitForGlobalCacheNotification("miss");
let tab = BrowserTestUtils.addTab(gBrowser, TEST_DOMAIN_NOT_IN_CACHE);
await notificationPromise;
await BrowserTestUtils.removeTab(tab);
});
// Verify that we will proceed with a local lookup if the URL is in the
// GlobalCache table.
add_task(async function test_globalcache_hit_and_malware_blocked() {
info("Testing GlobalCache hit with malware blocking");
// Add malware.example.com to both the malware table (4-byte) and
// the GlobalCache table (32-byte).
const MALWARE_HOST = "malware.example.com/";
const TEST_MALWARE_URL = "https://malware.example.com/";
await UrlClassifierTestUtils.addTestV5Entry(MALWARE_HOST);
let notificationPromise = waitForGlobalCacheNotification("hit");
let tab = BrowserTestUtils.addTab(gBrowser, TEST_MALWARE_URL);
let blockedPromise = BrowserTestUtils.waitForContentEvent(
tab.linkedBrowser,
"AboutBlockedLoaded",
true,
undefined,
true
);
// Wait for both the notification and the page to be blocked.
await Promise.all([notificationPromise, blockedPromise]);
ok(true, "The page should be blocked.");
await BrowserTestUtils.removeTab(tab);
UrlClassifierTestUtils.cleanupTestV5Entry();
});