diff options
author | Matt A. Tobin <email@mattatobin.com> | 2018-02-09 06:46:43 -0500 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2018-02-09 06:46:43 -0500 |
commit | ac46df8daea09899ce30dc8fd70986e258c746bf (patch) | |
tree | 2750d3125fc253fd5b0671e4bd268eff1fd97296 /toolkit/jetpack/sdk/stylesheet/style.js | |
parent | 8cecf8d5208f3945b35f879bba3015bb1a11bec6 (diff) | |
download | UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar.gz UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar.lz UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.tar.xz UXP-ac46df8daea09899ce30dc8fd70986e258c746bf.zip |
Move Add-on SDK source to toolkit/jetpack
Diffstat (limited to 'toolkit/jetpack/sdk/stylesheet/style.js')
-rw-r--r-- | toolkit/jetpack/sdk/stylesheet/style.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/toolkit/jetpack/sdk/stylesheet/style.js b/toolkit/jetpack/sdk/stylesheet/style.js new file mode 100644 index 000000000..7ec0787e1 --- /dev/null +++ b/toolkit/jetpack/sdk/stylesheet/style.js @@ -0,0 +1,71 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +module.metadata = { + "stability": "experimental" +}; + +const { Cc, Ci } = require("chrome"); +const { Class } = require("../core/heritage"); +const { URL, isLocalURL } = require('../url'); +const events = require("../system/events"); +const { loadSheet, removeSheet, isTypeValid } = require("./utils"); +const { isString } = require("../lang/type"); +const { attachTo, detachFrom } = require("../content/mod"); +const { data } = require('../self'); + +const { freeze, create } = Object; + +function Style({ source, uri, type }) { + source = source == null ? null : freeze([].concat(source)); + uri = uri == null ? null : freeze([].concat(uri)); + type = type == null ? "author" : type; + + if (source && !source.every(isString)) + throw new Error('Style.source must be a string or an array of strings.'); + + if (uri && !uri.every(isLocalURL)) + throw new Error('Style.uri must be a local URL or an array of local URLs'); + + if (type && !isTypeValid(type)) + throw new Error('Style.type must be "agent", "user" or "author"'); + + return freeze(create(Style.prototype, { + "source": { value: source, enumerable: true }, + "uri": { value: uri, enumerable: true }, + "type": { value: type, enumerable: true } + })); +}; + +exports.Style = Style; + +attachTo.define(Style, function (style, window) { + if (style.uri) { + for (let uri of style.uri) + loadSheet(window, data.url(uri), style.type); + } + + if (style.source) { + let uri = "data:text/css;charset=utf-8,"; + + uri += encodeURIComponent(style.source.join("")); + + loadSheet(window, uri, style.type); + } +}); + +detachFrom.define(Style, function (style, window) { + if (style.uri) + for (let uri of style.uri) + removeSheet(window, data.url(uri)); + + if (style.source) { + let uri = "data:text/css;charset=utf-8,"; + + uri += encodeURIComponent(style.source.join("")); + + removeSheet(window, uri, style.type); + } +}); |