forked from mirrors/gecko-dev
This patch was autogenerated by my decomponents.py
It covers almost every file with the extension js, jsm, html, py,
xhtml, or xul.
It removes blank lines after removed lines, when the removed lines are
preceded by either blank lines or the start of a new block. The "start
of a new block" is defined fairly hackily: either the line starts with
//, ends with */, ends with {, <![CDATA[, """ or '''. The first two
cover comments, the third one covers JS, the fourth covers JS embedded
in XUL, and the final two cover JS embedded in Python. This also
applies if the removed line was the first line of the file.
It covers the pattern matching cases like "var {classes: Cc,
interfaces: Ci, utils: Cu, results: Cr} = Components;". It'll remove
the entire thing if they are all either Ci, Cr, Cc or Cu, or it will
remove the appropriate ones and leave the residue behind. If there's
only one behind, then it will turn it into a normal, non-pattern
matching variable definition. (For instance, "const { classes: Cc,
Constructor: CC, interfaces: Ci, utils: Cu } = Components" becomes
"const CC = Components.Constructor".)
MozReview-Commit-ID: DeSHcClQ7cG
--HG--
extra : rebase_source : d9c41878036c1ef7766ef5e91a7005025bc1d72b
108 lines
4.1 KiB
JavaScript
108 lines
4.1 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
"use strict";
|
|
|
|
ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
|
|
ChromeUtils.import("resource:///modules/AttributionCode.jsm");
|
|
ChromeUtils.import("resource://gre/modules/osfile.jsm");
|
|
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
|
|
let validAttrCodes = [
|
|
{code: "source%3Dgoogle.com%26medium%3Dorganic%26campaign%3D(not%20set)%26content%3D(not%20set)",
|
|
parsed: {"source": "google.com", "medium": "organic",
|
|
"campaign": "(not%20set)", "content": "(not%20set)"}},
|
|
{code: "source%3Dgoogle.com%26medium%3Dorganic%26campaign%3D%26content%3D",
|
|
parsed: {"source": "google.com", "medium": "organic"}},
|
|
{code: "source%3Dgoogle.com%26medium%3Dorganic%26campaign%3D(not%20set)",
|
|
parsed: {"source": "google.com", "medium": "organic", "campaign": "(not%20set)"}},
|
|
{code: "source%3Dgoogle.com%26medium%3Dorganic",
|
|
parsed: {"source": "google.com", "medium": "organic"}},
|
|
{code: "source%3Dgoogle.com",
|
|
parsed: {"source": "google.com"}},
|
|
{code: "medium%3Dgoogle.com",
|
|
parsed: {"medium": "google.com"}},
|
|
{code: "campaign%3Dgoogle.com",
|
|
parsed: {"campaign": "google.com"}},
|
|
{code: "content%3Dgoogle.com",
|
|
parsed: {"content": "google.com"}}
|
|
];
|
|
|
|
let invalidAttrCodes = [
|
|
// Empty string
|
|
"",
|
|
// Not escaped
|
|
"source=google.com&medium=organic&campaign=(not set)&content=(not set)",
|
|
// Too long
|
|
"source%3Dreallyreallyreallyreallyreallyreallyreallyreallyreallylongdomain.com%26medium%3Dorganic%26campaign%3D(not%20set)%26content%3Dalmostexactlyenoughcontenttomakethisstringlongerthanthe200characterlimit",
|
|
// Unknown key name
|
|
"source%3Dgoogle.com%26medium%3Dorganic%26large%3Dgeneticallymodified",
|
|
// Empty key name
|
|
"source%3Dgoogle.com%26medium%3Dorganic%26%3Dgeneticallymodified"
|
|
];
|
|
|
|
async function writeAttributionFile(data) {
|
|
let appDir = Services.dirsvc.get("LocalAppData", Ci.nsIFile);
|
|
let file = appDir.clone();
|
|
file.append(Services.appinfo.vendor || "mozilla");
|
|
file.append(AppConstants.MOZ_APP_NAME);
|
|
|
|
await OS.File.makeDir(file.path,
|
|
{from: appDir.path, ignoreExisting: true});
|
|
|
|
file.append("postSigningData");
|
|
await OS.File.writeAtomic(file.path, data);
|
|
}
|
|
|
|
/**
|
|
* Test validation of attribution codes,
|
|
* to make sure we reject bad ones and accept good ones.
|
|
*/
|
|
add_task(async function testValidAttrCodes() {
|
|
for (let entry of validAttrCodes) {
|
|
AttributionCode._clearCache();
|
|
await writeAttributionFile(entry.code);
|
|
let result = await AttributionCode.getAttrDataAsync();
|
|
Assert.deepEqual(result, entry.parsed,
|
|
"Parsed code should match expected value, code was: " + entry.code);
|
|
}
|
|
AttributionCode._clearCache();
|
|
});
|
|
|
|
/**
|
|
* Make sure codes with various formatting errors are not seen as valid.
|
|
*/
|
|
add_task(async function testInvalidAttrCodes() {
|
|
for (let code of invalidAttrCodes) {
|
|
AttributionCode._clearCache();
|
|
await writeAttributionFile(code);
|
|
let result = await AttributionCode.getAttrDataAsync();
|
|
Assert.deepEqual(result, {},
|
|
"Code should have failed to parse: " + code);
|
|
}
|
|
AttributionCode._clearCache();
|
|
});
|
|
|
|
/**
|
|
* Test the cache by deleting the attribution data file
|
|
* and making sure we still get the expected code.
|
|
*/
|
|
add_task(async function testDeletedFile() {
|
|
// Set up the test by clearing the cache and writing a valid file.
|
|
await writeAttributionFile(validAttrCodes[0].code);
|
|
let result = await AttributionCode.getAttrDataAsync();
|
|
Assert.deepEqual(result, validAttrCodes[0].parsed,
|
|
"The code should be readable directly from the file");
|
|
|
|
// Delete the file and make sure we can still read the value back from cache.
|
|
await AttributionCode.deleteFileAsync();
|
|
result = await AttributionCode.getAttrDataAsync();
|
|
Assert.deepEqual(result, validAttrCodes[0].parsed,
|
|
"The code should be readable from the cache");
|
|
|
|
// Clear the cache and check we can't read anything.
|
|
AttributionCode._clearCache();
|
|
result = await AttributionCode.getAttrDataAsync();
|
|
Assert.deepEqual(result, {},
|
|
"Shouldn't be able to get a code after file is deleted and cache is cleared");
|
|
});
|