summaryrefslogtreecommitdiffstats
path: root/devtools/shared/fronts/stylesheets.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/fronts/stylesheets.js')
-rw-r--r--devtools/shared/fronts/stylesheets.js184
1 files changed, 184 insertions, 0 deletions
diff --git a/devtools/shared/fronts/stylesheets.js b/devtools/shared/fronts/stylesheets.js
new file mode 100644
index 000000000..6df8a9bd4
--- /dev/null
+++ b/devtools/shared/fronts/stylesheets.js
@@ -0,0 +1,184 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { Front, FrontClassWithSpec } = require("devtools/shared/protocol");
+const {
+ getIndentationFromPrefs,
+ getIndentationFromString
+} = require("devtools/shared/indentation");
+const {
+ originalSourceSpec,
+ mediaRuleSpec,
+ styleSheetSpec,
+ styleSheetsSpec
+} = require("devtools/shared/specs/stylesheets");
+const promise = require("promise");
+const { Task } = require("devtools/shared/task");
+const events = require("sdk/event/core");
+
+/**
+ * The client-side counterpart for an OriginalSourceActor.
+ */
+const OriginalSourceFront = FrontClassWithSpec(originalSourceSpec, {
+ initialize: function (client, form) {
+ Front.prototype.initialize.call(this, client, form);
+
+ this.isOriginalSource = true;
+ },
+
+ form: function (form, detail) {
+ if (detail === "actorid") {
+ this.actorID = form;
+ return;
+ }
+ this.actorID = form.actor;
+ this._form = form;
+ },
+
+ get href() {
+ return this._form.url;
+ },
+ get url() {
+ return this._form.url;
+ }
+});
+
+exports.OriginalSourceFront = OriginalSourceFront;
+
+/**
+ * Corresponding client-side front for a MediaRuleActor.
+ */
+const MediaRuleFront = FrontClassWithSpec(mediaRuleSpec, {
+ initialize: function (client, form) {
+ Front.prototype.initialize.call(this, client, form);
+
+ this._onMatchesChange = this._onMatchesChange.bind(this);
+ events.on(this, "matches-change", this._onMatchesChange);
+ },
+
+ _onMatchesChange: function (matches) {
+ this._form.matches = matches;
+ },
+
+ form: function (form, detail) {
+ if (detail === "actorid") {
+ this.actorID = form;
+ return;
+ }
+ this.actorID = form.actor;
+ this._form = form;
+ },
+
+ get mediaText() {
+ return this._form.mediaText;
+ },
+ get conditionText() {
+ return this._form.conditionText;
+ },
+ get matches() {
+ return this._form.matches;
+ },
+ get line() {
+ return this._form.line || -1;
+ },
+ get column() {
+ return this._form.column || -1;
+ },
+ get parentStyleSheet() {
+ return this.conn.getActor(this._form.parentStyleSheet);
+ }
+});
+
+exports.MediaRuleFront = MediaRuleFront;
+
+/**
+ * StyleSheetFront is the client-side counterpart to a StyleSheetActor.
+ */
+const StyleSheetFront = FrontClassWithSpec(styleSheetSpec, {
+ initialize: function (conn, form) {
+ Front.prototype.initialize.call(this, conn, form);
+
+ this._onPropertyChange = this._onPropertyChange.bind(this);
+ events.on(this, "property-change", this._onPropertyChange);
+ },
+
+ destroy: function () {
+ events.off(this, "property-change", this._onPropertyChange);
+ Front.prototype.destroy.call(this);
+ },
+
+ _onPropertyChange: function (property, value) {
+ this._form[property] = value;
+ },
+
+ form: function (form, detail) {
+ if (detail === "actorid") {
+ this.actorID = form;
+ return;
+ }
+ this.actorID = form.actor;
+ this._form = form;
+ },
+
+ get href() {
+ return this._form.href;
+ },
+ get nodeHref() {
+ return this._form.nodeHref;
+ },
+ get disabled() {
+ return !!this._form.disabled;
+ },
+ get title() {
+ return this._form.title;
+ },
+ get isSystem() {
+ return this._form.system;
+ },
+ get styleSheetIndex() {
+ return this._form.styleSheetIndex;
+ },
+ get ruleCount() {
+ return this._form.ruleCount;
+ },
+
+ /**
+ * Get the indentation to use for edits to this style sheet.
+ *
+ * @return {Promise} A promise that will resolve to a string that
+ * should be used to indent a block in this style sheet.
+ */
+ guessIndentation: function () {
+ let prefIndent = getIndentationFromPrefs();
+ if (prefIndent) {
+ let {indentUnit, indentWithTabs} = prefIndent;
+ return promise.resolve(indentWithTabs ? "\t" : " ".repeat(indentUnit));
+ }
+
+ return Task.spawn(function* () {
+ let longStr = yield this.getText();
+ let source = yield longStr.string();
+
+ let {indentUnit, indentWithTabs} = getIndentationFromString(source);
+
+ return indentWithTabs ? "\t" : " ".repeat(indentUnit);
+ }.bind(this));
+ }
+});
+
+exports.StyleSheetFront = StyleSheetFront;
+
+/**
+ * The corresponding Front object for the StyleSheetsActor.
+ */
+const StyleSheetsFront = FrontClassWithSpec(styleSheetsSpec, {
+ initialize: function (client, tabForm) {
+ Front.prototype.initialize.call(this, client);
+ this.actorID = tabForm.styleSheetsActor;
+ this.manage(this);
+ }
+});
+
+exports.StyleSheetsFront = StyleSheetsFront;