forked from mirrors/gecko-dev
Bug 1508991 - Enable ESLint for dom/manifest/ (automatic changes) r=Standard8,Ehsan
Differential Revision: https://phabricator.services.mozilla.com/D13207 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
725ceeccf7
commit
d252be35ef
29 changed files with 560 additions and 560 deletions
|
|
@ -17,19 +17,19 @@
|
||||||
* .process(aManifest, aBaseURL, aMemberName);
|
* .process(aManifest, aBaseURL, aMemberName);
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*exported EXPORTED_SYMBOLS*/
|
/* exported EXPORTED_SYMBOLS*/
|
||||||
/*globals Components */
|
/* globals Components */
|
||||||
'use strict';
|
"use strict";
|
||||||
const {
|
const {
|
||||||
utils: Cu,
|
utils: Cu,
|
||||||
interfaces: Ci,
|
interfaces: Ci,
|
||||||
classes: Cc
|
classes: Cc,
|
||||||
} = Components;
|
} = Components;
|
||||||
|
|
||||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
|
|
||||||
XPCOMUtils.defineLazyGlobalGetters(this, ['URL']);
|
XPCOMUtils.defineLazyGlobalGetters(this, ["URL"]);
|
||||||
const netutil = Cc['@mozilla.org/network/util;1']
|
const netutil = Cc["@mozilla.org/network/util;1"]
|
||||||
.getService(Ci.nsINetUtil);
|
.getService(Ci.nsINetUtil);
|
||||||
|
|
||||||
function ImageObjectProcessor(aConsole, aExtractor) {
|
function ImageObjectProcessor(aConsole, aExtractor) {
|
||||||
|
|
@ -39,27 +39,27 @@ function ImageObjectProcessor(aConsole, aExtractor) {
|
||||||
|
|
||||||
// Static getters
|
// Static getters
|
||||||
Object.defineProperties(ImageObjectProcessor, {
|
Object.defineProperties(ImageObjectProcessor, {
|
||||||
'decimals': {
|
"decimals": {
|
||||||
get: function() {
|
get() {
|
||||||
return /^\d+$/;
|
return /^\d+$/;
|
||||||
}
|
},
|
||||||
|
},
|
||||||
|
"anyRegEx": {
|
||||||
|
get() {
|
||||||
|
return new RegExp("any", "i");
|
||||||
|
},
|
||||||
},
|
},
|
||||||
'anyRegEx': {
|
|
||||||
get: function() {
|
|
||||||
return new RegExp('any', 'i');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ImageObjectProcessor.prototype.process = function(
|
ImageObjectProcessor.prototype.process = function(
|
||||||
aManifest, aBaseURL, aMemberName
|
aManifest, aBaseURL, aMemberName
|
||||||
) {
|
) {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: aManifest,
|
object: aManifest,
|
||||||
property: aMemberName,
|
property: aMemberName,
|
||||||
expectedType: 'array',
|
expectedType: "array",
|
||||||
trim: false
|
trim: false,
|
||||||
};
|
};
|
||||||
const extractor = this.extractor;
|
const extractor = this.extractor;
|
||||||
const images = [];
|
const images = [];
|
||||||
|
|
@ -74,9 +74,9 @@ ImageObjectProcessor.prototype.process = function(
|
||||||
|
|
||||||
function toImageObject(aImageSpec) {
|
function toImageObject(aImageSpec) {
|
||||||
return {
|
return {
|
||||||
'src': processSrcMember(aImageSpec, aBaseURL),
|
"src": processSrcMember(aImageSpec, aBaseURL),
|
||||||
'type': processTypeMember(aImageSpec),
|
"type": processTypeMember(aImageSpec),
|
||||||
'sizes': processSizesMember(aImageSpec),
|
"sizes": processSizesMember(aImageSpec),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,11 +84,11 @@ ImageObjectProcessor.prototype.process = function(
|
||||||
const charset = {};
|
const charset = {};
|
||||||
const hadCharset = {};
|
const hadCharset = {};
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'image',
|
objectName: "image",
|
||||||
object: aImage,
|
object: aImage,
|
||||||
property: 'type',
|
property: "type",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
let value = extractor.extractValue(spec);
|
let value = extractor.extractValue(spec);
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|
@ -99,11 +99,11 @@ ImageObjectProcessor.prototype.process = function(
|
||||||
|
|
||||||
function processSrcMember(aImage, aBaseURL) {
|
function processSrcMember(aImage, aBaseURL) {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'image',
|
objectName: "image",
|
||||||
object: aImage,
|
object: aImage,
|
||||||
property: 'src',
|
property: "src",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: false
|
trim: false,
|
||||||
};
|
};
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
let url;
|
let url;
|
||||||
|
|
@ -118,11 +118,11 @@ ImageObjectProcessor.prototype.process = function(
|
||||||
function processSizesMember(aImage) {
|
function processSizesMember(aImage) {
|
||||||
const sizes = new Set();
|
const sizes = new Set();
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'image',
|
objectName: "image",
|
||||||
object: aImage,
|
object: aImage,
|
||||||
property: 'sizes',
|
property: "sizes",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|
@ -138,17 +138,17 @@ ImageObjectProcessor.prototype.process = function(
|
||||||
if (ImageObjectProcessor.anyRegEx.test(aSize)) {
|
if (ImageObjectProcessor.anyRegEx.test(aSize)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!size.includes('x') || size.indexOf('x') !== size.lastIndexOf('x')) {
|
if (!size.includes("x") || size.indexOf("x") !== size.lastIndexOf("x")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Split left of x for width, after x for height.
|
// Split left of x for width, after x for height.
|
||||||
const widthAndHeight = size.split('x');
|
const widthAndHeight = size.split("x");
|
||||||
const w = widthAndHeight.shift();
|
const w = widthAndHeight.shift();
|
||||||
const h = widthAndHeight.join('x');
|
const h = widthAndHeight.join("x");
|
||||||
const validStarts = !w.startsWith('0') && !h.startsWith('0');
|
const validStarts = !w.startsWith("0") && !h.startsWith("0");
|
||||||
const validDecimals = ImageObjectProcessor.decimals.test(w + h);
|
const validDecimals = ImageObjectProcessor.decimals.test(w + h);
|
||||||
return (validStarts && validDecimals);
|
return (validStarts && validDecimals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var EXPORTED_SYMBOLS = ['ImageObjectProcessor']; // jshint ignore:line
|
var EXPORTED_SYMBOLS = ["ImageObjectProcessor"]; // jshint ignore:line
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ class Manifest {
|
||||||
const data = {
|
const data = {
|
||||||
installed: false,
|
installed: false,
|
||||||
manifest: manifestData,
|
manifest: manifestData,
|
||||||
cached_icon: icon
|
cached_icon: icon,
|
||||||
};
|
};
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
@ -90,14 +90,14 @@ class Manifest {
|
||||||
const manifestData = await ManifestObtainer.browserObtainManifest(this._browser);
|
const manifestData = await ManifestObtainer.browserObtainManifest(this._browser);
|
||||||
this._store.data = {
|
this._store.data = {
|
||||||
installed: true,
|
installed: true,
|
||||||
manifest: manifestData
|
manifest: manifestData,
|
||||||
};
|
};
|
||||||
Manifests.manifestInstalled(this);
|
Manifests.manifestInstalled(this);
|
||||||
this._store.saveSoon();
|
this._store.saveSoon();
|
||||||
}
|
}
|
||||||
|
|
||||||
async icon(expectedSize) {
|
async icon(expectedSize) {
|
||||||
if ('cached_icon' in this._store.data) {
|
if ("cached_icon" in this._store.data) {
|
||||||
return this._store.data.cached_icon;
|
return this._store.data.cached_icon;
|
||||||
}
|
}
|
||||||
const icon = await ManifestIcons
|
const icon = await ManifestIcons
|
||||||
|
|
@ -142,7 +142,7 @@ class Manifest {
|
||||||
*/
|
*/
|
||||||
var Manifests = {
|
var Manifests = {
|
||||||
|
|
||||||
async initialise () {
|
async initialise() {
|
||||||
|
|
||||||
if (this.started) {
|
if (this.started) {
|
||||||
return this.started;
|
return this.started;
|
||||||
|
|
@ -219,7 +219,7 @@ var Manifests = {
|
||||||
this.manifestObjs[manifestUrl] = new Manifest(browser, manifestUrl);
|
this.manifestObjs[manifestUrl] = new Manifest(browser, manifestUrl);
|
||||||
await this.manifestObjs[manifestUrl].initialise();
|
await this.manifestObjs[manifestUrl].initialise();
|
||||||
return this.manifestObjs[manifestUrl];
|
return this.manifestObjs[manifestUrl];
|
||||||
}
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
/* globals Components, Task, PromiseMessage */
|
/* globals Components, Task, PromiseMessage */
|
||||||
"use strict";
|
"use strict";
|
||||||
const {
|
const {
|
||||||
utils: Cu
|
utils: Cu,
|
||||||
} = Components;
|
} = Components;
|
||||||
ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
|
ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
|
||||||
|
|
||||||
|
|
@ -36,7 +36,7 @@ var ManifestFinder = {// jshint ignore:line
|
||||||
const mm = aBrowser.messageManager;
|
const mm = aBrowser.messageManager;
|
||||||
const reply = await PromiseMessage.send(mm, msgKey);
|
const reply = await PromiseMessage.send(mm, msgKey);
|
||||||
return reply.data.result;
|
return reply.data.result;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
function isXULBrowser(aBrowser) {
|
function isXULBrowser(aBrowser) {
|
||||||
|
|
@ -61,5 +61,5 @@ function checkForManifest(aWindow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var EXPORTED_SYMBOLS = [// jshint ignore:line
|
var EXPORTED_SYMBOLS = [// jshint ignore:line
|
||||||
"ManifestFinder"
|
"ManifestFinder",
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
const {
|
const {
|
||||||
utils: Cu,
|
utils: Cu,
|
||||||
classes: Cc,
|
classes: Cc,
|
||||||
interfaces: Ci
|
interfaces: Ci,
|
||||||
} = Components;
|
} = Components;
|
||||||
|
|
||||||
ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
|
ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
|
||||||
|
|
@ -23,7 +23,7 @@ var ManifestIcons = {
|
||||||
|
|
||||||
async contentFetchIcon(aWindow, manifest, iconSize) {
|
async contentFetchIcon(aWindow, manifest, iconSize) {
|
||||||
return await getIcon(aWindow, toIconArray(manifest.icons), iconSize);
|
return await getIcon(aWindow, toIconArray(manifest.icons), iconSize);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
function parseIconSize(size) {
|
function parseIconSize(size) {
|
||||||
|
|
|
||||||
|
|
@ -23,17 +23,17 @@
|
||||||
*
|
*
|
||||||
* exported ManifestObtainer
|
* exported ManifestObtainer
|
||||||
*/
|
*/
|
||||||
/*globals Components, Task, PromiseMessage, XPCOMUtils, ManifestProcessor, BrowserUtils*/
|
/* globals Components, Task, PromiseMessage, XPCOMUtils, ManifestProcessor, BrowserUtils*/
|
||||||
"use strict";
|
"use strict";
|
||||||
const {
|
const {
|
||||||
utils: Cu,
|
utils: Cu,
|
||||||
classes: Cc,
|
classes: Cc,
|
||||||
interfaces: Ci
|
interfaces: Ci,
|
||||||
} = Components;
|
} = Components;
|
||||||
ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
|
ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm");
|
||||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
ChromeUtils.import("resource://gre/modules/ManifestProcessor.jsm");
|
ChromeUtils.import("resource://gre/modules/ManifestProcessor.jsm");
|
||||||
ChromeUtils.defineModuleGetter(this, "BrowserUtils", // jshint ignore:line
|
ChromeUtils.defineModuleGetter(this, "BrowserUtils", // jshint ignore:line
|
||||||
"resource://gre/modules/BrowserUtils.jsm");
|
"resource://gre/modules/BrowserUtils.jsm");
|
||||||
|
|
||||||
var ManifestObtainer = { // jshint ignore:line
|
var ManifestObtainer = { // jshint ignore:line
|
||||||
|
|
@ -72,7 +72,7 @@ var ManifestObtainer = { // jshint ignore:line
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
return manifest;
|
return manifest;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
function toError(aErrorClone) {
|
function toError(aErrorClone) {
|
||||||
|
|
@ -115,7 +115,7 @@ const processResponse = async function(aResp, aContentWindow) {
|
||||||
const args = {
|
const args = {
|
||||||
jsonText: text,
|
jsonText: text,
|
||||||
manifestURL: aResp.url,
|
manifestURL: aResp.url,
|
||||||
docURL: aContentWindow.location.href
|
docURL: aContentWindow.location.href,
|
||||||
};
|
};
|
||||||
const manifest = ManifestProcessor.process(args);
|
const manifest = ManifestProcessor.process(args);
|
||||||
return manifest;
|
return manifest;
|
||||||
|
|
@ -139,7 +139,7 @@ const fetchManifest = async function(aWindow) {
|
||||||
// Throws on malformed URLs
|
// Throws on malformed URLs
|
||||||
const manifestURL = new aWindow.URL(elem.href, elem.baseURI);
|
const manifestURL = new aWindow.URL(elem.href, elem.baseURI);
|
||||||
const reqInit = {
|
const reqInit = {
|
||||||
mode: "cors"
|
mode: "cors",
|
||||||
};
|
};
|
||||||
if (elem.crossOrigin === "use-credentials") {
|
if (elem.crossOrigin === "use-credentials") {
|
||||||
reqInit.credentials = "include";
|
reqInit.credentials = "include";
|
||||||
|
|
|
||||||
|
|
@ -19,33 +19,33 @@
|
||||||
* TODO: The constructor should accept the UA's supported display modes.
|
* TODO: The constructor should accept the UA's supported display modes.
|
||||||
* TODO: hook up developer tools to console. (1086997).
|
* TODO: hook up developer tools to console. (1086997).
|
||||||
*/
|
*/
|
||||||
/*globals Components, ValueExtractor, ImageObjectProcessor, ConsoleAPI*/
|
/* globals Components, ValueExtractor, ImageObjectProcessor, ConsoleAPI*/
|
||||||
'use strict';
|
"use strict";
|
||||||
const {
|
const {
|
||||||
utils: Cu
|
utils: Cu,
|
||||||
} = Components;
|
} = Components;
|
||||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
XPCOMUtils.defineLazyGlobalGetters(this, ['URL']);
|
XPCOMUtils.defineLazyGlobalGetters(this, ["URL"]);
|
||||||
const displayModes = new Set(['fullscreen', 'standalone', 'minimal-ui',
|
const displayModes = new Set(["fullscreen", "standalone", "minimal-ui",
|
||||||
'browser'
|
"browser",
|
||||||
]);
|
]);
|
||||||
const orientationTypes = new Set(['any', 'natural', 'landscape', 'portrait',
|
const orientationTypes = new Set(["any", "natural", "landscape", "portrait",
|
||||||
'portrait-primary', 'portrait-secondary', 'landscape-primary',
|
"portrait-primary", "portrait-secondary", "landscape-primary",
|
||||||
'landscape-secondary'
|
"landscape-secondary",
|
||||||
]);
|
]);
|
||||||
const textDirections = new Set(['ltr', 'rtl', 'auto']);
|
const textDirections = new Set(["ltr", "rtl", "auto"]);
|
||||||
|
|
||||||
ChromeUtils.import('resource://gre/modules/Console.jsm');
|
ChromeUtils.import("resource://gre/modules/Console.jsm");
|
||||||
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
// ValueExtractor is used by the various processors to get values
|
// ValueExtractor is used by the various processors to get values
|
||||||
// from the manifest and to report errors.
|
// from the manifest and to report errors.
|
||||||
ChromeUtils.import('resource://gre/modules/ValueExtractor.jsm');
|
ChromeUtils.import("resource://gre/modules/ValueExtractor.jsm");
|
||||||
// ImageObjectProcessor is used to process things like icons and images
|
// ImageObjectProcessor is used to process things like icons and images
|
||||||
ChromeUtils.import('resource://gre/modules/ImageObjectProcessor.jsm');
|
ChromeUtils.import("resource://gre/modules/ImageObjectProcessor.jsm");
|
||||||
|
|
||||||
var ManifestProcessor = { // jshint ignore:line
|
var ManifestProcessor = { // jshint ignore:line
|
||||||
get defaultDisplayMode() {
|
get defaultDisplayMode() {
|
||||||
return 'browser';
|
return "browser";
|
||||||
},
|
},
|
||||||
get displayModes() {
|
get displayModes() {
|
||||||
return displayModes;
|
return displayModes;
|
||||||
|
|
@ -65,12 +65,12 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
process({
|
process({
|
||||||
jsonText,
|
jsonText,
|
||||||
manifestURL: aManifestURL,
|
manifestURL: aManifestURL,
|
||||||
docURL: aDocURL
|
docURL: aDocURL,
|
||||||
}) {
|
}) {
|
||||||
const domBundle = Services.strings.createBundle("chrome://global/locale/dom/dom.properties");
|
const domBundle = Services.strings.createBundle("chrome://global/locale/dom/dom.properties");
|
||||||
|
|
||||||
const console = new ConsoleAPI({
|
const console = new ConsoleAPI({
|
||||||
prefix: 'Web Manifest'
|
prefix: "Web Manifest",
|
||||||
});
|
});
|
||||||
const manifestURL = new URL(aManifestURL);
|
const manifestURL = new URL(aManifestURL);
|
||||||
const docURL = new URL(aDocURL);
|
const docURL = new URL(aDocURL);
|
||||||
|
|
@ -78,73 +78,73 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
try {
|
try {
|
||||||
rawManifest = JSON.parse(jsonText);
|
rawManifest = JSON.parse(jsonText);
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
if (typeof rawManifest !== 'object' || rawManifest === null) {
|
if (typeof rawManifest !== "object" || rawManifest === null) {
|
||||||
console.warn(domBundle.GetStringFromName('ManifestShouldBeObject'));
|
console.warn(domBundle.GetStringFromName("ManifestShouldBeObject"));
|
||||||
rawManifest = {};
|
rawManifest = {};
|
||||||
}
|
}
|
||||||
const extractor = new ValueExtractor(console, domBundle);
|
const extractor = new ValueExtractor(console, domBundle);
|
||||||
const imgObjProcessor = new ImageObjectProcessor(console, extractor);
|
const imgObjProcessor = new ImageObjectProcessor(console, extractor);
|
||||||
const processedManifest = {
|
const processedManifest = {
|
||||||
'dir': processDirMember.call(this),
|
"dir": processDirMember.call(this),
|
||||||
'lang': processLangMember(),
|
"lang": processLangMember(),
|
||||||
'start_url': processStartURLMember(),
|
"start_url": processStartURLMember(),
|
||||||
'display': processDisplayMember.call(this),
|
"display": processDisplayMember.call(this),
|
||||||
'orientation': processOrientationMember.call(this),
|
"orientation": processOrientationMember.call(this),
|
||||||
'name': processNameMember(),
|
"name": processNameMember(),
|
||||||
'icons': imgObjProcessor.process(
|
"icons": imgObjProcessor.process(
|
||||||
rawManifest, manifestURL, 'icons'
|
rawManifest, manifestURL, "icons"
|
||||||
),
|
),
|
||||||
'short_name': processShortNameMember(),
|
"short_name": processShortNameMember(),
|
||||||
'theme_color': processThemeColorMember(),
|
"theme_color": processThemeColorMember(),
|
||||||
'background_color': processBackgroundColorMember(),
|
"background_color": processBackgroundColorMember(),
|
||||||
};
|
};
|
||||||
processedManifest.scope = processScopeMember();
|
processedManifest.scope = processScopeMember();
|
||||||
return processedManifest;
|
return processedManifest;
|
||||||
|
|
||||||
function processDirMember() {
|
function processDirMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'dir',
|
property: "dir",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true,
|
trim: true,
|
||||||
};
|
};
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
if (this.textDirections.has(value)) {
|
if (this.textDirections.has(value)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
return 'auto';
|
return "auto";
|
||||||
}
|
}
|
||||||
|
|
||||||
function processNameMember() {
|
function processNameMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'name',
|
property: "name",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
return extractor.extractValue(spec);
|
return extractor.extractValue(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function processShortNameMember() {
|
function processShortNameMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'short_name',
|
property: "short_name",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
return extractor.extractValue(spec);
|
return extractor.extractValue(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function processOrientationMember() {
|
function processOrientationMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'orientation',
|
property: "orientation",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
if (value && typeof value === "string" && this.orientationTypes.has(value.toLowerCase())) {
|
if (value && typeof value === "string" && this.orientationTypes.has(value.toLowerCase())) {
|
||||||
|
|
@ -155,11 +155,11 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
|
|
||||||
function processDisplayMember() {
|
function processDisplayMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'display',
|
property: "display",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
if (value && typeof value === "string" && displayModes.has(value.toLowerCase())) {
|
if (value && typeof value === "string" && displayModes.has(value.toLowerCase())) {
|
||||||
|
|
@ -170,32 +170,32 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
|
|
||||||
function processScopeMember() {
|
function processScopeMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'scope',
|
property: "scope",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: false
|
trim: false,
|
||||||
};
|
};
|
||||||
let scopeURL;
|
let scopeURL;
|
||||||
const startURL = new URL(processedManifest.start_url);
|
const startURL = new URL(processedManifest.start_url);
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
if (value === undefined || value === '') {
|
if (value === undefined || value === "") {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
scopeURL = new URL(value, manifestURL);
|
scopeURL = new URL(value, manifestURL);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn(domBundle.GetStringFromName('ManifestScopeURLInvalid'));
|
console.warn(domBundle.GetStringFromName("ManifestScopeURLInvalid"));
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
if (scopeURL.origin !== docURL.origin) {
|
if (scopeURL.origin !== docURL.origin) {
|
||||||
console.warn(domBundle.GetStringFromName('ManifestScopeNotSameOrigin'));
|
console.warn(domBundle.GetStringFromName("ManifestScopeNotSameOrigin"));
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
// If start URL is not within scope of scope URL:
|
// If start URL is not within scope of scope URL:
|
||||||
let isSameOrigin = startURL && startURL.origin !== scopeURL.origin;
|
let isSameOrigin = startURL && startURL.origin !== scopeURL.origin;
|
||||||
if (isSameOrigin || !startURL.pathname.startsWith(scopeURL.pathname)) {
|
if (isSameOrigin || !startURL.pathname.startsWith(scopeURL.pathname)) {
|
||||||
console.warn(domBundle.GetStringFromName('ManifestStartURLOutsideScope'));
|
console.warn(domBundle.GetStringFromName("ManifestStartURLOutsideScope"));
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return scopeURL.href;
|
return scopeURL.href;
|
||||||
|
|
@ -203,26 +203,26 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
|
|
||||||
function processStartURLMember() {
|
function processStartURLMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'start_url',
|
property: "start_url",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: false
|
trim: false,
|
||||||
};
|
};
|
||||||
let result = new URL(docURL).href;
|
let result = new URL(docURL).href;
|
||||||
const value = extractor.extractValue(spec);
|
const value = extractor.extractValue(spec);
|
||||||
if (value === undefined || value === '') {
|
if (value === undefined || value === "") {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
let potentialResult;
|
let potentialResult;
|
||||||
try {
|
try {
|
||||||
potentialResult = new URL(value, manifestURL);
|
potentialResult = new URL(value, manifestURL);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn(domBundle.GetStringFromName('ManifestStartURLInvalid'))
|
console.warn(domBundle.GetStringFromName("ManifestStartURLInvalid"));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (potentialResult.origin !== docURL.origin) {
|
if (potentialResult.origin !== docURL.origin) {
|
||||||
console.warn(domBundle.GetStringFromName('ManifestStartURLShouldBeSameOrigin'));
|
console.warn(domBundle.GetStringFromName("ManifestStartURLShouldBeSameOrigin"));
|
||||||
} else {
|
} else {
|
||||||
result = potentialResult.href;
|
result = potentialResult.href;
|
||||||
}
|
}
|
||||||
|
|
@ -231,32 +231,32 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
|
|
||||||
function processThemeColorMember() {
|
function processThemeColorMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'theme_color',
|
property: "theme_color",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
return extractor.extractColorValue(spec);
|
return extractor.extractColorValue(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function processBackgroundColorMember() {
|
function processBackgroundColorMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'background_color',
|
property: "background_color",
|
||||||
expectedType: 'string',
|
expectedType: "string",
|
||||||
trim: true
|
trim: true,
|
||||||
};
|
};
|
||||||
return extractor.extractColorValue(spec);
|
return extractor.extractColorValue(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function processLangMember() {
|
function processLangMember() {
|
||||||
const spec = {
|
const spec = {
|
||||||
objectName: 'manifest',
|
objectName: "manifest",
|
||||||
object: rawManifest,
|
object: rawManifest,
|
||||||
property: 'lang',
|
property: "lang",
|
||||||
expectedType: 'string', trim: true
|
expectedType: "string", trim: true,
|
||||||
};
|
};
|
||||||
let tag = extractor.extractValue(spec);
|
let tag = extractor.extractValue(spec);
|
||||||
// TODO: Check if tag is structurally valid.
|
// TODO: Check if tag is structurally valid.
|
||||||
|
|
@ -269,6 +269,6 @@ var ManifestProcessor = { // jshint ignore:line
|
||||||
// https://github.com/tc39/ecma402/issues/5
|
// https://github.com/tc39/ecma402/issues/5
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
var EXPORTED_SYMBOLS = ['ManifestProcessor']; // jshint ignore:line
|
var EXPORTED_SYMBOLS = ["ManifestProcessor"]; // jshint ignore:line
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@
|
||||||
* Helper functions extract values from manifest members
|
* Helper functions extract values from manifest members
|
||||||
* and reports conformance violations.
|
* and reports conformance violations.
|
||||||
*/
|
*/
|
||||||
/*globals Components*/
|
/* globals Components*/
|
||||||
'use strict';
|
"use strict";
|
||||||
const {
|
const {
|
||||||
classes: Cc,
|
classes: Cc,
|
||||||
interfaces: Ci,
|
interfaces: Ci,
|
||||||
utils: Cu
|
utils: Cu,
|
||||||
} = Components;
|
} = Components;
|
||||||
|
|
||||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
|
|
@ -35,9 +35,9 @@ ValueExtractor.prototype = {
|
||||||
const value = object[property];
|
const value = object[property];
|
||||||
const isArray = Array.isArray(value);
|
const isArray = Array.isArray(value);
|
||||||
// We need to special-case "array", as it's not a JS primitive.
|
// We need to special-case "array", as it's not a JS primitive.
|
||||||
const type = (isArray) ? 'array' : typeof value;
|
const type = (isArray) ? "array" : typeof value;
|
||||||
if (type !== expectedType) {
|
if (type !== expectedType) {
|
||||||
if (type !== 'undefined') {
|
if (type !== "undefined") {
|
||||||
this.console.warn(this.domBundle.formatStringFromName("ManifestInvalidType",
|
this.console.warn(this.domBundle.formatStringFromName("ManifestInvalidType",
|
||||||
[objectName, property, expectedType],
|
[objectName, property, expectedType],
|
||||||
3));
|
3));
|
||||||
|
|
@ -45,7 +45,7 @@ ValueExtractor.prototype = {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
// Trim string and returned undefined if the empty string.
|
// Trim string and returned undefined if the empty string.
|
||||||
const shouldTrim = expectedType === 'string' && value && trim;
|
const shouldTrim = expectedType === "string" && value && trim;
|
||||||
if (shouldTrim) {
|
if (shouldTrim) {
|
||||||
return value.trim() || undefined;
|
return value.trim() || undefined;
|
||||||
}
|
}
|
||||||
|
|
@ -62,6 +62,6 @@ ValueExtractor.prototype = {
|
||||||
2));
|
2));
|
||||||
}
|
}
|
||||||
return color;
|
return color;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
var EXPORTED_SYMBOLS = ['ValueExtractor']; // jshint ignore:line
|
var EXPORTED_SYMBOLS = ["ValueExtractor"]; // jshint ignore:line
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
//Used by JSHint:
|
// Used by JSHint:
|
||||||
/*global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
/* global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
||||||
"use strict";
|
"use strict";
|
||||||
const { ManifestFinder } = ChromeUtils.import("resource://gre/modules/ManifestFinder.jsm", {});
|
const { ManifestFinder } = ChromeUtils.import("resource://gre/modules/ManifestFinder.jsm", {});
|
||||||
const defaultURL = new URL("http://example.org/browser/dom/manifest/test/resource.sjs");
|
const defaultURL = new URL("http://example.org/browser/dom/manifest/test/resource.sjs");
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
//Used by JSHint:
|
// Used by JSHint:
|
||||||
/*global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
/* global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
||||||
"use strict";
|
"use strict";
|
||||||
const { ManifestIcons } = ChromeUtils.import("resource://gre/modules/ManifestIcons.jsm", {});
|
const { ManifestIcons } = ChromeUtils.import("resource://gre/modules/ManifestIcons.jsm", {});
|
||||||
const { ManifestObtainer } = ChromeUtils.import("resource://gre/modules/ManifestObtainer.jsm", {});
|
const { ManifestObtainer } = ChromeUtils.import("resource://gre/modules/ManifestObtainer.jsm", {});
|
||||||
|
|
@ -10,11 +10,11 @@ defaultURL.searchParams.set("Content-Type", "application/manifest+json");
|
||||||
const manifest = JSON.stringify({
|
const manifest = JSON.stringify({
|
||||||
icons: [{
|
icons: [{
|
||||||
sizes: "50x50",
|
sizes: "50x50",
|
||||||
src: "red-50.png?Content-type=image/png"
|
src: "red-50.png?Content-type=image/png",
|
||||||
}, {
|
}, {
|
||||||
sizes: "150x150",
|
sizes: "150x150",
|
||||||
src: "blue-150.png?Content-type=image/png"
|
src: "blue-150.png?Content-type=image/png",
|
||||||
}]
|
}],
|
||||||
});
|
});
|
||||||
|
|
||||||
function makeTestURL(manifest) {
|
function makeTestURL(manifest) {
|
||||||
|
|
@ -27,7 +27,7 @@ function makeTestURL(manifest) {
|
||||||
|
|
||||||
function getIconColor(icon) {
|
function getIconColor(icon) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const canvas = content.document.createElement('canvas');
|
const canvas = content.document.createElement("canvas");
|
||||||
const ctx = canvas.getContext("2d");
|
const ctx = canvas.getContext("2d");
|
||||||
const image = new content.Image();
|
const image = new content.Image();
|
||||||
image.onload = function() {
|
image.onload = function() {
|
||||||
|
|
@ -47,10 +47,10 @@ add_task(async function() {
|
||||||
const manifest = await ManifestObtainer.browserObtainManifest(browser);
|
const manifest = await ManifestObtainer.browserObtainManifest(browser);
|
||||||
let icon = await ManifestIcons.browserFetchIcon(browser, manifest, 25);
|
let icon = await ManifestIcons.browserFetchIcon(browser, manifest, 25);
|
||||||
let color = await ContentTask.spawn(browser, icon, getIconColor);
|
let color = await ContentTask.spawn(browser, icon, getIconColor);
|
||||||
is(color[0], 255, 'Fetched red icon');
|
is(color[0], 255, "Fetched red icon");
|
||||||
|
|
||||||
icon = await ManifestIcons.browserFetchIcon(browser, manifest, 500);
|
icon = await ManifestIcons.browserFetchIcon(browser, manifest, 500);
|
||||||
color = await ContentTask.spawn(browser, icon, getIconColor);
|
color = await ContentTask.spawn(browser, icon, getIconColor);
|
||||||
is(color[2], 255, 'Fetched blue icon');
|
is(color[2], 255, "Fetched blue icon");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
//Used by JSHint:
|
// Used by JSHint:
|
||||||
/*global ok, is, Cu, BrowserTestUtils, add_task, gBrowser, makeTestURL, requestLongerTimeout*/
|
/* global ok, is, Cu, BrowserTestUtils, add_task, gBrowser, makeTestURL, requestLongerTimeout*/
|
||||||
'use strict';
|
"use strict";
|
||||||
const { ManifestObtainer } = ChromeUtils.import('resource://gre/modules/ManifestObtainer.jsm', {});
|
const { ManifestObtainer } = ChromeUtils.import("resource://gre/modules/ManifestObtainer.jsm", {});
|
||||||
const remoteURL = 'http://mochi.test:8888/browser/dom/manifest/test/resource.sjs';
|
const remoteURL = "http://mochi.test:8888/browser/dom/manifest/test/resource.sjs";
|
||||||
const defaultURL = new URL('http://example.org/browser/dom/manifest/test/resource.sjs');
|
const defaultURL = new URL("http://example.org/browser/dom/manifest/test/resource.sjs");
|
||||||
defaultURL.searchParams.set('Content-Type', 'text/html; charset=utf-8');
|
defaultURL.searchParams.set("Content-Type", "text/html; charset=utf-8");
|
||||||
requestLongerTimeout(4);
|
requestLongerTimeout(4);
|
||||||
|
|
||||||
const tests = [
|
const tests = [
|
||||||
|
|
@ -15,20 +15,20 @@ const tests = [
|
||||||
<link rel="foo bar manifest bar test" href='resource.sjs?body={"name":"pass-1"}'>
|
<link rel="foo bar manifest bar test" href='resource.sjs?body={"name":"pass-1"}'>
|
||||||
<link rel="manifest" href='resource.sjs?body={"name":"fail"}'>`,
|
<link rel="manifest" href='resource.sjs?body={"name":"fail"}'>`,
|
||||||
run(manifest) {
|
run(manifest) {
|
||||||
is(manifest.name, 'pass-1', 'Manifest is first `link` where @rel contains token manifest.');
|
is(manifest.name, "pass-1", "Manifest is first `link` where @rel contains token manifest.");
|
||||||
}
|
},
|
||||||
}, {
|
}, {
|
||||||
body: `
|
body: `
|
||||||
<link rel="foo bar manifest bar test" href='resource.sjs?body={"name":"pass-2"}'>
|
<link rel="foo bar manifest bar test" href='resource.sjs?body={"name":"pass-2"}'>
|
||||||
<link rel="manifest" href='resource.sjs?body={"name":"fail"}'>
|
<link rel="manifest" href='resource.sjs?body={"name":"fail"}'>
|
||||||
<link rel="manifest foo bar test" href='resource.sjs?body={"name":"fail"}'>`,
|
<link rel="manifest foo bar test" href='resource.sjs?body={"name":"fail"}'>`,
|
||||||
run(manifest) {
|
run(manifest) {
|
||||||
is(manifest.name, 'pass-2', 'Manifest is first `link` where @rel contains token manifest.');
|
is(manifest.name, "pass-2", "Manifest is first `link` where @rel contains token manifest.");
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
body: `<link rel="manifest" href='${remoteURL}?body={"name":"pass-3"}'>`,
|
body: `<link rel="manifest" href='${remoteURL}?body={"name":"pass-3"}'>`,
|
||||||
run(err) {
|
run(err) {
|
||||||
is(err.name, 'TypeError', 'By default, manifest cannot load cross-origin.');
|
is(err.name, "TypeError", "By default, manifest cannot load cross-origin.");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// CORS Tests.
|
// CORS Tests.
|
||||||
|
|
@ -45,12 +45,12 @@ const tests = [
|
||||||
return link;
|
return link;
|
||||||
},
|
},
|
||||||
run(manifest) {
|
run(manifest) {
|
||||||
is(manifest.name, 'pass-4', 'CORS enabled, manifest must be fetched.');
|
is(manifest.name, "pass-4", "CORS enabled, manifest must be fetched.");
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
get body() {
|
get body() {
|
||||||
const body = 'body={"name": "fail"}';
|
const body = 'body={"name": "fail"}';
|
||||||
const CORS = 'Access-Control-Allow-Origin=http://not-here';
|
const CORS = "Access-Control-Allow-Origin=http://not-here";
|
||||||
const link =
|
const link =
|
||||||
`<link
|
`<link
|
||||||
crossorigin
|
crossorigin
|
||||||
|
|
@ -59,31 +59,31 @@ const tests = [
|
||||||
return link;
|
return link;
|
||||||
},
|
},
|
||||||
run(err) {
|
run(err) {
|
||||||
is(err.name, 'TypeError', 'Fetch blocked by CORS - origin does not match.');
|
is(err.name, "TypeError", "Fetch blocked by CORS - origin does not match.");
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
body: `<link rel="manifest" href='about:whatever'>`,
|
body: `<link rel="manifest" href='about:whatever'>`,
|
||||||
run(err) {
|
run(err) {
|
||||||
is(err.name, 'TypeError', 'Trying to load from about:whatever is TypeError.');
|
is(err.name, "TypeError", "Trying to load from about:whatever is TypeError.");
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
body: `<link rel="manifest" href='file://manifest'>`,
|
body: `<link rel="manifest" href='file://manifest'>`,
|
||||||
run(err) {
|
run(err) {
|
||||||
is(err.name, 'TypeError', 'Trying to load from file://whatever is a TypeError.');
|
is(err.name, "TypeError", "Trying to load from file://whatever is a TypeError.");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
//URL parsing tests
|
// URL parsing tests
|
||||||
{
|
{
|
||||||
body: `<link rel="manifest" href='http://[12.1212.21.21.12.21.12]'>`,
|
body: `<link rel="manifest" href='http://[12.1212.21.21.12.21.12]'>`,
|
||||||
run(err) {
|
run(err) {
|
||||||
is(err.name, 'TypeError', 'Trying to load invalid URL is a TypeError.');
|
is(err.name, "TypeError", "Trying to load invalid URL is a TypeError.");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function makeTestURL({ body }) {
|
function makeTestURL({ body }) {
|
||||||
const url = new URL(defaultURL);
|
const url = new URL(defaultURL);
|
||||||
url.searchParams.set('body', encodeURIComponent(body));
|
url.searchParams.set("body", encodeURIComponent(body));
|
||||||
return url.href;
|
return url.href;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,7 +92,7 @@ add_task(async function() {
|
||||||
.map(test => ({
|
.map(test => ({
|
||||||
gBrowser,
|
gBrowser,
|
||||||
testRunner: testObtainingManifest(test),
|
testRunner: testObtainingManifest(test),
|
||||||
url: makeTestURL(test)
|
url: makeTestURL(test),
|
||||||
}))
|
}))
|
||||||
.reduce((collector, tabOpts) => {
|
.reduce((collector, tabOpts) => {
|
||||||
const promise = BrowserTestUtils.withNewTab(tabOpts, tabOpts.testRunner);
|
const promise = BrowserTestUtils.withNewTab(tabOpts, tabOpts.testRunner);
|
||||||
|
|
@ -120,7 +120,7 @@ add_task(async function() {
|
||||||
* in each tab. They should all return pass.
|
* in each tab. They should all return pass.
|
||||||
*/
|
*/
|
||||||
add_task(async function() {
|
add_task(async function() {
|
||||||
const defaultPath = '/browser/dom/manifest/test/manifestLoader.html';
|
const defaultPath = "/browser/dom/manifest/test/manifestLoader.html";
|
||||||
const tabURLs = [
|
const tabURLs = [
|
||||||
`http://example.com:80${defaultPath}`,
|
`http://example.com:80${defaultPath}`,
|
||||||
`http://example.org:80${defaultPath}`,
|
`http://example.org:80${defaultPath}`,
|
||||||
|
|
@ -155,26 +155,26 @@ add_task(async function() {
|
||||||
let browsers = tabURLs.map(url => BrowserTestUtils.addTab(gBrowser, url).linkedBrowser);
|
let browsers = tabURLs.map(url => BrowserTestUtils.addTab(gBrowser, url).linkedBrowser);
|
||||||
|
|
||||||
// Once all the pages have loaded, run a bunch of tests in "parallel".
|
// Once all the pages have loaded, run a bunch of tests in "parallel".
|
||||||
await Promise.all((function*() {
|
await Promise.all((function* () {
|
||||||
for (let browser of browsers) {
|
for (let browser of browsers) {
|
||||||
yield BrowserTestUtils.browserLoaded(browser);
|
yield BrowserTestUtils.browserLoaded(browser);
|
||||||
}
|
}
|
||||||
})());
|
})());
|
||||||
// Flood random browsers with requests. Once promises settle, check that
|
// Flood random browsers with requests. Once promises settle, check that
|
||||||
// responses all pass.
|
// responses all pass.
|
||||||
const results = await Promise.all((function*() {
|
const results = await Promise.all((function* () {
|
||||||
for (let browser of randBrowsers(browsers, 50)) {
|
for (let browser of randBrowsers(browsers, 50)) {
|
||||||
yield ManifestObtainer.browserObtainManifest(browser);
|
yield ManifestObtainer.browserObtainManifest(browser);
|
||||||
}
|
}
|
||||||
})());
|
})());
|
||||||
const pass = results.every(manifest => manifest.name === 'pass');
|
const pass = results.every(manifest => manifest.name === "pass");
|
||||||
ok(pass, 'Expect every manifest to have name equal to `pass`.');
|
ok(pass, "Expect every manifest to have name equal to `pass`.");
|
||||||
//cleanup
|
// cleanup
|
||||||
browsers
|
browsers
|
||||||
.map(browser => gBrowser.getTabForBrowser(browser))
|
.map(browser => gBrowser.getTabForBrowser(browser))
|
||||||
.forEach(tab => gBrowser.removeTab(tab));
|
.forEach(tab => gBrowser.removeTab(tab));
|
||||||
|
|
||||||
//Helper generator, spits out random browsers
|
// Helper generator, spits out random browsers
|
||||||
function* randBrowsers(aBrowsers, aMax) {
|
function* randBrowsers(aBrowsers, aMax) {
|
||||||
for (let i = 0; i < aMax; i++) {
|
for (let i = 0; i < aMax; i++) {
|
||||||
const randNum = Math.round(Math.random() * (aBrowsers.length - 1));
|
const randNum = Math.round(Math.random() * (aBrowsers.length - 1));
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
//Used by JSHint:
|
// Used by JSHint:
|
||||||
/*global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
/* global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const { Manifests } = ChromeUtils.import("resource://gre/modules/Manifest.jsm", {});
|
const { Manifests } = ChromeUtils.import("resource://gre/modules/Manifest.jsm", {});
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
//Used by JSHint:
|
// Used by JSHint:
|
||||||
/*global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
/* global Cu, BrowserTestUtils, ok, add_task, gBrowser */
|
||||||
"use strict";
|
"use strict";
|
||||||
const { PromiseMessage } = ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm", {});
|
const { PromiseMessage } = ChromeUtils.import("resource://gre/modules/PromiseMessage.jsm", {});
|
||||||
const testPath = "/browser/dom/manifest/test/file_reg_appinstalled_event.html";
|
const testPath = "/browser/dom/manifest/test/file_reg_appinstalled_event.html";
|
||||||
|
|
@ -39,7 +39,7 @@ async function theTest(aBrowser) {
|
||||||
add_task(async function() {
|
add_task(async function() {
|
||||||
await enableOnAppInstalledPref();
|
await enableOnAppInstalledPref();
|
||||||
let tabOptions = {
|
let tabOptions = {
|
||||||
gBrowser: gBrowser,
|
gBrowser,
|
||||||
url: testURL.href,
|
url: testURL.href,
|
||||||
};
|
};
|
||||||
await BrowserTestUtils.withNewTab(
|
await BrowserTestUtils.withNewTab(
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
/**
|
/**
|
||||||
* Common infrastructure for manifest tests.
|
* Common infrastructure for manifest tests.
|
||||||
**/
|
**/
|
||||||
/*globals SpecialPowers, ManifestProcessor*/
|
/* globals SpecialPowers, ManifestProcessor*/
|
||||||
'use strict';
|
"use strict";
|
||||||
const {
|
const {
|
||||||
ManifestProcessor
|
ManifestProcessor,
|
||||||
} = SpecialPowers.Cu.import('resource://gre/modules/ManifestProcessor.jsm');
|
} = SpecialPowers.Cu.import("resource://gre/modules/ManifestProcessor.jsm");
|
||||||
const processor = ManifestProcessor;
|
const processor = ManifestProcessor;
|
||||||
const manifestURL = new URL(document.location.origin + '/manifest.json');
|
const manifestURL = new URL(document.location.origin + "/manifest.json");
|
||||||
const docURL = document.location;
|
const docURL = document.location;
|
||||||
const seperators = '\u2028\u2029\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000';
|
const seperators = "\u2028\u2029\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000";
|
||||||
const lineTerminators = '\u000D\u000A\u2028\u2029';
|
const lineTerminators = "\u000D\u000A\u2028\u2029";
|
||||||
const whiteSpace = `${seperators}${lineTerminators}`;
|
const whiteSpace = `${seperators}${lineTerminators}`;
|
||||||
const typeTests = [1, null, {},
|
const typeTests = [1, null, {},
|
||||||
[], false
|
[], false,
|
||||||
];
|
];
|
||||||
const data = {
|
const data = {
|
||||||
jsonText: '{}',
|
jsonText: "{}",
|
||||||
manifestURL: manifestURL,
|
manifestURL,
|
||||||
docURL: docURL
|
docURL,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ window.addEventListener("appinstalled", () => {
|
||||||
.innerHTML = "event received!";
|
.innerHTML = "event received!";
|
||||||
// Send a custom event back to the browser
|
// Send a custom event back to the browser
|
||||||
// to acknowledge that we got this
|
// to acknowledge that we got this
|
||||||
const detail = { result: true }
|
const detail = { result: true };
|
||||||
const ev = new CustomEvent("dom.manifest.onappinstalled", { detail });
|
const ev = new CustomEvent("dom.manifest.onappinstalled", { detail });
|
||||||
document.dispatchEvent(ev);
|
document.dispatchEvent(ev);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -14,47 +14,47 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* Image object's sizes member
|
* Image object's sizes member
|
||||||
* https://w3c.github.io/manifest/#sizes-member
|
* https://w3c.github.io/manifest/#sizes-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
var validSizes = [{
|
var validSizes = [{
|
||||||
test: '16x16',
|
test: "16x16",
|
||||||
expect: ['16x16']
|
expect: ["16x16"],
|
||||||
}, {
|
}, {
|
||||||
test: 'hello 16x16 16x16',
|
test: "hello 16x16 16x16",
|
||||||
expect: ['16x16']
|
expect: ["16x16"],
|
||||||
}, {
|
}, {
|
||||||
test: '32x32 16 48x48 12',
|
test: "32x32 16 48x48 12",
|
||||||
expect: ['32x32', '48x48']
|
expect: ["32x32", "48x48"],
|
||||||
}, {
|
}, {
|
||||||
test: `${whiteSpace}128x128${whiteSpace}512x512 8192x8192 32768x32768${whiteSpace}`,
|
test: `${whiteSpace}128x128${whiteSpace}512x512 8192x8192 32768x32768${whiteSpace}`,
|
||||||
expect: ['128x128', '512x512', '8192x8192', '32768x32768']
|
expect: ["128x128", "512x512", "8192x8192", "32768x32768"],
|
||||||
}, {
|
}, {
|
||||||
test: 'any',
|
test: "any",
|
||||||
expect: ['any']
|
expect: ["any"],
|
||||||
}, {
|
}, {
|
||||||
test: 'Any',
|
test: "Any",
|
||||||
expect: ['Any']
|
expect: ["Any"],
|
||||||
}, {
|
}, {
|
||||||
test: '16x32',
|
test: "16x32",
|
||||||
expect: ['16x32']
|
expect: ["16x32"],
|
||||||
}, {
|
}, {
|
||||||
test: '17x33',
|
test: "17x33",
|
||||||
expect: ['17x33']
|
expect: ["17x33"],
|
||||||
}, {
|
}, {
|
||||||
test: '32x32 32x32',
|
test: "32x32 32x32",
|
||||||
expect: ['32x32']
|
expect: ["32x32"],
|
||||||
}, {
|
}, {
|
||||||
test: '32X32',
|
test: "32X32",
|
||||||
expect: ['32X32']
|
expect: ["32X32"],
|
||||||
}, {
|
}, {
|
||||||
test: 'any 32x32',
|
test: "any 32x32",
|
||||||
expect: ['any', '32x32']
|
expect: ["any", "32x32"],
|
||||||
}];
|
}];
|
||||||
|
|
||||||
var testIcon = {
|
var testIcon = {
|
||||||
icons: [{
|
icons: [{
|
||||||
src: 'test',
|
src: "test",
|
||||||
sizes: undefined
|
sizes: undefined,
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
validSizes.forEach(({test, expect}) => {
|
validSizes.forEach(({test, expect}) => {
|
||||||
|
|
@ -68,14 +68,14 @@ validSizes.forEach(({test, expect}) => {
|
||||||
|
|
||||||
var testIcon = {
|
var testIcon = {
|
||||||
icons: [{
|
icons: [{
|
||||||
src: 'test',
|
src: "test",
|
||||||
sizes: undefined
|
sizes: undefined,
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
var invalidSizes = ['invalid', '', ' ', '16 x 16', '32', '21', '16xx16', '16 x x 6'];
|
var invalidSizes = ["invalid", "", " ", "16 x 16", "32", "21", "16xx16", "16 x x 6"];
|
||||||
invalidSizes.forEach((invalidSize) => {
|
invalidSizes.forEach((invalidSize) => {
|
||||||
var expected = 'Expect invalid sizes to return undefined.';
|
var expected = "Expect invalid sizes to return undefined.";
|
||||||
testIcon.icons[0].sizes = invalidSize;
|
testIcon.icons[0].sizes = invalidSize;
|
||||||
data.jsonText = JSON.stringify(testIcon);
|
data.jsonText = JSON.stringify(testIcon);
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
|
||||||
|
|
@ -14,22 +14,22 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* Image object's src member
|
* Image object's src member
|
||||||
* https://w3c.github.io/manifest/#src-member
|
* https://w3c.github.io/manifest/#src-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
var noSrc = {
|
var noSrc = {
|
||||||
icons: [{}, {
|
icons: [{}, {
|
||||||
src: []
|
src: [],
|
||||||
}, {
|
}, {
|
||||||
src: {}
|
src: {},
|
||||||
}, {
|
}, {
|
||||||
src: null
|
src: null,
|
||||||
}, {
|
}, {
|
||||||
type: 'image/jpg'
|
type: "image/jpg",
|
||||||
}, {
|
}, {
|
||||||
sizes: '1x1,2x2'
|
sizes: "1x1,2x2",
|
||||||
}, {
|
}, {
|
||||||
sizes: 'any',
|
sizes: "any",
|
||||||
type: 'image/jpg'
|
type: "image/jpg",
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
var expected = `Expect icons without a src prop to be filtered out.`;
|
var expected = `Expect icons without a src prop to be filtered out.`;
|
||||||
|
|
@ -39,18 +39,18 @@ is(result.icons.length, 0, expected);
|
||||||
|
|
||||||
var invalidSrc = {
|
var invalidSrc = {
|
||||||
icons: [{
|
icons: [{
|
||||||
src: null
|
src: null,
|
||||||
}, {
|
}, {
|
||||||
src: 1
|
src: 1,
|
||||||
}, {
|
}, {
|
||||||
src: []
|
src: [],
|
||||||
}, {
|
}, {
|
||||||
src: {}
|
src: {},
|
||||||
}, {
|
}, {
|
||||||
src: true
|
src: true,
|
||||||
}, {
|
}, {
|
||||||
src: ''
|
src: "",
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
var expected = `Expect icons with invalid src prop to be filtered out.`;
|
var expected = `Expect icons with invalid src prop to be filtered out.`;
|
||||||
|
|
@ -61,8 +61,8 @@ is(result.icons.length, 0, expected);
|
||||||
var expected = `Expect icon's src to be a string.`;
|
var expected = `Expect icon's src to be a string.`;
|
||||||
var withSrc = {
|
var withSrc = {
|
||||||
icons: [{
|
icons: [{
|
||||||
src: 'pass'
|
src: "pass",
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
data.jsonText = JSON.stringify(withSrc);
|
data.jsonText = JSON.stringify(withSrc);
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
@ -71,32 +71,32 @@ is(typeof result.icons[0].src, "string", expected);
|
||||||
var expected = `Expect only icons with a src prop to be kept.`;
|
var expected = `Expect only icons with a src prop to be kept.`;
|
||||||
var withSrc = {
|
var withSrc = {
|
||||||
icons: [{
|
icons: [{
|
||||||
src: 'pass'
|
src: "pass",
|
||||||
}, {
|
}, {
|
||||||
src: 'pass',
|
src: "pass",
|
||||||
}, {}, {
|
}, {}, {
|
||||||
foo: 'foo'
|
foo: "foo",
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
data.jsonText = JSON.stringify(withSrc);
|
data.jsonText = JSON.stringify(withSrc);
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.icons.length, 2, expected);
|
is(result.icons.length, 2, expected);
|
||||||
|
|
||||||
var expectedURL = new URL('pass', manifestURL);
|
var expectedURL = new URL("pass", manifestURL);
|
||||||
for (var icon of result.icons) {
|
for (var icon of result.icons) {
|
||||||
var expected = `Expect src prop to be ${expectedURL.toString()}`;
|
var expected = `Expect src prop to be ${expectedURL.toString()}`;
|
||||||
is(icon.src.toString(), expectedURL.toString(), expected);
|
is(icon.src.toString(), expectedURL.toString(), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Resolve URLs relative to manfiest
|
// Resolve URLs relative to manfiest
|
||||||
var URLs = ['path', '/path', '../../path'];
|
var URLs = ["path", "/path", "../../path"];
|
||||||
|
|
||||||
URLs.forEach((url) => {
|
URLs.forEach((url) => {
|
||||||
var expected = `Resolve icon src URLs relative to manifest.`;
|
var expected = `Resolve icon src URLs relative to manifest.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
icons: [{
|
icons: [{
|
||||||
src: url
|
src: url,
|
||||||
}]
|
}],
|
||||||
});
|
});
|
||||||
var absURL = new URL(url, manifestURL).toString();
|
var absURL = new URL(url, manifestURL).toString();
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
|
||||||
|
|
@ -15,20 +15,20 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* https://w3c.github.io/manifest/#type-member
|
* https://w3c.github.io/manifest/#type-member
|
||||||
**/
|
**/
|
||||||
|
|
||||||
'use strict';
|
"use strict";
|
||||||
var testIcon = {
|
var testIcon = {
|
||||||
icons: [{
|
icons: [{
|
||||||
src: 'test',
|
src: "test",
|
||||||
type: undefined
|
type: undefined,
|
||||||
}]
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
var invalidMimeTypes = [
|
var invalidMimeTypes = [
|
||||||
'application / text',
|
"application / text",
|
||||||
'test;test',
|
"test;test",
|
||||||
';test?test',
|
";test?test",
|
||||||
'application\\text',
|
"application\\text",
|
||||||
'image/jpeg, image/gif'
|
"image/jpeg, image/gif",
|
||||||
];
|
];
|
||||||
invalidMimeTypes.forEach((invalidMime) => {
|
invalidMimeTypes.forEach((invalidMime) => {
|
||||||
var expected = `Expect invalid mime to be treated like undefined.`;
|
var expected = `Expect invalid mime to be treated like undefined.`;
|
||||||
|
|
@ -39,11 +39,11 @@ invalidMimeTypes.forEach((invalidMime) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
var validTypes = [
|
var validTypes = [
|
||||||
'image/jpeg',
|
"image/jpeg",
|
||||||
'IMAGE/jPeG',
|
"IMAGE/jPeG",
|
||||||
`${whiteSpace}image/jpeg${whiteSpace}`,
|
`${whiteSpace}image/jpeg${whiteSpace}`,
|
||||||
'image/JPEG; whatever=something',
|
"image/JPEG; whatever=something",
|
||||||
'image/JPEG;whatever'
|
"image/JPEG;whatever",
|
||||||
];
|
];
|
||||||
|
|
||||||
validTypes.forEach((validMime) => {
|
validTypes.forEach((validMime) => {
|
||||||
|
|
@ -51,7 +51,7 @@ validTypes.forEach((validMime) => {
|
||||||
testIcon.icons[0].type = validMime;
|
testIcon.icons[0].type = validMime;
|
||||||
data.jsonText = JSON.stringify(testIcon);
|
data.jsonText = JSON.stringify(testIcon);
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.icons[0].type, 'image/jpeg', expected);
|
is(result.icons[0].type, "image/jpeg", expected);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* JSON parsing/processing tests
|
* JSON parsing/processing tests
|
||||||
* https://w3c.github.io/manifest/#processing
|
* https://w3c.github.io/manifest/#processing
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
var invalidJson = ['', ` \t \n ${whiteSpace} `, '{', '{[[}'];
|
var invalidJson = ["", ` \t \n ${whiteSpace} `, "{", "{[[}"];
|
||||||
invalidJson.forEach((testString) => {
|
invalidJson.forEach((testString) => {
|
||||||
var expected = `Expect to recover from invalid JSON: ${testString}`;
|
var expected = `Expect to recover from invalid JSON: ${testString}`;
|
||||||
data.jsonText = testString;
|
data.jsonText = testString;
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1195018
|
||||||
* background_color member
|
* background_color member
|
||||||
* https://w3c.github.io/manifest/#background_color-member
|
* https://w3c.github.io/manifest/#background_color-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
typeTests.forEach(type => {
|
typeTests.forEach(type => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
background_color: type
|
background_color: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
@ -26,52 +26,52 @@ typeTests.forEach(type => {
|
||||||
});
|
});
|
||||||
|
|
||||||
var validThemeColors = [
|
var validThemeColors = [
|
||||||
'maroon',
|
"maroon",
|
||||||
'#f00',
|
"#f00",
|
||||||
'#ff0000',
|
"#ff0000",
|
||||||
'rgb(255,0,0)',
|
"rgb(255,0,0)",
|
||||||
'rgb(255,0,0,1)',
|
"rgb(255,0,0,1)",
|
||||||
'rgb(255,0,0,1.0)',
|
"rgb(255,0,0,1.0)",
|
||||||
'rgb(255,0,0,100%)',
|
"rgb(255,0,0,100%)",
|
||||||
'rgb(255 0 0)',
|
"rgb(255 0 0)",
|
||||||
'rgb(255 0 0 / 1)',
|
"rgb(255 0 0 / 1)",
|
||||||
'rgb(255 0 0 / 1.0)',
|
"rgb(255 0 0 / 1.0)",
|
||||||
'rgb(255 0 0 / 100%)',
|
"rgb(255 0 0 / 100%)",
|
||||||
'rgb(100%, 0%, 0%)',
|
"rgb(100%, 0%, 0%)",
|
||||||
'rgb(100%, 0%, 0%, 1)',
|
"rgb(100%, 0%, 0%, 1)",
|
||||||
'rgb(100%, 0%, 0%, 1.0)',
|
"rgb(100%, 0%, 0%, 1.0)",
|
||||||
'rgb(100%, 0%, 0%, 100%)',
|
"rgb(100%, 0%, 0%, 100%)",
|
||||||
'rgb(100% 0% 0%)',
|
"rgb(100% 0% 0%)",
|
||||||
'rgb(100% 0% 0% / 1)',
|
"rgb(100% 0% 0% / 1)",
|
||||||
'rgb(100%, 0%, 0%, 1.0)',
|
"rgb(100%, 0%, 0%, 1.0)",
|
||||||
'rgb(100%, 0%, 0%, 100%)',
|
"rgb(100%, 0%, 0%, 100%)",
|
||||||
'rgb(300,0,0)',
|
"rgb(300,0,0)",
|
||||||
'rgb(300 0 0)',
|
"rgb(300 0 0)",
|
||||||
'rgb(255,-10,0)',
|
"rgb(255,-10,0)",
|
||||||
'rgb(110%, 0%, 0%)',
|
"rgb(110%, 0%, 0%)",
|
||||||
'rgba(255,0,0)',
|
"rgba(255,0,0)",
|
||||||
'rgba(255,0,0,1)',
|
"rgba(255,0,0,1)",
|
||||||
'rgba(255 0 0 / 1)',
|
"rgba(255 0 0 / 1)",
|
||||||
'rgba(100%,0%,0%,1)',
|
"rgba(100%,0%,0%,1)",
|
||||||
'rgba(0,0,255,0.5)',
|
"rgba(0,0,255,0.5)",
|
||||||
'rgba(100%, 50%, 0%, 0.1)',
|
"rgba(100%, 50%, 0%, 0.1)",
|
||||||
'hsl(120, 100%, 50%)',
|
"hsl(120, 100%, 50%)",
|
||||||
'hsl(120 100% 50%)',
|
"hsl(120 100% 50%)",
|
||||||
'hsl(120, 100%, 50%, 1.0)',
|
"hsl(120, 100%, 50%, 1.0)",
|
||||||
'hsl(120 100% 50% / 1.0)',
|
"hsl(120 100% 50% / 1.0)",
|
||||||
'hsla(120, 100%, 50%)',
|
"hsla(120, 100%, 50%)",
|
||||||
'hsla(120 100% 50%)',
|
"hsla(120 100% 50%)",
|
||||||
'hsla(120, 100%, 50%, 1.0)',
|
"hsla(120, 100%, 50%, 1.0)",
|
||||||
'hsla(120 100% 50% / 1.0)',
|
"hsla(120 100% 50% / 1.0)",
|
||||||
'hsl(120deg, 100%, 50%)',
|
"hsl(120deg, 100%, 50%)",
|
||||||
'hsl(133.33333333grad, 100%, 50%)',
|
"hsl(133.33333333grad, 100%, 50%)",
|
||||||
'hsl(2.0943951024rad, 100%, 50%)',
|
"hsl(2.0943951024rad, 100%, 50%)",
|
||||||
'hsl(0.3333333333turn, 100%, 50%)',
|
"hsl(0.3333333333turn, 100%, 50%)",
|
||||||
];
|
];
|
||||||
|
|
||||||
validThemeColors.forEach(background_color => {
|
validThemeColors.forEach(background_color => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
background_color: background_color
|
background_color,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
@ -79,25 +79,25 @@ validThemeColors.forEach(background_color => {
|
||||||
});
|
});
|
||||||
|
|
||||||
var invalidThemeColors = [
|
var invalidThemeColors = [
|
||||||
'marooon',
|
"marooon",
|
||||||
'f000000',
|
"f000000",
|
||||||
'#ff00000',
|
"#ff00000",
|
||||||
'rgb(100, 0%, 0%)',
|
"rgb(100, 0%, 0%)",
|
||||||
'rgb(255,0)',
|
"rgb(255,0)",
|
||||||
'rbg(255,-10,0)',
|
"rbg(255,-10,0)",
|
||||||
'rgb(110, 0%, 0%)',
|
"rgb(110, 0%, 0%)",
|
||||||
'(255,0,0) }',
|
"(255,0,0) }",
|
||||||
'rgba(255)',
|
"rgba(255)",
|
||||||
' rgb(100%,0%,0%) }',
|
" rgb(100%,0%,0%) }",
|
||||||
'hsl(120, 100%, 50)',
|
"hsl(120, 100%, 50)",
|
||||||
'hsl(120, 100%, 50.0)',
|
"hsl(120, 100%, 50.0)",
|
||||||
'hsl 120, 100%, 50%',
|
"hsl 120, 100%, 50%",
|
||||||
'hsla{120, 100%, 50%, 1}',
|
"hsla{120, 100%, 50%, 1}",
|
||||||
]
|
];
|
||||||
|
|
||||||
invalidThemeColors.forEach(background_color => {
|
invalidThemeColors.forEach(background_color => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
background_color: background_color
|
background_color,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
@ -108,7 +108,7 @@ invalidThemeColors.forEach(background_color => {
|
||||||
validThemeColors.forEach(background_color => {
|
validThemeColors.forEach(background_color => {
|
||||||
var expandedThemeColor = `${seperators}${lineTerminators}${background_color}${lineTerminators}${seperators}`;
|
var expandedThemeColor = `${seperators}${lineTerminators}${background_color}${lineTerminators}${seperators}`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
background_color: expandedThemeColor
|
background_color: expandedThemeColor,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,19 +14,19 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1258899
|
||||||
* dir member
|
* dir member
|
||||||
* https://w3c.github.io/manifest/#dir-member
|
* https://w3c.github.io/manifest/#dir-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
//Type checks
|
// Type checks
|
||||||
typeTests.forEach((type) => {
|
typeTests.forEach((type) => {
|
||||||
var expected = `Expect non - string dir to default to "auto".`;
|
var expected = `Expect non - string dir to default to "auto".`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
dir: type
|
dir: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.dir, 'auto', expected);
|
is(result.dir, "auto", expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
/*Test valid values*/
|
/* Test valid values*/
|
||||||
var validDirs = ['ltr', 'rtl', 'auto']
|
var validDirs = ["ltr", "rtl", "auto"];
|
||||||
validDirs.forEach((dir) => {
|
validDirs.forEach((dir) => {
|
||||||
var expected = `Expect dir value to be ${dir}.`;
|
var expected = `Expect dir value to be ${dir}.`;
|
||||||
data.jsonText = JSON.stringify({dir});
|
data.jsonText = JSON.stringify({dir});
|
||||||
|
|
@ -34,24 +34,24 @@ validDirs.forEach((dir) => {
|
||||||
is(result.dir, dir, expected);
|
is(result.dir, dir, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
//trim tests
|
// trim tests
|
||||||
validDirs.forEach((dir) => {
|
validDirs.forEach((dir) => {
|
||||||
var expected = `Expect trimmed dir to be returned.`;
|
var expected = `Expect trimmed dir to be returned.`;
|
||||||
var expandeddir = seperators + lineTerminators + dir + lineTerminators + seperators;
|
var expandeddir = seperators + lineTerminators + dir + lineTerminators + seperators;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
dir: expandeddir
|
dir: expandeddir,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.dir, dir, expected);
|
is(result.dir, dir, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
//Unknown/Invalid directions
|
// Unknown/Invalid directions
|
||||||
var invalidDirs = ['LTR', 'RtL', `fooo${whiteSpace}rtl`, '', 'bar baz, some value', 'ltr rtl auto', 'AuTo'];
|
var invalidDirs = ["LTR", "RtL", `fooo${whiteSpace}rtl`, "", "bar baz, some value", "ltr rtl auto", "AuTo"];
|
||||||
invalidDirs.forEach((dir) => {
|
invalidDirs.forEach((dir) => {
|
||||||
var expected = `Expect default dir "auto" to be returned: '${dir}'`;
|
var expected = `Expect default dir "auto" to be returned: '${dir}'`;
|
||||||
data.jsonText = JSON.stringify({dir});
|
data.jsonText = JSON.stringify({dir});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.dir, 'auto', expected);
|
is(result.dir, "auto", expected);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -14,65 +14,65 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* display member
|
* display member
|
||||||
* https://w3c.github.io/manifest/#display-member
|
* https://w3c.github.io/manifest/#display-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
//Type checks
|
// Type checks
|
||||||
typeTests.forEach((type) => {
|
typeTests.forEach((type) => {
|
||||||
var expected = `Expect non - string display to default to "browser".`;
|
var expected = `Expect non - string display to default to "browser".`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
display: type
|
display: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.display, 'browser', expected);
|
is(result.display, "browser", expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
/*Test valid modes - case insensitive*/
|
/* Test valid modes - case insensitive*/
|
||||||
var validModes = [
|
var validModes = [
|
||||||
'fullscreen',
|
"fullscreen",
|
||||||
'standalone',
|
"standalone",
|
||||||
'minimal-ui',
|
"minimal-ui",
|
||||||
'browser',
|
"browser",
|
||||||
'FullScreen',
|
"FullScreen",
|
||||||
'standAlone',
|
"standAlone",
|
||||||
'minimal-UI',
|
"minimal-UI",
|
||||||
'BROWSER',
|
"BROWSER",
|
||||||
]
|
];
|
||||||
validModes.forEach((mode) => {
|
validModes.forEach((mode) => {
|
||||||
var expected = `Expect display mode to be ${mode.toLowerCase()}.`;
|
var expected = `Expect display mode to be ${mode.toLowerCase()}.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
display: mode
|
display: mode,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.display, mode.toLowerCase(), expected);
|
is(result.display, mode.toLowerCase(), expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
//trim tests
|
// trim tests
|
||||||
validModes.forEach((display) => {
|
validModes.forEach((display) => {
|
||||||
var expected = `Expect trimmed display mode to be returned.`;
|
var expected = `Expect trimmed display mode to be returned.`;
|
||||||
var expandedDisplay = seperators + lineTerminators + display + lineTerminators + seperators;
|
var expandedDisplay = seperators + lineTerminators + display + lineTerminators + seperators;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
display: expandedDisplay
|
display: expandedDisplay,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.display, display.toLowerCase(), expected);
|
is(result.display, display.toLowerCase(), expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
//Unknown modes
|
// Unknown modes
|
||||||
var invalidModes = [
|
var invalidModes = [
|
||||||
'foo',
|
"foo",
|
||||||
`fooo${whiteSpace}`,
|
`fooo${whiteSpace}`,
|
||||||
'',
|
"",
|
||||||
'fullscreen,standalone',
|
"fullscreen,standalone",
|
||||||
'standalone fullscreen',
|
"standalone fullscreen",
|
||||||
'FULLSCreENS',
|
"FULLSCreENS",
|
||||||
];
|
];
|
||||||
|
|
||||||
invalidModes.forEach((invalidMode) => {
|
invalidModes.forEach((invalidMode) => {
|
||||||
var expected = `Expect default display mode "browser" to be returned: '${invalidMode}'`;
|
var expected = `Expect default display mode "browser" to be returned: '${invalidMode}'`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
display: invalidMode
|
display: invalidMode,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.display, 'browser', expected);
|
is(result.display, "browser", expected);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -15,12 +15,12 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* https://w3c.github.io/manifest/#icons-member
|
* https://w3c.github.io/manifest/#icons-member
|
||||||
**/
|
**/
|
||||||
|
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
typeTests.forEach((type) => {
|
typeTests.forEach((type) => {
|
||||||
var expected = `Expect non-array icons to be empty array: ${typeof type}.`;
|
var expected = `Expect non-array icons to be empty array: ${typeof type}.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
icons: type
|
icons: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
var y = SpecialPowers.unwrap(result.icons);
|
var y = SpecialPowers.unwrap(result.icons);
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,13 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1143879
|
||||||
* lang member
|
* lang member
|
||||||
* https://w3c.github.io/manifest/#lang-member
|
* https://w3c.github.io/manifest/#lang-member
|
||||||
**/
|
**/
|
||||||
/*globals is, typeTests, data, processor, seperators, lineTerminators, todo_is*/
|
/* globals is, typeTests, data, processor, seperators, lineTerminators, todo_is*/
|
||||||
'use strict';
|
"use strict";
|
||||||
// Type checks: checks that only strings are accepted.
|
// Type checks: checks that only strings are accepted.
|
||||||
for (var type of typeTests) {
|
for (var type of typeTests) {
|
||||||
var expected = `Expect non-string to be undefined.`;
|
var expected = `Expect non-string to be undefined.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
lang: type
|
lang: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.lang, undefined, expected);
|
is(result.lang, undefined, expected);
|
||||||
|
|
@ -28,34 +28,34 @@ for (var type of typeTests) {
|
||||||
// Test valid language tags - derived from IANA and BCP-47 spec
|
// Test valid language tags - derived from IANA and BCP-47 spec
|
||||||
// and our Intl.js implementation.
|
// and our Intl.js implementation.
|
||||||
var validTags = [
|
var validTags = [
|
||||||
'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az',
|
"aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az",
|
||||||
'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce',
|
"ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "ca", "ce",
|
||||||
'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee',
|
"ch", "co", "cr", "cs", "cu", "cv", "cy", "da", "de", "dv", "dz", "ee",
|
||||||
'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr',
|
"el", "en", "eo", "es", "et", "eu", "fa", "ff", "fi", "fj", "fo", "fr",
|
||||||
'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr',
|
"fy", "ga", "gd", "gl", "gn", "gu", "gv", "ha", "he", "hi", "ho", "hr",
|
||||||
'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ik', 'in', 'io',
|
"ht", "hu", "hy", "hz", "ia", "id", "ie", "ig", "ik", "in", "io",
|
||||||
'is', 'it', 'iu', 'iw', 'ja', 'ji', 'jv', 'jw', 'ka', 'kg', 'ki', 'kj',
|
"is", "it", "iu", "iw", "ja", "ji", "jv", "jw", "ka", "kg", "ki", "kj",
|
||||||
'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la',
|
"kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "la",
|
||||||
'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk',
|
"lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "mg", "mh", "mi", "mk",
|
||||||
'ml', 'mn', 'mo', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng',
|
"ml", "mn", "mo", "mr", "ms", "mt", "my", "na", "nb", "nd", "ne", "ng",
|
||||||
'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa',
|
"nl", "nn", "no", "nr", "nv", "ny", "oc", "oj", "om", "or", "os", "pa",
|
||||||
'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc',
|
"pi", "pl", "ps", "pt", "qu", "rm", "rn", "ro", "ru", "rw", "sa", "sc",
|
||||||
'sd', 'se', 'sg', 'sh', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr',
|
"sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr",
|
||||||
'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl',
|
"ss", "st", "su", "sv", "sw", "ta", "te", "tg", "th", "ti", "tk", "tl",
|
||||||
'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've',
|
"tn", "to", "tr", "ts", "tt", "tw", "ty", "ug", "uk", "ur", "uz", "ve",
|
||||||
'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu', 'en-US',
|
"vi", "vo", "wa", "wo", "xh", "yi", "yo", "za", "zh", "zu", "en-US",
|
||||||
'jp-JS', 'pt-PT', 'pt-BR', 'de-CH', 'de-DE-1901', 'es-419', 'sl-IT-nedis',
|
"jp-JS", "pt-PT", "pt-BR", "de-CH", "de-DE-1901", "es-419", "sl-IT-nedis",
|
||||||
'en-US-boont', 'mn-Cyrl-MN', 'x-fr-CH', 'sr-Cyrl', 'sr-Latn',
|
"en-US-boont", "mn-Cyrl-MN", "x-fr-CH", "sr-Cyrl", "sr-Latn",
|
||||||
'hy-Latn-IT-arevela', 'zh-TW', 'en-GB-boont-r-extended-sequence-x-private',
|
"hy-Latn-IT-arevela", "zh-TW", "en-GB-boont-r-extended-sequence-x-private",
|
||||||
'zh-nan-hans-bu-variant2-variant1-u-ca-chinese-t-zh-latn-x-private',
|
"zh-nan-hans-bu-variant2-variant1-u-ca-chinese-t-zh-latn-x-private",
|
||||||
'zh-cmn-Hans-CN', 'cmn-Hans-CN', 'zh-yue-HK', 'yue-HK',
|
"zh-cmn-Hans-CN", "cmn-Hans-CN", "zh-yue-HK", "yue-HK",
|
||||||
'de-CH-x-phonebk', 'az-Arab-x-AZE-derbend', 'x-whatever',
|
"de-CH-x-phonebk", "az-Arab-x-AZE-derbend", "x-whatever",
|
||||||
'qaa-Qaaa-QM-x-southern'
|
"qaa-Qaaa-QM-x-southern",
|
||||||
];
|
];
|
||||||
for (var tag of validTags) {
|
for (var tag of validTags) {
|
||||||
var expected = `Expect lang to be ${tag}.`;
|
var expected = `Expect lang to be ${tag}.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
lang: tag
|
lang: tag,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.lang, tag, expected);
|
is(result.lang, tag, expected);
|
||||||
|
|
@ -67,21 +67,21 @@ for (var tag of validTags) {
|
||||||
var expandedtag = seperators + lineTerminators + tag;
|
var expandedtag = seperators + lineTerminators + tag;
|
||||||
expandedtag += lineTerminators + seperators;
|
expandedtag += lineTerminators + seperators;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
lang: expandedtag
|
lang: expandedtag,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.lang, tag, expected);
|
is(result.lang, tag, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Invalid language tags, derived from BCP-47 and made up.
|
// Invalid language tags, derived from BCP-47 and made up.
|
||||||
var invalidTags = [
|
var invalidTags = [
|
||||||
'de-419-DE', ' a-DE ', 'ar-a-aaa-b-bbb-a-ccc', 'sdafsdfaadsfdsf', 'i',
|
"de-419-DE", " a-DE ", "ar-a-aaa-b-bbb-a-ccc", "sdafsdfaadsfdsf", "i",
|
||||||
'i-phone', 'en US', 'EN-*-US-JP', 'JA-INVALID-TAG', '123123123'
|
"i-phone", "en US", "EN-*-US-JP", "JA-INVALID-TAG", "123123123",
|
||||||
];
|
];
|
||||||
for (var item of invalidTags) {
|
for (var item of invalidTags) {
|
||||||
var expected = `Expect invalid tag (${item}) to be treated as undefined.`;
|
var expected = `Expect invalid tag (${item}) to be treated as undefined.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
lang: item
|
lang: item,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
todo_is(result.lang, undefined, expected);
|
todo_is(result.lang, undefined, expected);
|
||||||
|
|
@ -91,19 +91,19 @@ for (var item of invalidTags) {
|
||||||
// canonical form, to upper case and expect the processor to return them
|
// canonical form, to upper case and expect the processor to return them
|
||||||
// in canonical form.
|
// in canonical form.
|
||||||
var canonicalTags = [
|
var canonicalTags = [
|
||||||
'jp-JS', 'pt-PT', 'pt-BR', 'de-CH', 'de-DE-1901', 'es-419', 'sl-IT-nedis',
|
"jp-JS", "pt-PT", "pt-BR", "de-CH", "de-DE-1901", "es-419", "sl-IT-nedis",
|
||||||
'en-US-boont', 'mn-Cyrl-MN', 'x-fr-CH', 'sr-Cyrl', 'sr-Latn',
|
"en-US-boont", "mn-Cyrl-MN", "x-fr-CH", "sr-Cyrl", "sr-Latn",
|
||||||
'hy-Latn-IT-arevela', 'zh-TW', 'en-GB-boont-r-extended-sequence-x-private',
|
"hy-Latn-IT-arevela", "zh-TW", "en-GB-boont-r-extended-sequence-x-private",
|
||||||
'zh-cmn-Hans-CN', 'cmn-Hans-CN', 'zh-yue-HK', 'yue-HK',
|
"zh-cmn-Hans-CN", "cmn-Hans-CN", "zh-yue-HK", "yue-HK",
|
||||||
'de-CH-x-phonebk', 'az-Arab-x-AZE-derbend', 'x-whatever',
|
"de-CH-x-phonebk", "az-Arab-x-AZE-derbend", "x-whatever",
|
||||||
'qaa-Qaaa-QM-x-southern'
|
"qaa-Qaaa-QM-x-southern",
|
||||||
];
|
];
|
||||||
|
|
||||||
for (var tag of canonicalTags) {
|
for (var tag of canonicalTags) {
|
||||||
var uppedTag = tag.toUpperCase();
|
var uppedTag = tag.toUpperCase();
|
||||||
var expected = `Expect tag (${uppedTag}) to be in canonical form (${tag}).`;
|
var expected = `Expect tag (${uppedTag}) to be in canonical form (${tag}).`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
lang: uppedTag
|
lang: uppedTag,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
todo_is(result.lang, tag, expected);
|
todo_is(result.lang, tag, expected);
|
||||||
|
|
|
||||||
|
|
@ -16,16 +16,16 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* https://w3c.github.io/manifest/#short_name-member
|
* https://w3c.github.io/manifest/#short_name-member
|
||||||
**/
|
**/
|
||||||
|
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
var trimNamesTests = [
|
var trimNamesTests = [
|
||||||
`${seperators}pass${seperators}`,
|
`${seperators}pass${seperators}`,
|
||||||
`${lineTerminators}pass${lineTerminators}`,
|
`${lineTerminators}pass${lineTerminators}`,
|
||||||
`${whiteSpace}pass${whiteSpace}`,
|
`${whiteSpace}pass${whiteSpace}`,
|
||||||
//BOM
|
// BOM
|
||||||
`\uFEFFpass\uFEFF`
|
`\uFEFFpass\uFEFF`,
|
||||||
];
|
];
|
||||||
var props = ['name', 'short_name'];
|
var props = ["name", "short_name"];
|
||||||
|
|
||||||
props.forEach((prop) => {
|
props.forEach((prop) => {
|
||||||
trimNamesTests.forEach((trimmableString) => {
|
trimNamesTests.forEach((trimmableString) => {
|
||||||
|
|
@ -34,7 +34,7 @@ props.forEach((prop) => {
|
||||||
obj[prop] = trimmableString;
|
obj[prop] = trimmableString;
|
||||||
data.jsonText = JSON.stringify(obj);
|
data.jsonText = JSON.stringify(obj);
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result[prop], 'pass', assetion);
|
is(result[prop], "pass", assetion);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -56,13 +56,13 @@ props.forEach((prop) => {
|
||||||
* acceptable names - including long names
|
* acceptable names - including long names
|
||||||
*/
|
*/
|
||||||
var acceptableNames = [
|
var acceptableNames = [
|
||||||
'pass',
|
"pass",
|
||||||
`pass pass pass pass pass pass pass pass pass pass pass pass pass pass
|
`pass pass pass pass pass pass pass pass pass pass pass pass pass pass
|
||||||
pass pass pass pass pass pass pass pass pass pass pass pass pass pass
|
pass pass pass pass pass pass pass pass pass pass pass pass pass pass
|
||||||
pass pass pass pass pass pass pass pass pass pass pass pass pass pass
|
pass pass pass pass pass pass pass pass pass pass pass pass pass pass
|
||||||
pass pass pass pass pass pass pass pass pass pass pass pass`,
|
pass pass pass pass pass pass pass pass pass pass pass pass`,
|
||||||
'これは許容できる名前です',
|
"これは許容できる名前です",
|
||||||
'ນີ້ແມ່ນຊື່ທີ່ຍອມຮັບໄດ້'
|
"ນີ້ແມ່ນຊື່ທີ່ຍອມຮັບໄດ້",
|
||||||
];
|
];
|
||||||
|
|
||||||
props.forEach((prop) => {
|
props.forEach((prop) => {
|
||||||
|
|
|
||||||
|
|
@ -14,34 +14,34 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* orientation member
|
* orientation member
|
||||||
* https://w3c.github.io/manifest/#orientation-member
|
* https://w3c.github.io/manifest/#orientation-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
typeTests.forEach((type) => {
|
typeTests.forEach((type) => {
|
||||||
var expected = `Expect non-string orientation to be empty string : ${typeof type}.`;
|
var expected = `Expect non-string orientation to be empty string : ${typeof type}.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
orientation: type
|
orientation: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.orientation, undefined, expected);
|
is(result.orientation, undefined, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
var validOrientations = [
|
var validOrientations = [
|
||||||
'any',
|
"any",
|
||||||
'natural',
|
"natural",
|
||||||
'landscape',
|
"landscape",
|
||||||
'portrait',
|
"portrait",
|
||||||
'portrait-primary',
|
"portrait-primary",
|
||||||
'portrait-secondary',
|
"portrait-secondary",
|
||||||
'landscape-primary',
|
"landscape-primary",
|
||||||
'landscape-secondary',
|
"landscape-secondary",
|
||||||
'aNy',
|
"aNy",
|
||||||
'NaTuRal',
|
"NaTuRal",
|
||||||
'LANDsCAPE',
|
"LANDsCAPE",
|
||||||
'PORTRAIT',
|
"PORTRAIT",
|
||||||
'portrait-PRIMARY',
|
"portrait-PRIMARY",
|
||||||
'portrait-SECONDARY',
|
"portrait-SECONDARY",
|
||||||
'LANDSCAPE-primary',
|
"LANDSCAPE-primary",
|
||||||
'LANDSCAPE-secondary',
|
"LANDSCAPE-secondary",
|
||||||
];
|
];
|
||||||
|
|
||||||
validOrientations.forEach((orientation) => {
|
validOrientations.forEach((orientation) => {
|
||||||
|
|
@ -52,17 +52,17 @@ validOrientations.forEach((orientation) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
var invalidOrientations = [
|
var invalidOrientations = [
|
||||||
'all',
|
"all",
|
||||||
'ANYMany',
|
"ANYMany",
|
||||||
'NaTuRalle',
|
"NaTuRalle",
|
||||||
'portrait-primary portrait-secondary',
|
"portrait-primary portrait-secondary",
|
||||||
'portrait-primary,portrait-secondary',
|
"portrait-primary,portrait-secondary",
|
||||||
'any-natural',
|
"any-natural",
|
||||||
'portrait-landscape',
|
"portrait-landscape",
|
||||||
'primary-portrait',
|
"primary-portrait",
|
||||||
'secondary-portrait',
|
"secondary-portrait",
|
||||||
'landscape-landscape',
|
"landscape-landscape",
|
||||||
'secondary-primary'
|
"secondary-primary",
|
||||||
];
|
];
|
||||||
|
|
||||||
invalidOrientations.forEach((orientation) => {
|
invalidOrientations.forEach((orientation) => {
|
||||||
|
|
@ -72,12 +72,12 @@ invalidOrientations.forEach((orientation) => {
|
||||||
is(result.orientation, undefined, expected);
|
is(result.orientation, undefined, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
//Trim tests
|
// Trim tests
|
||||||
validOrientations.forEach((orientation) => {
|
validOrientations.forEach((orientation) => {
|
||||||
var expected = `Expect trimmed orientation to be returned.`;
|
var expected = `Expect trimmed orientation to be returned.`;
|
||||||
var expandedOrientation = `${seperators}${lineTerminators}${orientation}${lineTerminators}${seperators}`;
|
var expandedOrientation = `${seperators}${lineTerminators}${orientation}${lineTerminators}${seperators}`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
orientation: expandedOrientation
|
orientation: expandedOrientation,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.orientation, orientation.toLowerCase(), expected);
|
is(result.orientation, orientation.toLowerCase(), expected);
|
||||||
|
|
|
||||||
|
|
@ -14,76 +14,76 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* Manifest scope
|
* Manifest scope
|
||||||
* https://w3c.github.io/manifest/#scope-member
|
* https://w3c.github.io/manifest/#scope-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
var expected = 'Expect non-string scope to be undefined';
|
var expected = "Expect non-string scope to be undefined";
|
||||||
typeTests.forEach((type) => {
|
typeTests.forEach((type) => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
scope: type
|
scope: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope, undefined, expected);
|
is(result.scope, undefined, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
var expected = 'Expect different origin to be treated as undefined';
|
var expected = "Expect different origin to be treated as undefined";
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
scope: 'http://not-same-origin'
|
scope: "http://not-same-origin",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope, undefined, expected);
|
is(result.scope, undefined, expected);
|
||||||
|
|
||||||
var expected = 'Expect the empty string to be treated as undefined.';
|
var expected = "Expect the empty string to be treated as undefined.";
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
scope: ''
|
scope: "",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope, undefined, expected);
|
is(result.scope, undefined, expected);
|
||||||
|
|
||||||
var expected = 'Resolve URLs relative to manifest.';
|
var expected = "Resolve URLs relative to manifest.";
|
||||||
var URLs = ['path', '/path', '../../path'];
|
var URLs = ["path", "/path", "../../path"];
|
||||||
URLs.forEach((url) => {
|
URLs.forEach((url) => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
scope: url,
|
scope: url,
|
||||||
start_url: "/path"
|
start_url: "/path",
|
||||||
});
|
});
|
||||||
var absURL = new URL(url, manifestURL).toString();
|
var absURL = new URL(url, manifestURL).toString();
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope, absURL, expected);
|
is(result.scope, absURL, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
var expected = 'If start URL is not in scope, return undefined.';
|
var expected = "If start URL is not in scope, return undefined.";
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
scope: 'foo',
|
scope: "foo",
|
||||||
start_url: 'bar'
|
start_url: "bar",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope, undefined, expected);
|
is(result.scope, undefined, expected);
|
||||||
|
|
||||||
var expected = 'If start URL is in scope, use the scope.';
|
var expected = "If start URL is in scope, use the scope.";
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: 'foobar',
|
start_url: "foobar",
|
||||||
scope: 'foo'
|
scope: "foo",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope.toString(), new URL('foo', manifestURL).toString(), expected);
|
is(result.scope.toString(), new URL("foo", manifestURL).toString(), expected);
|
||||||
|
|
||||||
var expected = 'Expect start_url to be ' + new URL('foobar', manifestURL).toString();
|
var expected = "Expect start_url to be " + new URL("foobar", manifestURL).toString();
|
||||||
is(result.start_url.toString(), new URL('foobar', manifestURL).toString(), expected);
|
is(result.start_url.toString(), new URL("foobar", manifestURL).toString(), expected);
|
||||||
|
|
||||||
var expected = 'If start URL is in scope, use the scope.';
|
var expected = "If start URL is in scope, use the scope.";
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: '/foo/',
|
start_url: "/foo/",
|
||||||
scope: '/foo/'
|
scope: "/foo/",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope.toString(), new URL('/foo/', manifestURL).toString(), expected);
|
is(result.scope.toString(), new URL("/foo/", manifestURL).toString(), expected);
|
||||||
|
|
||||||
var expected = 'If start URL is in scope, use the scope.';
|
var expected = "If start URL is in scope, use the scope.";
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: '.././foo/',
|
start_url: ".././foo/",
|
||||||
scope: '../foo/'
|
scope: "../foo/",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.scope.toString(), new URL('/foo/', manifestURL).toString(), expected);
|
is(result.scope.toString(), new URL("/foo/", manifestURL).toString(), expected);
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -14,42 +14,42 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
|
||||||
* Manifest start_url
|
* Manifest start_url
|
||||||
* https://w3c.github.io/manifest/#start_url-member
|
* https://w3c.github.io/manifest/#start_url-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
typeTests.forEach((type) => {
|
typeTests.forEach((type) => {
|
||||||
var expected = `Expect non - string start_url to be doc's url: ${typeof type}.`;
|
var expected = `Expect non - string start_url to be doc's url: ${typeof type}.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: type
|
start_url: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.start_url.toString(), docURL.toString(), expected);
|
is(result.start_url.toString(), docURL.toString(), expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
//Not same origin
|
// Not same origin
|
||||||
var expected = `Expect different origin URLs to become document's URL.`;
|
var expected = `Expect different origin URLs to become document's URL.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: 'http://not-same-origin'
|
start_url: "http://not-same-origin",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.start_url.toString(), docURL.toString(), expected);
|
is(result.start_url.toString(), docURL.toString(), expected);
|
||||||
|
|
||||||
//Empty string test
|
// Empty string test
|
||||||
var expected = `Expect empty string for start_url to become document's URL.`;
|
var expected = `Expect empty string for start_url to become document's URL.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: ''
|
start_url: "",
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
is(result.start_url.toString(), docURL.toString(), expected);
|
is(result.start_url.toString(), docURL.toString(), expected);
|
||||||
|
|
||||||
//Resolve URLs relative to manfiest
|
// Resolve URLs relative to manfiest
|
||||||
var URLs = ['path', '/path', '../../path',
|
var URLs = ["path", "/path", "../../path",
|
||||||
`${whiteSpace}path${whiteSpace}`,
|
`${whiteSpace}path${whiteSpace}`,
|
||||||
`${whiteSpace}/path`,
|
`${whiteSpace}/path`,
|
||||||
`${whiteSpace}../../path`
|
`${whiteSpace}../../path`,
|
||||||
];
|
];
|
||||||
URLs.forEach((url) => {
|
URLs.forEach((url) => {
|
||||||
var expected = `Resolve URLs relative to manifest.`;
|
var expected = `Resolve URLs relative to manifest.`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
start_url: url
|
start_url: url,
|
||||||
});
|
});
|
||||||
var absURL = new URL(url, manifestURL).toString();
|
var absURL = new URL(url, manifestURL).toString();
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1195018
|
||||||
* theme_color member
|
* theme_color member
|
||||||
* https://w3c.github.io/manifest/#theme_color-member
|
* https://w3c.github.io/manifest/#theme_color-member
|
||||||
**/
|
**/
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
typeTests.forEach(type => {
|
typeTests.forEach(type => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
theme_color: type
|
theme_color: type,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
@ -26,52 +26,52 @@ typeTests.forEach(type => {
|
||||||
});
|
});
|
||||||
|
|
||||||
var validThemeColors = [
|
var validThemeColors = [
|
||||||
'maroon',
|
"maroon",
|
||||||
'#f00',
|
"#f00",
|
||||||
'#ff0000',
|
"#ff0000",
|
||||||
'rgb(255,0,0)',
|
"rgb(255,0,0)",
|
||||||
'rgb(255,0,0,1)',
|
"rgb(255,0,0,1)",
|
||||||
'rgb(255,0,0,1.0)',
|
"rgb(255,0,0,1.0)",
|
||||||
'rgb(255,0,0,100%)',
|
"rgb(255,0,0,100%)",
|
||||||
'rgb(255 0 0)',
|
"rgb(255 0 0)",
|
||||||
'rgb(255 0 0 / 1)',
|
"rgb(255 0 0 / 1)",
|
||||||
'rgb(255 0 0 / 1.0)',
|
"rgb(255 0 0 / 1.0)",
|
||||||
'rgb(255 0 0 / 100%)',
|
"rgb(255 0 0 / 100%)",
|
||||||
'rgb(100%, 0%, 0%)',
|
"rgb(100%, 0%, 0%)",
|
||||||
'rgb(100%, 0%, 0%, 1)',
|
"rgb(100%, 0%, 0%, 1)",
|
||||||
'rgb(100%, 0%, 0%, 1.0)',
|
"rgb(100%, 0%, 0%, 1.0)",
|
||||||
'rgb(100%, 0%, 0%, 100%)',
|
"rgb(100%, 0%, 0%, 100%)",
|
||||||
'rgb(100% 0% 0%)',
|
"rgb(100% 0% 0%)",
|
||||||
'rgb(100% 0% 0% / 1)',
|
"rgb(100% 0% 0% / 1)",
|
||||||
'rgb(100%, 0%, 0%, 1.0)',
|
"rgb(100%, 0%, 0%, 1.0)",
|
||||||
'rgb(100%, 0%, 0%, 100%)',
|
"rgb(100%, 0%, 0%, 100%)",
|
||||||
'rgb(300,0,0)',
|
"rgb(300,0,0)",
|
||||||
'rgb(300 0 0)',
|
"rgb(300 0 0)",
|
||||||
'rgb(255,-10,0)',
|
"rgb(255,-10,0)",
|
||||||
'rgb(110%, 0%, 0%)',
|
"rgb(110%, 0%, 0%)",
|
||||||
'rgba(255,0,0)',
|
"rgba(255,0,0)",
|
||||||
'rgba(255,0,0,1)',
|
"rgba(255,0,0,1)",
|
||||||
'rgba(255 0 0 / 1)',
|
"rgba(255 0 0 / 1)",
|
||||||
'rgba(100%,0%,0%,1)',
|
"rgba(100%,0%,0%,1)",
|
||||||
'rgba(0,0,255,0.5)',
|
"rgba(0,0,255,0.5)",
|
||||||
'rgba(100%, 50%, 0%, 0.1)',
|
"rgba(100%, 50%, 0%, 0.1)",
|
||||||
'hsl(120, 100%, 50%)',
|
"hsl(120, 100%, 50%)",
|
||||||
'hsl(120 100% 50%)',
|
"hsl(120 100% 50%)",
|
||||||
'hsl(120, 100%, 50%, 1.0)',
|
"hsl(120, 100%, 50%, 1.0)",
|
||||||
'hsl(120 100% 50% / 1.0)',
|
"hsl(120 100% 50% / 1.0)",
|
||||||
'hsla(120, 100%, 50%)',
|
"hsla(120, 100%, 50%)",
|
||||||
'hsla(120 100% 50%)',
|
"hsla(120 100% 50%)",
|
||||||
'hsla(120, 100%, 50%, 1.0)',
|
"hsla(120, 100%, 50%, 1.0)",
|
||||||
'hsla(120 100% 50% / 1.0)',
|
"hsla(120 100% 50% / 1.0)",
|
||||||
'hsl(120deg, 100%, 50%)',
|
"hsl(120deg, 100%, 50%)",
|
||||||
'hsl(133.33333333grad, 100%, 50%)',
|
"hsl(133.33333333grad, 100%, 50%)",
|
||||||
'hsl(2.0943951024rad, 100%, 50%)',
|
"hsl(2.0943951024rad, 100%, 50%)",
|
||||||
'hsl(0.3333333333turn, 100%, 50%)',
|
"hsl(0.3333333333turn, 100%, 50%)",
|
||||||
];
|
];
|
||||||
|
|
||||||
validThemeColors.forEach(theme_color => {
|
validThemeColors.forEach(theme_color => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
theme_color: theme_color
|
theme_color,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
@ -79,25 +79,25 @@ validThemeColors.forEach(theme_color => {
|
||||||
});
|
});
|
||||||
|
|
||||||
var invalidThemeColors = [
|
var invalidThemeColors = [
|
||||||
'marooon',
|
"marooon",
|
||||||
'f000000',
|
"f000000",
|
||||||
'#ff00000',
|
"#ff00000",
|
||||||
'rgb(100, 0%, 0%)',
|
"rgb(100, 0%, 0%)",
|
||||||
'rgb(255,0)',
|
"rgb(255,0)",
|
||||||
'rbg(255,-10,0)',
|
"rbg(255,-10,0)",
|
||||||
'rgb(110, 0%, 0%)',
|
"rgb(110, 0%, 0%)",
|
||||||
'(255,0,0) }',
|
"(255,0,0) }",
|
||||||
'rgba(255)',
|
"rgba(255)",
|
||||||
' rgb(100%,0%,0%) }',
|
" rgb(100%,0%,0%) }",
|
||||||
'hsl(120, 100%, 50)',
|
"hsl(120, 100%, 50)",
|
||||||
'hsl(120, 100%, 50.0)',
|
"hsl(120, 100%, 50.0)",
|
||||||
'hsl 120, 100%, 50%',
|
"hsl 120, 100%, 50%",
|
||||||
'hsla{120, 100%, 50%, 1}',
|
"hsla{120, 100%, 50%, 1}",
|
||||||
]
|
];
|
||||||
|
|
||||||
invalidThemeColors.forEach(theme_color => {
|
invalidThemeColors.forEach(theme_color => {
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
theme_color: theme_color
|
theme_color,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
@ -108,7 +108,7 @@ invalidThemeColors.forEach(theme_color => {
|
||||||
validThemeColors.forEach(theme_color => {
|
validThemeColors.forEach(theme_color => {
|
||||||
var expandedThemeColor = `${seperators}${lineTerminators}${theme_color}${lineTerminators}${seperators}`;
|
var expandedThemeColor = `${seperators}${lineTerminators}${theme_color}${lineTerminators}${seperators}`;
|
||||||
data.jsonText = JSON.stringify({
|
data.jsonText = JSON.stringify({
|
||||||
theme_color: expandedThemeColor
|
theme_color: expandedThemeColor,
|
||||||
});
|
});
|
||||||
var result = processor.process(data);
|
var result = processor.process(data);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1086997
|
||||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||||
<script src="common.js"></script>
|
<script src="common.js"></script>
|
||||||
<script>
|
<script>
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
const {
|
const {
|
||||||
ConsoleAPI
|
ConsoleAPI,
|
||||||
} = SpecialPowers.Cu.import('resource://gre/modules/Console.jsm');
|
} = SpecialPowers.Cu.import("resource://gre/modules/Console.jsm");
|
||||||
|
|
||||||
var warning = null;
|
var warning = null;
|
||||||
|
|
||||||
|
|
@ -26,59 +26,59 @@ ConsoleAPI.prototype.warn = function(aWarning) {
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify(1),
|
func: () => data.jsonText = JSON.stringify(1),
|
||||||
warning: 'Manifest should be an object.',
|
warning: "Manifest should be an object.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify(null),
|
func: () => data.jsonText = JSON.stringify(null),
|
||||||
warning: 'Manifest should be an object.',
|
warning: "Manifest should be an object.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify('a string'),
|
func: () => data.jsonText = JSON.stringify("a string"),
|
||||||
warning: 'Manifest should be an object.',
|
warning: "Manifest should be an object.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify({
|
func: () => data.jsonText = JSON.stringify({
|
||||||
scope: 'https://www.mozilla.org',
|
scope: "https://www.mozilla.org",
|
||||||
}),
|
}),
|
||||||
warning: 'The scope URL must be same origin as document.',
|
warning: "The scope URL must be same origin as document.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify({
|
func: () => data.jsonText = JSON.stringify({
|
||||||
scope: 'foo',
|
scope: "foo",
|
||||||
start_url: 'bar',
|
start_url: "bar",
|
||||||
}),
|
}),
|
||||||
warning: 'The start URL is outside the scope, so the scope is invalid.',
|
warning: "The start URL is outside the scope, so the scope is invalid.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify({
|
func: () => data.jsonText = JSON.stringify({
|
||||||
start_url: 'https://www.mozilla.org',
|
start_url: "https://www.mozilla.org",
|
||||||
}),
|
}),
|
||||||
warning: 'The start URL must be same origin as document.',
|
warning: "The start URL must be same origin as document.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify({
|
func: () => data.jsonText = JSON.stringify({
|
||||||
start_url: 42,
|
start_url: 42,
|
||||||
}),
|
}),
|
||||||
warning: 'Expected the manifest\u2019s start_url member to be a string.',
|
warning: "Expected the manifest\u2019s start_url member to be a string.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify({
|
func: () => data.jsonText = JSON.stringify({
|
||||||
theme_color: '42',
|
theme_color: "42",
|
||||||
}),
|
}),
|
||||||
warning: 'theme_color: 42 is not a valid CSS color.',
|
warning: "theme_color: 42 is not a valid CSS color.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
func: () => data.jsonText = JSON.stringify({
|
func: () => data.jsonText = JSON.stringify({
|
||||||
background_color: '42',
|
background_color: "42",
|
||||||
}),
|
}),
|
||||||
warning: 'background_color: 42 is not a valid CSS color.',
|
warning: "background_color: 42 is not a valid CSS color.",
|
||||||
},
|
},
|
||||||
].forEach(function(test) {
|
].forEach(function(test) {
|
||||||
test.func();
|
test.func();
|
||||||
|
|
||||||
processor.process(data);
|
processor.process(data);
|
||||||
|
|
||||||
is(warning, test.warning, 'Correct warning.');
|
is(warning, test.warning, "Correct warning.");
|
||||||
|
|
||||||
warning = null;
|
warning = null;
|
||||||
data.manifestURL = manifestURL;
|
data.manifestURL = manifestURL;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue