1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
/* 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 { Cu } = require("chrome");
const protocol = require("devtools/shared/protocol");
const { mediaRuleSpec } = require("devtools/shared/specs/media-rule");
const InspectorUtils = require("InspectorUtils");
/**
* A MediaRuleActor lives on the server and provides access to properties
* of a DOM @media rule and emits events when it changes.
*/
var MediaRuleActor = protocol.ActorClassWithSpec(mediaRuleSpec, {
get window() {
return this.parentActor.window;
},
get document() {
return this.window.document;
},
get matches() {
return this.mql ? this.mql.matches : null;
},
initialize: function(mediaRule, parentActor) {
protocol.Actor.prototype.initialize.call(this, parentActor.conn);
this.rawRule = mediaRule;
this.parentActor = parentActor;
this.conn = this.parentActor.conn;
this._matchesChange = this._matchesChange.bind(this);
this.line = InspectorUtils.getRuleLine(mediaRule);
this.column = InspectorUtils.getRuleColumn(mediaRule);
try {
this.mql = this.window.matchMedia(mediaRule.media.mediaText);
} catch (e) {
// Ignored
}
if (this.mql) {
this.mql.addListener(this._matchesChange);
}
},
destroy: function() {
if (this.mql) {
// The content page may already be destroyed and mql be the dead wrapper.
if (!Cu.isDeadWrapper(this.mql)) {
this.mql.removeListener(this._matchesChange);
}
this.mql = null;
}
protocol.Actor.prototype.destroy.call(this);
},
form: function() {
const form = {
actor: this.actorID, // actorID is set when this is added to a pool
mediaText: this.rawRule.media.mediaText,
conditionText: this.rawRule.conditionText,
matches: this.matches,
line: this.line,
column: this.column,
parentStyleSheet: this.parentActor.actorID,
};
return form;
},
_matchesChange: function() {
this.emit("matches-change", this.matches);
},
});
exports.MediaRuleActor = MediaRuleActor;
|